diff --git a/.gitignore b/.gitignore index f8faee3..a985d60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,14 @@ -data/ +data/articles +data/* cmake-build-debug/ cmake-build-release/ -.idea/ \ No newline at end of file +.idea/ +!data/small_articles +tree-cache.txt +cmake-build-* +/art-cache.txt +/author-cache.txt +/org-cache.txt +/article-cache.txt +/build +build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..551ce6d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/tbb"] + path = external/tbb + url = git@github.com:wjakob/tbb.git diff --git a/CMakeLists.txt b/CMakeLists.txt index aa927f8..96f52d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,37 @@ -cmake_minimum_required(VERSION 3.20) +cmake_minimum_required(VERSION 3.12) project(22s_final_proj) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread") +link_libraries(stdc++fs) -add_executable(22s_final_proj main.cpp catch_setup.cpp) +#TBB +set(EXTERNAL_INSTALL_DIR ${CMAKE_BINARY_DIR}/external) +link_directories(${EXTERNAL_INSTALL_DIR}/lib) +include_directories(${EXTERNAL_INSTALL_DIR}/include) + +#TBB +link_libraries(tbb) + +add_executable(22s_final_proj main.cpp CatchTestUtils/catch_setup.cpp hash_table/hash_table.h hash_table/hash_ordered_map_tests.cpp SearchEngine/SearchEngine.cpp SearchEngine/SearchEngine.h Processor/Processor.cpp utilities/StopWords.h utilities/Article.h utilities/Pipelines.h avl_tree/avl_tests.cpp external/porter2_stemmer/porter2_stemmer.cpp external/porter2_stemmer/porter2_stemmer.h external/porter2_stemmer/util/hash.h external/porter2_stemmer/util/string_view.h utilities/typedefs.h QueryBuilder/QueryBuilder.cpp QueryBuilder/QueryBuilder.h utilities/Pipelines.cpp utilities/ProgressBar.h avl_tree/avl_friends.cpp) + +###################################################################### +# Build rules for tbb +###################################################################### + +include(ExternalProject) +ExternalProject_Add( + tbb + GIT_REPOSITORY ${CMAKE_SOURCE_DIR}/external/tbb + GIT_TAG master + INSTALL_DIR ${EXTERNAL_INSTALL_DIR} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:PATH= + -DTBB_BUILD_SHARED=ON + -DTBB_BUILD_STATIC=OFF + -DTBB_BUILD_TBBMALLOC=OFF + -DTBB_BUILD_TBBMALLOC_PROXY=OFF + -DTBB_BUILD_TESTS=OFF + -DTBB_CI_BUILD=OFF +) +add_dependencies(22s_final_proj tbb) diff --git a/catch.hpp b/CatchTestUtils/catch.hpp similarity index 100% rename from catch.hpp rename to CatchTestUtils/catch.hpp diff --git a/catch_setup.cpp b/CatchTestUtils/catch_setup.cpp similarity index 100% rename from catch_setup.cpp rename to CatchTestUtils/catch_setup.cpp diff --git a/catch_setup.h b/CatchTestUtils/catch_setup.h similarity index 100% rename from catch_setup.h rename to CatchTestUtils/catch_setup.h diff --git a/Processor/Processor.cpp b/Processor/Processor.cpp new file mode 100644 index 0000000..3519040 --- /dev/null +++ b/Processor/Processor.cpp @@ -0,0 +1,341 @@ +// +// Created by Drew Harris on 4/7/2022. +// + +#include +#include +#include +#include +#include +#include "Processor.h" +#include "../external/termcolor/termcolor.hpp" +#include "../utilities/Pipelines.h" + +namespace fs = std::filesystem; + +typedef tbb::concurrent_hash_map>::accessor tbbAccessor; + +/** + * Adds every article filename to a queue so that the multithreading can process them easily + * @param folderName The folder name to search + */ +void Processor::fillQueue(std::string folderName) { + // Only files not folders + this->totalFiles = 0; + for (const fs::directory_entry &dir_entry: + fs::recursive_directory_iterator(folderName)) { + if (fs::is_regular_file(dir_entry) && + dir_entry.path().string().substr(dir_entry.path().string().size() - 5, 5) == ".json") { + this->fileQueue.push(dir_entry.path().string()); + this->totalFiles++; + } + } +} + +void Processor::process() { + while (true) { + this->fileQueueMutex->lock(); + if (this->fileQueue.empty()) { + // Prevents a deadlock + this->fileQueueMutex->unlock(); + break; + } + std::string filename = this->fileQueue.front(); + this->fileQueue.pop(); + this->fileQueueMutex->unlock(); + + std::ifstream file(filename); + if (!file.is_open()) { + std::cout << "Could not open file: " << filename << std::endl; + continue; + } + rapidjson::Document document; + std::string content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + try { + document.Parse(content.c_str()); + } catch (std::exception &e) { + std::cout << termcolor::red << "Could not read file: " << filename << termcolor::reset << std::endl; + continue; + } + file.close(); + + std::string uuid = document["uuid"].GetString(); + + std::string author = pipeline::cleanPropnoun(document["author"].GetString()); + + std::vector orgsVect; + { + const auto orgsArr = document["entities"]["organizations"].GetArray(); + for (const auto &it: orgsArr) { + orgsVect.emplace_back(pipeline::cleanPropnoun(it["name"].GetString())); + } + } + + std::vector peopleVect; + { + const auto peopleArr = document["entities"]["persons"].GetArray(); + for (const auto &it: peopleArr) { + peopleVect.emplace_back(pipeline::cleanPropnoun(it["name"].GetString())); + } + } + + this->articles->operator[](uuid) = { + .uuid = uuid, + .filename = filename, + .author = author, + .peopleList = peopleVect, + .orgList = orgsVect, + .title = document["title"].GetString(), + }; + + std::string text = document["text"].GetString(); + std::istringstream iss(text); + + // Iterate the istringstream + // using do-while loop + tbbAccessor accessor; + do { + std::string subs; + // Get the word from the istringstream + iss >> subs; + pipeline::cleanStr(subs); + if (this->stopWords.stopWords.find(subs) == this->stopWords.stopWords.end()) { + Porter2Stemmer::stem(subs); + if (subs.substr(0, 3) != "www") { + this->tbbMap->operator[](subs)[uuid]++; + } + } + } while (iss); + + this->filesProcessed++; + } +} + + +/** + * Generates the index from a specific folder + * @param folderName the folder to recursively process through + * @return A dummy return value so that the function can be called with std::async + */ +void Processor::generateIndex(std::string folderName) { + int threadCount = std::thread::hardware_concurrency(); + std::cout << "Using " << threadCount << " threads" << std::endl; + if (threadCount == 0) { + threadCount = 4; + } + + this->filesProcessed = 0; + this->fillQueue(folderName); + + // Actually process the files + std::vector threads; + for (int i = 0; i < threadCount; i++) { + threads.emplace_back(std::thread(&Processor::process, this)); + } + + for (auto &thread: threads) { + thread.join(); + } + + this->totalWords = this->tbbMap->size(); +} + +void Processor::buildOrgsAndPeople() { + this->organizations.clear(); + this->people.clear(); + for (const auto &articlePair: *this->articles) { + for (const auto &org: articlePair.second.orgList) { + this->organizations[articlePair.first].emplace(org); + } + for (const auto &person: articlePair.second.peopleList) { + this->people[articlePair.first].emplace(person); + } + } +} + +double Processor::fileParseProgress() { + return (double) this->filesProcessed.load() / (double) this->totalFiles; +} + +Processor::~Processor() { + delete this->fileQueueMutex; + delete this->tbbMap; +} + +Processor::Processor(tbb::concurrent_unordered_map *pArticles, + avl_tree>> *tree, + std::mutex *treeMut) { + this->articles = pArticles; + this->stopWords = StopWords(); + this->wordTree = tree; + + this->wordTreeMutex = treeMut; + this->fileQueueMutex = new std::mutex(); + this->tbbMap = new tbb::concurrent_unordered_map>(); + + this->totalFiles = 0; + this->filesProcessed = 0; + this->totalWords = 0; + this->wordsProcessed = 0; +} + + +#include +#include + +void Processor::convertMapToTree() { + this->totalWords = this->tbbMap->size(); + this->wordTreeMutex->lock(); + this->wordTree->clear(); + for (auto &wordData: *this->tbbMap) { + std::string currentWord = wordData.first; + std::vector> toPush; + int numDocsThatContainWord = wordData.second.size(); + double inverseDocumentFrequency = log10(double(this->totalFiles) / numDocsThatContainWord); + + for (const auto &uuidData: wordData.second) { + toPush.emplace_back( + std::pair(uuidData.first, inverseDocumentFrequency * uuidData.second)); + } + + std::sort(toPush.begin(), toPush.end(), + [](const std::pair &a, const std::pair &b) -> bool { + return a.second > b.second; + }); + + this->wordTree->insert_overwriting(wordData.first, toPush); + } + this->wordTreeMutex->unlock(); +} + +void Processor::printProcessorStats() const { + std::cout << std::endl; + std::cout << termcolor::bright_blue << "articles compiled\t" << termcolor::white << this->articles->size() + << std::endl << std::endl; + + std::cout << termcolor::bright_blue << "organizations compiled\t" << termcolor::white << this->organizations.size() + << std::endl + << std::endl; + + std::cout << termcolor::bright_blue << "people compiled\t\t" << termcolor::white << this->people.size() << std::endl + << std::endl; +} + +void Processor::cacheAvlTree() { + if (this->wordTree != nullptr) + this->wordTree->archive_tree("../tree-cache.txt"); +} + +void Processor::cacheArticles() { + if (this->articles == nullptr) + return; + + std::ofstream artFile("../article-cache.txt", std::ios::binary); + if (!artFile.is_open()) + throw std::invalid_argument( + "Error in \"void SearchEngine::cacheArticles()\" | Could not open file ../article-cache.txt"); + + cereal::JSONOutputArchive artArchive(artFile); + artFile << this->articles->size() << std::endl; + for (auto &it: *this->articles) { + artArchive(it.first, it.second); + } +} + +void Processor::buildArticlesFromCache() { + if (this->articles == nullptr) + throw std::invalid_argument( + "Error in \"void SearchEngine::buildArticlesFromCache()\" | this->articles is equal to nullptr"); + + std::ifstream artFile("../article-cache.txt", std::ios::binary); + if (!artFile.is_open()) + throw std::invalid_argument( + "Error in \"void SearchEngine::buildArticlesFromCache()\" | Could not open file ../article-cache.txt"); + + this->articles->clear(); + + artFile >> this->totalFiles; + if (this->totalFiles > 0) { + cereal::JSONInputArchive artArchive(artFile); + for (int i = 0; i < this->totalFiles; ++i) { + std::string str; + Article arti; + artArchive(str, arti); + this->articles->operator[](str) = arti; + } + } +} + +void Processor::buildAvlFromCache() { + std::ifstream treeFile("../tree-cache.txt"); + if (!treeFile.is_open()) { + throw std::invalid_argument("tree-cache file could not be opened"); + } + treeFile >> this->totalWords; + treeFile.close(); + this->wordTree->clear(); + this->wordTree->load_from_archive("../tree-cache.txt"); +} + +void Processor::printArticleTextFromFilePath(const std::string &filename) { + std::ifstream file(filename); + if (!file.is_open()) { + std::cout << "Could not open file: " << filename << std::endl; + } + rapidjson::Document document; + std::string content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + try { + document.Parse(content.c_str()); + } catch (std::exception &e) { + std::cout << termcolor::red << "Could not read file: " << filename << termcolor::reset << std::endl; + } + file.close(); + + assert(document.HasMember("text")); + // print out text field + + std::cout << std::endl << termcolor::bright_blue << "UUID: " << termcolor::white << document["uuid"].GetString() + << std::endl << std::endl; + + std::cout << termcolor::bright_blue << "File Path: " << termcolor::white << filename << std::endl << std::endl; + + std::string author = document["author"].GetString(); + if (!author.empty()) { + std::cout << termcolor::bright_blue << "Author: " << termcolor::white << author << std::endl << std::endl; + } else { + std::cout << termcolor::bright_blue << "No Documented Author" << termcolor::white << std::endl << std::endl; + } + + { + const auto arr = document["entities"]["organizations"].GetArray(); + if (!arr.Empty()) { + std::cout << termcolor::bright_blue << "Organizations: " << termcolor::white << std::endl; + for (const auto &org: arr) { + std::cout << '\t' << org["name"].GetString() << std::endl; + } + } + std::cout << std::endl; + } + + { + const auto arr = document["entities"]["persons"].GetArray(); + if (!arr.Empty()) { + std::cout << termcolor::bright_blue << "People: " << termcolor::white << std::endl; + for (const auto &person: arr) { + std::cout << '\t' << person["name"].GetString() << std::endl; + } + } + std::cout << std::endl; + } + + std::cout << termcolor::bright_blue << "Content: " << termcolor::white << std::endl; + std::cout << document["text"].GetString() << std::endl << std::endl; +} + +double Processor::buildingTreeProgress() { + return (double) this->wordTree->size() / (double) this->totalWords; +} + +double Processor::buildingArticlesProgress() { + return (double) this->articles->size() / (double) this->totalFiles; +} diff --git a/Processor/Processor.h b/Processor/Processor.h new file mode 100644 index 0000000..d39ce64 --- /dev/null +++ b/Processor/Processor.h @@ -0,0 +1,71 @@ +// +// Created by Drew Harris on 4/7/2022. +// + +#ifndef INC_22S_FINAL_PROJ_PROCESSOR_H +#define INC_22S_FINAL_PROJ_PROCESSOR_H + +#include +#include +#include "../utilities/Article.h" +#include "../utilities/StopWords.h" +#include "../avl_tree/avl_tree.h" +#include "../hash_table/hash_table.h" +#include "tbb/concurrent_hash_map.h" + +class Processor { + +private: + // Passed from SearchEngine + std::atomic wordsProcessed; + unsigned int totalWords; + std::atomic filesProcessed; + unsigned int totalFiles; + StopWords stopWords; + std::mutex *fileQueueMutex = nullptr; + std::queue fileQueue; + tbb::concurrent_unordered_map> *tbbMap = nullptr; + tbb::concurrent_unordered_map *articles = nullptr; + avl_tree>> *wordTree = nullptr; + std::mutex *wordTreeMutex; + hash_table> organizations; //org name mapped to UUID vector + hash_table> people; //person name mapped to UUID vector + + void fillQueue(std::string folderName); + + void process(); + +public: + explicit Processor(tbb::concurrent_unordered_map *pArticles, + avl_tree>> *tree, + std::mutex *treeMut); + + ~Processor(); + + void convertMapToTree(); + + void generateIndex(std::string folderName); + + double fileParseProgress(); + + void printProcessorStats() const; + + void cacheAvlTree(); + + void cacheArticles(); + + void buildArticlesFromCache(); + + void buildAvlFromCache(); + + void buildOrgsAndPeople(); + + static void printArticleTextFromFilePath(const std::string &filename); + + double buildingTreeProgress(); + + double buildingArticlesProgress(); +}; + + +#endif //INC_22S_FINAL_PROJ_PROCESSOR_H diff --git a/QueryBuilder/QueryBuilder.cpp b/QueryBuilder/QueryBuilder.cpp new file mode 100644 index 0000000..5ff5364 --- /dev/null +++ b/QueryBuilder/QueryBuilder.cpp @@ -0,0 +1,291 @@ +// +// Created by Drew Harris on 4/27/2022. +// + +#include "QueryBuilder.h" +#include "../utilities/Pipelines.h" + +QueryBuilder::QueryBuilder(ArticleTable *articleTable, WordTree *wordTree) { + this->articleTable = articleTable; + this->wordTree = wordTree; +} + +bool wordIsSpecial(std::string word) { + if (word == "AND" || word == "OR" || word == "NOT" || word == "ORG" || word == "PERSON") { + return true; + } + return false; +} + +void QueryBuilder::buildQuery(std::string query) { + // Split query into words + std::vector words = split(query, ' '); + auto it = words.begin(); + while (it != words.end()) { + std::string word = *it; + if (word == "AND") { + delete this->root; + this->root = new AndNode(this->articleTable, this->wordTree); + it++; + if (it == words.end()) { + return; + } + while (!wordIsSpecial(*it)) { + this->root->addChild(new SingleWordNode(this->articleTable, this->wordTree, *it)); + it++; + if (it == words.end()) { + return; + } + } + } else if (word == "OR") { + delete this->root; + this->root = new OrNode(this->articleTable, this->wordTree); + it++; + if (it == words.end()) { + return; + } + while (!wordIsSpecial(*it)) { + this->root->addChild(new SingleWordNode(this->articleTable, this->wordTree, *it)); + it++; + if (it == words.end()) { + return; + } + } + + // Special "Head nodes" + } else if (word == "NOT") { + // replace the root with a not node and add the old root as a child + std::vector wordsToAdd; + it++; + if (it == words.end()) { + return; + } + while (!wordIsSpecial(*it)) { + wordsToAdd.push_back(*it); + // check if at end of vector + it++; + if (it == words.end()) { + break; + } + } + + QueryNode *oldRoot = this->root; + this->root = new NotNode(this->articleTable, this->wordTree, wordsToAdd); + this->root->addChild(oldRoot); + } else if (word == "ORG") { + std::vector wordsToAdd; + it++; + if (it == words.end()) { + return; + } + while (!wordIsSpecial(*it)) { + wordsToAdd.push_back(*it); + // check if at end of vector + it++; + if (it == words.end()) { + break; + } + } + + QueryNode *oldRoot = this->root; + this->root = new OrgNode(this->articleTable, this->wordTree, wordsToAdd); + this->root->addChild(oldRoot); + + } else if (word == "PERSON") { + std::string person; + it++; + person = *it; + + QueryNode *oldRoot = this->root; + this->root = new PeopleNode(this->articleTable, this->wordTree, person); + this->root->addChild(oldRoot); + it++; + } else { + delete this->root; + this->root = new SingleWordNode(this->articleTable, this->wordTree, word); + it++; + } + } +} + +std::vector QueryBuilder::split(const std::string &basicString, char i) { + std::vector result; + std::stringstream ss(basicString); + std::string item; + while (std::getline(ss, item, i)) { + result.push_back(item); + } + return result; +} + +std::vector
QueryBuilder::executeQuery() { + if (this->root == nullptr) { + return {}; + } + std::vector result = this->root->execute(); + // Compress the result by adding the scores + std::vector compressedResult; + for (ScoredId &scored: result) { + // Search compressedResult for the uuid + // If found : add the score to the existing score + // If not found : add the uuid and score to the compressed result + bool found = false; + for (ScoredId &compressed: compressedResult) { + if (compressed.first.compare(scored.first) == 0) { + compressed.second += scored.second; + found = true; + break; + } + } + if (!found) { + compressedResult.push_back(scored); + } + } + + // Sort the result by score + std::sort(compressedResult.begin(), compressedResult.end(), [](ScoredId &a, ScoredId &b) -> bool { + return a.second > b.second; + }); + + // convert the result to a vector of articles + std::vector
articles; + for (ScoredId &scored: compressedResult) { + articles.push_back(this->articleTable->operator[](scored.first)); + } + return articles; +} + +QueryBuilder::~QueryBuilder() { + delete this->root; +} + +QueryNode::QueryNode(ArticleTable *table, WordTree *tree) { + this->table = table; + this->tree = tree; +} + +QueryNode::~QueryNode() { + for (auto &it: this->children) { + delete it; + } +} + +void QueryNode::addChild(QueryNode *child) { + this->children.push_back(child); +} + +SingleWordNode::SingleWordNode(ArticleTable *table, WordTree *tree, std::string word) : QueryNode(table, tree) { + this->word = word; +} + +std::vector SingleWordNode::execute() { + pipeline::cleanStr(word); + Porter2Stemmer::stem(word); + std::transform(word.begin(), word.end(), word.begin(), ::tolower); + std::vector result; + try { + result = this->tree->operator[](word); + } catch (std::exception &e) { + std::cout << "Word not found in tree" << std::endl; + } + return result; +} + +std::vector AndNode::execute() { + // execute children and merge results if they are shared + std::vector result; + for (auto &it: this->children) { + std::vector childResult = it->execute(); + result.insert(result.end(), childResult.begin(), childResult.end()); + } + + int requiredTimes = this->children.size(); + std::vector finalResult; + + for (ScoredId &scored: result) { + int times = 0; + for (ScoredId &scored2: result) { + if (scored.first == scored2.first) { + times++; + } + } + if (times >= requiredTimes) { + finalResult.push_back(scored); + } + } + return finalResult; +} + +std::vector OrNode::execute() { + // Execute children and merge results + std::vector result; + for (auto &it: this->children) { + std::vector childResult = it->execute(); + result.insert(result.end(), childResult.begin(), childResult.end()); + } + return result; +} + +std::vector NotNode::execute() { + // Gets result of children + if (this->children.size() != 1) { + std::cout << "NotNode only supports one child" << std::endl; + return {}; + } + std::vector result = this->children[0]->execute(); + for (auto &word: this->words) { + pipeline::cleanStr(word); + Porter2Stemmer::stem(word); + std::transform(word.begin(), word.end(), word.begin(), ::tolower); + std::vector toRemove; + try { + toRemove = this->tree->operator[](word); + } catch (std::exception &e) { + std::cout << "Word not found in tree" << std::endl; + } + for (ScoredId &scored: result) { + for (ScoredId &scored2: toRemove) { + if (scored.first == scored2.first) { + result.erase(std::remove(result.begin(), result.end(), scored), result.end()); + } + } + } + } + return result; +} + +std::vector OrgNode::execute() { + std::string orgToSearch = this->orgs[0]; + orgToSearch = pipeline::cleanPropnoun(orgToSearch); + std::vector result = this->children[0]->execute(); + + std::vector passed; + + for (ScoredId &scored: result) { + Article article = this->table->operator[](scored.first); + // if article.orglist contains an org from this->org + if (std::find(article.orgList.begin(), article.orgList.end(), orgToSearch) != article.orgList.end()) { + passed.push_back(scored); + } + } + + return passed; + +} + +std::vector PeopleNode::execute() { + std::string person = this->person; + person = pipeline::cleanPropnoun(person); + std::vector result = this->children[0]->execute(); + + std::vector passed; + + for (ScoredId &scored: result) { + Article article = this->table->operator[](scored.first); + if (std::find(article.peopleList.begin(), article.peopleList.end(), person) != article.peopleList.end()) { + passed.push_back(scored); + } + } + + return passed; +} diff --git a/QueryBuilder/QueryBuilder.h b/QueryBuilder/QueryBuilder.h new file mode 100644 index 0000000..6385c17 --- /dev/null +++ b/QueryBuilder/QueryBuilder.h @@ -0,0 +1,103 @@ +// +// Created by Drew Harris on 4/27/2022. +// + +#ifndef INC_22S_FINAL_PROJ_QUERYBUILDER_H +#define INC_22S_FINAL_PROJ_QUERYBUILDER_H + + +#include "../utilities/typedefs.h" + +class QueryNode { + +protected: + WordTree *tree = nullptr; + ArticleTable *table = nullptr; + std::vector children; +public: + QueryNode(ArticleTable *table, WordTree *tree); + + void addChild(QueryNode *child); + + virtual std::vector execute() = 0; + + ~QueryNode(); +}; + +class SingleWordNode : public QueryNode { +private: + std::string word; + +public: + SingleWordNode(ArticleTable *table, WordTree *tree, std::string word); + + std::vector execute() override; +}; + +class AndNode : public QueryNode { +public: + AndNode(ArticleTable *table, WordTree *tree) : QueryNode(table, tree) {}; + + std::vector execute() override; +}; + +class OrNode : public QueryNode { +public: + OrNode(ArticleTable *table, WordTree *tree) : QueryNode(table, tree) {}; + + std::vector execute() override; +}; + +class NotNode : public QueryNode { +private: + std::vector words; +public: + NotNode(ArticleTable *table, WordTree *tree, std::vector words) : QueryNode(table, tree) { + this->words = words; + }; + + std::vector execute() override; +}; + +class OrgNode : public QueryNode { +private: + std::vector orgs; +public: + OrgNode(ArticleTable *table, WordTree *tree, std::vector orgs) : QueryNode(table, tree) { + this->orgs = orgs; + }; + + std::vector execute() override; +}; + +class PeopleNode : public QueryNode { +private: + std::string person; +public: + PeopleNode(ArticleTable *table, WordTree *tree, std::string person) : QueryNode(table, tree) { + this->person = person; + }; + + std::vector execute() override; +}; + +class QueryBuilder { +private: + ArticleTable *articleTable = nullptr; + WordTree *wordTree = nullptr; + QueryNode *root = nullptr; + +public: + QueryBuilder(ArticleTable *articleTable, WordTree *wordTree); + + void buildQuery(std::string query); + + std::vector
executeQuery(); + + std::vector split(const std::string &basicString, char i); + + ~QueryBuilder(); +}; + + +#endif //INC_22S_FINAL_PROJ_QUERYBUILDER_H diff --git a/README.md b/README.md index ea8f32f..470bf54 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,95 @@ -# Spring 2022 Final Project +# JSON Article Search Engine -## Important: +## Instructions for Use -- You DO NOT need to implement GitHub Actions for the final project. -- DO NOT attempt to push the data set for this project to Github. - - Make sure your data folder is in the `.gitignore` file +- Only one command line argument is required, and it needs to be the path to the folder containing the dataset. +- The console user-interface will begin automatically, and options for engine management and use will be displayed. -## Links: +#### Query Formatting -- Tutorial on RapidJSON by TA Christian > [here](https://github.com/Gouldilocks/rapidTutorial) <. +- The Boolean query will be **prefixed** with a Boolean operator of either AND or OR (*if there is more than one word of interest*). +- No query will contain both AND and OR. +- Single word queries do not need a boolean operator. +- Trailing search terms may be preceded with the NOT operator, which indicates articles containing that term should be removed from the results. +- Additional Operators: A query can contain zero or more of the following: + - ORG - the org operator narrows the results of a query to only include articles that contain the mentioned organization. Replace spaces within an organization name with dashes (-). + - PERSON - the PERSON operator narrows the results of a query to only include articles that contain the mentioned person. People are searched for on a first-name/last-name basis, place a dash (-) between the two. + - Additional Operator Notes: + - the order of ORG or PERSON doesn’t matter + - the operators should always be entered in all caps. +- Example Queries: + - **market** + - This query should return all articles that contain the word market. + - **AND social network** + - This query should return all articles that contain the words social and network. + - **AND social network PERSON mark-zuckerberg** + - This query should return all articles that mention Mark Zuckerberg as a person entity and also contain the words social and network. + - **AND social network PERSON mark-zuckerberg ORG facebook** + - This query should return all articles that contain the words social and network, that have facebook as an organization entity, and that mention Mark Zuckerberg as a person entity. + - **OR snapchat facebook** + - This query should return all articles that contain the word snapchat OR the word facebook. + - **OR facebook meta NOT profits** + - This query should return all articles that contain the word facebook OR the word meta but do NOT contain the word profits. + - **phone NOT AT&T** + - This query should return all articles that contain the word phone but NOT AT&T. + - **OR facebook instagram NOT bankruptcy ORG snapchat PERSON mark-zuckerberg** + - This query should return all articles that contains the word facebook OR the word instagram but do NOT contain the word bankruptcy, and each article within the results should contain the organization Snapchat and the person Mark Zuckerberg. +- Additional Query Information: Stop-words are not indexed within the Search Engine, so all stop-words present within a query will not be considered nor affect the results. + +## Solution Overview + +#### Search Engine + +- Our Solution for the SearchEngine class implements heavy use of the Processor class and the QueryBuilder class. The Processor class utilizes multithreading to enhance speed of file parsing and contains all methods that relate to manipulating the article index, this includes building the article index, manipulating the AVL-Tree indexes, and printing article information. The QueryBuilder class contains all methods that relate to handling the queries entered by the current user, this includes handling query logic and searching the AVL-Tree indexes. +- The QueryBuilder class utilizes a Divide & Conquer algorithm to handle all query logic. The QueryBuilder class was designed with a tree based structure which is used to break apart the original query into seperate branches and leaf nodes. To further specify, each major portion of the original-query is placed into a different branch and processed as its own query. Once all seperate portions are fully processed, all separate result-sets bubble up and combined into the head node to form one major result-set that fufills the logic of the original query. +- This Search Engine solution uses a console driven user-interface that was made to be as ergonomic and visually intuitive as possible, all by using colors and different console-based visual manipulations. +- All features provided by the Search Engine User-Interface: + - Populate engine data by parsing the provided data-set + - Populate engine data from the present caches + - Delete a word from the search engine + - Manage the AVL tree cache + - Manage the article cache + - Enter a query + - View the top-15 results of a query + - View an article from the list of query results + - View the search engine statistics + - Clear all engine data + - End the program + +#### AVL-Tree + +- This Search Engine solution indexes all provided articles into a custom AVL-Tree designed by this team. +- Insertion into this AVL-Tree is iterative and O(lg n) time, where n is the number of nodes within the AVL-Tree. Balance is maintained for all insertions. +- Deletion of nodes from this AVL-Tree is O(lg n) time, where n is the number of nodes within the AVL-Tree. Balance is maintained for all deletions. +- You can serialize this AVL-Tree into an archive file of choice, this archiving algorithm uses JSON formatting that is driven by the [Cereal Serialization Library](https://uscilab.github.io/cereal/). This Library also supports deserialization from an archive file of choice, so that feature is supported and present for the AVL-Tree as well. +- Other features implemented for this AVL-Tree solution: + - In-order key printing + - Level-order key printing + - Level-order node serialization + - Node deserialization + - Different insertion methods that act differently in the scenario where the given key is already associated with a value within the tree: Depending on the used insertion method, the previous value associated with the key is overwritten, the new value is appended to the previous value, or a custom overwriting/appending method is provided by the user. + +#### Hash-Table + +- This Search Engine solution uses a custom hash-table designed by the team to track all indexed organizations and people. +- The maximum load factor that this Hash-Table is allowed to have is 75%, when this load factor is reached, the hash-table doubles its size. +- When there are collisions, the indexing keys algorithm within the Hash-Table utilizes linear traversal to search for the next available bucket. +- Other features implemented for this Hash-Table solution: + - Iterators + - Support for Custom hash functions + - Merging Hash-Tables + - Masking Hash-Tables + +## Helpful Links + +- [Data Set Download Page](https://www.kaggle.com/datasets/jeet2016/us-financial-news-articles) +- [C++ Porter 2 Stemmer Library](https://github.com/smassung/porter2_stemmer) +- [Cereal Serialization Library](https://uscilab.github.io/cereal/) + +## Credits + +- Drew Harris + - [GitHub](https://github.com/drew-harris) +- Adam Escobedo + - [LinkedIn](https://www.linkedin.com/in/adamescobedo/) + - [GitHub](https://github.com/adamcesco) diff --git a/SearchEngine/SearchEngine.cpp b/SearchEngine/SearchEngine.cpp new file mode 100644 index 0000000..3c681a6 --- /dev/null +++ b/SearchEngine/SearchEngine.cpp @@ -0,0 +1,546 @@ +// +// Created by Drew Harris on 4/7/2022. +// + +#include +#include +#include "SearchEngine.h" +#include "../external/termcolor/termcolor.hpp" +#include "../utilities/ProgressBar.h" +#include "../utilities/Pipelines.h" + + +SearchEngine::SearchEngine(std::string data_folder) { + this->data_folder = data_folder; + + this->articles = new tbb::concurrent_unordered_map(); + + this->wordTree = new avl_tree>>(); + this->wordTreeMutex = new std::mutex(); + + this->processor = new Processor(this->articles, this->wordTree, this->wordTreeMutex); + this->query_builder = new QueryBuilder(this->articles, this->wordTree); +} + +SearchEngine::~SearchEngine() { + delete this->processor; + delete this->articles; + delete this->wordTree; + delete this->wordTreeMutex; + delete this->query_builder; +} + +/** + * Loads the data from the data folder into the articles and AVL tree. + */ +void SearchEngine::generateDataFromFiles() { + // Start clock + system("clear"); + std::cout << std::endl << termcolor::red << pipeline::getCenteredText("Generating Index and Articles...", 80) + << termcolor::white << std::endl << std::endl; + auto start = std::chrono::high_resolution_clock::now(); + + ProgressBar progressBar = { + .invoker = this->processor, + .getProgress = [](Processor *p) -> double { + return p->fileParseProgress(); + }, + }; + progressBar.initiate<>(&Processor::generateIndex, this->processor, + this->data_folder); + + std::cout << std::endl << termcolor::red << pipeline::getCenteredText("Converting to AVL Tree...", 80) + << termcolor::white << std::endl << std::endl; + + progressBar.getProgress = [](Processor *p) -> double { + return p->buildingTreeProgress(); + }; + progressBar.initiate<>(&Processor::convertMapToTree, this->processor); + + // End clock + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + system("clear"); + std::cout << std::endl << termcolor::bright_blue << "Index generated successfully!" << termcolor::yellow + << std::endl << std::endl; + std::cout << "Time Taken: " << diff.count() << " Seconds." << termcolor::white << std::endl; +} + +void SearchEngine::initiateConsoleInterface() { + auto GetInput = [this](int maxChoice) -> int { + bool invalid; + int intInput; + do { + std::cout << termcolor::bright_blue + << "22s-final-project-fair-game / console-interface / " << termcolor::bright_green + << "search-engine > " << termcolor::white; + std::string input; + std::cin >> input; + + char *p; + intInput = std::strtol(input.c_str(), &p, 10); + invalid = (*p != '\0' || intInput > maxChoice || intInput < 1 || + (intInput == 7 && this->isIncomplete()) || (intInput == 4 && this->wordTree->is_empty())); + if (invalid) { + std::cout << "incorrect input" << std::endl; + } + } while (invalid); + return intInput; + }; + + system("clear"); + while (true) { + std::cout << termcolor::bright_green << std::endl; + std::cout << "enter a number: " << std::endl; + std::cout << "1. populate engine data by parsing JSON documents" << std::endl; + std::cout << "2. populate avl tree from cache" << std::endl; + std::cout << "3. populate articles from cache" << std::endl; + std::cout << "4. delete a word from the avl tree" << std::endl; + std::cout << "5. manage avl tree cache" << std::endl; + std::cout << "6. manage article cache" << std::endl; + std::cout << "7. enter boolean search query" << std::endl; + std::cout << "8. print search engine statistics" << std::endl; + std::cout << "9. clear engine data" << std::endl; + std::cout << "10. end program" << std::endl; + std::cout << termcolor::white << std::endl; + + int intInput = GetInput(10); + + switch (intInput) { + case 1 : + system("clear"); + this->generateDataFromFiles(); + break; + + case 2 : + system("clear"); + this->generateAVLFromCache(); + break; + + case 3 : + system("clear"); + this->generateArticlesFromCache(); + break; + + case 4 : { + system("clear"); + std::cout << std::endl << termcolor::bright_green << "Enter a word: " << termcolor::white; + std::string word; + std::cin >> word; + std::string oriWord = word; + system("clear"); + pipeline::cleanStr(word); + Porter2Stemmer::stem(word); + try { this->wordTree->delete_node(word); } + catch (const std::invalid_argument &e) { + std::cout << std::endl << termcolor::bright_blue << oriWord << " (" << word + << ") was not found in avl tree" << termcolor::white << std::endl << std::endl; + break; + } + std::cout << std::endl << termcolor::bright_blue << oriWord << " (" << word + << ") has been successfully deleted!" << termcolor::white << std::endl << std::endl; + break; + } + + case 5 : + system("clear"); + this->avlCacheConsoleManager(); + system("clear"); + break; + + case 6 : + system("clear"); + this->articleCacheConsoleManager(); + system("clear"); + break; + + case 7 : + queryInterface(); + break; + + case 8 : + system("clear"); + this->consolePrintEngineStats(); + break; + + case 9 : { + system("clear"); + std::cout << std::endl << termcolor::red << pipeline::getCenteredText("clearing all engine data...", 80) + << termcolor::white + << std::endl; + + if (this->wordTree != nullptr) + this->wordTree->clear(); + + if (this->articles != nullptr) + this->articles->clear(); + + delete this->processor; + this->processor = new Processor(this->articles, this->wordTree, this->wordTreeMutex); + + system("clear"); + std::cout << std::endl << termcolor::bright_blue << "all engine data is cleared" << termcolor::white + << std::endl << std::endl; + break; + } + + case 10 : + system("clear"); + std::cout << "Shutting down" << std::endl; + return; + break; + } + } +} + + +int SearchEngine::consolePrintEngineStats() { + int avlSize = 0; + std::cout << std::endl; + std::cout << termcolor::bright_blue << "Search Engine Statistics:" << termcolor::white << std::endl; + + if (this->processor != nullptr) { + this->processor->buildOrgsAndPeople(); + this->processor->printProcessorStats(); + } else { + std::cout << termcolor::bright_blue << "articles compiled\t" << termcolor::white << "0" << std::endl + << std::endl; + + std::cout << termcolor::bright_blue << "organizations compiled\t" << termcolor::white << "0" << std::endl + << std::endl; + + std::cout << termcolor::bright_blue << "people compiled\t\t" << termcolor::white << "0" << std::endl + << std::endl; + } + + if (this->wordTree != nullptr) { + std::cout << termcolor::bright_blue << "avl tree size\t\t" << termcolor::white << this->wordTree->size() + << std::endl; + std::cout << std::endl; + avlSize = this->wordTree->size(); + + if (!this->wordTree->is_empty()) { + print_top_25(*this->wordTree); + } + } else { + std::cout << termcolor::bright_blue << "avl tree size\t\t" << termcolor::white << "0" << std::endl; + } + + return avlSize; +} + +void SearchEngine::avlCacheConsoleManager() { //completed + while (true) { + std::cout << termcolor::bright_green << std::endl; + std::cout << "enter a number: " << std::endl; + std::cout << "1. populate avl-cache with current avl tree data" << std::endl; + std::cout << "2. populate avl tree from cache" << std::endl; + std::cout << "3. clear avl-cache" << std::endl; + std::cout << "4. view avl-cache statistics" << std::endl; + std::cout << "5. exit to main menu" << std::endl; + std::cout << termcolor::white << std::endl; + + bool invalid; + int intInput; + do { + std::cout + << termcolor::bright_blue + << "22s-final-project-fair-game / console-interface / search-engine / " << termcolor::bright_green + << "avl-cache-manager > " << termcolor::white; + std::string input; + std::cin >> input; + + intInput = input[0] & 15; + invalid = (input.length() != 1 || !std::isdigit(input[0]) || intInput > 5 || intInput < 1 || + (intInput == 1 && this->wordTree->is_empty())); + if (invalid) { + std::cout << "incorrect input" << std::endl; + } + } while (invalid); + + switch (intInput) { + case 1 : { + this->processor->cacheAvlTree(); + system("clear"); + std::cout << std::endl << this->wordTree->size() << " nodes placed into cache" << std::endl + << std::endl; + break; + } + + case 2 : { + system("clear"); + this->generateAVLFromCache(); + break; + } + + case 3 : { + std::ofstream treeFile("../tree-cache.txt", std::ios::trunc); + if (!treeFile.is_open()) { + std::cout << "tree-cache file could not be opened" << std::endl; + break; + } + treeFile << "0" << std::endl; + treeFile.close(); + system("clear"); + std::cout << std::endl << "AVL-Tree Cache is cleared" << std::endl << std::endl; + + break; + } + + case 4: { + system("clear"); + std::cout << std::endl << "AVL-Tree Cache Statistics:" << std::endl; + + std::ifstream cacheFile("../tree-cache.txt"); + if (!cacheFile.is_open()) { + std::cout << "tree-cache file could not be opened" << std::endl; + break; + } + std::cout << "state\t\tfile is present" << std::endl; + + int cacheSize = 0; + cacheFile >> cacheSize; + std::cout << "cache size\t" << cacheSize << " nodes in archive" << std::endl; + std::cout << std::endl; + break; + } + + case 5: + return; + break; + } + } +} + +void SearchEngine::articleCacheConsoleManager() { //completed + while (true) { + std::cout << termcolor::bright_green << std::endl; + std::cout << "enter a number: " << std::endl; + std::cout << "1. populate article-cache with current article data" << std::endl; + std::cout << "2. populate articles from cache" << std::endl; + std::cout << "3. clear article-cache" << std::endl; + std::cout << "4. view article-cache statistics" << std::endl; + std::cout << "5. exit to main menu" << std::endl; + std::cout << termcolor::white << std::endl; + + bool invalid; + int intInput; + do { + std::cout + << termcolor::bright_blue + << "22s-final-project-fair-game / console-interface / search-engine / " << termcolor::bright_green + << "article-cache-manager > " << termcolor::white; + std::string input; + std::cin >> input; + + intInput = input[0] & 15; + invalid = (input.length() != 1 || !std::isdigit(input[0]) || intInput > 5 || intInput < 1 || + (intInput == 1 && this->articles->empty())); + if (invalid) { + std::cout << "incorrect input" << std::endl; + } + } while (invalid); + + switch (intInput) { + case 1 : + this->processor->cacheArticles(); + system("clear"); + std::cout << std::endl << this->articles->size() << " articles placed into cache" << std::endl + << std::endl; + break; + + case 2 : + system("clear"); + this->generateArticlesFromCache(); + break; + + case 3 : { + std::ofstream artFile("../article-cache.txt", std::ios::trunc); + if (!artFile.is_open()) { + std::cout << "article-cache file could not be opened" << std::endl; + break; + } + artFile << "0" << std::endl; + artFile.close(); + system("clear"); + std::cout << std::endl << "Article Cache is cleared" << std::endl << std::endl; + break; + } + + case 4: { + system("clear"); + std::cout << std::endl; + std::cout << "Article Cache Statistics:" << std::endl; + + std::ifstream cacheFile("../article-cache.txt"); + if (!cacheFile.is_open()) { + std::cout << "state\t\tfile could not be opened" << std::endl; + break; + } + std::cout << "state\t\tfile is present" << std::endl; + + int cacheSize = 0; + cacheFile >> cacheSize; + std::cout << "cache size\t" << cacheSize << " articles in archive" << std::endl; + std::cout << std::endl; + break; + } + + case 5: + return; + break; + } + } +} + +void SearchEngine::queryInterface() { + std::vector
result; + auto GetInput = [&result](int maxChoice) -> int { + bool invalid; + int intInput; + do { + std::cout << termcolor::bright_blue + << "22s-final-project-fair-game / search-engine / " << termcolor::bright_green + << "query-interface > " << termcolor::white; + std::string input; + std::cin >> input; + + char *p; + intInput = std::strtol(input.c_str(), &p, 10); + invalid = (*p != '\0' || intInput > maxChoice || intInput < 1 || (intInput == 2 && result.empty())); + if (invalid) { + std::cout << "incorrect input" << std::endl; + } + } while (invalid); + return intInput; + }; + + //------------------------------------------------------ + + system("clear"); + std::cout << termcolor::bright_green << std::endl; + std::cout << "Enter query: " << termcolor::white; + std::string query; + std::cin.ignore(); + std::getline(std::cin, query); + + auto start = std::chrono::high_resolution_clock::now(); + this->query_builder->buildQuery(query); + result = this->query_builder->executeQuery(); + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << std::endl << termcolor::yellow << "Found " << result.size() << " articles in " << diff.count() + << " seconds" << std::endl << termcolor::white; + + do { + if (!result.empty()) + std::cout << std::endl << termcolor::bright_green << "Top-15 Results: " << termcolor::white << std::endl; + + // show first 15 results with a number in front of each + int i = 1; + for (auto &it: result) { + std::cout << i << ": " << it.title << std::endl; + i++; + if (i > 15) + break; + } + + std::cout << termcolor::bright_green << std::endl; + std::cout << "enter a number" << std::endl; + std::cout << "1. enter another query" << std::endl; + std::cout << "2. view an article" << std::endl; + std::cout << "3. exit" << std::endl << std::endl << termcolor::white; + + int choice = GetInput(3); + + switch (choice) { + case 1: { + system("clear"); + std::cout << termcolor::bright_green << std::endl; + std::cout << "Enter query: " << termcolor::white; + std::cin.ignore(); + std::getline(std::cin, query); + start = std::chrono::high_resolution_clock::now(); + this->query_builder->buildQuery(query); + result = this->query_builder->executeQuery(); + end = std::chrono::high_resolution_clock::now(); + diff = end - start; + std::cout << std::endl << termcolor::yellow << "Found " << result.size() << " articles in " + << diff.count() + << " seconds" << std::endl << termcolor::white; + break; + } + case 2: { + // Prompt for a number to view + std::cout << std::endl << termcolor::bright_green << "Enter a number to view an article: " << std::endl + << std::endl; + int num = GetInput(result.size()); + system("clear"); + Processor::printArticleTextFromFilePath(result[num - 1].filename); + break; + } + case 3: { + system("clear"); + return; + } + } + } while (true); +} + +bool SearchEngine::isIncomplete() { + return ((this->wordTree == nullptr || this->wordTree->is_empty()) || + (this->articles == nullptr || this->articles->empty())); +} + +bool SearchEngine::isEmpty() { + return ((this->wordTree == nullptr || this->wordTree->is_empty()) && + (this->articles == nullptr || this->articles->empty())); +} + +void SearchEngine::generateAVLFromCache() { + std::cout << std::endl << termcolor::red << pipeline::getCenteredText("Building AVL Tree...", 80) + << termcolor::white << std::endl << std::endl; + + auto start = std::chrono::high_resolution_clock::now(); + + this->wordTree->clear(); + + ProgressBar progressBar = { + .invoker = this->processor, + .getProgress = [](Processor *p) -> double { + return p->buildingTreeProgress(); + }, + }; + progressBar.initiate<>(&Processor::buildAvlFromCache, this->processor); + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + system("clear"); + std::cout << std::endl << termcolor::bright_blue << "AVL Tree Built successfully!" << termcolor::yellow + << std::endl << std::endl; + std::cout << "Time Taken: " << diff.count() << " Seconds." << termcolor::white << std::endl; +} + +void SearchEngine::generateArticlesFromCache() { + std::cout << std::endl << termcolor::red << pipeline::getCenteredText("Building Articles...", 80) + << termcolor::white << std::endl << std::endl; + + auto start = std::chrono::high_resolution_clock::now(); + + this->articles->clear(); + + ProgressBar progressBar = { + .invoker = this->processor, + .getProgress = [](Processor *p) -> double { + return p->buildingArticlesProgress(); + }, + }; + progressBar.initiate<>(&Processor::buildArticlesFromCache, this->processor); + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + system("clear"); + std::cout << std::endl << termcolor::bright_blue << "Articles Built successfully!" << termcolor::yellow + << std::endl << std::endl; + std::cout << "Time Taken: " << diff.count() << " Seconds." << termcolor::white << std::endl; +} diff --git a/SearchEngine/SearchEngine.h b/SearchEngine/SearchEngine.h new file mode 100644 index 0000000..c50bd09 --- /dev/null +++ b/SearchEngine/SearchEngine.h @@ -0,0 +1,54 @@ +// +// Created by Drew Harris on 4/7/2022. +// + +#ifndef INC_22S_FINAL_PROJ_SEARCHENGINE_H +#define INC_22S_FINAL_PROJ_SEARCHENGINE_H + +#include "../Processor/Processor.h" +#include "../QueryBuilder/QueryBuilder.h" + +class SearchEngine { +private: + std::string data_folder; + ArticleTable *articles = nullptr; + WordTree *wordTree = nullptr; + std::mutex *wordTreeMutex = nullptr; + + void avlCacheConsoleManager(); + + void articleCacheConsoleManager(); + + void queryInterface(); + +public: + Processor *processor = nullptr; + QueryBuilder *query_builder = nullptr; + + /** + * @param data_folder The folder containing the data files + */ + explicit SearchEngine(std::string data_folder); + + /** + * Populates the articles and the inverse index with the articles + */ + void generateDataFromFiles(); + + void generateAVLFromCache(); + + void generateArticlesFromCache(); + + int consolePrintEngineStats(); + + void initiateConsoleInterface(); + + bool isIncomplete(); + + bool isEmpty(); + + ~SearchEngine(); +}; + + +#endif //INC_22S_FINAL_PROJ_SEARCHENGINE_H diff --git a/avl_tree/avl_friends.cpp b/avl_tree/avl_friends.cpp new file mode 100644 index 0000000..de008ae --- /dev/null +++ b/avl_tree/avl_friends.cpp @@ -0,0 +1,34 @@ +// +// Created by misc1 on 4/30/2022. +// + +#include +#include "./avl_tree.h" +#include "../external/termcolor/termcolor.hpp" + +void print_top_25(avl_tree>> &tree) { + std::vector> words; + + std::function>> *&)> find; + find = [&words, &find](binary_node>> *&node) { + if (node != nullptr) { + find(node->left); + + words.emplace_back(node->key, node->data.size()); + + find(node->right); + } + }; + + find(tree.root); + + std::sort(words.begin(), words.end(), + [](const std::pair &p1, const std::pair &p2) -> bool { + return (p1.second > p2.second); + }); + + std::cout << termcolor::bright_blue << "Top 25 most popular words:" << termcolor::white << std::endl; + for (int i = 0; i < 25; ++i) { + std::cout << words[i].first << "\t\t" << words[i].second << " articles" << std::endl; + } +} \ No newline at end of file diff --git a/avl_tree/avl_tests.cpp b/avl_tree/avl_tests.cpp new file mode 100644 index 0000000..829b5c0 --- /dev/null +++ b/avl_tree/avl_tests.cpp @@ -0,0 +1,284 @@ +// +// Created by Adam Escobedo on 4/8/2022. +// + +#include "../CatchTestUtils/catch.hpp" +#include "avl_tree.h" +#include +#include +#include +#include + +TEST_CASE("Testing avl_tree constructs and destructors", "[avl_tree]") { + SECTION("Testing default constructor and destructor") { + avl_tree testDummy; + testDummy.insert(1, 2); + REQUIRE(testDummy.contains(1)); + REQUIRE(testDummy[1] == 2); + } + + SECTION("Testing copy constructor and destructor with empty avl_tree") { + avl_tree testDummy; + avl_tree testAVL(testDummy); + REQUIRE(testAVL.size() == 0); + } + + SECTION("Testing copy constructor and destructor with avl_tree size 1") { + avl_tree testDummy; + testDummy.insert(1, 2); + + avl_tree testAVL(testDummy); + REQUIRE(testAVL.contains(1)); + REQUIRE(testAVL.size() == 1); + } + + SECTION("Testing copy constructor and destructor with avl_tree size 5") { + avl_tree testDummy; + testDummy.insert(1, -1); + testDummy.insert(2, -2); + testDummy.insert(3, -3); + testDummy.insert(4, -4); + testDummy.insert(5, -5); + + avl_tree testAVL(testDummy); + REQUIRE(testAVL.contains(1)); + REQUIRE(testAVL.contains(2)); + REQUIRE(testAVL.contains(3)); + REQUIRE(testAVL.contains(4)); + REQUIRE(testAVL.contains(5)); + REQUIRE(testAVL.size() == 5); + REQUIRE(testAVL.is_balanced()); + } +} + +TEST_CASE("Testing avl_tree filling and rotations", "[avl_tree]") { + SECTION("Testing avl tree filling (LL rotations only) and destructor") { + avl_tree testDummy; + testDummy.insert(1, -1); + testDummy.insert(2, -2); + testDummy.insert(3, -3); + testDummy.insert(4, -4); + testDummy.insert(5, -5); + REQUIRE(testDummy.contains(1)); + REQUIRE(testDummy.contains(2)); + REQUIRE(testDummy.contains(3)); + REQUIRE(testDummy.contains(4)); + REQUIRE(testDummy.contains(5)); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree filling (RR rotations only) and destructor") { + avl_tree testDummy; + testDummy.insert(5, -5); + testDummy.insert(4, -4); + testDummy.insert(3, -3); + testDummy.insert(2, -2); + testDummy.insert(1, -1); + REQUIRE(testDummy.contains(1)); + REQUIRE(testDummy.contains(2)); + REQUIRE(testDummy.contains(3)); + REQUIRE(testDummy.contains(4)); + REQUIRE(testDummy.contains(5)); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree filling (LL rotations only) and destructor | key: int, value: std::vector") { + avl_tree> testDummy; + testDummy.insert_overwriting(1, {-1}); + testDummy.insert_overwriting(2, {-2}); + testDummy.insert_overwriting(3, {-3}); + testDummy.insert_overwriting(4, {-4}); + testDummy.insert_overwriting(5, {-5}); + REQUIRE(testDummy.contains(1)); + REQUIRE(testDummy.contains(2)); + REQUIRE(testDummy.contains(3)); + REQUIRE(testDummy.contains(4)); + REQUIRE(testDummy.contains(5)); + REQUIRE(testDummy.is_balanced()); + + testDummy[1].push_back(-10); + REQUIRE(testDummy[1][0] == -1); + REQUIRE(testDummy[1][1] == -10); + } + + SECTION("Testing avl tree random filling (all rotations) and destructor") { + avl_tree testDummy; + + for (int i = 0; i < 3330; ++i) { + testDummy.insert(rand(), i); + } + REQUIRE(testDummy.is_balanced()); + REQUIRE(testDummy.size() == 3330); + } + + SECTION("Testing avl tree random filling (all rotations) and destructor | key: int, value: std::vector") { + avl_tree> testDummy; + + for (int i = 0; i < 33300; ++i) { + testDummy.insert_overwriting(rand(), {i}); + } + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree filling and reading | key: int, value: std::vector") { + avl_tree> testDummy; + + for (int i = 0; i < 1000; ++i) { + testDummy.insert_overwriting(i, {i}); + } + REQUIRE(testDummy.is_balanced()); + + for (int i = 0; i < 1000; ++i) { + REQUIRE(testDummy[i].size() == 1); + testDummy[i].push_back(0); + REQUIRE(testDummy[i][1] == 0); + } + REQUIRE(testDummy.is_balanced()); + + for (int i = 0; i < 1000; ++i) { + testDummy[0].push_back(0); + } + REQUIRE(testDummy[0].size() == 1002); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree filling and reading | key: int, value: avl_tree") { + avl_tree> testDummy; + + for (int i = 0; i < 1000; ++i) { + testDummy.insert_overwriting(i, avl_tree()); + } + REQUIRE(testDummy.is_balanced()); + + for (int i = 0; i < 1000; ++i) { + REQUIRE(testDummy[i].size() == 0); + testDummy[i].insert(1, i * 2); + REQUIRE(testDummy[i].size() == 1); + REQUIRE(testDummy[i][1] == i * 2); + } + REQUIRE(testDummy.is_balanced()); + } +} + +TEST_CASE("Testing avl_tree assignment operator overload", "[avl_tree]") { + SECTION("Testing assignment operator overload and destructor with empty avl_tree") { + avl_tree testDummy; + avl_tree testAVL; + testAVL = testDummy; + REQUIRE(testAVL.size() == 0); + } + + SECTION("Testing assignment operator overload and destructor with avl_tree size 1") { + avl_tree testDummy; + testDummy.insert(1, 2); + + avl_tree testAVL; + testAVL = testDummy; + REQUIRE(testAVL.contains(1)); + REQUIRE(testAVL.size() == 1); + } + + SECTION("Testing assignment operator overload and destructor with avl_tree size 5") { + avl_tree testDummy; + testDummy.insert(1, -1); + testDummy.insert(2, -2); + testDummy.insert(3, -3); + testDummy.insert(4, -4); + testDummy.insert(5, -5); + + avl_tree testAVL; + testAVL = testDummy; + REQUIRE(testAVL.contains(1)); + REQUIRE(testAVL.contains(2)); + REQUIRE(testAVL.contains(3)); + REQUIRE(testAVL.contains(4)); + REQUIRE(testAVL.contains(5)); + REQUIRE(testAVL.size() == 5); + REQUIRE(testAVL.is_balanced()); + } +} + +TEST_CASE("Testing AVL tree deletion") { + { + avl_tree testDummy; + testDummy.insert(0, 0); + testDummy.insert(-6, 1); + testDummy.insert(2, 2); + testDummy.insert(-7, 3); + + SECTION("Testing avl tree node deletion and destructing | 1") { + testDummy.delete_node(-7); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 2") { + testDummy.delete_node(-6); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 3") { + testDummy.delete_node(0); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 4") { + testDummy.delete_node(2); + REQUIRE(testDummy.is_balanced()); + } + + testDummy.insert(1, 4); + + SECTION("Testing avl tree node deletion and destructing | 5") { + testDummy.delete_node(2); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 5") { + testDummy.delete_node(1); + REQUIRE(testDummy.is_balanced()); + } + + testDummy.insert(3, 4); + + SECTION("Testing avl tree node deletion and destructing | 6") { + testDummy.delete_node(2); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 7") { + testDummy.delete_node(3); + REQUIRE(testDummy.is_balanced()); + } + + SECTION("Testing avl tree node deletion and destructing | 8") { + testDummy.delete_node(0); + REQUIRE(testDummy.is_balanced()); + } + } + + SECTION("Testing random avl tree node deletion and destructing") { + avl_tree testDummy; + std::unordered_set insertedNums; + + for (int i = 0; i < 1000; ++i) { + int toInsert = rand() % 20; + insertedNums.emplace(toInsert); + testDummy.insert_overwriting(toInsert, i); + } + + for (const auto it: insertedNums) { + bool deleted = true; + try { + testDummy.delete_node(it); + } + catch (const std::invalid_argument &e) { + std::cout << "Could not delete: " << it << std::endl; + deleted = false; + } + bool isBalanced = testDummy.is_balanced(); + REQUIRE(isBalanced); + REQUIRE(deleted); + } + REQUIRE(testDummy.size() == 0); + } +} \ No newline at end of file diff --git a/avl_tree/avl_tree.h b/avl_tree/avl_tree.h new file mode 100644 index 0000000..a541576 --- /dev/null +++ b/avl_tree/avl_tree.h @@ -0,0 +1,823 @@ +// +// Created by Adam Escobedo on 4/7/2022. +// + +#ifndef INC_22S_FINAL_PROJ_AVL_TREE_H +#define INC_22S_FINAL_PROJ_AVL_TREE_H + +#include +#include +#include +#include +#include + +template +struct binary_node { + void emplace_left(const T &pKey, const U &value) { + delete left; + left = new binary_node(); + left->key = pKey; + left->data = value; + } + + void emplace_right(const T &pKey, const U &value) { + delete right; + right = new binary_node(); + right->key = pKey; + right->data = value; + } + + void copy_subtree(const binary_node *pNode) { + if (pNode == nullptr) + return; + key = pNode->key; + data = pNode->data; + maxHeight = pNode->maxHeight; + delete this->left; + if (pNode->left != nullptr) { + this->left = new binary_node(); + this->left->copy_subtree(pNode->left); + this->left->parent = this; + } + delete this->right; + if (pNode->right != nullptr) { + this->right = new binary_node(); + this->right->copy_subtree(pNode->right); //stitch parents + this->right->parent = this; + } + } + + ~binary_node() { + delete left; + delete right; + } + + T key; + U data; + int maxHeight = 0; + binary_node *parent = nullptr; + binary_node *left = nullptr; + binary_node *right = nullptr; +}; + +#include "../external/cereal/archives/json.hpp" +#include "../external/cereal/archives/binary.hpp" +#include "../external/cereal/types/vector.hpp" +#include "../external/cereal/types/string.hpp" +#include "../external/cereal/types/utility.hpp" + +template +class avl_tree { +public: + + avl_tree() = default; + + avl_tree(const avl_tree &); + + avl_tree &operator=(const avl_tree &); + + /** + * @brief Returns true if the passed key is within the tree, otherwise returns false. + * @param pKey This is the value that will be searched for within the avl_tree + * @attention O(lg n) + * @attention Uses "==", "<", and ">" operators. + * */ + bool contains(const T &pKey); + + /** + * @brief Returns the value bound to the passed key by reference. + * @param pKey This is the value that will be searched for within the avl_tree, in order to get the value associated with it. + * @attention O(lg n) + * @attention Uses "==", "<", and ">" operators. + * */ + U &operator[](const T &pKey); + + unsigned int size() { return nodeCount; } + + bool is_empty() { return nodeCount == 0; } + + /** + * @brief Places the passed key/value pair into the avl_tree. If the passed key is already found within this avl_tree, then the passed append function will be used to append the passed value to the original value within that pre-existing node. + * @param pKey This is the value that will be referenced for placement position within the avl_tree, and it will be the key that is paired/bound with the passed value parameter. + * @param pValue This is the value that will be placed into the newly created avl_tree node. + * @param append This is the function that will be used in the case where a node with a key equal to the passed key already exist. This is where the funciton will "append" the passed value to the original value within that pre-existing node. + * @attention O(lg n) + * @attention Uses "=", "==", "<", and ">" operators. + * */ + avl_tree & + insert(const T &pKey, const U &pValue, void (*append)(U &, const U &)); + + /** + * @brief Places the passed key/value pair into the avl_tree. If the passed key is already found within this avl_tree, then the "+=" operator will be called to append the passed value into the original value within that pre-existing node. + * @param pKey This is the value that will be referenced for placement position within the avl_tree, and it will be the key that is paired/bound with the passed value parameter. + * @param pValue This is the value that will be placed into the newly created avl_tree node. + * @attention O(lg n) + * @attention Uses "=", "+=", "==", "<", and ">" operators. + * */ + avl_tree &insert(const T &pKey, const U &pValue); + + /** + * @brief Places the passed key/value pair into the avl_tree. If the passed key is already found within this avl_tree, then the "=" operator will be called to overwrite the original value within that pre-existing node with the passed value. + * @param pKey This is the value that will be referenced for placement position within the avl_tree, and it will be the key that is paired/bound with the passed value parameter. + * @param pValue This is the value that will be placed into the newly created avl_tree node. + * @attention O(lg n) + * @attention Uses "=", "==", "<", and ">" operators. + * */ + avl_tree &insert_overwriting(const T &pKey, const U &pValue); + + bool is_balanced(); + + avl_tree &delete_node(const T &pKey); + + avl_tree &clear(); + + void print_keys_in_order() { in_order_backbone(avl_tree::root); } + + void print_keys_level_order(); + + void archive_tree(std::string filename); + + void load_from_archive(std::string filename); + + friend void print_top_25(avl_tree>> &wordTree); + + ~avl_tree(); + +protected: + + enum INSERT_OPERATION { + INSERTED, MASKED + }; + + enum DIRECTION { //used to determine which directing super-parent stitches + LEFT, RIGHT + }; + + binary_node *LL_rotate(binary_node *&alpha, DIRECTION stitchDir); + + binary_node *RR_rotate(binary_node *&alpha, DIRECTION stitchDir); + + void LR_rotate(binary_node *&alpha); + + void RL_rotate(binary_node *&alpha); + + bool balance_alpha(binary_node *&alpha); + + binary_node *unbalanced_insert(const T &pKey, const U &pValue, INSERT_OPERATION &operation, + void (*append)(U &, const U &)); + + binary_node *unbalanced_insert_appending(const T &pKey, const U &pValue, INSERT_OPERATION &operation); + + binary_node *unbalanced_insert_overwriting(const T &pKey, const U &pValue, INSERT_OPERATION &operation); + + int node_height_difference(binary_node *leftNode, binary_node *rightNode); + + static int node_height(binary_node *node); + + int update_height_of_subtree(binary_node *node); + + bool check_balance(binary_node *&node); + + binary_node *find_place_of_from(binary_node *&node, const T &pKey, DIRECTION &); + + void in_order_backbone(binary_node *&node); + + void print_console_current_level(binary_node *&node, int level); + + void archive_current_level(cereal::JSONOutputArchive &archive, binary_node *&node, int level); + + unsigned int nodeCount = 0; + binary_node *root = nullptr; +}; + +template +avl_tree &avl_tree::insert(const T &pKey, const U &pValue, + void (*append)(U &, const U &)) { + INSERT_OPERATION operation = INSERTED; + binary_node *curNode = unbalanced_insert(pKey, pValue, operation, append); //O(lg n) + if (operation == MASKED) + return *this; + + binary_node *prev = nullptr; + while (curNode != nullptr) { //O(lg n) + curNode->maxHeight = std::max(node_height(curNode->left), node_height(curNode->right)) + 1; + if (balance_alpha(curNode)) { + curNode = prev; + continue; + } + + prev = curNode; + curNode = curNode->parent; + } + + ++nodeCount; + + return *this; +} + +template +binary_node * +avl_tree::unbalanced_insert(const T &pKey, const U &pValue, INSERT_OPERATION &operation, + void (*append)(U &, const U &)) { + binary_node *temp = root; + binary_node *y = nullptr; + int leftBranch = 0; + + while (temp != nullptr) { + y = temp; + if (pKey == temp->key) { + leftBranch = 0; + break; + } else if (pKey < temp->key) { + temp = temp->left; + leftBranch = -1; + } else { + temp = temp->right; + leftBranch = 1; + } + } + + operation = INSERTED; + if (leftBranch == 0) { + if (temp == nullptr) { + temp = new binary_node(); + root = temp; + temp->data = pValue; + } else { + append(temp->data, pValue); + operation = MASKED; + } + temp->key = pKey; + + return temp; + } else if (leftBranch == -1) { + y->emplace_left(pKey, pValue); + y->left->parent = y; + return y->left; + } else { + y->emplace_right(pKey, pValue); + y->right->parent = y; + return y->right; + } +} + +template +bool avl_tree::balance_alpha(binary_node *&alpha) { + int balance = node_height_difference(alpha->left, alpha->right); //needs nullptr checks, nullptr = -1 + if (balance > 1) { + DIRECTION nodeDir = LEFT; + if (alpha->parent != nullptr) { + if (alpha->parent->left == alpha) + nodeDir = LEFT; + else if (alpha->parent->right == alpha) + nodeDir = RIGHT; + } + + if (node_height_difference(alpha->left->left, alpha->left->right) > 0) //logic is correct + LL_rotate(alpha, nodeDir); + else + RL_rotate(alpha); + return true; + } else if (balance < -1) { + DIRECTION nodeDir = LEFT; + if (alpha->parent != nullptr) { + if (alpha->parent->left == alpha) + nodeDir = LEFT; + else if (alpha->parent->right == alpha) + nodeDir = RIGHT; + } + + if (node_height_difference(alpha->right->left, alpha->right->right) < 0) //logic is correct + RR_rotate(alpha, nodeDir); + else + LR_rotate(alpha); + return true; + } + return false; +} + +template +bool avl_tree::contains(const T &pKey) { + binary_node *temp = root; + while (temp != nullptr) { + if (pKey == temp->key) { + return true; + } else if (pKey < temp->key) { + temp = temp->left; + } else { + temp = temp->right; + } + } + return false; +} + +template +int avl_tree::update_height_of_subtree(binary_node *node) { + int height = 0; + if (node != nullptr) { + int left_height = update_height_of_subtree(node->left); + int right_height = update_height_of_subtree(node->right); + node->maxHeight = height = std::max(left_height, right_height); + height += 1; + } + return height; +} + +template +binary_node * +avl_tree::LL_rotate(binary_node *&alpha, DIRECTION stitchDir) { //alpha = x, pivot = y + binary_node *pivot; + binary_node *alphaParent = alpha->parent; + pivot = alpha->left; + + alpha->left = pivot->right; + if (alpha->left != nullptr) + alpha->left->parent = alpha; + pivot->right = alpha; + alpha->parent = pivot; + + + if (alpha == root) + root = pivot; + if (alphaParent != nullptr) { + if (stitchDir == LEFT) + alphaParent->left = pivot; + else + alphaParent->right = pivot; + } + pivot->parent = alphaParent; + + alpha->maxHeight = std::max(node_height(alpha->left), node_height(alpha->right)) + 1; + + return pivot; //highest node that needs changing is "pivot" +} + +template +binary_node * +avl_tree::RR_rotate(binary_node *&alpha, DIRECTION stitchDir) { //alpha = x, pivot = y + binary_node *pivot; + binary_node *alphaParent = alpha->parent; + pivot = alpha->right; + + alpha->right = pivot->left; + if (alpha->right != nullptr) + alpha->right->parent = alpha; + pivot->left = alpha; + alpha->parent = pivot; + + + if (alpha == root) + root = pivot; + if (alphaParent != nullptr) { + if (stitchDir == LEFT) + alphaParent->left = pivot; + else + alphaParent->right = pivot; + } + pivot->parent = alphaParent; + + alpha->maxHeight = std::max(node_height(alpha->left), node_height(alpha->right)) + 1; + + return pivot; //highest node that needs changing is "pivot" +} + +template +void avl_tree::LR_rotate(binary_node *&alpha) { + alpha->right = LL_rotate(alpha->right, RIGHT); + + DIRECTION nodeDir = LEFT; + if (alpha->parent != nullptr) { + if (alpha->parent->left == alpha) + nodeDir = LEFT; + else + nodeDir = RIGHT; + } + RR_rotate(alpha, nodeDir); +} + +template +void avl_tree::RL_rotate(binary_node *&alpha) { //alpha = x, pivot = y + alpha->left = RR_rotate(alpha->left, LEFT); + + DIRECTION nodeDir = LEFT; + if (alpha->parent != nullptr) { + if (alpha->parent->left == alpha) + nodeDir = LEFT; + else + nodeDir = RIGHT; + } + LL_rotate(alpha, nodeDir); +} + +template +avl_tree::~avl_tree() { + delete root; +} + +template +int avl_tree::node_height_difference(binary_node *leftNode, binary_node *rightNode) { + int leftDiff = -1; + int rightDiff = -1; + if (leftNode != nullptr) + leftDiff = leftNode->maxHeight; + if (rightNode != nullptr) + rightDiff = rightNode->maxHeight; + + return leftDiff - rightDiff; +} + +template +U &avl_tree::operator[](const T &pKey) { + binary_node *temp = root; + while (temp != nullptr) { + if (pKey == temp->key) { + return temp->data; + } else if (pKey < temp->key) { + temp = temp->left; + } else { + temp = temp->right; + } + } + + throw std::invalid_argument( + "Error in \"U &avl_tree::operator[](const T&)\" | Passed key cannot be found within tree."); +} + +template +avl_tree &avl_tree::insert(const T &pKey, const U &pValue) { + INSERT_OPERATION operation = INSERTED; + binary_node *curNode = unbalanced_insert_appending(pKey, pValue, operation); //O(lg n) + if (operation == MASKED) + return *this; + + binary_node *prev = nullptr; + while (curNode != nullptr) { //O(lg n) + curNode->maxHeight = std::max(node_height(curNode->left), node_height(curNode->right)) + 1; + if (balance_alpha(curNode)) { + curNode = prev; + continue; + } + + prev = curNode; + curNode = curNode->parent; + } + + ++nodeCount; + + return *this; +} + +template +binary_node * +avl_tree::unbalanced_insert_appending(const T &pKey, const U &pValue, INSERT_OPERATION &operation) { + binary_node *temp = root; + binary_node *y = nullptr; + int leftBranch = 0; + + while (temp != nullptr) { + y = temp; + if (pKey == temp->key) { + leftBranch = 0; + break; + } else if (pKey < temp->key) { + temp = temp->left; + leftBranch = -1; + } else { + temp = temp->right; + leftBranch = 1; + } + } + + operation = INSERTED; + if (leftBranch == 0) { + if (temp == nullptr) { + temp = new binary_node(); + root = temp; + temp->data = pValue; + } else { + temp->data += pValue; + operation = MASKED; + } + temp->key = pKey; + + return temp; + } else if (leftBranch == -1) { + y->emplace_left(pKey, pValue); + y->left->parent = y; + return y->left; + } else { + y->emplace_right(pKey, pValue); + y->right->parent = y; + return y->right; + } +} + +template +avl_tree &avl_tree::insert_overwriting(const T &pKey, const U &pValue) { + INSERT_OPERATION operation = INSERTED; + binary_node *curNode = unbalanced_insert_overwriting(pKey, pValue, operation); //O(lg n) + if (operation == MASKED) + return *this; + + binary_node *prev = nullptr; + while (curNode != nullptr) { //O(lg n) + curNode->maxHeight = std::max(node_height(curNode->left), node_height(curNode->right)) + 1; + if (balance_alpha(curNode)) { + curNode = prev; + continue; + } + + prev = curNode; + curNode = curNode->parent; + } + + ++nodeCount; + + return *this; +} + +template +binary_node * +avl_tree::unbalanced_insert_overwriting(const T &pKey, const U &pValue, INSERT_OPERATION &operation) { + binary_node *temp = root; + binary_node *y = nullptr; + int leftBranch = 0; + + while (temp != nullptr) { + y = temp; + if (pKey == temp->key) { + leftBranch = 0; + break; + } else if (pKey < temp->key) { + temp = temp->left; + leftBranch = -1; + } else { + temp = temp->right; + leftBranch = 1; + } + } + + operation = INSERTED; + if (leftBranch == 0) { + if (temp == nullptr) { + temp = new binary_node(); + root = temp; + temp->data = pValue; + } else { + temp->data = pValue; + operation = MASKED; + } + temp->key = pKey; + + return temp; + } else if (leftBranch == -1) { + y->emplace_left(pKey, pValue); + y->left->parent = y; + return y->left; + } else { + y->emplace_right(pKey, pValue); + y->right->parent = y; + return y->right; + } +} + +template +inline int avl_tree::node_height(binary_node *node) { + return (node == nullptr) ? -1 : node->maxHeight; +} + +template +bool avl_tree::is_balanced() { + return check_balance(root); +} + +template +bool avl_tree::check_balance(binary_node *&node) { + if (node != nullptr) { + if (check_balance(node->left) == false) + return false; + if (check_balance(node->right) == false) + return false; + + int balance = node_height_difference(node->left, node->right); + if (balance > 1) + return false; + else if (balance < -1) + return false; + + int nodeHeight = std::max(node_height(node->left), node_height(node->right)) + 1; + if (nodeHeight != node->maxHeight) + return false; + } + return true; +} + +template +avl_tree &avl_tree::delete_node(const T &pKey) { + if (nodeCount == 0) + throw std::invalid_argument( + "Error in \"avl_tree &avl_tree::delete_node(const T &)\" | avl tree is empty."); + + DIRECTION stitchDir = LEFT; + binary_node *place = find_place_of_from(root, pKey, stitchDir); //O(lg n) + binary_node *node = nullptr; + + if ((place->left == nullptr) || (place->right == nullptr)) { + binary_node *temp = place->left != nullptr ? place->left : place->right; + + // No child case + if (temp == nullptr) { + temp = place; + node = place->parent; + if (node != nullptr) { + if (stitchDir == LEFT) + node->left = nullptr; + else + node->right = nullptr; + } + if (place == root) + root = node; + place = nullptr; + } else { // One child case + place->key = temp->key; + place->data = temp->data; + place->left = temp->left; + place->right = temp->right; + place->maxHeight = std::max(node_height(place->left), node_height(place->right)) + 1; + if (temp->left != nullptr) + temp->left->parent = place; + if (temp->right != nullptr) + temp->right->parent = place; + node = place; + } + + nodeCount--; + temp->left = nullptr; + temp->right = nullptr; + temp->parent = nullptr; + delete temp; + + binary_node *prev = node; + while (node != nullptr) { + node->maxHeight = std::max(node_height(node->left), node_height(node->right)) + 1; + if (balance_alpha(node)) { + node = prev; + continue; + } + + prev = node; + node = node->parent; + } + + return *this; + } + + binary_node *successor = place->right; + while (successor->left != nullptr) + successor = successor->left; + + T succKey = successor->key; + U succData = successor->data; + + delete_node(succKey); + + place->key = succKey; + place->data = succData; + + return *this; +} + +template +binary_node *avl_tree::find_place_of_from(binary_node *&node, const T &pKey, DIRECTION &stitchDir) { + binary_node *temp = node; + while (temp != nullptr) { + if (pKey > temp->key) { + temp = temp->right; + stitchDir = RIGHT; + } else if (pKey < temp->key) { + temp = temp->left; + stitchDir = LEFT; + } else { + return temp; + } + } + throw std::invalid_argument( + "Error in \"binary_node *avl_tree::find_place_of_from(const T &pKey, DIRECTION &stitchDir)\" | Passed value cannot be found within tree."); +} + +template +avl_tree::avl_tree(const avl_tree &toCopy) { + if (toCopy.root != nullptr) { + root = new binary_node(); + root->copy_subtree(toCopy.root); + } + nodeCount = toCopy.nodeCount; +} + +template +avl_tree &avl_tree::operator=(const avl_tree &toAssign) { + if (this == &toAssign) + return *this; + + delete root; + root = nullptr; + + if (toAssign.root != nullptr) { + root = new binary_node(); + root->copy_subtree(toAssign.root); + } + nodeCount = toAssign.nodeCount; + return *this; +} + +template +void avl_tree::in_order_backbone(binary_node *&node) { + if (node != nullptr) { + in_order_backbone(node->left); + std::cout << node->key << std::endl; + in_order_backbone(node->right); + } +} + +template +void avl_tree::print_keys_level_order() { + int height = avl_tree::nodeCount; + for (int i = 0; i < height; ++i) { + print_console_current_level(avl_tree::root, i); + } +} + +template +void avl_tree::print_console_current_level(binary_node *&node, int level) { + if (node == nullptr) + return; + if (level == 1) { + std::cout << node->key << std::endl; + } else if (level > 1) { + print_console_current_level(node->left, level - 1); + print_console_current_level(node->right, level - 1); + } +} + +template +void avl_tree::archive_tree(std::string filename) { + std::ofstream outFile; + outFile.open(filename, std::ios::binary); + if (!outFile.is_open()) + throw std::invalid_argument( + "Error in \"void avl_tree_io::archive_tree(std::string filename)\" | Could not open " + filename); + + outFile << nodeCount << std::endl; + + cereal::JSONOutputArchive ar(outFile); + + int height = nodeCount; + for (int i = 0; i < height; ++i) { + archive_current_level(ar, root, i); + } +} + +template +void avl_tree::archive_current_level(cereal::JSONOutputArchive &archive, binary_node *&node, int level) { + if (node == nullptr) + return; + if (level == 1) { + archive(node->key, node->data); + } else if (level > 1) { + archive_current_level(archive, node->left, level - 1); + archive_current_level(archive, node->right, level - 1); + } +} + +template +void avl_tree::load_from_archive(std::string filename) { + std::ifstream inFile; + inFile.open(filename, std::ios::binary); + if (!inFile.is_open()) + throw std::invalid_argument( + "Error in \"void avl_tree::load_from_archive(std::string filename)\" | Could not open " + + filename); + + int totalNodes; + inFile >> totalNodes; + + if (totalNodes > 0) { + cereal::JSONInputArchive ar(inFile); + for (int i = 0; i < totalNodes; ++i) { + T inKey; + U inData; + ar(inKey, inData); + insert_overwriting(inKey, inData); + } + } +} + +template +avl_tree &avl_tree::clear() { + delete root; + root = nullptr; + nodeCount = 0; + return *this; +} + +#endif //INC_22S_FINAL_PROJ_AVL_TREE_H diff --git a/data/hashed-inverse-stemmed.txt b/data/hashed-inverse-stemmed.txt new file mode 100644 index 0000000..77e35e3 --- /dev/null +++ b/data/hashed-inverse-stemmed.txt @@ -0,0 +1,163510 @@ +3279398558 1398491839 +3958595898 513572867 +1365222051 119040163 +704063711 2369825681 +3784607930 3604167883 +4084435244 2367310132 +1322870706 51872850 +1174102376 3092679573 +548316255 548316239 +2090811220 2192617785 +2710058809 312595742 +832063481 832063465 +133318189 335250045 +2175243169 3150800480 +3607327075 4146477405 +3576984347 523038629 +2333276641 968718172 +2043340606 1445058746 +237715819 3105356660 +1602660233 2207749925 +1140036295 1490585497 +2815161089 795613661 +3027389811 2196761626 +2510273904 2662079197 +2542318715 120855972 +24070842 4231176925 +2196694048 885054739 +3666436443 2334481635 +262685591 1021470374 +2648875842 3452371189 +240056860 2723396113 +818460571 1992979684 +3792857294 3927650393 +2507274537 1802189710 +2532740022 1545465745 +1033815557 2188273478 +1796501184 1361729619 +3151221447 3427488819 +3071502702 2250928434 +1737751089 1056103216 +1144701216 5578698 +15195357 1241559010 +350975595 3451691545 +2871673597 1887925332 +2655470779 3845206642 +3053360707 445486118 +3401695320 4064248867 147966224 +1992712056 1917340141 +2522675409 3036972832 +1110587598 51342425 +147822847 4136867467 +560720049 560720033 +4250858538 1302471813 +223685743 3589934266 +2063371341 2063371357 +681677110 3464016010 +332891176 1682246379 +2485622301 1464946603 +698696245 3290904938 +2942371023 3954622054 +1695441078 1695441062 +1730951210 1730951226 +3847018821 2543449962 +1670669469 2919899497 +4137061111 2632363380 +4191312861 589733090 +180751108 4190328671 +3976931172 2358182505 +2641734416 4030482979 +3070385735 1606052288 +3629291278 2550385423 +2058661308 2624691205 +3342103721 1083418136 +3104246167 3709081776 +2593973346 2163497835 +2496995227 3867197714 +326025765 3160121402 +4040982852 4086522332 +297202011 3670302984 +3470974174 2085140680 +841205821 999567742 +541091200 1163905157 +2788837594 3406981435 +689452216 578639684 +366881776 1556032213 +2625778776 1002280096 +992057499 2042067528 +2641495491 2193770203 +89492398 4143790578 +3993427340 1719505335 +1121752286 2720452618 +2277951994 3085956253 +739293103 223422584 +546044013 546044029 +1990060122 345294269 +1863740736 541981651 +2185001984 87503891 +3863522654 3798526719 +2709475912 2205058909 +3461475928 586822811 +1441371341 196427442 +3574545873 939413510 +949038807 74331928 +857530354 1651845531 +3227621119 3634410366 +4268914386 1613827205 +4194706452 3068022632 +552962303 1041858130 +483869639 2707767153 +1738549928 1943523902 +3842150875 1577819090 +1583148503 1555906602 +842259022 2531899293 +4251465174 3238838257 +1063069338 748451786 +3497651393 4042240960 +2411591541 150664383 +542835037 395252656 +3490997302 3716863925 +1842810942 3765384973 +1660529394 691239779 +1588061645 3478045092 +659880661 992551840 +678787594 3136232877 +3554187093 3539352284 +3745379053 1535470354 +3816096984 3912671259 +2101419696 1731543027 +2828515180 3537223425 +3932879329 2109193232 +2798854288 1829483604 +2072074165 563941884 +2187494646 2187494630 +1859928578 3674580979 +1071439303 1071439319 +1079895495 449886281 +2859902342 3737555425 +767697980 2002612199 +3606511147 2446466484 +1824357571 1658564221 +3694815615 787747560 +1066606074 4103751382 +807514333 2718526434 +402841876 3767030384 +2072469317 3139107226 +2253752156 2855555247 +1055296309 1013488019 +1518954415 894318712 +613901727 961870152 +2540868082 1532739571 +3463132017 1673657062 +3609714344 3609714360 +2365043523 2365043539 +2076166812 1793848199 +1272065911 3537942598 +1556050010 1532878251 +544927731 3651942164 +1095224760 2080954555 +1706394986 1941291358 +2770598436 136948619 +3065090222 2284014393 +2533952003 37867581 +2823552010 4187866029 +930994293 930994277 +3822630836 1646866521 +1702030857 3169630254 +2823345699 229185820 +2180196195 3619691553 +1756150095 384284504 +3647828129 3897052534 +935233954 3338773162 +3508923006 3508922990 +2976501801 2671247820 +3239458970 2415598205 +2432555908 3282079967 +2146280959 4102633377 +815252739 2179670954 +301607963 1741909636 +1140070720 264976197 +1556972517 4134712526 +1861716976 2679196355 +1013494126 2261733423 +3071404618 1687439727 +2307330280 1738513707 +1914441826 70109763 +3600587666 3600587650 +3693978599 2611103730 +673649851 4035289714 +1399095376 2232971508 +2291212823 326674982 +740224089 4135530215 +235208847 1483692250 +3203163172 2988549311 +692153660 3646710001 +1507158076 2800948839 +326511393 3288720608 +1489620737 1584293425 +4151627829 3239358620 +1729990612 4132634943 +1682148117 3889892257 +300347853 300347869 +1279423493 295478220 +586823071 2934073694 +3595364099 1578084796 +620893908 373944249 +203076274 1099719267 +2188015613 1251664724 +3851486218 2466119372 +948458022 1952175462 +1568863833 2385104392 +4104650552 1551287597 +890702079 2453875048 +97665281 721179798 +537922310 283605610 +725111004 114674416 +2827738072 741020941 +2512310710 245420691 +3771620034 2799230837 +2229823857 3782549014 +2363563174 2363563190 +1832849269 1866814762 +2703309802 2703309818 +118355023 508441076 +1782258582 2838065798 +2982938775 2066843046 +3586950803 1711889511 +1260970606 4269419945 +3121021482 50882573 +1572051526 1572051542 +2368027543 2128174850 +1069159806 3488601439 +497781686 207425921 +3359862131 3039120410 +3252264114 3683757093 +4147432339 4191261184 +2992495973 2546722973 +2025244012 3399533114 +2452724802 808266574 +3571271891 3948520492 +2011008126 2019858221 +2046329820 3338795231 +1872388552 233390049 +3068332684 1936300641 +393845936 860029193 +974552923 974552907 +388551711 388551695 +2276597482 2271652429 +4051174328 2557427269 +358663409 358663393 +3530003182 655117497 +3136820162 377952867 +2912070812 2912070796 +2981412855 621695357 +2676747734 979592114 +158648273 3017182736 +1214729679 1041336346 +741040325 1296651788 +3437650098 1696401438 +3480419484 771991943 +671103157 2908308732 +2259599846 1400311285 +2144409789 2144409773 +654674848 230345971 +1370173688 1266503044 +1792910411 2246681108 +741321532 312463079 +2156069265 3745216336 +1212370991 1295008123 +2493556496 950152555 +1727703823 1651457265 +4077521942 2932934318 +1762742161 1351759688 +1649105337 3174297663 +2966974593 1998353592 +2856198150 2664042819 +3834205390 2452652111 +2872729544 2015793829 +3486405277 3201043755 +3277147044 591794985 +141831258 2105344543 +1868971976 4282382491 +650881097 1536813823 +1032782153 824116711 +1261474981 3042734420 +3592276344 3220774009 +1667876232 4002733236 +3893557708 2402323386 +2816655909 3562439139 +206445326 2506561753 +1190272524 213617780 +2107344163 3738342922 +2297778542 4157402075 +3404031058 2252790615 +945192134 1982229409 +343080376 2156120133 +2865292816 2865292800 +301460854 3209351374 +1094484760 863714468 +3351919320 491289716 +2045358487 2179109030 +3103300248 3094104026 +896875632 2542675011 +378773567 845723626 +3369332717 4292432091 +613457099 1520882562 +4084002917 2575199980 +2753875426 33169661 +261235520 3272441299 +860314312 2169759965 +659252387 2125425820 +2997768881 1263159617 +2268184694 1230109137 +106175750 106175766 +3985764073 3985764089 +3421836084 1309909919 +517407617 517407633 +337405111 3054665012 +2958074909 443919251 +498605868 4107866689 +1673771922 1389329965 +188709978 250659243 +2989195980 945610483 +3656406946 3076125717 +2290790708 2939148116 +2374883302 3159023361 +4013364181 498375789 +666090537 1771512064 +1310721830 3919675468 +2065018799 3321515897 +611791482 3785651715 +2438695076 1998068287 +307393184 2009756133 +1845964649 2656019015 +340522404 1602866885 +2244654556 2340907655 +3291860288 548543443 +194786596 4247932190 +3686863153 569249840 +2008677715 27813603 +3265283303 1229748128 +993445988 3401569359 +3243564050 3243564034 +404604607 3051347646 +3404332009 64739038 +2210830203 3969939108 +666799964 3975917009 +4068964708 792991849 +202405414 1616550247 +1134720260 2825773551 +3045958058 3090936045 +43489650 1798455053 +2253008440 2663825979 +4244677801 4043519502 +2516014272 3562695237 +1457531027 2607593239 +1459555862 2549546305 +403993500 1500922767 +3792026543 3693697260 +361868248 3427894541 +2131936012 1522381623 +2258578291 657148917 +2902101410 3857994241 +242368843 194976749 +1692304338 3122573950 +1803154391 133880678 +181629398 3772527601 +182478600 658649483 +3776248792 809272730 +772663495 3677439940 +2495344560 633984462 2444177615 +729931842 3212052451 +2480486159 3295848538 +3682696500 3235387609 +1122135789 3708128111 +114165403 2219677309 +1129748704 3780290725 +4102666754 2888186397 +330317803 3916734178 +2315966880 1114212973 +2954426312 4283305949 +399321905 3250172625 +1918884176 1558386915 +260431434 3167509966 +3875530300 3875530284 +345454763 353252660 +2272916786 2855209374 +3199602572 3298457975 +3936201971 4032519309 +511572222 894448671 +495834020 709110591 +3128150774 2051572039 +2323198004 818340313 +281471922 3998055259 +2886243079 3632231424 +3988642841 1524726622 +797473413 1490607962 +2523150133 1936721491 +373653769 409608504 +279820473 2344284830 +440835179 3895983513 +2713313514 2174554189 +3323409488 2618465451 +1523953117 3680547554 +2951900840 1780133980 +1971822924 1595366263 +1824157656 1567934805 +2099795041 2676152966 +2540252873 596944504 +2694717544 1089274795 +2588088459 1654629058 +1979355529 1114839736 +1660944300 628688051 +3852526752 474474483 +4205620949 315567980 +3874526214 2461599095 +4054841944 3490125965 +4084321185 2499363782 +4074620334 2777085274 +3476330775 1187839792 +1827909219 2443236213 +2509359355 1870619442 +346080584 3239481437 +1689711253 553640092 +2824193823 256993738 +463880929 1740326966 +3146973059 1897217894 +2237727074 1505045827 +3741857020 848678567 +2303005111 3468354320 +1727435158 2888249127 +396667121 691401574 +2792393025 1143476544 +1363149330 4190323269 +2222590844 136320039 +3770937999 1668732686 +4040730882 655494691 +2757154343 2757154359 +2441107313 1328659478 +2884318998 3108485041 +155341870 3244983417 +2451774128 3256769460 +2548635563 3471852084 +367594630 64927479 +3542419990 2653660897 +2582544807 4185266678 +2997339943 2399616306 +581263167 581263151 +456197688 103598651 +172097924 2850579145 +2217900651 2255926900 +3212384787 2088517901 +866894508 1659956467 +4098226382 1478929497 +1693023057 2821337846 +3792375370 560430701 +2636540512 2113929815 +843250314 843250330 +1470280170 3743290189 +3276024843 1867601218 +3376589573 3376589589 +2531143687 2261097238 +2223637257 2223637273 +131128755 13435077 +691153080 691153064 +2699224367 2997493135 +1469829333 3209281354 +895037751 3152569877 +2834302343 2834302359 +1308103613 1688347317 +3168170961 379081222 +877956882 2315337133 +3128576493 2151496772 +3629542014 2016264585 +4049932696 40380000 +1716682788 937408681 +3159268091 1790834994 +84618829 1033495332 +3222835765 2611882346 +1052904768 3613914893 +4048859385 3780286462 +3415905091 850042962 +3881674375 3211601536 +2933354445 170196900 +3884009916 279108721 +3233774689 3463498934 +165955296 1918603941 +1860075698 976352150 +316856046 2836945071 +1274510706 144341619 +2115678203 2115678187 +3272525868 1011162455 +2955034554 2833171075 +529720673 676483984 +3344233398 2159781777 +2476761074 2942614638 +352934721 1589290816 +3178988127 2911352586 +1459824045 2801028946 +4274870419 2957143930 +3844024935 1842049636 +391131469 4037668 +3335919780 467025551 +14003403 2861736430 +3741078548 1387790185 +3823161138 2706819789 +3879053515 3725131246 +526094828 1227273879 +3067542813 2658387774 +1102785571 2628156188 +1596079753 3653358239 +486225594 486225578 +3858396265 3858396281 +369850392 3423473101 +1897933335 748831270 +1247647083 3287396633 +2579265515 4004562676 +3753974648 3036560877 +2975617114 2387770795 +2112894869 3592912778 +3149079327 2852885954 +4050283006 4014093065 +2778323466 3140631981 +679955912 3601164332 +3967808270 3070594969 +1173563768 2513061869 +1702540626 304836613 +3634314080 1655339045 +938532749 2637163250 +1502926246 2873906241 +168168777 168168793 +855961623 2359256962 +1110782349 3334275300 +1052045545 1842863694 +216490680 138438587 +527091115 3042219471 538258484 +1439711062 1825813607 +2589217959 2579579638 +1386683059 3490645978 +3246714125 2073519218 +2549447382 249914807 +4058784449 1011844509 +4085632549 3144230730 +2947159009 1774013216 +322802808 3253778683 +2737828307 1225087583 +3681373715 580444042 +3797028274 2759985236 +3093955722 2730069413 +694341193 1055249915 +3823479843 1988249284 +2423371796 1996801903 +2920862975 269962600 +1196758095 2582575182 +2713337372 3291799460 +1103715000 3724279755 +3382906688 145081055 +296393202 3247462387 +2333912409 1462035230 +160061378 160061394 +4262846004 4262845988 +935169560 3613831117 +3162373982 3162373966 +485429443 3801141936 +3341820097 1801696333 +3965492854 2345497553 +2493673062 1639172737 +2998101267 1225322071 +3845789380 3979651993 +3229103185 178469271 +2569586550 2068825167 +1117101812 1102685378 +401945214 889093215 +4081746197 323564572 +4241303110 703469201 +3182359519 2036983816 +2837698462 2837698446 +3677493405 1300297065 +3789924614 2726892663 +1317907117 1443081810 +2816168977 2816168961 +2001206620 575920071 +2250462483 1017048300 +400965020 997391495 +3444006488 501146272 +890964617 579966382 +1333981855 3391352926 +2269991379 1318815106 +2678667959 3318894914 +2886725717 840390090 +682096254 67250278 +2889435608 4130291483 +1058840024 4067914770 +46860979 1432116197 +663469166 561229652 +3528443803 2929146116 +2634382696 2544134827 +1234993150 3747445961 +900407401 900407417 +3761035443 2551198775 +4142081806 2539511570 +978731504 766340367 +2195447502 406254674 +3076261888 2782959621 +561661797 2220153644 +241659435 3620892084 +645168393 2455819566 +3413035486 38689449 +280519280 3259168341 +837646334 2530469065 +2348518377 1174224846 +95963226 1528423851 +1645141038 2338626671 +2511986350 1637452783 +2269405812 1688665241 +1238942172 473509201 +3464278884 1917740649 +682918551 577994243 +1613609609 4043089336 +3667613612 3465216983 +3434159866 886293387 +2943657275 2634803176 +3785580910 2721210415 +1588970756 472196447 +1591488485 966747507 +2331113909 1877743612 +3503971890 3906522270 +3173946131 3310839168 +1199620366 1372458627 +1934402433 44393494 +3993494627 3993494643 +3722492602 3722492586 +1634767069 2263790786 +1608719805 1748250193 +3351414758 616916799 +2609983745 3686436979 +2736910826 3094336347 +4265190199 1807478672 +3784012489 3044533049 +3200253270 2654719601 +550020837 2162080364 +3436683872 100145568 +2758204626 2683149957 +1159300768 1407221627 +3681982440 752412181 +279118328 1522271877 +2872686642 3185374899 +436835348 490663668 +2697658912 1066686565 +3325048550 3823528961 +4138162136 560941325 +995633355 3509550584 +3585141677 3585141693 +3256593906 1748920798 +2453447285 1999917322 +713303219 2358118391 +2658068712 1352181035 +2199122492 2199122476 +950888015 2281180750 +858607720 2880934531 +1288492699 3498043464 +1867156132 3596107817 +690131181 690131197 +2565910591 31814462 +1462487992 4059148973 +204550545 1508797674 +2141535137 2451365472 +3250398715 4156738084 +4004762247 1210297792 +3788916152 3788916136 +3886684865 4094097392 +841344536 162084813 +789102973 557485795 +2674516829 2459892376 +4233284034 1521876536 +2706258263 3424057616 +2692873957 3214190090 +3540999126 388862439 +425414509 425414525 +55378752 1916542419 +3237447844 5653796 +411232694 1276504465 +948828405 4236175804 +3118970347 2462277876 +2418691403 2863931919 +135976414 2688461929 +3412335590 3758561891 +1296505030 1827405758 +4279625111 645426352 +3574389673 1545288447 +1024107880 2143445693 +2940375363 1479421949 +1522768956 502198893 +1313267018 2207144813 +4031642427 4137038085 +528349341 810442530 +947077936 225625237 +3368283982 2030216405 +1602527048 2781265483 +1391991783 2207509686 +1776655215 594784174 +1913175345 476442318 +955668990 820641055 +594555407 3634285966 +1224184571 1224184555 +138171690 78179731 +1609899424 3295902441 +112507592 2502641520 +2707053837 239106930 +3435346837 3517146547 +1173372367 3895545048 +550027932 3377341777 +3102840551 3666232454 +407039593 2589806414 +3949334615 1062481890 +2847102788 3584896569 +4152506807 1493228294 +4160099866 4289425397 +2450694519 1783901766 +1950847510 581630119 +3368595369 3169617688 +3708524329 1188473605 +1729590022 1340740215 +808345163 3179966328 +46619375 1341663788 +623404817 2409250768 +3733258409 4099934744 +290377832 2802979755 +93201051 1505786372 +2185315134 1253890697 +2738078788 2738078804 +4009237063 4009237079 +1781940118 3378911537 +1145666376 1145666392 +1231166029 1667291899 +917728390 3009111761 +1231434882 233089187 +2429555443 3935163546 +1037175306 1537592749 +3971701010 3971700994 +3481635996 1262246296 +2594217822 3369787625 +3670488130 2845262837 +1510971312 1988872707 +2628225665 3900149476 +313061402 3807042037 +3168431995 3336404658 +3407602874 1994985675 +3926921048 2827710760 +4077302776 1336502604 +2354040612 2293963033 +1948765499 2436675333 +2004810462 1969141993 +1322297950 3332654978 +1468909606 4197585879 +1452633439 191594407 +1854567441 351581894 +3545541969 4283225744 +3451123870 3451123854 +2928910096 4058268628 +1653872154 1226754795 +1639196786 672065037 +2416834082 3891951509 +2924167871 528093886 +571842486 2506574802 +3528005888 152197893 +2182831273 2048056856 +2773592722 496819908 +343442026 2746567899 +2971882438 2971882454 +2494249020 3967724067 +2353758933 637281146 +864124023 1935325940 +767315324 366396614 +4037628165 3750398668 +2777677936 4264863858 +3375074206 1301072297 +898056688 871156949 +1448876865 872343360 +1253108156 2926278563 +1582947036 3957303908 +1037363749 2066520122 +4109759799 3207315874 +106259296 834839712 +3713650976 3713650992 +3253833701 876971372 +2195113529 2195113513 +2142880419 3027068554 +151964884 1173671342 +1678323984 1678323968 +957532478 957532462 +3975275385 2812848251 +2540682197 971288650 +3132960272 2158726269 +3659227398 1595522167 +2815789113 1458469167 +1740641260 1063214231 +997298185 2630204974 +3298921163 3640437180 +2664762689 408700800 +1441732282 1441732266 +2773076877 3224071922 +4183414492 1684880465 +4083763344 1326134888 +1176885398 60027953 +1859143136 1373503397 +363472416 2723663768 +2287986530 553212005 +458126358 3302489368 +4001761742 1258385231 +1486630321 1781996630 +3347859843 108891825 +3936261846 3936261830 +2414488612 2980281513 +115313594 2347300299 +443788335 353298753 +2042570137 1088958430 +3063108284 2723316327 +341363757 666723843 +2729859558 2561625410 +1228438143 3270039016 +482755053 2737504018 +1572309300 2937194889 +4273088312 712228155 +3793931789 3758408763 +4018579500 4018579516 +706957612 2174273623 +197700023 1138961158 +2897445481 1201032024 +382921874 382921858 +646462624 646462640 +1768842362 3156038997 +1493680292 940678925 +3295923883 3327346382 +1932223523 1884201738 +2085973691 1971146866 +1083231440 1083231424 +3200763892 975390281 +2715062157 1318976228 +1211866302 2074205641 +1755188613 902776908 +250743475 973526988 +3270348880 737816053 +1830757598 1539386318 +1160025705 1100531544 +1731096767 1731096751 +3387029305 129511102 +697199852 3173659654 +3907950795 1415134890 +1370856281 4192439560 +3175710280 1118948189 +817709088 1936626924 +1053784550 3332171031 +2876546156 1418870273 +1121692602 4191114699 +2999846719 3589328641 +1823219620 771038616 +3890590349 3865537614 +2318599117 1935032206 +2529773132 2859435736 +1514857251 1189318666 +815028823 815028807 +4020490532 1658993599 +2440576158 3849333357 +2590603270 1904287313 +2464343710 3643869865 +511167545 798391720 +3130195316 694484377 +538748906 3701104197 +2134431329 2809756342 +3228375063 2137509762 +3638227972 3058356424 +4208614044 2176623495 +1935928558 2070527835 +3640404167 3342760345 +189724820 2232938689 +1558565049 4140274472 +1178328933 4114656243 +1961200391 1961200407 +3864138761 2620754488 +3782314916 2310984489 +1120396979 3551538124 +3633496488 2533809021 +3291733104 3511680373 +2889001303 1791005680 +3097214524 3643570279 +3532968691 1934103692 +4076343353 3045165480 +2246891930 1843039595 +2082640663 4017439380 +231338682 1677012373 +2789561535 2116315304 +2428140619 2135187565 +3538161352 3305325789 +2514915877 13828460 +152501902 3793418996 +4197577705 4197577721 +1024638233 771718654 +1058845368 304961467 +3504167366 1142830599 +3952890357 2180227337 +2867343928 2056999123 +1732940585 3278219662 +3999474308 3390002633 +2580729288 3726098165 +1785415746 3370303477 +4145632867 1608711626 +63621529 1960598955 +172374271 4109688490 +260053647 4121546510 +2174615648 1807390515 +4151846404 2320400452 +3643368826 3366552426 +335160536 3319272549 +3034845770 3034845786 +2289382590 2390886175 +988571289 988571273 +973755461 2739054746 +2663704504 2818098861 +216286407 307774806 +2352998426 3533880443 +4261687651 4261687667 +647926449 2090921136 +2813340620 1754974620 +1974570887 2610833861 +3687103081 4065887182 +3998179681 3350805940 +3010369737 1472100665 +3730333107 3088810202 +964839164 1462607939 +2677170239 1941037569 +3412228921 2720181173 +3980485685 2183603576 +2539852319 1878361800 +3812520231 3796639840 +2206025636 2206025652 +2513456312 2397619629 +1715784960 1458181791 +3319491580 1953168807 +1897464640 1247813061 +105585598 3498243273 +3556989404 2638640465 +2866847183 3987316455 +527454124 2405474496 +2880255730 867008243 +3019728011 2911001527 +2396827070 2982993655 +1003743274 1486256667 +4286474612 2818572697 +1276596923 1276596907 +3427773940 3246284398 +3913312601 2305152776 +950430926 4273525849 +3281919498 4226369979 +100571705 2019455006 +2950530095 628501691 +1634373517 3888118500 +4190770424 3234910611 +1873108204 4028838045 +498620987 70650610 +3385390522 1633342429 +3822052593 630446199 +2291954510 1548321753 +4147383611 303927294 +3565913257 3435395096 +793438314 2775050798 +315528164 84020368 +3275630812 486760280 +3201340147 834873827 +3315933213 1262614018 +3514134683 947368997 +4027583891 221488128 +3220039832 2140986931 +3481434734 2562239225 +4225912696 4249033211 +3697870656 3697870672 +88398978 2335065509 +2278424964 1296851657 +955709374 1791492105 +1234189067 1234189083 +213842083 1520393199 +3691063903 4164647265 +3042109422 731879591 +737125504 3930521495 +3433172328 3098220419 +2284168895 3005102330 +695556254 244883099 +1757855119 2145150990 +2207886429 4279942733 +2496233406 939322018 +1236595395 3561424975 +1990899023 705298904 +205069487 1769349612 +1363739343 3639000767 +1880251611 376210698 +2659648484 1921720297 +2408287285 766359402 +2465202804 448978534 +584990820 1695824741 +1534948663 1606369716 +914039347 3669521997 +2348033801 2748477471 +3312577394 3312577378 +1390560254 2016479433 +1856347069 3954453122 +3394909414 1912686081 +456818329 1981106910 +2438803013 447731354 +3189223791 598027073 +4039590509 3788627173 +3346938315 3602184852 +2960942734 1641378201 +2469949752 3773958720 +224699329 3597519040 +78798823 1156317177 +1385610085 1749614586 +2130950604 300745726 +2815789109 1666431123 +3322044873 2126507879 +3016372957 3830321652 +3192904635 1387718514 +4025683459 4025683475 +325729585 3657467828 +1518844299 245962178 +3459250078 2719197506 +3627753404 3917757638 +779217947 945204868 +2773460674 1940709179 +299567384 600782731 +1989544043 671784469 +4242424747 1250460735 +4041294640 1260116208 +3852424325 2125137066 +2664818650 2664818634 +2561343467 1076944610 +86654327 2558444102 +3957741407 1255871499 +1736030952 1590706453 +3091567188 1770347055 +2345290057 1483824632 +2888561734 1328646689 +2851357455 2592444568 +184963090 1827671109 +72299837 95473410 +1859957869 945547972 +2396197138 4124610477 +2744065998 420921181 +413859201 31431949 +1895294120 2117923965 +435797029 2238488892 +648047974 881604510 +243283790 836184297 +33484842 1314132507 +1542882311 3423721216 +2593585965 2293065668 +498935463 3379675213 +3766821644 2106993633 +1508577004 2030599553 +2538114464 3342267109 +316841953 2613161782 +2794320229 2524119532 +3242834540 252386552 +547391971 99016007 +1369660007 3945222185 +1517652598 3708352455 +2135239424 1508028677 +3991401229 1789238465 +648387363 4189272092 +4006462354 951898423 +2482172385 3362964768 +3465403575 3465403559 +866413225 4107528206 +3155129015 405014114 +3062990829 3097372577 +453726486 3594894066 +3635184030 3596304762 +2378803500 1618300993 +1359200064 53342943 +323440365 3574801883 +3851517151 340204245 +3613240303 4151683384 +2614759903 927605256 +2175157696 352843492 +299040149 2753900956 +1237003104 204509740 +3291521882 1233118577 +2010916998 1319666385 +2244568099 2244568115 +2728479382 2582145585 +1126019340 4248757011 +187494851 3662804349 +2316473014 289207431 +1892280837 2463851980 +793742473 430042756 +2816429485 4052174660 +943049500 2561588487 +1834539438 3179953209 +2980657905 2980657889 +4103540827 1691270994 +2722384715 2722384731 +3727639698 3727996281 +433536773 3674028078 +1874215777 2163976870 +1719989241 1237237704 +3142778610 1231937691 +754520851 3742959340 +4024851858 967134405 +2274836210 4023706846 +1735083237 211704842 +1811142388 1583050079 +207470918 3180806433 +310782987 310783003 +2390273018 1650960597 +2754204593 1650264759 +3554338327 1738362260 +2265067891 3814529782 +1821614293 1683608607 +3628070906 1723031197 +1002081052 2768660483 +3031769490 1758210494 +3967201957 741347225 +1087668065 1870955936 +760145327 36934264 +1321960849 2119944023 +1724228103 730155886 +351319890 1223726611 +2690748455 2694180192 +3402972771 2964403676 +3636879567 2814169597 +996884108 3607463900 +1181219774 2669335753 +1838796959 673409608 +543471613 1106772213 +623973972 2109706791 +2900906091 2629212276 +2246181753 1543414243 +1957397468 858834508 +356285162 1021201850 +2101290072 2187736717 +2197611695 3810262904 +193799476 250708 +2085973693 2773124040 +194583381 2533754570 +1272784779 4163190740 +1009027123 3766642778 +2703597351 423731640 +1534036200 4140174032 +1571395011 888586748 +2534942225 3959680198 +1613293631 1373879191 +3885580223 1430215080 +1386244980 2257135503 +559515741 1717489076 +3031047100 600418535 +1487629018 1876505890 +1349188813 4144107474 +414389153 2299513798 +3442314292 850638287 +351506626 351506642 +4083362299 4083362283 +1447182534 3101414065 +1653963711 4031892926 +2698591311 2230972494 +2784620925 3312920514 +1233832047 1397691308 +2553888050 3558561189 +2988881827 368252298 +965014281 2504693560 +2417546907 304956946 +1309560606 3972974399 +3873501032 942262676 +469754502 468962503 +498752684 1072821696 +3309452710 759630913 +2848814104 1718469069 +3124230115 2916931716 +1452526518 11120519 +4068341578 1628939862 +1422657694 2382814399 +1873016180 857433497 +2823697290 2098930221 +1503514992 2205201219 +1263641898 1263641914 +3019933362 790067517 +2594697279 3066494570 +1782029241 4002030632 +590970903 1025768969 +1332948792 1246975291 +3281155084 2943831072 +3042827365 3042827381 +298899454 163841247 +1557074784 2046525491 +3391013049 3882443560 +1133236050 2803326483 +58700128 3791927859 +117157895 87431958 +3902664576 2963277452 +2221209084 3255932332 +3523245087 1293374625 +857729317 1954296833 +3901635641 1357434295 +3532578895 3320519761 +2236596206 2282302585 +2959832427 1641950094 +1374608599 1374608583 +2185649334 993051370 +2122028033 495582614 +3551373713 1898687264 +739304271 2598295948 +2904079565 1257322162 +3340813615 2811652344 +661945728 2623639699 +3722155555 2126124503 +2721354795 595806296 +288939560 3682743875 +3435095043 3989032253 +1325332917 3397313287 +1725157075 1725157059 +389044376 421230427 +61114943 4211450152 +41746447 3429508172 +1459295390 4144679102 4144679081 +3722757951 3722757935 +1779741966 3823302297 +1775494968 3499425069 +886934426 3535979389 +1338955375 295407790 +1495428249 981610888 +3684234330 197700029 +3763548530 3355344486 +146457739 1224959700 +2966227610 2563796985 +2542245409 2542245425 +1198924655 3206400066 +2232280270 1121923151 +1121923151 2488863832 +141191366 92467105 +3866248508 1767176423 +3022177434 750485099 +399981541 3513526144 +2179049851 4047359154 +1727970977 1727970993 +3079772821 2402703491 +2596770952 2596770968 +679948796 3369316263 +3161802644 3026116329 +991751664 3247360392 +1430826192 3687450940 +2046014575 1772423864 +1349479566 1349479582 +1182913969 2942526886 +561467593 285339961 +3936134537 3717764782 +1848565559 2865324934 +1420431673 1634221854 +2916726649 4205973743 +1990943092 1137338767 +547111340 3494957628 +3977459616 2695111581 +4274352717 1574104891 +1842682197 4190735299 +2342756269 2140429636 +2158242868 2980569172 +3723536375 1490577862 +2597989698 2693922634 +853343917 642835227 +1578076638 2052963393 +2169864844 2724286868 +2061433550 990171737 +3173074621 2019711892 +1668475617 1860681760 +3356452404 608035801 +4287505429 4020815546 +4176098999 2410947078 +3745209769 2924345624 +3268329415 1920460374 +4279097285 4279097301 +4199948696 2912346701 +3853803814 3237277406 +462027664 3929473955 +1603904263 3099798547 2245764096 +3032380725 3032380709 +525476358 1414238071 +619223423 4282150970 +2420205527 1409285507 +3194760576 1145806981 +469231153 943677232 +1093221607 2062213024 +1759712234 125327693 +1635803680 2383373208 +2225628632 2904052493 +3575152484 587648868 +1228954790 4132559169 +1146672758 2425369589 +4282326208 2421834323 +1286674053 1069970252 +3877201943 3388176307 +3138094393 2887956648 +3942191862 3692616017 +3798625421 4203274738 +160295007 1768213896 +708874845 284581992 +385123245 3488303428 +1615876798 1550991647 +3564659134 876552354 +1193544411 3724125413 +602890378 224646174 +226485578 2320888699 +2894757060 3536490415 +213724277 313587226 +3238163897 2413777448 +2829080527 1131035342 +3015334351 3176882382 +3659874300 1688451495 +3294784922 313866691 +3020819134 2302043102 +717331089 717331073 +3551232130 586923380 +92286486 4239747809 +2302512683 626383019 +2389842545 2929696752 +622775084 2608453207 +2276592571 1481144164 +3876963917 3225960187 +902169958 213548951 +1710865258 110255557 +2721356480 4215447883 +3220224607 2702879073 +2291024453 2339899498 +3406277089 2115005750 +353168377 475494632 +573550267 3779710312 +4150704514 4172679075 +1825221610 755802445 +2511831646 3195326007 +4100740050 2969858157 +355221618 3332993893 +635624888 1545799867 +3661436323 824774538 +2025944816 623758767 +1451139067 609605682 +416865568 1596037775 +1093632000 1685817292 +4107390646 2627417354 +3109009741 858486728 +3328268048 1530662435 +3813558095 591020376 +134113683 679490156 +2351578656 3761160955 +1626002115 438312138 +890873681 3974890761 +1041379712 916712595 +3255258892 428416277 +1467960052 1473642847 +2783389588 2747711288 +2512275394 3744474754 +821644830 1787857437 +2265917026 4275661891 +2393102026 1441472493 +459316913 3433264470 +3754182615 419239792 +2039843095 2103889721 +1426164843 2556664462 +851144574 3120483977 +456256226 736125110 +1123831928 3809592331 +2229647297 4137698496 +2603430964 2083073487 +2507255474 2708922910 +1148907911 2509594259 +1640785576 1640785592 +4255607580 2803036406 +2016170263 3371997674 +662276499 2437260822 +2480874034 4198683813 +1832130204 2231342983 +1619919266 2710344213 +433130253 433130269 +3454310983 500634962 +3282415581 3055639595 +906382271 355209084 +2380463163 2380463147 +1937062530 1133189813 +715256368 1928965941 +512405917 2975177250 +1318687518 1318687502 +332504199 332504215 +3423035093 77220170 +678949168 3838881429 +2808079884 2281120993 +1855102257 4260664525 +995169869 2913344306 +4147282968 4147282952 +2102052522 3433855763 +1693206012 3690081208 +1585524777 3999191182 +1935498727 2197476022 +893584735 931230878 +4280853644 338571425 +4134538026 3365573509 +4051557875 472147354 +820251720 3424323547 +2085806736 1182443701 +1419924468 4018057823 +4239541506 3466764853 +2264711360 3557199967 +3409247394 2607074749 +3453716127 322970396 +4189932397 1685051858 +1284634051 1284634067 +3823909243 1781863182 +3380092866 3927572085 +3848255800 3193074564 +2459179149 1277339122 +74580437 3293330042 +32703579 1821367108 +3395189172 3395189156 +271870954 834781778 +4054530661 665222307 +925999758 1898112409 +3788702234 2569817854 +466054220 2415895731 +1141559164 2567217191 +1283319243 892386964 +938255750 3277274025 +11497929 2697034286 +3591076651 3610213461 +698229008 280834351 +378967770 1762621757 +3227674438 306926866 +3427665187 3823915873 +3782808626 597346981 +352236747 3623263124 +67003230 2809556223 +1090604876 404018080 +4009936520 3378415645 +1783510300 2873783308 +2221600514 857307485 +2366460778 2366460794 +3572112459 382215529 +772627850 151666747 +2582339184 3179653717 +685348180 3406380370 +2321107988 3734160239 +2451324522 1226119078 +3660982513 4011181175 +948093724 299443463 +2985316887 2985316871 +3752855928 2585716717 +924479332 3870643032 580737641 +745160539 745160523 +2881553233 3651956132 +2954505942 255310577 +2823523521 2951648214 +1000129010 3385151461 +2424961236 1563604399 +3511050257 2831648160 +1010222307 2906124636 +3879599988 2056856473 +298921882 298921866 +1473428236 1287418871 +286387146 1200161478 +3397269233 3048242544 +2489117799 386070846 +626824773 4181617136 +1449619855 3567890892 +2851313487 3648467278 +3151212143 3100730207 +3446856531 3201254316 +2171400843 1233244372 +612258226 924995917 +551316078 2801535002 +1489812768 3930962277 +1204658031 623854266 +3633056090 1047705789 +3371059269 3527355715 +1468955760 1162732611 +2721049917 2389866242 +2053585396 4070329839 +181599028 1042379471 +3732142441 171922546 +3300741654 3685538789 +599762515 2575613862 +3345229375 3021675691 +3385120123 2919909983 +4279032061 2117703234 +1810013710 3788867450 +550851651 1502952038 +3394934677 2588891571 +1537641307 1537641291 +3402894045 684530146 +3172121515 2355684203 +407921146 1082801309 +3715671002 2129260578 +1169225574 462779799 +708963109 2865048364 +3229689384 860819691 +1831142885 609498419 +2977884485 2949199756 +497938737 1017859009 +923275415 951197104 +2978240417 1213388146 +3840057573 2602703782 +1611047980 1450471745 +4031817917 3586178639 +169456157 279304194 +2075258851 487823046 +352499637 3360109052 +4212319420 2973331313 +92779329 4120850240 +2332427302 2332427318 +4189189774 2703696281 +2317373040 1897783849 +3908972809 529411595 +982806065 1755936560 +1893097260 3447181889 +546346630 3382506743 +3593721133 1620612562 +1825311424 87354451 +2300007330 145783979 +2886425123 4175357212 +1508771377 3266559792 +2081803553 2001857248 +1864884201 3838147534 +2779630362 3935746557 +435347333 1582685772 +3095270973 1195302095 +739456430 272466169 +2960616396 2550051383 +3391916564 792339816 +4073964316 1599874321 +3663901830 4002410183 +285570455 1057154922 +1008464513 118093232 +3485020347 3713890459 +3893393515 3169685602 +3305408965 3305408981 +4130322124 1967603668 +3476742208 3388634520 +3144019116 3841819835 2602299832 +2914255708 3022468113 +42980389 761984556 +163852280 1473741691 +1968168314 3967541998 +235439782 3177969495 +2897008918 3927555495 +1476759441 566296912 +4246513315 387601052 +1240993193 444432664 +4087906001 3168832791 +1794230683 1329548339 +3038450746 4046646037 +2039260878 644519494 +3566548687 1760562714 +1265089506 2521613525 +912624285 1054422324 +1853897863 2061453440 +553933660 1440469447 +4105643934 3662896553 +2673086284 3495722931 +195786239 2667294536 +360185755 37599560 +2755010165 4130468387 +1673511388 427356236 +302291043 3225150410 +2762063992 2728525051 +3659279762 3882500141 +2698527133 474444471 +1182799026 2912982053 +687410958 2652032041 +2984336122 2984336106 +1375091626 2963270811 +3430080330 584417659 +1744418651 152806468 +2337607861 199838972 +2552262683 2517662354 +2487685398 443975137 +1118335127 1118335111 +1294341800 3988480725 +1512038866 357936749 +2410357736 958288387 +1384970926 2716770287 +1214329829 3590631802 1214329845 +1269071185 1693533840 +34897208 3984856019 +2771199173 3314806525 +2888489579 1920325218 +223435781 2906855466 +3309059443 4040473605 +598748677 861434330 +3298422015 1097727109 +3323613991 40953440 +2524427781 2524427797 +1213710615 4179949360 +3613559668 1736572233 3277750651 +132916791 2948606086 +1197832414 2398381823 +629914592 4210606515 +3731776660 3150468345 +1459144431 2862548881 +500627719 3001517287 +3659208190 275951458 +4228948632 511645008 +3959385182 3776419839 +2269201280 1807565445 +1378559403 82594868 +3881162903 4148722127 +3138573234 2784587028 +654226630 2076958875 +1947458881 4232400214 +1851083060 3829546201 +2791330161 1520448742 +812302425 2433534984 +3652521037 3652521053 +2080411108 278975951 +493574290 3903014590 +12348538 2728313885 +3584018557 3347619028 +3766499316 3559470665 +3742194679 842205353 +450946686 3456817225 +88991320 2980158605 +2703366900 3267187039 +3452519406 3788894137 +1970418023 2778390649 +49397639 697336192 +3035982058 3145436545 +2705099707 2370828146 +839542809 85106942 +714862885 947690810 +2599394593 137648886 +3651805555 2879291350 +3990423347 2664974007 +1838438797 1838438813 +1364634423 1114605446 +3867350514 3529214949 +1740508124 472683063 +1836136397 372955067 +2015251197 548295761 +1508997912 1082937404 +3607872773 314714410 +3077129578 1552622758 +1904436976 2715487189 +4168654923 527457881 +1576320975 3075076817 +718269588 1949207528 +2521497642 2521497658 +2913241726 3624272991 +2669710839 2410988066 +1522246902 3412373319 +3253323932 3741765009 +4058070690 1737857283 +1420849419 1556214850 +563100483 420301436 +1016204783 57251116 +3534005679 1211159160 +2304432197 2130867354 +2825550839 1783910797 +1074599353 1074599337 +3398222069 4221162368 +1989537618 507411 +2957010976 2506353253 +4204346267 439932178 +2637504820 2929935567 +1288976621 1861855859 +2049505715 25236698 +2076485074 2828077445 +269091802 3131405237 +1191521163 1478724564 +1987323483 3399560238 +3001951674 1726309341 +1956517305 1306276392 +3307702290 1866150981 +2406999718 1919204849 +1672942699 2233279403 +2050755338 1988452525 +443857227 298041967 +2098340078 1964549102 +3379078055 3065618400 +615716200 770355883 +1529826687 175570664 +2214389296 4145962371 +3904426590 1056768000 +2541238596 3057788447 +1097945595 6557234 +3878358177 2311381344 +1690164567 4186641309 +2296446768 2296446752 +2978672064 1741228941 +4108347643 3401160773 +2353260448 2021410939 +3164827547 1648257317 +2761256863 2761256847 +2845389924 3499499609 +776093281 860369568 +1509058944 4074745016 +2455283836 3717282599 +99461726 3005428223 +1176656344 1075015451 +4147139132 4147139116 +262926331 2796210226 +2421458871 3624287637 +3940901479 2999478898 +4292042893 1187053028 +2690350082 2745356905 +1555909602 2985330447 +2661369712 470920847 +3127565205 3127565189 +1549491315 1549491299 +3675596187 1070485320 +297431617 2012283889 +3142258850 3254452669 +2896769808 2896769792 +3235852581 1413530205 +2012963833 3653132520 +2056987454 1077443209 +829148073 1974573838 +325066878 3541579978 +276505045 714770135 +2710522607 2556009004 +2052825413 3812548506 +146132624 1177824437 +2503217543 1744279446 +1238357413 1985559242 +632573114 349489373 +4117038861 1527388530 +2808334884 529206287 +416742366 2591729666 +1223180966 1223180982 +2318954085 1804296605 +4231066383 1907911357 +466200463 61724620 +1534869201 3583435536 +2866742486 2199018469 +3548593366 3449341159 +1341443611 1328057359 +2410415220 2410415204 +1096007426 1663039373 +355469497 55277797 +1971465565 3580607044 +2751566328 645450093 +482852013 4218291268 +3420708241 973442903 +2197875302 2691759745 +968816144 1097665682 +2650628101 3135121370 +2387909492 3623793805 +38125883 1948804072 +1320533285 3623366218 +2116060922 1654553557 +3948583364 3948583380 +1208691162 1133699645 +1203142116 1203142132 +2789456070 2191253431 +3461323136 3318545755 +3752338377 4254497838 +1454494300 1454494284 +3673757370 1223831850 +1830720393 3354115845 +1314997817 2619444158 +1509569674 113069042 +2497395582 3091298974 +1001496805 2185606351 +3055414553 3489955485 +986478995 585327226 +4085109564 2333312871 +335054988 2015016119 +1074657500 2986263111 +374850903 669573247 +3591027596 1824652685 +3522204946 2411375429 +725222720 1280721875 +2187398912 1053465861 +216701887 2800803708 +2029731459 4135807018 +3084621537 2780438800 +1059901266 1059901250 +1306595700 2538307424 +2193026284 2036243264 +2214394625 3369825742 1067819485 +1058715123 378562630 +493815485 305778100 +904693293 274151620 +1337601672 169295883 +1043444814 910087897 +2883344418 1245252634 +1754351152 3434184067 +742234715 3841171950 +2592253936 2558478667 +2465518052 4014111460 +2410667546 2410667530 +2951726759 4012731858 +464918642 296254323 +4090956951 1921569200 +1362352574 2459944457 +316404373 893306700 316404357 +3369772834 1379211907 +2522885781 1315525788 +2276366712 3342112000 +2331117213 1476421922 +3262244375 810366502 +3186101706 3192763629 +3801530111 2991500136 +3259808665 1930551422 +3945789960 1944409829 +3802045074 1370313683 +2623047714 1096699267 +2005894534 3169792503 +2299865953 760433056 +259790752 5845235 +2984703081 2006106446 +2765801560 2263229412 +1518886264 4239074285 +470131714 2988729997 +831339961 3126340136 +4253120803 902935068 +4086174004 1893716383 +2253082264 1820525920 +4147734415 3193832985 +1458132571 328326190 +1237311946 1237311962 +2689257414 2837626517 +268318187 2674703939 +3328231737 2654990867 +1695112316 2310838065 +630323066 2663945483 +1561491882 773162637 +1746059371 1082452066 +2108008615 2443164324 +2231828643 218497162 +1894713448 810171307 +373140127 2719193182 +4058787178 2015173376 +832249952 49786049 +3855562321 372408710 +1026354069 1681583208 +4210124116 2549677236 +2310096793 1528018398 +618376309 2150856218 +3337429944 918117957 +3940562169 3086181352 +619889511 2435423030 +948174997 1420896700 +3871693050 1118507403 +1606481473 1606481489 +2518005593 2298124076 +2730516512 4267628407 +946335919 2057298808 +3403551930 3403551914 +181926630 3027220250 +2436561909 846979539 +3419513081 3556796392 +619892289 619892305 +1839852232 1786550493 +3266135571 3449606295 +1307016598 963294001 +2679797552 2726928533 +1898006368 4146605752 +3065380339 761002622 +3852606582 4096970193 +3700244939 1876999919 +1837588174 974798425 +1217410773 268849500 +808488837 1573830266 +3843578623 492359868 +307992754 2553372731 +71510883 1181230715 +2017636115 1677302501 +3880319753 551759672 +4283802131 114172922 +1029893215 1721318346 +534923378 1681524250 +2947652409 3449248424 +150265237 842128429 +3909416159 2983033630 +3025218917 1087010298 +1791764090 2573242891 +2840662548 1916120894 +2154460334 3583356399 +508108187 2152661260 +1712285266 4231926533 +3594204574 4195504553 +1232511097 1780469637 +1230508837 158068111 +2359311238 3560156663 +1665379111 2895825849 +3019077763 3410409020 +4156670607 2500151064 +2214476313 3968184658 +3760737940 1936962287 +2525176644 879789065 +2256401089 1662679597 +1585749431 2177124112 +1989565660 2327064145 +3181870868 2580793332 +2834127585 2238416134 +956373780 3502088313 +285986165 1251241788 +3993525884 858570033 +4264307237 1149655098 +3594398684 534711111 +1989511550 1276446178 +124273096 1815694686 +2895969858 4247011829 +1404189667 2761180764 +2807695006 290458281 +1965303598 3934477723 +1942624425 1942624441 +4105674712 353411341 +1969620202 3113860187 +584918304 35746163 +2982231145 1009916238 +1400306124 810236983 +2099615760 305029429 +1584026531 2479343811 +2774465077 827203219 +4036648209 3556803024 +909837966 1684199826 +2587982580 3373567513 +3632449024 3588076051 +35384245 3627147537 +2163384873 3107447423 +3536711661 3341857307 +3894338741 3894338725 +1060377310 1962099070 +1416125155 2310488566 +1969217028 3387588703 +921632935 557713120 +3024000510 3100750714 +1871852101 3894747802 +1641483210 3481767661 +3010225034 2197330209 +1869691293 1730112405 +2060230322 149631518 +3808723229 2375728916 +921285719 3370575078 +4255277640 2515130864 +3616582615 3481411974 +656876263 4136013030 +2770715141 4285558220 +3335787508 2000422292 +3426445415 1910854501 +618095607 787066467 +2939906228 2391135055 +1099109593 4200190344 +3781638057 2122096398 +134113682 662712538 +1200772484 794599135 +1864190171 3323572420 +2238198791 3600200498 +1995477848 2495083419 +3408997006 3032013408 +3723970803 196087949 +3925130055 2788081081 +1900021614 3050025519 +3816336728 986385063 +1405876705 3407502624 +1168580964 169447551 +1100272429 570951570 +950783080 950783096 +1661950601 4073522847 +3544227621 3015345964 +937990878 3777743743 +171220715 277017043 +2539253908 3600136431 +2770375118 3195848527 +2656056910 778271193 +2061503605 556830268 +3194119187 3200434251 +1731451873 2365440931 +118437010 2934948293 +1106440471 3899754278 +1864019022 889011919 +352916624 2191922940 +3342370269 2063252203 +1328628038 3755682183 +3926467353 513233669 +1117216383 1397342696 +1224103944 2683358271 +2728431990 2728431974 +2785195518 1671695992 +4133934740 2904999602 +1008284912 1008284896 +3579369152 1102165918 +3450636408 3450636392 +4070575267 852131413 +3113979225 2296349470 +1848729192 3943518339 +2650915886 3938964601 +3921747502 4260582585 +522067588 2154432969 +1596535768 659241828 +2007816149 3177840749 +3167057773 2547712132 +2221470090 4214504493 +849806385 2950829760 +4282326210 3340450525 +539876234 842045997 +4094422173 2649894967 +3618164948 3418996439 +3661088586 3486431611 +1547469057 3729618526 876549279 +1134250318 3605026877 +3170459258 4136614411 +2097894160 3906191925 +2557774190 2099696121 +1123549872 476855061 +2672058558 3819061727 +966542254 1593740025 +4236336600 1470544667 +4165506003 2906699066 +3709522423 137922512 +262335354 393785611 +2134854142 2134854126 +2330834804 2330834788 +504304774 764969564 +2031483520 496588677 +1155126118 3689044145 +3684289063 3659086688 +2619597565 1152773489 +701518867 2346291817 +1875279268 1290209676 +424791475 2395394266 +1363236734 2735287090 +2318277692 3285592049 +1155381970 2493366862 +665423022 2823587058 +1330733003 3748643193 +3137808349 1229177058 +2782958471 2810723712 +2859711100 3492712753 +2752308788 1951294415 +3308622150 3109269793 +3294122011 839260818 +2983558234 1293074877 +3907386464 1447175570 +619223403 1050815032 +2646627192 3452134893 +1203039518 4117861694 +3584659325 417817698 +2100909966 2940523673 +2176411117 2222438468 +2422143084 1865373569 +1852155916 3470762017 +3878588914 277556109 +1423008082 2112223739 +2365278475 4204002388 +888381043 2582338999 +3559272178 2179766379 +419601184 2132423525 +1344129212 891523920 +507222378 30573005 +61895463 2120445518 +3396364940 1856385800 +2866501852 3545031249 +286206605 1742732274 +3342502551 942156710 +1350487324 3550274321 +2273749843 2273749827 +4103106412 204418259 +3145613569 683693184 +1386729868 129336155 +1020934364 189932945 +3950307225 1107858888 +3161210170 3968872086 +935233980 2096288487 +67149200 3707242933 +1420997983 3025372296 +3513960196 3148827487 +2707866569 3720754542 +918182952 4020954196 +2675650 38099562 +2291290356 211739796 +53480149 1787612540 +3391970799 3158140219 +2273727729 1498856692 292928477 +3609255273 1697256499 +518608619 3037985718 +3624143490 2421983914 +2778601921 4006265191 +1560380072 3627200195 +1578716327 3369315062 +2143434231 364573648 +1866243671 1588894831 +212361626 2266080637 +1518931898 2604991598 +2341470809 213103134 +209115245 202814340 +3581655621 3581655637 +3932058709 1202790876 +1601863707 1758964370 +805525473 1644317190 +4033934176 2651822651 +1898902254 1898902270 +3301575491 197300519 +2271467858 3807854334 +170580082 1315396958 +1818800011 1588478648 +3261982694 4177792769 +3757203719 3757203735 +2591827228 1299081991 +1165553757 3403735106 +21555782 2216262279 +2581797536 3766675941 +382111998 3548810249 +3733137600 2612477595 +736574826 2265296333 +101907096 101907080 +631105041 42564512 +1876117826 3769057613 +2700596903 2487261362 +1942395560 2252680888 +3684522602 582309069 +802791500 3360333037 +200692586 2879174098 +161346109 1621382658 +2600298378 2600298394 +3212386360 2506604688 +1756530655 2953569310 +3954509085 720833716 +1687431633 641586182 +2771248440 1061148461 +2292473630 2549831486 952220735 +514263058 514263042 +2545066448 2248248440 +4291236543 1108586108 +1946634227 1692673260 +720641250 3064432637 +1555843636 2310549088 +2537003244 4169513857 +2968202839 4069041411 +269956287 327682238 +2502923107 1021641930 +3622929653 92248169 +3286493061 3838146138 +4185250088 3699694077 +2976470975 131408318 +1298552312 2278968960 +3796892353 2328875418 +3638348005 1217413242 +4164882873 2093118345 +1432476603 604825458 +38221890 1923731967 +2353363403 3172972280 +1108704431 3067299694 +3695376550 1668115777 +4259272709 2878836698 +2203848218 3823776491 +3632898162 1386713957 +2990712239 1307234929 +1655298886 860885037 +2291189940 2291189924 +82942133 2102617315 +2933105303 3458790310 +2137811423 3809317857 +3180479384 2439262500 +213697672 3978654627 +2612867411 208028845 +1722339332 895617051 +1139963549 2477832500 +910565200 2944199996 +3840645344 1054976179 +2358172990 2793686075 +4268669050 989334102 +3789385563 529504251 +722641069 557753652 +1800952062 767791099 +726442130 823618349 +1388429654 2634242673 +2857155441 1294086135 +2631946051 3511448880 +706510029 1030047512 +1293607776 3243503667 +1510223760 921821650 +877079460 4027167551 +344329885 3964700872 +955081990 2746615927 +2101629144 176899099 +1474879564 113800187 +30208411 1889556228 +2649545814 4057914215 +455834364 946439335 +157671924 3210916623 +1631342063 988973405 +4280472611 3806619549 +1288807549 1795551444 +3475364938 3004602802 +4143983904 2211695099 +3192149640 1783904179 +2263362492 127374572 +1451374654 943363072 +3577813162 3758466828 +1231186003 310946473 +3085158103 3085158087 +2734254149 3550422156 +656084349 2694135793 +1782261411 1782261427 +3680837762 3204206471 +1177377701 510084268 +532723208 749436877 +1072431370 2860884667 +497384620 2292325395 +1553659384 3220256109 +2270731970 3313863901 +1055679934 1055679918 +3144364708 2915088447 +3023378284 2530462001 +4032357217 3169710496 +1870540824 2611328461 +2911424228 308130025 +3842903106 3609021411 +4111487986 2315062238 +40721074 2217068083 +1495973927 929652260 +2085989996 1109135476 +1173071587 4260734416 +66865775 3956370424 +1443338536 2515933693 +1806609488 3556327907 +520050634 254099749 +2588703256 4267979739 +1635704903 3250261974 +511665021 2372468597 +2759409522 2782614797 +2088902599 1160959641 +2063599834 3790569635 +3191987659 1286612628 +4089800288 4089800304 +3782052215 3782052199 +2079686897 343538544 +2825767751 2825767767 +2924887590 2924887606 +1215619028 3824966329 +1281955886 2003898479 +968789185 1454731879 +3954824016 3448494584 +865498395 1356487044 +1768839720 2122977876 +3893882324 833316024 +862898503 1046928086 +3283171939 3813287248 +2476984224 2476984240 +2353721444 1039691113 +2722829062 2184114807 +895000544 3666062764 +1838974312 2575402064 +692957241 3494540830 +3248138371 3804467312 +2119754526 2119754510 +681888815 3192133407 +1504388476 3217299146 +184941160 3365489795 +656688918 3021727665 +4198103851 340157620 +1214664204 84729057 +3398116262 1381679857 +3331517583 2233279692 +3334111578 832151741 +576220791 3369603031 +817096117 817096101 +1568009924 3836141215 +2075900650 2995207757 +3276755690 240461549 +3747983653 4067115594 +2209134927 2548545358 +2640390778 972414466 +3850566838 2442422935 +1558219050 4121050651 +1580144613 2983506508 +2554389532 3391559687 +1478553048 2480302861 +1696565220 346221545 +3479869407 1622085089 +4209109013 2020354733 +4106497213 231894402 +3751337826 3622588029 +20927701 3417475932 +2345842392 4150675834 +1511162261 3841863355 +719104641 3354591159 +1798953734 3524512353 +3870440294 2425586071 +2382165501 2184658260 +2401334058 3303947141 +146905091 3418508476 +714624099 1891647434 +1736260178 1008914181 +2942518146 2604877219 +1830161742 1159385501 +223959363 1185383548 +2271271327 3161888094 +1423116000 1748226725 +870910689 2564562998 +459230420 3943035321 +3998252950 1677580385 +950633696 316419237 +3713125188 2881682441 +1855075467 2603136724 +3945243632 526848725 +3962131643 2148557412 +1554660145 284896806 +805600808 3205667069 +3211253084 1578237105 +1161856247 1161856231 +3102890772 100064895 +1332449639 1834345760 +890926464 413595781 +2414944864 4170784037 +3963416884 401585369 +4012856284 1893782607 +1869524682 893200379 +3846587491 3173987414 +2923514628 3247417327 +1364392021 1862948077 +2119534362 4205030909 +3220000128 2379476151 +115813643 3907774548 +2401566918 2401566934 +1685298896 4060283253 +667600112 585444957 +1581362132 895581881 +40016681 3001485577 +1861061438 54428577 +3015111435 1894969902 +2313367182 1771999244 +3595126790 1532780919 +2119552736 3239357107 +1917796326 3636565783 +775993901 4003448466 +1218069755 387704684 +3037556882 2519217605 +1552301183 971066922 +2308682953 2308682969 +3872963690 713279186 +2596199351 1366548742 +3400442161 1105707046 +346457094 3292727889 +362758671 414514584 +1266035564 923163415 +698369683 441391482 +4127113287 1454158208 +37766636 37766652 +345435097 1862150846 +3622580874 4262099429 +1028559451 3719324996 +592602626 1785996290 +3248606800 156223147 +3885398544 201570411 +3499834320 3277233050 +344727980 77136343 +3390761032 1885055325 +4174616534 2333607409 +3065597205 1244474921 +1240447076 3361686889 +319864819 319864803 +1217860315 550678221 +3812662793 3350775854 +16218999 4237777990 +2066321702 141524695 +1991330015 3088430878 +1761385083 3232182194 +98914691 1592330513 +675472116 1430996495 +2857338064 3945665397 +2506778059 25050754 +339718021 1698778714 +1918479194 2897214173 +4208499870 4208499854 +1500201750 1500201734 +3514706295 1083917894 +3226573855 2544764838 +4174315905 786390550 +573690704 1472454317 +772401552 161131964 +2461013563 640876260 +2132721589 3530017276 +456648562 2317239129 +118128860 3927603044 +1575953745 3707688087 +1599065626 3436328569 +2668471531 1099102507 +2384923536 1467429795 +1590133023 1393574878 +352173689 3055657242 +4071203501 2000151732 +3371721236 1929536889 +769968447 2116603454 +849807316 1930182065 2446011330 71739107 997187927 +2663612829 2720990825 +134358824 3278087165 +2526935410 2091881813 2526935394 +1867388331 1840276952 +1557492395 1216904051 +2678605723 4041783570 +4014540999 2487644037 +3146522148 2607642592 +105292625 2356124406 +2162272245 969491660 +193191067 3147057164 +536882208 363453118 1314478783 +3013150229 2159729212 +612895617 1675482279 +1257474558 4217518815 +1581125752 3551784173 +4168215908 2136519807 +246921109 3224764316 +2020705215 1504863678 +3052398670 3064640217 +4036271263 152487474 +57359409 1275927780 +3209564913 417845616 +830921055 1537500682 +1296117026 1296117042 +1111119090 1111119074 +2676150791 1460259354 +2204914064 2389449707 +2120176894 2120176878 +1492160870 3734300933 +4068078181 1867679114 +1233681815 2651029282 +3857421943 1759370566 +4271871464 3174628395 +2013238930 2035943379 +1751789509 606679820 +2662780917 3469303466 +3191525071 2260447295 +4225879200 611655667 +4109656735 1165634319 +3325429956 853474233 +2468548352 2468548368 +2973472628 1959750543 +2644233475 524532650 +2617590786 2655653667 +2452439771 4164959954 +3957987024 830597493 +2178333521 368669430 +1552201465 2649491966 +1336344828 1608944817 +1236193560 372451524 +3859188486 866389921 +1177786698 3443150715 +2851344527 1528621260 +2153528509 3459489172 +1347439300 845525641 +3167277336 1496529587 +750582750 3950657920 +1811241719 3929944784 +2370450847 181561694 +3211254297 1769755976 +603535974 2844376054 +3880619584 3880619600 +1562971518 1562971502 +1293399957 1293399941 +614218219 614218235 +2691432645 1325741580 +3346443025 282020816 +333701020 3954770577 +3025830352 3128580707 +2778985859 1142652202 +729312722 729312706 +1891079112 956146635 +3465749459 77686060 +398000356 1010591487 +3509833784 1150923545 +2561177777 37093039 +2476105728 1438195731 +321263820 2030657248 +1519751691 4195731196 +3016824467 2770766188 +3057524522 231411469 +38582511 2378637368 +1051075718 1051075734 +2650014236 3273609735 +1960582273 2004934400 +610528893 4070464354 +1093379149 2606767776 +136945776 359151068 +4183663864 2255139451 +1499837110 1897419921 +618377975 3696498036 4242193104 +3875285545 3354812056 +3689981132 131296567 +1533452351 2261094630 +3604555902 2782569785 3604555886 +983131294 3715720361 +1811558888 1811558904 +3804295998 868149919 +388063619 730985149 +1019974877 3878377666 +661302081 4292820070 +3866223844 3866223860 +594691997 3627690370 +885377206 3378181774 +59789291 3239889432 +746445380 53143864 +3745282227 3745282211 +903596819 3691032300 +3675490098 297653171 +757777073 757777057 +1305410519 1406563184 +997612828 3488770180 +1974165479 600307894 +2252619915 1738855164 +2162218311 3604644633 +32365395 817530816 +1487275339 3629798658 +3106091242 459632903 +412041424 412041408 +731156380 920523409 +3970628590 2133497785 +3068599732 2715009625 +989694041 1319721768 +3331538910 2009959017 +4149684933 590894092 +2116386985 533742168 +1191382906 2326803694 +3439932654 853284506 +1574224896 3052440581 +3696805655 4139870502 +4249274959 91257432 +1490268952 1298001075 +4213949033 2199821667 +1095745611 462140948 +2463255330 257097770 +2252752786 4070746835 +157563851 3231697717 +1137124035 1137124051 +144248728 552832091 +1680703713 819403526 +2658293962 939640301 +2429267411 3282215724 +2841587017 4247802337 +3928540676 2585729775 +1223585803 3663356244 +1234972691 3575564928 +1372674110 177072521 +1238751096 3978393867 +451144340 451144324 +4254365397 95883612 +786843811 2005162140 +850159781 850159797 +2754379324 2919938151 +98255271 746945459 +2403988285 3463047444 +1842446635 3815873954 +342917722 2363870966 +397592035 609810386 +1441230137 1951461544 +2969747261 3830648084 +2253977574 1678655233 +3669178950 4208216721 +61712950 6484753 +3855831894 564932721 +4195376245 2265399385 +70226983 3185981792 +3615494108 446232391 +3146333121 1917157606 +3302083439 2740509351 +835427288 1201497498 +705619779 2021002876 +1669543216 3817452111 +1535704954 2460626187 +3922387389 3345046676 +867933417 2147972286 +1296489416 1854667723 +312673579 312673595 +1202583315 289368471 +3125221135 1290357912 +2962080632 1730852347 +3720155836 3433332199 +1160055704 2800233237 +2456432772 2662648185 +1850696772 1231322372 +692580401 759110960 +85471835 2292320776 +2674032450 512732247 +452070789 4027271244 +620767882 258683379 +3070187032 737445851 +1830422171 646437865 +3956690920 710920765 +4264070665 3308780467 +2420940146 3797480942 +3031161315 2803180490 2358138979 +761247348 600056084 +2685652048 1408739909 +3699639736 3688169659 +2571625345 350868717 +2323602307 2883517286 4127572353 +3069411662 1276897490 +1214255668 1732532635 +2072771143 819813311 +74683618 2602549227 +317725773 3700577272 +72853723 2969489618 +4139901226 2637526290 +188563571 611087642 +1898043198 1861278793 +3097548284 2704333735 +3173500246 2356818112 +664134093 4010462977 +1363392946 2074738585 +2133262817 191362358 +505769886 317633961 +3104419538 149734266 +3056277995 2967063778 +56739591 315713818 +2943941698 3962981198 +3633203613 2231231028 +3683638379 987916943 +3194268365 2239291570 +285834722 3018926787 +620849772 2906294273 +2225163747 2517443782 +2878150164 2827603379 +2580461732 3295455807 +783576973 319527652 +868238879 4169497231 +2918171520 1349567123 +1312765933 444926482 +2690918705 2930563120 +3100917857 1461803168 +748196040 3592600035 +1033382633 954789060 +955240939 758979598 +1721487646 1540673065 +2330777549 2144843698 +4229905405 1281369333 +1639303634 1919014509 +1458403321 1458403305 +4196047338 790011973 +3771723990 4173056929 +529124780 69402728 +1713314243 3766001718 +3995448004 2841143967 +3810490584 1653292059 +225590500 248896255 +2610769134 1933129650 +48720545 860674934 +2636789438 661925129 +3104701792 2969951795 +3216484460 2121238423 +654205971 2410967620 +4229065687 2818556774 +816477855 995671112 +3832912561 1445102758 +1337601686 404182577 +558245674 2339350285 +435563925 1938407818 +871722638 863370731 +809179091 809179075 +479049994 479050010 +467459071 3685634686 +2254195177 1816680920 +3040503216 4209906691 +2388937428 4225878969 +1374356013 569666756 +156285924 382599016 +385626530 1620682605 +2793529152 3644542268 +790479655 3649285127 +4216324267 1240534306 +1988783064 1944569115 +2914616208 434742328 +1493688320 660971525 +1956503644 3253236423 +1068275531 927724964 +679379884 679379900 +3095721602 1515994909 +3713617693 3713617677 +1872389192 4161527115 +3536287783 4144112992 +3045847117 407587122 +1841887571 643857850 +79369646 545464569 +4058537103 1607054616 +855123721 1369099806 +1868378448 2679415036 +3510049601 1137951992 +893864404 3006871727 +1907051313 564616762 +2262159657 2258872191 +2543324607 224958074 +2973291514 4134908573 +2541745484 557938080 +437317782 3989188961 +1864319827 1368271220 +3822723870 3462744127 +1634492645 2317894691 +3729129223 2303518724 +1678673241 959651880 +1508079840 1628915877 +3089542073 2648724542 +2271813231 2574969009 +3040929052 1898490631 +2836068347 121915106 +932290792 3666547018 +4247570337 2797772752 +696577800 1682196893 +776537426 787701765 +206210851 206210867 +2634727033 2280912933 +3028495474 2625566575 +4267772499 3317907642 +1797740439 1797740423 +2503740049 2957495923 +3942483667 625067975 +858722209 873831008 +1308698956 1149346231 +2439853820 3941437105 +3349043436 220916759 +2772750018 4198841565 +2197920187 4135911780 +577222704 531723165 +3157149544 2981863956 +2711597446 4100224481 +2022498143 1056729495 +2717643995 3668079826 +1005446026 3414656798 +950878736 1220476707 +1850920733 3378252468 +3088746481 3179807735 +425124222 1640298825 +1231149806 1930142895 +3604484296 3604484312 +1130470638 11143865 +1452979579 3498815666 +3934222263 3934222247 +281890754 892636789 +1780767760 658304291 +2718190967 2210787910 +1952205276 155731271 +2359174564 2870317967 +3115756439 547742384 +195916464 302746371 +1576991982 3865586351 +160555353 160555337 +1606275233 1489988960 +100257748 1010969263 +2063476678 1679334583 +2604750647 2665237392 +3303712314 929279307 +1820969593 3170089544 +1316351099 1626033408 +2510383940 297921801 +939278087 853940636 +2192994378 254985339 +4109103458 4109103474 +2748899597 4218046322 +4054923928 795027808 +122711806 2174663113 +308817258 1677688269 +153696584 2395264611 +4100490099 864480794 +2832439592 1024911701 +238498720 3908436777 +4172264500 1189751635 +1169754515 3135463277 +2630309736 1832545079 +3953450020 1154444825 +2867721514 2740255497 +1479418670 4271989102 +2715466705 2622859782 +698958197 175246122 +2647473323 1718445272 +2590694281 2671220920 +2617203594 423132937 +192252576 176539399 +4116339760 2338238799 +669785070 3333420985 +3083716739 4138512010 +998741603 3926778192 +960886166 960886150 +614965555 3873620826 +1505348629 1417430282 +2186853660 1303491345 +4209650961 262468048 +3104788119 3927488432 +161383026 2525452659 +2099093872 1705321301 +1491909310 3131701513 +1462059881 2561220184 +539361277 2563898196 +3481245331 953813370 +56238092 1390441207 +2016974311 672397984 +422013252 541122671 +310375464 1847999573 +387350437 2626718551 +2517039459 2415564508 +3257204761 3914247939 +3992393949 2029790196 +4251439728 4251439712 +1447467866 2561840931 +2347157581 2571987572 2347157597 +3778027066 3099563357 +1229919595 3531519842 +1128039993 3345210821 +4286956878 2978029775 +3676398117 3891536934 +1171794779 1313620036 +1649617593 2179744040 +1374615016 3811384381 +1027255237 945586268 +1825291584 2226842565 +2709485747 2201211936 +2451847307 2584019668 +2602678612 3369965748 +3609525068 428164471 +1731954121 2579344953 +2055640823 1072916466 +2236009942 2759198705 +1394252412 1568698407 +1377043815 1377043831 +643143958 1459134250 +4182665728 1987108371 +1394117205 1394117189 +1908666868 192275215 +3340477674 1518640219 +3505713556 2241350639 +42048542 269009727 +1558579951 757282350 +2377267665 2377267649 +1683069522 1722243821 +2515823583 4005941256 +3322798640 3360169563 +608305805 2699690980 +3007862044 3497147345 +3180785600 363453851 +498595451 232831806 +1729532545 3381174550 +1311967746 691447446 +194490702 4216510970 +3457475140 1942181926 +2040457951 1412152606 +3679722713 2045853026 +1451835409 1259330255 +3447785779 3038870362 +4022615071 3915474634 +3458873297 646742881 +3407357655 2382701670 +3102617373 1005857460 +3556690286 672602169 +444473595 2945313572 +3997912872 3794009764 +282973526 3812021863 +30008488 2971066563 +1161852350 1141432030 +3372384114 3773735013 +3115309208 3889297229 +1236691057 922270652 +2925268771 702039662 +1661848547 1346212196 +1280424701 564747330 +429370766 3620091545 +2472946369 751408670 +1292659154 1228192031 +609973227 3356213855 +3834931738 681829347 +2965368903 2233941974 +3991026132 4170928458 +3354486484 2500124601 +1798350140 44696432 +3326782511 1452084728 +2740351905 3256354422 +2872093974 2476767665 +733143928 1345602304 +4155590233 3639494952 +1954440852 3875234271 +1348972820 3860360302 +2533082686 2939806537 +360682764 3822559735 +1115354568 1871768011 +80996226 462778805 +1104239575 1355325257 +4161221274 223651947 +3408945286 1663562465 +3951016237 363451371 +399658606 3994122031 +2903854859 1753132600 1383477387 +3014157024 2987632293 +2484701307 1064934719 +3685893925 4272291642 +2385984999 3354817184 +1914780925 1914780909 +3736817917 2648735298 +32410022 817599141 +2680778562 3424265461 +1568291719 328120467 +1564146775 450575590 +2575202738 623336222 +1565318100 3019771567 +767629519 3030634840 +3538716129 3096589876 +3757899274 2772691373 +993813946 4195623901 +2736748358 1045122961 +92715828 3877155536 +3505386096 2513688523 +1827700378 412568701 +3695668265 373590109 +1943485039 3402693806 +1177212250 3480083627 +250466359 3076441734 +2688847649 1827492064 +3749346873 114602942 +2926704926 3144362559 +2483698458 3885014242 +3631100911 2570906107 +4143789096 4170783467 +2167832258 2167832274 +2231485122 3003994333 +4093969939 921210874 +1491891876 1875825371 +4003905271 4133226921 +448940684 3947841184 +4264494222 3415249423 +32320414 2791025065 +4107995920 3944569880 +304916544 2969577126 +3627826856 1951697424 +3819549010 3819548994 +2003279724 2672940673 +2682277940 1030909012 +107087938 501272398 +3221398351 2497296711 +2485997078 1123519201 +1872963470 4074827022 +802529898 1809456325 +2093841073 3439995897 +1231072390 1231072406 +2851146226 2020780019 +248470606 4037172585 +1736586893 1811294128 +2119011456 3305893304 +4065058590 3232683838 +933446560 906196197 +3409132940 1839850359 +2573393110 1285661937 +744832661 2019656860 +914784518 1706284450 +2381256358 358655809 +4063420335 4111868014 +4203071552 2694462661 +3734196166 669422775 +2524834237 2771842178 +381871888 924212180 3139446248 +1462579154 2479714700 +217082102 727199426 +2733623346 321186765 +2086660369 327857825 +3281231527 2624958162 +3214381920 4221370419 +3158915764 1111409968 +2929376804 26825407 +2530375656 1431487037 +2270898736 1149462915 +2911220432 3045142804 +3501897724 2448400817 +4103853266 3813672595 +981944557 890753874 +774227460 2843129929 +3219150889 3219150905 +3613559658 2894572618 +1847297520 4160640861 +1967900100 3487265433 +1032767597 1422230404 +2956593309 140218146 +1525138600 790080992 +2169765429 3426299260 +148715145 209660307 +3762901815 1248722822 +3276637251 3053925738 +1457986754 1304044972 +3504525895 4140571092 +974685930 1587307085 +1792036399 1474898661 +402313690 2581092907 +1427800300 3837326231 +2472404670 3134340361 +412110451 2950603056 3319927066 +940557292 1020364199 +3441271868 2282087699 +2704069410 3362053870 +1252145210 3076424523 +135013763 3605124455 +3701396293 2466682252 +1239067983 2431038348 +1577151998 4198508233 +3043628468 1241524815 +4197969488 4197969472 +3880153042 2694108798 +2339456786 2505236819 +1012754091 2006097614 +2064997939 4121119322 +3600018742 960749268 +2765977618 66809970 +478111668 444387028 +4139156824 3109284237 +3005834307 4081586726 +667796500 667796484 +3971220993 2691003286 +2103529330 3526365299 +399116651 36757400 +3536730971 3619000361 3130374942 +2355602103 3376978819 +176316439 2524075907 +2601648070 3814040737 +2488162607 2790679790 +1812283665 491089360 +1526440041 2376753606 +1119873939 2803882106 +4117631731 1330107532 +4291130374 2849351009 +117046553 736541327 +1408887724 3731750871 +2783975081 3790842904 +837456939 2516375810 +2683720703 3485874814 +3551664155 3551664139 +4169851505 3013769190 +2846762022 1126361025 +408537672 559767980 +695543724 4016927681 +2174450886 3452267425 +694039463 3326824416 +1656520827 2592167208 +3714187549 2655502498 +3265103378 3438460822 +2312985486 795604202 +2609769954 3579330813 +1248249748 3016502767 +3058240439 1364069223 +2397768398 3127691406 +1159922958 3355651727 +398842632 3586896121 +2287600476 28527057 +831981628 363928258 +1295114895 344434446 +2495190943 3207180126 +40469624 1142655213 +1843195273 2076831406 +2017802284 871523780 +1266881374 733521626 +411125324 2048788577 +2239091871 2060368688 +682057637 2759561388 +1956077589 2672574748 +1321669749 2019898410 +1499198435 2395008597 +3358486597 1713028236 +3152269678 1650953474 +3184748023 3946182313 +297900949 2294803356 +1499121502 4250550599 +3453896581 3453896597 +4093386495 350538600 +1892333200 522020021 +3956334660 2110851849 +1140785593 3873170334 +1045022461 186925122 +1986807462 812888032 +1488511457 2956716621 +4105179180 1562998103 +615086934 214771825 +3151384561 2740967536 +3545711092 2791101200 +3166169117 625344002 +3739839967 2631421596 +3878157150 1106293993 +3195494334 4145205901 +3095424474 2156992325 +3528282886 364491361 +2508898983 275803382 +2408309799 2217889252 +809938469 608445484 +1032676173 848515634 +3840929420 4055139959 +2674828975 2855298424 +2716293263 2385866956 +1251849217 1389934356 +692027935 2639958353 +2966624103 2676603463 +4076729890 2815063957 +454671054 2004947535 +3379363978 3379363994 +3553008764 3718797095 +3666106946 1079645685 +1468340926 2223577353 +1097823159 3920144111 +1118351406 495802479 +3505794895 1116502360 +272904699 2075912125 +972396178 1774367707 +1171004618 770722459 +482345902 353788402 +1704414503 3959165681 +1669622683 1148544260 +2474252210 1153599309 +1484186632 2681205471 +3344530015 2140978282 +1058760647 628289177 +2310426415 4177438456 +336636307 691729004 +4029965086 3153394494 +4086275310 1494485679 +2718712302 122407353 +266870836 4197859256 +3400982165 210804967 +2765749540 2804514751 +3399495302 1642447061 +1025339758 4119410354 +1012077504 3066566469 +1126607723 4073190682 +2590929257 299567299 +4191628053 2913266027 +860483170 3931157854 +481168026 3220877419 +4179241090 2788017333 +4219301301 2080142611 +4229699565 1777666267 +2665508756 3771258657 +1251954414 3248434220 +806144305 3575691302 +2991165000 4056611659 +389388015 2019334702 +19130108 3347357361 +3178167607 1824038278 +876236954 2961731171 +361127737 461891240 +1459000248 2653588155 +723021636 460793887 +1683923614 42731177 +1928855687 2147767155 +3181516151 242868521 +2038283038 1592627263 +1931612723 4294866711 +2248253046 1787589575 +677590512 3913647965 +2724615478 3709346833 +1217540372 1217540356 +1834911182 3674707166 +4085365318 2604153889 +3030553766 2495101058 +1486638891 2836439220 +4092997393 4092997377 +2910284407 3780500463 +2715243524 1080254267 +2102395402 1324561837 +2797012892 237042321 +3616267368 1027014275 +616727349 2780367578 +1925868927 3177318918 +577711989 2852631868 +1805931751 3354780350 +2390843595 548102018 +2744145714 2922988467 +1275789791 1238113249 +31285868 2311015203 +759512269 2382632296 +1222709714 3827846270 +4286032961 3517883760 +1159231388 2236437294 +3076283692 2023828055 +2284420366 1733287193 +561823108 996038345 +1895447303 3773492224 +168101331 2565352236 +2001536997 3007540588 +491623018 1330226110 +2110214135 3888302262 +2668161553 3679856125 +4122114728 3203950275 +920383170 4202783529 +920729036 2258256887 +1869172327 3385224224 +3683364042 1726022139 +448572953 805704008 +2696494239 2728029768 +1368089800 644851421 +4099053956 570927839 +116974832 3922748885 +3739226065 2881021446 +3317117124 56738975 +2672687828 3945587775 +3333467116 3004608870 +4028619344 1911629842 +3631735101 28807956 +1221789312 607337363 +2484312372 1322921177 +530604663 1082315561 +1795641641 2776941454 +3386499610 3386499594 +1801268821 1727429357 +673024365 699010896 +2864463193 2864463177 +3245422090 2402816429 +3937145027 1461047984 +982369428 982369412 +987324953 605751782 +374252568 2107950515 +546406374 2396158459 +1668553003 1668553019 +3451585473 4054245983 +977357852 982987020 +1096435359 2149395550 +3511952971 3531098114 +648869800 2320096619 +1433295395 4174475655 +2761087179 3727378324 +3169727858 3707642469 +3348305929 898553390 +1023063040 4272512019 +3236901087 2518895004 +2206554848 3941469861 +1337242911 1337242895 +29689495 287416835 +233731693 1413727014 +4175986954 3758301883 +3938626666 4201999058 +1556851130 3466342347 +4245078821 1990538028 +747601172 2543702121 +554769204 1106105039 +2468343498 2411222474 +1274195451 4238842598 +3361642235 1433693721 +244723709 1727762143 +1311972556 3980919520 +2760870443 1544431644 +2099020562 98719059 +554014457 869469429 +724959507 724959491 +3030995236 3617424036 +803841007 1540165944 +3133676762 3808783138 +1187408945 2606518576 +1303867027 3573832453 +980482317 3055575897 +4031723586 2328986186 +4221881832 247906698 +1515480825 735975912 +1289402162 2593701697 +3232360243 1631856310 +2048545626 2440115883 +2770195035 2770195019 +2117430696 1444650877 +2446109392 2432251709 +736089017 3391489438 +3315275356 1864643271 +2111761983 3345588683 +278364981 1401130090 +4004355082 1386594163 +3953774158 3089125181 +4004857100 3546001889 +1693660096 2866444101 +299282498 1459058659 +2361162657 766942816 +3935373655 2572268518 +3449086059 207439970 +2714905296 2714905280 +2643810536 4196070717 +2839635063 3908118352 +241366305 504455856 +540517376 3080137733 +1271827699 1227350668 +781852719 3320549740 +2497352288 2193114712 +1998971611 1805917906 +3145903541 3145903525 +1868874497 1682209318 +3534679849 2218357509 +141620363 141620379 +2194708776 870048503 +1092471421 4276470466 +363221832 3868488944 +486161767 82749728 +1990422837 3709695049 +132799283 972798624 +1231014646 537580626 +2600298140 1259171715 +1287481676 439141047 +439141047 3147107107 3950413328 +2940986614 4250235366 +855587567 919193144 +639794574 2521540249 +1391400039 3571568292 +3468152436 3468152420 +88787040 927349664 +3704211066 1565296469 +2375049534 3658184265 +3976948209 1979255680 +2222545850 465280534 +2216931395 1194228074 +3693538049 2453926550 +2981333569 4272071766 +1548799920 612308747 +3660977452 3894832192 +4043202586 2054244605 +2499359736 2085408621 +1748607644 2931489681 +3216342573 2835936191 +4022037420 25631959 +2429246243 941429776 +2189689317 1523514220 +2294341166 1883429603 +3357715798 1687608945 +4141613320 2757074827 +817573137 3349672390 +3684506111 3075468392 +1430154142 3477301673 +1320364249 866463678 +1683914298 3361563925 +3725801159 881478656 +2092569711 3354274488 +4192532368 4084316092 +3789965213 981646388 +1097776896 22457612 +1243750839 1710250901 +1202226677 2241856204 +1440805305 3927737918 +2977426199 1992758576 +2272974619 2272974603 +2907064938 799483085 +822880233 522376142 +1206694243 1684272208 +2072478570 3763593179 +15885792 1570135973 +2912568482 3956935427 +574698391 2615678089 +612051919 3053688346 +4267765707 1033469076 +1467225936 4223709923 +1887006128 3207048213 +3691950424 3273731469 +2489207884 3698465719 +3526494257 365094192 +3752471073 237043706 +395065588 579837791 +2183089895 3192468918 +2998576388 2654951967 +1382272229 2551942252 +1434476492 1695993399 +950897361 993751684 +3025610308 691092767 +1789914712 3090223776 +2284170912 4008503148 +2030338224 1496665779 +2309388598 2309388582 +2040100058 1350455481 +24736511 1362102120 +2531564814 2548251929 +4294436135 440253536 +1823571692 124439959 +1990110110 1506290089 +3841839984 784277707 +406724392 1372261355 +2037510541 3143581938 +1055242265 1864790249 +96209602 946860972 +765287379 412778085 +3226653829 1197772108 +1705723571 3765851377 +703541429 4089366317 +1787043952 2607395302 +1981025564 3358265872 +931707411 931707395 +2846071749 4242587114 +4027060728 3568585069 +324774854 1062168737 +438195932 4190288967 +1128022661 1557968723 +6641817 3757852009 +764274607 1701034104 +3006005086 1816330495 +3789924634 3062445035 +1064162800 108707826 +3711937965 1886074767 +2567294438 3391299841 +1768816758 1848293841 +1969926595 2583025130 +1381728711 2693653924 +4033258212 1435659497 +232707639 232707623 +3979448088 3979448072 +4091675202 2320129117 +3645002176 3278287187 +2440046392 730709293 +465105736 509354100 +1543153110 1790810986 +1512664228 2469791295 +1528311610 3672178178 +1396813650 1650916869 +2099822464 2267379333 +3618437137 2521465552 +4005504154 638280309 +1860732197 1860732213 +3594197713 3594197697 +2694924159 1558416638 +3051606428 126668172 +604479210 2717854285 +2664501210 3709596733 +3214831138 3362217877 +2257534004 125552089 +422569093 728022362 +2652931760 2637432579 +101526951 4056982554 +4132861412 2921043455 +1912510138 621401902 +4294580502 213220785 +4044702985 1619016223 +1890739805 3319211106 +351351917 1689618322 +433603537 2155004432 +2571804052 2571804036 +1340319654 1340319670 +3402205607 3259550462 +978273046 3771112359 +924690877 924690861 +3782526768 450203797 +2576790000 3415200104 +3458036699 4284903103 +3610408126 2188232479 +1039130011 1039129995 +3551584869 2759091450 +1352061402 1352061386 +287960606 287960590 +1174007473 1864513932 +3189920010 1510314669 +1985713957 1999564602 +1796520037 2543253036 +178013269 178013253 +1419380737 796563840 +3859087314 3859087298 +365184428 4026117569 +4276227265 4275704768 +4272073024 437284805 +3278572939 747000258 +1889311944 243977931 +1444495379 2629819898 +671057143 3117419433 +849368249 1801805608 +3230110955 180092542 +332539252 2815489433 +2709041268 2709041252 +1645804840 2505475563 +209497691 930700974 +1051747373 3702371012 +2732310267 1525523748 +157719660 3935088225 +1068535423 3253752318 +1302115671 2226223088 +727805178 735629762 +1581460304 3015519971 +731478754 2224845251 +1519992968 2770584394 +1919304327 2346009817 +426920027 1776805700 +1062462023 4161615318 +1445222760 713597008 +4061250479 3237416046 +2190905059 2397064346 +2879652883 1177709050 +148887817 23243054 +424621829 3273609474 +3790227582 2577387401 +3266904470 1965659872 +979173813 526380378 +416050694 3742207812 +1325406838 3542722503 +1102126279 818957654 +3178620544 3178620560 +3651234950 888160184 +3198200459 2716629186 +1574169230 1117404559 +4092481919 2133478142 +485977470 1412354140 +3993650 2448301733 +2115699875 847519005 +2987302766 3596783097 +3577569278 3928278966 +3600448617 3600448633 +3700999589 1294183132 +3363456418 981179925 +3938804509 1222395300 +4187510606 1085473497 +1136270245 1123648698 +2842081357 4189331748 +2106247995 3699240434 +651279434 1714120813 +3373230018 1161844341 +2373462423 1261009062 +4290065256 4064275627 +2153908635 1253759009 +3571631576 4177359643 +1207093175 4197475600 +2933443875 1649077788 +3084078602 3084078618 +3575509813 1855584986 +3435868040 3957052189 +339942673 4138123718 +3226541606 3853678017 +2389068938 4007426674 +3973591143 1062482464 +1008729412 3931877888 +574046699 574046715 +4000346028 3450096700 +3192120297 2630783459 +688057622 1448852373 +2154310741 1099213036 +2890518651 2890518635 +2628160985 1932610696 +2053976131 2948138970 +2015970085 4063634524 +2604684283 3451468949 +280208811 4123905058 +3794726170 702496765 +3689340074 1100493926 +1402324589 3885935073 +3571577320 1455738883 +3331620566 1908648689 +2231255043 2882515952 +1320282344 1147170729 +1182685764 1182685780 +3422730319 2001216590 +2502035376 1955731989 +183820419 3263000124 +2845220091 3565946280 +1972251787 2580553410 +1835020016 510256067 +3963305989 3863332812 +4258007955 1113248256 +4244798067 3186017036 +3900988420 3207307513 +521933467 2495941310 +3588934869 3465900640 +1013332746 518975661 +489022145 2745431510 +3411458656 2038916389 +1523606638 1678645561 +756624162 1629375973 +586823060 363511668 +1088328760 1449350180 +2077498139 166112146 +2418279380 614530455 +319836727 1052765545 +763502554 2111317035 +1690133468 1914975047 +4262358998 4159990191 +1457694210 3368768803 +2236268037 2134919740 +1996845307 2416507326 +1080070057 2757982990 +2430273405 594131 +2851818807 3449458064 +536559486 2401458146 +3903162472 2761276349 +278246239 2057920158 +2969927371 1547944942 +3194874140 862990348 +804295270 3784481178 +3051606406 2881058810 +3684939267 4226357744 +1489091951 670905774 +2171237954 4237830645 +802001165 2537241812 +904546057 393003539 +2260779796 2637137535 +1357865547 2786123351 +2937781435 2377261445 +2229529723 2511576773 +2667015241 2290054904 +198466896 4014925027 +688680379 1502657906 +3163504023 2051551508 +2372162615 3421540998 +125359981 809181330 +1250097901 959513362 +7289629 3424259746 +605522506 453948013 +3680275361 2121655245 +835205521 4013072198 +1819496043 1819496059 +4266615967 4126893640 +442713690 571554550 +4216867018 2247798589 4216867034 +861192581 478969753 +168869817 2438844471 +7064851 7064835 +574463691 2986408322 +3756085025 2427425014 +1661758770 512746931 +2013343558 2425341830 +3688141400 1738694811 +716704934 716704950 +2387878253 626019385 +1919235760 990289827 +2192755055 2061165703 +1100436724 3832945503 +2306241587 2558061658 +3672882258 4078531845 +3279668904 1902435013 +1542004637 1291633716 +1623783567 3948890382 +639029985 2392702225 +2627549185 1733181391 +1594805007 2529079997 +4264115085 2817048292 +2509644604 3076093799 +2886477621 2199211724 +1507819142 13905121 +2530055305 4003517368 +3940432852 2413309615 +3743364744 3324172299 +213454009 4201146014 +1209435961 3027689150 +2781314213 3015746915 +301209348 1195391817 +1067021958 1146081018 +3612966091 3437196180 +1978120718 2848580614 +752607784 3712403296 +844336626 730362853 +3687207430 3278838181 +2638464328 3652161611 +292405484 2502603830 +1745631852 4206061975 +4136047094 685875670 211895879 +2819877094 2102895105 +476716391 476716407 +1630295338 3742952850 583667995 +4142145018 1362698149 +4018294572 2240118580 +3751603149 3222846331 +1562832215 3331757817 +3479327232 2473044428 +2028753374 4024228354 +2742001820 3738266931 +2407482789 1159956985 +4186289970 4018096789 +3747195263 421909217 +1841621359 551589471 +3726859031 286739075 3366479152 +112814409 3739270638 +3980970695 300644932 +84924220 871355239 +1348885141 639670428 +2680610825 2680610841 +3980662491 2534687167 +312191919 2378845137 +4279600123 2313077796 +2411977334 3343968199 +199838945 487970100 +1950115579 1950115563 +777679174 1688195909 +3095294034 3095294018 +1947839918 1919707385 +2200012313 2589821510 +420397354 2621052173 +1513572456 233035645 +1253756837 3155359331 +860143846 2604378654 +4060254510 4060254526 +2417152880 1549541596 +3195992670 1071915519 +2446155182 877295865 +2940570210 864600950 +111436883 2694967117 2565400042 +272955301 1100077242 +619829512 817407883 +988074528 2570940607 +2738108802 2773565400 2480376809 +2369228202 3114277381 +3461742235 3851111973 +886769865 4258190456 +2893189975 1102748481 +1734704681 2940585587 +1979580250 416873149 +1285529547 1783139458 +4258587025 4184718167 +386628012 1342294032 +2527445151 3320724040 +3910470943 3977979809 +4066011084 4046101509 +1334503602 222445645 +2664704238 2631546954 +134132360 502467613 +3155768612 3155768628 +2754375995 2901819378 +2050728889 4279428383 +2596241735 1135989842 +1894802732 4134487127 +2686585930 1603885165 +317260951 2048368430 +3790258761 3985627374 +782312366 363539193 +1792862487 1354952486 +3013248388 3993609839 +1223218268 579226833 +2525157553 290537280 +3231493619 698733964 +3439162887 3477255955 +2129023869 3917922 +3203619663 3893935448 +1837979181 2726209746 +2164336450 2444398505 +3064832430 3365946425 +2193228036 3469711711 +2704377729 4024832688 +605107611 1423534885 +2987977996 1765616104 +2985707124 2595285145 +347146505 2612082990 +383768683 1835118708 +3681022119 195024608 +1275784020 154170681 +3139907335 2459810660 +2086913599 269554984 +2024247052 972906295 +2076675611 4129600653 +2346210024 227181355 +2438931081 2438931097 +4001517684 1184186132 +1380718069 1380718053 +574463511 4261404208 +3320063867 2035995688 +1241252603 3099514220 +3016395384 2900823420 +501580783 551615291 4283347256 +849031232 3930911941 +2278398470 2857845215 +1517601465 3173125256 +3049601086 2797434914 +1542684822 3189639075 +592468077 75182980 +1903283103 891521864 +248160475 402974796 +693940450 4276777923 +2861253182 2861253166 +1006191470 3613730351 +738843517 3498345940 +3078371734 1854842663 +1484574715 2873421992 +3261787917 458641764 +257562433 1808964438 +831016439 4036148176 +688284566 722388273 +2631961534 3011247113 +3897176081 3184110288 +1919617334 1417641991 +450384848 311160949 +3557023918 1880797689 +2521898619 4138157253 +1860112653 3535284338 +1387245006 2541649231 +1604147513 3182654654 +3345679432 1204317380 +2450317103 67172381 +3388029617 2545902758 +627507939 3291056970 +2375991963 2347522564 +114081589 3914399850 +3668674185 3092376223 +610836276 2226298585 +1944994474 1495652405 +2044369027 71962947 +2040137571 2837851363 +1454586433 3173299264 +701532286 1363598943 +2735417059 853616080 +2243413187 1128972010 +3776524952 1826777523 +2091876989 1512445374 +3331407968 4138227500 +3259353472 3259353488 +3301894990 3097338874 +84458182 90643066 +2162404905 3551788440 +2599960264 3695117100 +3033982925 355853607 +637931895 1385004624 +3639940766 1871289023 +3128341215 1742443784 +1108675489 577668049 +145642654 1215247551 +3377305475 1747288874 +3248218921 4050033048 +883097466 1944966998 +2280727590 456584689 +3048293188 4210937982 +2531474947 698405358 +3694570989 2534657042 +1537509815 4211395344 +4026325230 4026325246 +838554425 1975811907 +2660792471 405763831 +99308875 1673641592 +1763650946 2362056709 +3090756893 2248184596 +2422820815 1753989831 +2786506564 3116531721 +1296049440 3153752421 +2354990233 2440205512 +133531717 3431302284 +106677398 696198497 +3387214243 1982425994 +1229637730 3266933315 +1407229127 3516321088 +2636024393 2636024409 +2303474234 1560258909 +3181252594 1909660147 +2561684179 1937134409 +1872025595 2723151908 +3769885030 556520321 +73929759 2607286411 +1131264988 29277009 +3846417861 3846417877 +3063205048 3137843027 +1892713007 3342659576 +767644553 2396584677 +2801651436 3408458342 +2075314009 3070636606 +181358833 4116474736 +3458755789 1453541042 +1049971647 1141259710 +1040454665 2842397230 +3238773396 2038648560 +3433439111 2961416576 +449350211 1823582058 +3721349113 1262695390 +2993778996 2993778980 +3632156056 1725179469 +4117911859 4268515896 +1107801903 567573023 +2446839925 196945980 +2737383625 2731226232 +1175601196 1969833303 +2794988875 2357376258 +2072568501 763159292 +2442322873 1955481084 +2876416316 561238385 +2933612308 2933612292 +1117469942 3496015687 +866631219 2215668314 +1544035857 1544035841 +3008856348 1858092817 +870038838 3639270407 +3348595544 762107620 +2184407137 1475170464 +681933878 847415569 +3751424309 3832212771 +2853180136 2936199642 +1260115329 3184597504 +780447890 3422171609 +252905987 3187196604 +3088371831 1069820752 +4148105255 1598451040 +2978441859 2740134512 +853304137 2202503096 +2776646421 2649332252 +1101080634 2326942539 +3093771142 2645760086 +3688581825 3677793728 +1850436115 3600913536 +1278071980 2552613569 +3577665395 619522586 +3262801668 716188480 +3726150942 1385046602 +3565256233 4102966670 +2051132481 3063188054 +1005587139 4263203254 +2244824362 2337187219 +1528718869 1508560298 +2807558404 3989829956 +3897521652 2836836121 +49656314 2730962077 +65414901 3797455212 1346892083 +1424334441 3645409599 +2861765921 2794078944 +2604339553 2604339569 +2581594361 614559448 2581594345 +1776011493 2315075706 +138426066 2467990381 +3077557962 2193840842 +3473805911 1244061424 +2869128165 459463020 +3095162084 1340041983 +2283470126 1887211375 +2418517485 3681170436 +3796436069 2419219279 +1999370890 607872827 +3600009907 2108168140 +797402095 3240251694 +278430162 4061420947 +890884320 2007224499 +1005128476 2825531274 +382891633 3634033640 +3672047927 3289311632 +2049882628 1536087113 +2120127425 2950863062 +188084392 1307170923 +712672791 4125169200 +2207663845 177314412 +388901729 3735964086 +245400363 833518772 +2851674411 129085657 +1860715843 3668248700 +1547721524 1833931471 +3645187635 1817647130 +3098990291 3395656495 +628981796 680573097 +4171934525 4171934509 +185296607 1106440456 +3278235716 3714884361 +4197620831 1017915806 +2869747275 2420240386 +2501088922 1205212258 +609152689 2827109696 +2063627114 1460247354 +101520627 3823069372 +958704566 2864336785 +1304223264 2152836211 +684279055 1138210456 +2576692615 2311275154 +1327052037 2309912282 +3724113825 280449632 +2039848898 1090848958 +4270742087 18357718 +1323473837 3686469970 +3251097896 1274143043 +3804314034 2821575461 +3406126712 3406126696 +2489581812 2372763673 +375199919 314582075 +4142529232 2719942461 +54760462 828510735 +2747302582 151283346 +4216335310 3793781586 +642131219 3816091117 +2397642116 2096723657 +2884253759 562040141 +1494832583 3469933764 +863157134 2342338713 +360839687 3801913622 +2532254698 2222295373 +3723244269 2378120692 +1895927248 3044163189 +344467802 4282506097 +2899725122 2460724482 +1124812727 1103226118 +3843717740 3843717756 +3477358069 1900112794 +4069306853 3095137132 +231480523 2203145090 2122541455 +959975461 3371841866 +2256011014 1036811590 +2357868551 1150694166 +1491261194 4145579195 +276065845 3367180947 +4291734261 371009641 +3531501080 1963413453 +3028489834 2489075922 +582871348 3174442280 +3191724236 1197230391 +1035944807 1163899748 +3865333302 3857129223 +2735910363 2300275894 +3399306384 2241824437 +3208845579 1133152312 +1031362140 1537490704 +2156143114 1510053307 +972201912 4042354363 +2195053074 145115717 +4096265817 4096265801 +3760515682 3835351403 +399738463 1026583905 +4251426605 1152763513 +186675046 221271217 +2125681143 1800013766 +1947538829 1244720356 +2375032602 4091606525 +3401459515 3401459499 +2961896512 2961896528 +4294211992 2245749339 +1326008858 2278792634 +4279613274 3237810997 +4265920195 4265920211 +3336070874 1160055434 +349208303 3006779950 +3648920295 408736361 +3351932175 2031999322 +4000364743 4000364759 +3367914379 2391862228 +1208229799 92132342 +3792753731 2931879590 +2117551760 1090786467 +4132060353 2631560860 +1551516872 1551517405 +2607792075 3931625108 +2667093901 3625753330 +3818243059 935557018 +1465478387 1853855870 +3134973569 2838224128 +3510285826 2161481245 +1236562742 811012121 +3925412299 2906793675 +182819183 182819199 +349564658 1597215161 +3109871605 3258224316 +847108518 2427270327 +3565710017 1405095360 +1287067046 1781994561 +2816168972 3424332832 +2618883984 1264209827 +1253311683 1550024426 +2364669210 4210126827 +1369478697 2831966862 +1813341699 682596028 +3352791265 2035055158 +3971285862 116677015 +483389796 3210281057 +1248668811 2417462808 +2490125271 4275008842 +2140926743 4185894192 +2797167449 3470222600 +1870515703 1870515687 +962533808 11890691 +4018352706 1300766186 +114755907 126063740 +2854233323 3147439604 +1947628034 3243604259 +533752510 1775654285 +3842150854 160743650 +2980818670 1531958690 +1219414086 1219414102 +1039708461 3145656786 +2748688149 2219263807 +1747328381 1895852994 1895853012 +3775534194 3034460019 +1719553041 1775353542 +2585940188 2956471120 +2679351326 2245109545 +3734721672 4135981579 +2764778493 1758871362 +2609432068 3696212063 +1412898462 2238636735 +18275668 4022976974 +2239914137 3309179080 +296355769 2276075560 +2213955638 2213955622 +531116145 1187267046 +1421769356 4091210337 +519565134 1247300779 +1973527717 750128655 +4210178050 353232907 +1546459913 604081966 +2428355113 62432920 +379444929 701706104 +1907455305 1130078702 +806985418 2186606587 +2006392582 1223022177 +1103276170 258953517 +734880239 3813747512 +1034894053 4292458099 +967410923 2967223796 +2609812727 3631513808 +2777167577 1852725150 +547130000 1952283883 +1743430277 459134796 +2727514642 2727514626 +2701223845 4027154425 +3656837949 1555321090 +2492558698 3449706870 +3799869215 3799869199 +3628885665 3823642493 +4088238886 3493772817 +56211 3833196643 +3154083040 3543241907 3543241893 +3620389484 2928977144 +2971617242 2923306026 +149845694 1960921033 +4151013339 1495340498 +1622599313 721924150 +1153853704 1280792459 +2971816516 3150979375 +3754269683 1027916564 +2089601370 493321073 +3322297095 3268340736 +1835073295 1051821208 +3005986485 3268452092 +2746068186 2221349675 +1573973317 4108682138 +3911162812 3099732199 +3401997369 1790870781 +1994723815 295382688 +4204980488 2524239773 +2264024528 1063511669 +2412978464 2304583027 +1834273938 2927495621 +2589393308 2465695879 +1137384600 1354629965 +331689753 3691414411 +3822494292 1456205931 3802393356 +3880376397 1715437883 +1013344588 1013344604 +3544900912 510130504 +753291567 3717319918 +501553765 1957203180 +3564499132 833222641 +3728781423 1322630830 +1500699441 1500699425 +979334206 574881183 +2890396295 3158493846 +3851121910 249314518 1351163719 +2541777273 2511425319 +1355057654 459615825 +3145248865 844142224 +1220726483 1571526202 +1285880365 2109870491 +753444375 1476070578 +2810780740 1547500344 +1252739063 2191673808 +654859609 4070357054 +4073955502 3399563213 +3420343932 1794477351 +1720995737 418747496 +2856817113 3886717086 +1556015087 4018609464 +2989047903 3211777195 1431743336 +3524228591 2639701806 +2871128876 2871128892 +103739141 1246251289 +2303724288 1681554744 +3901621798 1033088471 +808860330 2405325197 +4201223841 492406470 +19027939 4116656026 +76109722 3628617077 +2832047687 2832047703 +3839637309 2984604908 +2680512727 1521971814 +1181143434 3795494026 +2200185001 3586509311 +1515075 1734648682 +371913320 1302043051 +1627073343 3932492840 +2219221518 1227955215 +3621151643 1635699986 +2758514724 1695243817 +2669721950 3733180137 +3414221592 2500527840 +2363194951 2975290045 +2791625641 210460441 +2292005147 713090436 +1481941365 2184850236 +3026448762 1934959371 +2599839648 2447712499 +2236515188 1318645657 +2577111319 4200354479 +460294206 1855158687 +3343389751 1671461044 +1353384489 1340463980 +1369918959 1847956625 +4138604662 3741076566 +644296443 1869542706 +2662023717 3969458227 +2898292717 3757060635 +3718278215 3086235460 +3677542063 3221747064 +3500524105 4028989102 +762361950 3362555433 +2107163481 276530455 +1434627044 2159319039 +196867590 625655664 +299743865 3354915311 +2578346530 311129070 +3788677522 734452986 +2949334556 639201800 +3403048855 3867480752 +1711738882 2877985534 +2350183631 1409114574 +219364968 2054303875 +692313196 28892033 +2167821857 2307495392 +3807240807 2742773814 +3332900513 3332900529 +3962752803 4143715338 +2465367150 779137562 +2872661451 1447169684 +2651773925 3060017530 +2551107556 1129399273 +4069915403 4069915419 +1404153208 2870440192 +37546710 2442286518 +2033602302 3464387017 +1228533854 2131520126 +351566998 2464161831 +1107329485 3016512946 +480007326 114953736 +1769565625 3274160680 +2313333861 1840686926 +1640624491 1046025247 +2520042762 801815834 +1474591773 2041536948 +3541844249 1853520478 +323758557 1038477026 +879651272 1372620235 +920057084 920057068 +1485142999 3922743022 +476424810 649946323 +1347852309 2878617219 +2139220045 109097266 +3289646289 153327734 +1144399037 3157483085 +2157332251 2274488210 +3732382827 2706887805 +1328421477 177442042 +3131050781 3874586283 +2622954279 2622954295 +2864690830 3955069977 +1772553942 670024423 +3460586654 1402850473 +3217486355 823942294 +895262534 1187953441 +1773701234 1773701218 +4035978053 4035978069 +1105183419 1849658482 +4204297351 84674688 +607118018 1992553247 +1772576376 3396974308 +2624603971 2277518954 +491057724 3466731031 +3874286750 500313441 +481185631 2582196086 +3544447549 3506630164 +2906723204 1097971935 +1525189455 3006625179 +3614220095 1593749566 +4246925759 834785267 +400073855 151712766 +3370336998 169356999 +1561361746 2318879080 +2716554186 3581229653 +2849840706 2836832739 +597056469 2434344044 +1132122388 1951208683 +3129327960 4170145165 +1281646598 1208166775 +2462172729 2405661705 +3948502559 2628725448 +1899409150 924154335 +797758817 1001646015 +1722621515 3985027074 +2623351002 10964797 +3344874371 1562455868 3611122535 +815202216 632583531 +860140844 3777573953 +2160942870 3248138482 +122222780 870289383 +480646649 480646633 +309097113 2578999006 +2674119425 2258764633 +2431802844 160022855 +3987335179 252373259 +1930186754 1930186770 +3611066845 2398198353 +2273020559 3514251121 +2450574325 3674235290 +2100324549 862711825 +3757833110 2425813674 +1767893079 955957478 +1232570817 1747835584 +378625108 3901298813 +962376253 560997666 +2853110793 595302959 +2677373015 2404151526 +1423240139 1078556920 +3976250018 3123864835 +4215448881 1685135318 +4144391431 752008708 +2378124074 2061752832 +1377637136 3204488612 +2461468427 1690482639 +77811335 1551205252 +1034347675 3177093212 +876655239 2913699716 +3249461441 512026096 +3023919586 2660531925 +1891668746 2753760883 +1341098171 2434023026 +3494718716 3494718700 +3708804715 1794843252 +1982979781 316986359 +2283829595 2787052114 +2925630516 3080474063 +2259321402 946536797 +1841470474 1950531429 +1754752895 3118821710 +3013761518 3063124399 +2576063463 2647026848 +2979800614 3201306071 +1029018342 1055319079 +3890590352 2660767925 +2492283238 3608358577 +1727432127 3574893502 +1564179709 3248865876 +2276019372 4090179649 +3290095358 3024947657 +2417370042 2257536661 +3844760850 3552385875 +4262338598 373070807 +2108189156 3021910527 +2292208707 1466213738 +707623628 832065335 +2138211812 2236139007 +170055358 3000503561 +2839570621 4157538228 +997495548 1550554284 +1577467523 1577467539 +2394407216 2394407200 +2978672080 1303666293 +1726356790 843054087 +2557618279 2212601956 +1041535455 2144248395 +1569383972 1705527999 +389247724 1912465815 +3628515091 3208212864 +3615369614 561280935 +1316410898 2534604371 +4200933338 2435790755 +2222686550 464132863 +3047880806 1646594177 +3011664378 2419303581 +4214413393 3255469968 +3941722952 584409693 +496118710 1125830535 +2695268281 2670176296 +2909427885 1330819091 +3013443263 209582716 +1850805752 2711158139 +2249941754 387764125 +13796709 2959605228 +2982252599 1821136052 +2179701218 1742946005 +1803148425 3117820856 +3600911954 844303123 +4224629713 1307486070 +2501928310 325570942 +738284774 739812865 +2463212096 2879550660 +4070186715 118702522 +1540061646 1330691929 +3145376432 3524139779 +572996476 1016359519 +551830883 710490844 +1507005136 927374709 +1693645005 1760221199 +609710147 609710163 +469405524 1601151279 +663154133 4166583930 +2604599442 4131028435 +3699158025 558027320 +2361160057 94806376 +845022759 2985758334 +2521954060 1785857824 2936530913 +2233217503 2165486236 +1192917994 1975405558 +2655525125 755340675 +31277212 2337060231 +1285792121 1285792105 +13682675 1001046924 +3065779239 2181878308 +2678814442 1156330066 +425514805 572967011 +829693655 2966195302 +3852629953 892804337 +985086308 2923965775 +2632695554 2632695570 +1976104136 861492939 +899028343 3527658054 +4037790908 3009220483 +474692476 107914289 +3454434958 2950248857 +208429560 1761586362 +1180136507 4138465517 +1983955815 696071026 +293061524 327737849 +2780845263 48981772 +1668029386 1294974701 +433129555 2589588694 +285818724 898550399 +1047586330 254459893 +2840382741 3177584556 +1497307566 743795961 +2246505769 4086558606 +850001046 205790561 +1009445272 1334688333 +10194753 904037184 +3783251083 2268829378 +3834509699 1316997436 +2426586097 2426586081 +760080925 631583960 +4228697781 2099865322 +1475255441 4255152208 +4282326233 3618022409 +710075331 4003847037 +3953357591 3953357575 +807349213 3614224427 +2906402664 499032235 +3780104598 1185345319 +2639692470 502271199 +594405902 3557258255 +4152974830 2604588473 +3074313347 3758737788 +1339410432 889130971 +1700154608 1994071491 +4035286201 4035286185 +2691921366 2318358711 +224593834 3169128589 +428310535 927894272 +3061459296 2723095091 +2049984101 2049984117 +1825047754 148867579 +3200374290 1740278590 +845346763 3022754944 +1537693516 1537693532 +2739978853 4136490378 +1356757898 3579040903 +2414173393 368095350 +4251564459 2825871730 4251564475 +3462471863 2582020112 +2708137522 2708137506 +2836327327 2836327311 +3681565428 4199833375 +868429534 1514325887 +1256836155 3168709901 +2794933807 1865421809 +2736410916 3865951167 +123768546 341057582 +2092634443 1614669252 +1013733784 1778910831 +3889701221 2439255877 +1759754700 1351252692 +1177203997 2453347508 +438659965 110396244 +4052446043 2574909522 +2508236081 3503623213 +2863491912 835803252 +2210083556 2210083572 +2167704311 3283398004 +3355145998 3738987279 +2490042717 25148770 +2024974734 2403396249 +2761030131 80509324 +424040140 2512036663 +2513265815 1767201190 +3596041126 290645591 +2000519781 908629404 +2824884999 2720095250 +2642431113 2046327726 +2191647014 620592230 +1699179401 4167977134 +2751712641 3002892800 +3006402855 1053884534 +972235798 2152161765 +2718422167 2840832432 +1143077480 3563697907 +381972836 3253268330 +3873569653 3938375978 +2094092353 3196147286 +2926103645 3959010914 +176716990 1390173961 +3287453219 1762787165 +3039278587 679705124 +1075351623 2757950291 +1847376388 3471687455 +2743987378 711695397 +129638759 2432865568 +4034292966 323243569 +2328446799 817346331 +3383339727 790320826 +3064867454 304931935 +3376955030 1924826663 +1936300608 4013806277 +3681354915 842176902 +2199999122 4163398970 +3725115597 228532859 672316964 +1577084352 3131059525 +2466305838 960509359 +2634680942 2683484910 +777034315 870507522 +2370970163 3261782662 +710590727 216651263 +770923295 3533464861 +1879239200 1956024435 +724147426 1268320234 +881050369 881050385 +2154308859 519190322 +2812082404 3223047913 +814932249 814932233 +470622646 3891370369 +3369270303 1126360286 +3765574062 932607242 +3024880142 1229163417 +3466100824 2942939866 +4199524876 3134091831 +2865858683 1658444205 +3031801614 2280219417 +952289349 2678146188 +4051391304 3029313216 +4158794855 2685134390 +327852106 221926523 +2975756123 1318822463 +1274994266 3006532582 +3439881900 1883650241 +2430726493 1890514292 +371389316 1560631497 +1935126664 453699101 +3895308144 4025167171 +2777783535 4234230842 +353340283 1489657951 +546060288 1018963973 +1029922696 1007143856 +2921471476 523013193 +4066864792 693163059 +4089847768 490111228 +1931423307 4156384478 +2941730215 1944208019 +280123586 321969144 +2390122899 1899239424 +3852953864 4157070837 +635383017 2167358080 +4241839866 3940284886 +3829903220 1592539615 +193552340 4248951471 +721336473 1207736520 +2087004214 155077905 +344358373 1528156089 +3614553741 3036831716 +4023227404 2359299831 +3077517861 3909873722 +3373827554 1939522243 +1417706229 4215377852 +1116370564 1140363721 +2228798966 390046279 +1609801405 1609801389 +1071890085 3012414429 +3034360357 3697268780 +1832673446 2776548954 +2356114948 393660511 +349405576 1302839728 +3866812514 2691709993 +3611037164 3213486721 +823624281 2701275656 +2450494208 2138133211 +1951583576 3335874464 +2121653550 1099640697 +4114002411 4028241140 +2963368569 2266668158 +2827834557 326919554 +2386022997 920656842 +1434175625 450670520 +1673687830 555428775 +2939846300 1964330897 +4292828120 2761790747 +1441772456 3611215829 +3750501594 1075264718 +165318453 199001496 3920742185 +3665551093 2428372451 +763012721 813835008 +3641227492 2361069311 +3008288608 3008288624 +2804323161 1354554942 +2824416095 1667188360 +1492342344 3564944227 +4077076465 2175801494 +3738596903 1267926052 +3312923439 836337639 +1213336146 723926803 +2491060553 3575382328 +1622780804 334249071 +448734204 384148913 +894750844 2619217814 +473792324 4083650524 +1113363483 278640220 +3183363058 2478988254 +3728583903 4201391516 +3210896821 2139568659 3597061686 +1985268005 1819845946 +3891890872 1517140444 +2071450399 2090949064 +1155943097 797417790 +3040571951 2073346040 +2198380607 3659564365 +3683540180 1964777903 +2613149214 1335462185 +696734744 2013880781 +1477169489 3081320599 +2107932335 2029219182 +2578981916 417388561 +3742554178 3742554194 +1541265010 2557593032 +3401040926 2920395082 +1369585272 454449478 +2313662551 2313662535 +2682171705 3834707134 +3547785850 1263841366 +1204580737 2278993408 +3663283400 2665330032 +733588155 2420622436 +2308111069 1868622324 +1652898231 3468286726 +2575362957 2383754959 +851946880 1361616404 +2614583898 2614583882 +3890613606 1965496215 +1911186273 3036311990 +290060906 2708813005 +3346270424 3551128589 +2043336482 3696274051 +2353196572 4032275830 +1640902339 3130236138 +742792901 2002939930 +1724272160 3928816741 +2501422469 987310156 +876071684 936679241 +2302934314 2302934330 +1060929508 3672929508 +1537218945 739323832 +499664346 1595621139 +2269444362 2269444378 +1543191404 947817224 +2353991064 1484924211 +1104414790 1373749818 +3583135003 1347379602 +4070140950 4253361841 +684296221 1899546252 +2031288603 3196606175 +1957172258 2944896405 +1996670783 862422341 +2178950740 3353105977 +3904683586 2736751075 +1291135977 1481511256 +1978958868 4041424628 +2526701082 53495345 +2123639933 1844694974 +1432400139 1916187714 +3170575625 1580040211 +1851207150 2705149359 +3296203000 1090696827 +210585891 184631137 1108587014 +1052432697 4053419785 +879059724 1507939127 +2157994024 2812791606 +1665134974 3148425545 +3193078678 1509390391 +2868370642 629778361 +2049953072 2302673557 +940144957 2065941557 +1479446336 2719506813 +2174183037 2174183021 +1519926236 3719263076 +1807067589 2362788441 +3791598616 1236258663 +4259078989 1448174770 +2065057622 437406823 +930344911 713202718 +2726892666 1472936971 +211945606 1762880225 +1664856436 3186953183 +2176302732 3225482871 +3321063922 3996631949 +1596403802 706093178 +2952716530 2952716514 +1252885372 187038769 +2299576635 6303730 +715822298 1238940278 +2348895811 1381516310 +2588228352 3673940243 +704287769 779559774 +3857119552 3590636315 +2377289267 1125505626 +151983780 3871384639 +3149098937 880336936 +3248664549 1280786205 +4214848611 4214848627 +2375418813 2375418797 +1153541293 3923131460 +523989010 420002457 +3946514297 3337405310 +2049346465 3868777234 +2548706838 2548706822 +4142118723 3950607996 +472441219 1078129008 +1698771557 4220242902 +3482032612 2630042111 +286908896 3418264485 +2378552033 2070199568 +126534620 126534604 +3336224193 2948042093 +2836966622 2507036762 +102367648 102367664 +899069106 2647061926 +3623282577 2529302838 +2860500124 34473153 +3793989350 1696598432 +3103614512 1726471573 +929212076 3695993047 +3535332889 965495304 +1480871290 1837496075 +1052004767 1423736136 +737445628 2397454039 +649482279 402664800 +1867039540 2437339627 +2681865090 3583890695 +3078401976 2578955464 +966218353 775730525 +739549170 739549154 +1577471246 3464591936 4038406586 +479001033 3027529311 +1689249040 3215236306 +4060422665 3964467487 +3764827451 2091863026 +4197378775 2933633136 +3284208090 48398882 +761434021 388505772 +1496098007 143395412 +2738132012 2920109274 +3388805814 2942596241 +4227564276 2700027417 +634344212 2573191289 +3440793303 3440793287 +1592872754 2816453555 +2639943358 1932954911 +687618584 2635035597 +4202200383 2326604328 +769445147 2760178828 +2542659515 1331940210 +1957080784 1957080768 +1284338226 3031090355 +3180205490 413935411 +1736070230 1736070214 +3927362484 904047705 +3328371989 784817185 +2574573141 3069858803 +852495608 2009810511 +2768410841 3045210127 +3688692647 3286247392 +8626894 3425694749 +2015660007 142733472 +2569282252 3756181288 +4085996763 2367649928 +2617425508 4233213801 +1213748154 2634796491 +483938974 109711039 +409160346 1155305169 +1362352575 1508911610 +2584231634 2540512921 +2936106085 2936106101 +244403940 3535745279 +2568095341 2730846299 +1271743134 3878397631 +782438482 3165827347 +829764677 545343642 +1820431585 1820431601 +4289746030 4036290863 +293585654 3409717693 +2327860744 1959227037 +1797295427 3879624828 +3110612501 4093676316 +2076566445 104486165 +302922724 2099852249 +1241615673 3111211191 +1645897246 1780053289 +389423488 171359365 +3172186849 1901496488 +3323820863 526976062 +667996547 1111989495 +2970546912 757404216 +3302367090 4004721946 +2065118961 3062594918 +2257234549 1095390780 +790979431 83663378 +806540914 531076467 +3909403815 721042656 +2718021164 877797309 +2113666908 2947743185 +1912891695 2884736238 +960098034 137570035 +2757599722 2842026829 +1465675721 1334049144 +3336890293 3478700522 +2940986511 2205732110 +164526815 1326148894 +1419229571 2916682044 +291636551 2756595392 +2406611244 4234887233 +1394103769 2823759006 +2439535508 3350705225 +1392012232 1695656925 +3211203088 1598123829 +4066810059 1652721538 +2324217319 374726629 +4114147941 4114147957 +144956685 1168626802 +868389188 951363517 +2533493419 1664535348 +2973375740 4202406065 +2373134486 184025254 +2734478626 3053683861 +240069647 2140496475 +2301871310 2301871326 +45574304 431606552 +2519969379 3596322268 +2418521344 1228754596 +1563265933 2947205307 +3613905447 74922169 +2636442391 2015237424 +1456691693 2612432914 +1020900533 1698740227 +18455824 3411165219 +3236578827 4086270965 +625042339 1838387344 +880860844 1390315713 +4086173999 2544176366 +2055173359 1524552748 +4080098860 2936596934 +2501471571 2501471555 +3899189806 4005390316 +4264770177 1256619441 +1629022746 4097345277 +1460359156 1230940919 +2213973529 2213973513 +2236255644 1885138055 +39033253 1101286847 +756128996 3602512617 +707904012 2018801911 +1933959500 1933959516 +713486976 2188368035 +1033717640 2258082571 +4061255671 2400824398 +3167835162 1468491005 +2886465621 735571420 +3280061129 2964884512 +1448700659 4069175392 +1522730965 3053802570 +3715026656 1970252453 +3763696522 2961498683 +3514974781 219039234 +3168159602 1582063870 +1143160198 3380206049 +1278317888 839775187 +2851848652 1666323511 +534767264 3447197171 +3383275239 3159870180 +2036208604 3944301400 +4291617323 3666348468 +2291401912 3104009659 +2289264043 639514062 +2901412739 3757517671 3236044604 +3667583016 1238294251 +1224200290 635476542 +13504568 1063589724 +1410457342 1445071327 +3587860968 1592270975 +2711232962 665003107 +900603627 1813687284 +4115482051 3953447402 +2874093634 2874093650 +335383267 1528931146 +1406836222 1828299178 +646249410 1700287075 +1805164339 1805164323 +2475380010 3229132410 +1876336970 1668900531 +866390298 1699146749 +2480419947 2670831583 +1059004370 563223674 +2424037022 285176511 +2140534058 1192220681 +1221525807 1221525823 +2924915857 1957939154 +155020919 45409606 +3296467296 2942038579 +3200990044 3052302791 +3602883356 3750579364 +17909067 3606451125 +3433177248 3275316197 +1336689382 1378701313 +3881848875 1048539887 +3113184683 2691106773 +1468161729 1814223846 +896945715 2300429009 +122743061 2573134876 +2967413584 3208943331 +3898424398 415624921 +3767969163 405182914 +2678495480 1262669421 +3100852726 3935360583 +2642831014 2694027095 +928747197 3793859458 +1100576127 3387797308 +302584690 302584674 +2396468602 2265292697 +3596481811 2296958202 +3798088743 2275717494 +3655509454 3452633945 +2160957277 547702626 +702912242 3154004846 +4140245826 4140245842 +3301193759 3756284104 +100789804 2701782849 +866496176 4258397955 +403962352 3614602435 +837332450 1749918093 +48949845 3972981724 +2648046361 1704979432 +3104998361 2375724651 +2772163818 121422925 +3538864122 2378102126 +3604405729 356469024 +3161248162 1095631363 +560683512 109437628 +2551762233 2819297470 +115378626 1147108482 +1768957680 3184230747 +169963782 2617201521 +482126588 956377777 +1562572503 1963627622 +3471344821 1829300450 +3287171176 3624887211 +3717386720 3254574252 +1406239309 2564996357 +1224736387 1845340202 +210598995 3773665495 +4023115733 4023115717 +347997840 925127843 +2852582802 2835764023 +3300956491 3550651000 +3440340489 2866180217 3628742702 +2338336097 3378999231 +4175374324 3614892436 +602061757 988646036 +1794593134 3512021049 +3246591294 3746420873 +560927950 1876803663 +2584465952 2999435940 +1358554854 1358554870 +1591742680 3902660723 +3108079141 3108079157 +2431755825 833784001 1567137574 +1865089365 1865089349 +3069048911 361658011 +1481821735 828016502 +3319128627 2729645658 +3492865868 738918322 1700254962 +765033032 2177466229 +3847507430 3921060097 +671290810 3067818973 +126053387 3739424084 +3156754190 1096499993 2504311109 +1172520948 4173180175 +1295891573 221228092 +4144865814 2653130227 +2878070913 2385668864 +1678999315 2645625594 +2504871401 3831460799 +805502011 3823346958 +3315797439 887857514 +1914533455 1914533471 +4077060620 2579249377 +688884728 2608420708 +1398701400 1398701384 +2375281176 4158227405 +3371083801 1304057237 +4037708270 3396805049 +1468344422 748591233 +2391937736 938709195 +689585284 541521949 +788075891 2421308753 944283382 +2727346553 1639076200 +3685547919 784563825 +347321210 283347211 +761024512 1750200339 +2606388120 389119755 +769829638 1104362103 +338413888 996021019 +777226118 1937659873 +1092920562 1636234893 +3773649606 3684257185 +2539878101 85407610 +1486387531 401441400 +745779010 1008526563 +729239962 729239946 +4093138029 988842706 +1015767128 2808654477 +3048823815 3048823831 +4168217846 291807047 +1097999291 3249422194 +4254720780 1161849825 +3473595332 299827076 +1380509473 927739901 +3245550495 2027182847 +4233994983 778531254 +1934161043 249103226 +3201374295 3123269862 +3676846287 583746838 +1618876515 1202639815 +3727667357 1645414187 +3503057243 1331104297 +2328221831 4235451520 +2080519008 2502089275 +2301505210 2914225867 +3874786213 938988716 +1118609240 1304352667 +1419073536 655984645 +3442616984 2650344795 +1419028881 1709878070 +1633672115 4242987738 +788721720 907165504 +1944816506 287095292 +2309009817 1089967048 +4237558633 100752984 +2509009821 102505265 +1472216561 775487476 +4027926599 2107724703 +973189327 531191246 +2539919855 1100272440 +3778811867 3115985800 +1283283417 1112830110 +781472346 2910692267 +3549030729 1260010990 +3738240887 974045254 +3206635401 1682537966 +1277631434 2878389997 +4034883602 2862443603 +638014183 1538462914 +3002376707 3122334396 +3790207191 2052242032 +1210245620 2196353807 +490207581 1545440610 +2005582273 2005582289 +1994514561 3563477400 +369965726 1201168062 +3203818797 849406354 +527965097 1975772942 +2569715463 625653782 +663124892 3568604807 +475447516 475447500 +746351604 4225626383 +1039460209 3080768513 +2083203491 452103050 +2413543456 2532274803 +3653187296 2818794163 +123245134 3731771609 +4146089057 3261567622 +3097655911 247902240 +527425116 3642428103 +959556711 1882351136 +1174411865 2334751262 +3686862961 2158368909 +2537247205 4150389612 +1845133125 1845133141 +2799586724 1408514345 +2506349019 2506349003 +1485038454 2020249409 +2016404885 3362154890 +1629049205 1600613971 +1986419618 86130691 +2337309425 1086202224 +4232760384 1032080909 +3081215906 4133242990 +2833547519 3239648907 +485661937 2322024974 +1254031967 162577310 +459282271 1791740845 +3207400438 3924415559 +3097411009 3952433462 +666753342 2301076258 +3720323911 3720323927 +2532127180 1667589153 +4067119768 1010834200 +2118482306 577422749 +3442371810 345322123 +154375184 2352092469 +2146125171 3529397260 +3246454564 385122575 +40957110 2145239232 +2281674272 855784745 +943976827 234169522 +2310919414 692427969 +970531161 2946833449 +3030690472 121153131 +3867766316 3251404608 +990857122 3761406062 +3153404954 4243051773 +11911705 924880222 +2522892999 1194787251 +337295168 3859708357 +48637290 735267964 +1497149571 3645296103 +883832328 1111753012 +1702252637 3097088209 +2002434227 2811053507 +145522413 2492190468 +4181927778 3333881667 +1482352962 4274860118 +343118205 582366836 +2694367750 981451748 +2617972994 2617973010 +1094998399 1033429758 +2021534980 356926757 +34485707 1882198754 +269459777 2308626752 +2149515144 952910603 +411212229 3581538387 +1823011187 2163480588 +534729296 2089718755 +273305941 233567152 +2730530662 2603505047 +2390285832 1346733724 +3577446647 1595196954 +1650987981 1889012604 +1508665362 2703742035 +1411581486 2703407727 +2110616855 1133229674 +3939534367 2616995250 +2560623925 2028483196 +1125550437 1300395146 +4145090299 2534160965 +3155120963 1327501948 +3984054135 1252536390 +980608082 1302037112 +2673498571 2788907650 +1919136941 3220532306 +3817025564 3817025548 +2492070943 985883396 +1765666151 3512169376 +38631231 3740448808 +544054012 143325863 +148798341 2067559002 +3588894614 1168691169 +3109178472 613304235 +1247207157 3747635923 +172063101 2719104980 +3472874668 2294833879 +2221531480 3400383885 +747870355 3210293100 +2350544114 2141591795 +154472472 2525517261 +2420458965 4060933724 +3797715155 715875386 +1009955676 391512584 +758194278 716979573 +490520800 3841943000 +999570704 999570688 +1992705602 1992705618 +697763925 697763909 +2549509806 3874503663 +400934767 230224814 +1644438206 176337183 +269966722 3603444643 +485922612 1084111188 +2874115682 271617109 +477783810 3601868835 +3929721072 1287574091 +1621835474 4287882373 +1972775566 2841968025 +1322903394 2198290261 +146224036 1550207785 +2104845324 2345434849 +3605459707 1217429810 +3716086824 3605459691 +404264160 3467795635 +1239532576 1852292723 +1091523080 3580919075 +3890970830 3854287961 +1807530411 1159219261 +3689684218 783392157 +1649851840 2391586131 +95285999 3755306542 +2933348132 1627270591 +3571003934 803857705 +1666848064 1569931021 +1840849803 670422712 +1834424789 4112362058 +3066223050 2633929587 +526265160 3229620159 +3901665403 173462879 +2027702694 3905417281 +3651944382 3651944366 +432169526 3271596817 +1113148791 3918852678 +397140059 3827329032 +140169842 2566474085 +3479839476 2927755677 +3236134632 1957015498 +793130544 1075198831 +4256019216 1752228387 +505275379 1859418935 +1763626346 3850198477 +3737310675 1829959603 +3945412059 242403282 +795499984 795499968 +156012625 4102500240 +2229174621 1162034347 +715471485 2669351618 +4161803217 1380921862 +1610518091 1757020162 +3261229668 2166257208 +1895914449 1895914433 +1845595295 2313448284 +908778597 2860053228 +3874501240 373181972 +2782937324 4015737221 +3623893821 869094946 +3769738097 3769738081 +398162973 2032427444 +4262091841 726612544 +2243377040 2243377024 +1214474968 2794172657 +460896078 2366148569 +3086364884 1821302201 +362707414 616301298 +69392186 3168325707 +1759264689 3239214656 +222682998 1526646481 +3224454012 722657822 +2971280717 422098994 +1413155893 1413155877 +2263381874 4129901837 +843552247 2326932053 +1148752540 1708051335 +3212712466 2239957587 +266203626 3827677253 +2576415573 1747975293 +515244467 3678302413 +3907130560 1541843525 +1136660689 2019195142 +3147565605 3709846365 2074343482 +4037743045 2569806826 +707596509 1106349026 +482245964 3715082836 +338305566 3696473407 +99430873 761624712 +2546503073 3640841680 +2146018054 636115066 +544297740 509983713 +3770544285 1744946978 +2229378093 1546181330 +1700671302 3913581681 1700671318 +3129472774 3213677389 +2032212589 471636356 +1544021174 1544021158 +3073115554 4232896021 +4105292507 249714386 +2243560293 3906164730 +2882849779 96292 +3931169625 2961804175 +1215394961 2610593872 +599470142 1983929673 +3797629994 1366732518 +2723436432 449173429 +2991301279 1276182600 +598772462 485143727 +2861865876 3997190133 +4215242927 1186801146 +1650611692 3436003991 +1204130687 2064068862 +1666388401 3219300438 +497055548 1931180775 +769562350 1031878936 +979128609 5486304 +1846732085 2092880490 +3480908015 2361378862 +1308385728 380034665 +4211862781 4211862765 +2359003958 2396792327 +2476992841 1169938711 +3320022722 2230812098 2612307395 +911079867 935338354 +2090233307 4224643012 +2367598180 3168409016 +1974406229 2542823900 +1170148969 885239640 +2343962655 244238536 +160075906 2267118773 +1930099264 1514664659 +2887263107 3537437542 +2271072781 4235397793 +3771393214 2640713481 +3602233093 84876492 +1032225315 1725316689 +2539065211 3104661156 +3404236979 521089498 +971012046 1670039378 +3705074003 4183680421 +2727474904 3284637211 +2234788812 2099311137 +2522375065 2522375049 +2640841560 583654285 +3428477383 2035582038 +1587519204 2082515981 +1065595838 3126064137 +3471117952 848679820 +1863271013 973440236 +1525921694 1525921678 +55513979 290668937 1991090238 +2469656159 1891712353 +3028458666 3550257051 +4140841993 4140842009 +2336659190 908043591 +3959684688 3959684672 +923440622 2477393318 +2006886014 2976275870 +3436048744 3348929484 +1556191819 3098754831 +1558927466 745071051 +1814995982 1533821455 +4265548010 999598367 +1872809159 2300103635 +1393313320 3830608125 +1476112365 2431390276 +127730241 1026198592 +3796530824 3796530840 +882169052 2149082427 +837711486 409241673 +1519067506 1519067490 +2254631005 3938476660 +2785279253 1833396234 +3218988882 1511108153 +521168931 451043553 +1273238036 3931172200 +3879420934 1885171158 +2657264216 1267040824 +2530885862 2369667633 +3873501046 3927504583 +3822831677 3423349538 +1536638532 1930888457 +977544582 2795773397 +3866789300 2262858319 +1194806716 3624886001 +3249077823 470301992 +4223726780 764513127 +877308019 3297193221 +3041675506 14482775 +912203548 3015571719 +2797067839 2993872161 +3397599259 3885886098 +3848665062 3274756183 +2407268507 1280378751 +3019797193 579777144 +3272345014 3474135958 +3107056289 714365814 +2319507894 1512264071 +1512733577 2044754094 +1893877909 1228423836 +3732283508 2817857177 +1172072662 3489204465 +691304276 1259009192 +1667511061 2344380956 +1568085183 3203540685 +965798159 2921259672 +416517442 1663157838 +1405357392 3378617789 +2574410166 812598794 +2632461794 3816831701 +792943486 3842574175 +3964295078 2668100161 +2309863152 2893478851 +3055821375 2258766332 +2214199975 1771187446 +2689752730 2568105059 +384054710 3208678801 +2244746315 3947923970 +4147528114 3697896243 +1440647912 1440647928 +1728847543 1728847527 +1041527098 4096671307 +3217369401 3066653798 +1169917101 1932647506 +2661087948 1320709788 +3515225391 4118089324 +25452312 2070000333 +3047974417 258256080 +2574022287 3222978266 +2992742250 967701453 +684131319 2349809833 +1766491553 1632656480 +571751795 3928044045 +3411629115 1732095720 +614179952 910161652 +2258912340 1989671817 +2147493314 2794580957 +1110217954 1110217970 +3184704417 1941790304 +3401792466 2476823487 +291807050 2875638125 +1706445204 2985677817 +127801542 2895381014 +3640031808 3422712531 +2615921566 305236415 +1833053038 1831493177 +2509493893 4240094028 +4271870327 598453198 +1342790644 2051000882 +1336999933 1889729346 +2690291788 3130900385 +11026207 400245902 11026191 +363760841 3938951278 +3447568124 3947180144 +4069866705 550735990 +3918044621 1822159582 +908248069 1304079644 908248085 +4078427015 3681905511 +3129912005 1073544871 +3385491869 2450387842 +1381809912 2684395643 +1240845253 854574860 +635709484 3526049111 +1237549986 3234347029 +7565598 2390604073 +4151509245 2265615956 +575663939 4266988848 +3019307784 2935934499 +1926145563 1527791134 +2439491067 3778470436 +1233891514 664616765 +3996467502 735419257 +2418908864 502534609 +553140005 197879610 +1684890766 2788510607 +1188054257 1792837488 +2410683834 2410683818 +259383707 4052887309 +1050347738 1745809195 +1756918710 2422089607 +604932057 2615138974 +2616612252 789787177 +3845877951 2610068670 +1756717863 4236973686 +3229514662 997477282 +3478285508 583088287 +1665658590 2279787321 +3731567639 502877059 +3790374308 3795390031 +2570956053 1360492572 +1023055476 3563257643 +2652160267 3559432256 +1376720171 619429919 +1850498769 1933132560 +32172427 2412619220 +1244513960 3217199828 +1164037751 1164037735 +978936284 3065318727 +1094556314 2539927421 +1105455738 57688958 +216061319 654831800 +3078386684 3572143527 +3445682812 1597345366 +1275501879 3188766664 +654063331 654063347 +4177998783 1942911793 +2630629548 2568827351 +1558911057 2534885254 +3647494628 3647494644 +1288948461 3731387140 +2425345827 3133927440 +249745819 3076847031 +1006224196 263938887 +975039920 975039904 +1289524081 1882987238 +1065214457 2256658085 +1450445188 1450445204 +46187735 745922160 +2212719326 1206954238 +1964647082 4052822213 +173055463 602444470 +927389209 495126856 +2034751355 1729640114 +1207857875 680444460 +2246811711 283984702 +2705088802 4094486659 +3349004431 3349004447 +4236508022 4190427857 +893052076 2008414913 +2848041777 2338756032 +2143866112 2492566404 +1746466078 4249476649 +1492118326 934233617 +1182764950 2429487399 +3452473975 1774096729 +4085589693 3554931479 +3283802577 1093003981 +3826992689 1206878000 +3012651192 3012651176 +1592432450 2907446517 +828121662 2727480855 +3903516327 3903516343 +683499978 3961581819 +1832075356 1135497432 +184425349 2338366378 +3677526057 967149720 +2385291969 2437991872 +3666699190 3264477063 +328606171 2958511044 +711306900 722410984 +405648041 3102752782 +1197045336 401861280 +575508718 2210260335 +822367005 496756574 +2853274394 959115662 +2886288573 2409051522 +3740112832 2953175885 +3683180466 1847758669 +3137620311 262603630 +260355451 260355435 +3166141361 3319248816 +4026009079 134569474 +902507331 902507347 +4008074255 597879694 +2135667730 1526819514 +4038391355 2571287451 +1322799860 2191733149 +3100570630 1043921489 +2585747809 6704054 +1972136652 1972136668 +2119152071 2658458688 +1830394860 933720577 +1343230336 424950900 +1759264693 1360812877 3350743530 +3518339169 2178867382 +215454197 744146090 +4184967087 2127414367 +3182509238 3406606546 +749421450 4035080933 +1130871447 2375459631 +3075867384 1741144518 473624567 +1841304590 3463638425 +3207180534 3835794257 +2502860754 3792032235 +2095632570 1551930589 +743452364 3248256856 +2744425422 1357989199 +3500069072 973256565 +2975909149 1482050740 +4210919727 1277097208 +3832444859 1424391021 +3543802005 3543801989 +1113382631 2099215076 +4266030725 3454833498 +1650449755 938047058 +705841293 3351786994 +1143800619 2111569058 +3925283466 3656527661 +2152111419 707363812 +1212758971 4103387529 +2406097458 4128494771 +3685140017 4169793318 +3146691625 1789238424 +2949424397 3425162084 +1455912061 419193044 +3156495936 2666524920 +422615679 646133224 +4177395605 2363053962 +175776983 175776967 +1982593778 4181461733 +3636946334 3636946318 +2690178188 2611292321 +78616566 2563561029 +1226704992 2164119234 +2846473199 87218478 +1737171741 1443311874 +2076556186 1917211499 +2029597963 3665411147 +4137020649 386134734 +4022691878 2579690433 +1663215813 1368581754 +1943530285 2232842304 +3266851662 3589850063 +2247301333 2997884739 +605816196 3458673851 +3768333215 3768333199 +99908780 4183735267 +1656015677 2677797140 +2750681567 4164428318 +3333701746 1069642597 +3570424260 3355266975 +2474703475 4213412109 +197129034 725616805 +3957792694 316074897 +3687852521 1160526066 +2560327298 3200788131 +1641253416 4176134723 +3423862402 3423862418 +1019240968 2866434717 +2146542190 1063260910 +4139770940 2887010936 +2471032887 316587654 +1768561194 978369157 +3016201953 1110428103 +313078302 2119820585 +3733662898 1757820718 +2421089429 3241268892 +313122747 476787556 +3246412293 2717982170 +2885179994 2253920553 +1273690309 1206230554 +4083155035 2065731396 406947848 +929193576 2547686827 +1094640859 177356958 +1693161972 3538115353 +460082441 3476285294 +4263692094 2528332895 +181244063 460984156 +2411266656 2688466213 +480556394 2169083355 +651938393 2231339528 +1402992680 2874343182 +193098990 1019039666 +2844830654 2898156575 +2861177498 292020331 +1603573645 65704690 +622498236 617835249 +4181577421 3045162020 +367277099 2705203106 +4185517817 3019059710 +2759258907 1462267813 +3459391473 2313701478 +2437505687 2437505671 +2795025077 1479902796 +2146065673 1727034670 +1427634919 3686791606 +3005088488 914471621 +3336377428 1969384120 +849164392 730208980 +1981499827 2528544468 +1339021130 3697285633 +3921083165 2559465188 +1225172654 1166364975 +2877825853 60369698 +2170411768 2663363707 +1480770206 611148292 +175543849 2712560270 +202166394 3298332403 +597086020 791243899 +2632609460 2807114527 +3031047092 466197593 +3388153737 1238449657 +1389069371 2439063780 +3663607411 894416652 +2471184861 2815333826 +2112872790 652090345 +2214557394 883876734 +1273236299 3271411476 +2336529089 4261387734 +205256287 2707740545 +2014694627 4082842567 +202157049 4042438888 +4162476419 2038245744 +3192576295 796761906 +3403842576 3403842560 +2081486958 24139314 +421143396 3979412838 +4101664741 3250464108 +1822908100 643252665 +1768441029 3022275091 +3853502637 1085859908 +3424591180 2700811937 +3079326778 696221533 +3449469320 4281144659 2901466560 +3544659505 3390721830 +3087749249 3087749265 +759510857 2364934136 +43488057 1302119102 +2949005318 2949005334 +3623739815 553198048 +2499173953 3235274838 +534068020 1353462479 +838085654 838085638 +3091580976 1773473822 +102947421 98418804 +2087154890 917186085 +1027598074 1704500107 +538560996 1821954559 +3954695139 4117702236 +3262693965 1897520932 +3562663337 3900115225 +3997806696 2248192939 +2608441519 1389244005 +84311451 252894870 +1973127477 4010336491 +3857707401 3528201083 +1129967225 1129967209 +950071132 1875640327 +3905367101 2928321556 +224765501 262532337 +343453670 1914685745 +1768664946 1720004723 +539232873 320220869 +3394678497 329709830 +1021873652 3591862041 +1758897942 2137259503 +4244789532 3147831781 +2518106605 865912850 +1551588928 3593821907 +113804306 113804290 +188027006 579401289 +237639611 3540573822 +3595696857 1007543176 +3503959761 1798088303 +964037238 3939661767 +941973009 3156954707 +2191551824 3280271215 +4220805355 4120154594 +746182747 1590662980 +3374312751 1498807377 +117421818 1124674499 +2055241244 4098262545 +3908211840 1413738573 +2034973299 597412832 +4076686810 1589743165 +2916087431 3059330605 +1311525776 4081457000 +3385718330 3912932701 +1861520240 452428124 +4225305344 1991004421 +1397234317 1397234333 +3017500413 526590018 +134695897 2446689378 +3358116835 832720688 +4035407970 2631911293 +1056194719 2843844878 +3568219477 2176637434 +1666994075 2992067810 +2671272688 2512633813 +667316541 3654651657 +2168501017 3960819989 +1093192712 2117281598 +862489739 2023046868 +2976347140 4026263395 +3446364653 1291751442 +210081510 2622262273 +2033884684 2842986039 +1700647647 1907553566 +1475879873 1017137344 +266973295 2078326446 +824410820 518445705 +1443762846 371674793 +2692598930 940116421 +4282002797 898990738 +2065134598 4182727826 +2932406057 1331500440 +2302757004 3195106487 +2003242315 1111092500 +3788349703 2108980758 +698074549 892877802 +2579683299 3746559373 +3110591803 427901924 +4156792785 3656685072 +3699863897 3412488917 +4294580484 2002623919 +2593933144 448651179 +2148742559 1027434846 +3045599762 3633391422 +4066267280 4201906801 +3000643307 552176509 +1792779126 2915193550 +450574585 1370456821 +3787395453 3704129492 +1218601735 1587667990 +4263820994 3498559182 +3576836926 3576836910 +850578233 141945534 +2872975762 2872975746 +2033496786 1652123514 +4172752218 3796880573 +2841859850 2975990971 +2743670300 2362297873 +1622009852 767832497 +1866745287 1020226756 +707402455 3472613630 +1647172772 2935807902 +1349894150 2942126455 +1545215904 2636105957 +993543585 993543601 +3086032885 2241154731 +1284522911 639267656 +3838256804 3380728895 +382154835 238267584 +1020796404 3157731087 +3244822495 1373190007 +851208081 1596101773 +1055263797 1486237888 +2332374002 3255323958 +1533133392 2069027499 +3739371993 3074048158 +3064612567 1695384688 +3906355353 2353699785 +647902907 2249205869 +3395103369 430568888 +141564680 1240262615 +2295501150 2271240330 2797074733 +3177601917 3062829172 +2217821353 3264157208 +3020283606 3020283590 +2987379834 2318962862 +792117669 4164081324 +1316735014 4101019460 +253248004 3341806687 +902399641 1161749214 +1743173127 23983891 +4273582794 4273582810 +3170311998 3070635679 +80568854 2773575857 +2020575691 1653992066 +2590549527 700282416 +365533082 3864635243 +1126344839 1253698843 +2121890864 1228832661 +1633653428 4252234073 +4198395788 2085198199 +4287054102 1475048878 +3806308113 924057552 +1964188274 3206494579 +3502968141 4238733348 +3103657068 267815831 +2100148163 3522709482 +2536599070 22863676 +994555509 3336845884 +1896348502 3921222198 +2579251357 2992538897 +3154506649 3564244559 +687993589 2198960042 +4041151462 355226369 +66370475 3846401588 +2436012428 2735058337 +1756801149 1418411220 +225914905 4211735371 +14707949 1313569028 +1055249754 336736736 +368892280 3255252124 +3554151425 441936689 +2938099 965950092 +8563040 300990295 +954254340 1886962620 +2183630116 138620841 +3489658757 4109543002 +2570301179 3011819635 +1128337091 2839412912 +2739634415 4275828792 +3217889315 748265524 +1225682321 1225682305 +1295343161 1253576235 +924253358 1387025650 +430702576 1375178155 +2634910294 2454766961 +2463710526 1975890527 +2646149320 306762461 +1884090882 3407935779 +3029472056 679647684 +484848389 2915387197 +909571837 3845773300 +2446973295 150030776 +3233647290 273581442 610362059 +3976663412 2518710672 +2669494858 2989191077 +3595558919 3439163730 756899994 +3182448237 160134532 +3205275393 3772222247 +1159005160 3595252227 +555951143 1676829234 +498559462 2306357968 +3686076802 3751817342 +3772290933 1868755433 +2856825693 1809800052 +196448245 1829037212 +234168536 918960218 +2579112678 3859083265 +3466928503 3304304208 +3631290195 791028695 +1782260230 442072701 +2625632896 668911181 +2568235191 2981894150 +346645986 1756062410 +3083672921 2967810846 +1688406481 2927933530 +3451687803 1524378276 +4248377858 2413074973 +809328972 287513463 +1146615765 2069318771 +3304245078 3269192276 +1213762910 1097239295 +3040215620 2282066207 +4104525447 2826270336 +2204217647 3437236408 +4136805495 202357271 +3245995851 3724561172 +1806978531 1792550086 +3131459246 2176926713 +2922392193 3067275542 +1643327240 970131851 +2510116224 83288998 +3499418918 2154085057 +1178503609 2797624942 +225914898 1151380563 +3603150118 1008085719 +712687227 968434885 +2914648789 2236523386 +3218435271 1802593689 +950890387 950890371 +1965712245 3870986556 +2365919057 1341594768 +2537638086 2952603578 +533197387 1544561519 1611672011 +3792234836 1025805197 +2471059319 1400981584 +4024298662 1079740759 +1922766486 2395697 +781182620 2443571958 +2380254755 2052161820 +263885392 313807843 +1519172753 934835744 478992464 +1322483949 66319620 +560680245 889007415 +204676091 796199972 +121616567 542099462 +1511812156 381575783 +2868123272 2789177373 +2644276010 3589751954 +2111933078 3222088231 +2954416567 1754747102 +869923951 1120626895 +1503391750 3321751012 +326064811 1975023317 +2762577026 3629640555 +1692901913 2182608771 +890054248 3363985539 +2500057832 2500057848 +4223702412 4183427511 +3559495381 2644137850 +1203312454 778019639 +2479609250 1273056789 +3783627105 1715723190 +2211356496 2211356480 +166742801 166742785 +1784687772 4109147975 +3070303242 451714144 +3402221969 3433582406 +1264144673 3197810422 +2110151398 3846248449 +2028314111 3904560774 +732418329 732418313 +1715853975 2532776880 +3245173286 3245173302 +1788080135 1449501722 +1675673685 2412692938 +3638785805 3064022843 +2819584998 1985180417 +3291513207 1331416646 +881899012 881899028 +2206937777 2206937761 +2980985885 273987729 +1814504511 1814504495 +2543209230 3682159998 +2858847520 2660311999 +2709295096 3504819328 +55378760 2050763339 +3443655029 2481474364 +183812266 3914025883 +2480566439 3319736377 +790132123 3196134162 +25712819 480485836 +4128978038 3805517255 +2770528877 1660357010 +2244783743 540455400 +2119070047 880572574 +1499304094 1279961279 +3519142010 2396224046 +3113938160 1951766109 +1721827510 3704360599 +3510320522 1783444998 +747891239 1406770016 +486209028 2356506824 +801973176 801973160 +3052642040 3449711493 2303046016 +2331453845 1477866890 +57183409 4180929453 +4193276971 4193276987 +1020701266 431847934 +558143720 1190966571 +461041600 42429267 +3029936480 2904302117 +1014748231 1301299593 +3157032429 654982162 +1024249740 2804595063 +3589645297 3589645281 +4152170891 619656642 +2442570716 2171293841 +855985558 855985542 +890053359 4041299463 +2945004771 939409756 +3419986437 3948885466 +2636468854 1871125650 +163951593 1262106574 +518135905 334463034 +515063795 1194175386 +3209635706 2744853771 +369902913 4132504918 +2335073587 317136856 +1823650617 1448092350 +3278432722 1881675141 +4127525201 2599266950 +3586210597 2754616108 +3582544958 1696793993 +1461782479 1055052300 +2273837115 2518179044 +3601686241 3601686257 +477895409 3361630566 +228991304 3163553397 +2731103030 2028862993 +2446930641 1777008400 +805969404 3660736964 +3426830711 3426830695 +1638916305 781206295 +2918960737 1147527840 +2002170393 1380802389 +4272122216 1128197821 +2280194145 3056544156 +1254413513 1254413529 +347764838 126584983 +3809479497 3141649390 +2111495531 2111495547 +74670559 529145645 +2844059797 1899635356 +4055972097 2485959839 +854841778 3890197285 +3278176292 3154065577 +1414332820 1228504047 +3565937676 1697004599 +2094920676 89485540 +921456365 3949152594 +1888241370 2515370574 +3347875640 1513676091 +3056195545 2428040872 +2871425245 1125833922 +4053389357 4053389373 +3304384912 2643176867 +2887244845 3564128155 +2528030366 3539788457 +4089442423 2337933865 +3539065201 1051985866 +711451255 948535622 +3201423556 676871327 +1677216517 1692276940 +4240827540 3124839423 +3346788356 992450262 +660225214 2970459913 +436606199 436606183 +3443596044 833604384 696095713 +4218942093 1792201714 +2088602684 899924583 +2000800690 2945964886 +1029529339 2499577124 +199360016 3301110563 +1235014700 1235014716 +201323717 201323733 +1029021250 1029021266 +2210845372 771603943 +97429990 1936697636 +659741564 1668252721 +612500428 1152121399 +1048012829 1928914338 +404709303 2959322384 +1024753463 1581532038 +3466914785 782193440 +3293122235 3120705636 +359473817 2619056368 +4269596402 2321203354 +2336048541 3463747115 +2989450554 3130808925 +1639313087 4192463484 +1854908796 2284310055 +4003343146 2929594908 +4264817842 3895376958 +2623872070 2032894497 +3108637748 1741111005 +3222951389 3222951373 +1997362149 1325076844 +2035666462 538147135 +567407375 68143359 +2163596528 4077571523 +752311539 197910346 +2199425657 3635319912 +2238320168 770984171 +3321804957 1291624244 +1848634005 1848633989 +1529479315 371124076 +3748468494 3334163225 +1370639252 799865327 +1177734470 2034090642 +4192976196 2988110367 +2562532906 1327015557 +1047293960 1047293976 +754958851 2209719835 +3303054964 3303054948 +1419062057 1339224472 +3675410988 165108545 +649274991 1527087278 +1089647417 1997546152 +2780270216 3292941749 +934800865 2542500138 +358294986 1996013349 +2414352595 1566512172 +2525956361 204159278 +4151696703 3448457768 +3048500380 2802252177 +308815329 3673399606 +1950063182 1205070041 +2712097103 3378839374 +2288049938 3263113555 +586122370 3435534343 +2621024981 3284659530 +3983428754 3260765794 +2828196152 3790333446 +4231993603 3547112305 +104707543 2854568304 +198859904 683646355 +1752457356 4214488161 +1092486748 3728999121 +1815123262 3090724642 +1464888382 2979685791 +1585546399 378608911 +2531006492 2558129159 +131296545 2182691996 +4216766225 3129919430 +1365897775 1489518574 +3612989635 3312466666 +3821235569 1245676513 +2617276023 400514978 +1521140172 2261718071 +2968357540 1408586262 +545393496 2226641819 +10499606 305472689 +1342083706 3502335350 +3543654270 4277457737 +4218357563 2275332122 +1861715836 3994002727 +3483459992 1575185488 +1037573842 758678675 +3726015725 4120653230 +1417472538 446990077 +905479729 3896797398 +761036583 2409376374 +1331363278 3396927035 +482598965 598465860 +110941597 98846260 +2464555165 323274679 +2379472129 104473648 +1566324648 3985340583 +10534868 3523326249 +1550815735 2057488326 +1829442777 1572791572 +791265129 2813874776 +2688241947 1482730884 +147123424 2919294131 +162347061 1890548586 +3436284822 64929063 +1390660365 2308482404 +2346115190 2571327943 +3334379500 3389597825 +3673485552 1460321580 +2602998207 4240705470 +798759827 2243913850 +669040718 349092569 +101778349 969460050 +276340512 232947557 +3645862315 876540298 +2414579355 2416737829 +151782395 3503753209 +1975209477 1524355532 +2045879404 559269579 +759300879 1307234446 +955953922 2267437853 +113140000 3397132919 +760869205 3113674954 +3875469251 2131474301 +602864822 1194840711 +279211529 1004091448 +1229701509 2819761933 1516426089 2895396603 554203983 +3324564523 3902034476 1069322190 2482199886 2723963988 +98691672 1978992596 +1641837819 151791396 +1820304675 4025546250 +2639225474 637014691 +268874419 3985330138 +746737732 1428445983 +1701013055 368897514 +1119787762 68020965 +894974862 2279981199 +3190660141 2658957444 +1664135061 3131336604 +1439597684 3669726943 +3931562214 3435399703 +1555068627 3167424044 +1112862089 4105301678 +3137914523 3137914507 +3457932378 3487293885 +1104405056 3767347923 +1584408821 3664742042 +3158719290 2626632797 +3933459130 3933459114 +272485119 2266218684 +373533784 3482560499 +727086328 217715663 +3965952915 2727266157 +1882451232 1670220268 +1722389092 3843599961 +3762487296 4001040332 +2610874436 555253980 +1853118072 1021094087 +514622090 3549527853 +3505187990 903732250 +4038871418 3105129392 +2594414926 2059169356 +580285122 3065217742 +2793251045 4240722028 +3357531424 4290736132 +117127621 3170027208 +1473060592 669496259 +3506263803 1302152623 +1231711559 877174852 +2873537461 772663569 +1764626253 3766621732 +4253736974 3566641997 +2916446085 2612664234 +2773337712 257412061 +788234608 3367468764 +3327725719 4187255486 +2351258578 1892649861 +1853967620 482636700 +496949962 526136142 +2569347825 2332510196 +4288191999 3257236818 +178655338 2404229630 +3142416629 4244620685 +428092587 3591524660 +3704395510 2349966663 +4125213501 1332107540 +2659437960 812778538 +2394365816 575048187 +3115764441 3115764425 +2691012066 3889965291 +1465064602 2896412598 +2308909173 4051258321 +189700603 3351012900 +4267287810 2724963177 +1678445647 3652942513 +2693337408 4156958668 +2538575242 2700874981 +4004346309 2148970778 +1592612552 1940666408 +3219878940 4196397767 +2904884087 2185196899 +3141887214 74176878 +1719071595 1345129007 +456569027 2419159728 +3946594012 3946593996 +863910392 129319277 +2681328522 558891579 +861871211 113498720 +937962826 1360704326 +2107578971 477527378 +236297573 1202301084 +3827511898 371361314 +3554499763 2992527392 +2703654618 2308550973 +886326785 2305766704 +1431979743 1008570654 +4122699798 849622263 +512079991 2206294854 +1880849688 3108153133 +4087094813 2682939627 +3926618296 671248813 +1995282516 2349255727 +1921470988 1460021473 +2271752041 2449646158 +2031364440 4072478093 +3315181093 175947612 +2245963975 1548113724 +3477147140 1198067785 +1173630551 1986327280 +86582045 3703169003 +2595340573 2731737250 +2896859762 1115982202 +914220617 4277420728 +380466911 4270458344 +2154932424 3751645667 +734998692 133987620 +4204237409 3717951136 +607039285 712888444 +474354820 106056671 +206075622 1007889431 +2862971445 3615449443 +2212420956 2879299079 +639973535 1753085771 +4021202441 713339573 +1656138082 435663681 +89822239 229785213 +3632309954 851498187 +3172206688 1861564219 +3552852217 672149928 +393827091 117294842 +1573059310 2280719545 +385906250 2142910061 +2395417704 730523572 +2249423525 3047821740 +2534977707 2262703394 +186137536 925241171 +2187416326 1787294022 +118615105 1647766080 +3946710480 581117539 +1608724251 2241633791 +57175961 1911100693 +777206416 2097492131 +66624719 257874382 +3885838011 171134334 +3452533483 3744235508 +3176838114 3568400106 +2138577312 2146487266 +1270491211 2803524758 +1787943914 1907014694 +1747062249 3600541134 +464829446 3754426951 +2617125639 2552085504 +3287453235 364638713 2271837645 +433379003 2098674619 +657327238 863051489 +190238703 3366540590 +3630049006 990338379 +557181666 702595523 +2472414641 2826697814 +2289488847 2718920398 +3661301549 1677421016 +2190776077 2632567140 +3969774522 3300664854 +1292655038 141641247 +784353904 146091587 +2954317188 3100653478 +347175691 2657399380 +2824358942 2851728066 +3181329058 598297859 +2617342871 2617342855 +1040128149 764654236 +1259248165 1291626554 +1674356670 48341666 +2108662412 1736237665 +45453204 3620799993 +1666962210 1666962226 +603625737 2893998392 +838122885 838122901 +3483184201 1448896672 +768691592 2826767627 +2760447899 28347148 +2701600043 2839511732 +1965833710 4186233465 +3152669818 1262437378 +3626247430 1189496929 +2636612955 3224825421 +3518184387 3649336742 +2429374688 3543552165 +801638774 2917590215 +4054774031 2238020238 +3329147163 2613820687 +2257135496 1374239499 +4075483858 970735749 +1152824027 110857924 +3974778287 169460177 +1702675695 284062405 +2425014615 3782931430 +2841033825 2887484038 +2078498371 1240294268 +1933430183 1933430199 +3312866849 4158067281 +1224895082 2793940178 +2306231876 2839360799 +3623902840 2583430667 +3735466752 2154547475 +422779947 3598014370 +396142018 2804773838 +4116215295 2206324906 +198591794 3946852570 +1262467532 4098254817 +2360142470 4145329494 3636204743 +195790074 1087013486 +1286617491 3084759040 +2680655774 3536118296 +1502702562 3790394581 +1965879267 1488822876 +442159709 3656984692 +3570273731 2342033318 +1976608532 2339832943 +2984854494 2984854478 +3696353631 985312796 +2199406360 2000153293 +1015205395 2808443117 +2517431539 694524556 +1130330632 390929044 +3203013807 965420920 +3225040012 664844407 +155432991 2656583841 +1241949442 2871994765 +529342859 452265134 +200768677 2441997102 +4287679095 3899461929 214808820 +4021799110 609292193 +3936762133 9135020 +940144950 1827262481 +2083187338 2943611365 +2009759558 3653655329 +3434352295 3866300662 +1844364833 1844364849 +1341204816 3926394615 +976374680 892141659 +3737597115 1855455844 +1880765698 2067886645 +1146163069 1318773877 +486625658 588464907 +2686077867 3026525730 +2891150234 3781098365 +1179030980 3000683100 +3588310222 2141147225 +3184684600 172196397 +91554924 3833471100 +3000080365 2469935684 +238949424 2612643715 +3360886528 3360886544 +3045496955 248851774 +446486898 446486882 +3644517143 247469350 +1550296799 2932322187 1445703944 +325832815 3472310337 +4036161618 4036161602 +3904603746 3241446485 +1893896218 986543014 +471218317 3288008178 +4128749401 1445151979 +1294150265 3881557096 +461832291 461832307 +2126609047 563346352 +80638724 2499743583 +4182529591 690025379 +67070057 2117240603 +113113625 352143619 +1231441822 705648041 +4292475436 1257803607 +720306189 1797730149 +1488571066 1488571050 +3418550273 3303002518 +2476635064 2476635048 +1242725264 2358728171 +2061471923 2802691104 +1493988479 2912642024 +1778269378 2637800821 +2553184200 1496524765 +1782358773 846497724 +2957879364 2957879380 +1200121576 2597113091 +752156391 732209440 +2684153641 70024600 +2224151861 3869194858 +561545082 1059088450 +1948677374 3599379401 +866738856 3849983504 +3891295866 2575991325 +2182831268 1964168767 +500281430 1192793969 +1594489223 3020924548 +3835438923 3835438939 +3063902378 654203789 +1581937169 1882290048 +3191234385 1600185011 +2000068204 4075044476 +1477423074 2192695491 +2592033504 2592033520 +3833650211 3654978332 +4210516456 839676599 796503556 +910929054 532721730 +3487890236 3487890220 +237677865 1982764952 +3025697737 4091188280 +3437174357 2836337544 +3142755595 3994669140 +112350221 2244351773 +1167199569 3588945552 +4138704277 3950317980 +2254385231 615606939 +1585423295 107433547 +2328516396 2931549040 +3155844315 4169149645 +1605970374 2441558846 +196425603 651407318 +2593119155 1075474208 +703829263 3612826459 +2992407056 3617636131 +1355250345 3540391950 +2737661479 125292384 +289733915 1149459877 +1250573828 1537187935 +3858926939 1896121938 +2579112695 2079741353 +503843930 2695590315 +2671110575 3335565403 +3192849436 3192849420 +591909693 591909677 +3602766353 501106886 +908145592 3997461165 +935987805 186670253 +1428661587 1907515840 +2080671111 3256759168 +858380667 98655410 +3016629614 2071483449 +3614776211 3227150458 +886962655 2162014859 +3195241763 1278859374 +2464964509 4038984066 +63324037 1050634154 +1767838204 327711203 +3624792758 4251787801 +3949278332 206675761 +480472319 340039016 +3334964386 2495180652 +1633837669 3001083130 +1147954741 3953452412 +1234107355 3428954014 +2326802262 2841281646 +1912245076 20520628 +3648655134 4118841129 +3532290376 1453071281 +647646629 919610317 +3063333402 2469248054 +3012650737 2665811302 +1937321157 2361489932 +1963371812 3886474627 +3145149169 2372841307 +3969347847 3969347863 +4220274246 4220663431 +2554671515 1340938002 +1624345784 24276819 +81571504 2888011275 +524683872 2604815667 +769089164 4067282011 +3633378443 3633378459 +1847823999 3774435838 +3912758145 2752795670 +1991317430 2395493265 +4027516617 2963779175 +3097932778 2557294925 +2691570075 676482834 +360543337 1031684430 +107199754 370360854 +2420906464 645417458 +2113891211 3742980220 +2498041110 2498041094 +2696611825 4151148646 +1334244359 947005206 +975589959 3511911872 +1662573320 136367517 +899405977 4250269896 +232885629 3538588276 +1030396179 1869760493 +1126025141 1558274556 +3704819998 3192123945 +3789061996 4090533655 +2683549683 3215627148 +3727338986 2804926299 +3117365017 3943358426 +3846051657 2770492334 +234204755 1287744684 +2997956442 3069714031 +220142468 737693897 +4238899995 4238899979 +2363960409 2307788506 +2758559662 1928223289 +2039988726 1608930887 +251662671 3961208654 +1618926586 1618926570 +243792421 809841501 84854842 +1578689876 1966146361 +3665918881 2597690998 +2756414717 2683236930 +2963231978 4107447378 +1969336139 2007130315 +666097560 404513869 +1560818659 769489607 +2489709368 2489709352 +2653331332 2060262623 +3581162013 3627304171 +3215802725 2869161116 +2843063135 4215179466 +2876103685 468949034 +1720256301 3639926942 +2983547390 4040168159 +2813699685 2694273418 +3920016932 4117805728 +2259347415 3591042918 +1013187318 1013187302 +3425416567 3754863184 +235026741 235026725 847246636 +2824572488 2162930531 +3354622261 4182232700 +1345131169 1345131185 +2761452439 396197001 +2366565103 4252751416 +106896024 2967360021 +3864936467 1732671808 +7874022 1248677914 +3380263131 120651972 +4179438033 4192785424 +973700183 819162563 +3632081682 3742027091 +1981226 602686354 +3879596190 3075409065 +1060656325 2075023043 +1532416895 1399143723 +3858487492 2573213316 +3621116634 719199813 +1979441389 2827162884 +1506183712 1938518131 +1154535348 146208857 +2221877824 3137307333 +699023475 1684731390 +4283640830 4283640814 +2146779525 4095091802 +519652928 40474309 +1723910369 994329889 +3775310564 561972457 +717284076 967129473 +584627669 2955296330 +234150219 2081066153 +1710959675 3311837426 +3412669861 3684659898 +2752474763 3477800148 +2844103046 1665406433 +975373904 2063580861 +1155216875 3609162795 +349374449 3107291248 +905191736 275142596 659573549 +3102810506 3102810522 +1261605167 3598191079 +2103873030 1852937057 +2783103029 1493248892 +4179105869 1844330802 +669776500 3060272404 +3308462734 1828835921 +3945123306 377694029 +305765096 1527480572 +3967275505 125650807 +2998576391 3832389721 +2233085927 1506144249 +3154363977 1123099886 +1522267442 132316581 +622497043 3544512354 +1741363397 699923980 +1033452038 2794172487 +2911429215 1120147211 +1447780856 3500882299 +3931057934 95561767 +1879855069 1080146164 +4269637700 1892893553 +1556130917 1750033139 +2629991860 2887078409 +2204200201 2214463352 +3912781803 245747426 +3789924632 3028889805 +2268686645 2588163362 +317500693 3751049226 +1823806075 2618038194 +374791370 4106064365 +3284842928 2198081820 +1425467312 1890499075 +3212009370 3991953168 +2339082656 441859813 +504090593 764952374 +1156995215 516778254 +1046416582 1604229829 +528801680 2763843431 +3885831196 3091638279 +3952316118 2940852977 +743754761 1871680675 +4187492203 1432372578 +2160389573 2063748364 +1728575872 2978858117 +2276974489 1064631752 +579546229 808384012 +3482902910 3482902894 +746510147 746510163 +1816273685 2166176266 +3160788088 596215296 +2933612298 1297521851 +1719641034 619632379 +2630530201 1813662942 +2004834307 1971554464 +235190763 4235242722 +862216022 1023546471 +503552980 3026578751 +4131712844 4203001015 +1656763031 1656763015 +1988452525 1089941586 +1426090928 1587025588 215880477 +1604713303 3913984496 +1226428380 4020385617 +1925948923 1950461193 +264019948 2375727413 +3743023022 3823992559 +766673159 4144045568 +4091284117 2019862684 +3357578733 4165731332 +1363149331 4207100908 +4293942684 2204327057 +3561805699 3086435125 +3765176476 3198278481 +2831503241 86030053 +2124004584 872702251 +1774704879 3342325804 +2131984457 1421013752 +1321666587 508674692 +4005686380 1195847169 +1774133358 3856665903 +2309867911 239358945 +118580117 264294957 +4015181245 2086264962 +3230912030 1185773879 +1562522470 47638913 +3465017892 1141819049 +2770078043 1176681028 +603408262 608540663 +157586988 4116211521 +4132834897 3457161111 +2866361680 1139731683 +3747974114 2396730563 +2356128070 1506244897 +1722789488 3168146111 +3357519769 2732682718 +4023764662 3173833994 +111745918 4197861215 +3507631239 1220496628 +654653272 272130339 +359930956 2679361121 +3031918739 1976972397 +762691913 762691929 +1955480513 1022666966 +3802870183 3304275790 +3694555034 1135718269 +3014735486 713274460 +299081221 354533836 +2322523090 2427551853 +1692152387 633506221 +1664483107 1358996501 +2917638719 3092932735 +2323267998 195444159 +2154523107 1019203234 +1007462649 2163081192 +1101863132 4153387984 +667657619 667657603 +421728838 3627402273 +2295176091 4138464516 +3769971803 406940484 +3297475313 1485998448 +2869573072 286439011 +84762824 3155122909 +3077727188 3349037568 +3479195399 3688132607 +804212593 3870953200 +2085149102 1420733689 +3596161631 2533869340 +3357684516 1190585549 +75613875 3562132022 +3644086330 1375194882 +660652964 2541191600 +3742949071 52871128 +1176418866 1153052122 +170126184 2461738388 +2717852618 1229450533 +3570152977 2544392644 +3546665685 2655708508 +1897275163 874228507 +2399424411 1676318574 +3063356577 283251062 +2939540739 3569243068 +1720090736 3585880131 +696435774 2530930079 +1184815175 3754328900 1184815191 +3102982698 1371187213 +1595974757 627231482 +1416017514 1202792653 +3753476056 1051879269 +2176210494 4066304106 +193581504 1637220695 +3614377303 2059757542 +425338519 425338503 +1798436684 1798436700 +514594817 472579623 +3988094873 3451379166 +3298687055 3551388750 +830422970 17020021 +3850697815 3850697799 +694090497 1495769565 +45418814 2164100255 +1905157202 1692023609 +2607363417 2235912254 +1457274403 2042657257 +650480010 2465694765 +780785343 33361576 +1309954649 1123918366 +459526298 3089195627 +1085240947 2871582689 +1689867400 398463499 +3202304633 3859532440 +2507132672 847374495 +2378849730 3424430166 +2344126533 947815578 +3730792884 3290877519 +3713180246 837653205 +647305113 1437869512 +2417236077 1017279364 +2045558441 2561680398 +1222112027 2855511810 +351788152 2049970427 +3558252466 1841712973 +980005778 2254810835 +3992152772 2151688028 +3386871610 82737245 +3427046481 3774184336 +1140609556 3035613303 +2105036488 1281623261 +3757642362 253236765 +2271514531 3371736198 +572157627 1007850427 +3498517851 2680147538 +734183846 2308364375 +3605271002 1528797690 +1212940402 4109927570 +3701603545 3819053993 +552464620 3443541015 +1980283087 2663050702 3094223152 2041218097 +3064602345 1993255118 +1045029693 2450734626 +1337129013 2881272700 +671369894 3417683305 3013722609 +771956518 2498365633 +2802250919 2160060083 +770508554 1445074093 +1866212042 3853173755 +4256867286 4135782706 +3180208422 2361274049 +57254942 2660685182 +2064834139 431229266 +4162321103 3657071898 +3138004464 1626978499 +2409312643 2409312659 +463744437 3364419916 +1653550044 2757218439 +682562022 4053347607 +1540248664 3721315981 +2471077340 1928845969 +2712724488 1745226508 +1914799860 2663870991 +2434164896 2434164912 +1153853718 1515679153 +3913921688 3447425573 +2258340167 769202902 +1507056191 1507056175 +2562701371 2966357234 +2156169357 3718444516 +1150195322 1478874965 +1903318537 100110866 +869279612 657016112 +615723094 2963648234 +1373812016 400767637 +1642406855 1291911833 +2850763257 1983884008 +2643974702 1141667430 +2509640987 198411404 +2782465913 2377341822 +3254868552 3254868568 +3681381647 2084744846 +3414817145 3811817832 +2611104022 194020402 +4208484697 4241906750 +2881090491 2717483035 +1426551028 3468087311 +1303653185 2476742486 +3739701141 1797402188 3739701125 +531951979 1423444834 +4089329240 546980325 +1893485401 85525391 +1619996342 1619996326 +2082484842 3501153499 +2132552871 3227142880 +2804425942 3283165089 +1888541518 2181643215 +128885454 4060732039 +771084107 2392431646 +1251470847 1814800488 +1835551495 1110318102 +160505853 3976791798 +3449333555 3662624076 +3057968651 4185269076 +3070074382 1885831066 +120960920 120960904 +1991071231 3521011816 +1833937428 1210671348 +3583725281 3139622620 +381374376 3840394269 +2225220803 4267658928 +3664066932 2026755039 +3047030853 750414988 +1762896958 2919745052 +1712276887 1091210416 +1083144597 920413578 +1672712138 3182123757 +325582194 4273207923 +489766051 2541909148 +2993383620 3938410439 +3143205283 590986269 +300028810 3873037865 +481067095 3717730754 +3529414087 4058368086 +744072486 3703890022 +2232852683 1302273940 +1288432201 771870951 +4259508629 1163923501 +3356429427 3608612472 +3795224358 1104593089 +2881519596 1275682967 +551240291 472482250 +380805881 3023474174 +3048297406 3290879007 +270371398 4082161722 +3385851990 2955224887 +1311848156 4084816967 +3018943970 3427930073 +3542383066 1013699133 +336405895 3461684165 3444880018 +47466736 1680789955 +2907570398 2949340521 +2839380001 2727038022 +243372762 2952408381 +1945552281 3129395989 +1757368310 1266618305 +1960825146 3572920323 +4036262503 2835956339 +1793392181 3464199642 +352037736 1454957955 +4294710057 584198542 +3308127292 2742069863 +2322073232 1626380652 +979493013 2098498204 +748729074 957661079 +3525326264 3493721594 +3511288711 4270034304 +2568735862 2093145553 +677713507 238958787 +1741153134 3450537519 +691062361 818429470 +3901649219 1530678378 +3557292127 663485854 +2187049368 3793968736 +1210096985 3830952727 +2589790983 126153737 +1353405392 1222019132 +3943867102 2650599078 +821081454 2366430702 +2837134368 2837134384 +33970905 151061406 +40531151 1408401599 +1924135018 1924135034 +1387231184 818439663 +4121315936 348591411 +1190447452 257489873 +3747688241 3606923814 +2039888068 2924679126 +2698071066 1132121341 +3150912812 3540708439 +900844281 900844265 +3602678241 3955258656 +2592241886 426001791 +2918742271 2341543612 +2965780047 416015500 +559460622 2359212313 +2153782720 3612267859 +1460620304 487898421 +2784042560 2471946967 +1119011191 3010594787 +3497949792 2535105829 +312696865 2016433142 +2533958028 1046650007 +1632396703 2969660490 +1409524222 276814601 +2737621989 3297048940 +771978850 3513998403 +3880665192 827588758 +2526546975 811275486 +3681562562 865807989 +3903613143 3903613127 +74386856 3462312387 +1091991859 2841693004 +3536066962 1555316933 +913732457 376927744 +2314826101 2829949738 +3853238069 132357367 +64562788 1926721385 +2570367013 2928713724 +3481435791 592141531 +3579369155 2648315132 +298916477 2301407956 +873108157 2846162818 +3879373707 2351541204 +2647626480 1573146563 +4054252712 1031025680 +2452311865 2734070325 +3776775247 3868353164 +2008971357 4053113649 +3984777746 831487602 +1671388261 1151964505 +190683367 3411522486 +4121155972 501553775 +1555972908 730054231 +3714860043 2624527700 +3347375814 3694610849 +2158889935 1627166424 +3341545210 2614897169 +3852846314 2007583105 +1675494268 4294511148 +1708199119 387393998 +1611142622 179989609 +3894175079 3417547040 +1112787709 1726516290 +1157871988 3167769544 +2873700256 1144387813 +1501266878 2607834121 +1588327582 2796688553 +4044858821 796400006 +1321124287 3041591208 +307614659 307614675 +1088542970 817284934 +2546402112 2746015003 +3304018281 1841113166 +2816645654 1605931175 +3146526301 1622565509 +4264035927 4264035911 +545233337 337365480 +2662086279 3334140266 +213976685 213976701 +3292184085 4252580618 +2643900447 2077115082 +4093609727 440501118 +2763384465 2644426308 +2147915918 409085839 +2880827808 4016791269 +534376142 466986066 +3154049083 3154049067 +4217875600 4217875584 +1294006321 2615588134 +2487980122 3123304454 +938499192 2271318244 +1839380194 3488960650 +1226621082 958542274 +880439683 532721980 +4176095719 3214931638 +1201484921 897161832 +1452111713 1185692621 +1014194554 2745332509 +4195668864 784921221 +3783050726 3714812161 +3437432591 2506903960 +1939223184 2238814389 +1015933897 476720494 +829816497 2378166438 +627795261 621829899 +2082280497 888055510 +279626905 3587407070 +779832540 779832524 +673862550 3500250417 +232013978 1596043901 +3076185120 3288893043 +2297923952 2160484581 +638849031 1391190276 +3733563246 3232928294 +389268318 2937189759 +3159438639 188694779 +4218476536 2849006720 +3414434113 2717931862 +173952708 376831625 +2231102009 62074671 +3174234122 3778836411 +3644234993 554909078 +2978388718 2978388734 +4161564891 1452648658 +2904514914 1108058219 +1696668787 2787100954 +704642835 821988090 +474826336 1090233645 +171722132 1661533897 +437001354 2333142331 +259814522 3672857611 +852468872 3407648623 +980804509 298801169 +4125989036 3506919105 +3473857409 1550299434 +1197896152 1197896136 +2487494105 621675164 1380812949 +2134639688 2268600693 +3098472149 2486923130 +825476860 1887583921 +1552194204 1086284689 +4238185138 1577971251 +4274226168 861973384 +1841330973 3808546466 +2214174521 3557748432 +2877797990 1822696065 +1151724663 3165434160 +4218172525 945194884 +1374228443 3437491666 +2492288525 3882999410 +2004702088 2722791179 +2087766091 1988785333 +3386636698 1598680427 +2120202825 2899071967 +2531568135 903809811 +2139581139 2502765114 +2810535868 4219709069 +3724140907 3680361320 +2085407695 2078594776 +4115526628 2147199961 +2418582924 2743579868 +3746085261 209459442 +1852820950 4171198625 +1550111645 263790626 +1517568912 1845648892 4110834613 +2443520422 1942067557 +800048270 4108276249 +250273308 293617782 +3511481401 3039065512 +553219977 2975553006 +2638992894 2623659721 152163021 +3208996563 3980451386 +980925870 3095369977 +3152125501 19667458 +2923459005 2923458989 +3105297305 1630044787 +3919938810 3381679517 +1699116761 1189943198 +2022813367 1668405044 +2306273572 2319293375 +1130847971 1130847987 +3532726712 537431109 +841140899 4011642758 +1187555654 3017963831 +1037964925 4189984859 +1444649291 1907929013 +1499974816 864737797 +2247389165 2730959220 +3176793325 3273584466 +2129503323 1070973296 +4167340996 3394543007 +2810162812 1316856871 +3162109733 3640659756 +3363317159 1008944636 +4099505509 4220329379 +3315090442 3531919926 +713085643 3764692977 +1048402730 1048402746 +4231160068 639551812 +2169333905 1186398753 +4022547084 4135888278 +325596250 3876219307 +2095264637 4293905419 +1080950091 3089480980 +3626277494 3599474241 +945970884 2262511232 +1967705751 1967705735 +2488752880 2900604658 +2835806679 3975892326 +24780764 792733511 +882052272 1937570069 +1971330441 2175696568 +2087154133 2883072604 +4082872695 2421710416 +3005578304 2558123767 +406861846 1125665457 +1625347764 1156698911 +383634005 1411744732 +3689258895 3111792152 +1262091382 1683046601 +3222660015 292908152 +1340170208 803281595 +1716509566 1716509550 +3231406071 1552990836 +2474128142 876109583 +4196811442 1574583838 +1726945199 3110226030 +393018191 797941070 +2621426734 2313664676 +1816271453 3999737954 +758637446 3036359671 +3421381654 501403303 +2739287919 1988707246 +3792806420 4123141487 +390208082 4010766085 +2570431732 3448613934 +233648816 2623982357 +1280513366 2093651569 +1387723266 940282165 +191607595 629869748 +74385908 87119967 +3084274109 592843924 +630757040 3744806677 +2900746182 2675518481 +3486920557 2603395204 +3689503831 308699319 +913635584 3122920197 195307724 +3491193176 1437263091 +2474865935 1657310517 +3073217668 3770731487 +3565134050 1726628821 +1730508851 2197561098 +2025427755 720276994 +231793514 701890514 +1200391247 223208076 +1874471157 902399629 +1163860895 3552082782 +1721728109 1049622830 +3886186137 1036864222 +2620982643 1623430156 +1581482380 4031049569 +621047118 3231574696 +2779725108 115169497 +3420002656 319340839 +568833451 180550690 +1018566958 3232342895 +2978166843 1877436334 2429944687 +67796896 4236699891 +4097859239 676659424 +634587817 634587833 +2944006512 2902698819 +3503144524 1923825760 4293038497 +2201360967 3576389078 +1950781050 2232568349 +3323966109 207162498 +4125870420 1982721849 +3660058191 2292256945 +1966692635 540176094 +1267822982 2079700471 +3457980034 4177587893 +242666958 2466642767 +777802144 2606006003 +2779478109 1835710056 +2353374464 3517103891 +789056188 3316180465 +653822582 3477206993 +523357380 3747960991 +1783609129 357757694 +2599507023 954710104 +27271699 2719327226 +883846290 1888800949 +1101876254 2543225897 +1122435434 4107604700 +747302690 1085698691 +2058562878 3687007181 +1735023065 102910121 +363164859 3463889508 +2359369290 3159160309 +1500400042 1922954907 +2508053047 2350810256 +1837182005 2539165564 +2250702607 1046709400 +1207786329 2899758344 +63906250 2191727397 +2634494398 1847850125 +1059351030 1548930631 +2364649314 1115100995 +761467373 1609906194 +3331487917 3723489134 +851573216 3344718757 +903445545 3999167640 +685522713 1807176798 +3101623569 3258491757 +1012459088 3487080124 +393650233 799158563 +1063056129 1475357222 +3944964663 1684521237 +3047615326 467423484 +349051204 74565151 +1758971547 2796398098 +3221072293 3780251322 +525414766 4078700850 +3507427490 3166947075 +1262723665 3430450576 +2982095126 248590769 +1668242654 1716466047 +1149080920 3113769475 +1718584425 159442540 +3880508602 3597433053 +1909162949 3898634010 +1771902337 4190952944 +2280877186 3868291210 +2761711166 1613257631 +4192823787 1433517282 +614600895 1780505790 +1447303912 1447303928 +1373580189 3603690864 +951716465 3185471472 +1621735177 875242296 +2564470142 508278089 +3894136720 2108935463 +3182844072 1309511787 +3487890233 2121759422 +1814772792 2148518957 +896898564 739977311 +2560592801 3827879542 +3481309571 711266602 +3199777033 1170950446 +58842702 1568620302 +3064034267 1529438660 +3840894414 853361497 +3817912115 1875928410 +2950826053 634586252 +86095786 3568260115 +1742588233 3077987758 +2837031094 3915683463 +743331687 643012406 +2756057719 2756057703 +1462333339 3510284548 +2956273382 1236024343 +1063138873 4199504808 +407650422 1474999361 +2267960410 669960637 +2809155448 188147456 +135736017 2373478160 +516103835 3704844360 +857127711 857127695 +1642412846 3029678521 +1226836799 1550955560 +1706865227 821224312 +1601464994 4131649061 1601465010 +3539046641 3282662747 +546299997 2675847796 +1673289902 2945200633 +2317310372 2317310388 +281728891 715880389 +2394597828 3892249775 +302454394 194139971 +2645531247 1024556561 +4271516420 3501307721 +553234098 2601386547 +3182975142 1328778561 +2769949752 537777197 +357319873 1209023446 +92726663 979063680 +118735440 1947919349 +682324087 2095188806 +2719797840 2204046307 +4033669814 1777537939 +4154172319 1761776456 +2802916293 1163240387 +1191376812 1974199239 +3151319533 2647652370 +622586234 3840969501 +3236201785 3770529960 +3505265278 1691595871 +2455389546 3457893837 +1524605593 1222459994 +945717400 1422159693 +869231727 312817857 +1688484485 4085784396 +1979563960 1987366587 +2723113576 3942941099 +1497056588 3293451959 +3855753373 3855753357 +1022107893 3703038378 +2968996502 2968996486 +3369336397 3485335054 +1971202128 2317091752 +824322918 1998946702 +2945554149 1194363514 +2942441355 2724925396 +2496799611 3289333316 3251493549 +3043619923 2953021869 +2645207525 3515399376 +170283086 2172675389 +3395435398 503517547 +4019145022 617837346 +161780651 3641996834 +4064794134 2098594993 +3280896420 2102793513 +1769638699 686529963 +3154682299 3163986290 +478043515 1441605810 +2297634293 3094459516 +3718417404 3806485937 +4041759216 767923420 +614653324 2825531511 +3744499451 1415871794 +3978297082 1130259339 +820840009 1310778606 +1964791804 2370915244 +976257879 3895151828 +380884655 2792385531 +785720808 2710219837 +2318598920 963515956 +266394034 2968957747 +3629554439 2538998784 +3633245590 2396643498 +1478203256 728723963 +2462364959 4030531548 +496880453 3831954828 +4009668482 4009668498 +2362475787 4000716239 +3033696005 2892664026 +3383074865 749212374 +1257668247 2567522214 +3631618330 3689513963 +1786942019 3668015869 +2645208498 3853479731 +2678350674 2212410702 +2927954902 3705790113 +3946491790 3940005134 +3731398568 3333641597 +2559112055 2173825750 +2651829025 4088855798 +2611197343 1465540965 +2729473284 218801476 +3976862726 2299054970 +2162711143 1422282784 +248281858 1306895413 +3803749423 3580772689 +1846241198 980580921 +3884150951 2153921720 +1924810730 2235512141 +900344470 3108174689 +2995334568 3052593021 +3173455558 2324224439 +1410381484 1248421222 +4173119863 562825187 136613456 +390810249 2293923219 +1988795381 2436072106 +4122285275 3253465224 +961934700 3857169276 +1592785968 1811765131 +2011204517 1083509347 +3122600702 4244078025 +2085973686 1887258769 +949424805 2985717657 +1470884251 2661334802 +242736354 2830153685 +1062316472 1062316456 +3609898894 1177705625 +2922771081 3354185134 +1681122506 2531595813 +2869812985 1070989822 +2085973684 1853703503 +1351098316 2454326839 +2794301407 2794301391 +2298882996 1756810329 +352907982 3944102489 +3761763278 3323252057 +1429457757 1429457741 +3321859259 1816824434 +77027205 3208562266 +160938969 4074550920 +104483596 3653510135 +3551038286 3525334745 +2963744858 1898218923 +2183542508 3458758039 +1848958779 3090901490 +3618252355 3285859178 +3887482412 1612030502 +1650682730 1271631301 +1985538518 635930474 +3528586376 2667835933 +3617123190 3686443729 +3183648690 3440895868 +2721529339 2636648126 +2007535357 255930356 +1993912020 2978169796 +3987710709 3483144346 +1011533779 1011533763 +2578037317 724580998 +933239469 1040842318 +1466949980 18858951 +309855277 1072599748 +893826554 3629152413 +4136543318 3574376788 +3456976815 233298030 +2685983804 1126347377 +3142286176 936589363 +4037638299 1865570888 +2471898071 3152701780 +3846072448 4285555128 +52751760 1388474932 +2481077955 2418593002 +3830086062 3830086078 +4116072332 3157011164 +594077619 2283100687 +1649390855 3396991488 +3480471127 3031418818 +346260248 2506579661 +3947947082 3947947098 +3807314113 4282265536 +3737447969 3506626016 +3132701268 1167512121 +4052476316 3677628551 +1263655714 2033803318 +3096065904 4053091669 +1261205316 161173048 +2731625866 3648852027 +4149823087 3498696868 +1208596642 156083989 +1211243111 765557093 +3212541253 2531474282 +776955942 218166209 +3744550662 2448313681 3039673466 +2370797991 679904720 +1894713442 709505621 +1447716780 2199991233 +3756446206 3756446190 +249804215 662114064 +363001080 4152854827 363001064 +943599097 140216798 +3173915998 764951273 +4086023391 1141304072 +3240495669 1138889066 +2806085239 3272441158 +3489419650 3962851235 +791670118 2926753665 +2181629178 2922567069 +3751984334 3677304921 +1998006856 1159079272 +783997026 4035244406 +3632722335 2528958556 +4262950433 4096782727 +3418600096 1695691237 +605273983 1242985704 +58163071 2150353345 +3464006704 3464006688 +2582889874 3972007109 +750766952 3446277524 3656201405 +3823479862 4170062097 +890882048 2543179781 +3440799088 1246644053 +512207317 512207301 +2525049127 341860448 +2440743551 3616790318 +3162833145 2952139977 3193997310 +755768766 2819805727 +1869807054 1074105167 +2803387248 2711718706 +608867478 4271426986 +2631776331 2522503534 +247107274 153407525 +2055963116 3501688960 +2002514596 2310993983 +2562647632 3605900712 +2893740961 983430086 +483075876 3324367747 +124342458 185444046 3242376143 +2033574005 1154504746 +4204574887 733392630 +1299681288 4214733963 +3322056782 67709657 +1419447916 1419447932 +1915218925 2660527609 3718821038 +428540721 216773661 +2074857758 3059554623 +3810284615 3143718505 +3905757741 734424722 +738931460 1503743817 +1446254762 1577243533 +3673938803 763000346 +1101467278 3163596253 +1574800360 2881699371 +1839276520 3104528102 +1629826127 2633681548 +3540136663 58067056 +3087526749 3777221460 +2564052155 1363239524 +3519833453 2982390418 +2974076543 2101472978 +371601046 3953240437 +2463460457 2398726488 +743987638 124358551 +3208919349 1101574348 +2371719630 1481410383 +1539738967 3499130854 +2798950240 11160613 +1031150356 3572277359 +1718070713 4109881317 +1668252729 1865574942 +3405191781 3789821750 +2893608882 3154929498 879619379 +1145332744 2141812893 +2673441040 1451511677 +4283946078 1430474751 +3232859304 4285781117 +1224766941 1224766925 +1661023725 3353863172 +1645693327 4188589080 +1239365494 3227799249 +1818218482 2362726885 +853278159 3746598104 +1622520348 857632059 +3891882554 1886275046 +4021254712 2302502459 +2424685689 2289124446 +1026198397 4242980962 +124286929 2054462982 +154723137 3314401110 +2121991005 2024164194 +1353569321 1353569337 +3241183495 644331030 +3216385072 1960223796 +1602756659 3818096566 +1890277378 1606126389 +3769123331 4069677585 +1829852669 2744348536 +1906461988 3044593758 +196915417 1393190280 +676389438 242899213 +1818936100 3490787753 +3881277784 3881277768 +2857432355 1081206300 1081206282 +1199162640 1325106797 +1033804352 1085067987 +2396635837 2647494530 +3921037673 3155776152 2866607876 +2203188833 2203188849 +4281404736 2800677087 +2396089170 755594290 +2188999350 456928401 +2154649542 4062260385 +4055139079 2250916864 +1729363162 511118141 +4208180534 1282432791 +3635822694 2363973761 +3513538670 462370105 +592867970 2202314491 +2694154501 872307461 +486933693 1836676482 +3557571172 2078965609 1093637854 +1346476068 2067955881 +3064508793 76505470 +3255928670 3751287039 +3524517644 3242729441 +969301457 3292901382 +2217017766 170851125 +2817015449 3952773832 +218116288 1389332109 +918214421 1145844154 +1763832672 2024315451 +652055733 652055717 +17556050 4155852549 +2079615642 4148234847 +798355045 1309034746 +1092129279 2024658024 +2799319762 2072680595 +3496905467 419744050 +2380022660 1133286511 +2808408069 3186234929 +1109999963 2180112978 +1653073131 116219362 +2730477522 3733390445 +3892505661 1866592034 +1962674559 2814571262 +3855638774 3171459921 +3345830779 2216875568 +2602667724 418246176 +1710081875 1897346199 +1416223880 1789274635 +2875352161 1626565264 +3652898645 3652898629 +4071497651 3139167948 +2447104831 3692700712 +443503093 2453537980 +3724684729 465268988 +1460235967 3269023422 +1280142642 4182162778 +225093798 1197279165 +1870134270 2538172169 +4057642554 2290655638 +3486790721 1819436826 +3647512386 324192169 +1306140060 710712465 +680832579 3515706407 +1853215444 2406775871 +4033727641 366548168 +409830006 3932446673 +953034987 179174721 +2910095429 1400013964 +123268410 3405607517 +1329644410 2805088688 +3291945537 2594095984 599675990 +3107792081 1816196358 +3009767497 2447152312 +1509517892 3886172447 +350435154 350435138 +3598677578 2419500582 +1579423882 3167920429 +4166398194 965829261 +1410947073 1692764566 +499790871 4233101350 +2929739210 2957892845 +1616014724 973590127 +1282286263 140551696 +2843065863 3411682560 +1463943156 1900328413 +2796391921 1412854374 +675802775 3970992 +2447381092 129823615 +1376925822 2964254303 +1479280160 4130982651 +719221126 735428482 +3538590681 3763558039 +2050582836 85387656 +475580332 1271026647 +4168203268 520813151 +30774024 3946214795 +3134006848 1626558435 3134006864 +4047465329 936780528 +2018173377 1926141681 +1490913641 2989189838 +2833324674 3288970047 +973042005 24245754 +674905513 4239331591 +2637339322 816419549 +1124662896 2090633156 +1185786638 1365526287 +3686201535 2684982462 +3882915219 3912988268 +1349803004 2626150532 +3627981700 4002336991 +158255889 3335103447 +2080902 224754938 +2917799480 1695143109 +1171925568 913343173 +313659089 1062032134 +1809211395 3313050794 +1952523010 1719406414 +3516010263 3516010247 +4057511521 421993120 +1878072688 2828097365 +1727474664 4279901757 +2177435569 7805872 +4114168725 3472086602 +4149015045 4149015061 +1209343022 105101678 +3479425502 1478713449 +1931598707 2974578188 +2756400958 3768211081 +3768211081 469121454 +2912218890 2199177829 +1854928249 2978215188 +3477393856 3477393872 +316804493 316804509 +1353564278 2005268935 +468015880 4061023627 +2618340414 3964386719 +109340571 697243922 +1980302698 976455131 +2459613294 1829475890 +1360123227 4063980495 +3771505963 219900596 +658542848 3399762707 +1354682306 3730902627 +2972605354 2516208795 3087441473 +1070228315 3332008018 +3635817126 3435471681 +2372641998 1853124697 +816530607 1285365624 +2533279551 4061374504 +3178146708 1750419387 +2644078832 143444419 +3716090499 3995320944 +164927708 1437377095 +678385796 726161353 +113576959 2805064296 +2385212968 3883044419 +3767357352 104580035 +3521225809 1573080940 +2944398533 191779340 +3422651302 430451010 +1716414498 3231898515 +2922025804 2030428321 +537146934 2627819278 +683086267 3928467396 +3363954882 1718931811 +1017144425 3648917838 +3392273307 3887011076 +1381111391 4130944926 +1726495071 1726495055 +3408554454 662793399 +3057137768 1841347221 +3549345463 3232342544 +4083498046 3233235725 +2376124544 1566736824 +1373417713 3938021782 +2868092478 2899409759 +55591890 1289871482 +4135040622 1734606508 +4178273872 1054351673 +3739889597 2812880514 +3888262022 1554678775 +307965973 1970975404 +4280075539 2907323642 +3993273983 2851186731 807385576 +3821089495 3341174868 +1315351820 2007132641 +1919136943 3254087544 +45955549 753014498 +2216473654 1259579317 +2388630955 2528194008 +3113366767 271143992 +1822940721 1027786544 +1736310535 1301741145 +3150232996 985041193 +3142368408 1909252955 +1306823896 1306823880 +2392151404 2392151420 +3115227047 4107844576 +4034546494 3112202313 +331718311 3340288224 +4133062061 1824932974 +3296375038 1260691401 +2117144934 222192513 +171648684 3340624087 +3090161439 314637790 +465384365 1473796420 +531871121 2028393296 +3242234028 3835936471 +1573060048 2156856210 +2192122345 2571133390 +1803221179 3986001508 +2460885378 1780400053 +847383564 2385290272 2394486497 +2019192134 3160016183 +2671712793 1350804222 +246080274 607127509 +3203125213 411143125 +2948562789 30782371 +2590566891 2013640739 +4074677897 1084951256 +967936552 478270657 +2778466816 3837386269 +4005253443 2288055060 +868123503 3823691694 +2925320065 4247207958 +2764986735 2764986751 +3265812359 3265812375 +3447305693 1402555106 +441144987 4288239108 +1912634521 2948991336 +1381409932 711264353 +2067865356 327409655 +2990462911 2990462895 +528415790 1017076861 +100135120 894441315 +3118182941 2983814050 +2743576139 3112880148 +2546469666 3047079979 +4258579616 905021413 +2934077903 1368298522 +4010680646 2571002145 +949053221 837115692 +1018367953 1591862800 +17135795 3765390853 +1801433913 3580410584 +2635273775 1946938360 +927055172 2459930628 +3337574000 1187285596 +1218276557 297898337 +4093608861 4093608845 +1627912825 948915326 +1023064525 2945084199 +1415293146 3921644729 +762483152 494627880 +2597223360 1930219347 +2113010960 2113010944 +3803269052 2568219889 +2174286481 3716888912 +2716536555 2716536571 +1451869450 1155608251 +1321720057 4254765054 +2985988812 4185200417 +3702964951 1253357670 +1475813100 1711648129 +2423871796 2423871780 +3102822893 4026205915 +4163880353 1412701280 +696512717 846818852 +886974235 1421315986 +788563879 1331047571 +2824255617 2172941056 +4167805900 3716117047 +331851517 541843540 +1162532511 3016744008 +2385842883 2693564668 +1383955965 3633141076 +1538568833 1392595293 +3663223671 735051405 +3296522470 917453313 +3732118247 385669536 +976379872 2102193587 +3567693583 44719910 +3854587540 2270037481 +1894845454 3648387609 +32242561 32242577 +2697733911 4052416131 945916208 +688669119 2245653866 +1231746673 73528304 +4266597421 207619995 +2607386544 1233633904 +2230737387 986680564 +3877735747 483483754 +2719494577 2952577110 +3898328346 3799468029 +3672481291 378869048 +397405101 4142924123 +2384189125 2060654604 +2483432053 2058671676 +96909673 514857678 +1847918355 1847918339 +974609601 868680640 +2271514770 3041891795 +3594463945 685660984 +110203963 777975663 +2233441907 63336218 +4094326652 3388822979 +4017398271 4087022718 +1909129762 2089555337 +1318909433 3122083560 +3143745713 994993985 +3122349730 3555033590 +2810867827 837747994 +2273219130 2252353858 +2765456253 4179492308 +2526286533 3491335194 +3094451969 1741965188 +1928751542 2951244174 +68637460 2226636921 +317452507 2588159112 +4096097868 2735067560 +1856967414 865786193 +3186848493 4080921362 +2348446129 205584806 +3169727855 2332746597 +2046053529 2876447581 +3396180148 1585931097 +377805120 3280315163 +1474187245 1761833179 +4027552834 2774701736 +3846880789 162085660 +65269810 2186892237 +1124933390 2611471129 +3264363996 2687382151 +112237218 704867587 +3056810794 4238746395 +3748462708 748140175 +1247240036 1804282473 +776684833 25023200 +4050420924 1386190443 +2387770988 2010973185 +3271631551 545537660 +2569447775 3020205665 +3507863289 507224574 +2151693401 2151693385 +3101026187 2210103252 +3170769032 201367069 +3643819149 2425443896 +300679799 2911363398 +2828095594 3183508179 +3784382466 426298147 +4073447525 1950949027 +2788630985 4215681781 +3832741619 2483509402 +3102891627 3102891643 +3796639650 3755330563 +3978172891 1314977612 +3412681981 870971970 +173109480 640990507 +2703390154 1933536507 +4123405297 3623300198 +4028447582 1543795945 +2383015189 2929735708 +988628322 629422403 +3802267909 3389496012 +1418797128 1752551773 +1332642713 2751015390 +3433493442 765364866 +2439079086 2907258671 +803512453 94357507 +3484372792 2920822213 +1244702894 2023328239 +2297407849 1289390798 +2496799598 3033384505 +2884268598 1210414528 +324632291 1491255104 +3738140133 2778935148 +3277354720 1682121388 +1234287915 4218210978 +4198705401 4038688744 +2742664573 1882124273 +471969846 2131256583 +1557092399 1231540718 +3144019273 594878905 +3866614056 1274358083 +3067663143 3067663159 +2235214777 1733859138 +1711674972 4153750225 +2520828479 3338559806 +595792718 894919641 +1478488897 2199407864 +2984940290 191219401 +1720847250 181977236 +2072030154 898526957 +2372310112 1334354747 +3841992458 2302506171 +3549729601 1407438678 +2986732228 921918123 +4096963558 1372664599 +816117184 21386139 +479856605 3816448244 +2301591160 2760594367 +2010422110 28349673 +3138229766 1771613586 +1197670936 63652048 +3521170391 3003517268 +1516274642 401572755 +688712140 2676021869 +1608888633 798358718 +627651756 3628401468 +1793220176 1793220160 +2452604381 245199316 +2801976552 3512465725 +3249950216 4194096779 +51622152 3758075787 +2249028564 3677181625 +3789924630 3193130464 +855602586 1829149557 +3580004437 3068748375 965069405 3555952381 +2651536567 2192610320 +348996676 52590367 +1131816879 8425473 +2272509119 4197589160 +966796263 2157496292 +1714904421 1311245818 +3329381133 1928904050 +4148564754 1431307589 +1659566511 1726418542 +641760784 1199993635 +2004105049 1693655326 +2380725994 920901 +2758757532 2000001425 +1868574831 3278651064 +2234244028 1611327719 +2568696450 2678576095 +2418287509 2418287493 +2222453033 2983240600 +108347108 244449535 +4092807121 4092807105 +2794981793 3204295069 +633240943 3655300536 +726253373 1645743380 +360351152 2145416195 +1814635116 2965450753 +309370191 1447535438 +1768713757 321714782 +3047989696 272819682 +1450662698 1206158107 +2499621739 2499621755 +2514229729 4166900742 +1526937021 1499931352 +812987082 310309883 +114200550 2636941079 +4243209169 4243209153 +4038303629 2009344740 +2315858263 2742594534 +1913178179 3335733610 +733714744 93264713 +839707114 999911493 +1274856080 786843829 +1285990833 1532830118 +1575249223 429859199 +3239871225 4175572478 +2206089657 3099686462 +3021859298 1830235861 +2400165163 1328229536 +2538636502 163650791 +4248855843 2397187590 +1626458035 1335713498 +4086497161 4086497177 +3403053290 966809677 +4069967756 1868308855 +1992393301 1201679324 +1190660357 3178640076 +1056983148 435177848 +2651417575 1783730638 +1194009421 1864246450 +1278400505 445442616 +424254800 424254784 +2516415019 1224391092 +3158078075 3458742180 +13113209 3576909662 +623269061 1671995133 +1173166031 3812391630 +2967567698 3304605701 +1169920101 1169920117 +2072843879 2072843895 +2908381927 2908381943 +3025630501 179136812 +347481684 3641391518 +1821590591 496287886 +959888564 261019353 +1841800264 683456867 +4054161603 574523347 +2204734963 2024428384 +626375472 4126518403 +1129233403 618156161 +3573724870 423999905 +2366962277 2366962293 +1645087427 468578485 +3437019173 929460118 +2149122093 2149122109 +1162027173 2042928268 +1973239628 1973239644 +2490619277 1062808804 +3235441708 3246115137 +481992532 2378748207 +1794406426 2027491581 +237518738 619815469 +3900249737 94246264 +2452849812 3139024111 +771757492 505555545 +3803735187 475476246 +3467480347 4192333042 +3515211223 1615753616 +1710446982 1710446998 +1850283875 1036508 +499782029 3115621972 +752458639 3596858806 +3066004734 2910739401 +1473464737 3221831563 +1333460302 1333460318 +4005305926 404990007 +161171856 3923760107 +844321798 1059931511 +4202029203 2105880320 +974865134 974865150 +2923519273 2045093784 +3713052978 2742565526 +656276176 3879588077 +1805616292 1297927304 +1568837683 1737031756 +3440001614 354836697 +1753522404 1753522420 +1663651014 3758349239 +744755727 1053066828 +2224441728 2561355099 +1339107222 30589047 +3311155105 3311155121 +3494982884 1198368689 +1196962811 247660957 +187693998 1250505465 +914702466 1438944447 +3797432462 3739289491 +843914713 140901512 +3940545958 1687139415 +3660148552 3449224291 +1822436042 3391314925 +3736050343 896562422 +2365920159 2683866913 +3328340135 2696767122 1366573584 1311424272 +1661877249 2390104272 +558167202 1219749772 +3465630325 2747584060 +2467362750 1102446614 +3649979816 1514134820 +1774348498 1774348482 +4183384569 4183384553 +585901977 2462209502 +154413635 3960424496 +584843872 3245611787 +1044225625 1409304072 +519425409 1039303168 +938267312 3117394691 +345657156 2962810415 +533981193 1209549573 +4213653709 734724772 +1406405734 243619332 +1879619929 3065759518 +3479514217 3846498638 +1212362664 1774454141 +2612017472 1356819767 +2697210024 3167486077 +1879236934 1879236950 +923721512 3563670507 +277413141 480667676 +2838686174 958802025 +2470834468 4091743001 +4262345533 2958603215 +3212285133 910114482 +331380950 2807702552 +3356452405 624813436 +2425194908 797058038 +3141838642 1406486610 +1169920096 642008876 +4052346959 2679758561 +491628590 744599939 +3978995468 3978995484 +2585532961 3141345782 +3599458676 3599458660 +897930277 1709405754 +1272750165 3243271644 +1208733408 1251388083 +3434554051 2016687271 +2338480902 1910628961 +4226295227 1282937660 +1319284034 3939401565 +523172366 619947033 +2630199370 354937979 +3625532620 4223317303 +3274507838 3354207070 2111886239 +1708931835 1986384808 +470690877 2851400779 +2343436673 1662524592 +3881909994 672533083 +2998021045 58379772 +373032840 2290080541 +3474942146 2253547211 +4032317757 2204792866 +477943950 4102324189 +1081328402 3180460606 +1617497447 3217118329 +2871986132 2161345085 +2683797395 1704842348 +503620623 1347306382 +3277090643 3505078202 +3301073059 1627267210 +3785350734 69160698 +316556527 2833392684 +2620227430 1100975489 +3288829116 110886892 +1767197846 1732743207 +4116618446 3577097753 +827640886 3732764945 +1060154455 2214507721 +2551444232 1869059467 +2998576398 1775359247 +560816987 2639794789 +1382244058 2356039979 +3829943632 278656276 +2093683570 3853491301 +1744358910 1425298249 +3237198496 3237198512 +2193669172 157828569 +1727195609 3915784328 +1115170135 4196583398 +489274023 2410730742 +3791467100 4125400196 +1093303463 1021459190 +1276785376 856610001 +2765613589 1866923194 +3866670442 3866670458 +2575597183 714285566 +3738791905 2974490400 +569751667 569751651 +4066975313 1540736919 +705774990 542587663 +893911816 3898393995 +1123960117 179281114 +4042031559 731733064 +279359813 2070482842 +2351586173 4176683849 +3134739894 3633245585 +3044550035 1059268204 +1497868072 3016500221 +2144345117 1369194914 +775387403 667183405 +2075076495 2075076511 +3907630976 669769363 +1136582055 1136582071 +1400291704 3690106875 +1974704653 1455129202 +3334109120 2542437203 +3705872881 3705872865 +168500518 4118733505 +981562879 416071806 +873545497 270947400 +2780204426 1751175213 +1036181108 4288321575 +818607817 2558688878 +740424611 1948377668 +906529171 2725286522 +167417869 167417885 +576436769 929432032 +1445262700 3791002775 +2916834706 1112820933 +3247954838 1477356846 +1757860003 902470792 +899580625 2868733437 965209882 +4054173626 569993675 +3117741431 2056072652 +3863093217 1528311606 +1844660314 1794169301 +1217777917 1087897172 +991380456 991380472 +1104244787 2576044109 +3258600392 917384908 +557455777 1554536455 +3975235780 548133615 +3422541912 1522118055 +2295512819 542516343 +2313922183 2767660694 +2128019208 3027466635 +1236921709 2091958916 +1833426708 646965427 +2364246971 3920196222 +603988247 3274970918 +2651228261 4151839626 +168947979 3846075476 +3212195338 1897337261 +4115779527 4140439126 +877986923 3905933966 +2422850471 4252958688 +3927739899 3927739883 +3595786791 512269528 3910068251 +3093800448 1486822875 +2620483133 516157954 +831011401 1114882286 +3756571913 2220987694 +516196043 979382676 +601283536 993790051 +815911370 2901232421 +2928287965 841676770 +2033748121 1828653278 +821570548 179122447 +4085170558 2200924297 +1242843770 3150228290 +2738312158 4033165822 +1898280184 1033835471 +3437279738 2143601821 +1997248122 2674579267 +1467504702 602260830 +3150572024 2530955643 +558969029 4128561917 +832929841 1485360432 +1442500352 1507056901 +1084851909 2521571581 +39693431 813072208 +3262122082 3182829418 +3337504045 1444341202 +1647845363 2438613900 +2636960688 496057859 +4008666374 4064287253 +3280964310 2969013991 +514706561 717250470 +1011690895 2088679448 +3872793714 3977724429 +1646973071 2232528664 +1670725679 1915467704 +2704624410 53239139 +502421655 334972487 +880479548 2696219767 +2473138240 1316039891 +2300724039 670034134 +3553074147 1178232412 +1335349760 2824415693 +938122659 7250042 +2559081489 540870653 +218583996 1049153767 +3227338615 199047042 +3475665868 1613804000 +327285495 327285479 +2916470098 892835854 +1716332938 2507695163 +4090621569 1417311510 +2632554924 2632554940 +4010197062 4010197078 +127588275 1542136525 +3275313724 3979038183 +114726370 3167563054 +3187165760 1306321605 +3145793404 2819764273 +142369917 3637653698 +3034155543 3379847718 +2596176824 524715660 +753967441 3140393676 +163962737 1590415476 +4256174225 1786871895 +3919262594 1095898549 +4033033062 1861925041 +1092656620 1092656636 +2271616079 3785564390 +1511239931 4284563451 +1040658991 3562274798 +2672467924 2672467908 +2976395880 2936494525 +1149358735 3518331610 +3463890303 4210115094 +2290845774 701242329 +4100045079 3436601126 +2329125002 354793773 +396252203 1497268148 +3238930667 623168270 +3231187649 506142694 +3325148159 3325148143 +963841165 1715818469 4246520306 +2893259229 1454195243 +3558810375 4093912086 +2775180558 850634393 +4133937623 3136652656 +2299134954 2764319053 +3641449178 2282636587 +3555638729 3555638745 +3000570671 3918216300 +3283143193 575478019 +2875557126 3603982433 +2335141501 387308404 +2175706571 3694838520 +1075368262 2123605306 1798934191 +3952216378 283412043 +1227643432 3480752725 +4144912246 306400126 +1884756341 1310528291 +4132379251 549236363 +2942960498 2514709619 +3152382361 1666685896 +4285088823 1236689542 +3283693435 2542124708 +3290281024 4266842027 +3938342701 3064150980 +2447660241 1504995425 +2317460345 3958658920 +1458088651 2604981634 +3458747862 2794828788 +2275908868 1335575452 +2947237712 3668001507 +3815089793 2217426343 +2132920256 1384936859 +1144039005 1089899678 +339595586 525363957 +1629675766 3756532551 +2959939931 381610578 +2617996851 4167945632 +2082875387 2947156136 +2461234416 4111292040 +3685342568 3685342584 +3393419442 3393419426 +3385390526 2902810313 +2670216964 2422721375 +3539833794 1391462859 +1211440942 3651147129 +3040131747 500711302 +3456100558 3716460623 +1589037633 2253219436 +698245117 2169576276 +3141947777 447800922 +2876905709 3728030994 +128503669 2399457562 +4104822457 1611745438 +3330675293 832571212 +3352506439 3715904905 +4219378728 2863211605 +918622902 2473121025 +2676867268 3828138954 +1371333786 1180425835 +2100883301 1513771222 +1283683921 3287499152 +1011579796 1011579780 +3359120339 55823674 +1596208224 1134047319 +2364030744 3919270605 +1295602303 272424446 +4255504839 320197696 +3882979312 3882979296 +499550170 3112688683 +2303760159 3889900641 +569057872 3039232995 +844338734 1943385812 2067170941 +180749242 2948062658 +1933170236 1682534896 +2612299879 2217916982 +1493434017 3259619168 +2196174928 2561802429 +1249361802 1249361818 +1753400141 3537465906 +2900277185 3818603734 +3701416412 4077523020 +1310438408 4254886027 +2917955520 2917955536 +4284229965 1259668516 +2744244963 1637585738 +2423263277 2372499154 +2833399191 1931932848 +1951849844 2562629007 +912401749 4222996550 +808123150 3785963289 +3335270575 2725290872 +4253509917 2681988866 +38613908 864563695 +40033919 40033903 +271265828 2549926079 +2870102952 3023377990 +2723277117 2723277101 +2622630111 4099299102 +3648084400 328973325 +3262245382 525559649 +505226854 144926032 +1736192439 2813318959 +223548295 980373636 +1961174422 2595892007 +3345330154 1465820741 +2298906820 2003008441 +3517942571 547918108 +3286467471 1734777619 +2923008762 2923008746 +514843904 514843920 +508975885 938050148 +1784384876 1623880855 +3860573286 3210819482 +304368532 1225753343 +1793950940 3212616129 +4120280643 2984228775 +1936125038 419836207 +607203418 1441081309 +1057113007 3556048525 +3542907157 1937295243 +3490045346 456910339 +1040893661 1040893645 +3609224184 2684182395 +2801814627 569292406 +2998021044 1078964255 +1139382191 1695763762 +550891192 1757858747 +1671034479 979300536 +3106710292 2504308847 +1639578570 2816116005 +2944794298 166723275 +3101250470 3008131815 +1047114643 823440308 +2900109799 2404415816 +2800688120 2018947204 +1871456312 823604932 3517141037 +1889970405 3953287196 +2429858415 1842668728 +3862089521 2465999398 +497092960 75612723 +106616171 3071533213 +490420344 2015582919 +3809933708 3809933724 +1051505009 1051504993 +3854080402 865714387 +1659754028 3899139927 +3074189727 320488798 +1088402042 2586179083 +3493381273 1650293960 +1739960663 2584095718 +2990227422 3194393602 +2067629867 1375531864 +2266047636 3483272191 +298250202 3593180203 +3505939960 4010313083 +3538209621 3145450227 +2831820282 201379378 +1535687447 605968007 +800010672 3234543637 +2271811458 391287691 +3631831317 3691461642 +777269205 1380154601 +192831365 1633975482 2632998483 +3507482499 1087431768 +1542799486 3528427423 +2242023318 2957404257 +3513967018 1641627277 +2732965239 1819501538 +320997657 932467294 +2754230251 108600019 +3453749610 792095452 +2446578408 2020934443 +4279582366 266630722 +2235441209 3504004767 +49770132 3534547957 +985347323 4244528552 +3354736398 1843557380 +3428248066 2933023011 +229226156 774541527 +2985715254 3108116362 +3511934314 4043673051 +2109966483 872139152 +378092799 378092783 +26733183 19277288 +901678723 502120490 +1430479338 588456795 +1159129158 152020513 +4261485337 2693793186 +2821451264 3396380108 3930792320 +2814457484 436615960 +461531086 3398481018 +1842693350 3434837534 +2647148172 2061214391 +1545510001 1627261206 +718517340 1697154194 +556371542 2322272622 +3490082732 300737420 +4222623309 4222623325 +1480743039 1869697000 +508066233 1580078402 +3249846425 2289998024 +4290671886 2603071762 +4294313307 3391853832 +4217349298 3845125150 +1350984823 982525776 +1179954086 1565144641 +532748649 3626072782 +3399528606 2320483497 +2734709444 3505298863 +4221840921 1014272328 +3602007696 2326074549 +2326870628 3103714175 +3667170791 2650001913 +1588143082 3939816064 +2883792675 1475020816 +3078688166 982155061 +1104239100 3770155491 +2777090181 412248410 +1572081981 3114212580 +1157378212 1023447615 +3705039904 2265583438 +1700993804 3416378144 +3465308179 1180025472 +3107397892 2512976201 +2804949714 1410832177 +2360872893 753589006 +3049455515 3509426875 +1617728309 4293639292 +1813565707 3814279289 +2338480082 1037883283 +688065451 986406434 +1760345554 1760345538 +2764395245 1335986971 +3685536352 1608782125 +4239754696 2579601867 +4048656531 3813910295 +3765269967 458257614 +1044680770 1206851573 +2890895068 573448445 +3192612806 1454660791 +2949289148 2011702257 +1358455919 3859159736 +4191506886 282049185 +3676680849 2371361350 +2342467892 4289137871 +1019320328 2898416779 +3725510278 390235361 +2829544405 2763671667 +1543996431 4006929304 +2180995458 653911989 +4235785364 107545849 +1230862163 3508721580 +4281395012 4261154847 +2542659501 1097053522 +678568696 2746027117 +1258579748 1258579764 +800751224 3294714388 +2211953959 3013526624 +2276308768 3061270373 +2383617031 2937396992 +1159911401 1057070424 +1679379508 1113804919 1113804896 +2571124148 4095812185 +1375465386 1375465402 +2976598384 3152321347 +6438749 4155096948 +4081476794 2983235787 +1277367020 378271418 +3927962899 2739850490 +1863985466 539944523 +3256773236 656207049 +3246802017 123577526 +1176494238 777680041 +1928841759 454242014 +4042083019 4042083035 +3276834042 2656676309 +370222751 2435826443 +2330937105 606360260 +46059003 3949074540 +3551874081 3236298381 +373503822 831054543 +2005818409 1578833048 +2293947776 3190468741 +2778672181 4245856747 +2845698467 3563223958 +3387637739 3361054452 +2035820478 3572768519 +1765627858 1179296925 +3399231262 298947625 +2957629437 3090292962 +1823166883 259141255 +2846572088 1351807547 +2312454403 3700021708 +920513302 4145908777 +365261931 2966832244 +3014942486 837407998 +3551573831 3551573847 +598917079 1013654424 +1416729287 3049918272 +3118460921 3603673712 +1217210585 255282590 +192662491 4007782866 +943940237 521413618 +2689675680 2603852397 +3250379312 3250379296 +1667495867 1836427101 +3888555729 473495183 +2599759111 4143309312 +694617434 2267901117 +2504564147 3025158348 +2736254587 967601060 +253771305 657132942 +293029525 331619466 +648431855 2707037991 +2735645230 3725151865 +1328475237 844153772 +1240785513 1730735054 +1203777851 781025266 +3048321891 1774019804 +2450348439 3393307272 +635243671 635243655 +3840546806 811277842 +2335138457 3029874398 +2189517254 1547009542 +1839284032 3536288027 +2643896114 554512286 +1642959910 4221213823 +2062712625 3166583334 +2706884135 328430198 +201712041 716958150 +3104788097 3558380800 3558380822 +3199667569 2871666928 +201131007 1710168897 +3078563194 1462238987 +2436635898 2255158150 +591172849 1767798640 +446898165 3821751996 +581812715 2189968610 +3691093135 3850990862 +2919512349 900385803 +989002995 152801888 +3371884557 2797997924 +2808595056 2734481584 +2564382332 439336237 +1297952405 1588614300 +2805236433 145354512 +3887033957 506120428 +2052954344 1813136795 +1390277299 644157402 +860064721 290184200 +2302829658 1837365693 +1214438868 1214438852 +3924229336 166501973 +4229351647 3889209739 +1273935820 1273935836 +1003630802 4259502725 +1960987890 4064223461 +1555315508 599339728 +2417248455 3842408026 +2749171447 3958503110 +1331518882 2000465429 +523062852 1481782559 +783525361 3099401735 +4066940682 3299486061 +2390887806 3569040713 +362149598 3641941887 +2109455893 59521802 +1533321883 2053896722 +254665538 658292963 +1188054252 1188054268 +3196683339 1031488020 +2732789326 3111093465 +979714318 4217727247 +2563295219 1997718412 +428828262 576431525 +1756703561 2252514191 +1771379904 4122755667 +3387133211 1300390558 +1476742360 1750595611 +3038852917 1481238634 +4267940717 3821907090 +102110368 885159923 +1276635334 2409852833 +1862272760 3037395067 +332530957 1084093298 +2996736755 580998284 +2582952749 1309842587 +4213538006 4222842417 +3863401915 461108748 +3746181326 1338692697 +3090139131 635218111 +3894327292 1683726759 +4098040195 145604906 +1461990308 3523037993 +2854446824 3183148861 +267063711 2920070465 +2009869772 1651251233 +2781754632 194870173 +3353394241 3888667222 +3792644061 3134963938 +2777479218 1853725659 +3456828384 253583021 +2308784810 1284501901 +1413707517 2738114644 +1988782817 2095464480 +1002846053 2114532346 +226421782 1422763697 +1846451432 4255178080 +2643896123 1328103908 +3042638813 1548665719 +2924586036 1696930975 +3139656538 2864535349 +408061845 3939264343 +3509955046 3737539377 +3351066810 605610882 +1073609731 3218323644 +469307453 2731263872 +1575559854 2214696953 +1563555817 2661893070 +448970708 4103338661 +3108868544 3129645058 +784459325 3627905547 +2694842329 2694842313 +2127333098 839040425 +2180541213 3071319714 +28044035 2762143146 +2991769789 2991769773 +3874549288 3041323243 +808431984 2248093405 +2628240097 577776913 +3188955980 3188955996 +2121288543 1478432856 +2399272266 1780595565 +346078956 1695321495 +2360588503 1441528432 +3578204378 2564785981 +2570523787 3166000852 +1540855216 1147184149 +195886705 18365184 +3880339394 3663459957 +2995212456 1279274179 +1143480811 1031138328 +2959251324 657750055 +3120832041 2539777433 +3443700729 2572165680 +1482294643 2293666828 +2751453139 4274045242 +862211199 2365423347 +1194778734 2304986425 +687393312 2678468709 +2742253142 2764261735 +4204627764 2320927060 +4202285447 4202285463 +2915193953 2915193969 +3539482083 3539482099 +4080994764 740179507 +3368269579 387524162 +1794990389 1656441747 +1263216660 4162122623 +2040079747 4011199804 +2447173457 4022346886 +2311902321 857379603 +3430999154 805364062 +4230641346 2610184202 +509185971 1004912088 +3293128520 1636077418 +571720108 3436401212 +1006333255 3016558294 +3303190264 3303190248 +2740393513 1120002053 +1456808611 2855462800 +1330456012 1330456028 +3812727624 138900061 +3438067709 2799425551 +1323528418 302691285 +1410984817 4192360496 +3995218777 3504977645 +1216110978 226487691 +3819647002 1472911191 +220944385 3158018454 +298529953 2749618528 +2058502802 3097414597 +929212075 1832509134 +2127069976 703020196 +2857269884 2508902705 +1783183021 4265677403 +2755490971 666800132 +10525462 315892657 +2187948950 2187948934 +1298329959 208540004 +448710130 206674931 +2757627618 2757627634 +1236193549 187897700 +957079687 345825160 +2373254307 716692114 +934970546 1584370718 +2496698912 4256680856 +3736381565 1247716706 +122164819 3380290732 +2195539460 106248265 +3058138353 3817451366 +782093613 1060168347 +3303676898 2000121646 +2817302089 3037574226 +3151384574 2959076553 +3669913106 4256412859 +628575172 3201058185 +773971687 2253514144 +626579799 568206320 +766044627 3018331948 +1457302685 1516485428 +1213525643 1756595412 +1055568376 2112963200 +2335445509 3321609770 +912195621 273854358 +3289883427 3560296476 +3689227145 2998333614 +1129408697 2988956456 +2496378570 703101894 +2772481252 373518661 +1853861156 385716137 +384449455 3938747273 +1069871391 2181534664 +3328959703 853098096 +2890383327 2826028513 +596713762 527902851 +3539217445 3539217461 +3454229362 1386026758 +3371227456 2468741061 +2304749645 915262715 +4153922214 3375555206 +29427427 2782779228 +191085979 3356350364 +720393182 2943315580 +1517974641 3754249702 +1633657921 2324664918 +2860963422 3643981929 +3328652939 3749371092 +352114886 898583825 +1524125598 2693092799 +1109741431 2545686616 +1129553045 2443148956 +350499481 2084284104 +2529560630 1418668114 +1190660368 3363193891 +2495356418 639843619 +1301494696 4122454288 +3993926098 2829191556 +1786497214 306400674 +3891610623 639240808 +3132069692 510333809 +2382584088 2806333659 +4199353855 105711742 +3003096823 3211214544 +2387632771 2387632787 +3687780742 241838085 +1957248508 2725024679 +3278590731 2901654100 +1791613915 1791613899 +342803991 1096930854 +3005871730 3005871714 +2658067616 143779813 +2951973071 11778843 +1454403758 473160002 +1819157727 1434279306 +3649035767 1531603910 +930449384 906293803 +1809958042 1852341867 +4218006633 2001983260 +2241312054 2332104449 +1430256284 3484910471 +1317433517 3849515956 +4045797458 464331258 +276300567 65854758 +3724065161 3724065177 +3022365202 1536905022 +3100377214 3185854367 +3062764437 3519347697 +2603859690 2603859706 +3822237085 2486390238 +4014974327 828471888 +1803899894 333376069 +2275317162 2545050117 +14481984 2615014099 +3568428067 4144636682 +224929179 3052614418 455195429 +855986605 2367869704 +1496772506 192622461 +1959585794 3767614243 +3112703038 1329061270 +1099444871 1841633449 +3514946923 1573620623 +3988886807 1589490470 +4248461737 1273478414 +2259040505 3689862371 +675484174 675484190 +3323679312 755143651 +3114637113 2024607422 +248527250 3821707475 +1885328952 517880379 +2215438748 2085863569 +2893224289 2623890423 +1558005967 4284063182 +2444059884 1073078173 +837725014 4038572155 +2749501411 3755934272 +2014792667 3886836184 +521479749 860569228 +4278892642 2970111869 +1979038126 3366067246 +2083843746 1347573690 +3440598283 3059641390 +2180005322 2995110387 +210559935 1724933994 +1867555652 1902729775 +2604643770 238037141 +1889532409 1154908904 +2210247610 1894340245 +1475455293 2926406402 +155720409 2517658466 +4043254249 1252981208 +2281195269 282578124 +3439366988 3406209971 +2154673999 435801499 +4053478339 2957181323 +3562171953 2209648832 +690364178 690364162 +596557845 596557829 +1263781970 3873724691 +921777444 2713102240 +3129995212 1105759712 +248425558 2774092647 +1953105138 951801485 +3910703310 512024655 +3725665000 4135183031 +2529661461 4183971375 +1324074629 1516083887 +616793916 466477937 +1073627095 3663900727 +1328952 868150996 +3634796161 2403265814 +1855075463 2536026262 +1032931970 1032931986 +1972450647 3215480080 +1294972835 173802640 +3228161050 10020093 +3455589439 1169658859 +3442156520 3806955069 +1024315900 415338417 +2600194305 1575303216 +3052880220 3493585863 +1750468890 1500533757 +2778211257 1736457278 +141160063 2702790716 +2512365282 2931019493 +1721666136 3818113156 +1542557518 189044697 +2230708182 1736438122 +91901873 1351316400 +2612400348 1752022407 +170469535 2647323230 +3715783284 204625548 +3675942818 2359147541 +2899682710 2857610033 +3670790957 2614980562 +3383400153 1351317406 +2253773742 3657738738 +3693749611 2465487759 22603636 +4276879687 2491810496 +1138386794 986762189 +601759268 2594796223 +4235144750 2433069689 +2728377677 1316421668 +2643703754 1874895141 +1706174595 899401191 +1903265715 1965963873 +2212719304 1728125131 +3148308426 846973677 +3233964274 1677630693 +1358773885 4222181058 +2742841143 2481132432 +1319365044 2267762793 +1065781751 4157288400 +3135181143 2217233382 +2480930364 2480930348 +1663905313 2502630371 +976481434 976481418 +1604574090 2011741359 +664990300 3246622407 +3553795908 2496771631 +805025873 3661834128 +1953191546 3203998219 +2461177370 153242365 +3127008734 4139136087 +2458541520 2702714532 +3372261059 788131050 +974933841 3415268496 +3723299231 4213581150 +197109283 2712832266 +3771423163 4217659525 +3503722879 1086786280 +56402110 147917590 +3002221432 727725549 +98330496 3119967891 +1084622404 157015327 +3072813312 3678578993 +3390815888 3115121827 +1850949181 1900515636 +1347080630 466100625 +3338058259 2030396567 +3358379105 3358379121 +2577013610 932784077 +840180831 278443873 +1556469317 986430588 +117964931 680306791 2493042236 +1974105295 173400526 +485985405 380774594 +3123524834 4146741205 +2720453531 2935663944 +1576019035 1007237956 +3657618380 3811279436 +502364411 2460500414 +1624301348 1330291388 +726087346 726087330 +4281058102 3890499079 +892608900 1158726345 +2071867839 648564648 +1880865033 4238291822 +3047933858 2674607107 +3780975506 1469212357 +3796620312 3910567144 +2404892455 3747870003 +767389878 767389862 +111704340 2402720377 +2808494209 1280845539 +2359975385 1227996318 +2075079728 2433228360 +2222606417 3812300183 +2515718805 2722201756 +1300536015 3888651546 +801278444 2741959514 +607718608 3587124067 +3541350391 2283348579 +3708866493 3195471490 +748664257 1529844296 +4060498101 3034871018 +1579052240 1579052224 +1214163610 1214163594 4199897205 82126086 +912098755 1139783463 +2633661969 794064070 +30890052 720084347 +3699578977 2204065983 +3147077865 871151320 +2989551869 2148228674 +239285860 3620642687 +2287910172 3023234001 +2998243033 1874389077 +1363187691 2868055133 +2200644193 480813190 +3710755073 2515083965 +3863153014 4052214993 +3221406537 3505964731 +2279337797 2579886704 +1901646257 1439164140 +1694725996 3483554172 +4159715024 522602869 +4036660182 2571772401 +1691278428 862915047 +1881113858 2208195114 +3645722190 154672923 +3690289655 977051600 +4107058185 1619095588 +3306194410 1124262291 +2353742344 3799577227 +1402687249 2927458246 +1818651329 3278096368 +3676651917 2292592868 +1214124190 2316576959 +2295096274 307338982 +1023712968 606103973 +4008486578 3498732069 +1473634664 2914113204 +1070049704 2476211516 +1083867863 2319186032 +530194348 1805638615 +2525873449 707616647 +3928360079 685321496 +4096108806 1565070433 +3709525341 20780354 +3964432598 130830834 +2495490569 811347000 +1703994382 4044816911 +3637731188 2652334537 +4248457751 3117365808 +3025587441 3584335718 +3966805349 2589220346 +505646794 1698025509 +392048536 1820327205 +2713937707 3516623028 +1925531674 3331358973 +3727934480 3682444579 +3300874912 1497082355 +2828456805 3396257772 +2667336853 938978092 +939927657 1080209732 +3297823640 133202011 +1498361060 2342915288 +721892779 1733917748 +2497435606 739558897 +862118900 3635206415 +2258592061 702944002 +4027869584 2149723573 +3018724478 3184149087 +1336375250 527629495 +4108828805 517427370 +4289167840 1420915635 +1341574101 2584155258 +2430396696 417403557 +2116124222 4264147274 +2342601198 3168455087 +2556705961 2395700760 +903513695 637634440 +163408863 875614238 +4280556058 3883078645 +3521921544 2129392285 +3394121372 353591175 +3503253341 2463296703 +2600106880 3512115761 +3226171508 3805484113 +1916617987 57776200 +3141063044 1047646921 +382614674 3315099451 +3717973445 3717973461 +424943789 424943805 +101900901 4105856236 +1976097789 502363761 +2252133302 3158546817 +782140986 2643283275 +3727284060 400426449 +2833024752 3274206147 +554762765 449198692 +763399845 177138531 +3194739073 1153918486 +670972372 3375696047 +1087293579 1450738616 +2361041431 1392077187 +2664194804 4022322713 +1898341332 4084147897 +3908776124 2327351399 2376666092 +101923193 155416936 +1325878311 4185008703 +2386157865 236811160 +1378722042 1473538443 +253861171 1132431525 +3937700274 3540706925 +3161533702 2028754181 +974152688 903349002 +2918232925 787110754 +831295806 3160868193 +2806442698 514038779 +2732926084 3714766619 +4008755256 1560188973 +1049464160 3637874213 +2917836704 1751507187 +3999825493 3999825477 +3229408978 3599942789 +3370674710 1541341361 +1167882684 4155081072 1364435697 +1410297036 541607223 +4080095476 448167339 +559091568 534188164 +2114739075 3065243795 +1838807087 969615738 +3800712297 2627152703 +433283834 1654675033 +351098691 882925162 +36973316 2082453321 +605306928 4225829781 +4031070007 804592546 +1091263990 1524951633 +1551533018 1820066035 +2035916583 2129188147 +2777915781 3281523459 +3182837389 853833714 +920249754 2645924089 +3345013818 107463152 +2606104938 2606104954 +2781577372 702453545 +3148325589 3148325573 +3882557068 4187372215 +4213316065 934198560 +2501137960 3607339261 +653493507 1415209898 +3067395677 3067395661 +3907700116 1033177071 +1111339288 1595787483 +3257183653 4027962058 +3919960201 1494474680 +1606331538 1539082677 +570625092 3469496073 +3461027254 2509284661 +869603205 494143052 +1168305461 3564857980 +2683389868 1960039361 +2479656057 604054142 +418854852 288147849 +3442544169 758729358 +881290339 402220999 +597337182 3985514556 +598599927 566607046 +1380616601 609655752 +977336845 3242828388 +1680510542 316772825 +599531266 1126486051 +2832477343 186639287 +2329981123 2357717629 +3616429710 3809624473 +2683772579 3543876496 +472251731 968755373 +738186460 1175921041 +2576868323 2576868339 +1549572147 2562955354 +1118344363 2590116130 +493883300 4217937727 +1379312653 3631642171 +4104278673 2894592592 +3528470004 137910041 +2724855874 4007553013 +2682122038 3764359697 +652132167 2007440598 +2353361407 3495064702 +184129984 184130000 +3250364525 1760594820 +1679210915 851852170 +1438967305 234233912 +1305651171 2523633404 +582876128 112531117 +3057720291 3414091338 +1295508739 2449310634 +3108339172 1438908601 +805205377 244513302 +962388095 3426052094 +4054588919 4054588903 +1245984066 1245984082 +3211378910 830119273 +3535308967 1602166496 +2714713336 2973563515 +3901725448 1037594147 +3374183823 3202191473 +3025032096 2001577189 +1792596319 4064699915 +3330787476 2271159951 +1740653479 515701049 +2115143674 1898712715 +3976231476 1002456767 +101840544 101840560 +969601779 3984356506 +1738980696 224020588 +464291553 1930571300 +862529065 394728078 +3141739566 4172412015 +2142697655 3288958982 +3736102317 1018171204 +1512724838 1454029719 +2659757608 2992325155 +2787423074 3989201749 +3483305466 369529538 3512101003 +1076135570 2340411333 +2916561492 3718450100 +1713134330 3097704349 +2926360639 535007228 +977201629 2383029986 +1853213383 2859349833 +78273957 4247874220 +535898379 4270790712 +3551406615 1378632240 +1089622678 3547857454 +1700594967 1493539907 +3466416892 1034527399 +298805347 1820414922 +2284348278 2284348262 +364022997 2953002362 +49187654 3817160481 +1903721146 3620821330 +1118834286 846055474 +3396343043 2976977852 +2266374491 47612484 +1608745247 304366536 +1658612919 1476338704 +2643896120 2941595820 149634981 +2485995122 4036741245 +4208580735 1676660712 +3783528091 2648899090 +3887391349 1527159834 +2058694050 3442923029 +1089404585 453172214 +4210204256 69716568 +191373944 1827554029 +3795286012 424796593 +3084610911 3446484104 +2491468054 3703344561 +3871014606 106896985 +3933364428 3933364444 +2838542352 3091173517 +207833835 1800335330 +797620559 3285426074 +744506151 641946553 +3965728443 3598067812 +4215650417 4290861542 +3113738033 1528060454 +422615670 1081582722 +4179351390 415902079 +1963214995 3943664463 +3477417227 3477417243 +4171194937 2615648190 +2112254202 734255499 +3370712174 3032834361 +2277775614 2418884781 +3625608479 3625608463 +491929021 3849793666 +473959803 1589269394 +3729077662 2230544319 +589063875 146130154 +4187972538 2951347677 +2664673649 860202518 +2060984954 3238544194 +4235785063 1768486471 +3343450783 510642959 +1554631831 3948075028 +1023988199 4225920672 +939278099 3246262016 +3833203898 1713506507 +1134414459 3966091186 +3018922430 547627721 +2721881190 1894600240 +529937333 1853056490 +2838956005 2838956021 +418391462 2696713457 +3168372028 934209639 +2221170121 855614318 +1465871292 1194760433 +952436432 774486371 +3816205446 3499537693 +3697227542 4293113767 +269493998 2444654002 +2558257955 773007370 +3774495744 703362067 +3527647580 2086791884 +64145456 886121365 +4017314403 1435978204 +3986494847 2370361086 +351873961 3377690382 +3899499766 412514197 +4223843607 4223843591 +2025567056 1601914595 +1920899737 1920899721 +3930208264 1926175876 +4031660250 705699446 +3755459981 437765819 +4014774072 3985771821 +156384940 4220636390 +815748305 2206136699 +2291385594 4204729757 +2544195660 88735649 +593165554 2587635941 +696315924 1299446655 +3304377568 1355468717 +3740941578 2832058482 +3975826397 3943001332 +2159427396 946755129 +797234155 2766607261 +4230951243 1555969973 +2832096206 2329576783 +3613559670 1845297233 +772321125 3669251308 +2034065925 3768667596 +1176796121 1148122782 +3130436154 1113551125 +1323064167 2346967840 +3990597665 2446738422 +2607523807 1793461642 +159311326 3502496895 +1844478014 1335484831 +3194119190 661101263 +2699970579 1780184570 +1072008684 142572933 +26863965 26863949 +4211413293 714962309 +3351886653 2490553890 +239229219 2507297290 +3847933050 2280645661 +2776367011 624127388 +2230399414 4256252305 +1073077805 3708600530 +853107029 201919911 +4059517884 3891906297 +1620419290 3851377981 +2514229805 639164954 +20147992 4227326683 +348655396 1284330172 +798164175 798164191 +4027147103 1036480136 +3696188403 3287138202 +387056191 2546645163 +79490742 728483975 +1562508574 3129046591 +2179701232 2202917229 3668635006 +3048844641 3381287814 +816775051 3892411754 +369456604 3368070220 +144081441 2239605216 +4097859245 777325124 +1629426172 4134119212 +1591919789 201038930 +2191865658 1276124005 +1391006039 1391006023 +2334182621 1249499947 +2144472503 110910441 +3127250742 130895007 +2116028545 225272576 +3140657039 1542164443 +3383165911 973275476 +549654699 1041448244 +2795180665 966714304 +3569364731 2083317694 +3009713379 59741584 +1069651328 2544195931 +2754559409 3909571776 +3908010206 2399657343 +1610811572 2647415659 +684376964 2019497081 +4028901184 148392388 +103519545 994780710 +2888217998 2398080665 +3927162787 538357130 +3421900838 3035284326 +158655128 4011681829 +2834457509 45589298 2456676281 +235418796 3270175447 +1425370769 1331498566 +1335189728 3677324205 +969961111 1298090499 +2329814709 1354165994 +3782745959 1461284640 +1517842458 2241362155 +1582869251 549974119 +2855431372 3110159649 +19125128 1399193355 +1167577118 2885459753 +1003117835 714111042 +3026501010 2358668485 +996992072 1551015293 +1752784537 806577999 +1432889101 318800515 +432357124 432357140 +503962856 723657925 +3493097870 3493097886 +1891231427 1206697085 +2090782781 1795280898 +3472171585 2724203366 +188108815 1749517345 +2916983851 2642073688 +3637076863 3288834280 +2004786657 1560462998 +151126425 2852763457 +211173797 1971934906 +4030633679 25651160 +2986394645 2986394629 +3584443704 2361325357 +1183393258 4091981645 +132044185 4241113054 +2337367668 3307489423 +2592996388 1470990268 +2703541747 3896802597 +2942016354 1415801469 +3815735487 2588230846 +3531076546 349485667 +369568593 4266209424 +1350790906 3102192541 +3906597881 2283475198 +2991431964 3426000657 +1474016812 1910142252 +2179701238 2078498385 +3798312532 3978505344 +542652692 4276214383 +475199894 748611377 +218071714 2684749614 +1770274195 214411271 +1500952060 3521149873 +4067504922 1442354416 +735924686 608536399 +2208729510 3844780119 +3814296290 2326636011 +455995823 2018735736 +1912432417 697835731 +660570430 962098313 +3499479555 1591319210 +2886150260 1128574607 +2288079197 3161106754 +4211785889 3538763104 +3440530782 1349673090 +1845007891 2476777623 +1735748005 3928397544 +2429366319 1459970277 +183662829 3095579015 +3786944693 948737961 +364861064 3291822109 +1421030890 1075699533 +3572554885 3156944218 +173503045 2359878298 +1467041885 914193007 +3991517819 3991517803 +1734242229 1766632150 +3054362692 504979247 +3506933515 434515522 +3873832448 1009817680 +2181428630 1110279404 +2979964111 1807577550 +1801352703 3472352170 +4026958533 3414654204 +2191992686 455283257 +712994130 949557253 +1238041007 3650332280 +1462508041 1131215928 +4177225866 2112625092 +1895574353 3826112881 +1029887697 4270570081 +2620757295 2620757311 +3562776605 1766434228 +2341824788 3493096047 +3563078833 76292774 +2946722056 3498891132 +2394473815 1884882889 +1205559440 3275114535 +1910737271 3224462928 +2723914616 1600996356 +3042111336 3650019499 +1295870170 1907101483 +3613864102 1332070897 +1449118329 1909177448 430339938 +1409088653 1409088669 +1634547162 3324573091 +2340717804 885938583 +1435759385 3504844872 +1921673836 3152381975 +3573747028 1497525385 +1698349817 1417735656 +3830423439 4166528526 +1015938864 2206775445 +830605921 1354127030 +1232430304 2211302579 +3487584950 3638079617 +3203283098 721623677 +4250271320 738706080 +1725592531 2272400470 +2048578258 2887550829 +3433703597 3433703613 +1925209038 2953143006 +1272324478 1046952730 +2928826716 2926008292 +391677656 2556184091 +708185488 51861941 +3957627044 3053057316 +784318954 2178827099 +1821139694 3472866479 +2713334794 2720000941 +3041172745 3041172761 1677931832 +812104239 4256566097 +674041168 2397828341 3816295954 +1680714786 3588618627 +2238342574 292857913 +3042723586 2185480227 +2031813770 797451579 +2933022959 760848428 +1967846783 2495295292 +894662387 1826327571 +985844059 3684891204 +1548305702 1834474199 +404658099 1027443488 +3832244038 3675493175 +1948301660 401604454 +3334231359 427438632 +3557483451 2826948229 +3074481582 689764601 +1013611236 1013611252 +690111684 3529217967 +4052125326 3301298575 +4191097632 1627069285 +1487812163 3711921013 +3526046780 404029415 +3407938809 3407938793 +1590509800 622669117 +4075611610 2909283746 +2804443358 2471020763 +365020551 3567932036 +1497009587 707596506 +2362552344 2770121125 +2366125392 2366125376 +873255089 1662516637 +2006029865 3026783467 +4219153140 1659167071 +2863949945 3350890590 +2456736367 4084548785 +4254720768 960518405 +3311920620 3311920636 +212032390 1797854199 +1115711535 3768255825 +533684685 222611250 +461104915 1460454138 +3199153104 4258173027 +4174049905 410757104 +751721384 819612029 +1205989291 1815662543 +1937002673 1897596592 +970083973 970083989 +3265376882 1336359774 +732344827 299629381 +2446339707 96021412 +1391235053 1143457409 +1327768460 568587639 3134932897 +445680914 3817739077 +2551261527 3295371970 +1651504654 3226115993 +3990250546 2592062131 +2267450756 1169213151 +3420594972 2232102412 +28998605 28998621 +1959968483 3401744220 +2222203063 296130868 +2371035872 544740781 +869264029 2018511582 +4080994773 1805615408 +2918319313 2768082192 +3698992600 3964244749 +3855481524 358455048 +1787964961 3843988960 +1940237916 1775336135 +2088119590 1699262146 +639555543 3649947494 +1427387580 2478626963 +3259610072 1285536627 +1942289007 2920692920 +729652169 1069301112 +691615291 537943794 +179651780 179651796 +3420910558 1558870308 +1639968698 2602983901 +1712081759 571903685 +443891199 2777716862 +865901379 2189978236 +2039829556 1707625608 +594819734 1710766641 +641206785 725073814 +1228649908 3518769056 +1122123180 1082605271 +2691320043 1917897204 +3516998655 2244841298 +980763277 2476196836 +3579745780 3622178575 +579123212 1659747063 +857034454 2180733367 +1323217329 3028952275 +179417273 176196536 +3179659167 4169967432 +3778125503 1075635880 +3117956473 141084030 +1876297533 3047363915 +85927893 1547852915 +3319659348 4142297236 +3722516253 1717002914 +4279285376 122637189 +2333307535 1773148876 +2694035620 81582140 +728652075 1885374037 +1526046138 3936832459 +2506711323 1159244197 +3311576890 4098703453 +4182493506 3024999157 +3824685720 3824685704 +4119754744 4119754728 +4178416448 1348390355 +461495927 2660549673 3442527384 +1912749663 3632803742 +3859329931 2335696568 +445286645 2757824043 +1420455832 208973920 1732656435 +2470100743 3430594560 +1655711777 2639811504 +519359900 519359884 +72058053 2279735834 +3578525806 3578525822 +3936912579 709426922 +564125422 3702255791 +592945111 2045812582 +1763094795 2042147924 +2219637915 3761350674 +88590274 3290919102 +2605429623 4012606534 +1104763445 415410427 +1723415247 2224526289 +777426347 2639109172 +940097580 1640400193 +4001951433 1250944622 +3190325603 3166940892 +603408360 1671563450 +435773998 3212652992 +1072218821 3788750058 +3481591418 1232692625 +1687498797 4209238939 +2768678305 2768678321 +1957993928 1807304478 +3256029026 3858839363 +2478139770 3889243718 +3299187644 4115889034 +3445694400 266664787 +2646363477 2758655196 +3500899555 1626708316 +1524997273 185248960 +2389030094 3799866447 +1298860462 2373991663 +1523050847 1203003550 +3593463757 727486331 +1765016796 2028185159 +3239136545 255617782 +689876503 3528199728 +3775821688 3250983405 +2155860708 758709503 +4217978315 2134162857 +4100729741 1397264114 +1854902511 856968029 +2370660340 4119048951 +468680347 2579943496 +506577837 894896466 +2285822934 1358998001 +3378064138 22986925 +4228169405 659703202 +1173706094 2196525873 +2489380358 4031664506 +1084860281 1365254417 +1968369547 1170060405 +3110231126 8567197 +2628612721 2576338710 +4263357353 2981444366 +780659666 301480837 +4279450207 3930383262 +2526124616 1328930653 +921517868 2742710849 +512081928 4127861021 +2686130 4221596763 +1424947861 3281631985 +224128346 3149459978 +48739124 3084338056 +1508120711 3360447891 +1941551498 1908063518 +3557339417 3598748043 724074261 +1901559078 2738611490 +1293954739 1293954723 +1343177275 1124418276 +2177272815 1181606811 +772819464 1896232245 +1067937793 4027543344 +2807237013 1607067693 4239922570 +245681969 1047669296 +4131307735 4131307719 +4077769591 365159504 +2045784377 773684414 +345639679 3345612988 +750883825 2361953409 1706812518 +2593779515 2605947364 +2625104655 1582466907 +2833488920 2555516764 +74707524 1183211807 +3987386800 4197095260 +1366241319 1493749088 +49770115 1976971964 +4262590928 3326886499 +1094343636 3014967898 +3312774640 3339882691 +24138082 24138098 +252063776 1220087837 +2452994259 4254200876 +2312419008 560181183 1324198334 +424791457 2093397110 +4068635968 249731295 +2024253971 3154506119 +4050693443 1465958506 +2071072881 2071072865 +3821391235 3330587367 +516022379 516022395 +109640558 3080965670 +1312320959 3932171520 +556314113 2174606630 +1650087544 3131831296 +408628968 949010976 +1356917195 487590530 +2459381918 1644267711 +1776296568 601244411 +2994905127 715267424 +2670309886 1139348745 +1535914492 431140775 +2939473499 723573060 +2516687400 1283828989 +635171797 1849743452 +259527876 2260316804 +3697533515 1010646036 +2146497438 2854828397 +3982050702 831028889 +2902429983 2067352104 +643357357 182468164 +135274854 3958088588 +783070796 3319986615 +3228796483 953965418 +176038464 864982043 +882073525 1568174144 +469770087 1376886414 +2992353586 4166513061 +4200124172 1680908087 +4273242888 2141172272 +281696802 2852076066 +3823706972 604154311 +4139073640 2262368899 +2162036325 1116776684 +1321221537 1316619718 +2617598962 2390513125 +3192660949 1725720643 +1787852146 3170074338 +1401585722 359526830 +1199458457 617367752 +1921061698 2508997890 +1667368987 2209781413 +1114012428 2471736311 +2024379494 1492425879 +2377577884 3003425927 +4020234914 3669908739 +2921937431 1105621542 +2130031972 1087147135 +1685426982 1259775191 +2892560874 1396796237 +1002871013 4272074860 +3560471628 1626057633 +836129463 727987718 +3191556263 925417470 +298261399 4248645685 +552112930 3915318758 +900729552 1411450229 +1768158048 1213734963 +1745603343 381249356 +3185654681 921869239 772480374 +202623478 4180078161 +3443654478 1006216142 995683023 +1435777478 1435777494 +1073210071 2319063152 +3434271497 1182938926 +111095887 3147369560 +542153880 2044768819 +4168490711 326080944 +3650876371 3486487639 +4103749364 4103749348 +1100767819 2486090754 +1652399496 2930273879 +3265933760 837570885 +1640917407 2532328776 +3228615280 3569952715 +860862281 3405935327 +1153853717 1498901532 +3420084730 3420084714 +2506808429 2755198852 +1535027162 2275717478 +2567180121 979642632 +1835282966 1253759153 +3610505434 2697209661 +1247524622 3394537578 +3362149346 766910951 +842861402 1880678050 +2402127256 525962021 +2408467780 1639453752 1090757129 +3110869622 1407132818 1340022358 +4239321749 3987943724 +3526943623 1989029270 +288343925 288343909 +3813410197 2566997036 +36013698 3809656501 +519712605 551063412 +264304334 643689876 +398010790 4269576279 +548181010 2175604819 +3112602870 202748362 +3810001300 2378246376 +646287380 1404316990 +1345363079 3842747465 +3762989046 3362429642 +3002969359 3674214026 +2869174861 3399793586 +2381433635 2527250442 +3472176794 4049151946 +1433497734 3845327569 +3665470829 1544710802 +2022013707 3793162997 +2583502967 3766098768 +3974597965 1032024123 +3515476885 767215834 +2948492628 4240841519 +1033914977 177526765 +496992956 496992940 +557346573 1490473316 +796454064 1801230595 +1768070084 2856007049 +1197045318 2547331127 +3136172623 2482582094 +899405973 4183159452 +3685356603 1399789646 +4020605820 3432956968 +3848057291 3689669250 +3881130686 3915241737 +718480453 2942441612 +1622856641 119232726 +2910143275 4134606251 +2789826031 1438211003 +817567001 3481417288 +500956705 575737334 +1797759390 1298361257 1298361279 +2263195130 2303051478 +1355642746 388636757 +1010399631 1010399647 +3127824930 2658454421 +3122809533 3237717908 +4273032749 1062502638 +2206128218 1614479606 +1898467279 2764898843 +2683237233 908671728 +1605954867 2126861679 +3909688810 3277461339 +229832130 1387847779 +4094373224 2509798059 +1212614254 902766383 +3327030655 2894264040 +438642107 438642091 +4240722044 1694374705 +2785179966 2785179950 +442439922 1974748389 +1134530431 3134347580 +674874263 4078249730 +690080078 1621764050 +293274435 293274451 +1517204955 927483858 +2021392837 1882638604 +2861353096 3311338688 +2514218223 3627416632 +3754065836 84221414 +3581651635 1685605974 +1887817092 174920388 +2769256593 1751606342 +1577425171 365951212 +123948645 106195180 +2958487104 2946161367 +1234655561 1234655577 +929455769 3475434184 +3278431839 4246906782 +2727671455 2407545928 +2230316147 505965233 +1376161293 760323684 +1723831303 3331720960 +1141326347 2240370990 +2011233325 3828153042 +3224992824 3531508781 +1512244792 2024669747 +1612892126 3258296186 +3991248319 1589377985 +1450774899 3331357803 +3371059290 1127272694 +3013214611 154404717 +2167742505 2167742521 +2217475064 2217475048 +705850170 2015074819 +3529327261 2285444226 +1029530746 335883293 +1786593028 2804560735 +739829579 3056868098 +939255516 1963885456 4253838417 +3933605940 1133340808 +2627012246 2627012230 +3965007010 4232824234 +1057197631 3986492264 +2405383299 1212787989 +359653316 2199732639 +1654722703 3532460305 +3760258962 3760258946 +4153162738 2747424229 +2676559795 3619927756 +576288510 1617093150 +298903978 3051345549 +193657584 2457293916 466159573 +2292208710 2205676689 +875743091 983426602 +3414510200 1418922667 +1364216552 2825998612 3915770685 +365119543 2037034640 +2607363357 3281951924 +3346707884 2989227479 +4220669661 1330750146 +210733284 2851372777 +1942311413 4179590936 +3776035835 2094118508 +4285553571 3235922332 +2048252027 2875443620 +230380331 3370380468 +1359135578 1308265428 +3088119712 1656082661 +2839003389 1017495691 +2538275232 3407056613 +956084736 897124813 +4012775850 2121762323 +2445687326 95910298 +4247822119 2980204841 +57529050 1071836459 +1025405573 3152955226 +156678277 35675309 +1895391549 362025730 +1561069234 3699557896 +817896361 2647201346 +2012474400 4110202469 +4024438092 3920948897 +182452280 1453348909 +916540912 1081534856 +2828874030 2641652601 +848465194 1162766822 +975916815 2623228145 +168579722 477600242 +2976702917 325544204 +1606208892 842496551 +2837272819 542330464 +1816103454 2248568105 +4209547971 3987631280 +1972904861 1285121428 +2147362055 4047086588 +2143430387 21992598 +238234465 3146598816 +3798331239 4029128612 +1648735608 3338839557 +1250409156 3409247672 +4027791279 2638260344 +2362796650 169028353 +777401487 2159328536 +3702819036 3702819020 +2701659349 2501164410 +1537898382 3456890002 +3096317379 1251977706 +1224682776 28572868 +725145854 142448607 +2174129373 3698219202 +3822891289 3172766184 +2226855447 1044661635 160456240 +4246352673 4246352689 +931313504 3217094655 +2415857199 2415857215 +3249736916 3235721657 +3141941667 1921825674 +2950408468 2780919246 +1643553787 843326514 +2901468429 2064658265 +703023776 3282953083 +752417127 128409504 +1242508703 887411038 +1144932669 1273830014 +3606127542 1683515798 +26324177 2119626189 +856286835 3415590682 +255032404 1108129839 +970569434 1775415877 +4066085584 156443181 +2837763404 2432419511 +4061356907 1883453163 +1611338555 3591776222 +2171352663 341412582 +4214707361 1712966135 +2507316914 4117746227 +565971056 2332117077 +174103581 174103565 +3201088679 55376608 +149685894 435589329 +2463397031 654927524 +579391037 655017167 31433012 +1910696228 3996106815 +1340775449 3881024328 +1335764062 3019063295 +1381677916 13955527 +2063534050 2063534066 +3275221042 2197980837 +697795275 4011549805 +687713280 2270544915 +2701680806 3258495158 +1234194046 1277923423 +1284526907 1467631705 +487621801 2591452760 +1867590043 3619979012 +3114647141 2541826461 +4043816150 3537272306 +3290238876 1438618264 +235813714 1919377939 +2047528315 2583787684 +3436789770 2214580155 +3477495037 1220829762 +2906956667 1392881726 +4050362860 4168083073 +3613873321 3232384536 +960735235 536218579 +2035340897 1531017910 +2591835811 1374199964 +3108732548 903358921 +1599983642 984520957 +3546344557 393146653 +3730974970 569606102 +3778165950 3778165934 +888970840 3249357965 +4185586435 725230918 +855981025 1282461190 +2220076529 1085985382 +2342780491 506023938 +583160782 2246700377 +3416950879 4235505054 +798399393 212364807 +1287972716 2526978428 +3454589724 1100016903 +3780399830 2378065639 +767169372 767169356 +3984691911 3984691927 +2315633226 2433800827 +1612657517 2551748443 +570208043 527719256 +1449094518 1849249991 +1629251018 565968677 +3565785521 3126805597 +3169944600 1640229180 +3395103366 2877710275 +1734946566 3499427447 +4052831549 2226951938 +3926738170 1684198565 +2362995808 415183653 +2745235088 614844668 +115540445 3025923810 +1875479586 1875479602 +3539095046 2208097361 +525498075 2553094815 +2049729537 819952858 +3776970480 1432245205 +3590448248 1559931131 +106326638 4127595247 +3624443544 2649322848 +294273596 294273580 +3927102323 3059977463 +4041515079 2967993369 +1675191566 1675191582 +3497609848 2800761581 +1760151997 2320429903 243386548 +3455568059 3871373160 +1374838203 2693372200 +2211073536 138822270 +1745296660 1039036543 +1696095089 2522346214 +872147851 1620298690 +2413609451 2664139800 +3848738868 1430985177 +3709777904 4149966259 3709777888 +1279896321 418919040 +2600639848 2196121493 +4120365360 3455170179 +3932041323 1233837720 +2131997254 1375839275 710203977 +3897366889 442433624 +3749226227 3186544794 +2184615646 2466624745 +3984293091 3160775004 +2728574662 3425849761 +752642204 1719221063 +1275764529 3854080550 +3629533740 3151414103 +206574713 3675273854 +1192232606 1324747455 +2871239103 1091342977 +3563186960 1713703477 +2762638826 2864060397 +899389085 15604020 +265357751 1405889076 +3168235715 3810422938 +57314540 1404324609 +3627961469 3876743380 +1033863098 3988575397 +2238326774 3369652961 +1928964469 1946534716 +2222635705 1177809214 +3099360643 153480551 +1693197924 284123737 +860020483 398125808 +637098933 2089508348 +2508210884 40330056 +2344458154 3840922891 +3963817285 794643306 +75237329 3762310662 +585716018 659214757 +3179908417 2693356886 +3701526186 2035415308 +3173376971 2376439956 +241495405 2207520091 +2701986129 1617653984 +3315045564 3382649841 +2467500931 168277820 +2725291927 1314378416 +3173096710 3253350526 +2073761629 2474172226 +3783312548 2713030207 +2540633541 3100663778 +2444390352 2417558571 +168611395 3406990375 +4120103609 1353195838 +211262207 3517513576 +769675764 740360985 +3698647619 1325412220 +3215783109 2185581082 +3052880223 3543918728 +3623874664 1877439412 +320111993 3572919023 +2300611480 1983627341 +3568144686 4214983535 +3282637736 3827691792 +1825921342 296222622 998583903 +2653472269 3258279282 +2637068184 215229911 +2163038592 1973675155 +767031590 2002121284 +1114509782 1766200295 +2045900330 1960964150 +2279089405 3010550828 +1913723406 2666267663 +2912625574 4047052353 +1812155011 2351844394 +1521227771 3085549604 +2156501546 2191372301 +1069098842 1035526719 +2588592676 129775295 +4144619527 3437113604 +2183397115 3651822898 +790890883 173431143 +380876444 1491629969 +2909581706 2909581722 +1166014423 2768524527 +907589922 1743095887 +4139361826 9786154 +3163130829 2575766436 +2127853061 3539962410 +1788557106 72868773 +2770386829 2139982564 +3051281237 2731755210 +2626287655 2854704676 +2158614127 4200370360 +777064506 597461826 +3772049117 3425136116 +3326573709 2944995826 +3005107851 2209719508 +3008193247 3703017944 +2419493011 4254729251 +4152800470 4152800454 +1797202348 3123755397 +3674444597 2282265292 +1884012447 1715382088 +4077167880 2555366283 +3794961668 428303711 +819308824 4166594765 +2635932299 3755827394 +1894333600 1596616677 +3287162628 1960257968 +379074258 1671318661 +2241735601 2684830970 +4280322057 1944765337 +182396059 3091636242 +457641705 3655104718 +1174103124 2126442553 +213182192 1761288010 +3800977295 889667096 +914381066 3591121581 +949679009 4244514888 +3471388015 225012629 +4142900006 1800801895 +1659730000 3056676404 +3560049490 1556599301 +3684876874 3821490352 +3160128386 107490741 +88392584 3835028637 +4204125770 3287084653 +2361476052 1748879033 +999384704 2340164187 +99607728 2898308559 +1725662849 2053467707 +2071687296 3528108455 +2734620720 688710216 +3789525562 3438489949 +3355684860 3654158759 +1364659331 2399711786 +3214117072 1698717557 +3591331969 2067065622 +1851471353 2467668079 2996172520 +1605453145 1850482431 +912176640 3834950696 +1546145511 3908071712 +2012891678 4244811071 2318842430 +1065467079 3225169216 +150765687 2625518406 +1005389782 740513255 +2399991774 3274538473 +112079848 1815852605 +968789201 3086462214 +307906126 2548241910 +34644320 2687371827 +3224484704 4243343704 +314678153 2241468910 +1807844029 1587597186 +115826350 2352614383 +592231994 580232451 +2436813262 2436813278 +1133381 343980412 +3186973335 2688392112 +4239786307 360971370 +1916743120 2843024995 +2296513548 2931386145 +3186056020 1194640697 +4140143291 872807524 +3298134470 1030218401 +2186859549 1322641844 +3611670018 3837625653 +1515608335 1515608351 +715953742 2097597355 +1178118848 1261751365 +1710317180 2758947532 +617992256 644936205 +3827784539 2230636612 2439240479 +3300333788 2285642311 +2605554808 4079833339 +1273697653 3050828113 +3519493221 2711059194 +4065981985 2586054772 +2478039176 205994823 +231553979 3603092639 +855669176 29334701 +2319786415 2319786431 +4210728371 3414573260 +2996042365 2616414914 +2438017602 2042956875 +3985774517 2986037738 +572644313 2488080008 +604356720 3757303922 +2660056529 3691379041 +3625546902 2463395242 +149636572 3864983879 +1591915969 535043776 +4122455516 1374233223 +954659494 3230501978 +610467674 1912576821 +286350170 944950955 +3686729742 4223249945 +3640650818 3705727989 +1362894586 3685008285 +3244519713 3855883995 +1260484220 2158245703 +2992121306 1277111225 +336016374 2102840398 +2451159897 1468132631 +3871432844 2338260248 +1608602724 862666831 +3102643723 714486594 +2839954669 2839954685 +4079066147 3773352714 +362165296 729032597 +669640554 669640570 +699138875 3767368763 +2893844520 2954292989 +261194505 2333165368 +1143472067 4041212989 1791410138 +105695075 105695091 +3977816744 3855918699 +3908224989 3908224973 +1042082363 575874236 +3537835901 1915877844 +2333891629 1346488219 +2817758163 3510691420 +43617479 3736640854 +2065712310 1936126593 +2750073528 3265077165 +4169537944 3541715547 +3470271362 541058467 +2416960386 1258497443 +1864716022 3988475217 +667906709 667906693 +2891565671 3092881440 +967177903 967177919 +515363735 4066514608 +1905772625 586176390 +3655149799 3727123382 +923397335 2074072678 +3194119186 298131436 +3951841731 2430907900 +1399286881 2899287222 +355206243 2664582115 +3519518279 966330074 +968693315 3742070847 +2318954179 1507220714 +4085452546 1498456117 +3890590356 3933780908 +1093296402 2813775706 +3520667796 3250380776 +3784390621 4103794932 +694962671 611869486 +3831448492 771196887 +2819735261 1662887761 +2605337476 4193575113 +164638455 164638439 +857822409 1182300270 +3440922630 2012754097 +1605373084 1042536849 +3081399347 3081399331 +1381986756 1883248521 +2688600601 1593713992 +2005328909 68925902 +3242145725 2942159563 +2942885519 3727779532 +3127709616 1209529991 +2679539585 1664100519 +1514229257 500029486 +3780863810 4233929806 +3362269513 3304652280 +3423776669 1335157865 +636758287 3462177422 +629401137 1067671334 +2496186254 3253807130 +1143968181 2941845779 +3960736077 4035617842 +1084860287 495419839 +5675575 3210003609 +3016929917 2901290355 3002620794 +283424528 2819370531 +1252713772 1017600267 +320541607 3131043808 +2275386985 4182970472 +3837303798 3485937377 +2811265699 1803396736 +2748422708 385204185 +3783852572 4184553219 +181281175 2575229094 +123245128 3631105867 +3672481289 2692204600 +1993334376 684169040 +3418206467 3198003125 +150291566 1896973561 +2462680984 3749121767 +1001955705 3235799776 +2847749010 3336056531 +3044286908 3413964419 +3435737151 2772879036 +1788865647 1220620984 +3011401516 966104783 330614580 +2532031240 2532031256 +2156124213 2223856490 +4099718200 3858517051 +1357246892 2051337151 +3995359470 3510107823 +525095393 639952182 +1846612643 2720552839 +2166385970 2166385954 +2907438140 178131559 +375513526 4061548935 +2428574102 3784376929 +3674018779 2177924521 +648433655 3201288374 +3378718446 4111878319 +956002081 4183315270 +2843478549 3812876042 +4185374071 780091974 +1098156322 2171237513 +225952955 4002067044 +2122855032 2825351917 +4119535904 2852463987 +3178439346 3997146661 +1917202080 2222679539 +69332327 3899177270 +2955992103 785075661 +842703099 223046436 +3178800338 384530067 +3012126475 4081137803 +1642830879 1061668572 +22753464 3666719163 +901348412 3472790119 +2776465129 1170611288 +315199033 3427460030 +3415714790 3415714806 +1220924332 1281082583 +2525185018 2525185002 +3107237767 351293846 +66324735 3529453244 +508967657 64012372 +215846222 2395304399 +3696965265 1956046406 +2002076053 795009069 +3706444396 860411927 +2154986673 2412875191 +3981971334 1485849031 +575435500 1995942132 +1302216902 983022102 +4245444095 1500209256 +911009945 911009929 +3299147440 479722375 +4281443147 3200498808 +268359949 73881592 +948917324 1854785121 +2796879362 2292948477 +672224524 672224540 +3476748217 4073977896 +4074865955 1463307792 +2998469061 507365644 +3387609350 1140367175 +3566249139 1113457579 +308522590 1639405673 +267191603 1088597551 +4158757629 891747412 +704807098 3633336753 +2146170440 3414096530 +197740839 632922631 +1842506602 1995130534 +1991280899 3223389501 +672666774 672666758 +345294266 540230621 +2426133440 3542526348 +692205462 2302509351 +3844041822 242718719 +504186793 2172193662 +3118544222 4041200612 +204955588 4281057673 +3959849817 687230526 +2547587835 1594607154 +528507022 622329743 +793959177 4033879826 +1519488779 2610762125 +1363149334 4026582565 2080791218 +1423250256 3681380085 +2036327514 1811184061 +154875279 154875295 +2244443745 4195087030 +3281855930 2858574795 +1733964418 889029283 +1332301137 1405400720 +941462483 2359321457 +3731217639 3252398322 +217650745 2729899563 +3336317360 3163922453 +3598140631 1958829680 +915228351 2674286248 +409684953 1239967390 +3250363970 1038950883 +2219720235 3011695109 +3926856410 2917046946 +2744077721 1256507570 +3253660836 4011755071 +1177925212 1855497334 +225710009 2123798325 +4007322650 479532267 +654955415 177140873 +3619487371 3619487387 +2763813006 3802476441 +3496104868 1350070671 +739005559 1060983540 +609997541 562888300 +4171466806 57188886 +1484260919 2079443078 +1937857373 832754548 +780310482 160759685 +3194204918 1030869556 +2334439466 885910029 +877774233 4122611656 +1664085274 1664085258 +665055426 689176931 +2386461891 2943024892 +140498093 2142934849 +1329239535 2822375224 +2102807738 148555997 +2230436113 1502801350 +4061507959 2842064866 +3224917184 2824427640 +3957453730 3957453746 +571857557 1896152137 +2968926961 2968926945 +3487683510 2465241473 +2191340389 613838565 +3994616935 3994616951 +3475309321 541312824 +1429937982 1361087999 +566680658 2114770181 +1142325556 1647691755 +2510332609 1289762240 +811081715 230312844 +3869108864 2325227404 +638862027 3169133954 +2739902826 3600182213 +2655338589 2214875755 +2104158176 2014962363 +2264640000 1089147929 +467942793 1900863150 +1715195330 2297945302 +3564141122 1697468251 +2491514424 57661760 +246671151 2270441580 +1535517566 1535517550 +4212360463 1065984188 +2671975677 3014042196 +3001423019 2492333272 +2133636278 2318017165 +4155992433 3893177229 +1539009273 1628005864 +1990661513 1376183992 +142717001 2905113326 +1833828808 1833828824 +3026512530 2363311045 +2886209268 3299838479 +932133744 3866792277 +3573022617 1035517474 +183436498 2534644342 +2383237963 1757342831 +3726113197 556519941 +3149039243 84528340 +3499599319 65631042 +2442823866 385785562 +1318209872 3957344822 +803728953 3047447343 +2268471463 1192293042 +940449160 3325590795 +4175201571 3861222940 +3690846359 3690846343 +231148761 2304326046 +3230375343 3230375359 +2143892997 784337356 +4006830456 1858236411 +2762571702 119455223 +1931423319 111277232 +4061314929 2223202032 +2059566217 1529897720 +3074484284 3073218151 +1281705469 1080896852 +554161609 3361049464 +2588211023 697389390 +3849505623 212897141 +2010337844 3584714703 +2615795264 2972245715 +1048307185 1309342310 +3807577268 4181725408 +1655454619 155342152 +3780500463 2279938424 +3907294338 3566697926 +1763491985 155395142 +4256649342 3129476266 +2419584822 1041076753 +3672728489 1181213454 +1980688578 562947787 +1141806775 809303842 +3002845146 2623249451 +2348063645 4010866722 +4249031101 1838476436 +3288578525 1860015860 +1658066523 4007604562 +1987158022 2061429118 +3927576190 1714655342 +2224645288 993157333 +1497319758 1497319774 +1336539263 1931569724 +3500918645 1533839642 +402493752 4230716205 +495704639 3520890952 +512281277 1429418402 +3670562532 1298188543 +2173489026 1923787171 +709724959 4116236175 +3120554462 4166219753 +2485311978 484248411 +2886689471 31227516 +2737064817 1126351590 +2679298466 2679298482 +4175459749 4175459765 +1916939403 1764499138 +4092831696 3349484564 +2801022186 1903791742 +2284826562 2798116566 +648647434 177787651 +2347694588 1161004977 +2113484858 2605482396 +3604910871 3237562681 +1880820916 2946241402 +1334879785 1448021631 +3396778627 1007103178 +2057200740 1687605327 +1600484418 1857422325 +876842599 2130190201 +3579344743 1094973238 +3391539505 1812903984 +3183086838 2715969351 +2204273314 62922398 +1826490782 4287177641 +2357178090 385899090 +448336109 1926421330 +1031383404 1031383420 +2148361140 1667868681 +3940923180 4087306839 +516049814 31259943 +3616543792 4152999090 +4134967143 1672501024 +1708868777 19731992 +4130276643 2701250064 +1428717317 4046353194 +2353301507 3538033834 +3092607257 1199639112 +1747807534 763551599 +3789251994 3583773539 +2519890303 1889030972 +2424795206 479883409 +2754059638 3764183239 +4270003542 3483026465 +690545607 2455671360 +1102231632 3159893475 +1935098296 2731967176 +872359734 279624199 +3843705496 2844069939 +3088055185 1378420038 +1906015555 2717799206 +3066223052 2334068053 +2326693206 2797332081 +4013324262 2025766657 +1229914121 276648569 +1910639367 2315637778 +850278586 2185448669 +3436954805 4084527635 +3805014558 620858687 +3715670994 1365320259 +2123335118 156755226 +2886214266 558993273 +207482096 1414567517 +3900527813 3259789850 +3953830728 1168876125 +1522799594 1186551480 +1946799467 376332130 +1753119540 3004953295 +2586448992 3132631432 +3195821797 486934026 +1302551585 1495926752 +4077918143 1632985512 +3695271627 2246588820 +1721750038 903330291 +1186072565 3721012087 +3691963674 4219359797 +2790118079 2340602536 +174506454 901981169 +3009600365 3516886148 +1531951938 95240270 +686758417 2040516534 +1559897134 4260058105 +1555774171 1032685214 +2665570553 365668350 +298857594 2227346461 +1832165052 1172521832 +700710890 2844515661 +2028830992 1843538979 +3979005765 2229263722 +3895662733 2965519346 +513637917 1324189620 +1278251604 1148607033 +3382671928 3382671912 +244162980 258437017 +699149703 554412928 +4260340424 2397820715 +2413985709 781122884 +3749863426 3611185181 +1994766409 1956715246 +2715724086 2715724070 +2304878893 1908232644 +2791214101 2791214085 +2057768178 2057768162 +488723411 2927031610 +998618854 2575232023 +3331271891 1717801018 +1031484304 1038266526 +713515255 3927811270 +3254765690 3752368139 +3810757972 3841424175 +1658689441 1063776209 1138078326 +3273808098 2721457130 286387139 +2525053853 2323476532 +1509396440 1716705971 +888306631 2272382015 +3326100835 2049784540 +1817106572 203351159 +1899097198 2677485871 +340426467 2244754886 +213550708 1161237468 +1084488113 2564779910 +235819823 3760926037 +1021009937 3403974070 +1387718303 329537142 +1999090790 4185980033 +4029452887 1831493360 +797025200 2031398403 +2944586132 3740265455 +3003570126 3037107354 +647220848 716044867 +803434643 3189063424 +3325192315 2086304164 +1870399750 1461729914 +2877907408 3645176437 +632263284 3345190031 +2465490150 2971600422 +3401214206 2272928799 +3273468150 484932423 +3018737841 4045172399 +1843611697 1843611681 +2983383599 501276664 +1345421196 3387672929 +2774513915 295727685 +1816463202 3851990653 +743429764 1169076681 +1889764980 3043790719 1889764964 +386309573 225480701 +3271436454 2618948929 +2177858201 3214812878 +2827521961 4160366360 +435556411 425430258 +2246335797 4219386474 +3621576448 3621576464 +1058840030 1145161513 +619313157 1295193148 +1311870154 743685019 +579566323 1418890380 +1111460226 3483063691 +3854004673 1623724758 +86871483 3786808685 +4204752079 2568248021 +2384000912 1095612323 +3056837371 3165231067 +1386198661 2523681612 +643150466 3672638115 +2588949655 2203017648 +80899367 3191985248 +2055699416 873559318 +1264997042 1264997026 +2394827583 3692675400 +1078655864 3800585671 +2149605089 708851508 +1156623803 3388754905 +1485383683 1400819220 +2676027388 792237188 +2410044821 3085259146 +1052677305 2114999851 +1913688864 2586419181 +540882424 2781043347 +2850488621 1906894213 +508124365 2055018148 +3015941662 3099652290 +3981945400 4255764536 +1688884568 2492612512 +594023845 1641681594 +290924646 1770163098 4065768685 +3173781264 3696997941 +1582827459 3918551335 +2488969802 2488969818 +1579222087 3481623303 +4070305322 3871911571 +3235935811 4126307367 3831114620 +3327964452 1310183076 +1811548302 2035523009 +3534710827 3575708578 +2210591587 3471123658 +546576911 1478821262 +2430719407 1955665327 +1306323970 731295927 +3004524958 2293580713 +3129555517 1703144757 +3818029350 2931138870 +2204041880 2204041864 +17439850 228681813 +636001049 1631032922 1204538744 +2849649736 3304704355 +681204181 3220925020 +2044054905 4278347243 +2123082766 2123082782 +458955427 3010129564 +1877554308 3136965315 +208674387 437650134 +4110134031 3073263768 +2883174637 3977972562 +3382528774 1755126369 +772027405 2107502692 +3243521941 3969089418 +3545179132 2710939057 +3714090259 2871502720 +1828801886 1179433944 +4214408917 1631520620 +3105386952 3766892225 +2531778345 3087289742 +192374125 2378657183 +3983238814 1578273471 +2298932854 736715729 +3810181998 3338181625 +3035506908 2934592071 +2693425753 3710258494 +959018381 1483602548 +1691995142 4210121594 594743778 +1238433432 3550358991 +1991007961 3365426601 +607862710 3208989585 +3513699533 3064310309 2121033394 +4093888742 2652310055 +39576348 3534128391 +2044749102 2426237871 +972061053 2395295243 +3095798658 2298645262 +2197250312 2462360611 +1277152681 358607129 2131804430 +726534009 726533993 +3110031304 2567608267 +298903390 3764201090 +3279749511 1154049942 +1842953192 3573108285 +832240226 3097980007 +825449223 3254740797 +2578075823 2518483822 +248984786 784868997 +4061365558 4085485820 +3679624224 1661716069 +2291520408 2614892621 +1304477654 136753847 +2912062822 2746521473 +403415288 3528353389 +2549830062 4003566841 +960575792 1370293909 +881473691 3789625928 +2525079823 215840090 +3988772237 3523030244 +4010209416 1854504867 +2259127669 3411481737 +1658830102 3157698993 +554691975 113818244 +1913772422 2328090242 +107323865 3942500510 +3623082106 1860028445 +3445306982 2266102730 +2248139617 1389556128 +1551064420 1551064436 +2431255199 3210879070 +363841184 3728177890 +1939104798 2742720467 +1497946115 2060979174 +915273154 3011115397 +528615877 1588945164 +3215489870 2334650561 +70011533 3292703864 +852238357 206995722 +2169541315 1279963347 +2957713907 561510752 +533093006 2470481295 +2750785798 565777527 +609284646 4156612615 +3830439036 3854047015 +2558016230 4181170167 +1937532097 2379389888 +1375062540 300749047 +1431075638 1943947691 +375319673 2960015976 +1493293027 15129180 +745876601 1970602600 +1630662097 2373069153 +2234327350 3775651978 +1836186754 3429925027 +188469819 3928748772 +2602308737 2922661632 +3524228602 2824255627 +24583481 2273509544 +1351091049 790453838 +167071128 1160324685 +229507826 695393789 +1803772901 618021242 +2062228055 3608835814 +2908043358 2908043342 +2959281696 1855722220 +15647890 1572876090 +1710391290 1992259229 +1296317730 3462327534 +4294715931 351684740 +1194895184 1771620285 +962561217 308149184 +4181117121 306055104 +2015767936 3646402907 +876831198 1073932763 +1983969207 2334181428 +863858148 2509813208 +2077682621 2958367371 +1272295260 2816622916 +1819097154 4059009013 1819097170 +3246450588 485924249 +2168141413 1292456505 +2728617266 959991219 +1918369352 1918369368 +3868707726 2808953486 +223276677 2836737706 +1269694260 2961119027 +1863735249 4003832672 +2691432665 1661293960 +2268710708 334796505 +1742784516 3750489327 +1130433848 1130433832 +260270736 4225810595 +3771675301 2334964147 +4234134973 130304148 +2147528214 2534542503 +2220222827 1921343535 +2307279688 3328737885 +2577401034 1199453747 +4118957293 1763645700 +3645520313 525261995 +2449845726 3169891455 +3813162586 4002279308 +1643718101 272010844 +4064210244 1999150173 +3218228738 4194579747 +2779566838 3306166609 +2290889300 2290889284 +3321865116 1299091089 +770283021 2732475232 +297069539 140833478 +2345345252 985997519 +1087516255 1776222088 +2914707950 1061282220 +2386629025 2439954550 +2541687199 470334814 +2015921012 2613505945 +3532397756 781269991 +200198478 3699098831 +688115989 2785158154 +1221218421 1060944410 +1611894633 2815083096 +1316923815 416399106 +614815835 3081833475 +658155831 4166541721 +2344936364 3480828895 +1594031026 1831100459 +2305521454 1530647983 +906429694 185392073 +2745213850 2260683958 +2652929970 2670265651 +139348815 60719514 +2596726745 1321502377 +2288655880 4142278965 +701824787 3981282042 +2993199205 793811850 +1181333602 980238933 +733210197 733210181 +2274255264 86224627 +1760162177 2840014358 +3970652080 2507205133 +2411198540 2949302891 +3205998608 3795685667 +3306231386 2120026677 +3098055079 1482508769 +311758583 933662406 +2283244268 3204806008 +3840774103 955871088 +4260567292 3249558705 +1380730499 286457916 +3632623867 3574651698 +2002210120 644786269 +1925388151 538832976 +1468285501 36980226 +2080021254 2093902723 830605921 +1678073015 728822790 +575106427 963545663 +1768406334 1768406318 +383450953 1136648184 +1844379278 446836442 +1577030178 2260410154 +2676365259 3944182914 +3102238012 1053360359 +3055891968 3163816453 +3197260800 932103382 +3233577644 347413719 +3067022276 1072236040 +1650652924 3721055911 +406723328 824791810 +2246146708 1442051833 +1146440574 273012575 +1927100074 2084375963 +4197661708 3936847585 +2564108748 1671259191 +2163035691 546442676 +1153145723 3544245189 +2763496002 2399655395 +1950312942 3990077871 +846525912 1876020581 +381716574 531677801 +2101506790 2101506806 +1705077947 3088984690 +3653070969 1043861118 +3805165020 3869165895 +2264385722 839974109 +878673593 726957352 +383822978 383822994 +1761837197 2966221368 +3501786030 1363207177 3501786046 +2819911211 3274272162 +1819320873 3729737358 +160782728 50106531 +2873782234 2150503467 +2922215206 2922215222 +2733534572 1472748243 +1905963185 4211660630 +1868337560 2190094131 +108225486 58729305 +2118852947 777533300 +4044931771 1157270642 +2773579346 4108713047 +3907964348 3907964332 +437060010 4013164126 +3636935728 1906556803 +849476637 1003501662 +2466914681 4059214184 +2542890334 4159646441 +3457086409 4084489400 +419633744 419633728 +2391528186 2090754149 +927460068 3929457919 +2407665122 2193189863 +1314385542 3486038225 +4242883360 3756552121 +1686759946 3361968398 +2998448645 1872846396 +2430641296 2711817909 +1510314685 1942355860 +1769516602 2014285138 +2352266331 302285650 +2690350346 1278151450 +3123225845 860316883 +352140838 1892196721 +2266670787 2266670803 +95151106 1328378890 +412540235 8281364 +2232844713 728636686 +2019549891 1106376938 +1213018605 3196426244 +1459102264 547216955 547216941 +2099421001 2099421017 +3514339224 1489636443 +544294146 340763171 +44679371 2752959992 +2828227265 3525890379 +790226640 1313892549 +1771154237 1771154221 +3366186430 2131039966 +2056342576 1095182219 +3330031922 2339146971 +1039677707 3440683055 2562837588 +506064505 818576968 +1177592407 3582955248 +153310248 2325576445 +986465854 1019110239 +2681266895 1691683790 +1031075369 3894379150 +1105009739 4195584514 +1317933840 2021357948 +1401010452 930886400 +2598800270 1726853273 +1976026749 2575430498 +1161314296 1237780564 +3881631052 2171742804 +2236465187 4234508060 +3285476765 2663675778 +3615051965 2478866511 +4224062206 3396456034 +2456763489 231530896 +2062022701 2821435090 +1073217018 2008300735 +2278367216 3692994225 +2536236722 993848591 +1695239812 3293217409 +487981985 1789376118 +2356291794 2213206135 +421442633 2552729226 +4137426937 818304254 +2064751237 1102462796 +3756482269 1446663668 +1363676561 2079301463 +1061109265 430347190 +1140139446 1140139430 +1996918197 340857834 +1306669137 3960606607 +3595250637 626389924 +2220260354 3331708679 +3767280118 3326065353 +3880378300 218063975 +614065279 2117242232 +1676097576 1828546300 +3641896626 1424537178 +1868005584 381667171 +1816602212 1816602228 +1106772273 174710832 +3610712449 1287464448 +3505396252 4055490832 2015627473 +2777870693 3866336479 +2456473413 3273935244 +3521269625 2275690313 +4065488315 851623277 +1513430113 4044415622 +1728771948 1900080791 2790609276 +2118908796 1660632931 +181888736 4044812979 +2013251285 3164995914 +1169750525 3879650092 +127641724 1980381991 +1632986458 1322971874 +2548223568 2548223552 +1746895322 4208011638 +247307311 2509335931 1669127672 +4051350157 529151809 +2471802676 1764719225 +2244249111 4138724738 +2944492007 2911319538 +2942985141 3648714236 +1317805445 731019340 +1046558102 2553636722 +3122128825 2896283710 +2676280409 2676280393 +1091143516 3187676615 +2173338681 638461352 +3225327817 1823956068 +3291215290 2335429579 +3814314991 800444792 +2969149710 1866571026 +3662412018 2748670280 +2642799050 3285125371 +4218724474 1385734173 +1235803157 1252713963 +3762005259 149213268 +4289296339 1254596908 +1432270246 169342039 +4024887260 2222915399 +3779066694 1082749830 +2189536449 1443224049 +1794157777 702549264 +3975037291 1712388962 +2779832925 3475448405 +705824709 446889712 +3302986449 3170115344 +4102611624 2910098960 2608647805 +3984415040 2561487831 +2035981109 59433676 +1497265798 891715793 +1841575401 2348624728 +2424705477 2424705493 +705896185 890880488 +2232506230 263660353 +3768391987 3394153306 +3842251277 2922207936 +2226538258 2049950599 +736940544 1884145826 +2021326094 3080477977 +1169300590 1219655055 +2605123729 4112787543 +2123794598 3975748929 +1045384410 1045384394 +2428070007 1256158022 +1915558668 3372323831 +2280447298 3555046429 +1622997020 3321424656 3505854161 +2244731121 2431851366 +1128467321 1535840104 +1676225576 1676225592 +1124496153 2619813982 +2992604905 3043057870 +3578919244 470512311 +2294386292 3165864089 +340827976 2961810967 +2744577491 1503159098 +2100276349 4072360290 +906022925 273122418 +2742039462 4020325953 +22527506 790640211 +872462769 2384744870 +3717175058 621249965 +507365645 1413587045 +3609507317 2747953322 +1245447785 1165891406 +3099491206 1507619831 +1972785972 1336212185 +3507153962 4200255055 +96711928 3765662099 +1508599990 1133893265 +4281500899 2676437322 +294313602 530335402 +186366711 1940345542 +7469588 3345788271 +3973079174 2048658552 +1042877132 1542528668 +803019061 3454940051 +3590718446 3648532409 +628387025 2913316301 +2607413192 781873598 +2127694522 1587995357 +467620809 2844845432 +1113953832 3753734108 +3978070753 619618358 +2903503332 1301862873 +310372997 440699562 +1492850622 3511050249 +1556516575 3952273694 +4197304424 1947781781 +3851939466 4163666733 +3224538542 3768389679 +3030988189 56583732 +4129977404 4603888 +4066505516 3157380695 +3845917137 1751603941 +2238459614 3880634217 +2386397213 131941812 +926623711 4160559044 +218308914 2138991835 +2088232969 2773199840 +3817769666 4217663349 +2195215393 1410613328 +238028340 3473849940 +361650613 2752985084 +3509160932 677853183 +3168498985 1987669902 +2634435351 2634435335 +3907579763 2106394848 +3250627594 121898853 +2410503412 568939535 +3736433227 8799307 +361418211 1288873168 +513525998 513526014 +375621698 2158985205 +2458772616 3106640803 +3436010787 2320080394 +2922601708 4097105663 +882585580 3981777687 +3436904958 2059674335 +2663161747 719715265 +628570053 3215772428 +3856490462 3112036969 +207873689 923829096 +4094034591 3296075841 +3360316958 2691555337 +3840257481 2342000185 +1963159848 2386613908 +219950158 5843310 +1875944237 846258116 +1793397782 1553899185 +1561135594 702974454 +3903847713 3832559380 +3527346349 2788862043 +3244255028 1209891091 +2318314236 465083564 +1622062017 4093966559 +2270988961 3081648992 +1414301304 1414301288 +3740596020 1571243756 +1555564083 682738252 +1041937263 856192952 240416443 +960779399 2911965334 +2732632649 2964066552 +600819443 1393963148 +1221501066 658946354 +2751068768 2189763877 +2001374610 1549589715 +2168805585 1361760528 +3019981811 197964150 +3463183727 2431635628 +3896708266 1267527565 +1839880959 3040530602 +3782782349 3782782365 +562545190 4004946369 +231786402 231786418 +3476182415 3632870874 +1374106850 3505930179 +1734572800 1965584512 +477046417 2014965814 +1977784302 1977784318 +2496063272 1562239979 +1147348624 672504723 +708444670 4262977402 +3941772971 3195615599 +3543271886 1170567001 +42628865 511921702 +2841981879 1632659718 +1959946658 2302429717 +2203156816 156143843 +3758343285 1305825726 +2955283208 402299388 +2671604321 247140000 +824003063 926605854 +2463604668 668633375 +1295325182 2291451103 +2185588023 925881961 +1420864666 3961501309 +4146523622 4165501207 +3050301335 3444150950 +3964539709 3862076113 +3155237795 363977245 +3956388502 3956388486 +1114984223 3182136798 +1938491169 1938491185 +334341370 3557543953 +1894372948 337405487 +906357349 1884290298 +4035046180 3229952416 +2870161111 640859248 +3106942381 869787474 +56923060 789338121 +117530603 4062838516 +4263272463 363542414 +1981584299 2583459380 +862471615 2888158142 +1197197591 1820167984 +2360320413 360409634 +1658598956 1870342999 +652949979 2093248155 +1226263853 1487933828 +1685034433 3702046422 +2707949068 583107809 +1505718852 2355159305 +3103383916 3150112919 +1911540956 947879495 +400246250 2016350029 +348628965 2605534586 +341078842 988898379 +1090729162 571218427 +1811425428 2343035119 +3277019937 2637722848 +636851826 865850725 +2762829338 3939405361 +1318928244 898294671 +2212861173 84988556 +45319971 3981385734 +1304445144 1034294299 +1197345270 1107691849 +1817372600 566495305 +3143439088 3817131971 +201889653 1720085795 +1211115261 1699645410 +2939670501 3118220652 +352617390 2784425518 +3460698183 1304677401 +1923817520 3009653635 +3482282256 3482282240 +2229209738 3038615355 +3112807262 1413187823 +777141958 777141974 +541885605 2104807354 +191417575 2322607047 +2963344376 514990227 +1708134903 1032603600 +3251734861 1775969330 +3837707465 3780102254 +1134239371 4163966164 +2295447676 3727819569 +448530110 1412820619 +1253008430 3720680441 +2299426013 3646507945 +2829364173 1480232180 2829364189 +4001876264 2814487019 +2874572983 2789210402 +2856284286 2145261129 +2697473797 539100378 +2953907291 4170676827 +4061543156 218025497 +1481045734 2152380753 +2967676806 4220991457 +4223442820 3454999753 +4103710831 1395192748 +169139215 169139231 +2255273266 3626480377 +2423631595 1413635060 +1538389296 2300902037 +1751560874 1637369619 +188360259 4018813812 +2159938942 693996335 +3836141709 4186915812 +2021141054 1012948514 +821934222 704048153 +1406249234 1253371385 +2354462776 2137722565 +4081937275 3573956703 +2634104555 1683281771 +4198959939 1087814268 +1557624955 4123068140 +1028473678 375377625 +3372987210 899846857 +1753212840 2502695893 +3200834983 2253556359 +1281808866 2529758461 +17279721 1358934719 +3493924753 1735098704 +1775610395 3059402884 +2244012921 2863855771 +113324710 1210235735 +440460724 136944217 +4019546398 1177844265 +3336548918 1103059850 +1186747719 2709143241 +179137947 1778617106 +1556091377 1433895641 +4284628251 1993036649 +2759654153 1442268536 +2279328753 3489795184 +496701870 1226626287 +885106458 651824619 +1936184682 376763853 +2252029638 356766113 +1915078333 1905489449 +2566079598 823593257 +1391518662 1463193761 +248777251 2060186908 1796397840 1796397831 +395348079 395348095 +2792051725 133517426 +4207682809 3361616872 +1098206742 2776599265 +3935039227 104769448 +79063101 2821068802 +3922153263 868329198 +960413645 3938971566 +797557932 2178980567 +727701226 3860532780 +492509996 1651230273 +2000991874 1814879614 +2235504971 223662356 +3728781426 1372963685 +438843045 3528328620 +3818028710 177187255 +2691073992 802728004 +1491978457 3612552606 +3138354263 4165561812 +3015268770 1388781421 +111877411 2724126218 +83883222 3126161335 +4227012036 1672168351 +318386292 1406813849 +4280099653 3128224302 +3960248096 3083986803 +1307804084 1783967321 +3028204857 1552146615 +3896796583 3896796599 +3814115630 97810361 +1627723711 2047107496 +3090843379 2536975456 +1444367966 3836763625 +3518821657 1165350472 +4213026523 2110304485 +698855030 150447057 +3138894325 2069478570 +2859376398 1512334105 +3791223266 271363306 +1920982617 3491401301 +1032434597 1032434613 +429050621 1058376779 +712672789 4091613955 +47315079 4153031808 +2634565692 2634565676 +29459043 648036810 +1285445401 3057851464 +1404057545 782199672 +121759350 3804089287 +4194514503 146610048 +117786941 649280042 +738358213 1455726065 +2682408031 272513438 +1232173602 3215147935 +2503532294 4001830519 +3347531922 3886192318 +2405768298 567492422 3990298742 +446263430 1703682785 +526978517 1197524554 +3886615369 4162634734 +1172991671 697540899 +3062624709 4126430659 +323212907 3200944756 +3213504528 733304879 +3186505462 4093674833 +1039943836 103939338 +2314805912 534484304 +609133640 1875680587 +2465202793 2294382280 +97922956 1876762950 +4035799177 3111986851 +4154428141 3615417669 +129493860 3442683181 +3294229017 2801868239 +2521990462 3790061705 +2692770465 3468593406 +2597484382 391244009 +4186803963 875120574 +3570614247 3152495588 +1055276093 111001378 +3887581743 4115875822 +3225181651 1913107237 +2875856422 2992454001 +3881399973 2538791779 +2369077585 3617220854 +649124522 2456304027 +2487056446 1107289439 +857947176 2826416875 +3873754574 1211104079 +1188580714 2003845074 +4249321881 1351680968 +2102328927 2723835784 +2918110222 3290733478 +3697781572 3697781588 +152136273 2540330384 +1735650416 869262297 +314048845 3299478564 +2317823516 1982046421 +300031499 4179989816 +630926173 2420458338 +3959657203 3039173175 +3590251638 1447142855 +997642795 3339508148 +3133461073 1188514441 +2451759187 2408417709 +1505210791 3811355126 +2272850195 3936613271 +410361785 975859752 +2688615725 1935353298 +828611131 442812957 +4215660804 355824332 +3197431300 3197431316 +2356548270 3420415983 +364265566 2347193343 +2997491866 2840826806 +3940970340 623648612 +3787202640 1688972200 +1082741723 1932460498 +1638244026 3506878869 +1069928444 1916297639 +2452777453 4194458692 +1503721149 1863663028 +3592674572 1998942228 +467373366 278875143 +3192473338 1218660822 +2542250671 1346705053 +1696954167 1895476102 +1802944922 1802944906 +2487853872 1944295090 +3533288757 3533288741 +2505929110 4154530423 +2438974328 1372409339 +307349091 968576458 +2239529500 1061859527 +431577289 1088504671 +3841901889 2315380326 +945101206 1237848280 +3041195324 2542669169 +235799027 319623578 +3059294143 3444373950 +3463611497 1732669774 +435052514 3024154819 +3786697525 1098987814 +951404029 951404013 +1846515285 2542381002 +97939839 20099009 +3023395205 3023395221 +2773073973 1746506620 +2060634983 3235263286 +906826007 764536624 +3124518799 531264674 +2321686525 1316464866 +2201827565 2254478596 +1719091985 1589547984 +546150048 546150064 +1854364595 597552951 +2841136547 956446602 +3910385166 4162072591 +591800896 3346301651 +2924645029 284180922 +1784670693 1509765996 +1601015847 1618603382 +3004426495 3881290088 +1836381685 3877215116 +2470857456 3349673923 +2521370266 3129371843 +2726899660 2851487265 +3700240018 3292549061 +2064236183 1196885936 +1706111494 1955620945 +3224636167 3224636183 +3167420984 3494217024 +1148165382 3249811575 +1065141163 2624063010 +3274360238 3274360254 +1527548307 3887895162 +3440961933 3440961949 +1327646090 3063159392 +2014508956 2974997953 +1546676185 4180900510 +1086743237 3175971852 +4142295207 1404485345 +1405125955 454150268 +2930223948 637498720 +3059422133 1509824275 +1235673992 2042113803 +854356727 854356711 +3225285696 3787609732 +2247695447 3361476052 +4284458139 2660245522 +3162707241 2129826687 +1060642491 1079533668 +2884439598 3828181897 +4166519653 3780429469 +803777245 4000044327 2613954536 +412569477 1584823210 +799927199 2915691336 +3071676022 2914567111 +218800321 1220218838 +771106840 239200677 +736666771 2132601758 472163659 +3076104395 1358542319 1830297492 +2807846452 2858136527 2858136537 +579179683 803580294 +4089636897 3704843254 +3407206516 3407206500 +765970066 3835035949 +1646431127 853487380 +2236668790 2091667642 +803573019 2170364306 +4255332209 4255332193 +4172710716 3276838759 +1167623666 2166021093 +1362346224 520915549 +522692835 422193184 +4170802006 3411377586 +1100787054 1204131321 +1102466684 60041413 +1922049353 3530955192 +2699798420 3875065337 +292689092 3140999577 +872014642 2535980763 +1954691176 3189422723 +1763180357 3049707916 +3978981818 332466141 +857131631 857131647 +3725152841 3725152857 +379646081 77734832 +1118977768 3868788541 +4136733343 3202955121 +2644885262 313026322 +3746732505 3746732489 +942308362 3114114931 +1727745074 315291090 +3632548082 3632548066 +2995462910 252188105 +2899065755 2362846501 +2264925049 2819511535 +2271861260 933380321 +916043255 3942216646 +2411185130 3331381843 +1706683302 3383621185 +1922726082 724310371 +2829428907 667452724 +2415455827 4158598316 +3945817388 2468594710 +1178401679 251875864 +288803512 377806149 +3573478538 3331903840 +1829096797 4246882658 +2698957753 1435481355 +3060544667 3060544651 +14585740 376521030 +2843712665 1210722664 +49527640 49527624 +1015358445 848793092 +3705771016 3206285451 +181629717 534653468 +2293467146 899844486 +2012190950 3136248359 +439000817 572011878 +1419530927 3776325998 +1212500921 2115384360 +1430986956 1409920307 +1976778385 210468422 +3877674819 458929788 +2532997056 1092525084 +2399580204 3686969788 +2162658021 1106447297 +3901446497 2315923303 +4110824989 3141708114 +2895718222 51961817 +2853474441 3252389216 +645638830 3534144772 +4179675129 664456446 +367713010 1924573925 +4215085624 2868800181 +399574288 2383083555 +1931334718 1978998175 +2912427166 628457538 +4164342893 726689682 +2062863120 2944123407 +95450084 694299599 +4010237256 4010237272 +4185708935 1183477654 +766349911 2107405268 +1515963651 1098326972 +2230341190 2353739809 +1547080828 2783690535 +2499118328 3601208192 +2139969892 895176015 +460133724 2293800903 +3459913896 1810117827 +879781432 876651731 +1508079539 522566902 +883487652 2314701631 +1587324962 2759419727 +3504864337 1057430496 +2523593195 1653661081 +1955884884 1955884868 +698143175 4124629203 +4109155483 4109155467 +4201607417 913233896 +2171609363 3598979322 +3548589398 1300258407 +50949449 1017626670 +1566925505 3348788694 +3878646062 3878646078 +2976463902 1722393385 +527183634 3789406402 +883325117 501330975 +3586330096 1913581763 +2750808362 713429034 +253762742 3752526650 +603904299 1278608981 +2285167922 1179635917 +896109937 2250877158 +725943865 1453902760 +369009161 2832798766 +1532873177 2913255560 +3202069533 3336682005 +984632278 965173745 +720311019 2170210274 +512791419 2560109234 +2285319248 3843480180 +3593292925 3593292909 +2198158075 1010555172 +2088474678 2088474662 +3555999519 3555999503 +162125832 2817435884 +2686538732 7806081 +790132125 3229689396 +4174161247 4174161231 +1558493042 2920073317 +449996853 3948933521 +59168273 2655190224 +2289002606 928139513 +3368455344 3368455328 +405048057 4203136488 +3454817044 2964166271 +1735583352 1373687547 +2899861883 2476831909 +4063289278 15742998 +2973553154 2601194013 +3622509873 515528641 +2501450415 1214337004 +3823869066 2422606598 +4282930846 2095078057 +2297000058 2297000042 +2406434194 1579844805 +2757590178 1630221059 +3292299014 252445034 +3529749972 4156559924 +1022221472 2322747365 +2618282135 1139105190 +4103014857 3324798840 +2272161051 1305854340 +3148714605 3745350034 +2821042022 424877441 +1235246412 863166135 +3718239513 4221335134 +2245098834 2751848381 +4210168995 2640713395 +2519411862 2878953842 +3428698573 3066523550 +162610807 3325344148 +2108173314 3518842677 +848529342 1547612169 +2557415818 2075677190 +1797202350 1421945156 2754305588 +276008661 3135887708 +1439156019 1014928716 +741782191 1226525048 +3446151531 3446151547 +4120904944 2950458973 +3263339388 2946155559 +1640675389 3054891083 +1023364521 3841815744 +3623130094 334896827 +3018729259 1793566882 +450549800 3340763792 +416428578 3256436115 +3873441700 380372799 +58791905 1698207542 +2758333320 70087308 +3962829038 4040068473 +1693659926 4223585692 +2130620529 697562871 +2086691997 1757307700 +3397178271 1635853150 +3924991883 3555796948 +868765371 1388624012 +249305425 3044792976 +4155989650 1667979578 +1740846967 2633291561 +2940979740 273623576 +862210361 3933812488 +3708972659 1996742426 +1641338510 727427048 +1006414191 3720264120 +800667011 2744073514 +3052312905 2124943861 +23123951 2701066897 +1961159327 2012348328 +1581912480 244956901 +2229375141 2229375157 +2180679196 3840038097 +583010134 901617509 +1777435746 1777435762 +3374840445 653218516 +2728479372 2414369399 +2348853629 3792359380 +462465536 1690017285 +3972804151 4234985606 +1476343363 2686185383 +3084610906 3362596029 +2255780389 4132071887 +4052727192 3711622747 +2370826977 1440438304 +3562734768 3776182691 +1461361975 1441103238 +972487004 2984974198 +942915461 4269178458 +1319243605 1383762217 +1760395688 129834614 2982266553 +2648429353 2853005710 +2308302846 105133410 +2463990582 1756728849 +238969529 355815448 +4136939793 1024638416 +2456722765 1928281336 +1449301545 640836231 +2517555931 342001357 +2913792471 1044428134 +1502659191 1977753926 +3811061776 2823006517 +436534355 2690629037 +2724780601 3826223038 +750231607 2618373776 +3399360869 1542361580 +3263661843 3767925654 +2278927453 845043316 +4277438882 1844999862 +3689271858 1556735141 +2612667927 1024063014 +3764029352 1685215867 +3461915401 2065639186 +294859284 294859268 +586759671 89951174 +2521660117 2521660101 +2803389304 2628875283 +1179894300 1813246151 +3540554838 109182642 +737044103 2940954262 +2070679244 387664695 +3594815103 3437214184 +1757985680 2214544309 +2415151905 4207385315 4131557200 +4187409101 2067163867 +419966703 1457644078 +3780054893 1587625426 +3680583239 1411275076 +1674568083 3007322732 +3501256410 983767158 +3341968901 3341968917 +305145505 1120718710 +1607832924 1607832908 +2947199009 2863875062 +1850978775 2227238256 +1101174508 1056150913 +3392194959 3654110222 +1483931452 2030553959 +1961231582 3970983954 +1176288695 373204742 +1663918126 1315858553 +4241710045 4130473448 +3677171153 3523176800 +1097935851 4029162228 +3006082636 1545593249 +473015577 2066146888 +45433612 1331203063 +996994670 1701014781 +2719339986 4200569235 +778685860 3029252393 +1836251830 2853147189 +807646346 1379218747 +2199570640 858398581 +1117478158 3901979929 +2391958017 1903183754 +1028459056 3513691840 +798804032 1530705213 +3690243792 304257379 +2729159674 239057565 +1841543995 102743524 +3884534307 2686432522 +2050728891 652394354 +3649305707 2639569960 +2731000794 444157995 +3815113240 2732071514 +997688804 2166867455 +3906736105 380210930 +2072631849 2734845592 +836037963 3909162616 +307910623 3275248670 +1177374306 1344285787 +3452759161 911610625 +4041661188 1063962463 +4255819429 4171519404 +3086977385 3877463154 +550012211 2703160480 +2914006321 2914006305 +3529993667 3141281329 +597772148 874218409 +2214349832 734463779 +3241851653 3077880879 +1547374234 4083311281 +3998501380 283130012 +4289374686 1470720127 +690315588 165158431 +3746783921 1688066390 +3955418026 3452724365 +1317395928 3310412432 +2569659061 3522159356 +3378985501 713063330 +779449442 2229679701 +2347805790 2849986537 +3106031928 2834907963 2834907949 +496334856 2190611253 +707475636 369771343 +2669803150 1326862091 +1842004294 472793377 +1202792928 3152341932 +1867859082 1491467533 +2423328524 442808481 +2524931079 4052383510 +1062421459 2199110956 +2345796414 2345796398 +1453994356 3790330255 +2638140583 3731539634 +1817276748 1694346081 +233930404 1486051108 +1589757366 3775544711 +2983373653 1134802652 +766647799 42961603 +2733576180 962058644 +2809532348 1524286705 +282861565 2592188660 +1775157987 1937558346 +871536756 988151449 1359989448 +1893380821 2101839196 +283553836 283553852 +1580799793 1373233622 +1991960902 775764267 +946016295 3597430611 +3876615905 2682987552 +4050536917 3852352092 +2800883691 2748952674 +2057601159 2549503104 +4257024745 1503145176 +2008043543 2173572144 +268754052 3148293087 +3148293064 807228381 +2289114701 2221938610 +2049078956 4144537559 +3652196693 87548124 +3704436653 1141810514 +458306203 2614274578 +834937077 834937061 +759869671 865369014 +2997087500 1141778935 +1998751565 1998751581 +1609822932 3775349679 +1885618751 135867057 +1208874908 167561863 +3645780203 2872578840 +1877698559 781497982 +1823393377 3556482182 +3415077035 3290648783 +3944266049 1491837248 +3556723196 2582606307 +202980813 3636218290 +1408150890 2327510477 +37079438 145509007 +2498780693 655343201 +699451771 830293544 +4258863529 1170433294 +174042488 3432911853 +90661813 4287203497 +569741351 2626809206 +2491452987 1578927319 +3232493906 2695685139 +410547986 2544070995 +1238480671 1411597768 +1896533227 3741357538 +1175507904 595570880 +482865452 482865468 +3364550191 3787557870 +2541692238 2479050882 +2767313067 2299355349 +2551319750 2081005841 +1039863222 1211536785 +3083066617 1266912623 +3129545984 2781613843 +2506987184 3525488591 +2463414399 2749263848 +4076577140 269386283 +406201920 2183676631 +3221873248 3221873264 +3814877244 803870328 +1240146970 1999230187 +4155720487 4155720503 +834870727 489152576 +464245344 2745515493 +1043143152 3506427075 +3055576530 2063767750 +3909865550 731441871 +1841113435 88350 +775577171 417496236 +3156668099 570754454 +1715235656 1165514851 +3764767954 3736613494 +3319638412 3805232544 133293921 +4168744183 4168744167 +996173189 2949283906 +4193263751 4228068480 +1732277889 192580886 +3161216615 529524592 +1564872092 1900506247 +1663021966 1663021982 +3775917360 2081579651 +1391810112 3313050643 +1982900489 395974968 +2772523972 3923998111 +2318771947 2104869876 +1488686681 1766842691 +3911200200 3316126173 +1630720013 1630720029 +1889322367 3318408936 +2797461239 1125130612 +1121913402 2132613451 +4264181841 1837318022 +1864718001 3629815556 +1755212062 1755212046 +429021395 341955642 +2142439867 2340954216 +2513741952 1244996024 +2302087980 1041359668 +2992896475 3083971045 +2238276705 1709769895 +726150553 3147810782 +2770078018 757240565 +2950559058 745091077 +627943443 4271871482 +3636195623 491812659 +42662453 902291811 +3275541584 4121038760 +3940123103 2685449239 +3393369726 3864063369 +787626885 1817424474 +2467123844 33088969 +203433142 3432630919 +4152185264 1246205973 +1357794797 1411689490 +444708557 2268251300 +1563761530 3654575189 +4281547358 463790569 +2752087314 1291615059 +769790669 132356260 +633488389 1976636378 +645672628 2427460564 +1809468059 3729554504 +3420540616 3148809419 +2921681876 4173526713 +4105927060 3609224175 +3091052267 4096193524 +1777513730 3407016501 +4282196107 4282196123 +1567744100 2118401407 +1816814149 3672189034 +1008484792 3998785077 +4233431373 4233431389 +2435446972 1091735527 +2378033537 2734069270 +537182139 2848441960 +496125201 496125185 +1515963649 1064771712 +2564456428 1031151283 +2369317987 3013353418 +511893799 1783162660 +1705324626 1426788613 +618555443 2185695136 +2308167957 2179074611 +385716134 3609797185 +4008074248 480436363 +3643282349 2266429764 +55739946 4061986870 +319053058 4057885219 +2061871832 1334571533 +1780336908 455031828 +802165696 76486476 +204790797 1144416356 +2002429332 2002429316 +2705877544 1922736725 +1677583228 3836550193 +1916576634 4121450807 +1373979313 2632449200 182683175 +2088124260 3128795983 +3209767698 1053216083 +1314422018 1464650275 +2023995379 2023995363 +2546598905 2293387230 +875826234 1743732573 +1829618961 502685476 +3825576376 3785643091 +3162252768 2540674981 +1005549021 922127074 +1317859904 3890305733 +1187154617 1247351966 +3474447262 2142136233 +131479439 3845748238 +559961157 1124905689 +2859520690 2237820040 +530804912 3827113995 +2168543915 4226641667 +2388016382 2388016366 +1412775650 1823714968 +3113922995 3365367957 +3284943601 2940036109 +1044678679 1642493684 +4194307408 2382818858 +3267620416 3843680503 +719300037 719300053 +3420493963 2221487989 +354319292 4210870513 +1001581858 480988309 +3177598697 286144728 +3255891084 212924513 +2197541124 912918857 +1387532629 2255964380 +3374264720 739968419 +997892186 3917068563 +3085885228 3104395863 +3139535480 2294929408 +3117336655 3481621582 +3218318749 2994234121 +2829831698 2557830725 +2366917023 2366917007 +2822943576 956322715 +1281235742 1445244991 +1780765147 10352031 +3906803449 2366319080 +917658116 516142153 +436731443 1221982583 +911589897 2449503278 +1880286747 2294299780 +3319781039 316537501 +2935784470 2374233767 +3110870338 657592035 +1174885403 3763100556 +3438019689 442081748 +594566945 3940925686 +2938327894 582815999 +3251748164 3251748180 +799520716 3506853431 +1915554992 2330336267 +62226948 2658154223 +3545095141 1179557836 +511641315 3841447754 +3434108857 647244190 +3853327168 1786556127 +3371021581 81882226 +1924136277 3758869706 +4140323182 2866010617 +844047269 3616873644 +1538671857 1357809520 +1358718571 1824618569 1375947324 +2293344949 787567635 +1161844330 1850214619 +2845951416 2845951400 +3474890696 3807587103 +1521118771 3654387104 +3260460001 3480261439 +4105841023 2274465729 +233911560 3172673759 +2362465066 1701434752 +3127008735 3894994864 1658883784 +1565808522 1975897659 +2468059728 3832802275 +2327985918 2997676575 +2243201588 304965838 +3026796750 2217257554 +537839448 179328365 +1108682227 2906999010 +3223998683 1570588868 +3045308863 101331912 +2527720394 2859941157 +4202387148 2055983923 +2752217161 2266690296 +934637139 934637123 +675417510 100367425 +1614789566 1614789550 +3302794723 3394839636 +2926146649 3909232670 +1428611961 1764143984 +1580755406 550408025 +2929382426 4156286205 +1903716803 3041940400 +3810034666 1771546957 +2979472908 2633032951 +441335928 441335912 +4178258991 999722478 +3493190918 3493190934 +530099361 1582809440 +2991381707 3380658186 +2478556620 1553489975 +3997146854 2357208127 +48502337 3457091648 +1451093135 766504305 +1449465369 1394130869 +258076027 2989021348 +2782043633 2299769520 +3924776405 1540872962 +380157163 336822040 +1232637313 775547965 +3919324401 2983077744 +3517424947 1038683994 +1985718087 2458803973 215837266 +483961934 3071753945 +2211735537 3766434167 +2533702713 1138880653 +3484823512 3553448205 +1910339815 648369078 +2866489851 4060288562 +693470720 295825925 +1602427913 2986555167 +2926230028 2926230044 +2972696577 120927783 +1832477705 4200102456 +1481670058 2964705933 +1167762635 1567714196 +64436782 969971311 +922764636 1045558988 +265689026 3221716869 +4273912753 3074520998 +2064240380 1041770668 +552389642 1802530661 +3281712427 401601186 +1496352135 3298235012 +1427638634 1591136731 +2829337739 93841090 +964148448 3497736664 +2541525027 3823178436 +945353437 2433110516 +1966868668 2822842471 +176292986 78449693 +3051573206 718712295 +689351545 665841534 +1819814566 1730880343 +928474369 529793152 +2666737929 2223529503 +1247985060 3178268991 +1974187761 777059696 +2602185767 2742043706 +278329338 3190367446 +1816853104 3926408789 +1034158346 321757883 +1884368236 1003127041 +3914121165 282193828 +3057445085 3202520052 +3053805529 1668670110 +1765104726 378528545 +3057429251 3833673148 +185123883 575068946 +1774789593 1621323422 +1762783777 1547470819 +1480500318 1304575593 +838199460 939287844 +1551497107 3525877248 +704910819 124679260 +4198425022 283549858 +3280619646 1353719369 +2837929496 1626939341 +1079919207 3143796790 +2900057073 240237670 +81337478 3975308001 +4026139846 106846481 +1339438074 1419014357 +165568870 66800432 +430848092 3376593105 +1349554391 2850018882 +3841714354 714035237 +3871112964 2778956530 +3059983373 735789170 +3242257213 1983009026 +3996855580 1761399760 589824785 +223981387 3135809656 +3823062983 120227539 +3682814320 3518531293 +2012118526 2400855906 +2262304835 2299855228 +2736288019 3358929389 +1922627342 1959586575 +3959243184 799959061 +3279940909 4016201170 +102515783 3850337216 +585275342 3817482066 +610874640 1659477924 +463708657 1539520375 +3208705218 2710411470 +3577826671 3577826687 +3085878088 3085878104 +624204289 2463002518 +1353903750 1668978287 +2006867152 271816052 +3384358267 2959708712 +4056684728 1548413371 +913688953 879503742 +3933768404 4022504367 +1867774416 288506485 +1025444650 1641976589 +761229805 1514166276 1782608212 +3217531162 3873141475 +513660638 417190146 +4059517873 1591000214 4160185344 +1055613035 2005452898 +175797440 375220891 +3824543953 2904391942 +3826771861 1672858035 +735046544 2286932899 +3501810940 2413426865 +741302892 13740668 +589640651 761332649 +291504159 2032152798 +1224523230 3605115902 3286164607 +2730059333 508677244 +1366587244 2790784791 +104748257 3038748214 +3859083291 885389970 +1618886413 619578994 +3233749996 1653140819 +4145111202 2455445251 +667166795 3838537218 +3838522982 374121882 +2017295540 4241182553 +1219548828 174184337 +3529903832 496961575 +2315512003 120023804 +2565372027 1450590734 +1660595544 2132611315 +3286515343 4014897934 +1827711775 2648531422 +1763809727 1055197096 +30286266 2441025501 +3539470845 427276628 +2721697938 1631591227 +4026127148 4064767575 +307149902 535981785 +2562875600 1241409404 +965335241 1560298606 +452070097 1817216125 +3286732761 1049064094 +1530292037 3684995468 +1907458910 742316674 +1784671580 3506612177 +4155558860 3820534117 +2072537789 885000066 2353779124 +2222447659 1419874297 +655577624 1805478883 +3040656196 784464388 +233287618 2780409461 +415904866 1750103637 +4183911932 4166528945 +3308328789 1492780787 +335715893 1407916368 +634868209 3086903366 +444024286 2277702783 +3915757761 740415424 +1718516589 3539769368 +3508817984 2083148997 +1134078731 1951744596 +1717542396 1860988485 +2031761657 4196696431 +3914842373 3255076157 +2395037716 3463069551 +651272437 1390874504 +1771166738 1117614163 +1616496075 4255834862 +98688105 2878208344 +2053996978 2053996962 +831909287 3053788640 +4233543834 831676002 +4094851568 2190502731 +1529650209 2822359008 +467920636 2679267860 +2382883203 1200434790 +3832937095 750346902 +1718704639 2455726012 +2706801715 81955744 +3569367775 3382488328 +3577254367 2265817630 +1078545450 3832977260 +1038390599 24315972 +1388484229 1388484245 +3778135880 3378296413 +1951724973 3468607300 +4191506894 416270169 +3686786089 1359256557 +182255394 1004905091 +1888239439 860853644 +1676897989 490168346 +3287514209 143091317 +1150109391 1150109407 +2762017884 61465863 +806620519 2792000868 +2713869271 1811315286 2713869255 +1451726083 3114635504 +82653253 304424259 +643520657 643520641 +1210043241 2569171212 +209971702 2846445127 +3125598356 2934134760 +3892803835 1052996402 +4248058629 139966423 +3348336759 4098682612 +2468124625 3025894274 +805046543 2562867854 +2825595715 2825595731 +2333127401 4238724505 +964687630 2354378170 +2400205977 3482281160 +3978911334 2683804333 +3767093282 502449451 +2010916995 3667988583 +3518959634 3518959618 +3373695914 946947227 +1291863465 4018751743 +3281630563 1308134108 +4093540580 532953305 +3400872752 1262458005 +2764120665 3037270536 +1081572233 2985490926 +2401655748 492991881 +3022204917 2288287402 +2643490848 711793253 +3574735053 2643652043 +1488421200 4175466741 +3920248288 2776237272 +986146430 98981983 +2267913386 2763147073 +836346724 2336364114 +2538952382 4183264543 +830206480 2907831149 +2620402048 137817272 +3327190655 2265253930 +296193964 1992764375 +1177422329 370627336 +680805098 300336184 +2722756030 421633886 +208999115 831485944 +4079724836 4079724852 +2702717354 1125527181 +112971617 1268665734 +3525761860 388705311 +1881235282 3599306259 +616922119 3923918592 +2557043692 2032739659 +3499182676 3534454719 +1879641799 1018531132 1272696174 +2740072299 3698264853 +1458769146 3667750301 +2555385013 2064685308 +700095363 3014407460 +3862175268 2526974372 +837168739 4032497116 +882461723 3897740946 +1683250737 567297830 +511484903 361446731 +1544551880 3039592925 +1571117408 3410735660 +358501319 1785809494 +2797222974 3039614367 +4234791105 4234791121 +2333767473 732537392 +103809402 785215766 +1366221301 2833832532 2387627550 +658173554 3010204168 +1304578760 1304578776 +885892258 4212241853 +4059016571 267437036 +3721839755 1930860482 +1153003651 1419467075 +837312176 461312456 +962427480 492119525 +3410783568 2064703435 +2093120083 939099885 +3411541445 2324754410 +1769265011 1978608154 +2287176156 2005009745 +407257521 3885590960 +1130776111 3821217659 1224768504 +1288852218 2093164482 +1746591121 1934281552 +3730651430 851506881 +659357063 1697848214 +2299640238 4145945647 +886235330 3021905611 +1546410114 2614056117 2614056099 +479999146 3806318107 +828751933 1238557474 +111425849 2911245502 +3542829038 434364826 +435238840 2734514703 +233500554 1926698541 +4231647707 3926219730 +1939039160 2835741371 +826932510 3044636201 +2899615951 3787007438 +3816159324 1857419473 +743485780 743485764 +2514980817 3431425552 +3410675901 3283747220 +4265684807 1020408402 +1081855769 2615608392 +1976327855 2084027601 +2485551216 2089701915 +605143068 4154950416 3016043788 +2500961573 1278889985 +1951085418 2838271429 +819411866 2094191485 +2357954424 3081126395 +1357149130 3983916325 +3257833373 3147156976 +1965628283 1965628267 +4139805719 2280269872 +4282859508 3509169433 +592815154 3520166565 +3876599699 1367833722 +2164028825 2979013711 +3444431859 613498764 +3449955007 1966912169 +2625961205 3858922138 +2610539959 2850846480 +492543307 2184748290 +859810932 557611679 +50138626 3059551523 +1420646076 3479973356 +733482876 819427377 +4266849932 108823415 +3432861654 4054101479 +3762957039 3762957055 +26220775 1557607328 +1669568676 1277774377 +2580925586 3180399059 +2398718089 1695313248 +616510392 2432592571 +532534434 2580921091 +463280192 602275943 +3726713114 712007941 +2045145415 1108234866 +1203551847 703935640 +2269209718 1643193809 +2024957795 1535630369 +1217509997 432038132 +3682842845 3682842829 +2091378481 2091378465 +3653796617 3752216376 +24246536 1315637149 +3605994850 3161145685 +2623342952 7631747 +22129251 1989097948 +3713522552 797980103 +3876044151 674185798 +308718970 4005381717 +775605097 1104242840 +3318535419 3318535403 +1985086034 1985086018 +2698725650 1261700947 +509366966 2169910417 +2468794187 4044903170 +211728945 2402794710 +4000555539 30444672 +199142333 1820875412 +3004346915 158231836 +3708530091 2757911586 +3120527831 2754399590 +3655720191 2039947947 +3261673280 1268081107 +872140679 872140695 +3631533682 836828531 +206249751 1900146982 +2633696338 1898433797 +3017352563 2446717978 +32840262 966339207 +3525004680 3515573 +2427482763 2427482779 +3022910284 4234347443 +307361524 3057028425 +1667388751 3268168536 +652889269 4158046460 718833591 +2354935193 2418024392 +3774369257 266511832 +1378832137 1769564974 +1237545876 2997809657 +785005899 4083055874 +3247022811 3284545160 +1019299905 1692930452 +2109531775 1868487144 +2510044603 1150975765 +1273651257 3136649662 +2256902238 1628864331 +3991939027 2938169430 +2355845237 2180792380 +2286148480 4134539085 +1664020190 858249474 +1377170448 1217344821 +2890392294 455749655 +2371420361 846401093 +3170162401 1167417606 +878458878 2555225442 +2534831429 3178978371 +3463585357 702416635 +1185029397 3655592940 +2602321452 1501722433 +1553932660 1115793817 +656201646 2122612210 +912228361 2706804270 +2736741616 889683983 +2129919719 3239724470 +1512862058 192743590 +2804836117 2589083654 +3192262581 1028307434 +344314569 397070958 +3084610887 3043821270 +3931676831 2290408008 +3413700269 2245014689 +3175839397 13124554 +1190875757 2956376274 +3116494018 776451427 +1236030134 1255363474 +247974030 3531650969 +799111501 1211233330 +68790697 753243391 +1267081427 2018378484 +1823758430 2112297983 +286009577 3206833871 +3149738647 567714726 +3438520978 321646622 +2533529380 2942247193 +1600589688 2805815803 +279626881 258279335 +2842336310 2358760961 +495635500 2910808407 +2878133441 3484609494 +48651385 48651369 +1174694803 1933188910 +410833967 3145860590 +235800270 1866066969 +2120884932 3306470025 +2183939909 817115546 +3820754736 2971172995 +3348206300 3836278428 +972138831 2255325006 +3077792567 27602822 +3192320344 1795898910 +855822581 1114567100 +2627797304 2627797288 +812015913 2141022350 +3555612075 1261493300 +3679903325 2797603956 +2113174562 468754082 +1868841117 4157716258 +698184700 3719856044 +2105736565 171245372 +2080188683 3367850702 +973958866 1022788461 +2655901022 2655901006 +3405219711 44715240 +4061446300 2997564824 +2195897467 2247013810 +11576626 1209273779 +2522817913 818412904 +2742812676 3919717392 +561089948 357001296 +1315431824 4253966755 +3423224988 3107552908 +3937007137 2089260227 +1278272888 3162822912 +3345818390 114178993 +2947521453 1047662916 +3930289948 3828646151 +1599541723 4044430290 +1248199178 1547323270 +43772112 2206453604 +2724649039 149052632 +718208696 467336123 +1735400602 1735400586 +3952760189 1626641346 +3789227239 2499325695 +607142295 2398568614 +157398713 2110956840 +637155932 619306695 +4051890950 925143671 +10448567 2986035718 +1046241937 3909061686 +1414935093 4172351850 +2263131705 928400565 +1950342319 2348149703 +3914980327 1064643766 +1677746106 4021190050 +2482298309 2943950092 +1827855778 830477994 +686362715 3252993874 +2679211137 3849557782 +2542324925 3357241803 +1243533362 3483129956 +1897689965 1897689981 +1005628083 249345996 +2730485589 2627623917 +2996269383 1801933504 +3754411457 142364374 +3285684296 3285684312 +945727873 1040504350 +2780541627 3003741467 +3096553150 1263107359 +1290267965 1310357268 +1947944601 1609573064 +275336625 2261077424 +1702623571 4233156054 +1422094392 3522669251 +2965132762 1121785269 +154279780 3159130969 +734157102 284320623 +3628190857 4199181471 +1960798251 2627484750 +347645199 2913719950 +786006510 592780978 +1429573528 1307551969 +2498452969 1468323288 +1009908642 2309975991 +2986345214 872723935 +989328930 4132992917 +2917115430 804037338 +1664840152 1354240945 +1182935956 2464848377 +2871103917 316166980 +4141735932 783746180 +2276693630 542951245 +2739575206 1662920945 +178161961 3767659416 +229523062 4283192263 +3449125979 4250059602 +1122979562 1220098637 +1281639744 2178483141 +481214320 2534890837 +4225606757 3806972652 +3132259980 1704762017 +1210736167 3249682294 +983848071 2290523762 +1001769398 3039594887 +1122649565 66957487 +2161975460 2952178412 +3995897576 2133931267 +2149330648 2220736013 +2086717459 3747280364 +1023744833 1023744849 +1465378575 3870544113 +818791931 3853899432 +2974949101 1901058504 +916616090 2481768821 +3842033364 1320849449 +1904104986 3286338301 +1629049198 1222324281 +1180543860 1414176414 +3346574622 553158185 +2717652720 1714671708 +2693905253 1705209776 +3183733148 1466482823 +4035729844 4105735711 +2169402885 2474887628 +3792665498 3765764959 +1279896320 402141445 +3080301783 3723171436 +1204575534 1204575550 +3138974398 1179001097 +1968371822 530388271 +1850425569 9098426 +2312364706 2592982275 +2723601404 1338111916 +4134734684 2907802173 +1735652436 825619223 +4036871867 4036871851 +4211747183 2684303800 +1159505742 9235374 +670974525 3517802040 +2121767404 566438885 +3936572556 3944618103 +4287239416 2626736517 +1476494280 1382183883 +1290627131 1153104802 +4136515 2791089020 +1980933638 255378794 +9083084 3462873048 +1499570319 1135591704 +3217578536 275115261 +3335618862 701389679 +1122328853 3625414636 +3400945691 939530898 +1250104743 4082832886 +3557323012 3444173129 +1929745108 3854967737 +3784234934 2633968376 +2435421124 1215536543 +2971321857 3458577302 +2819610910 2935147049 +2977342816 3183892005 +3027717647 651157902 +3174408012 2894104951 +3298644237 3298644253 +4227923070 864909897 +2068118590 2068118574 +2952834710 2803029543 +539208829 354978004 +493035718 151820193 +1487180255 1779540488 +1615496541 3587767618 +2365321502 245142079 +271650705 271650689 +1876560995 2551990096 +2621793071 3843558522 +2266166166 953513255 +2055641439 1088647304 +999039348 832088473 +168442149 3904309853 +2812083434 1119828819 +125453472 1722040088 +87195325 1150687369 +3575081002 2648242701 +1358836947 1395468346 +4166793657 3183991710 +3482017952 1483283443 +3277381431 2189065295 1564588980 +1521339895 1180641396 +1581347372 2560260959 +4241738380 4219258528 +1512798500 4208448271 +2219494504 2847917995 +1966414099 2509666554 +1177965416 3218586272 +635895484 1721958887 +2319485624 1536843707 +4281094803 1768449505 +538015235 432793990 +402183407 2880910392 +1548598426 1039646897 +4249241043 2292181818 +3386719277 4098210500 +264018265 3240186921 +3202782148 1223026564 +1664510674 11151507 +4186960996 1100855679 +449954084 3445316376 3445316377 +2150750139 2306251634 +1084247830 1084247814 +1649700718 2355704236 +3225598696 2433497899 +4218213540 1884470825 +841996714 2112570990 +1975526229 1975526213 +2177857839 2854692442 +490858966 3837991911 +51423432 2604249821 +236563639 3916096518 +2240838262 3094398929 +753690092 2753852033 +2312213776 82683957 +371732583 1212428832 +3159309624 2830982957 +1591196313 809807 +3355038151 2504342592 +3565401675 2155579246 +926616577 3117414509 +1811915593 1282280440 +2844856028 2085355108 +3097671235 3945065340 +4032305349 800003932 +966233264 754682824 +596911134 2894738114 +512519830 911321620 +4248612330 2424686418 +1965682473 2583920014 +1933852067 393021322 +3511050263 2228639618 +2321495741 2430806914 +3203799907 7150812 +819463654 2104244706 +3530188429 3097311730 +456935930 2481944277 +309555200 196694021 +1394226351 2168516472 +3894439052 4144685175 +3496108654 1300745557 +460932420 3007828603 +1447274034 4269711525 +531163788 371648183 +1398485237 1460545025 +3716139467 1023731343 +4023759916 601610583 +3555999205 2390585196 +2845389948 2016255793 +2507997665 885650720 +385504929 3440795488 +4191453459 647072833 +3221134806 332560369 +404399414 2548927626 +667194616 2457240187 +585668170 916512838 2932786930 +703920191 54918162 +3479053610 2603909389 +1603630844 1951026855 +3365579040 3950525797 +2373462419 1193898618 +3816517150 1075528903 +4259398563 4189670438 +3027245487 759938850 +107444715 107444731 +3910448771 3910448787 +3195086905 3195086889 +1823698711 1538752148 +1718882099 2075389274 +77631901 3854907956 +3704901576 363466997 +247237250 3033402037 +1769874191 546386062 +2715704373 101394300 +378260140 705694913 +3991614982 2403732343 +2430108649 2430108665 +635447868 3689053297 +962993010 3451729011 +676254994 1828975533 +3561170859 3501683252 +1928765089 1928765105 +2988843598 2988843614 +94794299 537252594 +4276467288 2119761788 +3150098362 3272389269 +1941137634 1331016701 +1738541264 3212233592 +2726302866 756457653 +3031899592 756500592 +2191414059 3392990370 +2600939151 2605599502 +3216926497 4189870326 +4080695932 4216541233 +2827014234 1748412662 +526627629 4289330251 +3415978130 404157914 +4137490393 1032513084 +3227674434 3101711581 4008922813 +4268023344 2652826696 +2223071549 3437358132 +1383540220 3448818609 +106208998 3711312897 +1692152390 748758191 +4093531100 1206105676 +824534996 1081776447 +175637520 2330879285 +2555022667 140274946 +1837486286 933737551 +3831890409 1972699608 +2775537758 2491683455 +3990141187 3547419888 +3325476408 3108599484 +2381703766 1245719380 +2048631252 3618005177 +2467027031 2527280311 +3137538282 1338443853 +92010676 4207330569 +2733153818 2385568509 +593285024 593285040 +3088212440 3088212424 +3790922270 3531601193 +2260366329 2539895534 +1262081345 3185276518 +9857186 2395387669 +3509716625 3804255824 +3214519994 3384887683 +1481849701 1481849717 +2473069878 1120717830 +1783973103 1051796524 +2879983211 2787226210 +3660726016 2098801939 +962999913 3303515982 +1843704839 2108105988 +86797429 2582559786 +49098035 3462276954 +2833290804 227308505 +4057610505 3280455982 +3215508797 3667454315 +123384556 1893814859 +2671720162 2458084803 +2821093722 2572199203 +940096535 2845392511 +512959916 905500592 +1926851764 3412737800 +3506128624 3952126915 +844689754 2617503915 +517057432 470884429 +1100455876 95453599 +1024489080 1024489064 +2848410024 1447100377 +2200980301 3523643940 +380730940 3329055217 +3308137422 900658521 +1694672532 624613036 +1746869488 4123563441 +1746724453 1249816819 +971508747 860550484 +3480504083 2802574060 +1979486959 2879082030 +3897364897 1381154912 +2117727572 3767870977 +3759918469 3126047925 +1712285274 71180221 +242552181 710295322 +921818082 1622183125 +3823806755 3983032860 +2683891495 4225792630 +3861552134 1528012129 +4131594941 1318144418 +1653484839 1294144292 +78646320 2435002261 +1766021415 3691337846 +694417079 2952879906 +3538272652 1183913377 +4200285821 2595223234 +2353361381 3058846572 +2971349022 3956064041 +328330725 3015278444 +2717665749 3199956088 2419715455 +3141479661 2977151250 +2468921310 2468921294 +4139512163 3361508640 +3672247197 3881422092 +1491687787 1649918818 +505730486 3485422977 +2193867886 1210988857 +1652501588 1652501572 +3649276939 1964340564 +2211559878 1227322017 +3458742190 927966959 +4063924761 3887070671 +3029411530 3029411546 +2703778691 898934570 +960786984 3586001971 +976080804 975036223 +1790878884 507476260 +1650102297 3985692510 +4245129542 2564626750 +3405428715 223439836 +2083731777 3315802454 +15908005 3275117895 +4150899515 3060082148 +858712334 1147816590 +1284503812 2327905775 +3317904445 2507110178 +1138605650 2058942099 +2450726189 3910689156 +2939215713 720348598 +1070787385 2986887848 +2983945164 3361610295 +3155053368 1115711803 +2777807474 382550387 +3839762841 3803112414 +3931763197 3902271810 +2022296589 667627067 +3889313184 1929791085 +1397495682 3849163677 +858764287 4082518895 +304664030 1950094441 +795454644 1465573209 +538123429 588650412 +232790020 1227112323 +765450779 1840383999 +324125763 2897737084 +4013389587 2807067372 +2660365586 1499504702 +770801636 770801652 +1619650588 1619650572 +2657696199 390037715 +2210251568 708444557 +3753851526 3221823713 +2328350942 3573035454 +972729155 2297704752 2291899004 +1058689067 2171351988 +1760361752 1158835405 +1509748093 3766963089 +818562046 3429435593 +3166336529 713546950 +9315723 1791302100 +3720284970 1035899661 +2754626774 1308384487 +1328102457 3605646760 +3997842111 3874428540 +2491543127 2525900738 +170263468 2428604229 +2686091901 4150325515 +1885523442 3716822003 +2546021687 2134344162 +1207347334 3477818081 +1675934638 1675934654 +3443561914 3601576907 +1965308375 2426414122 +2544288059 4135727090 +2865349225 4264654789 +977833892 4034858383 +2631727245 2094745074 +1357692465 1550143059 +3101209742 3101209758 +2939562283 1831564190 +3713734875 1365778628 +2117633489 2214242310 +2317716970 1662936909 +1449786701 1440333874 +972759026 944982501 +4208270907 1929797407 +1429174710 3485243793 +565114710 1550802023 +633077379 2204882534 +4252406623 3162185392 +1248544241 3826090600 +4080156013 1421548485 +183991069 3682759861 +3944627372 3985491906 +1250504165 653218595 +2425279647 802731614 +2437979189 4142262122 +1992610622 1457661290 +4250450720 4071527283 +4005986596 108874665 +2354995245 630286020 +3541696110 3219883814 +2293203279 1798940556 +2852942819 2493148746 +3635944060 2781983025 974778416 +1931170546 637768442 +786009944 786009928 +1684148400 780976157 +2009869529 1869257118 +1473683043 1078470983 +853137618 853137602 +2799934739 4217143191 +445084517 674932730 +654810440 3103561821 +4255076245 2751948449 +2445225179 1257479378 +365715162 716788011 +3271335428 770880239 +2096121651 3779073356 +3922764693 3031568954 +2466053599 2466053583 +3503318998 2106759419 +2078434050 123853877 +2019982696 3116366723 +2095089788 2937785905 +2485903830 907947882 +2255754362 3109193045 +2059129541 2588396457 +1798839357 106198036 +736286264 1310145083 +2560109241 4035658046 +2532252588 1157935164 +1125415936 2571056133 +60116320 67685925 +2032763051 1058641756 +83462275 1473373738 +210755238 1820032833 +433116109 1891462052 +3722035806 2613901801 +1086635956 2847524943 +1366103433 3208433822 +2208633009 319436630 +2370144384 3832930693 +137709456 67645763 +2059811649 2314801639 +254616886 279709462 +3095202284 3836755196 +1412564194 1824370645 +722165384 1256574987 +101594106 2187055773 +2953432209 1363121239 +893817411 2502684720 +48294035 54228758 +244645192 244645208 +394653622 1654134145 +901737817 1498564670 +2189014124 3958222972 +345122714 2564211402 +381828727 2106647593 +924062286 43569359 +3390778598 247967255 +1091756904 3975077269 +165438558 3824287743 +1025097087 2282615745 +4215328304 3070530947 +126846318 1424952377 +2406524340 3776182412 +3781133994 1270133175 +1225732426 1290442605 +2786798617 2720733570 +1927820684 4208634295 +827536769 3988857511 +3809074622 3809074606 +3780190150 3153488903 +3647120633 3647120617 +570910880 570910896 +3647907749 3996248236 +645894937 3017052254 +2926351016 1022025323 +2405142054 2405142070 +4110221206 809910241 4110221190 +655626645 429370780 160928844 +2862799971 23130076 127506247 +2904995623 2876747044 +233084318 1179300286 +3700345723 2949272237 +1721074145 3220800518 +1205906738 1487971749 +1065831008 1638877499 +3135248068 3008018863 +1118407138 3538161347 3221437674 +1497910543 2614185614 +475049029 2696512124 +1193060975 2914240156 +2730743032 843596397 +372542400 3265714572 +3959071930 898715851 +3902179225 3187111368 +2583496907 877975426 +1584975413 3979124074 +2129960489 68483726 +271234115 3057239402 +837416757 3360696444 +3636456502 1052091927 +708852366 2119940111 +2920136745 681934990 +1656307533 4257723265 +1776495968 2459220279 +296089530 2185558493 296089514 +394306438 566031825 +2769195327 351184446 +3216017486 1777933273 +3778568535 3804314617 +3142755290 3618575285 +2397922742 3048676753 +1200514124 4045923255 +2986566148 1062423625 +2250975589 2599561715 +1048814166 3208154481 +1473651925 4144797050 +3254961499 3065638248 +2287802628 321070575 +3341605118 2308544457 +600948019 3029789879 +3393508286 676942857 +841070549 3222561866 +1467136400 966401461 +4013232011 4013232027 +3075332448 4019008037 +2431169243 1063501448 +274175557 3608378493 +1584385451 70573528 +505110598 3078312241 +2355557557 1419858837 +3389299069 3389299053 +3674068760 3583613645 +1932998384 1340832707 +3196867876 3586715355 +4134343289 729563742 +1444197541 664297388 +4205074684 2360874161 +514740591 387967533 2644488122 +4254551156 4254551140 +2772739230 2283362370 +3093218766 1646904106 +2322113601 1114808093 +1747665510 19847525 +488786981 33414700 +2568792873 1205044607 +2661514704 3684942397 +1268441921 1171504960 +355222144 1356353115 +447945183 2479733279 +616433294 2749469512 +2577902936 989192580 +3192676262 943362647 +1422343767 260837802 +2528524622 2396796367 +3168376722 3700005587 +323287735 3778282274 +508816133 3273324762 +3775564920 3147505915 +1460510113 1460510129 +587402711 4107192678 +3861490515 3999455191 +1351599776 3789602668 +606408693 3679985340 +2381808216 1146251175 +1948926812 981993927 +3219859284 2346263721 +3396051236 3413027775 +3681246487 1217666196 +3393187003 497134180 +2198614322 2117169587 +3645533759 1328254270 +2725530199 336660198 +2244704506 3809459651 +498961531 1281631652 +3318977100 1628910711 +2056929405 2111014100 +1904123698 3696532403 +1444942971 2246622674 +3286499255 384535814 +2934012430 1525883919 +1258062044 3883850321 +538333420 490529846 +178805713 2550696454 +1437366777 1120974302 +555408477 2051597940 +2771256117 1013910652 +1951380764 1951380748 +511812975 1964469688 +3726610934 3726610918 +3583656511 2161527102 +67208178 2148925310 +2532936709 1852524163 +3413338612 2075965512 +923065918 3668564873 +695543728 4084038147 +2238093199 2407568920 +790471056 440790012 3148174773 +2769917786 2769917770 +3243927139 3836031312 +3531879613 589235586 +4067798980 1933816201 +1012627162 766568577 +379896567 2623466192 +613350368 1830191532 +2667184833 76699072 +282398801 3496521606 +941130686 211248159 +557628036 2780529092 +964007644 1068327910 +993985263 858889774 +2697375313 103947766 +2399031290 2438982851 +515254101 1327406074 +463012962 3554797141 +2853694820 665498751 +1325163359 3295786725 3934426207 +4114013062 4181505039 1874672458 +2408652338 863144101 +3619356271 432454140 +2103266415 3925682363 +3973466016 1968357605 +3388288088 1156894363 +1697522147 715085898 +157034983 4112720986 +1420238065 873631600 +3026612702 2902755327 +100832971 100832987 +892572813 892572829 +2920765051 2025790270 +1281047574 2605611892 +3957719341 963930390 +215626500 1065242463 +2293297315 3515535508 +2114311660 808401931 +1513871155 2965142861 +2864132019 1902122700 +921570461 3054998256 +3534653761 1367879235 +1544633135 505424622 +1425740155 1111262372 +1527089022 3350481737 +3933097023 2769372138 +1307337165 2015229348 +2873581864 3378377213 +949738822 1667061047 +1138722857 2263115662 +956879793 2313368150 +3592652691 2807344640 +3019559937 1423687040 +2093558544 2158938677 +818718660 2519472521 +4271184316 3584773868 +3596563543 3470746873 +2238182643 4121336474 +1092913153 1657689428 +2404314097 2319281274 +783982993 783982977 +2377672702 390837449 +459809114 900225593 +644732734 3169441417 +3154682296 3113653421 +485731018 3093084103 +2258713119 248413896 +1447720349 1949771298 +4270055986 1799853531 +3742078037 1949991388 +53583667 975019333 +3952704018 4103809619 +3808634641 3675119048 +2638633918 1405250569 +667021244 1380738279 +1630657080 964331053 +648267090 634363909 +3929400439 701933392 +1734880669 1711263275 +3046425211 1043072863 +497420313 3311320926 +3983463467 4034396084 +3269095392 2648579507 +3667094940 3105063308 +533132125 1438134937 +1706525868 3420838593 +885239059 587822330 +3524018918 1427691670 +1567136550 833371329 +516581179 4236500690 +2582092931 3399180842 +525955917 4208795172 +2120502892 2240753887 +981967626 763734203 +1282604348 2500109688 +915986388 1344996460 +2210044027 3653110194 +2144207732 2773446543 +1655550407 510581833 +3007367668 587066137 +3294036958 4483561 +1389800854 4260578097 +1598427316 2941012825 +1150403292 3244146576 +2434603750 1456560151 1456560129 +130583550 3451088817 +1981139583 1666041342 +2403813126 3567983712 121579118 2261532616 +1852914000 742209763 +3000815053 1587018148 +1062268961 1340356090 +1706538838 1983224945 +2910654250 416888722 +2632133868 3852449665 +1181744797 2135806242 +91968876 3055778945 +3301359834 337026121 +3885181642 410220486 +3487287679 3053335272 +4279305555 439009750 +1769956411 1871485680 +1073492157 1541128344 +966965429 966965413 +2720954126 2967963791 +156731988 147767856 +3862606732 2545704435 +2179164085 771506684 +2928655707 658970180 +1723314298 757780491 +1184387384 1506269997 +2641347909 468945818 +569741349 2593253932 +1282956991 545072808 +2077489595 2847023460 +2655464369 3674851248 +2086514799 3983794241 +2241520873 1003903694 +141041057 3706102880 +956773695 89707070 +3169443604 1183282963 +131995133 3786536361 +2602794690 1383820509 +440331961 440331945 +3188601036 3188601052 +3895527603 3895527587 +952414998 1671811681 +4050426 175659886 +2250190083 638835626 +2539852858 3577097110 +1735612513 999563424 +3540446574 182046653 +496111942 3539022113 +346334444 1798283137 +2051107958 3942497735 +463545015 2316331811 +1798457247 177392417 +2660528252 531436337 +1635594731 4240993375 +319432969 1722484255 +526691975 1032184708 +1561801646 2105615929 +414777962 215776453 +903762887 2006222134 +997496171 59193204 +587667902 2665427351 +1794466131 3007854010 +4148232222 3706937385 +2476333318 1630577761 +2519393635 3318822237 +3617284054 1066917351 +425389375 690190910 +1550256839 1026946902 +1074163553 2759457700 +1653971414 125905895 +2243560317 13860308 +135852913 2854947372 +2245289647 2245289663 +4132722245 4132722261 +946701459 1734849388 +2469180066 1365062915 +2756767645 1214854178 +1106597126 3677673569 +923548812 2801240225 +4080567639 2707955395 +3743800694 3197870279 +2290658535 3935014649 +2328358579 733791180 +3851615187 3851615171 +1002889878 1002889862 +3129602070 1865025523 +3359006989 983222116 +629877099 2232562536 +782267116 2171311639 +2636458447 813748430 +3026982345 3635979603 +2505441876 3070949311 +2233567542 2855722300 +1488172177 870662214 +3865786691 3770007985 +3358747135 3425630122 +3938349432 30187515 +3111529611 2148015810 +1425980906 3070555981 +318172108 2419976695 +880177008 2039422173 +3939248560 572258725 3995896114 +1918435962 3075294749 +3552414536 2606907997 +642546809 3278369384 +3596853636 699417704 1105076857 +3424016846 2828208462 +615953802 1436534843 +1279578157 1832373096 +2893300255 2583959240 +911491841 2275768982 +6336746 6336762 +1964283711 1409548058 +3147596503 778172528 +656172086 3350315271 +3635806205 514808657 +1581073590 275982993 +1438439876 579262928 +1999861319 1839377945 +3375685981 457098612 +1100126386 1749648174 +3042733109 3044956010 +3298516435 1402254124 +2417249867 452411412 +3560963085 1987484088 +2378802002 2255231507 +1537545212 975733982 +1843982723 2293510460 +2957478596 1151300255 +801695818 2202381435 +1181729686 2012276017 +3472882814 2538513310 +661955987 2946541164 +3971774212 2964282185 +980379178 1647286481 +2589759141 370041802 +1408002981 1737408733 +138877397 337842796 +3236160216 2302866517 +3916956761 905852713 +1118974826 1753673691 +1096678111 3320966430 +485752757 1226541564 +278352455 416584576 +3683722286 3548116079 +1442216603 540010526 +484720447 3125776446 +1516438725 249594394 +1453398347 2862272797 +2061070190 975513583 +828072381 1876614292 +481307314 1996378701 +1433746758 3970038633 4254804681 +452964259 2161687687 +138491166 875895337 +316764694 3471218855 +3395470444 91960855 +3599329144 843964923 +3927252451 61699280 +3849121568 1249668965 +3761380617 4158895416 +4111915808 4076532581 +1900624401 1732667600 +214549735 1998050196 +2472581536 2702300901 +2667179219 2047127284 +3842714303 3842714287 +3793134956 1436969239 +1723242450 2205220755 +706293857 2795972790 +1886001564 2466664593 +2278412454 2278412470 +1049114931 2559035575 +2803369293 1473271858 +512179976 2895295028 384317853 +2759355089 4090409239 +4147904483 376689226 +4158813604 3716100393 +432453320 1540472029 +3387409643 1384799906 +3817454982 2489446499 +2662957877 218277449 +128353543 2378161668 +1549072093 918592994 +2838067494 1917433559 +3289943427 2911401764 +3244579319 1744412624 +2060215942 3586483447 +3541559407 3181569720 +2624149842 2479309894 +1722741945 1584086846 3654583196 +3201919858 3796116595 +3605891346 1777256275 +2387564460 3001484225 +2747795238 4192420033 +1805429724 1134725959 +2361305057 1898071871 +361615190 1144874087 +163181709 3703306738 +1079007368 3329973789 +1585008018 3537657901 +3815741657 3786251671 +660872474 4160251190 +4052065065 1582514584 +1893169493 4164157640 +1815176710 1472437111 +2175579683 1172486410 +2848289053 3063637641 +4279926732 4279926748 +919786419 286856726 +278934982 4063536823 +16474430 1682340642 +3103626777 2663153406 +1113623195 1470484695 +3479417622 2415061937 +4039307254 4175413319 +304589195 527427010 +426174362 2533267325 +2492846034 111673640 +810177447 2885791734 +2982855643 2587277215 +46208136 3723711005 +3038520847 709880216 +325644306 1742547262 +1707076572 153111367 +1905853691 232358409 3541609918 +4050519405 2828018642 +492252202 1645608678 +1166754025 1591489761 +1732185447 1732185463 +3498031550 4145112585 +3604281675 2948463676 +1859928593 1988446336 1058080860 1489935533 +2507476455 3750431347 +1555999089 1898233072 +4034838088 3750071133 +2274071385 2850606024 +1380556013 936658770 +2162373662 88257577 +184857915 4072830952 +2078739126 3266698375 +3480185801 1432792440 +3789858802 2159055774 +1967663781 3424493411 +980782882 3020571265 +1002788299 3309333195 +3701574813 4015020852 +1228518248 2916445355 +2618756785 2618756769 +3680057925 1791628099 +4092295615 3132139454 +3821828403 3821828387 +2933990381 3216563636 905782768 3636577976 +3065466312 2390315212 +3993278152 4067978264 +207774782 3169045897 +3333365824 95405253 +991302446 304311410 +171264653 63661849 +1974126548 2867788095 +2933245940 1541490271 +4260501985 627301392 +524223643 3879781960 +681635652 1334871608 +4158626550 687262666 +2386389280 179076467 +3841964270 1821384377 +1193060983 489729611 +2875505768 932485053 +4007308401 4007308385 +1038240454 4162872534 +2198275018 235599597 +3179463488 2497273299 +1728798776 1860728891 +1578716329 3402870296 +729606546 3557690918 +1016315553 1016315569 +1174935282 2904865700 +1759275889 2214404848 +1649503486 3291386847 +2865490814 2865490798 +3248307836 1183407399 +2431015975 384433317 3014941234 +3627517285 3295084026 +2483129467 2037392804 +1795449102 3592979097 +367061657 168906463 +1075454376 34543530 +2483905115 1813108050 +3507333219 3507333235 +100898985 547967502 +3964747284 370145663 +3500422179 3500422195 +3966592904 3090807581 +1660579341 3057864036 +3287453226 539873116 +1603733755 2014997423 +3428389615 2671300152 +3727493539 3727493555 +3560674578 734767941 +4097531777 4097531793 +1882834792 1937899702 +1877300936 2474444810 +2236865462 2567102353 +1484779845 123930581 +3570294043 2598183930 +1572812985 2779077456 +1654717372 3307218323 +1890425051 1011327172 +3712086253 1003373842 +1037781592 3090548891 +857637491 3959905050 +436142429 1232020834 +2668537443 125682147 +3826150945 3413980406 +2219735756 327896887 +2014291352 2474992435 +2531902351 553572888 +4029140831 602722807 +2265051298 705548053 +3584690888 581892299 +2047583006 1045547071 +398752707 1028582714 398752723 760140778 +1427630764 2695261377 +1348556088 1348556072 +2495502702 2510735407 +3022860242 2339317721 66502478 +3969166070 1678319953 +1509021212 4006452598 +93706911 1776756808 +324166655 1773365864 +832590628 4133558436 +1717965709 3216033522 +49828962 250402371 +801803985 215929616 +506959875 2491698346 +3404608747 415352158 +866385379 774417500 +563124266 304505398 +1401060527 1649313848 +2263230762 2548112870 +1393819757 897362820 +3669992513 2628751936 +109982175 2687920066 +1353449255 3513922852 +16331299 2873748746 +966771067 2360409640 3097508745 +3582806000 139808153 1263758691 +3301188557 2378455972 +2548242317 2810057444 +1177592394 3364846203 +1274856088 921064781 +1679366730 3716440685 +454721891 2321807420 1343733877 +3191406162 1614246350 +2324906703 1054541083 +3541785002 2336671250 +3655309953 2080389398 +3862183992 3862183976 +1203452148 3753551897 +2291689357 2498429668 +187730015 3785569128 +4043040697 361613374 +2212858063 1901485528 +356183189 171897623 +580583161 1929339390 +2298117315 1972121494 +2619868514 889223509 +1898542145 3102320410 +778649785 544581557 +3950429190 2985727351 +1516906384 3843835811 +3876814783 1784572360 +650638336 214244371 +659276089 865693470 +633004635 3224524114 +350183622 3993774544 776541457 +4211085780 2486063913 +2417596283 1397323428 +3358179817 475764558 +3086758991 3304919692 +4238492771 2184634741 +1881313066 2959564571 +2715368925 2784781044 +69210415 280324716 +1914728168 2465730231 +1448957659 3488594628 +283389239 781238256 +1328051741 3115446178 +4290394031 1361428926 4290394047 +2772733881 3824042046 +2522845696 3094533657 +749712026 4069927019 +1036963800 2442142864 +2260205368 1115916978 +2986570843 2986570827 +240097706 976553477 +2091837338 3780548477 +3000254387 924862156 +698047758 3306664210 +3932921217 2288579094 +1356106299 1401086734 +1754862301 2247668194 +2382642737 3249399600 +3537973813 763496810 +3291282286 3085106676 +2691784864 846928883 +1004472644 2216400384 +1678311150 1747538105 +72306282 3316365395 +799677820 3505567728 +748058313 4192009838 +3045495486 4103914441 +3519850705 372097286 +1891283544 1891283528 +839306570 179645307 +2208347330 3314717405 +1903181182 296799583 +245894554 2894948715 +1230649530 856116427 +1545783775 1545783759 +568172715 4209241378 +4094568964 910959689 +2718019943 1873429792 +4245191266 3579846031 +1316419406 4259364562 +899243215 795679182 +4222948462 4234036532 238434973 +1274841723 428736434 +2166127354 2520616899 +2662434476 2662434492 +1047759006 172106818 +3734430426 1099373867 +3415792426 2879456013 +754190061 1867845083 +3963473832 2370692477 +251300701 1383606955 +912195620 3146594495 +458565568 3339555653 +218146687 3373609276 +119182210 70676363 +1997938535 3738398496 +2341920685 1803689298 +2048049777 2626164720 +3522972176 3964577320 +3840005258 2717772773 +3231508138 3432749829 +3992154714 4030530493 +1957387846 4022691873 +860789918 1656786089 +3560208671 2457627595 +286623446 3135455975 +3708829867 2878721314 +2944875451 216205170 +3025808095 1546113931 +2016683059 67709856 +4045360082 2543596407 +1094444563 628830998 +955915990 2549393847 +1468344418 681480771 +1349151927 1317610502 +2179305935 1264879822 +3545260825 3230400584 +3704185810 1648907705 514308291 +1567370917 3058527660 +2691481115 2788115588 +2412900787 444562636 +132974048 2244227259 +2130170146 35534997 +1031082542 3981155961 +313190269 3758778836 +2370689939 2612601344 +2253268432 1023772259 +508880177 4037332006 +1869171155 1743974957 +431469777 2468795654 +3405923793 3990241654 +756805278 1474954428 +4243122375 3919999318 +874387535 1516258382 +4047452035 4047452051 +2537899712 3792592965 +2272489105 3417771590 +3096514850 2925394051 +1329890542 3067953849 +3659899574 1297903014 +1069537673 1069537689 +2916132418 3478364235 +3986624831 1349002792 +873046887 2728098989 +3422719331 2332332764 +292542739 292542723 +1267884859 727139622 +753074120 1901635549 +3978835534 2756541657 +4099386817 4099386833 +68491520 4052830427 +3008237081 1558196552 +2838022255 3609007035 +2940690807 1683910214 +3156754192 2279069804 +1198287967 3467549064 +3915420032 3857888603 +2478173869 879147602 +525545163 452110740 +603794555 1507417797 +1203096126 2322329197 +1008892367 2034614478 +1000993522 1319125859 +3894162612 409401167 +756403185 3931114598 +2026941936 74975624 22789963 +546719076 387420838 +4086821561 2775624117 +1485390442 3390278875 +4223910733 2113389746 +1396414764 2888692924 +774587645 2870843970 +2375558885 3137609548 +4171353425 3082172047 +4008054914 2519465141 +3524174211 805847338 +3628452810 1071632123 +3904536974 3904536990 +4016469136 1465215267 +3724322967 3990456994 +147837052 147837036 +2988434510 3056887503 +2075075997 1371026978 +838451606 1110163239 +2239441147 467764004 +3569858378 1080396155 +3731896599 3731896583 +2289187793 3892193142 +2952427988 3679307961 +1614484913 771958192 +2851690616 291406084 +201635528 3010182347 +3310053451 3577188299 +80832731 494809211 +1449538145 1675710112 +882654153 2599558520 +1099774680 360966051 +1540910735 615910158 +1875662762 619377669 +4015648569 1757259311 +3769892274 1428020557 +1636650501 1683692675 +3055056715 4085500692 +181279618 3330290446 +3423415577 1371405918 +1284660169 2509120607 +2542228945 1527519238 +2719586247 1667370692 +577870757 357125516 +2057391636 2613078894 +3366573980 3366573964 +133843527 3590516182 +1654571742 2528623277 +2373973022 2373973006 +1516221087 3819319368 +3697033123 1860265891 +3066000606 351585001 +1777476823 2670722672 +2571495035 2889211077 +771818003 1572515053 +2791568053 3129880548 +2293414878 2669415880 +1718882109 2243165460 +2169933246 1497440777 +1752782254 821368878 +4248883977 3275414905 +2387477056 302230776 +1765498940 3833101937 +2955050551 2102177926 +1805061182 2630370719 +1425140378 1425140362 +304031139 705183644 +482325062 2277876798 +2778183570 1557785870 +2625509982 1239544830 +4079743860 3337885580 +1622425992 3284347156 +2038848656 1032573236 +305581005 2034422692 +2412077878 3167565044 +1335397020 3911332760 +3630423038 2738049225 +994405319 357083734 +3244065565 2174903988 +1809364061 589557346 +3446689606 3496208273 +929303925 1124931676 +462538657 462538673 +2705133801 3156319960 +1340728720 1563713980 +3510141209 1962097246 +126312828 3270774577 +3853135503 3743102668 +1740054430 3458036248 +3714965477 2029483386 +3179442097 89510832 +2415253931 367832021 +304958910 1532060191 +135636815 2788900250 +1742560344 3850164197 +1847228711 2058139744 +829655429 603374013 +245219795 3579322170 +2749713029 3432573610 +1309375420 1966372907 +2289213798 846467969 +1929970806 1929970790 +4029058436 496952457 +1530476479 1511178664 +189120932 982975152 +3084438041 2202412382 +4221759730 3903082709 +1618873890 3417570109 +3660347955 870345556 +672807691 788984282 +3049659491 4250546502 +2249178879 164211560 +1652732962 2665531886 +581758893 931187449 +1850152895 1491755432 +1969217038 3555364879 +3179491961 3465049192 +3102882642 2427219741 +3681825568 2745223060 +1088003501 3281205083 +3281205083 1002447949 +4086005330 2716119769 +2790740999 2431309799 +991055507 1595556326 +2815789112 4277114564 +2859560146 4043313782 +3936572889 941630622 +3315396276 3389769049 +2908969803 1389900911 +2935130686 2765637449 +1835476369 3395298118 +3547341628 361199473 +1849194908 518484103 +460766061 2833845380 +614818986 1516074893 +2143712439 253446703 +1920723027 1920723011 +3381094614 3381094598 +2625705545 2822116590 +2908117306 418281035 +1392154915 1392154931 +4100348430 3407856665 +3522060478 943868681 +3815511893 1479064266 +4286285064 930245524 +2754628464 3892756821 +1786191144 675609820 +4148948526 4068197574 +1094099527 1761300787 +1999260304 3456058520 +2952195970 2210072995 +2222016117 871604236 +1366919145 4268739928 +2880502812 1671225373 +740978695 2379111168 +1763779538 1361798035 +3499403165 4144225314 +3413628397 983942148 +3659471266 16079381 +32201591 2088827984 +3310531801 2050142622 +416198349 2131090555 +3172850943 3172850927 +2411524491 2276545710 3996273269 +3680333912 2887244429 +736195238 3118955329 +1317307540 782021871 +3857448922 510513077 +3151749387 2849714639 +48639635 4126946925 +2841787577 1587910462 +2982626768 2982626752 +2602297254 3538790999 +1454763487 1600484894 +3352682189 3352682205 +375758783 16415166 +301167861 2776740493 927014314 +2718771201 464910720 +2809901759 1723491006 +962285587 2378547722 +73666064 4186055477 +2263827963 2275104581 +1677854355 3726427392 +2054410756 2197524909 +3214333772 3866422455 +1978399170 1685728355 +1023030061 719228868 +3839424873 3484179150 +2938803004 1030383062 +2743849695 1411183902 +1751214275 2400111143 +241381935 2873766737 +1000746732 207467009 +2516040175 3040426129 +331879745 1694070080 +3153074853 2147086778 +521581946 3372857117 +1323818133 3422568092 +745213893 2978599692 +1698263893 2926612170 +2271660322 1221501077 +3969170650 1210403645 +2717327550 3054013215 +1373134535 2661102400 +1211960979 4028374154 +1042819852 3845899233 +3604451134 1935048329 +511554631 1189268416 +2432152092 1374511623 +1905761997 2662268068 +3997531825 524506454 +1431742798 2775352793 +4126996478 993682633 +1190839581 3653520546 +575605367 2037217606 +4199748202 2673947558 +175266637 175266653 +1981758270 75948127 +1875410843 2476794130 +783919626 2554768827 +2333094079 2843524286 +3915812701 3379801972 +1786271751 2725417750 +654844861 785400468 +173225395 4093479116 +3249048188 974643239 +2499037767 3281055190 +2496616705 1130962048 +691777547 4092993876 +3720819836 3014629937 +240197345 784263440 +4134994371 4063536509 +3370857859 3443866940 +3958175243 1896305492 +738335716 726788073 +1929267384 1063488339 +4183103173 1791045209 +177416558 329922607 +1684441572 4102894041 +3013148271 81738156 +3829019866 564212523 +3779906894 3779906910 +2877237106 668433690 1797986419 +579218753 1365964775 +4252119952 2650345320 +3417392406 1779958570 +4015797853 4238437723 +1408787432 223187476 +106261647 2272912654 +3365797517 1572321252 +4010145875 2573593274 +3719129598 4127054559 +582584165 252716012 +376487994 156137237 +358492319 1111093832 +2111461011 2981513580 +1872911704 4190388467 +3354410892 1261701495 +1857275985 3084244494 2516866959 +1161393593 2993967656 +1380198917 2253268428 +1843904166 2849054551 +344747989 3482276401 +2270607235 224039680 +2506833713 746342870 +2403818172 1230231025 +3933488246 1980298314 +794691895 1266256911 +1967212492 1640236584 +2779866717 860103796 +2288045265 2288045249 +1008462864 856914539 +2917402950 2055156103 +2469649417 4111172533 +2351354396 3510997924 +3649562427 2884698596 +1663534614 2635865756 3527965845 +50811501 1372793775 +2441119199 3964845598 +1446998275 3370051516 +376370072 3903420507 +2565601741 2289712562 +310779529 2988577208 +2284858049 617827776 +3212195349 2081891100 +1602028408 3385619949 +1616975418 4074110301 +190449206 1267900946 +2814069085 3417056332 +2238459266 2336990115 +3416347139 2448693930 +33045862 3346986148 +3693518673 3176013848 +2573371113 1595564238 +2714155019 3067328834 +3722058125 2642567867 +1826366579 3515703564 +3250610532 1708740735 +2725692166 3337945697 +1289342916 1289342932 +360173907 4092798125 +3487744477 519515892 +1037802666 2114996033 +1159922703 3844039566 +2925049834 3917254890 +3095609419 3248371220 +2064177188 2064177204 +4188186346 4188186362 +3787548274 3581166949 +1523331333 2406755958 +2703080259 3669560650 +2577890470 2036679655 +3419918207 3781463594 +3849667486 1236114202 +2689960948 2266115476 +2926591020 3333339479 +3489449531 4157475901 +3588452949 3588452933 168623068 +581290605 4132565202 +223385715 1759509772 +4237506511 354330042 +3741245058 2369275573 +791217352 3746321174 +3673361751 2713315028 +4040249520 3380741397 +2358939699 2320564314 +1451230015 3616232188 +3070173819 3025846297 +3816734321 3234380165 +2729338627 462170538 462170556 +3606515444 687640212 +1349973296 3238230155 +2443340192 3241387421 +1177787411 1890719360 +700996 701012 +2534342379 3080408052 +3639104878 3017637359 +3774666304 24627448 +2014954966 3868356593 +1307350953 1416806168 +1952692179 200958252 +3109356096 3993415780 +640568630 4196038162 +1205104080 3815300725 +3783190044 2185071492 +1795152276 79922169 +1734583 3769267472 +1354471222 2420150054 3127691543 +2080021276 1199713543 +458781865 3040847384 +232431831 302020919 +4137055372 4137055388 +2521298913 1214769680 +3963249167 4008205710 +4191242773 3756336435 +1274438789 434126170 +3684830364 2377219921 +2017586347 4207382818 +1073174251 2640172002 +3424371319 896800561 +4213016982 1859842679 +395348074 2189868763 +2043750019 1195352124 +2935483295 1446470218 +3052510178 1297638595 +2509365863 4052285586 +4042043619 2945806945 +1484710415 1484710431 +1149011332 1409691359 +1891931500 4051122455 +2648378748 4225120807 +837168740 4049274729 +4088864593 2192209632 +2314046263 1475487632 +3502022117 2112655226 +193272225 1141916112 +2043971231 1754262622 +2452971832 1990822325 +2898890584 1498195867 +1163680862 2389010409 +2794575020 193085620 +304278865 3724252806 +2609442266 2609442250 +3088975554 2920102697 +2700913902 619209070 +2834780646 712692004 +2960630116 2960630132 +2746787125 2746787109 +213145742 2380752793 +1813382318 3567869433 +1690133454 1917315532 +187762062 3686892024 +2107772493 1206028196 +39756952 1392319323 +2735782422 2545342199 +3010686289 3484751504 +3000310309 2860001324 +443793749 524731898 +3545520037 1388705964 +10769517 1873864594 +3292495531 2599708450 +246509976 3109409371 +3454515353 2893247880 +2875240608 2232727917 +4005530696 49996131 +3551047547 3620117567 +246989649 2793323254 +1338883158 4141841265 +113765649 3183096272 +2185675922 1524117293 +572811609 1446235535 +3532386971 223275538 +1453721115 2419269098 +2250459423 1217141704 +741321535 3456799806 +1556873563 2003188009 +2185131223 3746688624 +1787039457 2397269046 +881881733 1147422540 +3456475136 1390075923 +2248711064 3603922915 +450373458 2487608851 +1158276949 60238556 +4073020241 1612255968 +1566641501 1894171989 +4229969757 1136076642 +3664332398 3052214676 +2281232247 1267382057 +1297691368 673324022 +3105672660 1012401337 +388114473 1473651839 +1347209588 1332208584 +2715953797 1007733437 +2369291690 389399493 +3864124542 282991199 +1467464455 3095096342 +764248574 3015942879 +1423815036 352216625 +3835783226 3835783210 +2073928970 2737491643 +2000006592 1770030419 +2944225933 3477664763 +210567843 1694181020 +1549094116 1044908799 +3309262991 2860299111 +4040423715 2696020103 +1099338801 1473988912 +3961000662 2145756913 +2635902968 1277756269 +3226292025 4071863976 +1514677516 731009527 +3635724818 915243589 +53983736 146391419 +2646283237 4022468297 +1905354855 4130529395 +3423301293 4090451777 +116349292 813302226 +2385266273 1534400058 +3973357265 3112614954 +921018907 2256416914 +2900582958 1475579503 +1343675499 2130508898 +467942787 2021418685 +2748454889 2055512511 +4200856209 3160633926 +2132901801 3387803793 +2619208933 835226652 +10129153 3179836893 +1152026642 712258643 +105441959 2345231584 +1701711922 1591276707 +4059770422 610909969 +734745547 3155486850 +3577090433 2206641318 +2327880547 3582582621 +2811656262 400512545 +2781043965 2526614392 +3266810480 4143679061 +2321103684 242764809 +1438967327 603341534 +1950849007 4222889272 +197379918 1206121177 +1944329606 3539188730 +2579830081 1379956032 +4090763097 2094006825 +258567817 3338511609 +2430024674 127226334 +1770651210 1849380461 +3694016447 1539424702 +1973496249 3853823550 +3514259420 3514259404 +2576616694 2576616678 +1563136217 2224358814 +123713036 2813039863 +1919276375 1833883632 +845954914 1881822638 +1055137438 2669425321 +642865166 642865182 +442414228 387335407 +780693153 684378843 +1492139515 4247884324 +2774125213 1310290929 +164264825 3804258152 +2236798644 1611354702 +603446459 1513126500 +1199696911 1273425996 +2296932834 1183653117 +3608398215 615258623 +787662089 4046204206 +579872008 1894402955 +3343857805 3666566116 +195773733 2208160044 +2910843977 1768787704 +1312567792 415407317 +3928513187 1082568348 +3636775216 1841870467 +1075053071 4001316248 +765371356 2897998673 +2706816795 115164382 +1944859749 3788929772 +1407211052 3650638374 +4238759265 450389942 +861551025 2882216740 +1681156947 3728727755 +1930553275 1329409640 +646198965 1461853922 +3215471404 3788017239 +4090685317 1510110810 +2235783946 1794130349 +367716749 2898326770 +983246802 339718035 +1691761265 3046759773 +806644604 740635687 +3636032896 2884892805 +210716687 876194892 +1805856867 3111044142 +3287537205 3044407688 +2307996714 3885145357 +4253204722 3044569741 +1179542726 1936237473 +1528348587 282338859 +2653737413 3314432282 +2809722979 107938780 +1473689466 3251013994 +2831422329 631940968 +1228852218 3389733230 +377306818 3290389974 +3010266001 94149958 +2168255224 261173384 +4033590341 3196897420 +444192993 202848589 +823435062 2037817863 +3179541125 833404391 +2493664017 3745673508 +3065448264 3927995997 +4285899081 4285899097 +1974476603 1126235269 1635305170 +1726287269 2677308076 +4218331037 4023599051 +3433561083 661761074 +3031964191 2771612892 +2634072359 145344307 +1497283676 3653403847 +2240886033 4009419446 +2044943125 2044943109 +1568681074 2730882917 +279224961 3022770432 +968789204 3136795055 +3286943166 680872478 +2788503501 1924808626 +4209666895 1309076814 +3524968492 4175810625 +848689485 2660729621 +4124343763 3498185516 +3090650030 2910681849 +413825973 690661065 +1254499696 1644909804 +2149946770 1294628037 +1284871286 1678125142 91796935 +2890987610 2641819069 +4277799319 961405776 +1037070534 354518974 +1641943145 3385323327 +1525123220 2927362287 +4064217154 2604269539 +3114765294 817973167 +3286044551 3690951040 +1669466867 1912395050 +1199611715 1199611731 +3939735100 3876946023 +1593028461 3869059204 +3479999666 1315222293 +3551041295 1097190542 +1613196525 1259370756 +810991617 278427779 +521390408 1956243043 +3696267355 3441356587 +132986128 2322237475 185532392 +3011632304 1708094040 +2642867404 463182583 +3510493416 1281953085 +2890365581 2547150322 +1866389473 1647947705 +697418060 3161672375 +2125152908 3691839137 +3957571088 1276388072 +2816613168 2816613152 +2973117533 2719382612 +2199930731 2652654991 +3317772812 1528940769 +1163463810 1132466314 +4024768577 3869584960 +3469134848 3469134864 +3817181502 3817181486 +1279783631 769078540 +3123513200 2689790881 +54298316 3829936951 +2534849268 3435679237 +1948935920 3468692437 +3690922738 1148297971 +3522096335 2570204134 +668705260 967755004 +3106195895 816179746 +3124408670 2991951149 +3181814572 3109215831 +108094632 3431036011 +3521475051 1462916322 2483620377 943438862 +195573759 1490036350 +307914002 4132248389 +2539983913 2099166360 +1822472225 2129478726 +276623457 276623473 +3876915584 3861376332 +1219108307 919401260 +4252656740 1806436735 +2437105445 3521707820 +1818760891 1658570866 +2673049911 125069702 +1575598199 4239611619 +2047439807 3420527726 2047439791 +3219054114 769109909 +1905627979 695662674 +2672556320 1109554683 +3119588125 3550103202 +1245066210 1908338658 +3349408291 3349408307 +1677156622 1819134223 +837036792 837036776 +1936044242 1436390765 +1262913997 1262914013 +1297972666 240623788 1072819927 +645495092 2566680014 +4124783941 1293212570 +1750626258 115005054 +4185129936 252222242 +2700744639 666640284 +1107057416 1056124469 +3963836016 846316887 +1824280430 1324550137 +2718434315 496917826 +3960117011 389508290 +1606910624 1729274341 +3389799092 3714438920 +1086598193 634491174 +2931894132 2383485839 +3696324784 3261284953 +1882776413 3211370025 +576983317 106494906 +2881488475 3125412164 +3781175764 2657212601 +980166337 1212125287 +2075178093 1324114523 +2197940855 3003390278 +4241717104 1894057301 +3097306073 2019520136 +1917038348 1111916343 +3711560915 355455020 +1504077050 1501034155 +1126350851 1985022436 +3990925690 4072104715 +2564011698 274481041 +1053096077 2002197490 +1307827600 2580798824 +3551564499 301408826 +2370131107 119815324 +2955974767 3414161070 +198385149 987485922 +3373743066 1771255869 +537733094 1567038530 +704871861 3632194556 +3420988205 844355474 +1944513687 193360304 +2631057697 3430935175 +2115665897 1823955928 +3913886495 2026728907 +1358303277 1308368761 +903699446 2977409793 +266156610 4109268302 +3108831540 4129371103 +344366414 1198536504 +1290321103 2752384780 +3617998905 3138440734 +1091793641 1520297176 +1254240828 3954513009 +1621008214 2537305066 +1460007591 1460007607 +521809096 148204202 +3336536435 2228799514 +3377637001 1981557176 +2377565462 2377565446 +170097709 584874692 +2740404704 3036042914 +2446602040 2446602024 +3420387763 2734888154 +448188292 448188308 +4104057302 4104057286 +549102962 4157764211 +2786683049 587186702 +4261026179 1404447036 +3890879737 2574793345 +951559677 1176128852 +3568637018 856623549 +2399701644 2527037111 +1128310670 3296354027 +4166670666 4149309820 +932170530 4027351101 +3287158524 1807849127 +2152598338 1397781078 +580645644 2273287159 +3955606072 1615904301 +1194458880 2235511444 +774636505 2286554782 +1235157084 2979250124 +3906871980 1102091464 +2119284633 3912580222 +2992596283 120347634 +1499304078 1011519375 +3213063174 4282479621 +3705545530 1398411779 +3800445423 2285935416 +3243082364 1895877334 +1320622314 1976350546 +3361923612 2410279441 +4059881200 1756190706 +3642706966 2453213226 +1195040294 2857320817 +1209566666 1218092283 +1341341612 2280471489 +487225525 1551625132 +1871421736 3234771453 +2019290762 2205586930 +3901839400 1139814917 +1308266847 544397470 +2863569355 2078022274 +4054035020 2963609015 +1799435418 1906691691 +2833173410 2025492483 +1510917138 3611207763 +3355977448 3436527421 +3749227090 485760787 +2553970399 2199238920 +953994283 2929026978 +2247094958 2597291966 +1313396628 1291466100 +2628868239 976120081 +441569567 2378970078 +1288720278 2179811623 +2416602590 2657809535 +159328877 1613744516 +3006481274 2143142742 +2021059528 2712931555 +412931678 484799999 2084094078 +1710167405 320844740 +4176316816 3863633295 +1550848010 3937358693 +732736059 4224711405 +1817681829 854610092 +3747552997 2277352044 +633287992 2751514413 +2210663015 3526054500 +3528178295 1910122723 2218166608 +3469516252 1746698567 +2407853995 2407854011 +3612576835 1990768893 +302994458 2283889899 +4075281906 3317913499 +4237493060 3748537375 +435304105 2169244696 +502895952 2966921874 +2895251074 1245121550 +3961728304 3948946069 +514492041 3307518587 +1552630510 911976882 +3420880104 3890205461 +4212211556 2686896767 +4215400415 1531336843 +4065986303 152792889 +1861958255 683791803 +1701547791 3075617944 +2013233240 1060571789 +3956267954 3929463091 +527190503 1409388025 +3367442095 2805511534 +4192678371 3328157895 +3188323739 3606683279 +1080069217 3103587488 +668088393 668088409 +2566638 1546789292 +3009441226 718066925 +3340033181 47663906 +1890518127 3531864750 +3828728708 3299002591 +1566073336 975426176 +360855094 470667794 +1990056887 3915101673 +3233963956 633144329 +3795577961 2371168600 +2948882065 1126227526 +3413207170 2606093033 +2369728625 3413721584 +3282531089 295314384 +1296246482 1924537491 +1562315700 3421688523 +2137447515 3924616018 +2837885143 518546022 +3472233446 3009499927 +979058385 2929976070 +2995869507 1573674620 +2142618085 4028644218 +2233729936 665951157 +3996577544 142231947 +272984188 423852849 +470538289 1470453040 +222898233 222898217 +4200638334 2754063177 +3755550767 2145073339 +3304504694 2255241415 +2896742344 2511503307 +4207156121 4207156105 +2671567586 2671567602 +78783117 4288763378 +3585820084 701413967 +3545353762 1309522730 +2599507032 1105708699 +1288933791 2416852318 +4213000444 1259988145 +4135113006 1532146489 +934849119 1168973596 +1806730832 1024016043 +3687550140 3178138599 +1161561923 77262128 +3295392658 3295392642 +3803592549 1238971386 +3632748422 3880045009 +401162210 2251264213 +327025391 2196966367 +1899753316 2977090812 +3567726475 3914384046 +906619701 1184711804 +3838630780 2860352551 +837332466 1556155661 +3208843222 3968986599 +3739992007 1462183136 +2269157671 2165926274 +2564653200 1530895976 +2759807674 2759807658 +1163728403 1149878266 +1915775680 2184711251 +2332965904 2929085035 +2110548794 1120717917 +424364739 2491855100 +2262192105 2262192121 +535448466 3486840531 +120243171 120243187 +2967598876 2411200785 +2977571223 4198686886 +3018729277 2095564052 +2109101697 985677076 +979087184 777321205 +1695946326 2009409905 +131933072 4045339573 +903137828 903137844 +3182045675 2111831266 +538722408 2551710339 +688437049 3518525118 +4090893824 892384824 +1394985693 3246283252 +4135537308 2791469969 +1635166432 1794100617 +2543017975 2483032528 +2756002237 3996516532 +2485880891 2072474852 +268085788 3327567048 +2316472995 4265399946 +4018247165 100605268 +3009135118 1735556121 +3193308763 4234936658 +1153747764 1028432725 1970107234 +2583507431 1351978656 +4175926803 398063514 +801278433 272567584 +494637874 2988594078 +1476222515 3067824716 +115655849 2078226446 +3266100075 601493269 +4271418945 2701771495 +2504908350 3554155042 +986902476 1712291383 +3193583268 1275331647 +583788730 2055984028 +1488014578 2434539763 +2227469913 1515382280 +4158354479 1568138744 +4294343119 448959500 +2570088427 1067807275 +1067807275 921443335 949637148 +2141768694 3971552327 +2726001414 1548900679 +3733475696 2224606941 +485868792 2397377133 +2241916782 3394824761 +630974655 2570633364 +640485106 2524617174 +4263899915 3883532414 +1283890156 609616211 +2184015085 3665983762 +3425626738 3755676005 +856840033 3336539574 +3009755296 139994085 +2353023407 2016673390 +84814653 843976980 +82057598 823402825 +3451320213 1812447114 +1213360529 1790717766 +1892468420 1448928927 +1151514530 2921796629 +1470623217 3998978672 +2082243139 2001428518 +2391101477 2161977914 +16796694 2303682034 +184807645 875834356 +1340869139 3559785709 +3861414101 2814506264 +1904331340 1904331356 +2849603048 1231107133 +3632989538 2774131819 +1605785828 2270824420 +767579577 2435798942 +333721858 1379477045 +1881090463 2660305082 +3721270516 2456478123 +1428359696 1428359680 +2802989507 3299929578 +2759021585 4069349062 +3505538775 3294987376 +235797178 3657544413 980632687 +2066619608 3247925261 +3840257476 3280708188 +870399850 870399866 +3515530519 4100434726 +2890278651 762273060 +1388740374 1685721009 +1881869400 3955519131 +1593328441 3117535912 +948773944 1542159168 +435885741 656717573 +3955096073 621845560 +1317732367 3016824728 +1132603073 115540438 +3504687460 1022527593 +2750205665 494541072 +4050962086 3235166039 +2175019225 4068356008 +3371649637 3568016778 +889715221 2425270026 +4241905637 2190944029 +1953829114 1313454493 +2190224476 3735672007 +376157306 2725549898 +2969979373 294102387 +3411836214 1486429201 +2111584390 3964605127 +1385705123 3973008865 +1509882027 1466004788 +2551928362 2551928378 +1703298121 4069986193 +1342216420 534993103 +1088786840 3183161139 +1159505745 3794094191 +1684876199 3202070496 +2594313876 1405509824 +1104053589 3271770355 +3317622116 2944605311 +164635335 465766391 +2872766115 818260618 +3639773516 3519947425 +1231828817 3864728710 +2179771621 1821650028 +2404240633 2226970357 +2824012013 3886707986 +3002144123 3334191776 +701335395 831267036 +4267213855 2220358856 +4039781603 4047808842 +2490745517 1650554450 +615218284 636804631 +58104480 330656229 +1003568950 1617330695 +3952944052 2623485007 +4031893495 3617063088 +253235165 1313066456 2682321140 +1507512505 745968424 +1283243269 71819562 +1921431803 3160603567 +224175452 1691897809 +2344282275 2063148205 +2658915208 552039586 +2784953071 1064410670 +2885030722 4133507317 +1179479651 1179479667 +2917942227 823974437 +409679939 3016331644 +3936219810 4171560213 +3099527865 1609143433 +4211701868 2615710209 +1491984577 3212365782 +738232857 1574528328 +2223239822 970076185 +45379764 3799852841 +3819932683 2019128642 +796392646 2145577911 +2417945998 1857025689 +566401172 3109433584 +3413397151 308936010 +1970933167 1777531642 898286949 +4257416289 3674203318 +3027586142 1013132507 +1885328935 466533029 883647538 +3287296766 3774526985 +2645511624 2290630388 +2585835582 3749841289 +54860737 3872043222 +2833894047 2833894031 +1531542101 162239434 +447452508 1478238151 +3032977558 740858929 +1682024962 116894237 +3915272962 3915272978 +2703687928 3836160688 +3570965182 3472595231 +4118816926 1054147650 +1331113875 2034230380 +2921773235 3656696282 +2435259981 3449074468 +462085152 2073593459 +1048902887 1289738008 +2689172392 4223287659 +2970745337 3092022014 +129941396 2293307135 +3341578428 1190492145 +2061961899 2514028245 +324166652 4088820354 +4028859428 3436338267 +423444011 1644748807 +3111699351 148839353 +1050278174 2858625599 +3541896838 3703430391 +3551656858 3677295479 +2577804943 1872448270 +1664372837 2421853946 +1580420094 160494228 +1043670376 1437196989 +3736023826 1675520480 +4120006963 2803604052 +1606387980 3330588151 +3238702567 3402613408 +4290263752 3642979299 +2614542982 2983570641 +3943014288 3078167019 +1494801807 3508848654 +3891550962 3118141160 +3749400036 3411857124 +294163814 2617502375 +2762228528 2762228512 +2243775394 2968728747 +970123849 3904562862 +3314052138 433347731 +2553985455 1400000120 +149168053 3021859324 +2740237016 1900640497 +1791609888 1001150053 +1164213999 741593646 +2059679795 1977907290 +946510074 999546307 +3289406358 3289406342 +2794301729 1375813344 +726696315 1773125160 +2497876101 3822493866 +2915329909 113649933 19848490 +3619803576 1578968237 +3924172548 3924172564 +4010398659 259546090 +2199880543 3160703670 +1586920583 2458141401 +2526015111 2341764758 +774514980 215072560 +872453880 1369088545 +3620678775 841154384 +3956168795 1131651080 +396026675 3660808886 +2223928485 1363255212 +1772834035 1269441164 +1671611598 2805715033 +967266913 593931936 +2124707482 4142314621 +2738008840 4040152459 +313643235 3007368435 +1462949464 2634509453 +230711712 1171894003 +2094869221 3958485514 414090697 +4195662320 2661332181 +2568551480 978652219 +1580586273 1514791376 +19059333 1322346316 +3949420471 3949420455 +3730999852 1092584279 +4001360580 3001068975 +1388819387 2502757849 +302272957 432843915 +3360247196 3578079313 +3657558736 3702882088 +1306201221 349484364 +2997039918 2245774450 +2457848359 1726275769 +4204817525 4287282218 +3393215614 309724041 +1889918474 1595705787 +2009799000 3971540379 +1232480663 418426979 +1849102638 1847721903 +304588214 1248451975 +649047125 999049674 +419549849 4141778654 +3121362147 1080688605 +700249411 4151711850 +3768277456 3240427051 +2726503489 412278128 +1473857965 4161731410 +236725318 2085427767 +311951173 311951189 +3924041193 2040746830 +2977641652 1086355251 +4281500909 4125849006 +2558915296 4208809637 +220898306 1235891211 +1531716644 3705463977 249186856 +2557030477 982976818 +2589599457 767966243 +2998226345 1460915821 +499418405 22911290 +3455860983 3663352675 +4224548168 2893822027 +354611711 1157821566 +1163033596 518190051 +3752359405 2932773985 +1035284984 473803131 +1135240258 3342586869 +2509365876 3634963656 +2858200948 2676570568 +1818056800 4143062835 +517963270 2681430881 +3116640255 1858795112 +4167478520 27413101 +4267355479 3216957424 +2823007227 3716660274 +1394120125 2360588418 +985415291 748024626 +2053983808 4195495621 +1305323437 666826052 +10282414 2653623642 +2513835400 3676417205 +1436808676 3038516735 +473539660 4012021532 +4293462634 3546268883 +2761393014 1186410305 +3894858706 1193243525 +2582262082 34144726 +2302659724 280860833 +3513761918 820774495 +2960302627 1838096435 +3733486070 3439675862 +1884573796 951750015 +1058626695 119662453 +2953795913 2953795929 +479657507 615649564 +2361956637 3167291572 +522535429 2307872209 +531813755 1636176050 +678598169 3311552862 +2688425495 1489591846 +2084236491 127525368 +1102515647 841655230 +420122029 4020686824 489855225 +2236274455 2042482231 +1206154598 1886571175 +2821510092 2794979740 +899565464 2299499148 +2633818064 2332095531 +2460511327 1484239132 +2724184035 1870522064 +2641534421 132396666 +911825796 313200841 +1524472889 1138552254 +77300235 1271772994 +824417354 2769225837 +4097812568 1618493679 +667900704 3412882277 +1863390987 3806807636 +4197651323 1499966130 +1008558148 2104811321 +2410595868 93362826 +748871163 3985419944 +3723990017 1841167744 +3400154735 2030061752 +800697644 1296800855 +2540823136 3360120115 +2714236152 2781258349 +1887270546 2810292165 +2480637295 831720888 +299087500 1928111508 +3095835253 2536825098 +1115744553 2504990117 +1324789078 2756894321 +3848187060 3356090201 +2596275304 71757739 +3766249125 148215212 +474977873 1214196390 +3401402932 1543229401 +3904086373 3083276780 +2183234686 2041516080 3138306164 +88990281 2728081646 +3401837999 1509939963 +3730410699 147375234 +3967276890 2594702013 +4284695012 3980442111 +2363097592 3006339451 +3814999123 3931478208 +2229807424 2037968851 +3470965653 1955455985 +2252721728 2682498771 +2580256830 3504090569 +1988265821 2814758722 +101739724 1473987895 +493045305 2555323573 +1864529225 1864529241 +363794044 363794028 +3723536368 1373134531 +1189313229 465679392 +667073366 667073350 +1791212675 2502017596 +1272185986 3770882211 +1763535457 1535433274 +3566728907 2961636344 +1229649021 3645398776 +2249434922 3809316741 +2753703792 3520113987 +2681455058 1097665403 +1523636901 3359194939 +298752462 3594264409 +1618252246 2910950375 +2476214109 3042154356 +4124958980 273234249 +987162090 2320232269 +3983663040 2319661907 +4101801508 4728856 67578537 +368778537 3276728216 +2235244406 2235244390 +3540533333 3540533317 +338443566 2863203709 +398138438 2411988867 +3431990382 1958148409 +1241849607 2366625814 +3108602580 2193159097 +1792417752 2219294430 +2710817230 4109900222 +749238211 1815361405 +3319499197 899273876 +2984545835 114535258 +4105738690 838463438 +308112084 308112068 +3548344751 2694837870 +3214576217 65498878 +1343614090 187239394 2647376869 +462681041 988336656 +2002429336 2075307597 +3095487614 1213148898 +1394239012 3418949656 +92991811 4240034940 +1806428593 815849904 +3851272443 3848399468 +3734191608 3019637418 +3180020219 330859517 1564007986 +1039790044 1819580231 +3669928041 2001147612 +3261633228 4252068087 +1913183208 1811033661 +1276029589 634767833 +1735339637 2390344820 +2694924129 1055088054 +1797302644 409649551 +183318955 3731998754 +1721759519 2899445192 +115384882 94327987 +1708147597 3554301682 +764146832 1129447093 +2168422446 2878414586 +1149380686 652571343 +4114885494 3916212997 +3818349728 3881002981 +1737090745 4107605073 +455233270 2902609233 +2153879612 1436722797 +699056207 3872177240 +3389821121 3536314304 +2867790855 2256377464 2587000521 +4165735912 3128267796 +1351343453 3736808913 +463976425 463976441 +1372967387 1170648255 +1472654677 2375392255 +962648372 962648356 +2899550056 1888745877 +2582638795 2193655278 +2045597382 3122353489 +601606832 332309927 +2038796589 1461931675 +3220520044 2134280316 +4277732204 3456131841 +2045157692 266777831 +3446087925 1314447804 +3691314178 1574483765 +2020217686 3841749105 +2933216358 2681461889 +2355928038 4109986561 +743987492 4078195625 +3723254123 3322987362 +2437366835 3861929050 +3737472094 244791295 +2140454501 2140454517 +2826529356 2826529372 +208889958 4289550487 +2765012641 309729142 +1573140307 3957630103 +625089304 4195435709 +3461557104 1051736267 +1777867731 2761149754 +3483746078 1945743311 +604494105 3512386120 +1557742165 186547964 +2252883632 331826965 +4164118594 3863556683 +2363469125 4091210602 +806123709 1621234068 +2814048772 1876848367 +3291443793 26378720 +2628783919 3580450683 +1149380688 4232577960 +3493924763 1902874898 +2305736277 2924847068 +322634741 988232380 +202136783 3994371010 +963718748 1045510604 +677341700 2452874335 +3847817410 2560062670 +293101329 3620678340 +602305533 4257619189 2160629570 +1791419806 3134406590 +428484018 2667308396 +2437690568 1347689784 +2464664689 3018249712 +3799391805 3169950228 +3823479841 3817732086 +3602990266 3426693323 +2769229028 3133006591 +1069383697 4242777504 +3293216102 1732470679 +909517559 1312361168 +3759387828 1788535071 +2396490600 1162900651 +4105757083 1133407048 +4235456833 2894382840 +3977427540 388134411 +3202156475 3225182834 +3038734790 3866329761 +2665086435 3618062349 +3012369138 1823500857 +448652301 2849388091 +3456648903 503802697 +4242266760 2518221835 +47689769 2726973592 +1896623974 3026326695 +3046782995 1075843734 +1091173521 4088961094 +1394162509 498620978 +3958595514 2587519678 +2807726399 2994304552 +562359912 742608317 +3511094345 3511094361 +695226306 695226322 +2499617314 2893855626 +2701257192 3631969744 +4020167532 2736784151 +3096626020 4077491817 +1664427258 1667187590 +3560080462 1501972175 +74306397 1440988020 +841277910 3322905585 +2387444191 3808653854 +3159148821 2178976778 +3249140198 2279922617 +3907911984 3735805589 +383463830 2176113249 +2906902166 1472083495 +1731830497 1622894646 +779431839 3245995870 +4237776166 3359312577 +2731717246 3484351561 +150063381 698321930 +135529123 213695638 +3632648915 3924404769 +394949268 2648210624 +1803083280 1061524277 +3509293539 1730873552 +2249622334 1399888521 +1501047867 321757426 +1162359997 885602668 +1349623982 1356853743 +1044792484 2896039487 +1598696883 3032871116 +1184475025 117627168 +4004493456 2049399531 +1087320263 3442067776 +4090820607 1058278226 +982104116 1523382735 +3220535480 3882682797 +2906276735 834158846 +1846370378 1022606771 +3721365474 1843999940 +1983900501 1042880218 3297001898 +2591505522 2612275059 +1970503119 4088478513 +177648347 2252050130 +1526409509 1583465772 +490886705 4132844382 +977198341 3052793562 +4154496350 935858477 +3074450432 3722416184 +3988010833 4082178711 +1928032937 2443542542 +405179300 2829964095 +295233532 1262303655 +3272966859 3856459138 3856459156 +1244149693 2052046484 +4102867029 1319067100 +1902790000 1533406216 +1844608130 2528772277 +3762737788 3043667756 +1331426748 2848184039 +1598427298 2639015701 +263553628 2605337361 +3385035460 467488175 +3713513376 286658789 +580170614 3860234951 +1149852186 4265137899 +971876469 2787127356 +3576069874 2107234021 +2227165383 3238150486 +890158378 890158394 +2181522921 2594532814 +1537373079 3542462147 +4223574218 387390963 +4011385427 2600869805 +1023579390 2871865833 +3258375174 3260833143 +3996605031 1747144736 +161346106 2122306551 +4155720265 942758126 +2260893384 2831243235 +622872008 3691902708 969791965 +2230822216 2380735093 +1639032014 3765355269 +495771951 3016129774 +1311981311 430713726 +809537942 4228463201 +4116793639 1494322994 +6275824 2260721603 +1153853724 1616344839 +276681383 775799298 +896237167 2268596408 +3098995300 2558641743 +4273831626 3461257197 +3766886287 35892760 +1565416656 2992380789 +3966900261 3966900277 +3574688217 3959190287 +4036830896 2135760212 +3954057510 689843905 +1624491287 610136752 +3480928830 3695167369 +292419223 3956024567 +1639394360 2567283520 +971763956 577523727 +1099332115 3821607690 +3802451231 3899582408 +971321071 315155000 +2370836995 2014900906 +565940344 2453957869 +4272932132 1344023549 +2648726994 1513337221 +2132867855 4852810 +1299781461 1232984189 +2723314648 3250647715 +4273486060 3146238977 +3216796438 2390519799 +843105089 1559453526 +865121396 2697728655 +1426430500 238239792 +1516358202 1516358186 +1030762338 2505843913 +1393140664 1881979565 +3169407048 25445749 +1203331771 1317839208 +836406504 1661718827 +3398637314 2857330025 +435597548 3411575703 +3323751581 2076113698 +2927562078 818788801 +4004274414 2807862969 +2579112674 3791972821 +1283648984 280134705 2047220016 +2919867612 3913118097 +307178814 279197855 +3739416311 3595224774 +431084346 2901378141 +1222222804 2191320761 +227597109 2416514172 +3222796669 2998197858 +2517755809 3744440928 +3990485956 841438623 +1450529858 1555276771 +899149648 2922232565 +2721171736 553701455 +1623774083 3043172583 +3319267484 2868089484 +2153698451 2554890794 2153698435 +3007720715 4166368303 +977402346 2682022733 +1351110559 2455708449 +1174164799 3036443574 +3651775890 661897274 +173914351 1082794040 +1570521259 133811508 +2605157075 656830563 +1357248096 1248549290 +1946784377 605131902 +1200827014 850129143 +1550403330 692895974 +3465212446 1119561023 +33027534 3881300825 +4208667752 1325852587 +983248282 898963889 +2664926887 3679888275 +1150651502 3625913582 +3991925316 3568984329 +3790620973 3661836754 +2118851340 3694892008 +2110591159 3234942992 +510442110 3355769966 +4159232882 2200649310 +4151627817 3051597976 +522353717 522353701 +2531038905 910247208 +4068932074 3027987291 +1708360749 1692565403 +4003929183 3553485066 +1410622530 3316158027 +579401161 870358585 +426522180 1017905534 +2278029463 1403708436 +3641433235 992054038 +2461008241 1544701168 +741839665 307414045 +2430784405 3103730337 +1788184626 4217726643 +4279352557 1212899291 +486240135 2589265028 +982922681 4084634152 +2248929214 2997048393 +3320899612 3320899596 +602061500 971765223 +2895979799 497047773 +2707136963 3326060010 +4011331069 3123925265 +3973716260 4283798441 +2306086774 1807213399 +2176960685 3497508718 +2313161263 984614894 +4217915503 875169454 +1005496575 2786685505 +3079344752 3079344736 +3925719220 120291355 +3115227053 4208510290 +3054700503 3054700487 +1552794424 1553843079 +2256729643 2256729659 +2642837373 1740281988 2642837357 +4169631842 2673586773 +1546098086 3092288599 +3337755543 3794293424 +2512091441 3877619750 +4265195231 3288998625 +1643258001 1509325366 +862811372 3780054935 +3139885133 3945169202 +1605067482 2632621411 +2897909298 465203365 +2898496376 4170935315 +1715692259 3742673756 +3794001053 3658630804 +1365805093 1284395564 +1165076223 3358653628 +807718403 3438300860 +1676706728 1818476816 +4240077481 2104463282 +2698725652 1295256185 +2749913820 3804694609 +2010617500 1147279249 +1842518521 2511590878 +2352497938 3465853765 +2356917633 4095648423 +3246180049 3590769539 +3995756927 1808012030 +2734483868 2734483852 +1160441522 4079303459 +3528628781 1158198482 +3744305767 3665286545 +2297486088 15936159 +3572866963 3517592698 +1781626949 1893749900 +3679899770 3282710539 +3149203813 1334113418 +98386203 1447918994 +3559027622 2554072663 +2710210913 3272382342 +553103387 4105838024 +1132051501 3522533522 +1134704800 1120239995 +2446107650 3827053597 +988628326 4063238822 +3504235719 2501420352 +2790897992 658418781 +3569900009 3764750808 +2421764957 1487626923 +2598329550 1249068121 +647012352 3047940101 +1407018050 1199887349 +3010741102 3993380409 +3570868963 4054575964 +2097777161 3741600814 +1871507047 31149088 +32710458 2014142463 1270491229 +3947713298 2092549459 +3016689414 350752375 +2132157700 333202761 +466182972 2876391254 +2503496498 430634917 +3551867951 2478225793 +3159442382 1106099545 +1476206585 2088326376 +1420695092 2181886927 +1704842662 2641843265 +4019915327 1880170814 +1752763697 2811216944 +1309441894 1403823825 1309441910 +951383181 3520920050 +3663617213 710724259 +1104692660 1534442073 +132258522 132258506 +2236141024 2979796901 +3228290642 2112447837 +1194738850 3161328405 +1096883123 454220422 +3019820321 2065492726 +141639569 141639553 +2570310621 3840028635 +3940444818 2412521862 +67414572 2136466263 +3557375445 2676774492 +1399072572 2192163697 +1994135025 225872486 +2712977264 2587749597 +3283113933 3684317106 +1595530647 1287115961 +3297964033 802440743 +3165962191 3750359758 +1519395794 1659397011 +107051983 100967729 +565052187 535749508 +2776641207 1070172688 +3202344994 2625269123 +3310946918 288054935 +686515710 1754369737 +2205193600 1782274195 +2548991503 998050190 +2604473096 1764855197 +2777807475 399328026 +1339947366 1339947382 +3892949977 1624807560 +4016384277 4047481884 +279733966 1716543054 +3041473976 4279287891 +2321604185 3663959596 +616806491 991639378 +1233485569 1233485585 +2163227704 841927725 +3366830585 2393320181 +4234100545 246935665 2331022166 +714285154 1738275413 +3580246037 82463004 +3557591814 224637321 +3393011607 4117437094 +2993363444 3116413983 +3600700524 1195304449 +3577554810 692397341 +1792071098 3770708957 +1966186613 1966186597 +3546794233 2428250008 +713324488 3062403019 +2874758357 2459994972 +2175025857 2880531998 3600094687 +1980256846 488214745 +1106772263 6934646 +1174950472 2266597195 +1758569904 410771144 +536784531 2645145197 +3808503958 4040352817 +3975412101 2299645004 +3465957975 2376310502 2376310512 +1206867655 3474159783 +2699696744 2779352852 +1046486504 424612925 +1867748113 746549408 +4243467597 48316068 +2755479081 3044373144 +3622136811 2673690127 +215010845 2836943874 +1439899099 384230071 +3163868176 1063737963 +1538935639 3175389680 +3566288665 3566288649 +333707642 333707626 +915800120 890293971 +2400429925 2700116986 +3785496088 1244186587 +1531015071 1191360328 +1549518902 2591829265 +3371465636 3371465652 +1086933467 510659919 +1966880439 1154097680 +196198345 3655301177 +1990943079 1619263859 +1424334442 1453288534 +552449131 391119512 +374310737 549263530 +2508548414 2667883679 +3194710712 2065235899 +1578932714 285625179 +302168375 1339044808 +1990545254 860412767 +524765146 389422123 +658235024 1396661429 +2617137110 1734624753 +314871701 544081820 +1655039527 1915309920 +2064544871 2055611731 +2991768533 2370455644 +833737626 2700814691 +1665953605 1055554922 +36329413 4189837802 +3113387569 725695813 +2915379284 2915379268 +3633458192 4263206179 +2487323145 3772064120 +3788763452 1750893799 +3519519562 2268689787 +1374255350 1465114839 +1767265135 1105549230 +1785014179 540894620 +2894922082 2218934379 +3825158330 2766109917 +224693270 3460485162 +2225752329 3775985976 +3922022966 933260059 +885949993 972461454 +695474720 1640308837 +2097659180 4272657739 4281257032 +1599266274 2247610102 +828170433 265555965 +734938422 3060624522 +1487391478 2418853701 +3724685413 3799133932 +3094512867 3967340778 +3129437696 3975685595 +2090802098 3765999909 +1126870807 3543245104 +2944015949 2319299364 +3986801939 945030648 +300806654 932442825 +1911062481 570504710 +1274904131 3937057840 +2555707439 4241443310 +1285168688 3332212099 +4276822502 841374999 +3010354194 2934847487 +437687248 2186528828 +1690100630 1713036385 +1010222304 2855791795 +2189718856 3196362827 +1805460495 4242366001 +2840637433 2198144254 +4226189015 1659257968 +1172846506 3062866061 +2377945886 1037801535 +1893497481 873784750 +478273945 2037785544 +4184108186 857142891 +3324197906 4218916933 +493963362 700014461 +1711664145 202371510 +833992704 1509643572 +2621391933 882404354 +3789833013 3478506620 +3424806676 1848132719 +2546998768 1400942428 +273720627 4281603254 +349550655 191957822 +3519758929 2482595216 +3586173359 3309369082 +4096844508 3739344784 +3767118359 1823715732 +2928080523 1232477396 +1380182882 2076981867 +3564473864 2098108043 +1402159312 1624180579 +72666824 2575402205 +532611375 682548462 +4230626470 2625468766 +3496260263 3045407977 +3749882380 518968851 +2454259972 1291399519 +329019237 1145265146 +4024078648 21645267 +1168732377 2137751567 +1547566747 2523897209 +3935944410 3935944394 +212259632 2087814795 +252529655 2834208198 +486367230 329737467 +3229809608 3593624541 +3276090957 3246648033 +3249345458 2076435291 +2283668468 1790268820 +1575477677 1912732178 +3600570311 2669555264 +2040170461 1290054680 +1649776482 2987335086 +1935797938 1428865573 +439222740 174907577 +222698845 3749336386 +3826337848 3826337832 +2341016311 2680740560 +1924206944 3971897893 +1460989024 1978669861 +702092337 319466781 +2719308968 1525306384 +4153186584 3394568397 +1113931482 1600254251 +606180784 2430510101 +1955636284 3149040231 +824308598 910050053 +2616999886 1545105743 +3591339055 3163280485 +4159129128 1762881789 +3160441053 1760222178 +2925992984 2756786651 +757931963 3303042077 +3066241647 233589830 +3859189220 2481491684 +441502473 1982832430 +969619896 1447846980 +3910659958 1792768854 +2564741661 3834855426 +262751790 3581508217 +1101686051 1401105543 +4002118327 1016212998 +2564872164 2381569023 +3203166935 3210967592 +770819532 530210871 +2778261120 3557641144 +4095989449 493559416 +3635641803 3985573506 +748585404 4186323687 +206687884 1813277367 +2750599985 2071670919 +581501366 581501350 +2163792700 1136729959 +290872803 2211381981 +1344743784 1369150339 +3763095831 1565326199 +2171262507 2592063569 +3401671500 1580985697 +2613950842 2160908848 +4045192096 809196780 +98688103 2844653110 +3726649510 1386216769 +365235438 4210383946 +3524734751 981540257 +2803317472 1431694779 +2801648827 2625417828 +4107613595 4107613579 +3810168835 3056544424 +860692342 946374343 +2727414418 2085856197 +3412920830 984005343 +3768766267 486482408 +4105283165 3908965291 +3523190687 879249246 +852932234 2449562427 +1702418679 2363796322 +3773783248 3773783232 +3836882133 3648820054 +3475076053 1457179627 +43784601 3032239048 +438590640 3611158787 +3790587662 3128318735 +489466738 1599202419 +3687862573 904907204 +3790870756 4043659003 +1131884606 1923150217 +1484149127 3376568192 +2520190730 2192354491 +2207945606 2207945622 +4240422032 1909014204 +2948249166 269611933 +4192847967 1718993232 +359466234 3775539669 +3876824167 720096822 +2549086689 2549086705 +2765252939 3624989304 +270664820 301668041 +4200194588 1991058188 +3189920002 3189920018 +969806228 2381655215 +3755516846 775427641 +3133303912 3133303928 +2681506928 194581571 +1870715960 842861267 +3239051258 3326101226 +3425531879 3804009496 +3783676122 2035483238 +2719792306 2254306334 +3517069793 3814792480 +74473289 1172701166 +2852177457 3995510976 +2848092208 1830198165 +2930170606 3735725241 +1030501601 1030501617 +1392691939 2879089094 +1424244671 1649433022 +2466857728 262530360 +318012759 769740774 +1863687913 3356043480 +1779813399 3814826900 +2081775062 732084199 +3496367002 3187911011 +84549492 84549476 +2387456487 3947826848 +2168004510 183289257 +9141254 9141270 +2507723620 1375431524 +1879427943 2434628452 +2181869380 3539867739 +1292474961 2535320966 +2391112511 1559857916 +3172030302 1759980250 +984790684 406124551 +948301821 493520267 +3252345635 3128464400 +1575342195 3882900594 +494081128 2774169066 +1144894731 2015625282 +3060085604 1945936446 +4116215900 2521135313 +1700103867 1084430450 +1723968621 803368836 +811606490 22366781 +1173529788 3349804651 310385320 +906867102 1532918523 +1637407306 1691629898 +4032138510 2019021966 +776155986 3143935060 +2118244803 2678713725 +3850473067 3052614242 +1638519909 1491835555 +666052737 146576899 +1070971675 2232066271 2557840260 +639168639 953492028 +628473940 1499505710 +1051965580 1433193053 +1715594165 2931389948 +2332529627 3085812178 +200523422 1857360553 +3177388226 3858079017 +420612267 420612283 +2568473628 477515783 4277055756 +1105404179 3415019770 +1462108406 3836093879 +1250966672 4044314293 +329615842 2405383421 +2687289133 1400736708 +4148667625 1875618802 +3858658984 3079981693 +26755522 1152353397 +4285194444 3779060001 +2428395236 3215941865 +2483792872 4133461565 +945688837 3239365324 +1186329007 2385215227 +620825738 3399925051 +2148861726 2148861710 +2976132370 1075784386 +1361978901 233675059 +4055537280 146467731 +4181788025 563977000 +2613936796 2030611702 +1932701362 180945459 +471305590 2937303239 +681270587 663995364 +1633610288 1855430837 +1881942076 3515045479 +2165140997 757346764 +2585340324 2888719598 +3563198413 594245554 +413659594 2590089453 +337494128 450228309 +3996237609 558886286 +989150458 4030903170 +445303210 676701030 +1295960637 1701316785 +766021451 727290626 +159210772 72975984 +3803627847 749880000 +3098722840 1673693579 +378536152 1555125275 +620241235 2241623468 +1023664106 4145642829 +3804426746 3804426730 +2541932722 2541932706 +1777050063 4141420886 +831800880 834298546 716855218 +2545020903 756906528 +3422621822 3314451371 +1454644282 3195830110 +2360989286 2360989302 +4284185355 4030642744 +1004216021 1004216005 +2872134749 3684382306 +1899386624 1899386640 +3885975400 129853611 +2719168148 2802888509 +94045208 3943133659 +3883795222 402981898 +2452874306 1773163509 +472105544 2487932765 +2038312605 3735249204 +238385332 304939855 +1013376913 1013376897 +3821037776 1474625379 +2766214205 4058661077 +894302233 45977416 +1289108272 997405912 +3706540608 160987859 +4131594940 1739566577 98512484 +2742714057 2384926136 +340860933 2786907178 1536139907 +972066383 1025114840 +2149539391 2437260778 +3910994847 2545503048 +1685137159 1913671684 +737132837 1118556764 +3001779176 474329621 +2899852122 1919250109 +3870525051 2812064690 +790132117 3095468444 +3142325683 2356638403 +3742635280 3792218535 +786572108 436048033 +2940537105 4205659600 +1673508861 63873876 +3108489417 1963005048 +2565825663 1071330280 +3075627058 3365983909 +3905772116 3477418553 +574666689 663369326 +319068640 3493739443 +2765352827 1769014367 +1294172859 702991460 +1617557569 1617557585 +3544428554 1776301993 +2388552255 563331703 +2790202001 2790201985 +1042704923 2777180104 +310344104 3333194621 +2765329129 1645233358 +682644206 4220685487 +2156612940 1111104028 +1303118710 468379978 +171220707 4090896202 +1760563588 718803577 +2895912538 2895912522 +3222453189 578656012 +2817171906 408724579 +1653448767 1653448751 +1106980487 1701461632 +2201543155 2240524684 +810470103 810470087 +865274653 1299873442 +3831886484 545054457 +2993241483 3620769397 +2145356856 1693660295 +4080504447 1601524222 +1567442091 3921282261 +937178208 1336308531 +4061118191 4190220177 +43837588 2673469439 +4237808704 3808633029 +3518233937 1868023430 +3021695559 3458747840 +3011570895 2556015626 +2495192957 2637566420 +407039608 2332624659 +2196830833 927835383 +2110211058 4105593085 +2282927380 1785391795 +1947491625 3842942862 +1052909216 1115084667 +2455824210 499007034 +902407648 2356158373 +3487824510 3252900959 +2967269808 3727493404 +589840777 3781110446 +732108390 3480319706 2378427060 1353464012 +2974568070 2703203575 +2681564598 1392227729 +3869234126 3684330831 +2454070663 3412923264 +347693427 3501112845 +485352697 2206168040 +1724919268 3182968319 +1079217028 2072886468 +3516349102 1465517369 +2614949636 1624824648 +2188340667 275365234 +1784958465 2095500160 +2775318819 2349189642 +3296921696 3125161779 +2513362273 900104096 +2688165912 1401757147 +3873549864 2638555371 +3011814161 2362606892 +3615188497 786169917 +1059715065 3310702837 +3684819869 1557745716 +3625462591 1829508136 +3177691425 1263038176 +2473301797 2473301813 +4014817031 2165227097 +477436550 1381548279 +2575371871 86613896 +1912245082 3345571517 +112103621 1238230554 +3929127127 2202401382 +2484905022 1729531273 +543360386 558551190 +189712401 1062191831 +4033936363 1826394868 +1902558463 2210104680 +184515056 1076688067 +1251028961 1133403958 +2560650570 4225069894 +4004712413 632998869 2699163874 +866151396 733736504 +2218123654 3740542970 +1281775149 1186727323 +151582715 874405933 +3871797881 3023018840 3871797865 +1296584274 3517293273 +3573179784 1100565931 +1157132841 4252663603 +3262775181 3003992804 +3523675463 217249860 +3841261733 3481558660 +1914957878 3834848529 +2029570963 776224621 +3450132649 1669403150 +353767284 2490063326 +4200211590 2716303073 +1157953036 4284271196 +2739606680 2805033805 +2269833348 2129397705 +945145159 3049897930 4127559382 +2339999888 543068853 +1129934876 566983687 +757125375 162070910 +1666792992 2289418989 +641916366 155396943 +3924238538 3924238554 +2672030685 3473623083 +2813884398 4117023673 +2954151308 3165846369 +3336630129 1816138774 +3851291416 2210137253 +383986520 1604139917 +670363568 461674522 +1134311885 2741933435 +3311540270 4206151737 +613353097 2379807982 +174972594 2583202487 +3177341569 324122474 +1240837835 952248724 +280723106 4180171029 +843734610 2098363155 +1917535145 2507899662 +2317052211 2619775834 +1978677431 1613318150 +2940181671 806145714 +3308540867 878697450 +2327090705 3158100823 +763603452 2722404263 +552112955 800003486 +3199571303 1031497799 +3052326173 2213340340 +2080759189 3527135626 +707152370 164997593 +2165835709 2198158590 +1084517407 3788911816 +1640189940 4263381004 +1715156216 1685516677 +4292376967 297936516 +1404146109 2106092692 +3919456594 368774163 +220767674 1895621579 +509257228 3568526568 +3103668867 4063130224 +793522760 3485923188 +2715845988 1641189732 +1584930858 3891353525 +1853841673 4073349221 +2219852779 895150836 +2236973146 93739112 +731704464 940074677 +2443762945 1305733248 +408208349 712004834 +3642386634 2391995899 +1134724599 3159681447 +1280744227 1331050506 +1030648801 1191486621 +3603779321 2294944478 +1137831535 781822380 +539919899 1590679094 +1913214097 363864134 +97044076 2265996289 +1150956764 2938667408 +1765214780 1631994988 +2971113226 528083738 +475116713 1033856536 +1862816662 1612420398 +739131411 1835982316 +2850460583 486174710 +3346951226 1174691659 +391753740 3459261175 +2846125976 2846125960 +1345483347 483550179 +1546493591 3000018854 +1486720375 1486720359 +1944301093 911295257 +1760108215 2343490882 +23151179 1998281730 +1837993693 1389880820 +1962431137 490605319 +3140795020 1073850999 +2659672506 2659672490 +319024351 3459113736 +1093465871 1093465887 +169947297 1124839622 +2516748134 1965318298 +645626020 672605667 +965824971 1791214228 +845636536 241016388 +182332854 3210054098 +1339819432 1599924093 +1384477278 1175652863 +3113923200 2928082835 +3730000591 3424568270 +1607202227 2165557466 +56320655 3885075148 +1037340338 1040733620 +2740038656 1165464539 +1477423132 3165797383 +1303067174 2453470577 +1522961337 2676880424 +969993536 1139112901 +3235703752 3235703768 +4175618698 2110360416 +4244967422 1291332822 +1145240446 1204925764 +396809211 916436004 +4264725985 3743117318 +2891446023 4122803269 +3114875459 2288433020 +3374627713 634596374 +3771027030 2649630006 +376525173 137326163 +722218240 3564141787 +3993342837 3363386650 +3744379239 3035094345 +2534571505 3273409136 +4054298299 696372584 +47508362 4054342387 +2985607930 508489611 +4225648801 535582048 +3577592447 2860529803 +67018205 855590778 +2738143812 806211849 +4242739602 2876549317 +3377965245 123214103 +3945986590 811002409 +1717037314 509857333 +2578884233 2206738872 +4291694738 3918420781 +1895178025 4235398542 +2015020594 4208138714 +570826622 570826606 +2136043205 741799107 +1648302885 3461856058 +3062718982 1720799073 +90938809 1097419304 +1935723049 542931342 +3176113004 1885225751 +1932124434 4034424340 +1952828241 2369720454 +1428322452 978291064 +451165186 1464497955 +4230185572 1340490601 +1767563887 1225946296 +1112493683 2949644256 3998362893 +4231030501 1202540042 +40918081 3918450458 +1713353124 3077620862 +3727272856 1402544219 +1913443541 3822783347 +4293174918 573583558 +2985628505 2110616840 +183833114 1506508523 +3962765030 4108706180 +1823399439 642224536 +2681948040 3424067701 +1974971303 4146280438 +2784236778 691858509 +1742606047 1636919582 +956797747 4193040730 +4184629906 3416744413 +1360547640 3779376443 +3502883736 1168042061 +2806659372 2806659388 +92130071 848249040 +818029757 2124404098 +2993157037 38204980 +3136172628 590507087 3361737652 +1048524141 3581727698 +3739814693 232557356 +3092104840 3870204970 +1519106272 1777600691 +83035600 2593269365 +4271344883 3146965644 +290275895 1939815568 +355425922 3683763875 +166732231 1277470930 +3672685764 1616980105 +3810513365 1612141130 +320079671 1065835398 +916707205 2297185868 +1047959825 3736659616 +3344837170 1662983629 +767898609 4052036758 +1968926190 3921644153 +1222135980 1753683943 +3141173481 2911265983 +3143774871 1905307139 +169172992 3755232900 +2049127996 901896227 +2346705252 2507133033 +2706603286 3183897386 +2047413152 3158134003 +3507283159 754533552 +3362853960 3362853976 +1664868343 776049094 +152313364 2471246542 +2936921162 3704735853 +3402802664 2861100161 +3215802724 566095977 +2449026868 4282732249 +2456520908 2749648609 +3153143347 262087258 +406491513 56587319 +2026237317 2761222234 +2849632217 991203976 +3215177439 3215177423 +2043925085 1455749035 +3479787784 2329356171 +2782172639 3970428446 +405574835 3241022924 +3311215267 1104996125 +1391957421 1220583236 +1915359553 4181272918 +3299634308 1215785915 +1312629725 1312629709 +1307995652 3203346527 +3743238158 1226337798 +2837495132 2837495116 +1525565071 1269540059 +2878953035 1184507768 +2163286454 2979533191 +343339562 4178606485 +4197749964 2898672929 +4026397116 2294516472 +3928786320 873873845 +545496582 892453729 +174209431 3991507792 +1019029884 3344111409 +3952419176 1136891563 +1093920794 3100878922 +2975192939 2502040930 +1822340854 4091151687 1822340838 +2023065473 1415860224 +1761696443 136434802 +42033242 1269476779 +766086169 4209478472 +1792919415 2988507206 +2173084129 3622891120 +234159333 3718913146 +2624318278 2212716321 +2320817052 613742596 +2723716724 4209524446 +1300529907 4204405914 +1091966509 1517897505 +3687124878 962134586 +637835528 601917760 +3083799880 730498744 +3262120239 333370399 +57529674 2951136109 +3249354055 1661473843 +4054584418 1453921110 +3150710873 4214301704 +3847220320 1557207845 +765727193 1165934782 +24996222 2007223208 +610879494 1471963489 +1660626800 1096750421 +2973983146 4071762790 +391920523 2773135032 +1533868807 1784824836 +2573485373 3050897172 +1756204015 817644332 +3278160725 2762753017 +285901026 2306771965 +3673485563 1048396631 +531731825 1435386086 +3869165792 3958782131 +3864323668 3470770752 +36406310 2424375233 +1091928501 702230524 +1080135229 2526210562 +1078157333 2476460310 +1960897848 2500379740 +3220059009 2767918102 +2145107481 1609318728 +865274647 1199207718 +2635700587 3125576546 +1570388571 3285192955 +1785272242 896552229 +2679162919 3118025401 +4093532996 374985273 +1395248010 1959488045 +1348885137 572559942 +3400751713 2035762848 +2109617684 23831559 +794855278 49623609 +1497211465 389045934 +3096286975 788950204 +3462793500 111171335 +2863673464 727469307 +3951368735 2869294753 +1044166882 643055087 +1528199157 1499387562 +3151494015 872474878 +1834084706 2045928789 +3758310197 3758310181 +1378431490 1378431506 +3947682859 1086902360 +1151430972 1151430956 +301192977 1406898118 +1694785194 3676523110 +1307166265 1657502728 +418708679 1910924366 +2183646604 3126854052 +1389912167 3516908064 +1002463742 232407753 +2950748949 4093174300 +3875860903 1405643232 +3780779006 3201962207 1346932510 +1746405167 215174904 +148959748 3220502680 +952871211 2476428980 +884011073 2022934886 +1336858094 1580910009 +494874730 3644405467 +1833050788 2736556095 +134911708 720679815 +107600337 3919701008 +3697332610 1852428213 +1214618053 2373841462 +2177336064 1293105427 +1106376464 2937847147 +1910725713 1910725697 +1666282524 2599809735 +4268059509 4003998012 +1001581887 967539262 699097326 +651585633 1433472656 +2376938174 3316048137 +3686067190 3553588295 +569641597 569641581 +2821451276 3374824695 +1241244356 998636169 +287381956 3139145609 +2903066593 1574025744 +2864891893 795725777 +3797346629 2479962010 +1419641798 4206882999 +3337941178 3986093277 +921852683 1675663928 +1457944983 1674668198 +3854252178 2980701886 +851962365 3988085076 +709331293 1537250475 +868256720 1209800821 +3357759930 3383115723 +2350024273 3525931408 +2308709578 1791054317 +2333777823 3912012577 +1451468073 2617658520 +2520491660 2520491676 +3451389999 3451390015 +2857597718 3293293172 +1194700126 492760937 +1737106182 1737106198 +2768572401 254717312 +2110125175 1973409616 +2798770591 677784368 +1793707225 655194526 +2435527280 715200459 +1089994626 3362208181 +2243328721 3439459958 +681882197 1346681820 +264980158 2600492319 +3700084399 3716373870 +1133087058 2055102957 +2392731030 419545905 +1691487257 1781332672 +450001250 2606044501 +1662735010 2785219843 +2442778019 1540250019 +3469672593 551412806 +1321718718 1321718702 +1582674615 937973264 +122035721 2567819147 +631789347 2381201031 +2429047214 2572719343 +3658346942 32738847 +2101050145 1168299254 +2033952141 2033952157 +2740902949 1398050348 +3043906570 2796440493 +2751325860 1767228123 +751853342 2852502569 +3501517726 718203327 +3984692528 318626435 +4162425849 2317361013 +3887324909 930026960 +174596318 1072414057 +3205192323 2906187587 +616170557 3351955234 +1032551772 1470905873 +1068134412 4284853875 +1581009445 1935280534 +3806484222 1397146121 +1592309617 3646473968 +3278597361 2468118384 +2189415489 3273067889 +3106133322 2800466597 +1667892795 518697215 +762788018 1364136027 +962613661 1537229698 +84601070 3727470265 +1136552509 3787537940 +977482426 2838666006 +2530247833 54574280 +3612688784 2335585699 +2456559996 1542761998 +629868717 3964391707 +2654914147 1022144480 +2318583289 2263721726 +1426468945 700321680 +3090624738 2172359832 +799454848 2205240211 +2291141829 2291141845 +2685119684 3059808415 +150540343 2773472436 +2848818774 2760538481 +1172356928 3285381855 +1925480143 1772396826 +3582374712 1527521595 +2831012132 3335535551 +4137107822 2640573433 +3363864031 2168858142 +1178391895 1178391879 +1166460220 767391975 +1148394949 1676742634 +2857594834 2821123181 +500589936 3643212509 +464436733 2434078018 +716745980 921596118 +1749264078 3889798745 +3157995698 870303821 +1344023202 3193380117 +139542782 1497937357 +641747893 3963039210 +3371188547 2503392362 +140960531 1024044133 +1438995629 2650281793 +181778002 1617822483 +2040252494 3191624409 +2240206472 3141777419 +1780896424 3260292733 +802187213 646724914 +4077488521 2793846766 +1196779291 1718701970 +2802901644 469474999 +3785940675 3136442544 +223298653 839779537 +1517480926 1089031785 +995050333 3133606754 +1890238360 2844200243 +3021047247 2422152087 +1977313313 1977313329 +3036818610 2758564901 +1218255182 1218255198 +508482734 2266789152 +1279896329 348878201 553140014 +916602221 2388961714 +2839950429 3599003234 +3719895313 459437510 +1088987059 965524563 +2777763090 4290209448 +1871604863 473222142 +3720284962 901678741 +532492895 1440107422 +924143962 277811389 +2732343397 1020298122 +2020734537 3752849804 +975696491 975696507 +786843833 2374269736 +1717972543 1668347388 +710896940 3761822807 +1265566713 3099803880 +3907549336 1039521627 +3850471589 4025097132 +2515895963 2894259716 +4191791024 2827988747 +1301633621 1998402524 +2803210860 223070615 +233706046 2094201962 +1530011814 904488257 +1657419191 4182250473 +1657592124 3051951912 +2882751041 2882751057 +2131783784 1025482656 +3362393575 1583741433 +3429360421 2552611914 +3594684369 1373747748 +779353179 2168579429 +950556849 1907539776 +1288748951 3159175284 +106207182 3307927897 +568536156 3030308039 +1277349871 1277349887 +1954088083 1954088067 +3289790937 2281509015 +1302478824 510302781 +1351360376 1150650875 +670170877 670170861 +1235426801 1162255251 +1471696819 3391452890 +2736417522 1040631624 +1264096170 2114424837 +2332041802 1378808286 +300728454 413120724 2304150803 +1858787710 3881066825 +3101816980 1072291956 +2665334088 1250482928 +230265346 4011986946 +3726709184 3726709200 +1559508350 3530569055 +544783732 2344024009 +1564141977 1555938248 +1864130578 2173695661 +1973876972 3405024257 +1898966927 3178634766 +731722971 3177255048 +2290579231 1056920357 +3676652985 27598177 +2889634902 3600522039 +412125695 3725203388 +417240034 3485374254 +742235273 771582904 +3328058140 1647396103 +1832220452 254447039 +1422024456 1979423133 +2812367486 2812367470 1626659913 +997437733 3156204858 +17152179 1325515212 +4138487739 205620068 2938230399 +3136482067 1600655084 +3443924427 4032882306 +1975073668 3600330953 +667616102 4130120613 624301256 +3742931539 2260398252 +1795014227 2514916659 +559363673 3578433054 +4005399564 496247840 +3997444646 1263432465 +1365033633 34509521 3053871990 +577606060 2475901500 +1238817525 2344586917 +3695854386 2443334354 2917097179 +3274082184 3946853464 +2317381986 216726446 +3246160994 4176989781 +1239038970 1015835293 +3013449744 757516710 +322266398 1527655977 +994632539 2871431781 +2492885439 2542086785 +989060071 1637826546 +3124009220 617406815 +2881028806 79724741 +2670223479 59759440 +2000072890 1696085213 +1677944072 2702890970 +3685634666 2342145235 +125628340 2108512345 +1291707321 886849135 +1283863320 4169758432 +3348130949 2908411212 +1005698033 177796246 +4255812132 717163341 +1982261981 2694684354 +1059619541 1103492426 +2641230340 2219405039 +1150943733 3842213772 +2512411970 3271689756 +3693624359 787760825 +4188470788 98689097 +593020785 121546574 +2493488707 977675114 +4084570041 1718440902 +2719955738 97221262 +4073002181 4047483404 +712321372 846207943 +510681494 1777473473 +4155092900 2216656703 +2170205522 4090195987 4090195973 +1153189036 4165606849 +1249260207 3876702574 +355760789 4137482378 +2226204117 3509405306 +3985684912 20582685 +2170374274 1574218909 +3197715831 1299509545 +1603934781 3164032532 +3570091801 352382024 +1672107830 455559687 +3543761689 3543761673 +1425610900 3054082047 +4015904400 2571542963 +1707780560 2376912445 +1641720154 1698207915 +369479723 3592860578 +3105190677 567160237 +1917516104 1323505392 +1528489568 3411585317 +3918250695 3487258708 +1155473087 440225134 +2027244233 3898931515 +2593253942 2310255377 +507916413 247021015 +3801140186 3745348533 +3237417545 233949432 +3495697705 3495697721 +3335037032 1439990717 +255965865 2910378008 +3550339515 3700054386 +3481339248 404459331 +2991938858 3402717670 +3697221522 2687730221 +3203338112 1701865896 307586693 +4213755620 3911024344 +1125295348 2321132569 +4008953123 3912533956 +113692708 4083308586 +299576655 3592106892 +1455154547 4241110028 +3084462763 366881588 +1102650583 1298687600 +3390850397 2273390946 +3443561915 3618354546 +874765045 2281146522 +2642177039 1919269723 +3723494195 2480212300 +707023876 1157481500 3522712220 +4218233893 3762775809 +352423639 3899907184 +2728222634 3366557030 +2003218880 2003218896 +4291641269 993327891 +3374351747 2113746288 +3737502083 3621393085 +3896812434 3929974317 +333814063 2171610360 +2255964358 2255964374 +1666304052 1666304036 +3931587042 3821244718 +3096000279 2533472550 +1262045814 1262045798 +1868521845 624034143 +2039180262 1014684417 +590217053 3194552180 +830597892 2740013049 +2764334698 1129369088 +2449338813 2411957378 +2851235105 2249745035 +515549750 3977876502 +2865709220 2865709236 +2157128587 2157128603 +834222740 3667343097 +1484160917 2948470148 +2131967935 3619282049 +3774907101 3107746722 +2936691736 2773416411 +2956252883 1991421783 +3189774634 3189774650 +3195018306 209484789 +767989944 767989928 +3166118177 3166118193 +3618589823 133524478 +390626372 3944455945 +556383451 2094323848 +2294878900 4171425748 +2035534349 2035534365 +1071087008 540721907 +2660767927 1617881104 +1710846958 3355750062 4117495919 +3746094500 1590365081 +2364531895 630302862 +1017037959 4109328512 +3254976176 2972447176 +65399924 2532522649 +2012553154 2564882037 +3582684809 3279887048 3582684825 +504184895 2380014376 +2346314016 3652120728 +2064433226 4279415917 +1424068780 1265789755 +1164833235 1164833219 +2766234071 1707935078 +891177396 201048870 +2693658055 4058553555 +749307901 2920852600 +3143151056 3164184163 +1811507481 1291957492 +3055414550 3340515761 +1152218132 822983535 +2180041978 2282925469 +4186391535 3484991864 +2691930119 2633519872 +4196839491 1600405040 +2682623088 644394051 +287073300 61967215 +349057260 2895577985 +3430840703 3989066556 +574081075 1320706935 +3976611927 2011422950 +2068700257 2089938102 +508325798 1481884247 +743704216 3687525412 +3947566891 2452977826 +2024823705 2527080926 +3503620931 39068284 +3230427700 2181827156 +2697530004 2697529988 +3040808081 83576352 +1456785641 2583185112 +955132815 1111839645 +2063460412 3652490865 +1431500597 2258315370 +2103553438 4274278335 3456731582 +863150323 1700452493 +347248000 354506899 +737970950 934039674 +3087092822 732017 +810192632 1084673397 +1688977789 815916660 +3571007628 469118135 +2882042556 1707196417 +751784238 3093089135 +4135619566 3460618361 +657606980 4163458569 +4128820317 3322525300 +570045443 2145378492 +4172202050 251836238 +3925854595 3891796336 +2434514915 3091618147 +2712376625 2279313366 +3173311920 4154921671 +2917234843 3140115039 +1668356332 1552938196 +2620197073 2672704608 +1679960352 3635735375 +1650064081 2762331910 +253975972 2024565055 +2578215591 2440592630 +3836303166 882136735 +2916418189 3182376434 +215819524 1143031135 +615222680 615222664 +963509742 1445379513 +3182031871 2130347680 2441812577 +2298311772 50212049 +3161163955 765879351 +3757373636 123315949 3516900117 +3276188629 3062494330 +1408525854 1203552553 +1095051358 501124095 72770174 +3935021907 1855248342 +1728450535 361433270 +848002865 3264821807 +3163227769 2551009282 +2538899427 3473274628 +1983732505 999712840 +642575211 3054934370 +2252554228 1339927833 +2628356347 1673974206 +2906331980 2906331996 +1863027191 3324653520 +3664448170 2155989403 +4164940791 3282898384 +3101648106 3431719749 +2976963413 2846443210 +1733594169 3810049470 +1708864750 1175737007 +2920822181 3586693834 +723021652 2780540072 +2356421043 3424068896 +3895914297 3632047663 +4171425754 1114831933 +2325073146 1109028005 +1951962669 1416915154 +21579650 2287702453 +2833816096 3233804642 +1386846614 3070019367 +3022052363 3681575329 +2001574730 443150515 +4154816008 3782790813 +2628753102 1986684495 +394742218 3556321517 +661425501 1826785652 +2501778487 659369219 +3077935963 689371218 +1057724742 4200151877 +768561851 32248190 +2101947153 1261358022 +3091243507 1585175990 +207054737 3780967767 +2784941977 3912066526 +1635551184 1635551168 +4281230589 3003710036 +1392270369 3292858336 +1597152494 56937274 +727504756 3072797593 +1774307939 3742472650 +1714482063 1845678616 +1405788377 2969246840 +3790707380 1666615631 +2771962085 2771962101 +782518943 4246116779 +979754329 1861628386 +4013333569 4013333585 +1825656852 2528438419 +3256696689 2523616954 4156569788 +3455978196 451611567 +538257251 3830251722 +1572641899 4209654909 +263884955 2191864414 +546990793 471210616 +1852229695 10770945 +684586079 2604118430 +2817209965 2817209981 +1705084966 2831147606 +666409609 278611384 +602971078 1506097313 +1447210953 1447210969 +3318911457 161813510 +1000017227 1000017243 +1536193958 1536193974 +3541006227 3027901975 +2147586440 2551154868 +791055820 95500343 +1433328982 3548802663 +2094873411 276906279 3544468092 +3815300215 180179413 +4043016698 4056015910 +1412972469 1233930748 +77610446 1472826713 +1006106551 509277446 +3980186462 1323581244 +2981077743 629258517 +924617292 2062329954 +3072713737 1195953020 +2933675605 624065523 +474260663 3383082133 +1695167643 2316899215 +2714408716 3166830452 +2878968091 3092866783 +960053810 2943088077 +2117840245 754061116 +2709014791 2709014807 +1535489162 2642097467 +1219741774 3238286041 +3456104544 184494168 +903445537 3864946656 +1429813696 4125740572 +3357159483 1010429176 +3298086845 881016501 +550928400 3249248565 +3027987274 2807316659 +2287315235 3252240906 +1301017744 2740059829 +3557973686 3682998012 +207223878 3081249313 +3586387194 2104364427 +2392019883 485275188 +3911314422 4133909575 +785084191 3376410056 +3319678166 679883826 +4111711306 4111711322 +1588030719 1996230507 +1985603686 1567421863 +511206339 3129281532 +283706976 283706992 +2924939318 2835475729 +293345985 1197350336 +326353975 3594379910 +2247985471 3099714817 +1198986815 318059521 +3787319600 191202895 +2802773866 990687685 +965354141 829717794 +1421834165 510226922 +340125537 1259027903 +1047532993 4018378087 +1469600281 4257824072 +3534533664 3823970541 +497250988 497251004 +827708182 3223014311 +524877752 4080966227 +3357389679 1975613358 +998244737 58401488 +2170205530 4224416957 +33498233 2644929128 +3368959515 934003844 +808288121 808288105 +3358234224 2332742211 +2571216141 1471077477 +737418610 2165072667 +1126312826 684355851 +3017144298 64308571 +78320896 2704123099 +2769878094 823701465 +2782233865 2541297843 +1176283349 925025554 +3894657959 3882124297 +3645388659 2142194188 +3520769835 226646862 +2681687659 2894343310 +1520530248 3099107427 +4274995018 4167890394 3200136371 +3294784904 2479629067 162633765 +931342171 3505828094 +2077227206 1063742727 +1710255042 997827171 +3820492225 1003110102 +698074553 959988264 +880728103 1884763699 +1183781352 4214829117 +3457514367 3939592424 +2332969116 2376997713 +593020780 3548203924 +1562656111 252491182 +1823455688 1963480895 +1986840131 2956729212 +1814193580 3861253569 +1651290694 924623934 +1118407141 3588494202 +233844600 1645391876 +3895571874 675343875 +4101083720 3945592458 +4079640028 1305694864 +2738544303 2762771822 +1089455215 2826058424 +1454022445 2610467794 +4002100570 4063871267 +1219906536 1593409067 +2983945179 3613274564 +851191657 3958220652 +1501337035 1678914296 +270745807 3991554282 +2755025702 3856176182 2701624935 +651034945 1464596822 +203791696 1865852149 +2414718249 2272598911 +15099941 2411065900 +3810104242 860062003 +3358708509 1131370146 +1826431105 3776588566 +364801389 2937768901 +1713744839 3051242180 +3251033908 2693072799 +3389553241 2062326872 +1622965660 3837377688 +2517795418 2569221026 +1417076873 854653176 542629924 +2940616603 2257985810 +2533434447 97265745 +937167419 711203556 +2684960234 3633084237 +1291194945 3142717159 +970308634 3850536419 +4200841975 571206352 +1603853631 3164883496 +4071628681 1990576693 +306921418 2524277485 +1952656861 625154498 +1600904537 2412606210 +4280501372 545574695 +613457107 1655103546 +3484834559 4212211582 +654395832 2233005125 +1291255413 2647822883 +2445410255 2445410271 +3421618592 1893619257 +2424505009 792542384 +3903428632 1526361563 +2639225482 771235629 +4030125601 3447320992 +3676923380 1620771291 +2857410561 501997974 +1859345548 45789281 +631367553 3202314262 +3451200520 3693590667 +472231795 472231779 +54377307 54377291 +61986359 359991988 +4108457145 954638120 +802001712 3738584715 +1844477486 1274625969 +2735403098 504234241 +3856966249 436118898 +2335273022 3225460041 +2314002263 1994626534 +2584952548 1633674686 +2512478439 2792065974 +282680337 2536238790 +2835191661 2181498322 +1933348085 1565648316 +1494185249 1414882038 +2428027762 2428027746 +1081481454 1127067001 +3715299903 3674206504 +1174032849 4195273734 +1860517350 1615988519 +4141051397 2486204989 +2747121147 3199341092 1448251071 +162279512 2019149223 +1595352042 208617601 +3819094786 1530461219 +4032618774 2016826791 +1777324179 1777324163 +3284071289 2660845416 +2761897489 1003093613 +757736413 4048061769 +58320736 651993409 +1566296496 2810085379 +765017699 725431772 +2133754167 1098167311 +3169104038 33690945 +2577375556 2577375572 +1426881480 1238618346 +4205978701 4229937255 +3783383908 4036535707 +4084649819 2668129362 +2541059526 2175597073 +855258826 2370877477 +2298223223 467511632 +2508987016 2234235317 +1154069549 1988534980 +4084073368 3792040243 +3313241135 3159336096 +2711452725 2403042106 +1046799667 1809108826 +2954258126 21222991 +2911796884 3411100399 +880310531 3347338947 +3205527018 342874662 +3764192303 1634571761 +1883645301 512300826 +3280256720 2583191925 +512274087 4031074873 +638169311 2936129930 +3316901481 2738075470 +1338903318 3076223911 +2012508863 2496701096 +3362686669 2626953656 +273069163 172885090 +2791838712 3398145820 +3979574233 64305832 +3105504528 1951277109 +1445835269 2934914508 +3455978198 485166833 +92406763 92406779 +3202842239 3561521239 +1529072960 2432677659 +3805390039 523831892 +127227639 3877103312 +660494884 1393911315 +672947671 4222073190 +4100865603 210502506 +905302630 367259559 +3997015135 3997015119 +2094379189 962931964 +3454761640 3518109291 +3709901952 3871033531 +3361798365 1302840308 +3482040907 1286415676 +2345178055 2111121541 +1349888268 770314099 +3502281021 3693388564 +1473431065 2970426389 +547317932 116508353 +1182142037 1087934410 +385716152 3911794363 +3159277685 2532220682 +1360498856 3823223617 +2222238012 369571252 +1664874953 355811886 +3886891070 4089192863 +2271078145 1016872486 +3506656475 2139369608 +1579371435 492273995 +2365050040 3699729941 +3360726936 4008393805 +3621026343 2175445028 +1343053605 1813880924 +4272692306 988845331 +488965243 2358633971 +2558914139 1976973650 +2616899663 1513545393 +1540313935 2011252657 +102542610 2971956051 +2594053936 2531989635 +278531198 186594206 2692852319 +3794654659 922786743 +4093016113 1502940973 +3985537312 390638949 +90693313 1132702175 +3883805735 823700018 +2850703993 4107484279 +1384314702 841699289 +2344343238 3941694214 +3176450406 3415031463 +3028504923 2038555342 +1171739235 118348923 +722922913 566277899 +3722284287 1120204136 +1914242261 1919064924 +3217296578 899669378 +586078722 78115 +1250135879 3449094425 +468782821 3782898284 +154909426 601882135 +1010792536 1367021165 +335658238 870873310 1002674207 +2143420614 1165800710 +2281662779 1376954354 +2132829253 1617786976 +3708421816 3535829317 +4075904441 720800318 +2703556174 1324974553 +167839595 715042164 +596510148 1185566084 +525621972 634059695 +2175447998 3830967826 +506644548 1543036584 +575990681 1567808858 +3291572810 3291572826 +412720285 3655211369 +1829134059 1829134075 +4194351617 2418331542 +3683518136 1486132155 +1525022419 3943704108 +2332184331 3751964244 +2206333213 1113756139 +2622475855 3062256199 +1285990823 1365053942 +3104419541 524171612 +3025675657 185696159 2016289333 1704974716 +229809310 2534778324 +1746777586 3636816869 +3220683154 3220683138 +203467383 2389465414 +1021040009 1460741806 +3679584958 1724703 +1281523047 2785765664 +3289171046 815870385 +1308219565 540197147 +2904402354 934421285 +526493370 549025501 +3474393818 3678803261 +825321062 2916852657 +3322892169 1394226360 +4284455765 1484883658 +2632907557 825580332 +3249881562 3394677309 +2512795480 1750903525 +4053174085 2156865558 +1792066795 3159279374 +102947422 115196393 +929956444 2653796056 +2962994121 3827076142 +274243900 4152742257 +2168106595 1123817565 +1541258833 3762793953 +148119323 15529874 +759491525 3969608875 +855123474 1319366213 +1774233418 2001853605 +3453005277 3699487458 +1944976932 2745635497 +1328348021 2601008211 +737366146 2986851509 +2328516869 2173313754 +3095048824 3777426157 +878034685 722021003 +3620850514 1066759149 +1321119214 3828075961 +1244119700 1352093423 +3106435177 2595359340 +324117062 2944562209 +1674231518 4129978217 +2407456492 337502721 +3778988115 3906296492 +1590132995 923801532 +214321350 3794046903 +1092129258 1165056082 +3725865709 1365762105 +3166517990 65255425 +2619466075 609600082 +2464331892 4107071787 +727544249 2918699934 +3901210665 388901952 +2075443248 3716838003 +2955672218 4013654123 +3918360267 224050229 +3589774312 3126041786 +1090559939 636121956 +2014022159 153769368 +741044764 2758058513 +2789603852 3425214689 +1748491120 2146332995 +2694399050 1794916773 +1912257050 2310714357 +3276006688 2212606323 +1133996360 2941959243 +280193732 1157639608 +3000429642 3528849531 +1697898286 2853114506 +955392169 4001723269 +4003701007 3130428046 +2322606046 3431907958 +3044895487 3010424702 +169102144 502429139 +2511183374 2924466191 +502566579 2276842039 +1367404512 83045037 +1927607099 426436068 +2375554974 2221747625 +3067787813 699790154 +3927415507 1233059565 2640594029 +1764059605 1524996700 +3513276900 1660705284 +4089342048 348016435 +1201188015 3617359617 1818789504 +684261288 3697964395 +3054928443 1757068805 +114952780 624840391 +598963526 3659943595 +3047521873 1149622662 +4128843414 4288134695 +380143049 2659200211 +4252039778 994975406 +4041926183 500831839 +2675599673 1160694992 +489990254 1743070521 +2898848046 776409977 +26603849 1881370847 +2252971620 957864680 +691616063 3377102610 +3667126322 2041723550 +1814988640 2906594355 +2198158448 1507013067 +4249568967 2223008576 +127188432 1595343403 +301135259 1681699602 +2676942411 2096248696 +89885243 2853870308 +3275486305 665300551 +218225205 2934604138 +3805378691 4183823847 +1252873384 920405099 +1430166364 2825882640 2374930897 +3808168047 3250669240 +1682657462 1682657446 +2860387203 3882622762 +3006082624 1344261843 +3419738360 295691503 +1300271512 955688544 +1205653474 43729091 +1905340392 108621065 +1236000447 3096422078 +3103988103 3336646528 +672025756 2860685703 +469385020 1190234983 +2489419043 3095696906 +174883771 601055090 +1524486077 3358459522 +1921431792 3184366467 1114282032 +2928766517 66092412 +3840257500 831566151 +747880668 144218705 +395616147 2985768044 +2536938703 4206817036 +3462213854 3132353897 +3212373900 533422812 +3859941849 124092574 +3889890957 2328580082 +2036913862 3859421623 +2339117893 3224300954 +126768312 2635029947 +15576934 3693813143 +719340628 3540750383 +2849366676 627764416 +658182221 3212176609 +1472703185 5367558 +2060502452 2836872248 +1806874939 1106500357 +4150313079 3830381382 +3019331259 157124722 +2742119660 932083585 +3780569037 3780569053 +1492838380 4277868673 +1890660654 564495016 +2164240660 617799347 +2334406732 1443143607 +1911539950 3958824303 +2663147187 1955097079 +843462203 1176133864 +880955934 2465232842 +3443811861 934064924 +2868128077 1801258020 +332238565 295170668 +2493728132 2164682463 +2544102770 688835173 +3341981583 597988878 +2195229893 2847391532 +2465550760 3115883 +1346496513 1488992662 +769469880 3945724077 +1658160511 1057677025 +1264762682 3866298461 +1267577984 247834916 +3370097398 771813703 +3505553055 2361218120 +14935232 650189381 +3110830986 1849692717 +4261700101 3857075660 +3101330776 682619123 +4049350995 1140536138 +1834597697 1699016022 +3081098761 588247096 +3164231819 1912169172 +3318595629 1548955305 4196315806 +2287532568 3872649140 +1935735620 3853224969 +3056737023 3487596392 +3778929167 2741689742 +3904080283 3986792210 +576966755 3369012829 +896711105 3835325120 +2889642693 2449927402 +42383419 890504434 +662091930 3118766690 +3101245389 3405737892 +2087169358 624284111 +94462399 4217165970 +2821510099 2442229050 +380841654 439151766 +4179968924 2662927952 +1013111603 543696835 +3848276688 1033835796 +234245654 1210288114 +1062335787 4061742082 +605792667 1921777426 +1738157951 2528691430 +354250489 636809419 +4192232603 4192232587 +761229815 1681942480 +562407553 3961625520 +1783993691 1096071675 +3017678725 2880151116 +3203235834 2539297987 +1507206197 125834189 +1726525969 1814563517 +900597961 1240978552 +1769871554 3548445045 +1010660278 4005902721 +655628829 619352809 +4087850781 2917929652 +1707216405 1819787450 +3886832132 569752644 +1384491622 3690571066 +2592598129 3227923734 +2342248835 3094208147 +588341738 597598710 +1745090575 1593822193 +3169971932 1304939399 +2229362878 3972745993 +2475813375 1303600254 +2323550876 2705378193 2705378183 +1529832188 1529832172 +1038811004 1713298161 +1931664083 316570156 +3830944471 3830944455 +4176047811 2591644917 +2563700661 2455626515 +837332468 1368078874 +1843921943 3399152362 +706000458 2291857005 +4169168209 2201530000 +881758184 536919729 +1683899880 3899132989 +1716572792 2302366459 +3342594033 2488973424 +1296725200 2083906421 +2173743978 2173743994 +438880122 3585996433 +3366462879 3366462863 +1346539616 1346539632 +290902661 3624562585 +1765529911 1669543020 +503464877 2626173528 +887363574 957462599 +2577264850 2778864275 +3617783197 3617783181 +764799812 117529631 +284886423 1378471088 +2921759417 3751790910 +3476861804 2827907863 +3700374475 8069250 +3297507858 2052762181 +2883463642 1757143595 +1769083390 4237447903 +1034640821 3385099260 +334292035 2156347678 +1782260228 2427214008 +2603562829 3552532987 +1006341850 1191305533 +2963678637 2591073735 +2204901220 1194682985 +3397423338 2992906331 +3698845557 3110447373 +195555711 3630246632 +2452200639 1447184490 +1940837758 1789020642 +3090438837 2943011562 +184430783 184430767 +631259221 2420458954 +2169994277 3250089530 +493581775 522876110 +226023855 3829313144 +2939429486 1636662258 +1879780155 2627014130 +3460647837 1410730018 +288710751 1980151198 +1157379985 705395014 +3408266812 1661542887 +2032309026 3547176586 +3537459835 104511724 +2956059089 2956059073 +1993214481 2289057696 +234525518 1333126105 +1480158389 2540052714 +886599683 657286119 +127808857 42373519 +3719262401 322125286 +3589817259 4285088728 +3527823475 2008065306 +3332938427 1151425345 +3157757298 3157757282 +1050899194 2010262998 +2346653572 1874690588 +1221205608 4264418749 +3840257484 4154424311 +3371059273 2551958254 +2687561960 353058091 +3254321181 3254321165 +775845425 4048804054 +1542587133 3136992322 +3909373612 3909373628 +2551330763 2728764655 +3894722646 2945025143 +138474002 272437850 +269278956 2052841985 +3070142953 1480507214 +3364535466 1550253959 +3987545259 3531874612 +3514805 3128525376 158175210 +3197266987 729827234 +3027893870 2133184249 +1244555762 3104884709 +4233390102 3513070817 +539250146 2066127573 +3346601652 1743000329 +2910983425 2069830694 +2914273795 859688423 +2420586093 3003071698 +1400341772 1898344951 +3575129402 2936183389 +53867656 1424523082 +2830016019 3668664557 +2097514607 1052100280 +2185710437 2067509242 +1721453705 171815672 +488960208 2972129123 +2886921568 1103867429 +4223866591 2989246967 +1504648621 1133308801 +1189858889 3996499182 +3280625831 3089057159 +1086729210 425929450 +1330717217 4256741856 +1482918845 3786734210 +328985753 328985737 +3119086775 2762036515 +1810169030 2675567543 +1162719008 3255533791 +2587003749 579956716 +3908211869 1390408500 +2705228431 1684506382 +1886284295 80800000 +918859760 396418483 +3571075718 3571075734 +1365996674 1825848871 2865075497 +827963320 1748776621 +3807771843 3008929319 +3914121956 3914121972 +2703988963 2594286922 +1767627932 2006731143 +2917814479 2531079630 +1459265388 1485371159 +3105393956 228394767 +3584245433 150715688 +4272599832 2931488480 +4063691342 692395933 +1253915650 2850387754 +3065834570 4117231725 +2459185606 2737991547 +3229241834 2584287314 +1420649433 1499815010 +350767470 840995311 +1153755023 3505948174 +2747023933 729836651 +3440783310 2817343833 +3590925288 4051669943 +899016818 623289883 +1682613307 478185714 +3595602633 3595602649 +1154854892 1985190679 +2774634154 2840888069 +699438154 1638666674 +2990550447 41294586 +3129643015 3129643031 +589430178 2685679275 +3130990948 746688617 +2926516716 2229653143 +3877648216 800530317 +3060193925 2555692547 +3160782873 3903221993 +2662735833 2877276252 1209776838 +3354640766 1119459657 +1081230440 3689000875 +3052493707 28006517 +2313509529 1248925544 +757149220 2151825828 +2660186841 3002838543 +3266725489 4126204902 +3528200185 2579577801 113059070 +3268205772 1954518327 +3427304132 1512430239 +3039242480 2865697010 +1334769164 3747199421 +905376525 12623218 +970125517 3557888676 +3532568399 3532568415 +2314774213 4151216140 +1464289719 2110548514 +2785119037 4067894818 +205131610 2573609643 +3341257506 2772436611 +1607768737 2091871094 +1470978734 1819529006 +2667598593 1317186176 +692967415 4236966342 +955354511 859953166 +4252840955 1419383109 +844481912 3037060068 +782212372 2034517615 +3220639197 1016346871 1414900934 +4155413207 1829529336 +2613196713 2613196729 +2506674126 1594949219 +555176248 1337252667 +4089895146 522949933 +3341367654 3957676951 +708711192 2545422029 +2804191633 2810237728 +4163536442 3841019211 +76565966 3579599818 +2637887288 3151179067 +901762810 901762794 +3726581912 3999762906 654180925 +838020349 2395977988 +348604122 348604106 +3259412378 2531353973 +258753123 2859237834 +1391810139 4080464210 +3689138636 3809883936 +2773494425 2773494409 +3374953610 3505350686 +3216870509 998539986 +2845481139 3253292659 +2025387242 4113140827 +3448620052 2854988665 +2616613564 1087428088 +3201203481 2014244424 +228417496 1186849051 +2671835778 894065333 +1226762975 4205559070 +1602543169 2670321750 +241654464 1823726661 +866932166 508233377 +3365985950 3365985934 +1277666610 342429107 +724280430 589227247 +811990166 2070201332 +2014160472 546255333 +121214920 1099204096 +3358461546 2323689691 +1351994313 2491049760 +2159523500 1295290561 +3039991983 3987102574 +1161320162 3652240835 +809540495 2630656059 +4249296422 1426808593 +133383851 788021026 +1842480690 4292805790 +2452575937 1519516061 +3611803636 3656592655 +2552703523 2607479568 +4094733895 4017310020 +917594520 2973540941 +1139044299 2879126658 +487034711 3031184841 +1966757697 1100039655 +2383359018 2383359034 +3888293473 4120106055 +3635605525 3422982439 +3796087354 2159525446 +1976450741 2580328467 +319649978 3090484427 +3803946893 968088337 +1332069158 590492887 +583096335 3197823985 +2030237764 303052600 +3152424702 3378248137 +458301495 934655622 +2486882854 2123944407 +3757121920 144161939 +2798900167 1719034432 +848952808 2691353979 848952824 +602891320 2310398033 +3574637104 3128782219 +1535307297 3010554438 +4154183890 4154183874 +172705991 4219703638 +2554309749 3121750921 +2843700078 1850835951 +3078769369 182176048 +1290662323 3448995013 +1090964856 3585438701 +1225926407 244543510 +1495874820 1609239881 +3538340977 1918096880 +4149994613 3668485174 +2647747966 4004470089 +3146607711 3146607695 +4087230346 201643565 +2203520650 3988172694 +2263873889 285706118 +263479461 2706652636 +1273754047 3595715063 +2914306616 1156945392 +1792608112 2356464583 +1447535607 2426282153 +3686618519 2181938342 +3152446296 2338175392 +3859395480 4123074867 +1517363861 4112085148 +2120971720 2076706666 +3544271440 3647208634 +771506668 2132640320 +392721523 392721507 +532973671 2977236970 +33859048 357641277 +1620502939 1634710344 +1184711779 2358421461 +983773740 2062023489 +2315731633 3362277942 +1047959810 975608327 +2480522512 1184290664 +320935208 2389613499 +3620231850 4004918593 +1872125675 1872125691 +1096694103 1096694087 +2154006465 3490098406 +1437107323 3208050984 +3716831716 3207871472 +1690816861 1359609956 +2823683172 1455706473 +2659550362 640663147 +2014981193 296777251 +2585138797 4257566084 +1361108388 6491033 +1330210671 1066259377 +792734907 2601468366 +3442838059 910721442 +1803977517 1803977533 +193125134 3626793402 +3245318453 3082471018 +2918861984 167374153 +820985215 2275266302 +3430216160 3220962491 +916980871 2334140818 +3551789179 3875855227 +3323787327 513461032 +4125158849 3524675286 +1383251257 60809384 +1800933483 80199320 +4221689196 357091080 +665494984 290072780 +2110855738 2110855722 +3307916824 2871255008 +1958174759 1326437049 +3525124001 1691929215 +2854662760 1122687403 +2294648237 1181685647 +547216816 547216800 +1124121304 1594333811 +1556453804 3071338967 +1752127767 2118729520 +1931479207 1385241252 +3757091603 3757091587 +271944537 2100921885 +3572351248 2326124395 +3955225073 271179376 +3048588246 3810740721 +3527889985 3527890001 +3726447235 717497386 +1882356281 2087012802 +1678644189 1596540148 +1325095505 3888423850 +2543161294 1852924249 +3436067675 3282530386 +2934466356 4142278996 +1711484180 2851143807 +1668927888 3807747068 +2978661815 2978661799 +1409986572 3042961440 +3057412344 3642310253 +1276957960 3647167371 +878242110 3810213471 +2316733018 3145452459 +1876964399 1290937838 +3435635227 2034512018 +957505337 283895486 +3385261744 1413672725 +2966681337 1454230014 +2631763283 3387389503 +4196324361 1235033875 +3818978289 2635591660 +3953380062 3503840105 +4271403849 318602222 +1100463243 3437088450 +2384836634 3747664125 +2011141099 3905023851 +2654863469 610727400 +1503821421 2045648129 +844715337 2342601198 +2827738048 338358085 +1886578443 2401875701 +32430435 4116070812 +3559464343 1092949840 +3117032056 2521122864 +2514693474 2710719613 +3679310824 595891773 +346027249 1758369638 +3141739581 524871458 129108994 +3495440231 1641193270 +3386010751 893438952 +580565708 1167331127 +1970868914 2677567013 +334973999 2639064558 +2488445843 1540513571 +1699686148 2140826463 +239106930 3783414899 +3189343910 3895392065 +3490176342 479120178 +665936999 3812691510 +413550547 2697138476 +3846403522 3811075524 +1982193997 1252109348 +2495816163 4210366662 +2076262086 3233358599 +2917441934 1282687634 +298532171 3341280888 +3537973804 612498263 +939781944 1714525499 +3857853386 163984677 +2444930677 2444930661 +2475453738 2475453754 +4149100741 355464730 +1718527426 36630627 +3611965643 3034015618 +2528004315 257732818 +87999565 69413343 +1979886585 4261361608 +3677817756 1632900688 3014084241 +402555587 2292701436 +2340817225 3976240626 +2816961115 2890689874 +1304143231 3714418430 +3244452057 757314862 1026116536 +1994554005 3146184860 +2998380680 3743305245 +2906873537 2181966294 +633516059 2356886162 +3847113358 1066648978 +1813975037 837167956 +4251313062 4103310819 +636321630 3034059134 +4115962669 3552123745 +692724597 1145699100 +41457083 3355788249 +2609915736 2609915720 +3414150427 1327793001 4267705054 +307396373 307396357 +3832223601 3983254468 +2754332212 1943080607 +1115334315 1115334331 +1705035845 1092306060 +555377261 345262290 +536449637 3135337708 +3563814735 3023661390 +2539425243 1198465376 +1452517097 862961880 +3302938690 751726563 +4255232669 3500875625 +3947779056 1548624597 +1133602035 2596397790 +191170250 3121197037 +44066980 3330587199 +1591513151 2486637352 +4047372748 3353473015 +2751373182 2751373166 +2399973326 4277715279 +2267122757 1686273094 +2004404737 338034560 +1426381650 254215163 +1535387497 1607345637 2047478360 +2846405711 1670633560 +2495856811 3676851508 +3916714380 236740471 +3446578725 2317546554 +2383770994 499638899 +3592471893 1788257500 +3177529511 3445933814 +3535847053 3535847069 +839994516 3575131411 +645444891 2869238148 +1038858837 3474346972 +3638226649 3638226633 +3091481903 2505487216 +2200012288 1356571033 +4007555985 2630918984 +3586064025 346737352 +2366065200 846842268 +319332286 3029563401 3029563423 +1635551429 1007373836 +3430595969 1714967062 +2850153269 4082592460 +2467497586 4176684403 +1020628153 2100070206 +1036111551 1390076977 +2138768201 3365349304 +848952813 212429531 +4198251482 3335665707 +2431015983 236951325 +1560644194 3518552131 +948305149 948305133 +3189586290 1160013803 +1310543004 2836075477 +2654667948 2666860085 +2807023732 3600322191 +2979768212 738774511 +1833785446 1097832218 +268741796 3680224809 +4023451370 1879132763 +579418191 2902697038 +2622615607 1274881670 +98760476 1615528209 +3560945191 1196146550 +3357748916 3288515017 +3818397378 4118079182 +3871779317 1069386922 +784936203 252754991 +487435993 2508865416 +1597838786 2938716259 +2454220973 3485841460 +1966453437 1133827409 +909000379 3908110239 +603600701 3922535755 +218305977 218305961 +245836284 1703562151 +3359520053 1861075562 +1415271176 2771665555 +2623971131 1888266724 +3873137232 200933800 +2426882191 2133587773 +2666818430 3099932511 +1241075978 2105184955 +992809550 4239415210 +1885049222 1713772001 +1086388467 2360340064 +1035546165 1602469244 +4195377941 3788667421 +2751925194 3259981429 +1862786886 4184260410 +796642318 410329491 +2132636105 3831111544 +2241062043 3539226670 +3085839748 267495135 +585574434 1902822894 +4014210671 386500782 +2835326410 468542151 +3617995423 3042691403 +2962925219 2792641162 +517864543 2713911137 +567399929 567399913 +18913910 1012082631 +1672101502 2731723624 +2748436494 3813737309 +212719915 212719931 +2057956734 2541804895 +1368174054 3543375217 +266919196 135057903 +2511140735 508140798 +2638467896 2261841029 +3917826230 1389459089 +4056020929 824351974 +742797582 3229563161 +1076655324 1516674500 +3127258059 1995268366 4143391970 +336743986 1443633928 +452436163 1829780093 +1363730702 1345936658 +1108936292 1902448481 +232338915 725615846 +1002834286 2260785199 +2209163734 530111463 +3462744126 661698953 +618342142 1450978524 +2250845851 3954768489 +4205319577 798621662 +594298373 3362929100 +2653328579 2405408949 +1311795463 490034697 +2249733397 207863738 +1329213596 1419412881 +1360168603 992601618 +4209547970 3190529891 +2476427911 2745006993 +3662921224 3117688459 +3235854875 1582972475 +2850844074 691053197 +4282272538 4282272522 +693566135 3404508678 +3643284316 908267975 +3459875898 1985543062 +945084212 945084196 +1684862373 3162944172 +1422012020 1468352788 +3884240095 1427014408 +1211480146 2036372478 +1324232462 1496973455 +3889659117 3845761284 +239937478 1232444577 +3550694715 1695716338 +985707666 20684589 +2177986161 220963469 +52521868 685487836 +3135183968 1992846139 +1459102266 580772171 +475672509 1593386626 +903013218 486273877 +3483459247 2281765767 +2926894623 3237587656 +3320296122 2510876035 +2673613884 1605642225 +3570790288 2630361020 +2998755868 2082566663 +2917653293 2917653309 +685145693 2796088418 +2280590627 542223882 +66356495 2315829280 131097175 +1949732516 1949732532 +4134395105 4134395121 +1256877047 3859281360 +2198536066 3427809699 +1712893319 1071197078 +2320987059 2058035916 +2242533760 3945456773 +1782509807 3984635512 +18229454 3961843791 +1227685452 2111066529 +2589480583 2148546176 +2269155984 2057746613 +677430576 2540738888 +4159139426 2740110421 +1746466068 4081700463 +2749674817 2184499581 +1273082072 1741099525 +1253713576 2020573712 +2306529680 120710123 +472493449 3734777528 +2526591623 127324036 +2943559623 4182220374 +362491138 88594997 +1772278333 1174704305 +1771863565 1314549348 +3803993518 2625298681 +3584048079 440280782 +3921071341 3162306386 +2779643169 1001625022 +2492920255 2828963752 +385643826 1634500005 +547466887 3178442121 +1622245482 2708285147 +463075583 1919089022 +2359650775 1063624038 +2093282090 180727404 +2399794842 3333370987 +2783055340 249293463 +1547711344 4050825159 +2368514384 2370734307 +292107853 292107869 +525282995 525282979 +3531015109 3531015125 +811495361 1618990310 +2397419378 890483294 +196339944 2850958032 +2241394811 619071408 +3022001585 2615229962 +2574697987 2249891574 +2713217320 2137817693 +3428294646 3428294630 1528291286 +920056791 727833456 +1657890649 3903172872 +2403778619 3344997604 +230703799 4195655191 +884350222 145734927 +2360956618 2537079046 +31203242 2542131341 +824446913 2114704231 +4291638060 3691482689 +289705462 1706130902 619412039 +974612789 2531578289 +3237095228 4180919143 +626063691 158888194 +4175397840 2547810403 +825519226 4018586653 +2587233361 2587233345 +1308774942 3953607999 +1734337839 3941976302 +3210505772 1786867521 +124570429 3980652802 2715451723 +569312289 2353233888 +1880454241 2214918790 +760584474 4151032118 +3965892146 1365561509 +1669932688 1088926901 +75892129 3220888694 +2854064096 2894691749 +3276894114 4237047512 +3605861104 3978505291 +2341767555 1037334826 +2065055311 319034958 +870698736 2730804163 +976817424 3083833404 +702718619 2328230418 +1045810871 3625216528 +2836053806 1240135023 +3321859251 1682603482 +4205892747 401333583 +768373030 3255995495 +152869769 3775453358 +767760170 627212178 +3007251591 3006537856 +3132692565 1180782026 +1229885691 1638808370 +4124207522 2621196803 +126006622 818119401 +1201724023 2648479785 +2284976335 612386247 +2918453882 1362695691 +616501056 3273771291 +412342758 2529166593 +3987684892 2855762664 +1121375814 2117292065 +2266850085 3628274476 +4171679651 1003590800 +1159070292 363178553 +487667674 2826510330 +3953244994 3953245010 +72149658 1595232363 +2151783760 927638755 +3961831571 3036614400 +2508023335 2909504066 +2126458238 588492411 +2968521655 1088581894 +958387239 449171129 +2544137896 1608960619 +3868112944 3251620424 +1794833016 3776465637 +1521479184 2792996663 +673576774 3874869137 +4018655184 3805029475 +2002429337 2092085192 +2142002167 2142002151 +337426215 3493089888 +890156151 3229175907 +4129904190 3239232393 +660313338 1123093885 +752166926 1637884313 +3798671628 777806684 4073210167 +1496236429 3771177659 +3853739396 352159353 +3231331802 214091307 +1337996212 1066493007 +2999017677 2752273970 +1875738200 1875738184 +1772834037 1302996412 +217192510 2669423007 +750742532 17117432 +1598506796 691341889 +1860846157 3888537380 +3585816212 1307118196 +1731376696 111199666 252934794 1895869191 2393867087 3377754688 +1970394935 422955910 +1675052982 3789939601 +1742858831 1742858847 +2982459863 2947583344 +1290178408 1808207913 +535594043 2692506939 +3130722323 1799662150 +1221419387 374371492 +2326115391 3591233767 +1351495542 2263983174 +3128211459 2294131900 +3102617375 1039412702 +1619359445 2390252457 +736751019 3426821154 +2543209137 2543209121 +281891714 4114249141 +1481873801 2139564344 +2993799212 1540178025 +4271283508 1707515393 +2457593586 920449524 +2453209317 513308682 +3470055357 1443864194 +3582148597 312323772 +1067702777 670049022 +3145095030 2729620626 +247699453 2892443423 +664458893 2665163236 +2130426564 85117648 +1900716059 1937377938 +1621492450 123111875 +4195600155 2452983006 +2451375768 2612093275 +3769298161 991048285 +2364391530 1145431771 +2066082105 363734184 +1622640118 921166417 +2272587018 3488227462 +868036938 3168049019 +3021107370 801752689 +3199655138 3199655154 +2384167429 3129910190 +727469289 726471384 +3858940053 2874485404 +2384467748 427335960 +3969394226 2714631974 +4133767263 1054731649 +2636553427 919134266 +612618261 2424344842 +3474686152 3291949539 +1623122577 3716065862 +2433647214 3352777529 +4200503675 1038587432 +932406716 3698217009 3517018397 +1910056929 2197774938 +256476911 4290734638 +2987810156 3308589335 +3547080369 3626909014 +2722628558 2180367193 +1971759253 2549834378 +1892983252 1924841657 +1151100682 204879021 +1402363309 1437259268 +327291023 1153437976 +1086743242 3259859949 +2538348215 3822344710 +124263432 2967740555 +980644508 2679991175 +3585880153 3493862408 +3825724628 541233616 +146132608 909382533 +312148288 2315450309 +2106663791 444254126 +224007544 1746798085 +4020965827 3686338438 +3101504863 1664812190 +203320716 2682680183 +476381923 2208170869 +3602286483 2488757370 +2445122959 2482617818 +1304898111 2944893224 +1691978330 1927059430 +2962209805 1269582692 +3055102889 1386199832 +289264236 2421309463 +4192274202 2783072049 +3549277653 2413521923 +987361763 2283259996 +1407229126 3499543479 +2823028700 2743753694 +1793816438 3333230279 +4267916103 2625707602 +953778384 1315293027 +3933776096 4226930867 +3128772981 138060579 +1027618579 2132194042 +3818399306 624622049 +3606918823 396167392 +3410466935 2025128774 +3146206350 3288171407 +2657966734 4096101785 +4247145480 2336862347 +879103487 2074609790 +4056283813 1068077498 +1223254311 3008592391 +4120695065 1434749518 +1368267441 2858635606 +1978720931 3630441210 +1786110907 1115393191 +1485155966 3631329353 +917003212 3607659041 +3072476690 1559514693 +4156866180 4156866196 +1750503485 3965436831 +42780896 49668384 3373360499 +657725 1288473364 +3178889321 2953749848 +1105348778 2797915411 2597246202 +3331054722 271327413 +911076938 1058667443 +3363928180 724697248 +2723211415 475932070 +2850435481 241177566 +1960715642 1941241629 +1719044402 3515659601 +3935085904 2338864373 +564916422 3349940129 +435562538 142686733 +3810864826 1300795101 +3954701226 3163853965 +3426502218 63706021 +225157062 322544826 +2090524874 4056931821 +1742043184 1731539869 +2637642557 1297896994 +2381160638 722733855 +1864288185 2984784139 +3664772846 3664772862 +2406965874 1257240947 +56597086 2910847465 +2358508249 2358508233 +1303603524 3042133144 +3135045996 2515090711 +512344118 1222219025 +1539912033 3736648630 +4144307980 3910131681 +411895041 411895057 +3534961398 2519054337 +1260440045 3301650139 +2592370011 806748667 +2165333346 2395144515 +2759185268 3583614028 +2158621169 3870266506 +2452680749 1342838468 +2717268239 94098062 +2536014634 2621406182 +1071141037 2424668434 +3624580587 132947992 +228718373 2599948076 +1670114928 2321134819 +3177713512 2463121597 +3043574353 3853739408 +3581217713 3091294118 +3592659088 2853552803 +488974973 1585570498 +2300480864 991465011 +3257700149 1080115690 +3637474412 3130279425 +800954306 3916818019 +2077026913 1150613183 +4140961983 4228468133 +366622601 4018498744 +4109061105 2137558128 +4099188028 3169736935 +1936142064 2607735747 +3807652900 611796059 +2105237787 186103496 +3170762211 1725344842 +2854304976 826604169 +2401058461 1829732062 +1949193691 2758712805 +1636777684 3713142032 +2398455636 1619265839 +1577023886 2267830927 +2356916212 3110779284 +2193155080 1665895709 +1013593493 3831276467 +1358621235 2801798733 +2321544076 1628202337 +122718983 2328550422 +3322152416 2100510832 +1366310984 1366311000 +1880613726 3550145791 +4079817438 2918495081 +3364618330 1246426639 241470909 +2529209809 2815644183 +2204007218 4290506682 +411590456 2798044224 +3125767601 2249140407 +3782287528 2537979075 +2540709878 1536092241 +3187652231 1022110596 +3378198518 4036565063 +3502883211 1566295674 +1821112501 2505606396 +1767336347 1872445188 +589489684 1676685679 +2957981728 2897566323 +66215761 3883382518 +517765385 2652014894 +1568452770 781558187 +1316171139 38839612 +2157648493 2157648509 +2516657401 1426643166 +3358939881 352197838 +2539290927 755849836 +4004206370 1326513950 +2387867771 2301634980 +764274603 1633923618 +453686935 351327161 +1736059137 3863907456 +3714066791 939133298 +4109564562 746615763 3778434362 +1529280420 576182057 +1915785675 1140625144 +3845877937 2375182000 +1904629501 3011178580 +1858456383 2690577448 +2642684495 3071674910 +3668177185 1242718870 +676819040 3785746227 +1136647887 1980481496 +648857230 1878823321 +373385817 3162748395 +2804153664 1305359043 +1832931118 3967315385 +1898490650 1023760875 +322097659 872451634 +738774286 4101033625 +1451099431 1331829878 +1273033382 421395265 +811416749 3258777729 +832590640 1331885205 +3641887225 2979263230 +3463625368 2526788941 +1794648985 885182590 +1873499750 397882021 +2769465623 469973024 2364817339 +4255459431 2986252854 +3075985272 389782011 +1240993209 712874536 +704699499 1094412942 +3169727866 3841863453 +2636337602 720237965 +2017645278 3420806315 +1449584972 1342259895 +2543386197 4208484298 +3508189468 2045583078 +2999611149 2175586674 +3635346795 2256072546 +2785208167 2370172787 3180480288 +1845990351 82685646 +2089673921 666423792 +1233371670 3496642737 +3357686772 31744281 +2510660938 3720557421 +2719570586 2719570570 +58561991 58562007 +757869369 1663625480 +301845048 2323994171 +580884840 3913186987 +1131556275 1434975785 +3894288867 1214174966 +184857889 2036933344 +2228646686 999766079 +2775955385 827340840 +965347015 1531489110 +2696579278 3550829657 +2079035535 2731839758 +3782013724 3782013708 +2304479870 3629853086 +4164925108 1369158431 +3260290747 3164026682 +244379459 1200050124 +757468698 2626168821 +1485715253 1611521741 +2380282505 3774621112 +2246044194 3783103363 +3898288317 491243006 +4139602226 2008816845 +1287268840 1287268856 +4055761772 4196360983 +3619107806 3153639865 +859119155 3483273818 +31859657 4113062515 3263970728 +3307893280 168956824 +462225739 2869514443 +2940528562 1424316582 +1043367646 1043367630 +518497712 2253972312 +2976844580 1301877223 +4219665142 3845198161 +4118672270 54945945 +1435357972 3259189359 +3935247173 871351647 +3097802390 1095462449 +3593340316 3329414289 +133333926 2239832806 +2803873138 1941676235 +443757583 1563261018 +2076966475 460392764 +208413161 208413177 +3271831885 3352355506 +4034255523 2966313284 +3478859944 3622243523 +275794918 3334961921 +3312498398 2926567273 +137164640 1053387827 +2410831785 2926217047 +4020490556 3814679792 +2103528251 2603183588 +1741399220 718096409 +2427359598 79960569 +3226476485 2200044300 +2140692278 316531207 +3996955100 3851156807 +2000616548 3135580239 +364750757 3733907628 +3131957228 3417800833 +3821418870 3982146378 +3189954942 2978555437 +2471801275 4075161726 +2606900015 3397214961 +2847732309 2305915868 +3988052511 4166923467 +745153471 76929018 +3761288632 2762870971 +2416867522 915286196 +3554961286 3801215328 +3781909041 218037040 +3545007197 4269039202 +455121957 3001245667 +4119729247 1344417067 +1725052045 1776859634 +959244643 1651174480 +3085124223 4190219752 +1749493238 1365875179 +1526190992 3290565557 +2837255406 2927398115 +3904871010 3867532731 +3953078816 3860000284 +3243880583 36092730 +504275997 48208147 +2460278874 1851039973 +3858675333 2897946763 +1230958398 3975045306 +367120434 2755279385 +2093775058 1206006419 +3951594277 3064393753 +2684390233 844338728 +1305976236 913126849 +2916659606 1109364529 +2330762602 2897215230 +3507818497 623391104 +133639659 1964853492 +3622267165 3622267149 +832646426 2590189882 +1199777937 3108163652 +3634126535 2681974226 +4114019433 1054229212 +4136332968 3313447531 +2500210313 565920174 +3405535228 2556832177 +1702214385 3502356581 +2872893660 2782465425 +2266879648 1408818661 +1329618382 2421402447 +3651643952 3539003779 +3264560201 998408786 +2629490225 3944689466 +1710730885 4056673962 +1235201041 4149993167 +1391186607 4286498810 +1690426678 3543088135 +2038102374 2316758705 +914004217 4028722377 +2349750704 2349750688 +2752660138 4072599963 +1140232846 2334700943 +185123887 2941992230 +2678373053 2047386018 +942997924 527537449 +1328811447 1710331664 +1291789533 662552485 +2896779475 2896779459 +1124562091 2276601571 +2977981735 3825269495 +3016056245 1594206554 +3144372531 3088116618 +3345118066 3257475722 +3244837762 80161594 +1602666536 3676825685 +4080308565 817940682 +2859902359 4022774950 +1669557757 2766546242 +2328086621 3476318836 +3211654057 831731912 +1275654612 3415356201 +2726545394 3346252275 +2084791031 2501167814 +2186850290 52263322 +1770338472 210445023 +2497790085 2139909108 +1696589523 3501997911 +468434909 3872831569 +636352852 1502537021 +1184049397 245987754 +3280157668 2878818303 +421149556 4165703567 +2758524973 44009156 +1900530403 923034442 +1089911008 610601139 +2498771724 3901292892 +2052085785 2776280904 +610025962 610025978 +1224992656 4255768600 +347860372 3765761279 +2363740353 2775490022 +4082887551 4082887535 +2665091639 2049909632 +4246215286 491162599 +2418304586 1027683237 +1422605 791413618 +823427142 823427158 +1612698699 2635805204 +1726168357 481902906 +3250832374 4247616583 +2387470025 612464430 +1241300861 3906517059 4125192642 +2544174047 2546276352 +782472904 4186189795 +3937267370 896524001 +495900670 268600674 +1921604327 1987471815 +2012394152 905928387 +515831970 413237285 515831986 +3256189237 3256189221 +1463017967 1463017983 +827640874 3531433485 +1417041691 290135940 +1012170200 3506576141 +3417343553 3890436182 +3945717491 768145562 +1178962424 1755787679 +3723134434 1573034219 +574669163 1458600802 +2424161063 2112067890 +1378809909 3707175313 +3665701066 3197777403 +2696258606 3607687831 +2699890199 1814900272 +1664832858 2422693035 +1177686674 1971793197 +3955259564 3788206551 +2609132496 2703069283 +718812781 1048072121 +2653933051 2327518888 +3166808144 3947114667 +2522286853 1539887337 +3441950499 1749309447 418817052 +3868057411 878081642 +188584956 2918184369 +422971760 231991884 +2909353413 3248465164 +901491732 2859459439 +3512242103 1446912034 +3363646885 3363646901 +3783360482 3184730877 +1838037165 602093650 +1171079487 1170586287 +2195426131 1385976748 +1486215892 1206352825 +1070549417 2708587800 +3118802219 2831278096 +2181955687 1237137522 +3184967087 2282527342 +2565006976 227785988 783306495 +666632455 2482347520 +1265226105 1108848367 +1274564487 1274564503 +2964072397 3959596987 +1880301286 1410966551 +3565356582 2957159873 +2087989963 4134770680 +3651382655 464133857 +772662936 852331872 +2827543116 2608610721 +2123077294 3820893167 +3171500693 714330250 +2861255618 994591331 +517778335 3196723804 +2213490341 1451650490 +829697686 1877300775 +2112469308 1587252455 +4028066157 1641739908 +905069110 576600839 +1438048616 1457837739 +2573013620 3783527577 +1455347641 3865292123 +278009228 2717379453 +498592268 425322243 +3877082625 3938741805 621589945 +688762667 3414868148 +144078032 1423565685 +602962588 798032775 +1390010189 1890994011 +645167990 4284373713 +1575393428 1711419631 +1772737594 1772737578 +2079035523 2530508330 +2542150097 700993047 +1532846434 1532846450 +3825645593 261345096 +942828743 2342296525 +1036637625 4256920104 +2049698221 2153298 +656509605 2535356362 +3047877549 2836463954 +1066497969 2652272214 +1419555987 2692358935 +839192839 1022487539 +3669879638 2290841578 +1417004639 4210625232 158945297 +1739029480 4229118928 +3136673986 1705407685 +3440517267 1720272762 +3940639503 3486445713 +748982122 2970469339 +4213348911 2819201900 +425237395 2038229100 +3865326966 633350343 +2676887747 4020527850 +2479383688 2887729840 +1580494986 4214745075 +2967590579 646249434 +1425547018 3432570029 +2465566080 3633168531 +3558060600 2123654223 +628735165 4049241737 +2146193699 3873304342 +98688096 2727209779 +2949761274 3251015125 +3906301805 3906301821 +1590210136 2380952731 +2722170008 655055411 +3293867435 3152585762 +1700452885 2807785073 +2404080595 3159440471 +784711205 3326759994 +1235398482 1650839538 +2756668831 1208586590 +3753846807 1357650992 +3930757266 1701719493 +3751244881 3559871478 +1368490188 1368490204 +617615102 865247842 +3700490499 94184571 +1553216990 1724096169 +4247906570 3986379877 +884890377 4052311160 +1188299905 12785430 +3569636893 3569636877 +889694192 1796038357 +1966410702 551686105 +4082499637 2747879386 +317962546 4212113969 +1742309953 27177840 +358835330 762788003 +2036864959 999153 +4124794066 3662880389 +1034768567 1034768551 +3023542189 1619248452 +2433670438 2433670454 +4101521690 4082007019 +3343250389 195310460 +2232842472 1784698173 +3022318339 767540029 +3860137923 4128978940 +4242263918 2080868911 +3772570000 2343206307 +235917217 3286489696 +1944006957 2505730514 +2173489048 2467900887 +1861675981 1861675997 +310121105 788120030 +2221148867 1508984957 +975104049 980730295 +4034868826 4064448445 +4185736280 405968525 +3774828063 1357380296 +795365406 3207995177 +2808111440 94752809 +4159064036 595799039 +1178576478 4096976383 +1325044175 594774222 +192851824 2288921923 +2423583383 4279886768 4279886758 +943777236 1646906553 +2629917812 946113167 +150278934 801967025 +2106669963 2106669979 +310672648 781243293 +213835643 2340015780 +1304351141 140773036 +809633734 3186769057 +161734481 2768196247 +2150291048 495945877 +693295932 183402215 +535784687 2180746298 +3046868913 2497092528 +4044369213 3111597844 +1638673077 1996962538 +2815186974 1152300863 +723021635 444016234 +4212943506 127223098 3753624531 +1190660363 3279305812 +280755887 3898670724 +2681936866 3169591037 +2641349647 3858643854 +794263955 432077420 +113791530 3612956685 +1545148178 226447685 +3921103684 797670431 +262883443 497224965 +697523320 1536341504 +1656436805 4214164341 +428998428 1129204168 +489317103 3636051502 +1055566534 3513439671 +3796526322 756869363 +3617998894 1651634668 +1769064688 3995029973 +2929963917 4107259621 +2201742128 2201742112 +3349632875 3077479805 +1555453000 1216538997 +1540494878 2847461695 +3272044536 1419507447 +1580452884 1602896751 +1555610668 584071511 +1878006484 184171449 +3767014513 2680174951 +3777736359 516157664 +4078264120 3802457403 +1770404022 3561703057 +729866161 752886704 +2542726718 3556838281 +3855020222 2338084526 +1673531578 3974623033 +1469867254 2994993610 +2148206629 3086448097 +230195157 230195141 +276031570 31812558 4125448443 +2688318041 3100548414 +469241785 1053469615 +2407993648 51846786 +1839775062 4137815665 +2490349008 2077963875 +1858758319 1858758335 +3675543453 3193546028 +3118538286 357607997 +987484927 1639254204 +149797475 1899784668 +1739940248 3666387547 +966583872 1133279480 +1189202716 3437340364 +4010258745 2182872254 +4205381766 504916727 +2280291610 1375710946 +3745557936 584150019 +2637025104 3206372067 +1727753564 2043488209 +1506399324 1353968913 +3244333018 1608330091 +1116325363 2984418714 +3403564422 3790041591 3403564438 +3296345962 3060913115 +2775381265 2072365520 +573448461 3684566898 +384086826 8616851 +2166301624 1765498437 +429535505 3655367624 4034101097 +2024150698 1723788422 +3242273507 1559284166 +2597327290 2597327274 +2931888006 2931888022 +2925923705 1043936606 +3875277238 1031135992 +1980959231 3740843112 +1383903849 1780705221 +3764980077 2992232068 +1638693096 2821467907 +2831510702 957818098 +2177529621 1723430410 +3504472196 1472647135 +97271669 2991646081 +792981128 3566841268 +1881940229 81782076 +1288317715 43564416 +227719626 227719642 +77767018 3053722075 +2473617515 3233011342 +2533312345 1583788584 +4131559131 2975578237 +211895168 2656028432 +3587191305 2605629829 33203276 +3790214647 3790214631 +60903539 325505527 +917325529 917325513 +3037095209 571555736 +3528051996 2621962870 +2634315133 1572400560 +1993851261 621725919 +155106720 767853285 +1815332594 1199714021 +3091671717 3171426746 +1129420938 2205360429 +2774082333 2774082317 +526587032 4177867316 +233125417 233125433 +100343605 2668605011 +1231559474 1678576046 +3686182649 3686182633 +3473967368 4278695819 +451356433 1793228750 +191721405 4089218441 +1482364501 1818503107 +2724946102 3150203803 +3175043197 159036134 455044695 +3008726307 1923126794 +1824126876 1283383888 +2682393355 467866158 +3939600668 1652241903 +1070815131 347269394 +1450555385 131297428 +1249852332 871856075 +2626053146 2173670635 +818557430 3293357639 +1378269943 344441027 +2098362955 790004756 +783026643 1759442289 +4268229539 549304732 +3478801853 3113217186 +2958559753 3216225555 +2458558031 2458558047 +3796281984 855750584 +4287584339 2712144570 +3440164869 3950069364 +965485173 211435068 +3964435979 8844600 +3816925916 374597511 +3712670649 1169507192 +4036274098 1812200741 +2963444890 2851073661 +1108641105 3165849676 +3052269032 1301120061 +2195628053 1601033977 +3025697748 2873808287 +3525836328 852907605 +2392628424 1217056477 +3030919646 2309554153 +1366716336 3983659523 +3474250807 3186524322 +353123415 2034433254 +830139691 830139707 +1233419447 1922061318 +3874516136 448047317 +4121696083 709447937 +3529054692 105103871 +4071765332 1328141443 +3674857276 817042411 +697077110 2851883351 +1296583351 1607310873 +879864708 3502316740 317784265 +2927230624 1242289637 +1665904797 3978757940 +3222570827 3154537785 +3571233277 3571233261 +2636879559 4014581202 +4238074933 1382285250 +164086167 4235575472 +2356990416 4169026165 +761543779 1479876688 +1658815089 3753402134 +2880067935 2620043422 +1509628243 4182302138 +2528792834 1229817397 +3867107652 512106015 +2444891733 3169920988 +1802195678 4159927145 +2116414939 1890938834 +858500297 1475252236 +148409541 2984614426 81426632 +153983161 734489406 +1390226931 1697600908 +1470742802 96911277 +23676741 2109419916 +1478897145 3172622078 +658069318 88367927 +3869608061 2476072130 +1085559694 1776257167 +1887578840 4108939803 +1169388091 4172096846 +2917701390 1571115548 +3250190402 969002979 +3468421781 114444426 +2309757822 1823300233 +2789796468 952702095 +1102382235 1102382219 +2289740213 2384013308 +3695989737 4229790030 +2505173099 2062606452 +1445734254 180527087 +4047440668 3795746065 +2553068176 510242979 +3211191731 2903087902 +3687622146 86594869 +3049499376 4101729891 +1494102570 1038532838 +3478283719 3940521646 +3677725486 2552226233 +3327363228 1915376022 +4240517416 907258865 +3832764129 2190591030 +4051407616 629696787 +522994949 3168171035 +104504449 3531332445 +4141947320 1680664512 +3561584172 3133453244 +2680446262 828458041 +1500351470 1500351486 +2747386500 1309789641 +3782754871 659569798 +1198240272 2122927925 +3919168094 453835263 +3914608826 3442776981 +19811800 1036445043 +2951460367 495897178 +4143753871 1589673752 +2728767240 846106432 +1203555482 1203555466 +4235432160 1240273061 +2034240104 1204838845 +3532704549 1836903516 +2133157780 3152154105 +2382526942 1810225257 +1732471795 2183327628 +3004221077 2020121756 +2668039325 2063230798 +2968329660 2984559975 +852930487 3203833104 +754458023 2956179364 +572843216 3290464308 +3359963095 3608417602 +3384000782 2482563353 +3536050682 3293586571 +734609530 1741717514 +3380534769 599220838 +494670861 1452045913 +4131368870 1646276327 +3959819334 3548729911 +2113184694 2412243350 +426656174 3839870234 +2798778135 3012032806 +2861428422 1775366898 +469073300 2541006841 +1152482304 593900563 +2179767391 3866765726 +4160506005 4146479772 +2364214331 3614014297 +3777691527 3777691543 +3413667562 1813313270 +2360090986 2992254326 +3237436605 4042114320 +4262929295 3062738303 +1349338600 2214923325 +2395304387 2211583466 +2080616755 1825567564 +139167084 2061699329 +3127701053 2640167499 +832590649 1482883774 +2465010829 2465010845 +536745520 3074397705 +4172315979 3369417986 +2681388650 182489924 153113005 +4186389061 2253898735 +744339307 1116192116 +2818017959 3068751012 +1469313492 2648024238 +610270941 638790266 +3171821243 1481046130 +3478251540 1143704308 +82603671 1462900646 +4140793301 1570969162 +1227896850 636605439 +1109319618 3633987171 +1083725534 2379267967 +2178678203 676359524 +643046217 643046233 +1023844683 1550838036 +366007551 744341831 +1985908787 457526288 +689406365 1291913762 +1675989130 1112564670 +2136305801 4236257198 +786316980 1809620031 786316964 +96660176 3789006197 +993391640 1779295464 +1627561797 4230003091 +10794774 2434819988 +390389348 90838911 +2328963924 3678876975 +3459426945 448948480 +2780737378 2107712942 +3656470090 1902694093 +889823649 522809462 +2613196709 3619526842 +2214027399 1164768384 +1503454316 3689342712 +2247797455 3097158606 +3642103786 2051624517 +912117537 2289152849 +762322779 3800128580 +683163526 683163542 +1925656761 3680316041 +1022427702 243213094 +2910781508 4178668572 +3350414780 456574705 +2693346513 2693346497 +2212073974 2369330717 +969386331 298496993 +2932063485 4182969826 +3925894591 549846657 +3987398555 2461808933 +95075602 1466389814 +2943117694 2779386185 +3573977278 391502623 +1304343708 4281749895 +3341148582 648165463 +3716717626 312109658 +997519134 1524395762 +3218944377 2184503678 +747213008 1282982367 +933330865 276414038 1683346178 +1671238300 1816415121 +1089393740 2214081441 +512316319 2972623688 +2033136051 2018196684 +158888197 3986287308 +2721551615 80452284 +1995578881 1076181910 +892885569 892885585 +971838517 3142090129 +272843331 3705753461 +2771427518 3381463817 +4237380559 1740265176 +1687108400 2105158787 +1021357510 2190261229 +2397059922 1023238661 +1809656718 3255149737 +3175429126 1814090618 +899284980 1433267481 +3125543061 717991160 158604873 +2576297041 224576390 +2605670249 2605670265 +3605406607 3679058446 +69932740 764496004 +320527800 4097338708 +4174918561 1566131830 +1134478959 1374779357 +853380490 2630209595 +4116215264 4130675327 +3598626795 2490298100 +2964114674 302424293 +1486942845 39697099 +461687163 1769031208 +3957549898 4043063475 +3170762226 1947629466 +248713325 248713341 +22351959 526067728 +1716480890 2298884363 +2218821409 1385478368 +371846953 218332558 +3532024595 792424429 +3470848083 4279915180 +1644596622 2286011150 +1489648654 3562834447 +2709385068 2772428567 +3666569223 276087552 +638533490 1543561331 +1959971546 1305809589 +2181918632 1663485309 +2248380040 3184693424 +765987404 3754719516 +3321859249 1649048240 +2824572489 569026386 +3422881511 585758406 3422881527 +2483379522 3358109515 +1509435116 2376418711 +1575495522 913702723 +1117568938 1117568954 +2172279305 3701193784 +1920561374 2723482634 +2347187085 3389177572 +4018368060 3581922532 +156229260 884692599 +3476597241 68328559 +3993321045 121708508 +4031764998 3686531042 +3113616253 1073397481 +2427858679 805892468 +1628791695 1672198670 +1928304004 1932025545 +540708896 4039433624 +3770613892 3050830408 +654964745 89980796 +502437839 4091869905 +4058986721 3163982368 +298084050 3392003205 +2171389548 2114246039 +3247122800 504511299 +1284732323 3666665190 +733019832 2540450116 +2960447072 669874483 +750425460 3719906693 +4204606116 695646249 +2690231835 2284655762 +2474420341 3277253865 3260476243 +3353733958 4109459233 +2251547594 2255138098 +1042818269 3056732148 +1557456908 482615787 +3569986686 2004519519 +2411719901 673308642 257126613 +536042931 1641986772 +2188525109 1206566362 +186371960 1127698437 +3548708279 1122188835 +2969039410 3360834725 +2048708594 2269488597 +3264671939 2502668976 +1728383061 1855230128 +1129343149 2761214034 +3957098165 3155130970 +3310674611 3310674595 +1849496657 2220749814 +2777003100 3984256199 3984256209 +1277619464 3472687589 +979161618 2723335028 +3658398831 3023217326 +1515936898 2610094219 +870641211 65263848 +212231170 2794382324 +2653909730 2653909746 +4114439972 865912255 +221090830 3435139609 +2124516907 1736188094 +2523727884 3651382007 +153854052 3551362409 +700710902 3045847121 +2726695322 2726695306 +2372186737 109373424 +1125739082 2639875636 +775203891 4025160794 +3433360454 3433360470 +2685893023 2750707038 +1605298690 3074877981 +2178571585 3062054502 +1034965656 2762801172 +2469428942 3437352018 +2128556813 3328007524 +754559999 1031157389 +1917690293 3411684553 +4016726328 477563707 +1511879606 2455578513 +4146280431 4218490168 +3644428865 1439824742 +2937123849 390420661 +2411336497 265895382 +874307993 2725716936 +2653230853 1666614592 +3136413488 3572593291 +3999292781 2441995611 +156361066 367385037 +1351097319 1844286151 +2377533037 2196823442 +3887411060 909751183 +1382955008 3548528931 +1367886275 1042697354 +3113126111 4200691464 +4179689700 3216900312 318007017 +2220404631 4003228326 +2042875852 2067799585 +654019375 2365332216 +3254732632 3168620429 +1377170194 2057706393 +1784320299 2542962338 2542962356 +2363609501 2514286962 +2934800243 3537871386 +3797178923 1497160134 +2017871286 1719098262 +3516162798 2046752483 +3265028217 3576422014 +1737593106 472342341 +2870131323 1221509929 463634608 2330469251 1003391786 1354823367 1718271088 +3126055065 3126055049 +3013999557 3969517946 +948141939 1778491930 +3153727163 2779066482 +640849099 3969923988 +2639816049 2639816033 589803750 +2078693458 2100648910 +4100971960 2216298683 +3435563635 3863509814 +1352682704 11280482 +733418617 1245002366 +616861775 812592216 +1308495166 82761878 +1623159002 620832949 +3887687964 795638646 +283418378 846770183 +1335120368 2613183307 +1015307821 1485184377 +2098644680 2588461936 +2924632731 111452676 +2967087548 594522865 +2000550200 1610691621 +3052691428 1404236799 +20017588 2497052249 +1542697961 3682851150 +4277114557 3091521922 +2256780684 880112032 +3431824071 3440912836 +1720758837 2865269116 +623379316 4059918233 +3671031747 3671031763 +3091014465 1228832576 +3228972941 2266591986 +4200164669 1472657154 876011134 +1102650372 2053577289 +2826974177 584166207 +3770172435 680592109 +115218710 4234951622 +2018703554 2018703570 +3031134507 3357367950 +4188575076 1751329919 +3011258998 2819993153 +808197262 2858827279 +1158253992 1443495787 +515071116 2411964576 +144547359 2000591050 +454962094 2962021945 +2092745631 988019274 +790032433 1377574182 +2020447350 176207313 +3436268403 3025030157 +2093789524 2093789508 +2700784354 1286052298 +2656440510 4286339849 +3522114425 1006521835 +832833342 1664575113 +3410493153 3814079551 +1635985687 2558111536 +4102173348 265349273 +493719189 3900142748 +2817246977 1495942784 +3681566111 280035678 +3532488838 3042286289 4039949562 +819362825 66433976 4090096315 +1590989871 1361913211 +1387793596 4089187303 +1527481103 1646219406 +3657398793 4264345887 +1179354376 141515237 +795323730 4063614995 +2664197612 1863551233 +2146609143 327193204 +1436865476 997627698 1846428923 +3616900269 279069167 +2893175664 1924623477 +2906301000 4216158045 +1271036575 1271036559 +2933990385 1060362505 2892756421 +670205298 3925150491 +688575841 316916614 +3247708814 1243991449 +2567747144 4006376944 922940253 4138015587 +1162641082 1162641066 +4114574414 1624735449 +1459102257 1083252780 +3780023284 2729634063 +425987749 2642611635 +631259220 2403681327 +3800983518 2217575017 +1447997841 1616666213 +2158920279 3680428994 +3268979881 1341421055 +1140267771 4177492274 +1257667206 2281890039 +1762647921 3573333734 +2523342496 1684131315 +1140496486 1925543010 +48223881 3520738872 +1184393691 1549113725 +2691850652 967203911 +2843886737 2843886721 +3954001515 1824905844 +2153634911 792895772 +401415152 2588080853 +232248435 1036218636 +2939184485 774872556 +2345523793 790309366 +987810861 3003837767 +636945112 1616583719 +132845417 4237517006 +2492775183 4112677016 +535053301 693566122 +1449695938 3366690677 +251182137 3398454696 +2129860666 313467723 +2295276320 3851524589 +1775839926 1457405063 +1651517146 3498912043 +845556591 3319160750 +2351284222 2641181919 +1324835379 2188351066 +3118989867 981952078 +468857365 1667140358 +2187003423 2187003407 +1357105916 3212242694 +2560006498 2534634819 +3361895373 120809655 2304412900 1435690400 3081968699 +2898914506 3420439021 +1514371930 1916481213 +3236838320 1728574979 +410606344 2399817117 +2816563249 2572021549 +1247152463 1973001062 +601859406 1058905042 +496580981 1612202121 +1398544556 1398544572 +257410480 3549823832 +1140895338 3243370406 +52644557 3180249252 +3327476778 3167286418 +1725252533 2528744938 +74916344 3019712147 +3199097319 326600374 +3367997591 2175894526 +1895339405 3011573424 +1877273035 3507037314 +2761701920 3208620952 822550267 +1358791007 3725764766 +610732296 1237406438 +2308265194 2148838477 +2446957460 764406265 +3399652983 1420270798 +1384983533 3778815492 +339396251 1938204164 +552817769 552817785 +264919502 2844483417 +2806122272 1827747685 +1260234887 1260234903 +502078046 2051047913 +2891907684 3554909784 +1305457003 3908324194 +2291139947 1706592116 +1706844959 1263353069 +4106376757 2196616572 +4054014509 1626137095 +1067115733 3745346998 +2051153607 1024881494 +1339004064 1137113075 +4236482150 3911565953 +1294585208 1294585192 +3734426489 2762818799 +2489135956 475531884 +108702813 2417841780 +3073356543 3913463147 +3736208732 3712615943 +2698727436 1711488794 3878784627 +3695167382 1315385639 +368791600 3399433091 +3293612380 1724398535 +1404319355 1404319339 +360398328 3372387693 +346455736 3768614592 +1389860332 3904303383 +208949043 3457723738 +4235998096 126167989 +3642957383 424192470 +1283306120 3769831861 +3615742807 3611976898 +905813339 1497282116 +1550446041 2294180038 +879802016 813296403 +4007142494 2133001602 +1272898831 567950065 +2981476551 2282873152 +4191608970 3611523387 +3010709334 522700343 +3213259002 3213258986 +2844738779 3347670226 +3394537192 3312874704 +46200969 1887735669 +3845437982 4026596649 +4002861512 1132266218 +1568033865 1782191864 +1047492214 967954081 +1352968633 1490930590 +3683630889 1999521940 +2073479694 977245081 +786994082 2298463342 +1245439465 3310022104 +2644652544 864482327 +3183825068 280501428 +217431317 1258018761 1210677343 +1862473956 149543128 +2633755136 2910965922 3330406402 +214076600 3460531629 +3018623470 727523769 +4239710971 3514790847 +927055182 927055198 +3100131260 2671531239 +3964336875 3842572276 +2177820859 330849906 +2702153715 3625483196 +2765431330 3685520679 +2816139592 256118512 +1761635493 4037740460 +1440781449 3112817582 +2365138779 1194914898 +2365138771 1060693946 +1065755680 539680357 +2906454532 1127168429 +2356334689 512631367 +1794302439 1129946793 +31593845 14580736 +351705523 3006526668 +428141909 2168560842 +2013588272 532561027 +618722871 1159960710 +1643083622 2449012097 +1860848467 3990131628 +2296293761 1923132839 +837646976 416798611 +1665051554 3718787093 +75378188 705180252 +3648462432 3062157619 +2906327506 2720234694 +920802567 920802583 +922095909 2858220844 +720974830 2488057785 +2965829198 3909409433 +2964877545 1379648623 +3058781898 2359277002 +2472020229 4170592972 +3093501833 3439201454 +1521678098 3652907333 +2536948426 2631803941 +1424707344 1424707328 +1576248536 4163731856 +2037021245 1604218388 +1874763448 604244280 +1511950014 3687520862 +3550566645 469698998 +3162527873 1057706752 +2392938496 3207054980 +219468852 2819869855 +1044371317 1937780010 +1504904179 926183776 +2508502565 2508502581 +3116958319 2889545233 +1119851883 4230504828 +4038293213 4038293197 +2942188124 1834344135 +3742650455 2214230246 3008127444 +972560841 177248110 +2741069929 3788158783 +1312468389 3101077775 +801278441 406788568 +2842233707 459078004 +1968214701 1698872129 +2917368357 3794133050 +3684135587 1476769680 +3985693864 2735430781 +855545165 3509315237 +660292990 479524446 +1158286591 2916251006 +1044727990 1044727974 +3653876259 4220519708 +2945496476 2945496460 +1678696612 661365289 +1616712832 196134328 +2569263519 765984842 +1411995883 1746336244 +2896881894 3071058433 +1068404760 1473041869 +2607335527 2607335543 +769889838 1799711353 +734448422 4152591984 +996671234 44587406 +1534269302 323937089 +668269480 1548233085 +2848781677 3131464324 +2604537391 2445077486 +1851118900 3843989721 +1508538627 2401009596 +3372575858 3402353165 +2736807455 670635095 +237798159 1595035790 +1436915581 1353546178 +2103899618 19700702 +3422948009 3598895128 +4136512917 1446227002 +3577074662 2310837015 +2025837710 3021333006 +3035317571 291375210 +1584317620 1549772623 +1271665656 1245933435 +1482207904 1017420896 +4003681637 1534730378 +3832466820 3937407684 +3661531025 560949584 +3405455094 2972492980 +926182322 3582767500 +2753845777 1983498448 +3996282346 3814917965 +3863208718 2329833241 +2971179591 439032704 280681920 +3843835919 1007596184 +1018286055 1927956662 +602835245 3179409860 +2736136733 110089768 +1312306758 1753051169 +4139931958 2410044161 +4198661590 3418220338 +219796908 3348564086 +1543886581 2378163354 +2409120758 45284423 +3998305255 284851382 +3220519365 1168542716 +718756315 4092621222 3461544160 2905540777 1292056418 +2317788311 3354440364 +2042347624 3406205084 +2858052396 1482077761 +2166320396 2398317857 +3856042552 146511419 +2757247732 2867947033 +1156818362 1802062316 +3081675831 1592558224 +94005875 1159041818 +2869188123 4005147511 +2994878594 527300275 +2006575205 2621273763 +692289594 2389365537 +943989424 725244610 +2976470973 97853076 +2378277744 1963556365 +1605450949 4254630230 +1423634431 2523394898 +3987366156 497287328 +4066358768 2091608259 +2578632765 3943592756 +3038432974 3038432990 +2114495867 3801907373 +4097772406 4114549447 +4252964487 559374975 +3619523854 3484139404 +3301434894 3568248857 +3205263707 462844484 +3287535262 382616255 +2636188992 3750292139 +103585207 1865395984 +345118957 1759305601 3938718784 +194042169 1845884094 +2458571403 998863042 +569473989 1979681580 +1066131099 2486129858 1066131083 +526078423 526078407 +3954130264 3184271603 +2247281554 3854372397 +647959008 2892571571 +1104718337 1926053892 +1975373924 3184463231 +2071005873 2863606093 +481689247 3514815582 +1655558451 2325762906 +3779114289 3386719280 +3221405364 4166137167 +2377015366 1333890615 +68705682 68705666 +10396164 1028844008 3008255737 +1896576311 738821510 +4030512608 262072243 +3346804917 2697366528 +1122194805 1122194789 +1114412820 565279359 +4086887527 3771252256 +635144847 664477464 +644475476 390525876 +1056401577 2779544600 +277382773 1039982618 +507383663 2609607698 +4275852732 4040881905 +2099849351 1228926355 2395655296 +2108323068 2067450540 +2659799200 841608179 +1902179727 178425880 +3700950675 1429730940 3228362106 +1122027818 1910287643 +1191178380 3182714016 +3219855403 1243024290 +773483460 1469556105 +3242814884 426990628 +1993040631 1993040615 +382049787 88960702 +2885348419 3960003120 +208151528 1878033981 +1784781689 4037525374 +1248279150 2014009370 +735223122 1317906437 +4008052202 4232587318 +3834447978 872693453 +1540145867 596679399 +1667946871 174317556 +1055525475 548894032 +2262738528 3069933694 3787031266 1060506062 +3638349064 1805042589 +4247293051 30746020 +2746580477 3015005506 +444039353 1663017790 +158722448 4105173193 +2618315103 2167840284 +2935174218 239056865 +1890516515 3257457715 +2704559911 2071664647 +974345470 1547314274 +369402993 1344753921 441376230 +3007576438 3536680643 +4156196242 2823583166 +4097507580 1961004209 +2465538859 3807640643 +2596758633 2596758649 +2744270482 2744270466 +1408083727 3487377085 +2944402356 2964142569 +57264850 1502707582 +2446653924 406397391 +3726182194 3546698661 +2938991178 243985005 +2197266883 4006847978 +316926373 1640550074 +3780101906 441753806 +1869980134 1869980150 +1126368234 1126368250 +3202576037 72154076 +2276674644 680677801 +97674355 2637439244 +1066491555 3034053276 +3688242332 3688242316 +3755481530 1465979434 +3295042972 919648327 +2190469772 344865377 +873951223 233216628 +1332987141 90843434 +3787157506 306569245 +1371939038 2565193065 +4228202450 772905310 +1618912763 3384573746 2214706427 +1584761743 1107997208 +1294253064 2027159709 +916740325 3921145964 +286671721 286671737 +2011159597 3798440658 +3252127840 2253106995 +547186731 2395224930 +2497056106 3069648347 +1312339839 2722684136 +938631626 832068389 +173693297 3174747366 +835976580 4105705173 +541166872 659576499 +207579115 2808995040 +538037357 3452608813 +2943259225 2215666184 +1800863827 3531388096 +850981914 3009707491 +3041316137 2272589720 +610873431 2828474598 +3944193124 3567721894 +2334025047 1473873894 +4204387130 1795721731 +136074743 3147518928 +3182378964 2925779699 +2491481595 3994131248 +2152195831 2712724362 +1483415713 652900708 +1224189146 3084419883 +4249988100 4249988116 +1356887194 1392269790 +3468350228 1918901451 +2420609890 2192376661 +3666770906 3897358379 +2359966774 2784807185 +1462963303 1698433823 +2689331582 3582798175 +3642221879 4154316166 +2530161083 3963401551 +96569535 3467265214 +232377989 1390418764 +795793703 3011245341 +866873804 585376823 +3359547166 3359547150 +1325163354 653083148 +2336707692 2907301377 +1974758923 1443445570 +3751176067 2785732455 +2568902909 130422347 +3895904150 607924529 +60854280 3183656093 +4036238084 4036238100 +3559115937 1117521216 +2923459249 4230649383 +1921312514 1228384291 +3259468068 4204585919 +3119523171 403364572 +859980593 1771367873 3796878886 +3842209379 3883097564 +500259413 1368689990 +4146249013 1085266538 +4276969331 3266134554 +2363571741 3818178484 +2255668703 2242739720 +2846990733 1890617044 +3286452501 1942752266 +1481550780 1342270192 +1770285268 4017161647 +2697336423 2127905824 +697539211 4267460820 +2562341016 86447963 +2436575927 3830002831 +298605248 3300056147 +672240188 3630009831 +1383174289 1506186310 +921359927 2863609990 +646026605 184433284 +1444285333 431242140 +1822797743 634800025 +1075204514 3445622231 +3038650952 1067434357 +3108662703 1568521809 +1754757319 60632558 +732377423 1374299413 +203202443 203202459 +1161424196 4015830073 +770201021 770201005 +4251775460 3598764543 +1153853698 1180126773 +4117351083 223322831 +4209369332 1818593097 +387334404 1544051039 +1700137942 348948261 +1420648148 2297749996 +4268242016 3061009991 +727784707 1638668849 +3222579848 2103473759 +1882694964 2331346313 +737651010 9929979 +3243623113 2308092728 +1012029088 1269295801 +3700684288 3974884812 +2180962885 3898795935 +4291264284 580811779 +2214772346 978436301 +326976556 3660730689 +453003573 3061005930 +3791982588 2729025968 +3691162649 2421063330 +2655783155 2655783139 +218292520 1224752161 +3208791174 1658969123 +2699830181 4173077676 +691558469 682816652 +2493481351 2493481367 +3935878402 4273359205 +2122157098 1235461645 +59016481 59016497 +796748659 896542234 +1993344051 1014406234 +1937185290 3464363451 +2342932700 3000060497 +1556967697 677969350 +3689438 916418175 +2389221334 78880241 +3362188680 3362188696 +2277583421 4061494804 +2942202343 4172107424 +2229183301 1978012721 829659600 2627716380 4137792444 +1057588279 1929060998 +2709557826 1895001162 +2954350039 512355895 +2884658040 3140563955 +3505998148 716271672 +2625865341 115488420 +646376493 3546663620 +1981419253 3758459818 +3749208305 3145767782 +332916890 2929442854 +748878279 193934422 +1102699197 1374868617 +1131978049 2011139423 +1765260685 1134390971 +2537991043 2243873648 +3027045567 1732982890 +4015797589 589821130 +2910518441 3248209422 +1418625450 3148514361 +4100505582 2934318009 +387911744 4076615784 +3265801403 700344932 +368654975 374805992 +1114440936 2040445245 +378210868 2967539673 +260443495 3607566624 +846204680 1852287371 +4209405664 3636497061 +2152147593 3987030501 +1226710307 1030217216 +187275515 2373702450 +3413074497 3654396941 +4148234094 2841555513 +3724202378 1589562603 +1477398723 3440861461 +1038833316 494494761 +2205465870 4274363663 +2608226827 1982186361 +2969513635 1152805532 +83999554 1723170050 +3331425211 3331425195 +159833991 159834007 +2395338882 1134965923 +63387634 3835498981 +3597792288 3597792304 +1269434142 984167465 +2799726232 1263409485 +225412381 1133415604 +3000215781 1748164716 +2414869947 3712340374 +608729588 303561487 +260563621 401197484 +2690957972 312364783 +1714338398 965698047 +3693448087 3411401865 +1299041333 1196865547 +2101265893 2190688081 +1770567970 2679725549 595598902 +50331896 308714899 +2308723359 3389464545 +2241392550 909864689 +992181351 3925662073 +497774953 501450840 +2944716915 3239322906 +3151003649 2855895446 +488772812 2006522404 +1658597164 4223895291 +2517036576 1290329203 +1440697563 3141713065 +755790840 8662029 +3664288857 3554131599 +3475100155 4226204328 +553953501 3612726242 +2057015540 4142215193 +409254692 2324863423 +3347704136 407701091 +3234433021 2148498093 +472552785 3367544365 +2138549229 3504238148 +120370349 4167068763 +2545857171 2751346531 +633370026 1482113554 +3141049294 3656664754 +440970943 527111848 +3538299231 3538299215 +3317114707 75674560 +1764536240 1096323605 +2073310957 2001893138 +3244639975 1500421536 +4108779982 4108779998 +207161596 4123312807 +2801924472 2741164358 +1307714459 1307714443 +586410916 2851861289 +3079649029 4231863500 +2628946388 1579091984 +460684816 1240822563 +4105194989 512404484 +4058443085 461869092 +2904288243 2904288227 +1727341710 3252921234 +4248643365 2988771134 +3986191730 2030101093 +4177884562 2509771973 +609943176 3275665419 +803974002 3791578227 +2801953485 3850205220 +4267816658 4267816642 +4221050447 2708737164 +3042512052 1664163160 +2014655002 593354475 +2670216128 2219659660 +703967918 3150465017 +1218398171 3326663582 +1176721318 4103083750 +1096134540 1709398391 +4169443310 651451311 +196480568 31624403 +2122191234 1846620286 +552651326 420372361 +2199585606 2844141367 +3633116755 3760302289 +3269065702 2737277719 +4196244905 126854185 +104823058 3162665476 +3745397274 2297788157 +4079357120 4079357136 +2093092224 2404188638 +2628325406 3156500265 +1293974378 3559016397 +3465148193 4226727047 +2845525170 830768550 +1928125946 2097703790 +1013216916 2787551983 +3713543598 533719289 +1408269107 1408269091 +1006262926 457370441 +2085364846 433936687 +1865861053 546634443 +3655198461 1930577890 +1420039436 1246568929 +317995794 3900243271 +1361489965 3974584018 +285220574 847145482 +556911935 1220226282 +4107139056 1346195139 +948812337 941366064 +3469655596 1439472824 +3935191232 3630985685 +3521072109 1334085124 +2857701121 2836111322 +3747423112 664727307 +3139361159 412118934 +322801388 1563693568 +2735043805 2123823074 +2398372049 920798992 +879501510 2994984209 +1558036963 4263557328 +920550406 920550422 +3590977110 1202637169 +2483168312 2180558085 +2173393929 1297812325 +2083040432 3772768836 +2384357814 1876978055 +264026360 4190473244 +2864329375 1646112862 +625353402 1734912715 +2678737005 1563795140 +1305330077 401066548 +3411826950 677389409 +1740060275 3094001434 +1116116191 2799912783 +424185568 3808044609 +89607149 1433175570 +3037976092 708447761 +3159756522 1702459995 +4189744635 461054514 +999381084 567154887 +2927194411 3559728802 +543965525 543965509 +2922877896 3385388695 +1149449981 2566920180 +109085053 3108755394 +2330718903 1994373940 +1742573770 1271590381 +2002684124 3318837848 +136308097 2088149158 +4056180408 3841055044 1345172397 +2644831857 2611174384 +576233567 1515565222 +2009938490 3524438347 +3284538632 2950395562 +1518021332 2643827339 +664409946 2979185341 +3328583360 765189752 3772607643 +2704443874 2760838851 +283044962 4042137162 +1071273576 3971351997 +1855508814 1754365401 +3242329362 1290664787 +3977537834 1580064230 +1671117559 4172475266 +1315266557 1630557579 +1207334832 4177422869 +1296166033 2246652996 +2650430575 1234880428 +766540467 2681284549 +3777822796 3319232439 +689585282 115209301 +860081492 2877080448 +3189301826 1636580445 +694695421 739048788 +1393582948 1629906236 +3603666688 3480438939 +605500733 227069698 +3977835583 2101903144 +1854986256 503587125 +597703245 1648084795 +3122525045 3761806182 +3763014817 4015765876 +2442325496 575446381 +3432861647 959207963 +3524262757 3206416697 +3526240853 583390956 +3596888293 1689018476 +179852944 179852928 +3254211201 969168305 +64971659 2015762104 +1650228136 1462554563 +4270883553 3127309133 +2775173062 1042504290 +3237146816 3237146832 +1012709637 452418588 +2543685486 453560889 +3017160754 1762638841 +67810214 3649831842 +2633829785 3497493097 3143395272 +625119475 742863747 +485504903 395251071 +3596187789 4225287666 +1845898218 1845898234 +1835830569 1835830585 +385384050 4256759646 +3094312694 1299727687 +295320941 558672306 +3657814992 120352885 +1503588611 406153130 1503588627 +2406384977 469491334 +415407348 1458120462 +2330781178 2330781162 +2726457267 1092689108 +2644487025 2472207078 +3881298081 3496162656 +3855059950 2803976111 +875597293 729128033 +183732081 2925410032 +3215994038 2018927249 +3723536383 1624798846 +1167697871 1608723160 +3807615099 3229157796 +2918345602 2362044427 +521142202 4125262485 +3092349774 1985065945 +1333462747 4188785362 +1181800506 107071918 +1010300103 1010300119 +2034948527 332310266 +4287249886 636171263 +3771563680 3516346689 +2930027247 3694728760 +1665894893 291945520 +416759153 1438849538 +2429659282 1249358650 +1690856705 2827196544 +2928623421 3297430961 +4139074918 1194859185 +1572695680 2606455387 +2493725613 906740251 +2536958863 2591347224 +2341160788 1737625971 +2341067313 2341067297 +281781149 227708962 +196403877 196403893 +1097248692 2829490265 +14278820 4210860585 +2730473094 3117176055 +70417688 3011177677 +730591081 4132037208 +2617117178 2330571915 +1341794995 2580625356 +3889770053 1504093497 +3810802802 3499039245 +844896776 1325202059 +3444525134 2177815247 +2677229905 1207292493 +3338936545 3405722291 +146074566 2129867664 +365094223 2909207098 +3136172615 2348361152 +4228806581 4228806565 +1799730014 1799729998 +1717134230 3172681479 +139267490 1214106889 +209651221 3237384970 +2486195132 2486195116 +993158297 3377749207 +3285731078 1400360545 +3765043251 2044612684 +2987190617 976364585 2740147998 +1380847551 3184470052 +822349707 3026483156 +2364739134 828731322 +2631593147 2631593131 +3350015603 3365936922 +6874847 2216915208 +1066572796 264998311 +910068431 863273934 +3887628825 3765751134 +4017720646 1113154871 +408781869 827359131 2285310674 +43292610 3521832547 +641219370 680936325 +2606602915 928673429 +325423108 325423124 +1220747536 2603420725 +3319289491 3240334615 +410313044 410313028 +1615061244 2262510759 +3971189173 2444080460 +1028186163 857884598 +2702627367 3186414454 +1159505753 1837669429 3133960948 303669113 697176211 +3079325310 1836480585 +1626515177 1626515193 +1131329310 1162495017 +4229546272 4236969331 +761262226 761262210 +2819537863 2819537879 +65279937 3776013526 3776013504 +2627224091 1632624895 +1600896684 2120689623 +3026856348 2669641863 +824754317 2773151400 +1962826390 3261635121 +1351751688 1387882732 +4088243480 2450927269 +1684410027 1462734123 +457278781 623165204 +3505560444 3505560428 +881525134 1154708121 +2092835774 491930633 +1238811133 1412355421 +2256175972 1722124111 +1206824389 29068556 +2390654088 2390654104 +1899160400 4288358036 +1934210125 1293851740 +1291500533 599122620 +4133090010 133382864 +2160356990 2160356974 +455642646 3699690209 +4075216783 319419554 +1170971483 981831748 +2890893283 607316572 +3764612024 2525816389 +3229224474 438579965 +1894526187 2328680290 +2888626468 933362937 +3498958582 1952301523 +71291869 1968704582 +2405094068 2405094052 +651899314 838480218 +2578280563 1594361093 +3047857729 3085428582 +353421254 4016733345 +4174202956 4146646967 +1382275356 3475949329 +3204668069 534562781 +3854896149 2468391692 +2936830631 2027936946 +913168665 3354182216 +2106045919 2853426844 +549423418 3347383901 +3586396571 514307844 +1389996486 849756833 +21602113 2224640102 +1943225507 4170517642 +2684115322 1413536541 +235865870 799546137 +2160966451 4141723994 +1450485246 396447455 +4187495837 2272697899 +2750632965 3385234864 +131064525 423757988 +1266888469 1881931780 +3576604146 2595474250 +776446444 3334727297 +3710081856 1588110796 +1844099713 602717565 +1284530195 2588360172 +1651710583 1915922768 +1962165387 2810701506 +3497944430 2767825967 +502226071 2004543490 +1147485798 291584641 +4239752183 3429996887 768893926 +3683041356 125899383 +587864713 2984756664 +1757064726 2427710199 +115929885 1583075307 +3102059394 2633886541 +1487498928 1119436547 +819233844 194182303 +1456966819 2739087821 +262489845 4027636435 +3356104005 1037013885 752843674 +1615328773 2521319898 +2403804908 4287851009 +3244945715 2898703180 +1100737193 622448142 +3781012651 3952033844 +1049535916 646893015 +4107269068 2953982433 +739828305 3157018000 +1396661215 3955073032 +2650851675 373094994 +180026115 3881379253 +1098881106 93358331 +4073243816 3227566275 +1524768231 2311868914 +1982235723 1235370516 4268623215 +3217094625 3183884064 +704881387 2313511332 +1853208759 46004080 +4209153259 1774695581 +2011207877 2541123552 +4021164495 504537294 +1039507185 2120159126 +1004393760 1580630373 +65886369 3483184949 +525498341 869449068 +649653805 572453060 +1952876893 2000593236 +2858695198 2416583661 +2287324566 890413863 +1537782078 2291074207 +3123451996 1704847507 +865435833 3982074686 +1587291552 2412722917 +453416541 3898520692 +3948526659 3242417532 +3192636516 4115016041 +994415896 3844852194 +486197733 3833474362 +2726317683 1975572321 +1210408884 360198315 +3230417038 3518814098 +689548367 2397330097 +3457168099 175616106 +3677447425 264372374 +1489326176 513640243 +3234963544 3791612571 +2092634511 3917259790 +463771961 1811545100 +1278994849 3614543310 +787348039 664862144 +1022864442 4212998915 +2670656451 1509315580 +2466322587 123927135 +2502119718 3969433281 +2334432358 1889678465 +542566957 4272305095 3449139548 +427393579 2354899106 +3227552942 2247980537 +345171400 725596637 +1742655916 801378753 +3060232443 534174500 +813229488 4266759189 +1691546147 3329700253 +3205555465 1779964447 +1394579118 740278585 +557162636 3547053153 +2528279411 201001655 +3912953942 2947215082 +1823393407 1078323260 +1881304058 4248984648 +3474708720 2106499720 +3187879776 396506683 +2595040424 1184852181 +1915340580 3687087551 +1782873902 1648431218 +727357762 4038478685 +3668554993 3976567209 +2154432610 1393506478 +687498413 2701641721 +404580025 2940777790 +2331337824 157928536 +1190141125 1895647770 +560684769 3564312334 +2354287489 1754346518 +3050229696 4103146309 +3927708403 2100417676 +1007925694 1455772474 +3158882621 2742786836 +1404120790 3937024439 +2216979656 2216979672 +1470773761 207942695 +3045406753 1235600454 +3019466803 3637222361 +3986681072 811768984 +3306672737 2776641184 +927414213 1163115004 +3832477190 3832477206 +1436622190 983651375 +284807223 1025768213 +1014809682 2322140421 +3881019401 833717806 +4080584083 1969161850 +1753051179 3896345679 +477497371 24917448 +1671733127 1663508886 +3787395449 3637018984 +833697669 2867740656 +1492657495 1705166822 +494833593 31007113 +3785905331 3720689655 +1166056485 2390085164 +1601016105 2523928718 +775698222 4032468399 +1318994446 1199557519 +3568248095 159425394 +2516286412 170675689 +248174682 2740098475 +1125489815 2943912106 +45569399 3571108354 +3994793323 1084135266 304827669 +1230011042 1790409643 +1864698410 558825490 +1291736210 3328123347 +3123662257 3123662241 +3988500190 1242336489 +2805119671 1530381090 +2803393094 1365423159 +3847735481 3257989928 +3908264676 2602872063 +1503804244 1852007727 +2368068811 163129743 +578385194 1865642267 +2407755443 4061116960 +1515767029 1060078220 2277557459 +2428612995 1676308778 +2165399527 358217888 +1169305447 511745824 +3933120653 309556052 +3222528311 2521532816 +1307468269 3914250337 +2567742047 1306762142 +3054857801 3286503391 +2866541756 3024241639 +1136104500 542411935 +815309112 1121900499 +807117088 4099827997 +1090441045 1392216646 +1774958086 3461909585 +1744754927 2771353656 +435302821 4153191865 +285033640 285033656 +4249879488 2230708051 +208857408 2748394436 +1093634182 601090785 +1132717040 4170769757 +2429195741 3421104894 +466567743 105204030 +685348179 187053915 +1015535961 2097058857 +3142305011 2362808950 +1906871659 1465294690 +248792294 1042839063 +3587196840 1459498256 +292396161 3297554352 +3249197616 3249197600 +921759470 3548208714 +1863587398 4239389495 +3531593523 2453652826 +2296851903 52216170 +2888620558 412828697 +2900552935 751253746 +3813985041 3015553037 +261787386 2320438155 +1366829256 3024622051 +1878789187 789076157 +2582018332 1641064199 +1945217640 2690233887 +1996491249 1175430758 +2745809938 3056799827 +3136623479 3242629838 +1172832647 2470078358 +4167842293 1223460326 +3144674252 2386232408 +1040213354 77571533 +2654495083 2109823842 +2687763167 2574347164 +214166699 3482664149 +3688044803 3688044819 +139978442 3965734907 +740641911 4122435408 2556427817 +156496629 2754049980 +4026218370 1249403317 +1875673803 2076993518 +989831232 3401007643 +3968904575 3871416062 +1642670335 554404222 +346537500 295589841 +1971202139 1352238916 +793141395 3846081706 +631853665 1851947683 +795306359 832237556 +611149440 4099874776 +2731528966 1692039074 +1045751622 1705513761 +544527961 4277843932 +513238383 2538909112 +168373819 924262917 +384303459 3420562227 +2649115526 394847223 +4038100482 3079947266 +2518327092 2273909561 +2590626566 446116449 +1494231346 1494231330 +1306944907 749853140 +261605418 3052411405 +567178029 1694453700 +742990510 1696700409 +2514014561 3581419398 404974919 +2975181984 2930251131 +2098930473 2654272152 +1367140931 2326054780 +55789992 55790008 +3436546724 405356585 +4258843139 3831435325 +3122322693 4249480922 +3655513748 603687540 +1423830987 1684044948 +1792351210 393933147 +3282046161 2774720630 +605687859 134709338 +1867061161 3641720590 +3633039515 2131545106 +4006939259 1952415661 +3068925245 849702676 +2744209731 3233999996 +2423745830 2449527511 +2697482026 2697482042 +2122927166 1881343369 +1678294615 2482601940 447277578 +533132103 1061113113 +4027435163 2159201298 +761601282 2352406550 +2605691749 3816253420 +1839882496 4095463629 +560649431 560649415 +3416418426 178944011 +1223135969 1934648872 +498450440 2183109411 +4272436988 3738078897 +590520485 1251769820 +2431498023 3994463524 +2236083733 3845901084 +1115202489 1978876597 +2301681402 3754654830 +4027794629 3008709146 +2072524715 3568464630 +3832809722 2628395403 +3537849739 3537849755 +4235764590 3756607033 +1578733922 1479125825 +1074602778 141124968 +437517606 863470273 +1296214735 1861411790 +2784075674 3233213130 +1624156850 2716382750 4034974298 +2002221067 2877501941 +1661024258 3706399523 +350272636 1506326311 +652287095 1070984745 +1159132043 1159132059 +628460030 2802761292 +3254917055 676028840 +341820270 2160109103 +485354660 780895785 +3344850624 3344850640 +4031848671 2451056341 +796179123 574613046 +2906409769 3739898264 +288771479 4033724692 +3753672975 3505392972 +1308144858 2558833469 +1085104988 3523061940 +904271519 2221213020 +1756204196 310170255 +3153848702 1804636489 +3336467604 2906277805 +2146427064 3706379527 +4027626004 4266153327 +2424537808 918667207 +4268374737 906055487 3241965220 +1783371582 1136991327 +3921122092 362805189 +4028686418 302452987 +3673485562 282500402 +3664784946 278444197 +1209833198 1929484463 +994285942 3244987601 +4172459519 2152196193 +3650767764 568654329 +3455204934 3600087427 +4061247120 2715968693 +2571061526 3673520021 +217310886 37797361 +894872579 4018924819 +4208095926 2404029575 +3286337101 1130675126 +3547458977 2102989942 +2331473499 512708932 +2547191576 423674564 +835090490 2507096907 +4073154700 1281003753 +2344264199 3333391255 +2419920729 1763649800 +2445944019 1412954170 +3143745707 2783071522 +756232709 4197957068 +1721544715 2062719477 +1240711962 2226921981 +2097767910 3150670103 +447518451 1872737812 +4200944321 4001449439 +917526532 3955565650 +1792910414 2297013977 +1626551108 632711727 +1428592562 3762582737 +2717962158 3041324793 +1503867234 2033972937 +1421462532 1421462548 +2544662367 3511067327 +2520717175 4276047449 +2061407127 1650459175 +800572436 843688815 +2294146810 2095766467 +208417724 4185969059 +502128520 2776032011 +3317894587 3317894571 +1346108938 421469062 +1181130856 2119787139 +598498857 1575257664 +846311846 3952541926 +2361167989 30894122 +791192758 4076554887 +1989296394 2990301883 +1657265034 178166331 +81569624 4284182427 +3253667319 617554036 +3545413664 3409435251 +1730091854 2159725417 +1355518976 813300741 +1868551307 2813226936 2946096827 +2906533133 3319851890 +2757327600 2833024963 +884255300 1013451039 +509966355 3971745274 +3547188634 2151199586 +3679632619 3251470104 +3544571946 3989893253 +1269168241 3646604566 3320712951 +1929328163 535959520 +3084983340 1880719703 +3490366849 32827904 +1903879507 4151771564 +1718647181 129008705 +3042733100 4048864700 +1813871202 1813871218 +3544669161 2186653646 +383799787 3521223695 +3018003961 864305263 +2452948890 3279615869 +2077533591 3511671060 +737821640 49853387 +447478396 2657758811 +612633782 178518679 +3195359611 4008250920 4008250943 +465681569 3578412099 +2082744897 2918089814 +575287936 3531585567 +370433568 3792710771 +2611121280 2162371973 +1810845107 2629259482 +1103191583 1885886684 +4248842853 286217466 +1492942970 1492942954 +390149229 781478596 +3987741981 1228788898 +750503046 1186430673 +444180428 2038638135 +2694785881 1021115540 +1003501141 758660976 +3282531079 127538176 +38638946 35793237 +760876196 3767070514 +1740887507 743021370 +2655529526 1637511943 +1039497819 3832520004 +1244234814 4250611103 +418386482 1944888506 +1397153465 614959240 +2842745341 3114740034 +1092430478 250215823 +2388778532 2388778548 +293720699 173954994 +946875943 3176102948 +3275085310 504092958 +2653558902 2899858066 +1620745430 2464419533 +3972591575 2538704742 +2549871784 4259225436 +1656064613 238280092 +113781647 1008505358 +1312800694 2504645061 +3531212127 2589553163 +3165049050 4080491246 +116212615 1972174980 +54489768 1811553987 +3501442671 4194394296 +3836759758 3482062425 +2784573034 2974853339 +300166609 2377765399 +3258136752 1031529736 +487553282 3243998755 +306222067 2028238406 +2106454597 3950273178 +3049142565 1104633571 +1888692489 4177273720 +36234193 2166170647 +1513399858 3425696219 +2510012737 2432338973 +527397233 2191586710 +214918106 4036899899 +3544351656 968180075 +3520616330 3520616346 +2213727711 2520389150 +1317725861 1235817914 +2394488788 2168109753 +3045231658 3867321883 +1756023260 1697986709 +811818619 2540544610 +146545368 2552119835 +2227377655 3359637342 +4087861570 469801046 +1989544056 640636155 +1623953807 4017497102 +2289602647 1944756674 +1875453291 3844823960 +314231687 51275158 +3562259293 3989026929 +2978672078 4003003798 +1037298517 3267097840 +826839056 2772093237 +60235952 3840954379 +1516331812 2524499225 +614486217 3872583982 +2726209926 1377746938 +918289402 438532291 +3680065993 3680066009 +3073299896 381317307 +1563529334 721840583 +3001808051 3001808035 +1107065121 2875249287 +3724427004 3724426988 +788159976 3693204523 +375023039 4014877630 +4286578460 1384028433 +726587890 2481378728 +431671589 2629966429 +2475837150 3212893869 +3675311845 3228938874 +1197354888 3779384075 +3675138912 927877171 +3024564966 1849787430 3024564982 +1845731479 2150812675 +4251056576 740773171 +4017848615 644632694 +2970912233 235797337 +1220320647 132905878 +773461775 2719108238 +2152640319 1051184753 +1432774220 3847759991 +914494019 297975676 +676656363 2504880450 +1560573841 3153208042 +88335610 1149866966 +2233681796 445224137 +3655191056 123963499 +826042834 3849524350 +2539401868 788491959 +2189427577 3901060968 +2077852748 1131103137 +592291085 4124247856 +1785803529 2570278712 +1379386965 1930351341 +517338779 634598916 +1794389121 3509651366 +1565594886 72519235 +1246381973 2260620844 +3551809124 2832689001 +3651034825 3651034841 +1186160578 241155683 +51741643 2973225199 2782820500 +4217695495 3336643094 +1166811509 4036537130 +2152384854 2655754273 +2154681573 2806737930 +2453370301 4238210251 +3029604990 2472210825 +4271436863 4271436847 +754570721 2924196150 +3510207852 3381463297 +1996525303 1289817808 +961905067 2271929301 +3646345337 501690441 +3810285821 2191529556 +144162964 1311539177 +22936931 598658593 +3074166783 3508883812 +4099788542 2913786335 +1954381744 294650389 +2404958307 196533194 +2040938938 985233373 +3157929526 2241249041 +884820423 3439010880 +1382174411 2076314004 +3226127091 2830990490 +4181927782 3400992129 +726333586 1542029252 +3415961743 347222286 +1295621246 263281247 +180070103 3160908902 +3246690992 3618116107 +728435593 3800246456 +689585303 4267339787 2848559383 381286543 +3362427376 3371816328 +36227257 523500350 +1361644364 886035831 +1331708445 9238129 +4060972908 2001481473 +3376331161 1250299983 +3739179070 3273966943 +2742322161 3670295461 +1627841169 175617965 +363987725 3137882939 +1715457363 3686660269 +2466117809 382631600 +2393516406 199181521 +923669228 2535967105 +1013940135 3397776352 +2992215786 3212731731 +3847773092 2920825641 +1687248752 3942354140 +3565406669 1484172722 +1421128241 2306114352 +3283113948 3935981383 +776277180 2461207537 +3152283852 2320079399 +619653200 1954313699 +1312768664 1474218021 +4091947908 2002157769 +2754700957 381978914 +2796612594 320692454 +1263279581 1708327650 +177764667 3909539812 +2474589250 1934351349 +2986528636 1577069873 +3378473208 3004710727 +1677032104 3498909200 +1723980970 1723980986 +3839473039 1512629821 +2304233494 458941234 +147016402 1818609081 +1112025585 512240595 +4050157255 3464467286 +3613425525 2179507516 +241124858 4116764945 +1335885935 3353390766 +936521134 2380130553 +1102658632 1577694826 +3947989916 224315015 +1120170125 2822581732 +1917015343 251599096 +2764559976 2465394623 +3256272159 2491783132 +2322461270 1091861863 +2318487855 3258759547 +2187948941 2389413605 +1205170702 587369487 +26158965 26158949 +3227840527 418092123 +4229688954 1509452317 +2610797841 169755078 +3466658311 2053259007 +1179194168 3708371259 +3727795709 3307752788 +3998838737 1727090262 +2357358701 3572369092 +615910160 1326462904 +771895726 460600569 +1090276683 1298216642 47267221 1169660221 +2941870314 1009233850 4272701267 +1007441776 4151158083 +85352719 2563739377 +736666754 703654541 2215158194 2639230907 1387800408 +4022141665 1200326688 +2392243863 3329201301 +114692046 2432360783 +80247089 3096889382 +2900480112 2541428803 +1358436551 1032782145 +3197175198 2118959548 +1545699392 1220338885 +631355476 2442472505 +3986986317 2067916466 +1700518143 279895825 +1737871671 1205361030 +960108160 432261253 +2146774406 1866664802 +3587479921 3007769783 +1725337377 2037938573 +2919301482 1435843021 +1435843021 1403041408 56727297 +4224532190 2144002999 +972833367 980277923 +1718185013 4030241754 +3873594140 2455072017 +4149933709 4046594020 +3630480224 110295077 +2401099527 1392908288 +3120985431 791328752 +3101271069 495258991 448010772 +1082119119 3036443418 +3052284516 3387734911 +3138544082 1774988909 +3632063661 949528385 +1546837547 806593102 +3500712458 2205619643 +2428088491 3365384834 +2850399056 3296728821 +535468951 3578982054 +3202962155 168625432 +219962172 2140405489 +1411101073 2719807869 +3243639522 3630882283 +719147761 1802080624 +4175782230 655899239 +3046638853 3813664467 +2566719324 844273095 +1032457748 427641193 +3126621200 3031659752 +1925462269 815869536 +1802850115 1823196778 +2853029436 4021227623 +128168543 1706150792 +2223424771 2486190311 +1371452059 1244867090 +2807151617 891329318 +2154922509 15695931 +3334539410 3334539394 +2512425493 279871036 +1448022878 1014725865 +2247951737 1716493672 +2645923819 867097250 +519712584 198733387 +2389572922 1898291787 +1503962217 2267992398 +1088108151 801904599 +3061055377 4137872868 +268489742 1062064655 +2253241783 3266969140 +2410092014 282555001 +714028644 1668456297 +2344315439 654845934 +3200873838 3307461689 +2693812856 464570368 +1853741038 4199893841 +449993369 2913343337 +1522005036 4220870984 +3593035787 4090734383 +410220909 3938985604 +1141990358 4089300655 +2957455926 1006366622 +3894631368 3241880731 +234015933 2990034324 +4086627873 2492206560 +323243569 2099888716 +3311926285 275137935 +41728581 1362784263 +3398095846 213421361 +449898618 2020440386 +2035290857 1552909717 +558094052 1776812839 +3267348179 672079680 +3363329567 3550744796 +1499413139 3437913281 +2357453915 2392881988 +1552674306 2454478478 2991041827 +2526772762 3037927413 +3441841158 1014313850 4183180663 +1626053188 451563268 +1630940006 1850102145 +2951862481 3401077008 +120983449 4078603720 +3250033151 4076524648 +459224503 3454111504 +3206746546 2520046387 +2937490522 4035493110 +3467335815 1721629614 +302143116 3853401719 +3815520966 1942490554 +4148835650 4267001675 +2317947627 1772668898 +4261992287 1310834635 +3075869622 1118492460 +1725435825 2267060832 +3537349706 1118794742 1908948691 397722464 243722316 +742511774 1368235724 +1971835954 919800485 +3168937813 1134128233 +2422868999 1576070934 +1929837382 1509789473 +2168423563 33400514 +2888110200 1985539323 +15092050 2757787186 +2992661769 1222810143 +317561192 872971965 +3817720706 1857602318 +2581735037 3154286292 +1618498227 2422878156 +2354970328 515467296 +4028039159 3946115526 +1212622509 1963057732 +748300258 413976789 +3330352271 206343438 +4246822530 4253533877 +252736732 2464675399 +295381307 1069549767 +3921129842 1579964005 +3711619828 932845071 +1015631225 3307533672 +2428312877 3276624539 +1232990763 3695458740 +979171387 458933490 +2312498662 3787817217 +3666175322 1454862626 +916785314 271564122 +2138384026 1101411427 +2167407468 3928676993 +2798711229 4062005451 +983813245 3441437530 +2860472717 4084857060 +2600827469 3395156731 +3240759834 1142279139 +462486077 2721705474 +3676791748 3271691657 +2397087548 665273201 +2059174336 4139794757 +803382032 1908847157 +97642459 3226237832 +3875062800 915935869 +492312222 2854525609 +3730392815 3309960312 +2046422592 1533399288 +3168238963 3124395020 +2144948857 2144948841 +601780980 3555551583 +1592417024 1793933587 +576634391 576634375 +2813688245 2813688229 +4276418411 3453602135 +4131327624 759423005 +674012688 705544936 +2284961584 2521823381 +3865354765 2778376142 +2881952959 2881952943 426911598 +3979212844 3072902043 +4072778239 635346046 +3879785011 1040901722 +893131899 1218500018 +1467096526 345927001 +3482865337 3513677960 +2281499786 2636668205 +3922749231 1108504302 +3722478895 475623401 +1337634087 2849936480 +3116644011 451022644 +4075211544 2621839842 4046567659 +4187782602 3853897942 +1292186360 925842555 +3559027645 2939957908 +1334085127 882834710 +2866060734 2863944223 3638380254 +2698745834 3468217984 +3321008450 3654000877 1116833706 3409217966 +3640588634 4083321003 +1149272052 2152570843 +23478222 32928089 +3605317533 3878042676 +2935791252 195928825 +1304168397 383127840 +949096060 949096044 +3520894636 3852451799 +877984682 197667986 +259576274 758271379 +1472757868 4271569516 +29459050 765480141 +2351421064 716617739 +2911222279 813947136 +3215000490 2501738501 +1755798601 4228831631 +1929284738 2293706915 +2257580275 3348647578 +3975517055 2241278206 +2032441867 4202852664 +1610806223 4087729870 +226304625 3193265399 +2873807879 2915813120 +2543296337 683280827 +3486472919 3486472903 +3102257639 4249882294 +915972999 1855414404 +979897782 3910991126 +844664176 2976294741 +530769221 2448436697 2518166664 +3663277583 4139294193 +1040215146 78293723 +2373500427 3737958494 +1224871282 3481461854 +218699185 218699169 +264582999 4127645405 +3290171623 2669806518 +2975952362 643827547 +1826386210 2164660373 +1932048273 4162246701 +3356570890 4246109883 +967410921 967410937 +3365645765 2450689292 +2125077138 4157068243 +1092840061 4131403636 +4014201006 1439570425 +3574582608 3084924131 +2770598452 14544930 +3922889983 359921000 +1349894152 3537869603 +855474139 537937362 +1382847718 2800641559 +915063953 1836281926 +3778228138 3204285798 +1965198566 3897200817 +2670854680 3015265229 +3611956066 1214473492 +2245886380 4294845143 +2242448875 1411442932 +3523190673 644362576 +415757596 516348679 +2417124173 435311140 +836211706 1885205149 +4078642014 297315561 +335591345 1014171189 +1287974555 1963171332 +3965149549 2149507012 +3180520891 692036978 +2408596561 878486518 +1361007889 3019263456 +1213112432 1137086531 +110693478 775706522 +40818760 4166151152 +4181660506 3234578703 +3713518493 238389291 +4102493163 3684981474 +3655634291 2274559849 +4054936588 2781660964 +3230129673 3231468933 +1949877756 875746105 +328036255 541042129 +806338051 2882018986 +1162908345 4235741749 +2395124596 813727631 +1435594326 2762273176 +1296342727 1778774870 +1460974943 1267563979 +62811638 29858612 +1568539269 2992502604 +708257509 3757182492 +2100513388 1180477273 +1236547121 934367014 +4036262568 1639782013 +3552914833 4033264464 +565975934 2568963935 +4220390377 2987807194 +3389422862 372694287 +1916898367 472893224 +3344766146 2575805795 +3506112635 1982749092 +147418304 4142998171 +3842857209 2365788158 +801432739 1349493286 +1634160097 1553613501 +2464331028 2633535547 +3062106265 3940124872 +1438217771 3349090050 +222477716 1947234287 +2075627744 258776791 +1605096951 1931881986 +2877472878 1825893679 +3987106402 632836477 +3187818511 747296664 +3242984138 2081775062 +835756778 2134116224 +2539146828 2349023671 +4164274621 2041353346 +2616495014 1109813991 +140169853 2751027924 +3185920213 3304171338 +3656507133 348260418 +384268907 3989122315 +142434713 4133528520 +3986562370 2635480101 +2498758131 1759075738 +2308130212 920035625 +200768674 83497687 1714850520 2782185013 1542381107 3351934411 1103064138 +2694207109 1811679719 3907966652 +1163922992 3596561207 +3453850326 3922601703 +3488694418 3488694402 +1558416272 3837122408 +2378291625 2372346700 +3839680486 459584482 +3407693852 4170704583 +453819762 2389050125 +2432525248 4276356947 +3751506392 3652466459 +391810476 1871513047 +2960253857 1433607120 +1497637822 3767989922 +1852041422 4181789018 +3116120133 2823591066 +95079812 2038131338 +50117232 601456195 +2257778218 2257778234 +3633060238 1921792665 +2707783564 2663893345 +4159567351 2982125186 +2968114106 974671307 +4258886018 6484405 +3193467689 3375002757 +292516614 244517637 +309563084 546449400 +332555024 2522066900 +262898952 4200810544 +2241375162 886574614 +2947475076 1123676899 +2493384784 979865771 +184857916 2489929063 +170881142 2125334993 +1451352575 762758270 +1435518083 3368655077 +1065539946 3558583237 +1012029097 2661182488 +177494940 1133262471 +207283644 1950487276 +1370949801 1277338136 +262301780 4037688377 +2522685321 1033413816 +4260143172 4286597897 +4054871701 4054871685 +2203356078 412761647 +3746783103 386253314 +1377475392 2145543621 +2760912059 3388369528 +1180823238 2452283831 +1460757621 2237735978 +375805253 2283289498 +2617257638 2617257654 +2695528922 2695528906 +2200321748 2200321732 +434848751 2815537504 +1741312058 2642168651 +3801476320 3801476336 +272316865 1312549590 +3112309999 1230888586 +2003273879 3334272002 +1764697704 1764697720 +2915393886 818453977 +2805581431 1362433268 +3449519212 398777857 +2040585343 4147846142 +1258078467 249812924 +370706783 664813704 +1207437968 3682115747 +1763383333 2594636332 +2377641349 2643126355 +4221190625 2725004294 +2967038953 2124092320 +2781308911 3787141777 +3627337905 202895024 +4260177219 4283541610 +3842823542 3558764362 +417118710 427343431 +2143508849 4154558410 +3193685578 1647222219 +568116037 2475124108 +574694461 2906514468 +1445592428 270135575 +326810889 3006764334 +3416241353 3812291897 +3438337307 3438337291 +1592206135 2130943906 +3178545558 3570188071 +1462317270 198697201 +2238515588 2238515604 +3682708298 526678614 +2350800245 147660604 +3422836037 2717111146 +3853923748 3298039161 +4269046558 2942160937 +781059501 4136824644 +447471744 3157398732 +1925959213 3822424260 +637974088 613479261 +1969385255 2980455731 +1963546797 3937835076 +214168320 2301407948 +2449804094 2598973513 +2726936688 2048220184 +685619539 2819276218 +3683480721 816742478 +3538389934 3247332266 +3953947933 3447254363 281401694 +2681506919 43583030 +1458549429 3360443849 +2678245296 4248853013 +4248853013 3243101962 +408047159 2156994694 +2922320046 3583821053 +4168880833 3663048678 +2781197808 1135345935 +2874214540 1016099937 +3534991533 406839557 +3115403960 3515610696 +123190708 2563012851 +2454161739 2442993940 +2822729235 4007282682 +3774837685 3877840362 +2861924378 2740496619 +1219436015 1521229614 +3362351840 2330697132 +2840738026 1987024973 +2229765737 2977476712 2229765753 +1393873105 2596583696 +3726113195 2521566165 +3020546555 1720630834 +966516458 2589977165 +3837901159 3382785870 +3116716433 2268871951 +1129370397 356275892 +651372530 3330847117 +3264722379 659531976 533933725 +1410353998 2745600985 +2673456630 3493425735 +2029006765 2029006781 +1146108231 3511298774 +706360299 240340494 +2628950796 1432809211 +201144409 1097370409 +3965899335 1720780224 +2928043805 3667153570 +655628820 3369352139 +406432367 884852140 +3922060822 411645105 +2182054009 929513086 +3663484082 2728365133 +2651957732 3117314559 +3252381108 3764460111 +2686251565 3492932063 +2466178819 1782950314 +4019525572 627896013 +3792983342 335681401 +3101788629 3758881372 +2284893264 3031161315 +610555958 2146884871 +3793442797 3725289988 +4145755848 3352771805 +3841986770 1360689797 +536526011 3594421548 +3802884515 3802884531 +172593991 2027083990 +186044051 132591980 +1131814628 384999657 +4004383397 3633725283 +3719593505 874686256 +2748363867 1015802706 +1575160886 40646929 +23896774 3377625265 +1740365846 3020485441 +3897165417 361240408 +1141311328 517775377 +326838727 2281369811 +3823746653 3342146475 +364724899 3689932444 +2202978128 84132597 +3434790541 3434790557 +2466538674 569017395 +780572992 3988610271 +3045130627 779473597 +1006178040 959283194 +4221981664 114690483 +524319385 3414228702 +2022092098 4261592821 +3726519746 1803683957 +795122136 2856587635 +650869112 2320513019 +2467942551 790958985 +2051519887 232968206 +2585196917 1916275468 +2478670189 273864660 +1640463938 789299701 +3839681527 1052433862 +2235564213 2025921770 +546181736 2564608458 +2514948902 549659863 +1591486682 1777945788 +2537249688 2537249672 +523271970 4005450795 +3672900699 3327439353 3889514028 +166098083 3763965198 +3581770462 4069026687 +3545154811 2684360498 +3892926549 2612399580 +2834712344 330427085 +4011527177 1888743992 +2316570503 806835161 +1371519431 2010215488 +1919865055 57855752 +1435554862 1435554878 +3087756744 3087756760 +3791729118 2783019135 +3651375478 310246599 +1863521369 4231509077 +1548286072 1715937555 +2750882773 4077742172 +815070771 2911644236 +3120436755 3724328954 +1710228673 970423232 +442975649 2057845767 +2934723992 2814306066 +2142485664 2817650661 +399001024 1122116492 +3174325926 3867287901 +1572372453 606882055 +244645156 1258747672 +1759884102 1738094369 +1412309595 3680307045 +2444373739 1182784482 +2958845021 4268883554 +116345300 3199285433 +1008924350 2053752798 +1906069261 3859837284 +1922831884 1436466743 +1715703333 3166498198 +40801035 3576240885 +3932312334 3171206297 +4234900645 36216748 +403486210 2260230294 +1569320385 18958038 +752472447 434424552 +2377203805 1795707508 +292669423 1708187450 +3983851630 1856085661 +3376433198 4264665209 +1209899600 3600411637 +2290084633 1631326415 +2185324166 2185324182 +2669350794 2669350810 +3355982470 1431299281 +33074875 3581612140 +2802086028 1708993606 +912128261 3225517372 +2262289385 2262289401 +434387575 961022278 +3756873099 3756873115 +3134939800 3210491227 +65206117 2202760172 +3620304968 713338229 +4149236910 3288404056 +3790814376 1508408445 +283854615 2200255050 +1779379199 4108468862 +4217641844 848770959 +3898232112 4129784451 +130974463 2032089276 +844150155 3222129090 +3809892891 2536495250 +3704251402 2375354219 +3611905180 2221119889 +1122707578 3526408221 +1317084270 2617985187 +3343287065 3439353928 +1295211242 2453129554 +1820906169 2489563454 +144406976 1287694675 +1391845283 535937072 +3185333426 2480493605 +4105033130 3618069133 +3907024845 1717344164 +1632467756 1355970647 +3566712062 3965123537 +3161017680 3921982691 +56005665 2992406598 +2844335983 1373404078 +1313706000 2576858749 +153671436 2825347992 +2774125185 3445213440 +3255225972 3338894131 +3705690013 2046736789 +4170590659 3573886513 +2718916219 1941468956 1987452616 +612356473 78080589 +844432559 2389058149 +501207995 501207979 +4196613272 1568170843 +3469985752 3849758972 +3455978179 166392060 +3482172010 1832992323 +2779820156 94943532 +249402581 1954121082 +124100576 4221524667 +2265698989 1151116882 +3303124056 3303124040 +2162762916 1093272310 +3874839437 557784827 +1354965501 1354965485 +4116215269 524392300 +992110771 992110755 +3143398838 2827832711 +3983394685 3983394669 +4127351951 3569634584 +1346082866 2781166034 +2037641933 4270274738 +674065228 2340415671 +1032394724 2540007385 +2832627254 4288419601 +3192125744 375182664 +3627743971 2962227677 +1155147937 74315126 +4075294575 4075294591 +1578769922 2416393757 +1195723327 1897128232 +2513645720 4164148668 +2556778130 586551611 +3651271087 1512908647 +2548907539 2768860579 +2956370221 2466232786 +541001912 2859617107 +43746682 1398398549 +1833430299 1833430283 +2364601623 4132557606 +1112541874 1760548382 +1485005277 869469922 2000711125 +1802139006 2223247060 +3246821288 1322526077 +3876488710 443668858 +2160937434 2636857899 +4013987455 564980193 +2477631453 1926176849 +3172674799 1450005112 +3049371674 1657130550 +49215836 2619126070 +2956531499 2497673396 +512009811 1565641408 +453558457 1021393544 +1225764704 1672549427 +3432720203 1509093431 +3700771762 2679298906 +3933085160 214539111 +507751312 881267619 +1020497657 3121222120 +928279205 3061079907 +138516544 1061334213 +2423498506 605962867 +4247941656 2926156749 +2381325173 1213089050 +2778688155 1425330692 +1260438746 244697581 +244697581 3805077522 +82057582 554960943 +3900130072 197041869 +776095427 4016637510 +455622135 1912019043 +2739721199 1745033489 +3208554682 1986014486 +869526264 2392515693 +2594462813 1193816734 +942952663 1364935280 +4008598523 473615396 +4230392958 1860274783 +2240908598 2049002503 +1788598110 827590889 +4107339169 10251176 +1573872717 4202358052 +3102753934 2956716943 +1347854715 3295862335 +503422876 3633201809 +2875605448 2583268811 +3733007262 3814173119 +1821306288 2499816451 +1330752317 3616820350 +1727979858 2036585182 +1788257502 1724656386 +2119532379 2833403954 +2460381416 3470976771 +2180686963 277930266 +1307313908 2660168208 +4211151258 1913100149 +3546765590 3786489265 +178549549 3990966212 +4067215503 809482510 +1267603166 3467509609 +1462013877 2973946111 +1101025442 4049530645 +407887728 3049045315 +1977336412 997886727 +642617352 3415048496 +769083003 2766402468 +3998531178 3475150758 +3817315482 1243680954 +2379313148 2457615473 +899701118 3916226911 +3260928300 632309832 +105452893 839682084 +3723730052 3934217183 +1856707046 492422401 +2886768660 4062144367 +2533985340 1165592831 +1685403109 1955345692 +533927537 1326194380 +1445240792 300053648 +2971052415 1168954088 +4277626937 4201643859 3146298754 +2087985454 416299897 +2207256762 3586807005 +2257580265 3180871374 +603297158 563765751 +4210646884 2056333951 +1986633132 339949015 +409267854 536837006 +1620612547 3543384572 +414031962 2002101301 +3552199302 31372972 +4162823938 3671117378 +3215324031 2835119595 +2271524850 361599461 +3733664575 338340182 +2986662389 849550499 +759112416 809768379 +3736371996 2989122833 +4189305942 1810987889 +1719496933 1014544492 +3508075629 2538954628 +2204160809 4201408910 +933348817 581428752 +325852167 2088948549 +3661471933 4202691819 +611417823 2255623909 +1885588167 3323920384 +3700141646 2112054489 +2425893494 362246097 +1345977148 2269544295 +1620122088 1722560951 +4156304184 892864827 +2299902126 2463137250 +1834653141 4204387914 +3072740844 3809230213 +743996132 631442127 +2060127128 372675545 +840806233 1035667720 +4094868795 1954538468 +1396199045 3408749745 +3303989532 2222565319 +939066560 1755579163 +37808290 774780675 +469211440 3806115144 +2652825471 2918708447 +3565219979 301640404 +2089250928 2033582147 +816854866 2387068473 +997540879 2828673934 +3002218658 1436185783 +306943098 1190837277 +537905077 769090026 +722775924 453065161 3085177876 +259994219 1124642968 +987788496 2136466293 +913529197 3468455177 +3998510351 1038593678 +454457384 3066716244 +2449410317 1728372836 +2314049363 1946498988 +337121613 337121629 +1019667488 4271743636 +2738968464 2413615029 +954818703 2245703899 644022552 +4013178457 3896387080 +1429386504 651361181 +333153075 1972341068 +2312157944 3952497773 +2889962549 2889962533 +3113533693 573296212 +2668799889 4275372893 +852580465 1888369136 +1149531335 2743326038 +1407063154 439621776 +2908467460 3137302489 +788695171 2214389290 +3930236744 4129099626 +3692799735 1988613830 +3848124019 2240165644 +2880505628 1672360209 +146749472 3290045003 +1798809113 3784997214 +2112694001 760499558 +189679041 618306278 +3441709131 2978778034 +2764713352 4064652573 +509866255 3864296078 +446730247 4056070912 +2776072006 2776072022 +2500762670 2500762686 +1033515445 2931572714 +1903887234 648447395 +1389595785 3959831470 +1391460957 860570178 +2147524033 1106794198 +2836489105 3076504912 +3494991366 3378981969 +3128200473 3627929064 +1896744580 2950926191 +804542374 598080087 +3787313133 1255035396 +964465816 387836763 +3593314346 1406345755 +2049213985 1753163254 +2416330292 3990913999 +3105814163 4273875322 +3844669325 1874066149 +1234650686 3256166330 +4046461114 1756818653 +3920406159 3480969617 +3654489132 323535169 +81520419 3375160330 +3966782736 1154043957 +1065562771 2391317882 +3109976697 402426612 +1186338930 3795473946 +3682291169 3446812678 +3996226281 287985742 +123102258 3235291679 +1125248993 1983684406 +2086946667 1124093326 +603881393 1520632742 +2823360536 50615748 +1474503581 3680265602 +448243264 1208857055 +707070567 3209650230 +614212104 3847343395 +3905911549 2073992258 +1549699424 3369222707 +3861265024 1663494948 +3624419018 4293001253 +3556751942 2176274288 +1732536932 4105403263 +569266510 936095805 +2971180715 17602264 +489014129 1400023782 +747548964 4198089916 +2749707461 3335655962 +3114193959 1544026464 +1335503744 3484580499 +3721133804 337792407 +2610903944 2209003293 +2405253528 719706133 +3518953539 1923141994 +1217838010 4283008477 +3372169658 600301533 +680640446 2607863817 +2367817239 2367817223 +1062854376 2725898045 +3052267210 797069293 +3942617674 978537083 +3684322991 1659493752 +2835611577 2801008309 +1374126246 3610974390 +3777591936 4098611077 +3484124635 313237839 +4086913805 2657387122 +108079869 3424991049 3103081927 535313821 2505376891 +1178315564 4257813750 +3663438775 1967307024 +4276204336 1637893810 +2239426513 4052190726 +93177071 2905408558 +1171899113 2970092091 +2712107584 3131404997 +4073804228 58963849 +1667427871 2478627550 +2979853021 1997689314 +1075650244 1075650260 +2581491714 992629539 +3618225049 766716912 +1175840461 1704154149 +3767218030 629991417 +1289261073 166382288 +2057775325 288018219 +1565398445 2397839172 +3497412025 3817242031 +239253519 3460627961 +4049975750 4049975766 +1123736653 3186150692 +125739569 1335429687 +1739731156 1174602732 +1362897390 3484811705 +1605057870 2936742866 3901850063 +384412013 2127935108 +3275573557 2390376042 +1053211574 4116955543 +567376184 1958859565 +1778353257 1178431822 +2614031802 2614031786 +555091504 728488095 +2395904041 3953312512 +375282864 375282848 +2444265568 1060307192 +676193129 3684499022 +1328765279 1188986949 +3108271535 1438990958 +1205143870 1212440159 +905748475 4155496498 +2927162312 629340784 +3396343063 3312530224 +3801581921 361579424 +18913903 2849387963 +3877567932 2098837572 +3143231138 2248984491 +3056245839 4206141670 +1911681401 3846289758 +1816827210 3278439291 +520175576 2259447041 +3255266 2701995773 +2712443598 1354216015 +3004437621 2263227930 +2811463751 2811463767 +1347029227 3306929366 +2402093460 4159050745 +2072525796 1534478313 +2901498430 3715862797 +290006012 841196967 +2495318537 742018094 +1266110773 2236504375 +3731370368 2651188364 +2597720375 1161691728 +421354431 1211592104 +1212263513 2160336702 +3917415388 4188498065 +3857818821 3857818837 +622588257 3422354336 +746000455 2686810948 +3203897184 3312508475 +2970526123 1080152526 +3686468743 1853143190 +3132404107 1970503124 +636229825 1940584406 +2464483929 2464483913 +1833088664 2643549221 +1161277723 296471954 +1714547701 3583406780 +2873182773 3435647338 +298546338 2772998933 +1893029634 2715285539 +2004886334 2278946154 +2199608892 2685753447 2199608876 +2687239240 3063936714 1772624227 +2562974370 509461781 +3212856584 1936022848 +3808750428 3166601671 +1071965496 3444889403 +966649299 2523964973 +1374592168 135179692 +2249224488 3543990336 +480967790 2401984825 +3916943275 3916943291 +2393430313 3322978456 +2876157145 3090815368 +827553302 3160597681 +1485667884 1099019095 +4149212016 4149212000 +872155076 91315007 +2983144713 4062438712 +1605214569 123017304 +2379732375 3787799718 +2098543317 3177946442 +1704125897 2940189560 +1132344608 1605214579 +520029187 3146258416 +1298329955 1298329971 +390502113 357633980 +2988520669 3157439919 +2621396558 1169480921 +810302139 2428908347 +3872253837 3810755300 +2540013658 2933237181 +1547378238 1863359391 +483319232 943628610 +3779422212 3725692152 +216661837 2707220004 +185295422 2699798409 +641762020 1235112655 +1335753887 4105481800 +778710060 1025739095 +650912573 2181004834 +1529138553 4092556670 +3546919825 1617276230 +3171269894 2793106246 +3960368204 1246834460 +493574285 1797054344 +3586308057 402112754 +3657120181 3900389651 +2238056581 2588618727 +2678684227 2678684243 +198209220 1562271391 +278277199 1817430683 1801961560 1801961550 +1948301391 1062788785 +3548681284 1035298591 +1131329301 1011496458 +1600082395 4262321106 +634530777 2820360463 2985558670 +1587218674 3759084773 +3596661422 3416545117 +2378521370 1202612715 +2472616282 1541898411 +1094827562 3833486349 +2781097245 282264756 +3650829021 2037542612 +2197714893 60200882 +2666536256 1946028997 +252579097 2164763766 +1496991448 1321043469 +1126745859 1220963453 +1020317338 1020317322 +71500695 2915683160 +3412216781 4173157284 +2786346468 1441400297 +2854083132 150899825 +1290582231 4020697702 +850670928 4243719595 +1288833627 3197763429 +2724720961 2971464294 +798027975 2821392704 +2923790846 1467049247 +1497785328 2522834268 +3117178681 3117178665 +3344820921 3043218398 +1157988858 203910850 +3088450926 950701103 +2473732159 2256437227 +193134620 1990626739 +538019577 3827456879 2289371870 1956084200 +3525334985 2448044408 +3506265964 1792882433 +3475412898 3149968387 +2593281665 3579718934 +478038635 1171203700 +1609950552 1792477427 +2508717 3913471314 +241023834 4153274045 +2004075769 3443811039 +1468017265 3151017207 +2372016123 1955243912 +1928182237 2865661378 +3390417868 3961352737 +2741338256 3909986343 +374717631 3891798206 +962949812 246649167 +4165150173 2931071732 +1210217857 3492087267 +2154777903 4017831238 +3149925359 2119354670 +4078557176 594613455 +1184956021 3927842131 +2584354785 2853851654 +3008386501 209126668 +559213714 2478977757 +2605218997 244539482 +3938682418 1618683321 +2511056653 3204497097 +249744975 278352455 +849476619 3221210452 +1812463072 4036274099 +1079216627 914499994 +1413496116 3575666905 +2719891577 2929688190 +3088999923 3403316634 +423742430 2694049407 +1836771485 4118556450 +480116534 265908481 +2074922268 814510838 +2292940275 418858380 +2698781699 1032630442 +1347524220 3966756135 +2795645375 2553703041 +3704641472 1543119699 +75469534 4073993065 +1202912683 2311410722 +3699892270 3454854841 +1688345760 2639824664 +2085551675 1643844101 +2001244331 134928590 1997753433 +609546755 609546771 +134928590 3194034717 +533804046 884538042 +186504074 2458986502 +2795611913 2795611929 +4230168517 2961007372 +1538272096 2428934522 +2522435579 2822586335 +868646418 2474145363 +1503308914 55744086 +1659813279 1557430622 +3024460962 1804964611 +2531344703 3281630782 +2899706021 2807812743 1516166620 +1018401292 1649973815 +1547244080 1547244064 +2447177854 484126303 +235883583 1628768040 +2317262612 1904657023 +3046278941 3046278925 +1028965062 2066229148 +3655684827 3741413060 +989741899 3186703658 +3188239128 1067800283 +471256270 471256286 +3307703336 3277034563 +3258337048 3547458267 +292455539 3824845082 +3486565291 3500410402 +65331997 1045530292 +2848750558 719781481 +3768910740 683612532 +1651858157 3955106578 +264236693 1613010058 +2341244541 725896898 +4198438119 581148900 +581148900 1805010665 +413273040 2534971491 +596995326 1277111394 +3360810532 2095925929 +2507797260 401629984 +1790845224 2313255889 +2887211572 1234197076 +747355118 2914748537 +3840436707 781164752 +948486722 1095355893 +3161354031 3503884024 +939523828 2898743379 +2050412935 3947616128 +1452826155 1452826171 +2815924100 3160638656 +341209381 319156233 +3929544698 2957885085 +1492657490 1621278725 +169541669 226572844 +1231256378 1231256362 +3448927507 3691190144 +3310754040 670232569 +3829731355 1941461650 +2290968597 194697500 +913489939 317150957 +297604015 847737468 +2099138482 1720189787 +1355515504 2690949717 +3555396197 89324 +3627332750 1103474490 +179605618 2060029453 +290109805 916391937 +1815275220 673275823 +278827663 2405110631 +4066233296 1504172131 1504172149 +3105417548 3791512439 4274703494 +3947506804 1543547227 +3376274684 614971047 +2929761678 94459626 +931848419 810214728 +980763278 1097231762 2492974489 +1090276675 1592465491 3599978116 +3804643565 3363439219 +1947992770 2316851043 +2339729200 3118336131 +413532846 398069039 +2499743566 3682932687 +2636810523 2230703492 +1499191079 3801336710 1499191095 +2107164063 681982524 +2101111408 2791380504 +4215848779 1603680376 +10448547 2650483338 +299419590 464897993 +2796445785 3179392008 +2238490478 2014024239 +2390325807 2390325823 +3073096842 3940422643 +2792686027 3576812180 +2677046977 1187288811 +1787325370 633261717 +249778067 47596666 +2191288797 2033886964 +3516301443 4185470573 +1527276116 2640309455 +1314784111 685228167 +692027911 4126781718 +1042774325 220450410 +1651416957 4167259517 +1997149882 1997149866 +1832887556 46567919 +4200704914 3116439251 +1311181609 2578820906 +1106235974 310903863 +2857752219 3223377412 +1623616401 1988615229 +3335731729 1397456335 +586550819 1800461103 +2803378296 2198320379 +3576005161 3003901592 +647384806 3389466892 +1387914990 682002617 +993164755 2706514726 +1731573180 898438887 +459449900 1212913473 +4072617204 385899535 +1303218224 2016240533 +2823779289 3457375880 +3897870361 4216586494 +2997017059 425525322 +3236466746 3171254166 +2171726637 2822501008 +2229990108 2516006054 +2086599194 4034673360 +2272491132 1042987820 +3091780310 4037273329 +2427544657 3090336317 +3453096659 2981677313 +809548162 1593312651 +3597550652 572300187 +3821440181 1183809770 +3977075431 319166902 +1158959263 508109484 +1590303771 3846633714 +1744729940 160815417 +1535653943 1100866590 +57869282 2457239399 +899701112 3815561197 +2885490751 4268567358 +3510454244 1199057897 +1696295090 3693465651 +1830664031 617065118 +126939064 2703843003 +212972454 2713570903 +2791262329 2924113643 +1252234586 3056881815 +481696287 1370169032 +501651489 855735286 +4260567269 2863673452 +320653655 711289453 175114512 +2445481426 370016891 +832371940 4002287344 +1768112403 3722363798 +963569332 3939918601 +1029034260 1132953150 +2672788220 3324719793 +1153176064 4273434664 +2975315049 2975315065 +2401614247 4284695030 3913331635 +2543374525 2543374509 +2308814274 1699029091 +2342017410 1121249205 +3706825568 812697651 +934734764 934734780 +569487122 749957262 +3796294782 1340030574 +3236639583 289529480 +2309891636 4045808591 +2524630446 2998882350 +810878241 3566865048 +2009583591 1988905120 +1636912976 3888110307 +1124139078 3848878429 +112462700 2348507135 +1801607963 2784510152 +1034901345 2813243207 +2549941681 4098880944 +3059921098 1105381094 +3769097009 2004744512 +2712303446 1131804193 +3197029769 2211286702 +2147499392 6344851 +1508166091 1311353474 +5052267 5052283 4036861327 +490833985 1328119360 +2940408153 1066684168 +308092332 3031249332 +2114592586 3018801531 +3092299948 457767383 +2832179841 1071436054 +223300371 114503404 +903958227 903958211 +2504062113 2520848758 +927305409 683271397 +2359372515 2270218704 +2987378923 84896536 +1417167734 90566465 +282381388 775683703 +205783153 3222057446 +4258122142 934872511 +662153340 1717050934 +246630655 591128958 +2858519798 764471111 +399562606 3955434041 +3827321377 1909728838 +347563551 3149251294 +2674212308 3227538607 +243825357 2916700324 +304853058 629783237 2020407186 +602751199 1836916510 +4159413070 3342984911 +1721977487 571367192 +1874906239 629562923 +905107590 1977004743 +574041946 920619691 +3180142256 354897685 +3139187360 761508325 +304256559 1867022161 +3472060535 2819375599 +4209383626 319312726 2480909373 +1096641223 2903447382 +367710983 2276078614 +2956863859 3839574042 +2795180671 4135826873 +1408690139 1870232456 +2769480695 3553195462 +3391747987 3391747971 +2911379782 1934385463 +454866517 454866501 +2059120458 538453157 +49187656 3850715723 +2897963294 762572027 +479149423 1966809912 +3023754837 3397769816 +272992807 272992823 +2238064998 1708338049 +2577470683 1974988958 +2129917753 319696552 +4227767976 3847957205 +2071515213 2888821028 +3108940941 1138336242 +484161370 3353453245 +740793942 481028330 +1098089640 2967065725 +3824376576 3625468179 +82971121 3115097947 +3185352477 4283333300 +935756580 3466376417 +3190589173 3079531567 +2098630722 746919907 +1102440683 1534233368 +206305919 711774913 +3688255705 3949020574 +412781895 2447831277 +2063746263 2073189990 +2532362141 973749282 +2235902593 1289873664 +478002070 1529050209 +2160003640 3837597243 +4268520545 1538521734 +220331948 1485142977 +729010218 3810921190 +3190697602 2954825095 +1141248391 2626525056 +1069159801 3404713342 +4227012044 1806389303 +3062061494 113654151 +2797819870 1669550697 +318277347 2892456676 +377504993 1290563126 +3859510948 3356214335 +3268841198 2781020345 +2792912012 2610919521 +2556473485 1832250852 +3033089069 3319157458 +596412545 2000347904 +3183836091 2943148671 +3241327623 702414592 +1888296589 1851132415 +2761931053 834995867 +2697321898 3265298278 +303685068 1253582881 +2610438355 3887073623 3279662124 +3672423178 2685563053 +2115173400 7322137 +1598494179 3579587782 +3075521080 1917524179 +2979334262 1981070422 +3820459911 17009033 +173130008 1454569691 +686784517 889901902 +713848565 2572938345 +601366964 2887620127 +143440380 1606681004 +493503984 3686288601 +2923040523 2923040539 +545211773 2774164418 +2606856648 1651684811 +3919631347 3140331404 +1422154553 2853935806 +2113295519 1293523489 +1248382685 3397174742 +4065899798 3146920513 +2767483744 1392450107 4026669752 +2953343110 2739479265 +193983630 3248356249 +3533338156 3749688252 +2653178726 1495445889 +3603797831 1822762198 +1152111573 1159155280 +992312962 1722733213 +3330946936 2433742867 +1132650203 1368902280 +1942495442 1398642766 +2471472815 3075212268 +2199079268 1537916239 +367346944 3138807384 +3590448244 2878207711 +1508895768 2897258971 +2847964288 1430786591 +1108725419 3147330261 +3727795704 3727795688 +3708531694 3978129070 +3649622822 3002323418 +805099738 1695113021 +3924668622 254628943 +2629081926 4132466465 +4292870319 2844894715 +1612474139 951937957 +2482093302 3683415889 +83068299 1385297427 +1195556083 554660492 +1183796639 3188034849 +2707126379 1845399650 +1006388586 1322016717 3785122192 +3606116800 2019293068 +102840086 1679730421 +2598839781 3444374040 +3587497742 3587497758 +4099400622 1415277305 +155962139 2467774206 +2066680670 24280447 +2333862155 828679362 +8863176 3682184949 +694601739 731074360 +933768078 3631849897 +122307944 3790291627 +3979531562 2433061133 +2964587785 878964024 +2911393564 1235296519 +2151914960 2151914944 +1332197858 1418084365 +1510318848 3068107027 +1386623924 1386623908 +3519323673 80606212 +3121654676 2084444665 +551302557 1470654004 +289895591 658929249 +3750457854 3867439839 +2611521116 690753297 +2506885782 612883297 +376882044 3151446311 +1983977349 2012471929 +2671684361 3097968430 +2337841047 451723704 +1627951082 2860158299 +1241720741 670525626 +1287720919 2867588976 +199482270 3724774268 +2594258454 216334642 3950444517 +3331642721 4249610166 +895694292 275058318 +2763959774 4205797967 +2247840707 2913262581 +1991208135 2636660054 +1891903381 595277357 +917598859 2055396967 +3103687725 2677818176 +1279409788 1807481029 +1474132346 1474132330 +4194541369 4194541353 +1398114921 2561205070 +1087656421 4080855930 +2130096545 1311831140 +1954635666 3636445755 +2711413727 1224390686 +1627084534 2712266065 +1178627450 292312861 +3580004433 2696537882 +1876778324 1836706607 +4103290699 539277432 +2926099843 1665936743 +3268775023 623645358 +3973947774 1187476679 +2874040624 3697475203 +725134141 1298069937 +160351756 3492592220 +1267829480 2090599815 +3430343943 98607446 +2942422697 3220722712 +3924462628 692364379 +2871819457 2731900008 +1494016519 1930298131 910676224 +1229562934 2498593031 +3041209042 769812613 +338127829 2117645434 +1087965317 1087965333 +659818174 2806422793 +619483528 3726884060 +2428203290 2145984976 +3889141274 329219813 +2773896357 3956975532 +3646348064 1451218584 +3748032668 1245922695 +2471884541 3022766928 +3457256775 2896258774 +3935337365 3597831050 +346616509 2454988852 +760963977 4024283320 +4263723774 260208095 260208073 +2699684947 2620878307 +2396014599 3638649622 +2831024241 337293808 +1775065574 1950647553 +2678121700 3302655183 +3803122977 4203850486 +1790291030 3152826182 +2901904354 733033685 +1591316862 3464497481 +662064530 2888310553 3768677134 +3801659154 1291941438 +3697476113 2279027468 +3749218206 2504843466 +194234525 124916354 +445663653 1982066362 2146153571 +919320227 3107992722 +1627253090 2863997870 +3355468748 3899144212 1611051973 +3002156771 2743354832 +2976562687 1242110078 +2013472862 2013472846 +751424173 3884443129 +2351281377 2153496118 +1126432088 161993115 +3246329594 3246329578 +4099408083 2039041082 +3896481306 3055110891 +3242376318 3121527369 +4111145375 3018740001 +2864993642 1447008461 +400593977 3481884072 +4007839780 1402739053 +3641848258 2040812643 +929797078 2134725994 +3150342133 2387977916 +242731391 1167209214 +937057386 1455389389 +32301007 113701169 +2282355012 1806919199 +3224020147 908150220 +3169373319 3917084822 +2457988444 2457988428 +3095155339 4139118804 +2948508155 3074403602 +2210317414 2210317430 +1094207832 60519821 +1763647112 4134899750 1227450816 2422622032 +3749436751 551773068 +3846375400 3498406443 +3586736064 765921983 +2508717933 2508717949 +1186453833 713485753 +435341403 1841664008 +92769215 92769199 +3275095764 2834897665 +2626879814 1148574342 +2632586603 1870640994 +4114885493 3653361126 +1050455904 4037547059 +463885075 463885059 +2343909334 1718774565 +466076470 194338885 +1647884603 1053468245 +1323124706 1882804632 +3789909211 3147953420 +616471527 3205459126 +1480444795 2902718078 +3471113723 1038864062 +3958265984 3895808389 +1399756762 4217281398 +3967465946 523407915 +3637920635 3259381330 +3578484536 1659336583 +2964433425 17620918 +445027863 2515041684 +3252013421 1057205320 +3087535223 1483633358 +2175220812 2175220828 +2136309606 2883261744 +4024303077 2138484588 +1429443412 1949363503 +3165218114 1084909283 +4183690857 3739310399 +3267837689 1319994078 +1551484195 2363491363 +3536236236 3536236252 +3260515571 2200391494 +1201740576 658599496 +1434854260 371838863 +1069965630 2739606687 2739606665 +116963880 562892020 +914294228 2650156207 +3952970236 3841996711 +395360187 242083137 +5396272 2000999892 +2789348616 3207559216 +898672127 1517654337 +1691861867 1691861883 +1334381419 2817025866 +4030925688 2978680315 +756828418 3597197597 +4263609970 2160502117 +1417925380 1689333572 +404365067 1726837083 +2030104946 4001109605 +2922061022 199127401 +3077527789 2233379963 +4184567782 2317428503 +3797024929 3526426832 +2670063404 133637820 +3656473236 3169949300 +2953846457 2953846441 +3933842395 596582201 +476584500 3957407695 +3359964811 1294276981 +1171527710 182581046 +376897816 2223303333 +1758277799 2718144246 +4079026284 2023006080 +695073340 1087649264 1948314737 +3591443176 2329106691 +3239411621 4055139939 +1587838121 2918101398 +2059807683 150397920 +2516350803 420512704 +543358206 2575642179 +3953380060 3470284871 +3616305197 3616305213 +695200921 1333742117 +603687274 1836833733 +3420225300 3999191360 +4167360210 3660804987 +830332726 522609159 +22704939 4098998104 +350875589 2974053132 +3093316680 1220933321 479268848 +1316390506 1205874598 +3762788094 38666761 +3902094843 502305316 +528344946 2731818253 +2589494479 3362105806 +3649316528 453568277 +1235971033 3520775816 +863203643 1375240210 +3523432397 1748410290 +777028866 3938542133 +3545928442 421881813 +2403426209 2443507654 +2801713592 3208588371 +506854174 2902085695 +596580511 2376783708 +2574588165 2919080822 +3388307950 514225785 +142219803 142219787 1932990596 +3922122229 3370303443 +1227826089 3728024334 +1828104716 737450487 +3443801139 3272803255 +1885328943 366881774 +3901035991 3766575462 3766575481 +2234148534 1758969098 +2075628426 1853381138 +287586138 1443046059 +3728889103 4050380430 +3728600699 3439555368 +4259917725 4186924137 +1810652663 688293743 +922375455 1398665122 +1691267296 807390470 3884367799 2902622697 +2940473426 975548691 +2467873147 184063154 +2449888115 1123370186 2449888099 +1574608064 2133115475 +2351530837 4200185564 +1809040016 364085223 +3303829929 1752637980 +2065915706 915317652 +2122472058 2704567819 +1724822538 91245118 +1720104739 3821916166 +66307572 750821145 +1637202027 162615394 +275306728 784366288 +47899833 3208248969 +2492681349 1759606092 +2025137449 774471566 +1074814185 3267511000 +3258439176 3320180363 +2710241566 1808974399 +3410280363 2822355490 +3048611116 284224087 +872410891 2337103183 +315525376 2602674963 +2720145723 952515455 +3396085182 1715431967 +2943346588 3841544016 +3015869805 1748503172 +3429051173 4069232665 +4247324864 1201194572 +3016302550 968996274 +1466447960 4044403341 +1017144429 3716028306 +864360317 3316375125 +4044716100 224355267 +3940461298 2928089829 +234680041 4096926117 +2757275473 144440464 +2704827342 2704827358 +538910229 2784779036 +3565237729 4239694576 +3113834652 3362160017 +3747115298 2893321771 +3063040877 1506597317 +1504639900 224300616 +2050802936 1705644667 +1248911241 3098535086 +862233053 3295334132 +1159356426 3531943867 +1573012162 1526847273 +1853029471 1040402824 +1848014414 3029089487 +119548141 614493458 +2673820972 251257943 +4216210399 2067060744 +3869877475 954716 +1350281332 559590202 +3112777902 3506721545 +2834182839 1481374516 +3961104375 2741201350 +1995105941 3321785816 +3061992004 2468014367 +4171129191 3874574847 +2485897106 2920464899 +2235275732 1162605086 +2393023850 4094322139 +650279877 3374896908 +3625199654 2234846312 +3736716887 1415956436 +69392171 1432055893 +354611699 956490138 +1776812691 3683197207 +2006140137 634747598 +4261134185 1011765838 +1735759466 1209780443 +3896398611 2904344300 +3250377694 3688427522 +2985950955 395070452 +3122589538 2398122157 +2221931461 2221931477 +1627094557 3370616756 +2363962070 14957783 +3563755572 38634580 +2575616410 1175018859 +2166523559 4032428256 +27515805 1346536860 +1934022903 1650633571 1871154384 +3957963479 2321118281 +3679747432 2919328427 +1629964239 3218475726 +1126633021 1296556341 +245729919 602656086 +2211299325 2045066050 +2918367672 2368140475 +2241916771 3210270922 +2739606672 2670812835 +4243892909 4243892925 +1453587897 614416265 +3677356422 2459067873 +3042733110 3061733639 +2802875039 2649819208 +3746319364 2300291657 +134020062 1900052073 +1497943508 1637614767 +3214789329 2084545866 +1377319400 606283819 +106394509 2292901618 +258304883 2947032602 +4238981267 1378717562 +3922168011 3491518338 +3412188594 2578556702 +932329108 254536431 +3869769932 3866706209 +4106861075 1127257325 +3188676194 2485451843 +1376338354 3599919909 +2129825532 748206247 +2428248517 2428248533 +2010697910 2827442912 +3645555482 2692912464 +3310177846 3862607265 +3750396663 117741909 +4077960827 1855636264 +1670733467 3314526732 +419199231 419199215 +258354659 328008902 +2828830771 2708105306 +106346552 847511597 +2170333334 1554552687 +2622336808 910867435 +2140101369 3349951976 +2550391810 1197617627 +2315798020 2949290735 +2233689439 1013891332 +2724653608 1696403296 +3791779689 840464984 +730231770 772760501 +838254276 4004741252 +899599380 2096841593 +844605803 2868884340 +2832505499 1638883858 +870984474 3550599677 +1769025543 70163200 +1011060204 1527821573 +835979372 3704177175 +2315611436 1921702999 +4019751651 984156405 2824585245 +342158473 2749389752 +2974777868 740931809 +527084186 3863042147 +816551041 3776051111 4131970038 +1642174938 1836462454 +2096464518 1014790369 +3590605638 784498487 +869673566 4163154431 +1609308007 1059278611 +1847393123 915473746 +3669530366 1318433225 +118870010 559310475 +2910002354 2910002338 +2605255135 2825341596 +3472514130 639587603 +1557931441 3205855680 +1761220525 4004726098 +990227091 2095809900 +3367102985 1200835694 +3628036544 3115702136 +3891519378 3068719813 +2597048882 3772507315 +964274221 2810429124 +3320022732 3637609062 +2200627423 3702762541 642892170 +1544692554 982355323 +2848876351 2166890106 +329578510 4206001689 +721179216 627476372 +105090987 2270898740 +3883106574 1758734607 +2060972996 636796319 +2659064283 3468752716 +2655109697 1980610964 +3776607663 195510904 +61040812 3024085463 +3273808097 269609526 +4246037745 2395160394 +948113182 4205321523 +3506311051 2410848943 +3659434628 3792965065 +3509828285 3481620247 +1598918635 4061761268 +3669666766 568096089 +3684951283 3053546138 +484648734 2543227967 +2482485726 3438909545 +2623457930 2957120205 +3532365457 46833232 +2116968291 100673738 +2887270185 321613198 +1255475001 106585768 +3284005556 3053487694 +1505613347 1758992668 +294390615 4134918630 +901252545 1370558166 +1878901768 1317584176 +2980657911 2758267590 +1447720337 1353928938 +3181157611 1753941474 +3744573325 3895116516 +419255428 3670805471 +416516070 4211011329 +3897146660 3491020735 +3724652525 1700926034 +3299929077 2541974204 +394024616 2241569493 +939479057 2947728996 +3422796937 3422796953 +4236792568 3233353551 +566528909 3043471076 +1581605382 1832472417 +1910451715 1163226812 +1646641609 1248857976 +2595265259 1862524898 +4257843121 2058683990 +2499743552 2358734994 +158960137 4082388024 +3704867446 392673233 +2038312125 3407997072 +2631423752 427327135 +3652074318 4215757785 +2027810030 861665967 +1422198664 4197112587 +3373230028 1329620535 +876639787 1819936162 +4292758269 3354397780 +2658824813 1138822235 +3462188009 235843918 +3472540104 2646790900 2629766621 +905410234 2928666315 +2575078349 1813818290 +2987804907 1142213108 +1769491922 3663888773 +3721571427 2510643146 +1340754667 3643776281 +2319099434 3293811725 +4282921239 2614390410 +3263481204 2869089689 +434752906 1427017773 +303381951 1730205931 +1308880534 159147442 +3410006683 3410006667 +3585559639 2135921865 +3060189185 617404822 +422206681 1991256478 +555720034 896586516 +1001319222 3124904786 710690321 +2485771173 3806643372 +1596376754 2081081893 +652664168 2775485117 +357601866 3621145197 +2301775212 2018770470 +1359306482 2102874990 +3129830457 3852557736 +1990252497 2419310096 +3016158735 3894402951 +3816236668 3880733484 +3151193347 115204336 +2425496814 2215649967 +1871765348 3479891812 +1094599493 2150544963 +4273792497 4099799664 +701511649 2747593432 +55952760 3087391725 +98832621 1702222661 +3646380183 3145758128 +4266638505 8781336 +3794877281 1954576822 +605573985 605574001 +3382541738 3803601914 +34212992 767914603 +2278891609 763489288 +2295839043 1188615866 +2758304994 136580834 +2090802107 4279514757 +102281443 2078176586 +3147748052 300065024 +3229157796 2726964521 +35431152 2013778056 +3687641473 3687641489 +2793909915 3264732676 +968156012 1136788247 +1435755301 3704525612 +2588192819 220291162 +2310289488 1341273941 +1174063721 2462884696 +2633360088 2633360072 +3644528998 1577646977 +3504250483 1708052057 +2646147314 1010597093 +2063025099 1581234306 +292690414 3205071096 +3083053971 3691452538 +2322541525 145981900 +408764910 3088834890 +2211367358 2211367342 +990507777 4054420096 4054420118 +353501781 2153360348 +3419405951 1466802664 +499328368 1244917589 +751331166 3715807465 +1571203351 522499772 +2211684198 3961777537 +1107834946 968000075 +4183740392 4183740408 +976163967 387793918 +3805810151 1795936274 +3052259791 3052259807 +566852590 506337203 +554876378 1576749867 +3569352512 3569352528 +1058082709 932601402 +501278163 501278147 +212284642 3649858279 +2156027291 3896072964 +3648266148 469573016 +2640585557 565447814 +2858615993 4074794792 +3992469953 380303078 +2734590116 984685097 +244218112 1214562583 +3543271885 1153789348 +3056478095 1905407601 +191607018 474943314 +1020498988 3977396567 +2134982309 4172651962 +2706585245 2466183458 +928367547 3607306098 +2682562124 15845793 +124439949 1960671460 +1570287223 3467883561 +391237500 2439458097 +442229633 2317209254 +920908177 4244470643 +51740000 1138937425 +1209526435 547567772 +3929124869 3578629162 +626717481 4146907534 +1229726429 3131724466 +4184947560 831583636 +937265820 2378249095 +547921427 2087770092 +377617302 77532465 +518557697 670319552 468677511 2208103862 +116825964 2801325719 +134914626 3938282979 +540794974 474100735 +3391539494 1628350145 +157671904 2875364261 +1838580664 1005673133 +2505929111 3105476784 +1360029376 1101709247 +948255659 2763845172 +460238733 3158203108 +4264892926 731376351 +1149159065 1149159049 +1209858548 2040363791 +3643979514 3839232907 +1086232519 3003706944 +1129335144 4228704237 +2095276852 3455396559 +187185182 2924500777 +3416457918 1940304841 +1801858381 1591300132 +1781279354 105876290 +3832260659 3832260643 +486249385 1225356046 +496884068 3726622505 3726622521 +594539402 3934329495 +3397714684 3412308647 +2225257923 2402335210 +3270675613 3630099233 +2303940823 87349872 +830897529 1874298216 +2688962019 833395786 +2700695041 1770152832 +4167901728 869054565 +1562666083 42619990 +3064239127 2618630192 3846286211 +880965818 1740808335 +3282213862 3282213878 +2651873077 2149903696 +2373420168 992322077 +3104122927 1914585592 +1195867193 1195867177 +8682148 2735763608 +2336713324 2909571095 +232557364 2570314219 +704762400 1088276595 +3560577962 3245968539 +1892983251 1908064058 +1325417145 1325417129 +2283037387 51873172 +3051720397 627035323 +2593432829 2654261856 +3958565931 11767986 +654011677 2060240052 +978473519 3226211194 +2140874713 3495085736 +711929334 3271907911 +3888314862 3320803769 +3811404122 4202485931 +3823609451 816511604 +3885943517 2916650037 +434387582 1078465609 +2260966853 3941686540 +3678539419 3288137234 +3213476233 298692590 +2986415204 770405739 +11153237 1476781036 +3338384157 1530590882 +1145074918 3371275825 +1844157140 1948166437 +2932413797 847685433 +1875351575 2894759651 +1847624293 1465557305 +2429745271 2262734580 +3653592112 29144981 +228448133 914145213 +1173882738 2540943461 +380940201 1735427864 +2842465473 1995320256 +1737074114 3215978602 +1707433653 1669337676 +1316322677 4159995690 +2732658960 2907264901 +1664453637 843803596 +3921748086 1896225233 +3929600379 849618104 +3261166133 3136883300 +2232734967 1993031888 +76252344 3751931309 +1639405713 2147194967 +2425850127 2911683214 +2476692429 818998194 +4100692490 3479403949 +3152950211 2600172540 +3872729077 3872729061 +1787958042 3723760107 +4188656332 3528906551 +1978356983 2557919430 +737244822 3273502257 +1005441579 215023490 +82057588 655626639 +702125763 3072350871 +551501120 3661668575 +3510079863 319510498 +3690359258 518562347 +1990073384 3806745323 +2688895637 3041169839 +4096901453 3391156900 +2155506451 1956614515 +232575825 597731462 +2917657201 4150409932 +3179077937 1189854144 +2507459129 45621256 +1225506800 3984533205 +3861005720 3757280859 +1337580828 2643923729 +1739131254 1739131238 +2747351863 3985296 +1848490989 2636840530 +90108245 90108229 +466648650 322358893 +112930641 3920329862 +4277679005 3336869668 +806702867 3297475322 +3744187850 468212973 +4105349968 2235805411 +2124904005 2795450010 +1262141268 1262141252 +217526871 3223600870 +494645640 4055398667 +37254005 269948172 +4207879166 2534987551 +1720518275 4076945468 +3714954564 2285444789 +1812741198 868404280 +2568236128 1522654003 +2050516937 2871681081 +67200350 4156779398 +2395784560 1475633867 +2086926222 2971024665 +1478518539 3212719861 +119783958 233545953 +1990633553 425392006 +2026197163 1156155605 +2502321465 74537150 +931866526 235888063 +3148018647 948296550 +4143176416 2064879035 +359150125 2097151634 +2547064610 887092285 +3342445184 2347234907 +232072246 4236771601 +3453961638 3162154049 +1893047894 4131930471 +1255616856 3078042867 +2397952684 2788402492 +783574819 783574835 +3771437235 3973688374 +4141663639 881527984 +509332963 2769445191 +556137222 2436946246 +1144128109 2337816033 +867194855 1841014777 +1581372053 3313785132 +3126102749 806787554 +292937613 160361188 +2784578609 2020798758 +866751639 2408308739 +1233131254 3495676750 +344947366 64885591 +643488171 525650382 +1222440132 1222440148 +1646354631 1099651392 +1302749825 3499512231 +1899368675 167714768 +1847585038 1262701209 +259114184 1636861596 +4119446871 2996045769 +3931987978 4210962349 +3006162025 4222827992 +1055477785 575215432 +3963000314 3555596445 +3651202099 471129118 +290528089 2611875080 +1816497018 3950678301 +2749588539 972474610 +2152450890 566492486 +3843076739 3843076755 +3886954567 4265777088 +1981802320 1525811115 +994486734 994486750 +2200369743 1120309330 +2225051752 792521643 +2113500605 213145730 +2973323481 3594143112 +3494083541 3494083525 +2161980642 3213923830 +1737569347 1045417383 +1566019811 1892807645 +1348885150 3241912898 +2788806362 2264965437 +2866261721 1265392267 +160703077 2033329402 +2715161822 2718095743 +154846030 3582030809 +1889023770 1503575531 +2707278147 1760001830 +1519747236 1029276223 +4202690792 623537325 +2774264212 1747669224 +1817507689 4072766030 +1328309147 992759949 +2211759291 2844879411 +448707356 1844688396 2023625169 2983595024 +3798338154 1252312261 +3124250631 3124250647 +3641320301 614411653 +1161444134 1147037287 +2232072337 941823663 +898418124 3717747680 +3943063298 1932425614 +1822971201 556661933 +1328968877 122309486 +1653137608 1653137624 +2176488798 2528715519 +3807175042 2893527140 +637360561 1309288534 +1240723798 1200699882 +389741727 819703390 +859400904 1801656541 +1480500526 801485743 +4288932446 3439981033 +1325429333 458579706 +2188209845 1544462938 +2613950839 15658281 +3729288747 386231732 +1094390350 1837435931 +3716919295 3253079656 +3012112167 1631875862 655025459 +1623030977 269364836 +1056848335 4181000401 +966894335 3094583166 +3789717085 1540890196 +714276613 987558717 +714420136 2907402412 +1160979308 1413838978 +1328414495 3938343090 +1015110528 3215133317 +1611192713 2807990254 +2493323946 2639329691 +2137254899 3195851149 +183376936 2689653299 +2051543491 1114895868 +4073408980 2134395689 +3558810380 4177800183 +3234672294 3803137521 +384909387 120398200 +176646551 707475622 +1493947295 3432915784 +1983249260 3267066854 +1292474958 2484988111 +1468277041 2498660397 +3672481059 243289123 +922500493 215203338 +1857526092 1857526108 +1059851421 4189793007 1229846164 +4121111387 182272082 +1985879532 2813638913 +1373505637 4170375993 +1369389440 4255614092 +3406367247 3406367263 +3215103349 3215103333 +481713938 390041005 +1315518076 521563175 +1152932240 2937597906 +2974781395 4081019194 4081019180 +981093697 1334287680 +4281681799 1205836182 +898495542 2399596033 2222420231 +1685167759 2916915982 +1020247529 109572953 +1207553270 1144891207 +2250764924 2900539697 +1534442067 1297371308 +1668638075 3447276095 +384654 1742217618 +3828622815 488087048 +3357422838 4253900615 +1300496908 315570401 +3603099803 3805581918 +18333448 3110438872 3699256989 +1695612619 3837860244 +3075443578 205033757 +2197337856 2197337872 +3479290185 3219342830 +3270868114 2519836461 +1685698066 1920662735 +3772951388 1624490439 +3927147074 462937162 +579672763 522261604 +2934073668 2456532511 +3771069388 4016417267 +988535143 675757344 +3355757757 2626571668 +2475182921 2291041255 +1549818438 2722094033 +4283200735 4032946510 +182745964 41723237 +4248746660 1304416319 +738637016 646885403 +1595358137 1788019774 +2600166786 2076232629 +3580627720 18177437 +2087005399 2856687206 +3344997048 2501087163 +2921256996 2921257012 +2215171557 39376156 +845712494 3365212454 +3354487165 1782828642 1893441035 +3201443797 970241116 +2532193087 1177261645 +3403256608 1954716517 +978913176 1915155547 +1713532560 3838927399 +3574891170 290039043 +4059449436 1119086801 +1376097891 2177613258 +2501679609 4144879070 +4017091488 2369553651 +2015219080 2015219096 +1081677896 3332454749 +1690685570 3266352996 +1030432709 1030432725 +2452092950 458763963 +2940586537 601708456 2940586553 +657179205 2836498556 +2865048378 241372234 +3418648867 3913161244 +2626202913 2351467254 +2842636797 2842636781 +3199200070 3199200086 +1677942987 793573302 +3525751095 166263174 +2628723315 3919664551 +49770118 1890701227 +2150882630 396711223 +1547278572 447462295 +1041449547 324105554 +3015890220 2226789606 +2138884567 334223689 +1357746206 22704169 +4281193644 4281193660 +306501572 2254416265 +996543756 2376501736 +3935081168 189472117 +1043640240 2633011733 +2276760600 3109140941 +30965676 973635003 +623735521 1737218080 +3648852490 1811490163 +1160189769 3711668959 +2354797029 3637412722 +1315123833 3400491593 +3976647795 720495363 +1072487565 786379250 +2722878893 3053531100 +903623733 4272303996 +598224055 3636356112 +2701478911 2052498046 +2164723164 2164723148 +1490614013 1490613997 +745159489 742082390 +579173245 579173229 +3147450993 2061317200 +3328994171 3618452132 +2432132007 3879955876 +1682657170 1955480275 +729388946 40475347 +2020608950 3958739329 +2686571685 3124871098 +555426230 3466434433 +3572776926 928646633 +2387840010 746072499 1431286752 +1843022375 1401581503 +3706698352 1029865027 +2239374077 3267290101 474289218 +1867492659 1835902810 +3596995592 4239967647 +1009779544 2019960099 +3470413373 3735628308 +4223249950 2438905406 1665997119 +1722625944 2843921884 +2458455859 517705376 +2394146711 688442115 +3278007274 3773915374 42028269 1933619236 2395659505 542147968 3064911458 +1140958448 2860866034 +2340594669 2340594685 +702095714 702095730 +932178174 3572677650 +1959680828 1497234902 +3914009572 3914009588 +954982360 2451292455 +1000762258 1185525307 +2967257885 2395066626 +1669049854 3550572831 +2693965942 2693965926 +4032988594 456996534 +170132525 170132541 +2963107438 2702764082 +692931234 2796322069 +3922274995 2688664387 +2653733899 1658825519 +1112555003 1599181348 +1000365415 3776404850 +2991170111 3907676456 +2911915166 4209946058 +3689342475 930882388 +3738972150 3399450705 +3085472439 975107590 +1480619385 3462258014 +3962050119 3962050135 +931171011 3049961274 +313297530 280423253 +2775956698 1381518141 +2415371108 808955291 +4006773285 4006773301 +1373908044 909228961 +169678202 1707659037 +1289452978 2944851749 +2748488699 3750464548 +1254319024 1637215765 +2384090313 2087942254 +3570018864 409351563 +3454831718 1659611370 +705888750 703334841 +1325163351 3134816875 3067004339 135714742 3820011844 3407493221 +2760507251 2017272346 +4269590193 1332529328 +1181863531 2631901205 +3480661900 3413029815 +3470822011 906850111 +3235794368 1576297811 +1749156350 4110542110 +3095815338 3177990418 +4291300195 183102666 +4253427868 3292934331 +210600441 1593173103 +3654511558 3511052474 +2708049249 91044752 +29317999 29318015 +3244452055 830600637 2896360864 +3843873759 1490298129 +788326645 3978475946 +176300083 645040801 +2651135585 3203736887 +217591699 3432879638 +2701738751 2157213566 +3208614329 3390203454 +288032305 1894951891 +2121241566 3886401129 +83202754 86878790 +1393421628 4207223007 +1130961881 4151760520 +376734082 3681017781 +670130305 2677454658 +2431166352 2923415465 +1525516231 3941383744 +2196573831 3459597202 +4013533346 969176853 +1847374588 1395507889 +3490148066 1353202910 +2545140249 3908734280 +2990861048 2704185220 +297252680 4114777187 +4253095055 2704497944 +2044147960 3445395271 +3588595660 2222624311 +3550111226 370051229 +366444338 2487040933 +3743285480 1489711824 +779095426 3597236637 +1086743233 3108861376 +1492577821 699979700 +13951013 1948047930 +4222815503 1239256718 +1141968886 776147658 +196648492 2303542774 1073021139 +1349084894 1944907647 +3742272260 3742272276 +738771916 3887998248 +167657092 1427801967 +4050521741 4050521757 +1675396303 52761038 +1998977731 2610066103 +1122299087 492882392 +3142107969 344678208 +2610259815 1395771168 +3524635116 3775278605 +3906589978 1779867854 +2330332907 2330332923 +1157328368 1157328352 +3029200139 1181493314 +1933150785 3418306020 +1766491558 1716544577 +3969766334 3969766318 +2526973227 1184381620 +519051917 1090112484 +1334085146 1201609469 +4291503746 785227445 +2916043080 3847248989 +2962691173 1658133242 +1847446256 1223063491 +3365778148 3024133375 +3285883102 109732046 +4019840616 2537928107 +2795621306 179549661 +192142716 285931057 +1841058871 4135096966 +2291980871 1347504606 +3485775812 2076885679 +2040938627 845947383 +3147536894 4214303274 +2204465014 1320881873 +3604357649 4147255222 +2741325182 3061382473 +3139943502 3299176409 +555698275 2269049820 +93095953 754203917 +1659652175 3937144497 +3248933078 44358762 +2738241942 2561567329 +268444435 1127692026 +3175149986 2403099157 +880674942 543645279 +1688520363 4152015377 +2731429466 1295063466 2648411903 +942650863 1645963064 +418235411 3293199703 +3854241188 1232501055 +289221821 3474166219 +4250972986 423240797 +3046224940 3987309378 +1481354223 3995052344 +192665592 235496576 +632959888 4095683509 +4056860355 990804144 +2951901317 2141659482 +2142401944 3966546739 +2784001526 815197655 +2939398463 223571518 +182327644 182327628 +2741956188 1741657863 +2033410905 790505442 +2200012293 4220446 +2735130056 3250624881 +3963991954 1391868086 +2884963882 2627125317 3703917586 +4032298748 1451648689 +2446773979 3697613010 +3614668522 348402258 +2029564644 1577714383 +1981642849 1365541046 +1967445206 1901792487 +853464629 1458186590 +1090343035 3385176493 +1301281221 3735433498 +2351659642 577883677 +426904415 2169243928 +2452705528 1088591062 +3703560037 3875541996 +2678904081 1846766022 +2381048712 2381048728 +1848291049 1446074584 +4205526242 1845733355 +4144361105 1867943494 +2886082207 3858869101 +2186222356 1283561516 +327901471 3350303690 +3243033052 668282193 +2712294055 639638752 +2995212443 1545597512 +853995595 1821132290 +295583702 295583686 +3121351096 932263872 +1378477231 1753754107 +2694062170 590278059 +361818337 3827217264 361818353 +3009076701 3544980480 +2993527842 3733768859 +1466517149 934947106 +1954975096 1954975080 +1322602790 2153959281 +2335502279 2063976089 +2483532927 2703984171 +1870226117 1870226133 +133114132 2440931952 +290436073 373283161 +3090744860 1966649100 +1418202163 788747168 +3735541770 3735541786 +977371676 3508523527 +3345460063 3345460047 +176808523 3792649236 +2279276951 785057891 +566063947 1748795138 +3273330062 3273330078 +2549957507 2634219477 +1427503384 1427503368 +386619657 1339894062 +3506742359 3506742343 +1982544850 3624872837 +2173685049 1822625005 +980763280 2526529699 +1631087782 2983397719 +844765969 1423481818 +3703450877 2792212239 241892852 +3002101828 3869663513 +2345481092 749932432 +3302746838 162292609 +1995027492 1441174719 +2012802200 1960604507 +3723455436 2883419455 +3724047222 3827155665 +4163182392 4027618572 +2482995353 2486661320 +282735547 282735531 +2282147548 1276619655 +2339907170 4028918869 +3400282365 519219262 +424599008 3072804773 +2125143630 1446814159 +1467186857 2513090565 +2017113797 3824891126 +2252382469 3628623164 +823264157 3696996404 +996820162 538970139 +1755996032 3814994779 +4049992832 4172428036 +1198039255 1085616748 +1277717793 77843168 +1078437640 952889757 +1478957649 3105026917 +987906734 987906750 +1680849265 673246438 +3160173639 2869966660 +46445079 1923373616 +3181753394 3185224357 +610480035 1734843686 +3210968181 2929513196 +1702802558 620239753 +1231441819 655315204 +2132333740 3222719191 +2816699719 2449802966 +1090357482 958302299 +2583369462 2396633555 +663904134 3513540599 +3761026526 3761026510 +2999602527 4204903009 +304644450 325331574 +2168282632 839608628 2073757341 +1129420934 2570285777 +138860710 2911309121 +2171002158 2884938681 +3970592692 3750466591 +1389048868 2306442767 +1617147495 3214990963 +1520328949 3222568589 +1967706620 2644676519 +262450553 958977374 +3682892360 1102552587 +2817586269 3176181346 +1899912010 2927895921 +2130046441 2130046457 +783629191 239908224 +2251657428 547707913 +2068694314 1563414351 +3913035660 2611046662 +9591984 3784570637 +376079758 426933017 +2438379530 2438379546 +3439847651 3439847667 +295182649 3950791870 +732184340 3348057209 +3630537105 3908901686 +968552083 1950716268 +2993107689 426392284 1276417877 +1098453741 1224569823 +700189042 620945011 +3809129051 3302409549 +1082494440 2050909227 +1402759560 658120989 +3056344906 4137030834 +3560133624 80555899 +3745450740 3875258719 +3825864585 3348735890 +2147088705 1121077406 +2504573200 294120501 +3978562807 916186025 +248843381 255579660 +3921962180 3291127967 +1798690806 3672954839 +4245519823 725421272 +2674204851 3265032316 +4142675432 2648235069 +322664946 409359259 +3796216832 3796216848 +1353711140 688722601 +1576346024 2430860139 +463567332 303669711 +3771948555 4156361538 +1594570304 3735447237 +2084833686 1693186428 +30880640 1707479699 +3502856481 3502856497 +3047790639 1230563044 +4052877235 4225074906 +1516814790 417925803 +2561598732 841282272 +1273593748 345232879 +160530147 698344077 160530163 +1033050840 1406966816 +2181325960 887767563 +1854702826 4046797901 +3132489725 3917609803 +1813138056 2831897629 +337327834 2161596715 +3738061231 3251685807 +2969028180 3658292511 2969028164 +540775993 930724149 +1503148138 2477026943 +1504744241 3047811852 +1930548726 454283857 +2999617744 3504686396 1154834293 +603458096 3480750485 +977858826 4040369034 +4220932247 2762005936 +3539379505 1375383275 +2354788455 1520028192 +437127638 3981313030 +2560174451 1748244817 +2262455464 2854530175 +2951618810 3990743453 +1682636456 1365768528 +2197072557 3559435858 +2133775018 2133775034 +3276862148 1013852831 +1035192654 1879434713 +2714026218 2461773915 +2892320141 1176519713 +4097556371 219059322 +1115264357 3753649571 +3230062014 1179529018 +678099671 2003361894 +2584610260 2584610244 +3104298431 106265512 +1442027744 779724979 +2695472916 1825995072 +3933457004 4056775063 +1132259419 2560739154 +4042994052 3748590272 +2141930692 2592905144 +2844210502 2686085571 +2150873736 3861666229 215037948 +220964903 3803821408 +3314194696 19851147 +1867812848 840865475 +1376852166 2572097466 +1314152382 215136265 +948399087 1707301770 +501051923 1968621987 +2493352633 2902548776 +2857909432 3113262916 +1344554735 404466222 +2752229355 694546164 +1138191065 2770154398 +3762841041 1614687613 +2632890386 499893317 +663010583 1291168550 +1308231671 3080358342 +530205133 2363633060 +4103344268 2434141303 +4062531798 113131751 +3968456246 2466002705 +1738139345 3896924934 +2587786223 3210549550 +3531135738 1312864157 +2028429930 3191860443 +3488923254 3561477073 +3658224661 1907373754 +3438203673 3036041282 +1573294201 412446312 +2426192970 1016589984 53257715 +858259388 2525409110 +1685011269 3815254396 +1661104147 4023807482 +1057567977 1057567993 +1537958543 1537958559 +857758363 2468889125 +3490513511 3722314520 +4193331613 329548322 +76645945 1779846078 +3560223291 1240765156 +3758417569 1219956576 +1080755086 1080755102 +1413305245 3074037141 +2911806096 3347703971 +735637931 2978246690 +1381788952 3212819675 +3137097783 2452768400 +3083846404 1611661151 +2531152536 402392411 +2246993901 2234092114 +1155786671 3001540561 2722194668 +621031584 3851979763 +3877307865 350299919 +138150539 2172125378 +2900543967 134466078 +3398932132 2426545215 +3172489770 3612733453 +2414869946 2043720700 +782602339 3517074378 +336435199 190442091 +2829610260 2502145647 +416785629 416785613 +489071623 2886898962 +3497019612 4240618055 +1699381077 1699381061 3108395404 +2126006788 40068430 +408062087 3505187990 +885724391 2224708837 +3686562809 2257003119 +3735378198 2487958951 +4196420487 2040588249 +963956851 3856934149 +3035521258 3035521274 +1699822852 1416489455 +3037286674 262840133 +439185784 2911477755 +2833346745 2481222462 +2667715784 158162759 +3202579386 2105707429 +3242260478 3242260462 +4283354505 3067997027 +4225352933 1557197946 +3191358269 1809489775 +2306857878 172404007 +2553101690 154650397 +1539714310 1539714326 +3947774562 3459416149 +2204738419 1380732428 +2228626544 1041937740 +2255604092 555757105 +3112298496 125843475 +1872055951 4270365240 +3242866582 292970763 3721756977 +2497009166 1507227673 +1425547011 3315126716 +2199940985 2199940969 +1734737793 1183922176 +4025815556 1748898648 1649400503 1004558956 1291840901 +2299821134 2386571225 +2805880802 1572635242 +3169727849 3556643918 +2746236777 393466446 +2509318567 444895734 +4002296653 2956788401 +1136745926 2852205066 +2610962949 866011308 +105381049 2622674728 +2233840413 3076060834 +2970536480 4112523463 +1581901556 1581901540 +26196288 431719180 +419555246 201307897 +2800842656 1078745196 +2471078558 2980189149 +1070321258 3621122265 +3215004311 434858377 +2013032237 258147282 +2113709980 4038843015 +458568237 3711237778 +3866385935 3627028888 +719420630 719420614 +1748036647 1764357120 +592844207 2768388844 +728086793 1512196408 +2258370910 1997259906 +2224275668 1200505996 +994767392 1996171379 +1482957251 2657602749 4140045095 +1544236272 1544236256 +506680303 4125838138 +2789309169 676614621 +1452786660 878836687 +543471610 4170030749 +2679615843 3509337820 +3742116195 2254283925 +270475061 2232221841 +2220230380 2220230396 +3615424058 3615424042 +519061136 1144159413 +203279161 1911757749 +3938081483 4031381496 +529053254 3929468983 +1921862981 642878314 +2762829324 1184556543 +2060124034 3057285237 +11559716 967578047 +3111385284 2699376731 +1566561662 2759674338 +1567080461 1402599211 +1927549353 1927549369 +2388660165 157577573 +1846321891 494156253 +603413059 2293240963 +3138665671 3544733503 +3292331729 3171230479 +3034488626 2013372707 +2157262155 3051545858 +2266555811 1677929477 +1893483814 3400226833 +1829981696 3043215891 +2839332008 313103485 +704301190 2613684961 +1999777400 4289349380 +2172648479 4219069640 +524748823 1406254128 +3384887710 960947113 +2492865944 1272748851 +3006572855 1390829958 +4044862587 2376941714 +4129945623 2601618470 +1153043640 3907126715 +2786042230 1531411777 +2995713551 2130971212 +1034134532 558901487 +172242346 3546315419 +1106772278 258598919 +2249417217 2592765340 +1366537716 757559055 +2104442827 463334648 +2982422431 1992974174 +671186939 4116477988 +1377869892 1438697612 +3629900515 4271258500 +2931542872 3583925988 +1693023061 814556874 942936058 +525036544 2758235099 +375968298 1896011789 +3123525976 527091115 +1903120463 968577850 +3438483474 3031360581 +3215764788 4156935561 +2037470182 2722303281 +3302806948 2342801705 +803233366 3023339889 +1537656034 696774613 +1987478868 2446242473 +705944363 3555551064 +1331382711 4037492622 +2443043919 2324588622 +2461708301 149103716 +3016143965 1061002697 +3991486085 3748925955 +1286649726 942725961 2000179413 3555284617 +3164508249 3302114019 +2897499697 3228352285 +862183557 1798992218 +3565849667 1093761584 +4079434808 4274244667 +890931885 2376604619 +3321227631 753378065 +1557491628 3489582039 +1351360698 2258076875 +2992409591 60234928 +1566275206 2257498446 +201660903 1146465088 +453136698 1780281365 +3468424126 2109443273 +3577250614 3723922961 +3581165420 1992259223 +2531550760 2978795755 +3199454367 3557498440 +1025167758 3208110745 +1356833350 1356833366 +806561923 806561939 +2339550625 1086952800 +954697325 3201427547 +2017894619 841955524 +3482640645 3428727500 +3383377103 1174256078 +3407433095 1070926720 +166433330 3486983333 +2289584487 606022003 1012632864 +3897734431 3644006366 +2916124233 2417484462 +106571362 2638495586 1728605547 1768030894 +2029518522 1670388098 +2802959505 2448978000 +1254657312 3652594021 +2896711209 3147406734 +732108848 4129114919 +3470538976 2184059821 +3458910805 564360940 +2383759492 796993481 +1008317020 3324371633 +3773147001 2189861758 +605113778 2034061093 +881494628 881494644 +3818072897 3648951837 +3915088310 286077329 +1438065643 3662514914 +855725092 3065027120 +2643780422 1466025783 +3802431522 1058762528 +4181660499 2974509996 +1404875318 135039751 +3180205496 4128284740 +3519108459 2656663412 +695140077 839473728 +1500834924 3736016614 +1508514133 3766870236 +1115680932 1819265139 +3348691312 1551742684 1551742667 +2507499240 3745851557 +3363447042 3029869590 +3107506202 114785846 +1720208327 645348904 +2160502769 2523250838 +3028728592 1075345955 +646455857 3645756208 +762825727 710420906 +3123632680 1069640957 +1438881886 1625873407 +223485730 440861315 +1097143246 3223203151 +437995410 2850884711 +2318113352 3399737181 +3674878711 1152167530 +606215944 3921074571 +2294289849 1167398814 +1017525510 2141550711 +1367856624 3809397575 +358279299 358279315 +3055169434 1161359229 +4076049721 2926831784 +2981556764 2703282956 +1614348466 733747237 +3776702698 1630767910 +2514283904 1791615123 +2737957361 3633530480 +1586487360 478020819 +2991395052 2605818760 +2232658199 2498965286 +37080545 2431692806 +3220903378 4069861818 2811468546 +1786972128 2804417322 +482017382 2690752670 +881070957 3410485714 +4226632775 2352749952 +3087506703 3087506719 +1654831677 2200645140 +3754619265 274645249 +621960049 887624077 +54218136 2925209165 +9895521 2548441477 +3784691687 1393014995 +542752853 1112131018 +2837573763 3278741052 +2596272522 641061933 +581257206 581257190 +433235521 3885742166 +2144682847 2452949573 +716114553 809122853 +360737238 1390158814 +395969537 395969553 +2476464927 479698396 +1506483730 1824544325 +2047024045 1724957714 +1915579629 2860677394 +2787350300 2785468679 +895926836 3949316175 +1378527700 757684399 +1560626149 548131257 +3476377923 1945037948 +2633747296 1072838737 +1111136643 3208079718 +4280998533 896925530 +3452532717 3777481220 +4213553685 4213553669 +690664555 2320827032 +819114151 1918159874 +3050700144 127718002 +80866471 2737807012 +1492172684 3468275792 +3628886280 3628886296 +3015215864 2480617363 +3977410907 60567849 2183080222 +2631745350 3641302842 +3514895111 3382357943 +165182901 2405644260 +3331809738 3195561740 +909412043 1985874926 +1942015004 1417760775 +4214381053 1132688116 +1989079209 3114484750 3000496237 +1350607022 1985102265 +3596420865 3792979331 +3428329989 3778647594 +1951091375 517406700 +3874495701 4175646060 +1754284712 1125707371 +295642467 3877735191 1689009004 +2358578064 683958191 +2950174319 1076580526 +3660955045 3660955061 +664890820 656395167 +286248743 3025340833 +3670279963 956288222 +1320780949 2198582922 +2742925904 2934721507 +1340919592 2269005055 +3360234264 1662363341 +1348268570 2622562045 +3560148672 3560148688 +1078380376 2271989659 +1808503502 2138577487 +617815991 2941971728 +1226021352 4057679933 +796972286 1146384393 +3194119196 4213701977 676421333 +1162329379 1238713862 +3572519931 827601970 +1466544224 3727105836 4217415461 +3270675611 1927154460 +1406457871 118497176 +2127518897 1366223536 +3028954145 2701361072 +2865048382 308482697 +280671811 641730301 +2854178662 2854178678 +192847192 1570406629 +3410714415 3368444497 +844653484 1136572098 +1396166744 1490877069 +1427526568 2586161515 +3983618307 3425707946 +549399879 3556001472 +369030760 140371389 +679507911 1314125056 +1070266250 4135824941 +419346438 1821872879 +1619462985 1033290734 +3530351307 492029944 +1578110670 4064298585 +3693081260 974952760 +3524651273 3246250286 +157818696 436156656 +250399479 1975747270 +1435739753 1554993112 +1863738015 2134720606 +1068575704 1049532192 +4200914198 783731994 +1834499026 4091947909 +1517947625 1461660888 +2674703516 2485971345 +2047648458 3957605371 +2652907847 2431567150 +2104148112 4279050915 +3859529151 3816534952 +2006297526 4137504657 +4054688911 1381160305 +3080932901 3852703163 +3952506971 3418931208 +1957323293 3308811170 +2755952863 474028444 +1642336458 3825626619 +3296375015 874806176 +1507383130 3987783436 +2721973949 1025564809 +512927807 332595196 +1996300457 4185549336 +578263585 2404758272 +2531464324 2531464340 +827299645 677713061 +1263436671 194576638 +1373634075 4271703181 +471160510 2526226377 +540561457 3651544032 +2573789042 4062468197 +3244385255 56797966 +3988170088 2659607229 +2357494276 2168550468 +774885428 2419916215 +3479903414 1000223377 +2513439201 3078589750 +2294835932 964866381 +4167570371 2560691623 +3424628627 3907085420 +2003578692 2003578708 +3476276120 3330074701 +946269814 1074357191 +595907556 3457781759 +3501444263 2811526834 +2845797827 3371813372 +2685586785 3560989827 +3940588709 1687590842 +1945155823 750499898 +2014303044 2226391608 +374206472 615570571 +2447671547 2780236594 +4195717454 2444478109 +2159777245 2219633378 +129355017 741459234 +323699033 3094863624 +1115905106 3280203003 +1585245268 4268777593 +3813961095 1507932804 +457262150 970613905 +2252908629 2252908613 +885972360 2846276893 +2993241495 1923871920 +3243821412 3267692661 +3061532902 3798852369 +2071084456 2207080917 +2350371251 1014963418 +2498574832 1634874563 +3159232716 2634887583 +2388717486 3499708153 +2118212713 702839128 +1375509568 1353316556 +3124901582 4192382553 +343786864 343786848 +3445258316 1759318723 +3069301974 554000490 +2580710941 1130962878 +2456384971 2292322062 +2981755425 3905208800 +1389972048 2828335528 +2712335356 2082346417 +2808936517 3582645388 +589283112 4235099989 +2735444589 406290834 +3676212716 3709430423 +3292135597 2061684423 +1606713988 2278845295 +3959640386 3449406301 +2088181984 2088182000 +4152692145 1383791681 +718833144 1792730491 +1418822803 3021189996 +1988546218 2177497658 +3857345725 3857345709 +427219670 3961159409 +3541441664 3508936316 +3371282608 2341476296 +3637873768 3224111037 +1748398454 592631897 2209651918 +2913250092 2251912791 +1048655500 1763054241 +3469516845 1218259666 3105892059 +3542961623 1196525936 +342684306 2904003567 +2150412425 1331292078 +2283496991 1646379742 +2613641917 4201598850 +361881324 3768708481 +389633546 2571268539 +1947115369 470086222 +3396531456 3002576645 +1776788624 2190419691 +465824245 2859027644 +3152684266 3147308109 +676246733 3708539428 4055473787 +426773290 895587085 +46309268 369620712 +1733353744 311293821 +129653280 1247535219 +1531095963 2421572936 +4125589661 3094312738 +2482177806 4120124185 +3878794269 272533940 +2710559005 4286857291 +1609972642 2996822026 +2113034739 931371404 +2484161623 1849371878 +612507764 3973650073 +815253634 3033056150 +4183522041 2053691247 +1922392641 2720640086 +200237399 550910950 +2545819572 3430859784 2488002649 +2585491678 932865769 +3614142505 3614142521 +3194932525 1104876177 +3906112890 163325525 +894005567 563955240 +1675418635 1068393794 +643527424 995111643 +3072803627 2110700724 +4246154032 2608397468 +2485558208 4173803347 +2355699337 2457538990 +2447927584 3504176499 +3074739795 3562065082 +4162788689 3925550726 +3674092622 4225278175 +555978900 946432116 +3319224779 4148524696 +3361895371 2801148239 4028470615 +3360232158 688436095 +409822245 1742843228 +3515330953 1465196526 +1293833635 3677274502 +2451561428 2451561412 +1145393691 2485141636 +1972898944 1331654072 +3675770195 541246324 +3086933330 3500529146 +2063296120 297946861 +3856214850 3828624733 +1750599738 1769668355 +1097547112 1674685099 +1208397165 1058645276 +112596541 3368172553 +1419435488 264980403 +228272984 3875318800 +2780561324 2465430487 +4228663283 3126150028 +788555060 832524495 +578964897 3464033840 +1216759641 2221035806 +3967849974 1147933255 +1009389325 1728388809 +1710821666 2836789379 +1978521950 1978521934 +3298102380 1726197036 +1235246414 896721359 +3785748347 3006791341 +1083520971 929084222 +286991573 3267033948 +965940353 3459818236 +3842619388 3842619372 +290121142 1522449754 +366140508 3459790087 +1117011322 1230817035 +3037259354 1459789751 +3437874121 1561054584 +2035560424 3884411435 +1132677231 3064661688 +3035274881 1314358550 +2530656387 3055662714 +3281876758 524331306 +2916330995 2537215386 +3637980404 1587501204 +3816563730 778881114 +3797894661 3276195353 +3720418256 3874631797 +812819510 2054717703 +2095686844 2095686828 +1498158839 3054836067 +401943208 401943224 +1762234186 2752287099 +597579377 2202145776 +2570917840 201845820 +4089028987 406395746 +156349299 513637914 +2826447911 1546486134 +447927429 2357497164 +786181776 1419594915 +4272112474 889390763 +3987637689 3804004926 +1759236776 3389831099 1759236792 +3983166053 592649452 +1708903475 2204111650 +1865104805 2786200236 677831388 +160077939 1013275104 +355838095 4067973400 +1240212708 4197958872 +1107054298 1032538098 +47858799 838923768 +2979139192 15517421 +1595935686 3394058257 +1402077793 1237792902 +654463280 654463264 +1765039006 996948406 +2278101291 2278101307 +3464797113 2534149512 +3082201603 804728304 +2240824688 2988265301 +2088986598 2855616817 +3502462982 1360920134 +811606482 4183113093 +815480627 815480611 +1992450250 3187564013 +3608116676 1365441439 +1132753714 2072074149 +222014779 4252905470 +273610596 273642111 +2996904648 4097949646 +4065883616 3047171359 +2584900369 2617975760 +1353537853 1864016930 +433660771 2688093414 +3858252970 4034750061 +4276268328 1616532787 3570272864 +611889125 3525132060 +1747144501 1747144485 +675997499 3496017979 +953056528 325776253 +2813298987 609545890 +412972182 1440647217 +402170777 1394870398 +2197611690 3726374797 +1960520547 1476742364 +1757865631 2417822792 +528503978 779508838 +1458723586 667566877 +1361099478 2357599985 +850377201 3147937391 +545070430 2429112538 +921106907 277142943 1218139076 +3687540483 70461884 +3076764729 2637830686 +908289816 271424970 +3587496047 219199160 +4083040869 924274497 +271607703 322114214 +3003920937 87226008 +2420450932 2430306457 +3948785139 2004407706 +1212316127 2678446622 +2630026882 1224949418 +244243214 4175615769 +573131873 573131889 +1023808145 2710518352 +1981594493 1815815636 +1231441809 84132129 487539014 +3863803145 2485501240 +793696017 2317127632 +1702631865 2069659176 +1858718267 2729007844 +2423863311 2945262232 +1748140123 1652559684 +2090291691 221639924 +2043772714 4006293275 +820554864 1994577534 +2221418747 1794671410 +2523641925 1531903299 +2542659507 1197719258 +4288245209 931654792 +3954185783 3954185767 +262912526 262912542 +3629721631 3009030344 +304220041 345103544 +3332570563 407599485 +68843001 68842985 +1080155185 1080155169 +701621079 701621063 +3996460246 3883494908 +3667185720 3667185704 +4201902925 2441609764 +2168383778 2819168677 +2876300829 543089666 +2159711160 1572244155 +3036311996 2722171623 +2748031203 3163440476 +3305394262 1791113906 +2746028602 3816010077 +550077685 1166540471 +1771152133 588186499 +1976709311 954383528 +1248661381 2930732620 +2575454351 3118807409 +2959291873 2368590134 +1092129261 1722660882 +3336178768 1497457123 +3942061092 116700329 +116700329 2620941838 +1635476391 1432841636 +2867278150 1341296951 +2453968280 1153286964 3209525594 1838928691 +1265506356 4065335769 +47409201 4257158282 +3416216071 3416216087 +2797000629 2264286948 +1565128958 788280329 +955170026 955170042 +265660394 3612824909 +2024072133 1200139066 +1183869444 3321261124 +4079200041 513482382 +1704410733 1511474564 +3849257047 2227013862 +1740031844 2830885503 +870551401 1853872754 +2507559755 2094001272 +1767871725 3463934212 +1735533254 2280567299 +558867619 3256673287 +2890377018 3640016022 +4059517880 535440331 1016927118 +3155965400 4167615236 +3450507824 3429279816 +2120227059 3829876378 +1852294430 3948629567 +3529435204 3529435220 +3819104405 3822212128 +3258492251 2009019678 +2013126164 3827145064 +3220843710 2821353177 +3486120092 3069336967 +3666489211 558111807 +2921845563 3564488168 +754137953 1476618272 +3250946907 4119425637 +1013763385 1013763369 +4022633454 111714617 +1414055516 177226439 +2752687975 1767691306 +3442844717 3442844733 2895626373 946959058 +3731610919 1254958198 +2574329283 1344172522 +3494063442 622100981 +3303948815 303168910 +779645814 2644361937 +1544280132 729028408 +565998151 1655170518 +1200712526 4159433689 +987434428 1658232561 +2231860296 2999493963 +1872178580 1056751599 +4220394921 1002354968 +52605304 1738366957 +48094611 1958604212 +2017974414 3040952810 +2481873130 3285293766 +673095019 2469515106 +368074024 994790740 2976032253 +405604902 513494385 +2653733902 242786831 +3049262945 2119710134 +2483915761 253838465 +1152670198 501849681 +2049117488 201937035 +3652679242 1054873158 +286182528 1156413978 +3139404095 453116138 +3877482139 1857674770 +882052260 1736238655 +4195794406 2546790657 +1035469123 3969410131 +3680919551 1630084712 +3902324186 41082411 +3261229694 2309154959 +480467054 4154364977 +1031995684 2240282383 +3350508415 3543612907 +1912245070 3144240089 +1604599874 3515951093 +534934522 3832197042 1861911130 +1066982611 4037255226 +2520219138 2069585205 +2640234640 2912217835 +3424485795 4117959562 +3148319118 189548415 +61465068 2960041623 +1690885880 2687959149 +1278067180 3289001748 +206615806 206615790 +4184420672 1428011788 +3323560198 3760594039 +3246120035 4248736349 +2788617159 1869949526 +2669220244 141994991 +3800459929 848940766 +782899868 2594918436 +2965552103 95817658 +486381851 3191342468 +864940311 1064470320 +3535150590 2088109922 +1511488624 1123607619 +856256556 2212205911 +222152268 608119223 +2411311115 1280319810 1280319828 +3565509315 481783679 +2247093758 743899097 3697658525 174854265 +1084247825 3445389264 +1658212452 4217408895 +2841525559 3596246416 +1196368297 1029105934 +630588214 630588198 +1069447035 3397127263 +2599132710 115996119 +47506295 3961656390 +3736463087 2270857774 +1393569769 1133930999 +3173223272 265536917 +1199208980 2580426105 +1427921889 3701777206 +3031875464 61833995 +320161805 1898624868 +4275189546 1324144397 +2221409353 3259404472 +420745361 2202135072 +4254997725 484929515 +3909131725 1345345633 +4176649189 3404425580 +242272599 311227376 +1728285868 2413209047 +1161840787 2536652666 +3356646768 1692997461 +2769127355 2404166514 +401854939 486404581 +75572928 1959591449 +3217765538 2397297411 +2751968231 522204342 +2958137972 74851481 +2689356718 2676704825 +3226068961 1425458979 +993288812 2609089186 +3977247727 522819896 +797999153 293195056 +1338121519 3180589297 +3432513082 1296381277 +3716581063 2177248086 +3997903270 2331588849 +2022143745 3191887488 +3459139825 2212287344 +3001040308 578650324 +1400291696 3555885891 +3331607440 728953763 +2767248788 992792559 +1432551894 1088152551 +1243154781 779428162 +724054702 2655504377 +2183263356 1467211559 +2617895055 848894232 +635088209 3726061190 +4010570616 3365520877 +1765091670 2553083959 +3364516722 603176051 +3162192444 4059868263 +2699670518 1172720718 +828538670 3625899002 +1190660372 3430304367 +3735868426 2484194221 +383011642 441019566 +1746761280 669427960 +119253624 1132864261 +1575695350 1584982994 +1607831743 181972779 +4259371954 1526323507 +2887779914 1613907526 +3477235380 3941237326 489365721 +3966412163 4204060349 +4187935182 1320960345 +239004622 3226528085 +1621859421 2334598772 +1150616996 1150617012 +3970455151 3882788829 +2163305301 1359738588 +2736659289 2836634412 +42719449 3676724638 +3029695348 1464064020 +3571302974 1461241737 +2474333810 2636715365 +1478050611 3804547418 +3019709339 4067587332 +3002495783 3002495799 +1699806123 696004148 +2441006181 364397219 1872478970 +3349942029 3626274824 +1641727604 2137417871 +2616946793 1199909336 +2622447869 234204756 +3749219436 959777665 +1148503413 625896019 +1524615346 3973196631 +3389787419 737714564 +2747250453 3687659011 +3026712406 1110406710 +1292760001 3513055462 +455232604 318649543 +2283548856 4181177156 +352746012 892484113 +1990767388 3885102353 +3337496638 2690127199 +2904299473 3215945779 +3532651604 3433707577 +3082282128 729376508 +125273758 2742740913 +3787648323 2832957564 +3464233691 2466065243 +2235237439 4209487656 +2093403743 3421953950 +1509862571 1458164020 +2247248883 2018702099 +4146330628 296073801 +3290079220 1523903736 +581103125 581103109 +3168592273 3770095430 +2062539947 3604894405 3319151538 3064750381 1297697816 4157051138 1181349643 +2518981010 3986538693 +708525902 2786339534 +2464818761 2409252088 2464818777 +1596722378 431849010 +2998344343 3980319664 +1141043923 1141043907 +2906198338 4074121973 +1733885531 202926418 +2791274180 2890397321 +2521852927 2677670504 +3602100555 1205868820 +3763545316 1325830673 +455369150 1962715849 +1231868114 1554399208 +1962387166 4292587363 +1140609550 1094570177 1424834723 +676724906 654348294 +2924335107 3453604413 +3490171883 1732641506 +2142242092 773334103 +2852650856 311890109 +4200574402 3869149283 +2678428833 4071160160 +480334577 2395950720 +1386736548 3260543785 +1542778054 1145713594 +2071990641 2372861037 +4025962638 2803190881 +1286412369 92096400 +1036718886 3937859621 +2815507724 3678514661 +4271720496 4271720480 +3150422924 658928993 +2126961635 1980507722 +3812900316 2691522897 +2053027893 3625712508 +3927034735 1108920641 +3964765658 3905350228 +3266808070 1335891793 +1392065524 2455331087 +1499563697 1703348400 +1135013457 1096923031 +1162832519 2734994070 +2697632154 723522992 +1714853915 639059423 +1879516588 1879516604 +4273255174 3833221457 +729926218 1591099405 +369973123 973128490 +1598706777 1526908936 +584627665 2888185872 +1367972565 232075779 +2329628171 2721831746 +1291304330 3019857965 +750232216 4246009165 +4097282076 2406996999 +3992712309 413258812 +1678919093 3318483831 2639513116 +1432243267 2792492394 +1505393926 1184026743 +2047960331 878841940 +469254974 1171380873 +1962939846 3163034033 +3748611679 455853960 +29829622 2845721042 +1111822859 1150581001 +2882561663 4161886696 +1673241194 245351609 +3391605859 2678505436 +4255548834 4255548850 +2601868477 3751869844 +1278977201 1062528266 +3818498306 3205703566 +3774974013 1919514644 +2812033106 722015046 +2952389164 2359211841 +1210674013 4130603874 +1002823986 1833075884 +2576168420 2638992895 +2244640692 1371998297 +1768583899 3448950468 +4267531381 1661936822 +964948693 1605846346 +2629601751 464713539 2629601735 +1823278486 1657592179 +3251532133 1849083067 +2371537303 485185721 +1438390835 706559578 +1753835677 760196898 +3784656907 3771717214 +1598705803 2365377245 +1191479028 1191479012 +2891462311 4169665415 +3793870828 3881009281 +2221070365 2224698804 +3469802124 2272696611 +3462538938 1933911540 +2613074854 3587196481 +2733525703 2112715218 +3706926299 2916889810 +4283432678 3505275905 +1764680765 3520154644 +2255747540 806354484 +1396789329 4021456886 +3739464896 2692057669 +4167419374 4130772409 +2955129634 156794606 +1552274941 993322891 +3535598260 1936855375 +3240486040 2795952964 +2382551735 2382551719 +2493312314 887026257 +1804086783 1180723304 +2156456733 393099522 +1753309947 3585136197 +991730078 2360155970 +1599262157 2477003570 +2177435571 41361114 +306143217 949565568 +2828198089 3186622766 +927610309 3491712083 +5217901 3271245852 +194332490 1510557545 +1715427876 708385817 +3160155433 2920185742 +1385171121 257150400 +514591598 361070955 +1137669197 1396345020 +853234195 3661085824 +989809294 1618858986 +1232283071 1598319550 +1106772271 141155566 +3048285340 3181004616 +2838256032 4040234739 +3261077217 454205702 +2347504816 4104425731 +3588445061 2422683907 +696261543 252110259 +3636046289 4249244688 +3549173955 3364551402 +3295271272 2219813534 +1561790880 725886707 +1671587606 4004005799 +3880889727 2761170664 +893673860 3347898991 +2462867902 2565122761 +3204058740 160946338 +834906699 533090063 +1688921605 1086370346 +3859403688 3380097387 +3969228757 3521086579 +3978250687 393757640 +2598114630 1983947985 +3508555175 3705290230 +162145223 1241367112 +743754777 979286402 +3638015834 3638015818 +1613985645 3868494632 +875372735 2124115068 +3760121814 1070930593 +407444920 4078553275 +1538101112 2689720050 +932289331 2565400909 +1051796103 936991382 +712088597 3726966445 +2124672741 1091637882 +966948413 91588916 +3904360147 3904360131 +1318300910 2692299439 +2747928155 840210756 +2678234187 2549877250 +2187452024 3088135917 +916740340 4172810255 +4008052220 1421959405 274145068 +2434415625 3580948089 +3359780108 1278011873 +3945552742 2631131521 +216425530 2008464130 +2478718378 4169887879 +3820178972 2403595800 +2533528607 3624873182 +1995451511 1995451495 +1643408310 930889157 +3475979311 3932949882 +3100298017 857013187 +794875947 1438086062 +3519574263 402260834 +3137344435 337576652 +923595876 224704873 +1970354948 815341115 +1874799640 3595921888 +1472626962 1158774701 +2125621970 12182969 +2187004626 122816645 +1020594856 1801438845 +1723114632 3029357475 +1252463251 1929949866 +1372524579 2430882064 +137512034 1226942019 +1179714215 1485253878 +1208531431 1208531447 +1767725761 2666913216 +108087760 4099355253 +2347743043 2347743059 +3187175536 3596322251 +4075745745 1059499024 +2973170986 596674843 +1724075927 1551256230 +3822272016 541762481 +1066606073 228077288 +2089850634 563987629 +3680666512 2337308520 +3039689206 761298503 +3186166068 702119119 +3145008014 2805241999 +3999915600 25987854 +419046881 852074784 +2437446337 1981365718 +2839080563 3617546010 +1085367010 3290327064 +2815026563 3971109607 +3577543977 2583389336 +192726368 4227644460 +1023409713 1311796172 +2678897861 569190938 +3639713609 3445473262 +3318607869 1613810516 +116349307 3831041631 +2013528475 647922956 +3194314999 2962728144 +2684162649 878961182 +1457691022 1421327001 +3164028162 3826584117 +3604481097 2131672814 +1153122271 298159134 +1231659719 1481326400 +2437832838 1147269879 +2454350358 3182504992 +1104229462 3424513964 +3365137931 3420437314 +1637595525 757402714 +2787097762 3587422932 +4221058198 2155634017 +3686603864 3686603848 +493223086 4119643641 +4000927661 296478521 +1573294207 513112062 +1637135664 1941387421 3329105716 +976945321 1407322648 +201388925 1652510146 +2434650733 2304587986 +631335864 1542367179 +506102819 2683175708 +1378321582 1378321598 +1789871842 3489640229 +431836707 2535964432 +2220385362 2480712221 +1638811683 3898314524 +2355554183 2991465897 +1169624377 4163489982 +4240797460 4274904175 +3898821882 4249849691 1448980949 +3727019755 2693053428 +355841633 2645151320 +32456923 3535795788 +3669171509 972488498 +2292624829 3752021172 +1159047582 4246191426 +1569805159 2999339808 +468986285 205707195 +268729871 1405998171 +3784192856 1407207384 +3272024308 1489237413 +3010856529 3311705957 +2508764513 2002318061 +843552236 1604402847 +593318185 593318201 +3042491079 1101924160 +2042413665 3503290502 +3481834689 3481834705 +1829685184 1849979717 +2659427221 538776109 +3883678025 2978885112 +888092145 4004775133 +3372168069 4005435994 +2421209502 3440653225 +653010389 448761436 +461116647 2576549625 +1695677838 2840733327 +1624156842 257337741 +200572386 3017943747 +3691830191 240482540 +2225754431 1768079751 +1115092485 2789558746 +3974002449 2736714913 +828746420 1997257049 +412766837 804245052 +2233109397 3435356888 +2302285850 544469245 +4037668505 1795004239 +3045143393 459530678 +2146428051 2834684380 +3999927430 3606165239 +180356259 180356275 +1727821615 1315938030 +1919507202 500843573 +2279034909 2279034893 +1061478148 3869484718 +3868699537 2445481286 +3404950846 1399022153 +3801659148 3751368028 +2847315744 1248847717 +4024396645 2879071900 +1996930153 606393994 +3378373544 2798477675 +3333929763 3333929779 +1790349905 223081617 +2556443095 3061517670 +356255039 2946245884 +4255419299 3142513220 +1056829174 395019366 +4049876829 330403889 +2925891925 4188522121 +2760362113 2193662720 +66757705 2358288110 +1478582717 3669958818 +3537695948 3184876833 +372351659 2602767156 +4260404298 4260404314 +3363191648 3363191664 +1842725229 3588108635 +2836946882 2284175559 +3068476849 2615156144 +3963059258 358125405 +3184677424 35086723 +2611764806 1448634423 +4057650270 4228610010 +1475122194 1802305333 +178297627 1439999909 +4056084866 400699299 +68661475 695046387 +2061288266 422664371 +3713663081 3719210318 +3291921325 2401857860 +1306131686 1306131702 +1123980698 1400582838 +351281882 3490110763 +3074457833 1670049496 +2836637454 938474255 +71363547 71363531 +214552071 682579200 +2602949326 4217958991 +1036346047 3832783164 +4061681835 3344143668 +21327006 1880609395 +421143393 1802573377 +1119300030 3294017055 +3542528935 952843684 +132698078 1367292521 +533057412 2288364767 +486747032 1229145680 +950651960 1800174637 +191138842 3955860573 +1329947516 2137139756 +91910387 2415011424 +2164364080 1165669507 +595342971 1596301910 +1907144337 1907144321 +476338257 49743750 +3903498778 4030997493 +1004512224 554629555 +2702195485 2844593844 +2688346698 2385991589 +298351717 1381946425 +2693104485 388880378 +3785580925 2972874690 +679694534 2360879009 +3479133938 675365018 1696757491 +338926246 3207172593 +2696188625 2696188609 +630503940 2687750763 +1566414448 1783878211 +3408323831 1316563881 +807722167 176368301 +2086042903 3542543152 +1153541301 2656356429 +196104680 1318121533 +3346707888 3056337941 +177927347 1693398476 +3196341814 541531921 +2842659424 446092581 +3664882891 1133421048 +2910722078 729800217 2910722062 +1017144435 613284566 +1810283613 960136802 +1109386164 1109386148 +4239348937 2432858232 +772737693 232932185 +3299746795 2300742370 +574176866 723546646 +2712242900 1373997999 +2372602488 3990127379 +629091982 2503362969 +3212436141 434099794 +3613512675 1390418640 +3656201765 1398984541 +439263705 275302558 +2560500385 597619398 +3168677764 3586444511 +4142040671 1487952668 +1131626867 1131626851 +703017671 1217700292 +1784721317 456425644 +3961432301 2705583378 +3858890156 3240252887 +3763516234 1815100795 +1287710725 3635232730 +2684982238 3440625279 +1478508630 281364337 +3308658569 4248020152 +3495487495 2820176147 +3642752342 593219175 +153310268 2661128817 +4036758042 4194599925 +131412103 3082747609 +928296177 189546342 +2520274136 1387106331 +2670274193 516404826 +3695373663 3185624289 +2406607311 2673021144 +3604175925 1928156316 +881116450 1672153643 +2673266769 2673266753 +3045109524 3540962875 +2263267592 1407151066 +517589072 3772143093 +4140708355 4140708371 +2833346723 2112114826 +1247378180 1247378196 +425600564 1195011721 +3022016626 14590835 +3355050020 4069406911 +3558592161 2294695786 +3469185800 2351723924 +2607150666 8361542 +2170968754 1713423923 +1320132996 1652245193 +2171636088 2171636072 +934036065 86802102 +528710032 3975906283 +2314544653 971695716 +3901031995 1147719410 +3632231683 3550819260 +3983555345 3635215302 +688985334 4071525430 +2286886254 810911225 +3215988198 3849628195 +966741134 2972831308 +1810654174 3273733759 +1087062323 855090010 +3597709617 1410075606 +2777619411 3111673702 +2167920921 1655072811 +2264856526 1365252441 +1112339215 1847763096 +1491887764 2418375417 +54303847 2137667126 +4119185255 3902334774 +755881646 2596860911 +1873995376 1184940611 +3152104265 2418331359 +170953342 2288649289 +2410769212 1884016487 +840595768 327143898 +351814472 1255271005 +3513711935 1223681233 +2770072893 671289090 +3502054694 3216302785 +2213243605 3139586938 +2904995630 3253886319 +2252898567 2055385485 +2398681086 4081634079 +3433212111 4077895128 +1432049437 2076844706 +3664960333 802109988 +2351976509 3977138196 +3247942382 734661396 +1562856309 433834300 +2271683541 2433428602 +1509913676 948340508 +2827929499 3253059935 +2626180941 1159755940 +4138298498 3468021923 +2197016915 1294144268 +98584269 98584285 +1087874259 3866654778 +4213353531 2459246829 +2062177581 1779325316 +506386214 564653614 +2340218214 3282957429 +248823204 248823220 +2581743665 1882694960 +4167688899 3517970684 +2284152288 853499827 +322985663 605086676 +3444978956 1253409249 +2900957204 1172044352 +2966255976 2156113427 +2364917731 3387533916 +3360170526 1737340223 +2985770581 2100764636 +1004760782 2865436607 +3040485333 3769403500 +1122181649 1552851142 +1853861172 654158031 978374047 +1073057462 525628682 +286212312 3470294423 +2540303157 4006601448 +837604839 1706245394 +4260340418 2185049955 +1312842896 3210628771 +1761604031 3431465601 +2733922413 2733922429 +3740219540 2257981695 +2747462261 497846288 1282090449 +4024298675 1297849818 +832278318 3306187374 +3563750481 3563750465 +66042676 1717809881 +827890084 3458918565 +252355491 3114193040 +2197999887 1282349710 +392645995 2924020783 +1409210762 323418341 +345477295 345477311 +112536544 1865683379 +2004302723 2477961020 +329337120 1801578920 +694163655 2742731294 +4216341145 945346270 +2698508835 252726022 +930252868 417070190 +2826490388 1244837231 +3019829482 1146437709 +1595034495 684513512 +2758037242 4269109925 +1430043950 3109687629 +2652635171 152319772 +3660782943 716458506 +348637934 2877534062 +4058802667 3257580788 +2989742657 717849446 +2832892426 3836484513 +3023321902 335293323 +726079930 3672997835 +3232652840 3451105271 +242987136 2646374840 +742860598 1373469062 +1194450454 136848092 +2808697295 1506527438 +3135164564 3233962223 +2323954379 2819316156 +3052284533 3672954428 +3136172610 2264473077 +77993771 2088138932 +2199382228 849577401 +3781749434 3797476757 +3760507303 3760507319 +509366903 1112920390 +1338580638 932917929 +2725142247 2596234656 +3971763863 342100076 +745311404 2598466263 +2521830988 2521831004 +2616222893 678329426 +3546103206 3650263281 +2703563224 255365477 +1703661274 3038159138 +2867746092 1093669975 +931359603 2849673124 +770707751 653367091 +2384345574 3856772578 +152216595 1532512762 +488744213 4042711071 +2426926525 1969739906 +4100623216 4550517 +1325605115 696486418 +3942923912 2142138397 +1134990763 708680756 +1537202460 3420553228 +3069657810 3069657794 +3198076107 4091056536 3252886686 4091056527 +1662981382 2681195556 +3077573322 2405497851 +4019888769 2976764182 +2496867838 1181837001 +2499258487 2499258471 +1823166905 3400640040 +192927514 572885727 +1673193387 778471375 2855973428 +3531797612 3492201985 +1086870858 1163805563 +3508278724 1735151791 +176782008 1315712955 +1896027572 1896027556 +1675212411 1939456125 +2187549452 1315460065 +389289933 4031737125 +2856335204 2995018575 +1935294046 1935294030 +817729611 2585391471 90842644 +4259201959 1273266144 +1413589444 1180568315 +1803277088 1408064357 +1199226585 2264774056 +2747710244 4124613033 +578603323 2238760932 +2864990430 2969482623 +4029629280 2053574707 +1953799428 1469263199 +1290630322 3928754660 +2782696246 1346092551 +102049727 2939860523 +16298172 934419313 +3649984949 806828028 +3563713726 3230922185 +3269903210 3269903226 +547418991 1577166238 +3857832035 4145476423 +1623087849 883498190 +1248219431 1175568502 +507374459 106203529 +989001101 1501072626 +3533883129 2328457889 +1417908180 3743115961 +92414100 92414084 +3009177886 1752785177 2021227049 +2440312547 3706873674 +1304648071 4052086678 +454064859 1929694427 +1625049574 1623741719 +2932005915 2872902137 +1509435104 2175087283 +2238196377 2616921800 +3614741070 2055360719 +991866259 991866243 +2539083362 2692545603 +1247122539 3893142037 +2962996850 1999424883 +3828531856 3131736045 +930644555 2645892098 +480216015 3117609830 +851742909 2904799025 +520564642 2052062211 +3536137455 690351336 +675495747 54584614 +1895046140 3427274168 +2799658663 220413632 +1903170419 107912716 +2823968167 2694632950 +131546865 1222120816 +1015859324 1015859308 +1167521565 2846294708 +2648191758 2693554962 +254633363 2083306496 +2600827471 3825448113 +2779497956 2976417279 +1403820084 2008756360 3971193305 +2893457576 650870909 +3669753813 720616540 +463328842 3279443565 +2235223748 2140372639 +1719537543 3748819350 +119479004 2149085493 +1961896266 1611726715 +1790154481 3921059184 +4059037412 3234742505 +1916397542 1916397558 +2682204324 2917502439 +1141198361 760869192 +1833449160 689215978 +1702428674 3212509987 +1896632433 1734517232 +1457260910 228228743 +465394064 991165877 +3711005862 110336657 +609494095 4251878028 +3290016143 2716551709 +555020342 1240868103 +1406044354 1406044370 +1880563929 1298707848 +1545300073 1747279182 +257532793 2736543592 +250451048 3892354987 +3004927872 1952638597 +3644431112 4153568821 +2753826162 3602983525 +2109432207 3598131660 2217902326 +942352423 942352439 +2540080410 1886396413 +856139738 789396523 +1218130453 1632622346 +1163860879 3283640856 +3635465687 1826051310 +4189840650 1512488617 +162260620 1970815648 +1420002329 1237488648 +2093376613 3511683820 +3126633420 735435297 +381048095 3758620638 +2968153763 604777116 +1802319548 3639421425 +1160403332 1705700063 +2000914035 984283126 +3164260795 2729152882 +1253475863 4047900488 +2055817909 575923366 +1377709467 1884460872 +2195869892 3461136592 2967539804 +243496124 1745122407 +3796760425 2847701592 +1780311050 373586861 +3399136863 1351423902 +1692152413 3182167335 3758723548 +1497083989 86887660 320444311 +1743618096 1958716973 +1516639483 1236469554 +1805956392 718009703 +2105047308 2737925140 +1866571713 3496288985 +1569991618 639921351 +3936657730 2737429219 +1768675102 314811455 +2755084934 1794055088 +382960834 2969173347 +1409137152 946589189 +389818032 1135666947 +500841018 500841002 +2983208365 346938898 +1609226570 1881610054 +573833921 2564838848 +3919375426 2507792677 +131335896 717669901 +3102250046 260464969 +2731827560 3159709373 +2985174040 836948443 +769481361 2400537213 +2905875350 963324887 +2913405066 3891425595 +2911626174 4046947359 +2038660390 1878917825 +4142526039 4142526023 +3136228912 2569730738 +2482791740 844324199 +1121730494 4273494025 +2356128079 1657243470 +2774474383 1217994932 +444332813 3190568306 +3429329326 3429329342 +2866800629 4084868796 +901422126 3267615846 +319371303 319371319 +3408992281 4148752200 +3440609201 2260638640 +3008449634 3135997658 +1598849354 1332709243 +3633060233 1837904568 +3498526162 543524761 +2979208363 899031330 +223789907 2907811776 +2993025273 3480901630 +3708818239 1062095912 +436994633 1239914734 +641920238 4027576817 +2664910526 3404789001 +690035585 1075727382 +3252556779 130869208 +163008042 750980755 +3800117456 1633671011 +918707810 3323095320 +3946591707 1493926878 +3363606220 4189832439 +3278584098 1239481762 +3453592294 4087050270 +46452671 450038184 +2898636640 1530074163 +949508797 3570849675 +346223441 3448047760 +1023083203 3257227509 +2339390017 413424400 +4052245955 4239104490 +1163746056 3686542901 +3701003866 1519046769 +2705727762 4083552069 +2187326095 3423262478 +4201303813 3967891504 +3017003817 1064659352 +4147374899 2378681015 +155720405 4127618353 +940285127 940285143 +1238099333 1238099349 +3087963634 2253705101 +648051937 2946799136 +4191278227 4102308631 3629228908 +4226947713 351296944 +4129744723 3527288762 +1485689077 1547694506 +569800328 4277966877 +2665635560 1225571536 +3960869161 3485270926 +4036440882 2618962846 +3240171137 2283171072 +3851294335 3719129598 +2240769306 3573948149 +678688173 1535885124 +3490532050 2868383961 +3584261736 3093298621 +208538762 2290836639 +1840810681 1921147198 +3536654078 104610334 +698068677 2058859715 +533955260 1821140840 +3362965010 1018993008 +1606868074 806157005 +1701808291 1368660124 +2854921228 3978313463 +4090706665 3196435672 +2818643178 1396513153 +3448791382 2856775713 +1452013208 3595907419 +2842970393 2842970377 +4087187615 2879407371 +2588550237 1393709211 +2818551127 3464355814 +3259982184 1257658045 +2128420911 2674299259 +403068370 3022209645 +2534132925 2224246146 +422749089 1270322784 +878647643 2228013320 +3451122058 1548041261 +1507182205 3901191892 +3877197844 3773147001 +2932450315 3052899128 +2551472904 1880614301 +2443043913 2223922936 +1534752427 2898841378 +1512670215 4133148438 +4156909096 3689277066 +4149594875 1460570404 +3811683793 2016714768 +2169933232 2169933216 +4262744566 424733907 +652422325 3969868010 +1098102044 183845546 +1746007162 1313070091 +800463975 800463991 +1205127195 787939986 +162611950 806116527 +2995309475 2958594442 +521415006 3249940184 +2842921963 1926801433 +3241794577 347955616 +4022241206 519021447 +3667206751 1575467723 +4290609290 3790310581 +3754981117 2620348386 +3791124114 1264134085 +2928541199 1953387084 4020342257 3632722328 +1415031583 3842138590 +1394365707 3862701103 +3713445402 2306085629 +3551388747 2243846676 +2252925280 3301401139 +962796579 844446992 +3703221340 3588052167 +1418619651 3631175408 +1268742734 1510836441 +1685380395 1351957026 +2712042203 1410557650 +13964961 4034043744 +287199101 901210767 +3263134518 1689187857 +3246609653 2529082794 +851891900 2869168615 +1624798824 3703727531 +2630292655 1273027066 +4022845259 766326904 +3378669834 2503045856 +1343829672 1085506243 +937437122 937437138 +2480127726 1437773978 +2338920980 2322861433 +4134581544 460140011 +11090415 4184224558 +641258267 1830779102 +4236708270 831988722 +79039504 2056584483 +1037040346 515465870 +1698296843 2955434798 +14893760 14893776 +1361959023 975943342 +2952423824 2536779171 +1115976108 3470168791 +2528492852 1947785433 +2688425498 1539924733 +2567680233 1391238745 +36515059 1612563098 +39357038 526510905 +3210775325 3210775309 +283835391 2699735678 +2943868865 2102312602 +2344735537 2626090890 +1685178780 1066169740 +2916620828 10163400 +1475739705 1475739689 +837078899 4264727052 +1716789070 1684883407 +129091197 2581296852 +2285531060 670947417 +2010696660 326075444 +2448331323 1979718888 +833156070 3984788513 +2061448388 828379273 +1960917059 1099665781 +1758412516 3795845353 +2575348008 3449217533 +938883029 3986285660 +1739328702 468926871 +3451123444 1164479839 +2804329918 2451953374 +1699321330 1691814899 +3301259238 2826370817 +57209091 117247489 +588213073 2185621638 +721168177 2443302440 +3544991134 1073508265 +511543111 1184625878 +4167173798 2823845719 +3657867221 3657867205 +2154733585 784975286 +3025470124 1962690113 +375515827 4012144602 +998420493 4043229024 +1176752933 2405786412 +1678669050 2093098379 +2694334183 1124934386 +901729892 2647935 +3238514463 4266331592 +140360460 932017143 +2129770404 2055477055 +2080657432 404767637 +2082545453 2502169554 +134931349 2182508466 +2479729896 1922204419 2777061072 +1572244134 744244055 +2636935233 3002702055 +3926883978 3636241893 +2596621191 3494155006 +3731753403 2333342290 +1951980469 2710591309 +3253993026 2579675211 +665024803 2304225820 +1379343634 3751377837 +2775604676 1011736315 +3786857556 2799491129 +1365932309 1067228188 +2867775610 2414188555 +625353399 1684579846 +2812705530 4226220618 +1325119476 1245877519 +4094295605 2963832268 +2320175958 1873670710 170881127 +785028800 1869569179 +357192558 4060173871 +115169493 137292380 +3236057983 592015592 +3518597642 823414203 +3366180292 3279830014 +266591145 3950356238 +677825819 790561503 +3141497216 3258773191 +2766214197 741057703 +140399525 1111929403 +4111541251 1815558128 +58645954 3633930296 +2803265597 1163046914 +1752721760 1752721776 +3045937920 3447302419 +4042405128 3752695860 +1076264164 3767966463 +2928264734 3772965183 +3796042528 1333652325 +325727558 3593592119 +864641095 1749192640 +3829175200 3948700901 +4076318277 1177375868 +3831099283 3831099267 +1969821404 1315319120 263664529 176412492 +3552564108 3808036215 +2976343675 406168812 +3321116202 944649861 +32220835 2572618640 +4278087411 1569237146 +3137315375 2406240238 +4279537840 1029686556 +3293250188 2383741537 +1647874749 1544486786 +2815786760 3358257717 +3246591267 3293425162 +3927082622 4180260937 +76049183 1103143390 +1227955896 3756371 +2593717382 3839198967 +2431326794 1813668461 +330353454 760207727 +2200930475 2200930491 +2440949916 2386466564 +565618399 4052267272 +3816240000 2493911699 +4126266910 1165436479 +570638369 2887644128 +2687885800 483565629 +3783762221 897759684 +2556407331 27205898 +622698899 10836588 +462227906 554064995 +3783273097 3781014469 +1008768975 374661644 +2440277831 1075637440 +2970562959 3884456614 +3356549415 3356549431 +896993529 320120146 +1922803392 721911877 +1159477130 3960369306 +2893745749 811122422 +646180833 1319456490 +1714256927 655142184 +733208018 2300578426 +3146822143 1137194088 +1327257919 4238776555 +1543057319 1883636726 +4163487150 364054585 +1438271973 2042218572 +2679189501 2212782120 +1935059846 393216993 +799941354 2313408837 +4004546148 3829054460 +1481673541 4107741135 +2923253888 3397761427 +3152044247 2749113940 +1643039251 1038621690 +2025567047 1450916060 +514028471 4065274128 2621914601 +2721750862 2957559769 +3363159359 486052330 +2726790836 641043822 +1446865289 3482163192 +763080767 1329022972 +3421046229 3570675292 +293363388 1120477689 +2096881645 2910945810 +2352174938 3874965949 +3344856737 3344856753 +37858978 3006399545 +802791505 3670682503 +1686652068 3867414079 +3232378244 2786209116 +2748511710 4074950755 +2718978312 665816971 +2577526552 1092937135 +1567079033 744172104 +485304235 878015010 +4165198790 3663542617 +2951900862 4043996669 +2974713550 3969791567 +1080596317 1080596301 +4158071484 3819679217 +3615061864 2620848299 +1587344703 806752830 +1606713199 827628472 +4283887719 1325901939 3389919423 +1644741615 3718317746 +1842699855 904099406 +2447381102 297599801 +1244328541 513509492 +1277704610 3314323663 +2051861712 1461242741 +1213243308 2196462551 +2347656034 1340568171 +495045352 1532128061 +2525707754 3878844237 +1120100571 4103174354 +4187845353 3688621272 +2290597410 984463620 +3795759855 1897873438 +2964577717 3760587772 +2488183125 3436482762 +4280460737 4280460753 +1060642472 760758891 +2209015268 705160703 +4075696134 1928698231 +196808944 2572621652 +4206530608 1555040452 +1525650385 2422387735 +2586880127 966344702 +3486650526 3316656319 +1111830459 233448292 +1256975453 1315247714 +25339591 665619264 +1063228021 3699795804 +4007282671 4036967736 +1275062652 534548017 +1786079667 4027092541 +1366478499 3669707402 +3774570524 472693448 +1651794555 2016872370 +546406819 3893302154 +1788584558 2132413629 +64322427 2338211903 +2786507708 835291377 +3346241134 1777673966 +1877002366 2631638601 +967199869 1036675266 +635085632 3610181068 +631259212 2537966364 +870771417 63961140 +821260842 1238401254 +2961846872 2664211866 +3951196565 1399154076 +3472615061 3613297964 +820285381 3167638298 +469923123 147699355 +938537864 3723670615 +1598104326 1198799621 +1647180907 432528254 +1275729810 3615701549 +155071946 2838773389 +1023760174 437826991 +1676217057 685514806 +724076429 2110612210 +3849398027 1008760413 +122395809 2736448476 +1801921105 1683686800 +574237794 2311005914 +289828589 2912577860 +245557741 4151721988 +1190942384 3996815153 +1346319284 620230665 125723727 +3272838623 2237623947 +515249005 3315635332 +2727427599 2521010779 4188320152 +3447465885 393370658 +3252942272 3845433666 +833284281 3909901118 +1304804453 2477547421 +1190239667 1633370330 +2300871251 3534430306 +3359912943 845005112 +2327638217 812584046 +131562050 2770900061 +2993517581 894228057 +4162198795 788570857 +1826480580 625633183 +1070590437 1427920320 +3639928675 3968352476 +1139757454 2143117967 +1593484104 3431926365 +1784575069 3484495476 +2915301007 1328251062 +4172527183 3521642062 +197064390 1366232086 +986391659 4174009442 +772473538 1029003107 +3658417878 2793987430 +1088287632 2839250863 +3409066216 3356464445 +3681485853 2361620898 +3025438039 940435440 +3324570375 1419392498 +3950590948 2480490495 +2153605784 2504863795 +608110994 608110978 +3699288369 1281644582 +4126458200 490161395 +1324901750 3339172039 +931327482 1562157213 +2012331665 3406306689 +1917202845 2172656180 +1443366425 2275514696 +699936716 574489024 +4264693488 416121813 +1628767438 2021993550 +2809559454 1751062661 +3836171682 3205235382 +1970495106 761246347 +1486034663 1656135327 +173181773 2364623396 +4033660844 658396119 +3174880586 2187324230 +2664258856 625583613 +1588772549 297891753 +3733310992 314495720 +1174940190 1270479213 +3704777047 3321340679 +45047167 3104845544 +2059413093 2709287162 +3724790803 3953678916 +555911219 1549559884 +3097855129 3470167388 2962524885 +75699117 3344431428 +2119084653 1121339780 +547763302 3660947522 +4057784403 297083564 +3495906213 4050428124 +40300785 3104656240 +2189987098 2532712445 +1612660284 3186699460 +3393488690 2615202739 +2662489622 606807539 +2463510512 388855509 +2849450491 1488393778 +1540854941 828306228 +3663540401 1907599024 +593936995 499384796 +1737715857 692079136 +3175740407 4067102160 +1671786075 946649426 +2273474362 1221101058 +1327012053 3855762165 +1107341863 236483446 +66631069 3716539947 +130467929 2134024847 860897259 +3048431043 3428620796 +2452503925 3526029068 +3174660965 510411546 +2856637178 4270397267 +893720585 3838105134 +2682692444 1098224711 +3782209647 3599544337 +959710885 3351991260 +3555784750 3528896623 +2376932341 4236444348 +4072808230 4223855206 +1200509906 1997403013 +3562601753 3562601737 +1446022440 2290022135 +2784107682 3726840579 +3916849926 2338185825 +2474415773 4023486775 +1757781421 2618767186 +3303541211 3561456580 +2549939462 3395595089 +138149015 2372837808 +1598902174 2763281855 +3135923295 2650538398 +2104036962 3462505539 +1793914459 2919747922 978218526 +2246659156 401856562 +58691916 58691932 +773078139 81474980 +3064936721 1771298263 +1837395100 58128775 +1349082168 1050249939 +1106258691 3490952618 +1645609796 3558717999 +440808509 440808493 +4074303772 2506328076 +2818197942 2818197926 +3588645353 2572290845 +2377249688 1749246259 +3159741619 773707226 +1265452809 3322336056 +1758653813 3080134426 +2753883228 3256882375 +4149566679 845227632 +542603354 3315223502 +3313779420 1523942582 +4062250245 788195020 +2135355434 2135355450 +2731991746 2731991762 +3110542083 3763307964 +128071277 431150324 +2028212476 1258732721 +3790276715 268320866 +2679700989 1832375618 +1140078490 3887573174 +2669608137 1187508334 +2935731575 1838405359 +2093374932 150666192 +1345790147 164139772 +2224882567 1244433792 1143128211 +482563205 3430813004 +2888234168 3109240237 +2005770029 1626444754 +1894372240 1894372224 +4234050628 2474726620 +509223581 1692695842 +3380782211 3148413500 +689218612 2904562847 +1662485536 503643763 +391058952 3112152715 +835323829 369762812 +3048549672 572820064 +3801162545 3682231846 +2967951536 2777106443 +2828261360 1354559189 +438518547 948082426 +4088659435 1400507029 +2952316692 413230191 +3270393555 2953635386 +1386437997 2741058501 +2680160622 3913433135 +2449275985 574698384 +4141132797 1623397144 +3526379661 2994400242 +1153021432 676951396 +1414583217 174797377 +831263072 1602181676 +194813337 1702570928 +1216552523 1902686228 +3413120647 4176634073 +1883526846 4046113097 +2254502796 380370273 +1333973079 2179856614 +621834985 1105519822 +2393201360 3921241917 +553438667 1247063593 +2356124101 2068780494 +592418972 3231181639 +1763867114 1799744347 +139384034 4128841667 +3305794884 1936327199 +3853991443 2994124780 +2452196545 3630732246 +1894020930 4188519669 +18389612 633018391 +4000352058 336401941 +2041492769 2936480502 +1583047386 1638285220 1665888497 +3820659865 399580360 +1395795748 1395795764 +1785799226 303973782 +4232455310 2959838105 +896139388 3534571047 +1502009689 1419842864 +4122063755 1371382740 +1557355088 1891052533 +582358834 582358818 +406948283 3928740210 +3801968939 3906545332 +782033017 2604908638 +3188008744 1243390955 +2092379006 3529078601 +583607499 2286481807 +1958424849 379876877 +1059828895 281892446 +2546625926 2041211383 +1701156489 826174949 +3907262770 3507726757 +3031225120 2349882220 +1763647109 2484129760 +2591198752 3522663148 1112915045 +3852092233 3134712814 +2238506357 2137863996 +223309495 1590012439 +1998389866 3970616525 +288774228 3222623928 +132054207 132054191 +3812474214 3898351761 +83427184 1471950045 +286796392 286796408 +390104776 205692899 +1152914379 4173801620 +2584657432 180039648 +3964484850 1632081648 +3824508705 3824508721 +458194927 3978716472 +2064916199 2813109664 +2746858127 1412670156 +1849508790 1081186183 +3806381311 2400211208 +637380442 676229803 +2970246612 2270278831 +2609356074 8153371 +911387881 1831219918 +4151293693 737744992 +1321302417 2341625670 +1540981516 4231600476 +2450673912 453602707 +3654636479 462535191 +32501929 538724869 +1845849928 2056138315 +3824008118 3824008102 +1431743351 1311836208 +2466173368 522462395 +649977006 2866963961 +4002397920 1944702936 +2971678684 26517092 +3423404125 3165614507 +3608847279 2252389369 +1238342277 1739392890 +4180088060 881199271 +3544674852 3544674868 +2534573199 2407560561 +496384861 3612986552 +278483339 501387327 +2678447513 4208251496 +4129502811 3295574018 4129502795 +2381897238 3658848993 +1993292 464676012 +1159626784 69579936 +1011320006 2223820842 +4234444347 2368911076 +930024038 3057061262 +1762500111 1699498428 +830910040 4043536883 +1123549864 342634109 342634091 +570936944 3528344820 +568342949 4177182380 +2396967203 2176747323 +1975178262 1796988583 +3394266460 757814988 +667327557 3802661018 +214016683 759642840 +2603912041 3166139982 +1836716535 1311393734 +3355760007 520872440 +109807597 984021508 +1522843140 1786049574 +1481228269 3910738436 +4073452097 2693853507 +2205316950 1127341159 +3673297511 2103269272 +2406584267 951106798 +865554467 370395015 +3814008167 4177456186 +4167913436 4027889479 +880196350 3685418594 +748878273 93268672 +1946877387 2018346626 +3078044242 2941647611 +889804762 1471499325 +2723932160 2528000019 +2301786193 1219228074 +1447151307 2492199298 +383274212 3665890025 +1123565646 3134012111 +760375459 4223318172 +865071359 1977702058 +160095764 284776083 +16214860 3879546378 3404321873 +1734075388 2980570535 +2824763819 3082389565 +4141441224 1613978333 +3509716975 1869789125 +2707990732 2112950727 +628817273 2040333672 +678967843 3628303644 +2604463065 3639046825 +2159472711 1595431748 +3449639785 397037144 +2749820510 1653161471 +4129822195 1947897228 +524802371 3112701735 +3306468620 1268318689 +1616296734 3330838569 +4230990040 3610848269 +3371343066 804055869 +4035874200 1214834267 +1150314162 2706483763 +3954701989 3745616793 +3726853579 3546555023 +3401839337 460809432 +140070774 2593658577 +3552950459 457297508 +2255607093 318064531 +2520280664 1869296551 +2749782103 2491160777 +1715894380 2116212609 +2183505212 490937713 490937703 +2814709294 1228231279 +568640465 2093477728 +1223364803 133197349 +427384359 1091516278 +4155237521 4155237505 +244764527 3242674037 +2360254018 3101893109 +3267114670 3295593304 +2622163356 2622163340 +1041555736 3537787085 +3115391141 155539811 +1754455549 2620618068 +1167076696 3656868251 +4151257949 2533167938 +1291217542 1680296292 +3145977182 2390510313 +2463238848 4022728424 +3850334441 815709912 +934957590 3494852782 +1347529994 2056480429 +1810098846 1976194729 +1865656448 1644303615 +1156254329 4290702069 +1008742480 4138470908 +253844275 3646542753 +2585845780 3049308015 +4255404447 4166025511 +2950897680 4069226805 +2864085314 4282442485 +545098366 2745238601 +1306349432 191109627 +630312072 2894395915 +2648613115 2155309860 +456345175 154879956 +41296396 1472571959 +3049968040 3595045739 +2533554232 503349084 +876920169 2973117528 +3194147284 2307936431 +3001672855 185382480 +732370525 352859234 +1407328024 620163803 +3068046126 674231410 +2643306889 2399265454 +1833987917 1654601252 +498370214 3657599900 +4219776866 1407194965 +362536055 362536039 +1224471193 1224471177 +889968500 1248895455 +3996707363 2935724369 +1206916513 3757182070 +481981377 4202969302 +2553146209 2361641361 4048128438 +4283617239 3327995750 +1247639793 36004720 +3175962908 105868150 +410329864 2288395659 +875345783 2573520966 +394948963 848800086 +2772431847 179106998 +2157308074 2923739238 +2747355470 2258996441 +2352163595 1309263245 +2821290340 491395199 +1603496154 1603496138 +3512937216 2066392223 +1415533331 1426024819 +981970173 3105088651 +1433594576 1407690101 +3986816799 3103907940 +1981116784 851113240 +1761519249 3655349830 +2029084338 368579109 +3029154299 894584370 +831010595 2094098589 +3147464264 1142694755 +2580736022 3303785514 +2176103553 3810887601 +4152554810 1896363010 +316644694 1977654762 +1143754859 2589326990 +3155484448 886783859 +3339166633 4194738958 +3989432362 2128116237 +3415323740 702812936 +2973134059 3819795938 +684365804 1649211409 2175971638 +2726141817 1153567614 +1287944047 1212679086 +3381845405 4013088290 +1441108238 3714396815 +2683772587 2097497890 +3084821317 3095070106 +2937081726 2937081710 +1164691409 1164691393 +833599883 3265336788 +4233116797 2941204692 +712660683 2350930927 +2021294491 1138362116 +1469480053 1457908778 +2926306328 1303083444 +2759779850 4257489330 +778177430 2589474097 +1207247608 4144192896 +3376883813 3241782154 +193250824 704888459 +58725824 903555177 +3233625334 1608146759 +2107400703 3157148798 +959646590 2218004938 +4259208230 2829353422 +322117209 2457388574 +3905116036 3621506747 +556154696 2335202364 +224256773 3099359036 +3576811464 1870625546 +1911619879 2237976694 +3260882426 4069929117 +3892087876 1989201695 +2460455250 1093722708 +1527096468 3722581231 +2943071872 3123110476 +1036112898 975224611 +3510784128 3949246853 344984667 +2573117621 620991722 +277930247 454180374 +1428107630 1847251001 +2572209525 2572209509 +1215887401 3065649800 +3407043054 2641793446 +2012640004 3707178825 +2061407110 4002883988 +3886069983 532943260 +2689373623 2689373607 +3219205690 3193934762 +3418884062 2850316927 +2643313297 3561148488 +2983540890 2983540874 +3143654172 2703798736 +2213538513 454815408 +4190910140 4168755687 +124331663 2828988123 1233636446 +3218448899 2446952405 +2881588928 565426259 +3333365839 347069518 +1562656083 4077685178 +2327370306 2734659050 +3806117285 3330181804 +2576249026 2101051754 +3403564426 3857152059 +1591436971 3821272171 +1427669420 489759447 +711218844 111532359 +1053836552 3923553181 +229124108 2344028919 +1849880434 90108019 +750372420 2893225225 +4097215095 933853134 +2066082082 4272816277 +3863870907 1633563752 +4114638395 1331752676 +3667545391 1340571896 +2020994755 1688657130 +161273273 3672404542 +896167922 143538661 +1676453158 1938291393 +758797849 3207020286 +1820481995 2027394808 +1755971978 1854562533 +1999247846 2101789953 +2181162669 1442718276 +1131764614 3082753015 +4251475934 1299727954 +2568710324 2903531 +2749663464 3905127723 +931445902 4092908431 +955952475 712034866 +753661028 460437887 +3307472333 2065959716 +1919699044 4004598873 +3844415212 4224595188 +211092882 1620559045 +1747170954 2050513709 +3463453525 1333462748 +2891024715 2405114114 +469129072 1959503189 +3337914609 603165552 +388542294 3406562417 +1606509413 796515997 +339774217 2144163192 +1264101102 3250968730 +807359661 1850887250 +2345944562 287972339 +3008105019 2075400932 +3687862577 1669642740 +656448035 3142755594 +3819912781 3492494862 +333583501 3655752178 +3325027163 3249001171 +827528777 3645174456 +3683486295 4140877542 +581839196 261281800 +2684978572 3339277532 +473511368 906996171 +3828212131 3610915733 +1633899375 3193722808 +2336565366 4119979859 +2956703299 2956703315 +2907670915 1463122218 +3205829242 1210848797 +688097695 798074206 +1437722957 717314724 +2527531325 1711285012 +1123661231 764226910 +2703661224 1472352363 +375470192 2560986589 +2068401824 2068401840 +3136754897 2729104858 +770858524 1888101895 +2483798336 1317091269 +2617983241 2931253550 +3893393530 3893393514 +3992103250 3101458925 +4251866367 3266372178 +1811647738 1582297539 +2924990392 1332865605 +2493731520 4142692493 +3365832639 1994388609 +4275222135 2629123408 +2304720102 2304720118 +790659274 790659290 +2275174835 561440973 +189429922 541897895 +252496915 1690410033 2641006742 +2836634734 1817855225 +254281379 2130866826 +1519805073 1498515031 +3638950692 2517260735 +710444289 2857984150 +1093663817 1820018873 +1199844679 911763072 +3945156054 55347175 +2637086351 4288019224 +1868053300 3805219721 2498701496 +2994558599 2186229398 +4201803872 1748885307 +4233041559 196242617 +1908994972 2075934279 +1674913714 13407624 +3205197831 1611274585 +1358912775 2298442262 +1925538505 1975157358 +3711197442 997504547 +2683823558 4215547578 +2787732158 1362299167 +1983845924 1229970111 +306107184 3907417219 +796027350 2567531681 +350967046 1427557955 +2990205615 219694576 +2906011651 2941922474 +1545548975 105249275 +844934576 1512648711 4159007772 +3452388550 2153647953 2554889922 2554889941 +1441631098 3203567901 +1540329329 4173254374 +3237225509 2148004328 +2115927937 1799867046 +77200923 1500185746 +2211194143 2573103048 +2007730508 945919572 +4211968752 665085021 +3540988712 471313296 +1904143510 1182176682 +1207013722 487423285 +640420272 3344121859 +1164407262 534265974 +3828672046 2734439622 +1183639474 3251682611 +3915289142 2514496273 +2391895020 1525474433 +1563545950 2465313641 +1254687612 913341479 +3563302741 2585487942 +115041731 2388734460 +1754629382 2841667703 +2729971502 1438639471 +794847256 794847240 +2945960843 2555952815 4143279060 +335699478 3293926954 +1557961528 3286524357 +3086564044 1767345953 +1476384881 2296562548 +525996763 1940135582 +2152915227 494427524 +658947040 3025781157 +4285544762 1140378794 +1171933454 77660431 +951594553 2196816830 +3212866461 339083298 +1378727938 1610132277 +847724618 847724634 +333594809 2796160687 +3545959266 2744295917 +2716009314 973193240 +4255835377 1158047599 +2704981431 2256054032 +1002152098 2858278659 +2181901024 2083297698 +949741794 4285504451 +3686462580 1531892377 +314269080 351557197 +3794479346 2484805849 +1505974156 2997586492 +2409100855 1127782534 +450769887 944627132 +3407187822 552651321 +2657696200 665187805 +448651281 3335197636 +1601249726 3977774329 +2913638263 1785340157 +923202464 2385785965 +3490535053 3490535069 +3683900093 1376054863 +939685935 444375637 +4146492852 3314240079 +2211545515 768548916 +3130347979 2215625364 +487002127 3239987086 +2648710672 2108084 +1807121568 1198574818 +3972244988 808156840 +1283001857 1283001873 +298148422 2287383185 +2715924695 2908093040 +656008997 2999377722 +1814003406 60071494 +968705234 1208844133 +490733762 1361103319 +2502735325 3149656056 +1225279254 235399089 +1806819853 2517031524 +3735022803 2733486893 +299017026 1352073443 +163956353 3814161664 +2061384032 1744739657 +949381233 2404631405 +3932843421 4269631880 +3294547718 1083690321 +670014047 2422622967 +299072762 742482389 +2850124486 1823897351 +323252029 2444958996 +3084828064 329548517 +3659742937 3659742921 +2719459877 252727561 +1733278689 1733278705 +421143410 3174900331 2011071017 +1937419954 2082538021 +3521354165 3938696767 2014416665 2280952125 2100248507 2271962465 1405534559 3780308695 +4178777935 3100756349 +3932351416 1935173189 +1032989779 2545533143 +1831478682 1935225195 +2487932350 2454859578 +4009507438 2769287993 +2268267856 3021297084 +1432471159 3756748112 +3141740931 2959295686 +3789924639 3146333128 17374155 +1103237551 864147054 +180042184 2897999325 +747954156 747954172 +3787358686 1021735017 +3546416292 1733119551 +3593837742 3593837758 +951248569 4204868904 +1821578642 2106258629 +1736322673 1554193382 +1129420956 2507357585 +698014119 1418384306 +2001713366 2826959079 +386346213 625716346 +3927000213 3790479750 +677545686 360679018 +2817042453 1749063964 +1761079954 3061998782 +1094538722 1287533607 +3886303437 1956551346 +340860929 4239745408 +3993178702 3398936491 +2196782968 1854027520 +2985703314 3779042238 +746721406 2394945097 +1776595001 3079436899 +2438436956 826364167 +800103876 3607649183 3607649161 187177144 +463015573 116520074 +3647417139 289788964 1885929804 +3140007950 2937699865 +2199214166 4090602139 +4136409632 1062641779 +254839461 1808666419 +339365498 3330215343 +3141807913 3301107352 +2989320515 3229398140 +899802874 4286199404 +540345670 540345686 +4246303160 655230125 +3410167493 3213076506 +159692960 2616108005 +1411586289 1080029905 +983161208 3090241517 +934875742 728063081 +3794475318 3794475302 +311947484 556804679 +149168060 3139302631 +3465080452 1708962076 +2701084661 1725843114 +1494185254 1498770113 +519051104 334810163 +4043090944 1573045253 +5909797 3002405164 +2267145461 3069026956 +876937074 3130925157 +3812301816 1756254100 +3389562400 4196672251 +2616606242 114698089 +669398547 3798409196 +2234153883 981248614 +3189145398 1936343559 +437096647 3394955606 +4235293148 4235293132 +1380169318 3868730007 +636001042 3724518800 +782338381 3041600562 +135568961 2972259047 +452510388 697991503 +1718704382 1944228873 +125248365 764200078 +1768888064 3233038588 +213272062 15740617 +2441859633 2406384196 +289669484 2584624385 +1245933518 871460690 +295214034 1383987323 +732799983 2187480753 +1021874278 503309314 +793276847 3275882220 +3026170899 94927333 +3063641052 1387750215 +1371825869 1371825885 +317502207 3382560638 +2239415106 1648451810 +746906264 2905650523 +3886249410 1750229091 +1603077789 134310178 +1380700680 3152697700 +193229831 679651072 +1086055292 680036685 +3111411380 1125540000 +4252924313 2893238351 +2876031767 4080475440 +2386135008 471436765 +4006632531 1157715632 +2832763327 3673390460 +1433759128 2473471981 +4284732566 807487806 +2901025700 3633716009 +709571654 4249734725 +4262950436 586087103 +2558623697 3839637008 +2716531971 3891022762 +2922322241 3202112102 +1459030761 358123598 +351681786 2298619921 +479308498 2714443629 +3782319032 3782319016 +1536187508 338341791 +2374912558 83805817 83805807 +793813053 3102490644 +2044900435 251438899 +3353124870 2790254967 +2824154861 3944275716 +4096113756 3009905873 +1454843566 4293513518 +2700134099 772341306 +3838877502 4061766946 +3070212763 2945630724 +2938737130 2825958221 +219682938 384731165 +3365288 3365304 +805255609 1204280872 +2012327949 3732415602 +3363984456 3978997085 +490325136 1920878333 +456603201 2399289200 +3637668131 1983611420 +1906069253 3725616332 +694793577 2858986856 +1758428483 1101148284 +184238909 1717701583 +104757735 3143231136 +2210908742 3112397879 +3304844550 3401445345 +1192616083 723857152 +345454189 1248290515 3483648813 +3110363499 1141201762 +1510841814 2574219239 +2379830139 3357436580 +3063065138 2598497459 +3808406368 3095054373 +1725268787 487863246 +2514406189 3834560388 +166031757 556908772 +2584036705 1351636780 +2710370025 971550926 4149105753 +2864495214 890862393 +2702946438 3774042881 +1883589884 3105370289 +3179138625 125855043 4066809712 +488474078 1417166763 +4220750831 4165290296 +2441949994 79571355 +1658812419 2831805628 +2213235617 1281887871 +1745613541 2949602931 +15764742 2135308259 +1114597761 375592470 +1292184397 2351114788 +3804488746 2109773069 +3950939956 3963317977 +4177828052 3594294713 3594294703 +2186639397 1368138284 +1387924489 1138815534 +1862798507 3735860440 +2515336904 573560821 +2138747113 769946815 +708719475 4075486725 +2204111920 2204111904 +2014270627 1793419655 2736929948 +3969152125 3937624276 +2204143884 2459185606 +3937624276 4133468735 +3779661900 4060391329 +1321938414 4158213551 +1893152472 2060146203 +4043920193 2997751616 +650902469 3625801484 +2227532630 1490325617 +3738570200 2734148365 +1375818116 1375818132 +30562360 371253293 +441451168 3058785147 +1074092790 3970484694 +1295965829 519588684 +2726659713 203546023 +332575261 1370383284 +3700149969 3362323735 +3112448265 232594428 +2504344504 253653045 +2800054255 2855220526 +1932158815 3841415265 +524389241 2905509758 +1006106535 240835574 +4025792121 1849596885 +1578256887 2936980137 +2099086053 773665612 +1178909560 372448749 +3840989760 3897297947 +2439367389 3225311732 +321308697 990415068 +1561972288 3483348677 +2620135362 233583657 +888195153 265996278 +1133760013 2901126514 +4116821621 3184671292 +4078414064 3187349591 +1143395188 3172917135 +324164267 363117346 +2262590177 2252721425 +962631487 271581359 +3877988925 484851220 +3561773417 2637217880 +3330028289 1988381334 +3980861906 1492794771 +700620987 2019755620 +4017868674 581962653 +3639414045 4214648560 +121915312 545053212 +2272787183 819988024 +1270786362 1998874205 +2944808218 1782945762 +3062530899 1024159702 +3356622023 3356622039 +911522336 2808152179 +2383985229 2383985245 +3219761793 2165986838 248387745 +4003199373 903563440 +916691189 3941103258 +2916112224 4277767219 +3254052936 3805090076 +4179796509 1236294377 +535060601 2911100520 +324173788 1189037895 +3794412737 3410956774 +2868280760 3301158967 +1181838144 613144019 +1129256013 1115485476 +2610221430 2610221414 +436177541 2837468675 +852718556 3739181895 +840969 489905447 +2234037634 555072437 +2624347415 1435929382 +2206295117 1370547492 +2054097108 2054097092 +2970469075 3386872465 +3298858653 2418993442 +3668538175 2009099326 +1493059398 1581921057 +59963627 1555964267 +524027986 2772072685 +628433248 1466141221 +2281499795 2787666810 +3039560312 2890392301 +797829833 2775095928 +42454733 3368717490 +1366161169 1595569444 +1976787592 3371281584 +2860164131 3687580934 +1017396044 3263781025 +3199225849 680387838 +3124518793 3054134456 +1647666649 1930384542 +875347871 3454686794 +2513370604 398498048 +4251347254 506961927 +205863851 4227657250 +3726468451 3726468467 +1305098638 3548073743 +4167265182 2493956459 +3863375813 1172435738 +114534239 506493598 +4245786862 4245786878 +3588805047 1954685712 +1410125285 673811741 891821946 +1510151246 1510151262 +2758200043 3100733428 +3030662790 3275065553 +2254232640 2592923163 +909792187 3653033019 +2197451305 2834420741 +2187324038 3978761414 +693914051 3746045418 +898953857 3665412374 +977225653 2922823873 +2791292823 2142935728 +4251890741 418880659 +3746921656 1267946925 +1831328961 3934249981 2529199062 +4231993347 4231993363 +3888548409 1675041446 +3042733106 2994623141 +1039650167 3829318758 +212106415 1791454873 +1547335454 1309246505 +2333977999 2825939105 +3886447922 1781870929 +1698499606 1964639911 +2152102865 814506282 +3037299073 4104101030 +3705016579 1200348017 +1078856041 2748895320 +1868005587 2918080038 +3894088118 412934542 +2822188524 2923186296 +295399663 2656019791 +2235854087 4121498926 +3913131254 1421962450 +3838731731 1439979095 65686316 +4045892221 504144596 +3782287548 2702608369 2272788592 +2298636201 1472802584 1472802574 +3547830036 1669761483 +3374803068 621378353 +170530699 2336427970 +78544930 2159261077 +730502340 1328033951 +3520357141 1717041674 645832109 +2637534176 1717811508 +2482131270 1562068419 2482131286 +971000080 739443747 +1904328967 3057835542 +148426863 169892780 +1645281963 197604130 +532539377 3908313200 +82253523 2328423980 +356097956 2185021779 +649565257 1703421611 +1171899120 235089003 +4254429845 1024524166 +2176243525 2176243541 +3193519376 406429934 1960029487 +2535989451 2242655726 +3153808375 3153808359 +610309811 4144839642 +2591261719 987295782 +922736245 720691078 +2323770171 1423547902 +1848204421 132396356 +3101741197 2531806692 +3287364309 1236469084 +2456159940 3449432495 +2941885976 571727821 +1169668592 1071098717 +1829926786 3247109002 907157923 +646590982 4153501777 +1388653391 1024222276 +2527763062 303430982 +2028774931 1871278060 +1868353426 3540770438 +2749836982 3136194695 +2720441821 534190818 +2255378900 1941399727 +1979776388 3893633732 +2612013823 4206698684 +3482429065 1263086008 +310113574 989311089 +1077200692 1192597199 +489856944 2117953291 +1963073171 3310756218 +3068460907 159106456 +3928456716 2821418209 +3606629813 246135468 +389316597 3798807962 +3167300247 184314960 +1563088891 522526427 +3279223641 170372375 +2025978190 1734047183 +3313346371 667831914 +2217737421 3834312356 +2036829109 343312205 +1034808495 3352008558 +2658649365 2989869425 +3335057108 2481121801 +2526834832 2823107253 +2636647287 3122477868 +562134617 400156190 +3594015687 3784649412 +3340515745 309246048 +3439591334 1665888855 +1632383572 300197800 2129869369 +1976077739 1662754254 +2372874172 4042375404 +1416319137 4119572861 3255176878 +3325413243 693068302 +1532329229 221973185 +1571585020 1178030811 +1716440225 2936807798 +504525761 2973595889 +4262593946 3024335281 +3574561440 2232000141 +978755827 3378470540 +1964722971 2771562696 +3218495040 92530701 +1906818446 574518031 +3173331353 1519195102 +3623130086 3691303703 +3098180918 3932363783 +631920609 740841248 +814607448 3345682061 +195311868 1334162609 +271400006 3800624726 +246192056 4205489551 +3474731273 1837612596 +3157309562 3132254219 +820554859 3469591800 2551687789 +1947944598 1559240241 +760067821 954660782 +1600139098 2120911531 +1484179085 3489304548 +3464609907 517259766 +4007672661 2355413097 +3152961943 3614831874 +2654396104 3630216395 +1743961302 1434320345 +2543813203 52045996 +1689697116 3886608849 +1872857816 1872857800 +112597241 2309574632 +898549430 96653457 +4158488140 2275481206 +2597767815 1193333398 +3205715953 3161682032 +3934922893 3296581092 +3247300821 173536039 +1684332367 3010016667 +3470688031 1964302812 +1853669054 2623548409 1853669038 +3772894289 1416930182 +1142326012 728773287 +3725115592 1338473163 +1097388783 3747765215 +2131191974 473239527 +1501197055 3670214526 +1458482604 2243651031 +1612883555 3112955338 +3441265302 1668300975 951440238 +1954424504 2940647104 +3120317104 2015165187 +4158841109 1328043018 +2811431788 3935904407 +3643281948 4128539143 +2665156055 2665156039 +538631591 3606452025 +604354177 905858304 +2249374720 259912709 +4191066444 2352698017 +2973963990 2482615914 +2380875060 1717650615 +1040695909 4273101657 +495581594 3023933455 +3859993109 1151383324 +511858959 372388494 +3497296523 2993258690 +3567853187 2146299940 +1060285860 549935423 +858627185 30230000 +701384569 1220182888 +3602842508 2595394935 +709760768 1426195620 +3397139588 1339274607 +3163791209 1164178008 +1159505750 4104481836 231752110 1426728203 +2584473670 2977610298 +971700512 1410124804 +3590239532 200750167 +694942776 1828588603 +1633549724 3668006983 +3656909771 3458096958 +3770699685 1941790906 +880370791 35196470 +676203056 1999818824 +2144445205 1446656051 1275312650 3017661869 +215071164 1697676931 +2905733661 1873140971 +1004368599 1862911111 +353962582 1943945505 +2958387268 1844685060 +950198620 1106002439 +2723040784 3832654973 +2573799605 2573799589 +3903032451 3903032467 +2521555097 846368990 +876794267 876794251 +2477182241 2423120208 +582955153 1140421702 +3249754946 941803598 +538722405 470844298 4051263212 +3087390993 534035927 +970172274 1201209950 +1268701972 521330799 +2993241490 2024132666 +927729738 1454443643 +3546430494 3635624642 +3249132637 995708514 +1771766018 2048022813 +380827770 979846822 +503995488 1239290483 +3163286898 1111935589 +2282964892 3147946595 +3325881104 568724021 +258369870 2352465359 +2670467559 2037171894 +601770199 3483329005 +1125956852 2587718681 +2320623150 3974978169 +3851598999 4244562352 +3615295114 4080127968 +2135507433 2044149968 +1979782647 3132462022 +783314650 1505657149 +804412476 3062313575 +1629049189 1071325690 +667368776 3869603915 +2757924922 2830786865 3848132502 +2740513660 2001496919 +3626020309 275883594 +412806233 1367999064 996630557 +351850543 850377198 +1562210217 781932535 +425002809 3608522287 2335394699 +4031967550 2425472150 +3988085431 3339412276 +1851985760 636564517 +930252870 1618730378 +1223882445 3697654625 +697613134 3332755762 +601407506 2420313035 +1580729754 480185402 +4163880361 1546922264 +2614161579 1057980505 +3638175259 2053766290 +1009298014 1536865385 +3939759630 3115079705 +1557780488 854529163 +540148581 394015172 +3471600929 3744451318 +3719759784 2938178923 +2727124364 1868301175 +2257778220 89753431 +1478372396 3816786263 +2027851846 1070001754 +3363098052 1407183744 +1247771768 3496690963 +1427542424 1607741221 +4032388095 3157376832 4001686337 +2301586246 1909902613 +396556318 396556302 +2292074931 2292074915 +4179835650 4179835666 +3465103561 3073940155 +533854867 896486310 +1787964983 4213096582 +2004650032 1225417603 +1997724247 462493822 +4076897706 869427853 +1760400411 1366335470 +1897868046 1488650361 828897604 1840023350 868801815 +3121365797 525408592 +10642160 4020355029 +1577561882 538486269 +2364230602 2691190509 +1055375831 3721799014 +1950874684 2190160117 +758759582 107877151 +1417921311 1405909409 +1070325981 1257438178 +3484483804 3483654727 +2560848651 625401229 +1985044011 1830239668 +416002150 3345481126 1856417943 +1171373494 1705591749 +2575876819 2076601604 +1854085404 687121923 +645948351 1528628648 +1152773586 4234502547 +3590382125 274992338 +1581073598 410203913 +970153745 415147984 +2296293765 3961820702 435213910 +1802218490 343915147 +2328799475 1985214092 +1029622437 2430729519 +3199225837 816119798 +1509847958 1099953457 +607524316 1901185671 +1954765188 1167660350 +1855674579 4052538426 +4054931714 2704044317 +891987144 2893191356 +3226737785 1800029515 +659594797 3921091995 +4154183884 2521411873 +2112433257 3986498367 +4129350836 355691988 +3134658491 3684326244 +3401270922 1820438003 +4138071160 4269964549 +1741565646 2020034748 +1319721543 463019456 +336865961 3917242367 +1459340397 1780093531 +13402628 1173400671 +832427351 1920391152 +2442952380 3530876396 +892106287 3825077240 +3831448488 704086397 +733180860 2273259751 +627069955 3651420330 +1908946711 892254512 +4140992942 997113071 +3748534476 2660331988 +4021157546 4175947155 +3501148015 4075647918 +1245691163 4250317188 +1066359642 1756155563 +1693463615 533406402 +2012389180 250653553 +2814584505 3509974334 +3981281356 2639862368 +379778698 747248429 +427843725 2987916786 +3839624639 89983934 +365233314 3566722926 +3120527814 2469180065 +3418867808 2687432507 +3844351927 2872014900 +3086905387 145507157 +3451399545 3797984373 +1380526870 1462370674 +488560994 2529537303 +3341609628 326274384 +537497523 571291354 +549235878 788777303 +1093628962 1857073395 +4069767363 212923098 +496088769 2824729574 +3608310507 2712427058 +2984718632 921854443 +3040403058 3987030892 +300787947 606136820 +2859336394 355361787 +2731425927 3517944982 +2236224800 4087300453 +2140765784 916579469 +1477029627 2453566770 +1444172357 3338502796 +319907173 4044442195 +663344597 318479946 +3490228918 866434193 +1971012513 2450224758 +1681492044 3693419127 +3660298952 2116417503 +3854990625 3631676150 +920530444 920530460 +1429610393 3174284766 +2877974401 1226437286 +1315351813 1889689306 +2799379365 1341725882 +4198791732 768368601 +3247366550 2269645431 +367615148 710730455 +3851004567 2062607892 +2906160815 1592749432 +3566067995 3059309965 +3885410185 1890846190 +3671179171 456175004 +1534937822 3829193599 +1643085990 3523708247 +2248303701 2088083706 +2631177363 2686780182 +4083223248 4056155491 +2146125167 3462286766 +759721306 2734957757 +1926807199 1781797960 +2275267194 3607519869 +3342051148 3796917431 +4167806223 545353358 +1522912296 224420587 +2237802042 864169291 +3658900899 4097965962 +2152256447 3672719525 +3640715000 2490079341 +801440056 1797319483 +2665311930 3499445963 +678367212 2463502487 +1782371484 1585284935 +2244647832 905113691 +928659142 3909368225 +1977225927 1296797504 +2477303201 1649462296 +1586526195 3496792986 +3911511590 3203387751 +3434389443 522878105 +1147355962 4023379118 +2605594443 3340831490 +3619846488 877116645 +2381263154 4293983451 +694757168 2351823499 1619570819 3446361928 +2949199756 840671730 +3113855447 65428838 +3617436343 608196112 +2685252058 3910390197 +1091793360 1100753507 +3198501809 3475607462 +873232313 2829088830 +454876349 454876333 +315319418 271526941 +1500429267 1083415616 +3030403555 995381340 +108074936 3691533997 +1654787688 1092976789 +3076988680 2802279984 +1264823773 2330637026 +1152883458 789120053 +1443084885 469624556 +2832871777 813415328 +3051035131 2117423355 +3561051252 250799816 +1090357481 638465624 +493075967 3883035563 1124341864 +272535016 2054775851 +93376428 1861675991 +3356809260 617631041 +1999379218 2892930373 +1640069203 915434170 +2373641453 2622096724 +1457446215 376082514 +2974769866 1362610785 +809302840 671054139 +1899502884 1824487075 +3636816622 751260857 +185150899 3361756755 +797045763 3432194236 +2859963520 3661546899 +3309614617 3441991401 +1717895441 1107340742 +2115984152 39512172 +4018247152 4177463491 +3290545088 2166001477 +3747399256 4144774299 +2977440349 3172866146 +2491152753 3231398964 +3143839500 153292769 +714822582 714822566 +2404571221 2715598006 +843203296 843203312 +3270145018 1683779353 +2153851479 1961729775 +3542883380 542446520 +1170444942 1625273743 +912601839 3275552571 +831385065 3949823438 +122878564 1445221967 +1505098479 1557282619 +1307418894 113089810 +2391190005 576428407 1327787916 +3388591604 3028532319 +3987349993 1740828914 +3652856780 2350051873 +1730515859 4079439980 +177920584 2931470943 +3711633506 2783851093 +2710697302 2932160103 +3951184220 3877497361 +2218237695 579816318 +4091810884 873195273 +1725741578 1725741594 +1965517013 1107953500 1070168442 +3633016097 108233041 +3135035640 3367792387 369380778 +2263813035 3220261839 +4032229763 3688771882 +3517062356 3593691567 +2654254430 1707685758 +351028733 1128087285 +4155006705 1412417866 +2180630644 518159071 +429863443 1755042810 +3120599095 157176495 +2425731841 2629132928 +509063245 93714853 +1637194395 2873229861 +3191484764 3516642257 +1510047362 844768931 +1570055113 449271160 +1236656784 1236656768 +1359686329 1363439333 +3693223955 2103998189 2725132950 +2089962112 2588624773 +1010480086 2791905767 +962796602 624725187 +2577421226 2170795149 +3233701961 3031536376 +1797178004 3027377787 +2986295212 1372480878 +1461439413 2652818866 +3981865417 1195407918 +438104510 3650129439 +1509331130 1509331114 +2834994820 2256204255 +1421959277 3647654802 +1543877042 3273355207 +1853107630 3966540584 +1584369748 4255134767 +546793608 2147132608 +813328477 2914142827 +153999955 3324948666 +174219714 450880611 +2336736974 268301913 +3178902625 2824893600 +1267215531 2455654690 +65040199 1538584115 +876675305 726953688 +2192829425 712448645 +968634913 2229732743 +3151987116 1826169300 +3363193896 3123530475 +1584248010 1566634533 +1289816747 2974010146 +2909051211 1726390904 +46589466 2456862709 +564049347 2950177276 +572062014 2117893119 +1541041603 1541065212 +330034416 3886415299 +1165127873 1691696743 +1123831908 1686610117 493670418 3619778893 666263497 1729780978 3285502478 +1904576463 2218052302 +402411930 1546941803 +3464039516 1687057607 +3640129445 3640129461 +1143480142 495544690 +3277151414 895546001 +1398729214 1013603039 +676766484 2489497711 +510059072 469117637 +1342928739 4015991376 +1593162790 809440290 +690371653 1329567712 +1116824431 970950574 +729172665 607625512 +3076997652 3415016815 +2452918012 2259335345 +1441778761 2440992487 +1737148325 1734909539 +3323050650 1743306859 +431851849 1707887414 +376859155 1869151226 +1312503827 1312503811 +1463668290 1572196686 +2720718534 3904458346 +751974946 2968617859 +1326613345 3676623286 +4119813608 2116428351 +392325170 2745629555 +1842698028 3472147008 +2567450197 2686024442 +1086773838 2738142681 +29896389 2303403175 +349476573 3103152942 +3704575359 2529654754 +3724462654 3055050633 +2050728869 283286700 +3376557565 3622481803 +340909250 3679189706 +4046386604 1491910081 +3688242361 3406772008 +738117811 4111856076 +4109371414 4109371398 +3352985312 2096478885 +243304106 2119433627 +1150771015 1095433408 +3074484277 2955774826 +1771607055 1244730264 +3681210931 2619926092 +1998616614 4007619431 +338293458 1368434555 +1442073946 2646905574 +1429795703 2678539344 +3303834882 3546907497 +1643438868 379155776 +4264065550 666379279 +2746897040 4242834684 +243825351 2816034646 +2185549359 1096625144 +1186710343 1186710359 +3361534208 3788104356 +2826447909 798864714 3040514019 +1178945691 974212114 +1849752798 1850610047 +2807109886 1655330783 +3917984478 2124321641 +2749223804 124613526 +368036014 913893881 +3306280728 1393924813 +2206004115 2427678842 +4179241094 2855127799 +3671365917 4134327956 +379932128 452536594 +3618404535 2657793257 +2781062949 668448814 +2790028813 2492673151 2058917220 +1300670856 2466046235 +664197422 1246161037 +1834368909 1522744050 +4145135216 1626262101 +2514356233 4119242286 +1230501641 1205903737 +412411762 888591289 3477295086 +1385331785 1167697656 +18815219 63565610 +1557348451 4112161616 687985203 +3237198522 571255836 3523383944 +2587314528 2932664004 +1104053452 3183074460 +4111935742 3514140639 +2762099674 3479894947 +1854221206 2443418929 +510012997 534435482 +1349070413 3801342770 +3337617137 219135756 +1157146221 2959473088 +3434463804 3029877803 +3056464947 480213942 +3635239586 3135614229 +1641840895 550484545 +2353721452 656936855 +2720685278 1650320557 +1453951053 3118567730 +2933906724 3050373358 +2497243550 2497243534 +1803263421 1197064958 +4072549300 4072549284 +3586088771 3829994901 +2555551695 2555551711 +1208403625 213372420 +2935416576 3220238648 1079690971 +509447762 1420706920 +4204310586 3262372929 +2351506424 1330489116 +2191213167 157914296 +3495031145 1509886040 +1658482685 2598259540 +792433710 3312040622 +2624310649 3065279870 +3087689069 626895506 +2627193146 3560321686 +3676132709 1412263404 +2196512612 3596624517 +3716190767 3764789230 +3560045684 1375435344 +1659447943 1659447959 +1622775449 1622775433 +3371339061 2329168490 +2647441523 3696424204 +419594255 2213504817 +3298971688 3298971704 +2456574239 2677033928 +1954358190 2326828601 +943884734 1321129481 +1683417191 1540348470 +3199400330 2547335729 +3344836296 2704739531 +2059408745 2774643800 +754110461 3208473410 +3822573932 701220186 +3209053133 4171027700 +2968995645 81347125 +1337545723 2076128292 +2421969843 2541364983 +745028257 2299808608 +1372933417 4224219032 +3346322533 502085514 +2295408692 2504149455 +4003640866 3424958357 +3671264756 1849620239 +893889853 1718556706 +884378538 2774391963 +1708225676 3568990305 +3662385269 435447850 435447868 +557963391 3651653630 +1167033417 1931364933 +13853210 631097027 +3649013373 3770726082 +2968521656 1105359547 +489726502 428818903 +1157054119 1161357306 +2210152663 634062403 +2973158595 643178499 +2777225506 1987673661 +1692982336 445823187 +1074740874 1644131117 +2822951224 422533933 +1843191361 143905917 +2457103511 2457103495 +152438807 152438791 +1688615839 2362847819 +1308322920 717989821 +3840794584 980902171 +2779580754 560311301 +2446684729 3865905160 +4177705013 877132643 +3835417980 627809478 +3322325769 831200287 +1280432426 979636627 +503818262 1544395431 +1566837413 2843525562 +95696382 4172349151 +3867809475 3867809491 +1629883522 1553272989 +4241839661 3318064601 +555322958 1124064978 +2064917370 2706574766 +1586774787 1841622768 +889681864 889681880 +3643207667 3397959889 +612383909 450852780 +2598497474 2477241717 +3039560305 2772948976 +991729537 3624375148 +607991210 1413902228 +3660775904 1582035877 +2755990448 2551642891 +1502657415 3758218810 +1828719834 769205429 +2996190517 2881861532 +940754241 624289392 +1575056802 1810640405 +478702259 845124614 +112061450 32530658 +1242744721 1827731744 +2487899800 151408973 +3196936314 1642770773 +2915781400 741548092 +1126616582 3155579767 +2213727499 1467226357 +2183794375 282648004 +1567634096 1435283996 +3122753460 3747256939 +1253659456 3787328979 +2545645018 782339470 +1960301719 3332128649 +2062809098 458849125 +4246224202 291464006 +4179101853 3184889652 +2498711892 3367831353 +3192255716 1814070015 +856493287 1149980576 +3930263495 2391922262 +283279458 1809407433 +2576927165 2576927149 +2352633064 2815666475 +1067118696 2296935339 +2894265369 2872236872 +3858004829 1558066036 +1843162446 1527001676 +123392245 2297885098 +3467570599 73407990 +3729378116 3267738439 +895039844 1762023991 +666180356 2249819977 +3743284236 132353116 +993111273 406008526 +1633670458 2995291379 +3385728517 3027845594 +3720284965 952011564 +3679975337 3949798169 +2768030314 603104475 +29290393 29290377 +1934147388 3078949735 +2473922822 659147873 +2414069468 2414069452 +3413818350 2245951067 +3718936309 1854243994 +1763583415 829775622 +2115407578 1515373194 +4187453247 678475816 +4227458416 3770057436 +2462498466 2967345429 +3714903352 2927986138 +3343270335 1922662334 +523594151 218144319 +551830910 1163486537 +3812415719 3439631096 +2668799881 2187476232 +987199389 1043418146 +1836757289 2710652799 +2621511310 2289467801 +647629573 3380566234 +2582262094 573334362 +3432242065 2646779206 +4238282778 2586872953 +2574494385 2989189021 +1881218066 2518626387 +3357534675 1932229206 +110453666 3238338462 +1676371639 43168262 +3825481563 1302537298 +1865804807 1865804823 +3715089515 32650356 +1932038552 3772592731 +212516421 902399628 +341351506 341351490 +197879600 3241373827 +2899845617 155020912 +3089254288 3089254272 +3884871608 1027202747 +3426230587 1170299634 +4062623367 3260235993 +847697147 3921870270 +108159764 4048762192 +2630592418 2038603886 +1984435582 2977551711 +3573171053 1618364251 +3400851956 3911348471 +1612551803 4157561640 +2013410497 2855581597 +2436419393 3714990912 +1194933386 2837073197 +177692918 2722997063 +2310821473 880540342 +1957567285 3714378234 +317133166 74832922 +2788535350 3699251473 +3259258976 831987507 +257895207 1613324344 +419587562 1220964173 +2047457460 2460970296 4272261588 +3281863054 3369703193 +3280306657 3280306673 +426921182 3054880814 +726216308 856641759 +1015758291 573723450 +3585196805 1809187020 +2036417775 52397102 +2541992020 2541992004 +3865621202 2295431301 +3110913351 191439150 +3693073490 3625663749 +1628110094 3534460381 288779194 +844377738 2563298803 +146654156 2394634807 +2185168219 68982024 +573951458 3165854421 +3362150217 3256575982 +2681124825 1802201758 +2210174528 2715846341 +2612103484 1417349489 +2473065352 798294691 +1796678067 1606327610 +3730661855 3959493150 17710049 +871178426 676268949 +3409286494 3409286478 +1154237129 378348142 +4226389102 627463417 +1635852762 1481132605 +2922706558 3143632969 +3990394900 2146920303 +23244506 1333892789 +3279054097 3189053904 +25923873 2411034358 +905796833 3738777142 +1202320496 4044532171 +1718011584 1034600056 +1144392823 3632806246 +186716405 3767454867 +1057430946 3660817923 +3137123204 3955937805 +2717167630 239862290 +62849804 1541665591 +2822295237 2596645105 +2478536275 3810215098 +3779165368 173459256 +2003458150 1651058817 +2943282433 748624022 +1145909023 3210416604 +1918942837 2202784316 +3742893551 1955351852 +4032017279 2517305175 +1734937645 4150143698 +3817233743 3023637738 +2165204794 2792389360 +592570055 3609228754 2048489861 +2630546653 2961143778 +1000850559 1875705058 +3570603425 4146372038 +2662224813 2767583839 +1673982127 885029126 +3315980962 1430559582 +1793950924 2042290309 2242864263 4231970340 3143898924 +2044530841 1879122142 +1786227563 1650945547 +2742719986 1274678245 +2704503610 511171526 +1941655777 3340856070 +2222548308 4191222574 +1885328958 2833544030 +3786263430 3398919159 +990346340 990346356 +1116235349 297342922 +156630132 643590809 +1646224395 1176065525 +770672797 3977514786 +3267212876 21496673 +348795568 1783483139 +842560816 1054898819 2422274205 +3826072426 1792313307 +1949117869 658737001 +676988979 3237158922 +2690026635 4081008340 +2033745900 2851793665 +331247390 331247374 +1662139758 1672918073 +429564167 1433107990 +1549351273 1908841166 +3264673700 478847352 +2336272433 2336272417 +2028837629 3608086731 +1177637605 2583983065 +4029648641 507496481 +1193547441 3607080278 +2828628343 3767377488 +4006720148 3761472574 +1907486461 1354649183 +1752523101 3452454242 +3848191627 2670064852 +2774244905 2017065614 +300238904 300238888 +2663777699 2495274908 +481786433 1976923200 +3887320451 3025309699 +1648112024 1019351643 +3526109866 2240227739 +3486936959 1640765889 +3317931033 1810807646 +3812707087 3511373287 2136678075 +2594215913 3172293976 +3061999678 1621223303 2370443679 3017772931 +2334766723 3608956528 1369577707 182910504 +1769288982 427987377 +107575785 1915621209 17492430 +2560611416 1987050768 +2702187802 2791165931 +984846440 984846456 +2023880578 3798365085 +2444915143 138377412 +1255364104 3534778013 +3741574456 1260508987 +365057631 295780525 +127771316 2972131673 966360863 +3338445394 4014285310 +3845674154 3277741158 +217941426 622425907 +1258031337 4089579214 +3805648387 992391409 +2301386033 567718950 +2197974443 3889341492 +2272005305 2614322825 +204578705 2774514419 +1770524123 4230860740 +3464054964 470071374 +4226501663 2993214686 +1327971650 461650637 +2130383655 1095626771 +112428478 2651354118 +3892199614 2637919764 +211384493 307993991 +2314805906 1449882814 +2586747670 3446324145 +569935748 4265432265 +1430969155 2279025258 +3844076237 2188001330 +3841296907 2777997614 +3018075069 1414350539 +752306903 1844105328 +2552454886 1705927681 +409730205 3169281666 +1551902490 1551902474 +366424022 935349745 +2589996536 4252300653 +3728590428 926892753 +817065628 2122756433 +926370219 2533947444 +3019372261 3019372277 +46308125 1593272597 +2576596040 2470734209 +2034278152 2252334640 +1632979068 3040942897 +2132215968 2973930469 +3548909778 3509746323 +1979726370 1979726386 +1121114025 3672735502 +2008523281 1789892534 +2414051166 2414051150 +1387421132 3967003639 +1497555140 1377014713 +2212522124 642028641 +3140341217 797125820 +3479317517 425474930 +1575163435 4152092084 +4108804750 373302681 +2054802621 2054802605 +1131444639 3478496936 +3778530070 3913274610 +1202382021 1877903043 +3931610627 3931610643 +3134297474 2582535075 +1909616365 457482002 +3205792506 2267143638 +1682252776 1682252792 +2510869337 4056200478 +277266709 2591239098 +2104463253 194971548 +114115049 2652815822 +1619542641 3731828004 +3792678329 281941301 +3646722877 1773914388 +3067763953 2461859222 +3613152906 2421963579 +2012801744 2899944821 +4248133702 2018633442 +4010137410 1272140557 +2697748873 1986088942 +133383526 3925229463 +2461745765 1640596730 +2857935268 3448141097 +622898050 2539676430 +3540796559 3540796575 +2737259047 4258079584 +1377876681 1772844151 +3457037272 4068844216 +2598706524 2544819729 +1168751539 1563589324 +1476714107 178928548 +4222198415 2780839793 +1268268164 2225554399 +1392958581 1623859153 +2280796603 3175369074 +3416462781 2018908021 +3251106067 560112547 +1926093421 655284612 +3948221135 1173134286 +3945355532 255773532 +2273318641 1067720048 +3228550717 3351992610 +3065275676 3120245521 +2767830916 958954719 +3426095281 706496166 +722393635 3949028618 +3228019872 1896486267 +1714612026 471990365 +1036887599 2042403822 +2225636710 994705303 +1859684848 1860248771 +2329849013 2695220022 549370821 1378734023 63280596 +2947539360 2921837079 +3954701152 1922310195 +2821247516 3189605072 +2788525305 2671793128 +1700430869 2726161692 +2638028329 2956360334 +165512546 3921213763 +4218276361 1600269433 +84458189 2817078347 +701338069 3648670330 +2529585745 4084859725 +3847216352 3703092403 +2761542978 2807616091 +1407519286 2906321921 +1829351458 3359655299 +1218510352 1701835573 +3850920400 632420963 +3700560581 1936035068 +2432812109 2462582066 +3405327009 1019558598 +1798522485 1233492433 +3501167334 2463163441 +1392154648 4248964576 +431723620 511503592 +2543422023 1233556361 +3797186273 1711855752 +2374551044 1833100410 +4046294355 1327715302 +519276854 3702721281 +729563382 332915317 +2778278976 3429479528 +1393922151 837964320 +3660587791 3918626650 +3459394074 2523738768 +3839310977 3056703243 +1701584623 3539242555 +655120037 493643194 +2651112723 3565305068 +3888433148 3603354033 +810827945 3181496846 +3547217800 736830939 +3620861350 1417702746 +4266593172 3933157871 +1776442731 442044276 +3398208405 1883224988 +296052384 1734381029 +721294631 3573238880 +884520804 1657320063 +2596898539 2520736738 +2149866734 3567998576 +3062062700 2829090428 +3077654546 3646190675 +3832397780 1824848569 +262050592 3064044389 +2412974864 4114973478 +1412761572 706975436 +2095846922 2980491693 +2770862727 3635107731 2231106176 +1370344616 3354513875 +2526088075 2438278100 +2915657901 1091553371 +3158483 1450240557 +1212562172 1212562156 +1045213698 347879715 +803972163 803972179 +3528391276 2119448599 +1324340815 169770559 +727244378 924717603 +2125199640 2159616219 +3647427684 2712263039 +361170291 1452119052 +2355260714 2411251077 +2356803598 838958607 +3396408763 3396408747 +2037246253 3315700299 +3303461679 643724014 +1483078578 3666557235 +23935935 4260695486 +2225200092 2798459719 +2146428032 2696385386 2935943076 3504553470 1019914029 +1284305213 1254344343 +4175156291 84878698 +1391858536 23104683 +2326609083 162962020 +4249089700 1442661417 +1363010863 4185150290 +339939235 317740963 +999925816 1369487059 +551175124 3084494956 +2899445193 135459423 +3724327288 3973576685 +2690199659 2837158894 +3067712398 1719879833 +407039596 2640139287 +2157294489 78232008 +2087550500 2087550516 +67634649 832648350 +1998416653 2421130610 +3275181519 2057416546 +600080942 2086203001 +1399204335 953418552 +3530147797 3530147781 +3528245534 752091711 +2989732165 1312326768 +3528245527 634648368 +3186993032 2444671773 +56619785 1493931822 +3211437070 1294103513 +603434497 1317330214 +1813208144 1920618997 +2946611026 3785851462 +232178567 2454880403 +2172038696 97796667 +617198093 617198109 +3057282723 2164009628 +3531941427 2593858124 +3120879686 2962887237 +3857574266 2613895765 +1894713470 1179278921 +3836301665 4189646557 +314096762 2238920278 +3926956888 3492055949 +3114690587 1542840964 +2728479387 2666033682 +3165999877 1195639641 +2476472673 2476472689 +1206455649 1206455665 +1838864370 2093085178 +449085583 2992005400 +2344604196 586665663 +390104727 2353257827 +153848856 818933171 +40231875 2305133564 +3777486938 3043107594 +1585756380 2800681543 +1403296010 3055348411 +2758801604 2688851103 +258911847 3041957491 +2857212023 657745365 +3985253982 2108587402 +2877181137 3369266447 +3055647993 147943157 +1660713613 1750123860 163187602 +2773116671 857744254 +1812191490 364853134 +2505167223 3344304290 +3486884167 3486884183 +2251559391 586686984 +2217853270 1884510823 +2683484537 1142552936 +2541848351 3843485874 +2562374029 4210170098 +114853280 3522064502 +4179318451 4179318435 +1232983507 2097060281 +2915049596 2101374051 +3539164793 852060162 +1094484744 3124905373 +479362063 924224957 2198632433 +304555340 3751786167 +669823949 2855446103 +1085209015 2322799376 +3957210649 65495503 +1233142484 1233142468 +1839666674 2416413669 +552649609 1677971630 +579857822 110301097 +813828300 682875169 +2507806297 3614148181 +2199293825 2199293841 +3939277356 3424039767 +1405019112 3179333163 +3378037754 4038886027 +717497662 1155928393 1172706016 +2773409484 120109879 +2558301691 119544365 +2328559453 3716712751 +391727006 439488298 +720126773 3956368543 +714884189 3392437942 +3521072098 1149531349 +1148066327 3495105081 +2864085338 1180738851 +2974373441 3140251933 +385566431 210800926 +2339363465 169149870 +3198313635 2463562119 +496860279 367718214 +1241470765 1621109650 +3726712407 86164198 +975558272 160476037 +4160984132 1542134284 +2599582372 2814270872 +3552981109 155949581 +3391916351 2199653921 +3289041559 2267481603 +2004253167 3600796381 +3671500220 1004988145 +4239426059 3229826281 +562222836 581187720 +3362989016 1862182183 +3019889944 386680032 +3842881806 133012111 +681495291 819127208 +3571516437 859401500 +3172756687 2193574360 +29841757 29841741 +2383876135 863386706 +2598831854 2672684310 +748448754 742256101 +1422017424 2375925608 +1491725275 3759688617 +1696650880 2645597112 +1236649100 894460820 +1409582100 2582884200 +192150878 1704450793 +816657803 732645826 +1796900531 61892557 +3585892416 3047293453 +3557091957 3557091941 +2713178917 2713178933 +1942516231 3969651460 +543458249 3342562670 +3818982202 3818982186 +1481957954 1335897589 +1864312817 2890681680 +2429633508 2894503206 +1182094846 296249362 +2814715541 2958802058 +169878239 3482772737 +3582160777 2800260280 +1407570354 4220899661 +1797899448 3873936348 +149847958 1065715135 +38101997 1243521671 +2336819623 3942265334 +2110450326 2624539175 +3283108999 2507923584 +565969782 2432266950 +3024802080 4056364389 +2868643581 1162774315 +3657558732 4244938551 +1438241643 1585959266 +1061688012 1786091319 +2431490305 123748400 +3001477473 2880437709 +1639305154 3923513577 +86169795 3638246122 +1629423887 3878278476 +1926176915 208739437 +3583345031 3243960192 +780792262 2559992570 +1976104143 978936270 +2949544000 2949544016 +3373277489 3485307803 +836062652 784948967 +3398446132 2883740652 4010166117 +606264533 3085017930 +3531647242 1787435698 +3069916132 4050825215 +4102199029 3734217660 +1263357482 1727516444 +619271267 2119161802 +2717970046 2239197279 +3283113940 3801760441 +1484905371 1484905355 +454628278 454628262 +2486020056 467613965 +1128841872 1128841856 +1756511870 1318608983 +3790149149 845011988 +2768979784 2768979800 +3320902883 2102493525 +3311175009 296089526 +188371228 751474631 +704064499 2560659518 +1404059984 3188389880 +2007910729 2958908920 +2986019777 4013129942 +1443630350 3039510802 +1120393894 7852529 +2609381780 3554247150 +3092937897 3268910373 +410465524 410465508 +3249718976 3249718992 +3715254612 4008275759 +3650350754 635480323 +803380310 3082558311 +3923956547 2721880368 +2368376519 2368376535 +1389129466 4094807018 +2974233344 320162067 +3723662589 1450812898 +3231166294 2227766385 +3405655691 1720015288 +1463240286 2852373993 +2376216423 1565564726 +1214946823 114738454 +946009712 2830175152 +2930242954 2930242970 +1338436086 2683826378 +2780672697 2025738155 +1940720082 3949360531 +3981612695 805506992 +936283321 2468841256 +1882506301 3759205378 +204718634 1570238694 +1678301919 1492159745 +2417317012 1704207609 +3412719360 936367365 +3933131984 2273341756 +2828263047 3888598678 +1412570777 3983779663 +896836542 4284200589 +2920671441 3715989766 +1074489863 3640125705 +3183507760 3858679427 +2979798325 3452041852 +1638933180 742642279 +2752856669 2859956340 +1826108722 2321268147 +3326338430 2598520137 +3874443577 3763306270 +2765337287 1754603972 +2561284624 2776310357 +407490290 774948595 +2383768614 3518578647 +3659075233 4134668128 +93975409 1113209584 +280031110 4072939974 +272422058 2117063825 +1151966362 2969667179 +1401243420 2530144519 +129625352 833627019 +1072361094 1863049558 +1142237147 139312594 +3919368194 3285938979 +4134310513 4134310497 1307209376 +583367749 31629452 +3102655693 3974090404 +2396082625 2491658944 +1624301344 2295283571 +4181807481 3671277950 +3352687788 61913912 +3387966120 2369318507 +3329917495 2849701008 +3867196713 95012760 +144137679 1430826190 +329156929 596775254 +3555251892 2649820587 +856392362 85897613 +3013831569 4083958653 +1411837085 373717812 +3589409421 1493605348 +1287325325 1287325341 +877544603 4063625220 +3771495304 1775886091 +3474733163 1953288290 +3522981470 3999383039 +1415999686 3125716241 +1090584799 865361672 +4098878932 1842570415 +3506942808 3813705459 +2544532810 191052653 +1280911379 1129977324 +275076391 2975179561 +2594450685 2378235362 +2542963195 2528065060 +4004244755 3416667386 +2246550460 2275852529 +2652269401 910884126 +824540524 3419181948 4021204736 +3181444381 2708370612 +3756873104 54444011 +3531119252 3889911535 +2802063584 3413321893 +3525446888 4176339733 +2853549420 2335497345 +2131088096 3593139891 +798293465 3230375070 +61522248 231621707 +911198159 911198175 +3416478530 3558609123 +1489142003 807450208 +2787868833 3446046918 +2908057268 1630808841 +1303339770 1159253917 +1954668161 2471477680 +3653169327 3268462499 515239796 4077588431 +2776917816 3345906980 +1977536148 566178543 +1854009723 1854009707 +2481263489 1386066944 +2757783356 4291763057 +1064936048 1551545941 +3090846143 4039950379 +481650263 2291145456 +1318126298 3242521718 +2243076974 3217414858 +1619655212 1844918774 +2401766961 2366527280 +691159828 2278954163 +264879983 1234721710 +3406340879 2912465038 +2602202429 1187171552 +1299822434 3222595197 +2526609136 1360984139 +1134143358 4157849677 +4085988509 19950388 +3873079458 3078189090 +2464540173 2231862642 +3383556857 1055328168 +885615783 1219700759 +1094518847 1031036924 +2449275969 306256448 +365226389 3678261923 +4123820627 3934650285 +476317791 2059580264 +1039214706 2400445978 +387804829 5579060 +3831287359 3172511038 +1490975610 1614569757 +128436503 606179120 +916782815 501270428 +1559087003 3847305476 +3784275806 1926818038 +2165465751 3337696166 +788249871 3967265114 +656296804 4172328553 +1027827090 4211479592 +2422937489 21614461 +1050781653 1836790858 +1011356030 1668516191 +3325545436 549548167 +1764113946 2944129013 +2894514463 3073285086 +64724956 603677840 +1259191497 1708308517 +3421372796 2209109543 +1985099920 689538664 +961855359 3211359486 +3645520298 3117991565 +1637593726 3218134607 +1670197589 205826250 +4017272915 1150823098 +3318739898 542944733 +2775192323 2561935131 +3318760010 2966968955 +1706332718 613667371 +1612177274 3214200093 +1037072229 3022779386 +2396844408 1484892817 +2980246171 1048832530 +3084136855 4194963632 +3701507665 2712891792 +940725520 218026420 +4135933268 3271687276 +3226824487 3226824503 +1509631897 1063212510 +498597530 1434519376 +4161714608 1525158155 +1886036686 2323483701 +682733263 3736481752 +3737594708 126432559 +3381439753 1366582584 +3864918157 3619146799 +58069497 3371173762 +3347354574 3295466329 +1508385052 2758549265 +670262336 1130387519 +1672409071 1992843205 +2153427909 3553165068 +209255216 1002715148 +3428912426 3871848731 +683977035 2554214195 +1136369763 56458186 +628101307 2859095666 +3149698831 2564934798 +1213929757 340139920 +1211863853 3804803012 +1962224879 217431086 +1464598139 330180724 +2310715165 3991814836 +2596789905 967007814 +3278048511 1188025020 +2507818875 3042398610 +3057572882 4143214661 +177791682 1890383733 +3377682023 4017862813 +2967230825 3637426905 +498752675 1868551306 +890497966 840370014 +2597043180 2595804289 +2926764880 4178797483 +2413381095 2413381111 +2333596582 2848111030 3418503911 +624667102 2062313599 +1735316477 3497506626 +2113140151 4262186768 +1967965284 198781289 +1316730601 1975578830 +2673270370 2049679645 +3291634128 269745707 +1700996394 3306389773 +2818662373 1596585338 +1674879668 2780178743 +1599657018 1389762397 +1679144568 103694075 +3742914661 3742914677 +1190942380 1360771584 +3746780621 1563431346 +2654016994 3913642709 +1610985465 1768505707 +3610576748 2652995200 +376665187 3633835856 +2121386224 1296945756 +3120324675 189499772 +1521629056 3712425476 +2517377270 4172544325 +640492098 2017522990 +3434952534 2749242471 +3828029243 1792381426 +3941299670 2796191719 +3020777311 2709019127 +3433028831 4272468766 +2251204709 2251204725 +3910763841 875349334 +1810056464 3871717411 +2044899478 1977351217 +895301452 1304300727 +755581027 1217420234 +2930386668 3789243799 +229947787 511710658 +1731296173 535146834 +1509423134 3210450729 +3567411 3567395 +40575073 799275168 +3052284532 3656176783 +1994255560 724757872 +657310537 4127878126 +3728798135 310716393 +2857574728 1904541301 +2041492797 3406253844 +2557352840 2102744861 +1385385899 381235151 +2835073584 643436210 +1356669367 52171526 +3145937600 344089208 +451015901 783579106 +1840631021 1712584530 +1165582564 3575830988 1096146083 1511345402 3381144970 +595633936 4085710389 +519738384 3564573987 +4294519908 3928152153 +269227319 1074315036 +293101325 2373820772 +2259176602 2259176586 +123333826 2235207977 +1174766466 3165521315 +3476996853 617401964 +2859520679 4137393398 +3106786545 3819983077 1337570038 +2633478604 3857507361 +827539285 4211913436 4211913418 +2467759175 3560684502 +778891837 1384207874 +3464549876 147902223 +4040047930 4040047914 +1085931975 3768061081 +1978782153 1978782169 +1648134257 179977975 +766694756 1418062975 +1935661796 2212861183 2212861161 +2297280545 2939739126 +3040714040 1117926355 +649892459 1708818036 +3271750808 2510752589 +1493216011 292519357 +1962305376 2145696805 +105807186 1066354707 +2788941980 1279432081 +1970623024 3036880436 +536611678 1267170665 +2471019042 2728382269 +2792180733 4212039508 +3243584759 3243584743 +1218333896 422764253 +1859652739 18592316 4137258532 +4055517102 1407998510 +3149412807 1241707593 +1089607844 3313011400 +3344380028 366343719 +3142474621 1790382178 +3685349958 311753761 +1668024185 3673693631 +1705723579 3349174386 +1658413987 1658414003 +676538636 2263457271 +2771702507 4247259124 +2678041609 898354053 +4190182955 501999787 +1648759587 253922320 +608703988 2632926303 +1257049125 1175990243 +775430720 775430736 +2033556380 2673682000 +268999276 268999292 +3733018672 1973277571 +4129580864 3142486469 +330415787 2882479906 +4119782200 3354374459 +1931570381 2720358964 +2752366352 1370512931 +1948619913 239418104 +3555513349 3555513365 +2874404039 2731600836 +324643263 891697086 +2655951914 1606407693 +3207370092 3629563031 +2795544466 1054159001 +2817679890 1964221072 +1670096502 718736337 +2723060523 2898150562 +2342955866 272658373 +1142548905 3721057560 +681292855 681292839 +1734180920 4029732923 +484394129 75034703 +2192860636 88119953 +1266112689 114520183 +3385932379 406759258 +1665593159 3920491090 +936558536 2238053015 +564023129 713896149 +2716866046 3941768927 +1320782290 2097806534 +1716097340 1104126321 +4081450500 3368316782 +1475879893 1352689756 1352689738 +539260021 241390634 3495788045 +3171819080 3874352624 +1799595725 1085441147 +1854309355 3905006324 +3543173033 509972238 +2173494778 760705730 3939371147 +3214133517 3389654516 +3297240742 2114604113 +3142292774 2858438758 4261137111 +2967368545 2148525277 +1809237806 4083127794 +617855062 2839906026 +1133845671 1356041695 +786534336 2366982995 +1715974308 2799374911 +3506933528 652624603 +2156760407 3050668016 +799551927 1075550320 +1343599145 992442008 +2736206395 468303080 +3934679412 3430234300 +3665076865 1721487616 +1921739292 1836583441 +1368589642 2305190578 2305190565 +3913981612 4235715047 +3452328475 2793527240 +1445348051 1101230640 +3544379055 1096662392 +676824235 220617314 +2347875814 864940318 +1100163291 3440520750 +380694253 1877280219 +3259668132 3198807183 +1602783472 1408209365 +1042061703 1391675012 +2559839677 2559839661 +166290742 2998761080 +3172903880 2135452637 +3361961003 3816630351 +995622531 4001736764 +1130733009 3925307418 +2934078333 3414713794 +1316384541 2708531892 +968789211 968789195 3254238418 +1844881342 3645509641 +484720444 3075443569 +4186164342 1081794001 +4017567019 3452771180 +2568350579 1887544858 +258219652 589662107 +1751669040 2353292949 +468376689 468376673 +2689556801 2650151254 +3462582012 3784038055 +1298844316 1797053047 +1290041862 1223225425 +1103976103 1255282867 1027565792 +2763871917 2763871933 +1949357487 2548064888 +377983162 828953821 +3716001807 1402098764 +1601362207 1623968712 +4195246506 925576038 +721022536 4285674651 +1310973297 2820649472 +3378733178 1903216333 +3771356693 4085613322 +1277489900 3391777153 +561720213 1239784348 +3700213992 2488074004 429933885 +2054449350 3944439748 +1157233989 2764423606 +471035845 1772322489 +315914944 1762143 +338589102 1931690223 +1908993675 2857338050 +1802120716 3499532577 +3194965974 2422194870 +316026121 2955470126 +3074145397 3892948010 +3346353723 950675186 +2905059627 439701077 +1904642222 1690905081 +2031198565 4223734266 +1096326843 2575425636 +1200610052 2876622665 +2520088842 2525277285 +4276027896 2841118355 +4238155569 3696761382 +1452861160 1452861176 +38366056 958178691 +3175024810 4082076946 +915526623 3331360798 +1098017415 2757557465 +1076300819 276300268 +785674868 1652502860 +1946515685 2308788346 +2342705188 4116332713 +1327816502 2944036824 +970136916 2204742100 +1819887519 1642839880 +613219764 1039360601 +3991638852 3453539359 +428154629 831509708 +2794375597 755699968 +982383623 881049366 +3959506607 1928154848 +553868800 4165794309 +2894580793 2736862191 +2072111445 4051537139 +1069944794 1053488189 +4253178255 21158363 +3895277236 858594639 +2787896033 2015543328 +3759087761 3759087745 +542015162 1057659285 +442153835 3889498484 +1983678597 264870022 +4002674549 3631991416 +1237414841 1370945455 +3541919999 535554820 +3267648261 732341640 +2199608880 2484422037 +2508528027 2214854783 +847366084 888558255 +3344332130 3344332146 +2591318453 1513297422 +2432152090 1340956395 +1486727379 185256409 +3934433538 767338037 +4209827002 3168762059 +1755043067 2823833380 +1375461638 360922209 +2225671629 2736830898 +241437957 1749528874 +4208285509 2054001219 +1078544075 979437497 +4011376514 2960035454 +194572271 138412230 +530251081 530251097 +1120298477 189953028 +214704001 248235268 +4214081730 722667875 +1440116598 2526115527 +507921745 507921729 +782146551 1521452496 +2499025375 1531230750 +3751650401 2311105158 +327404068 440006052 +1586413019 3048529860 +3439327138 1492309013 +871259248 2187470689 +779431825 3011109200 +2306897820 2306897804 +2340439850 3304064781 +3545264061 1688200834 +264821954 2603844963 +2787568558 1027932911 +2810909130 916006086 +3666091538 301835070 +1278155915 2032791234 +302294996 827601593 +3922749245 1343390996 2637657353 +2115844856 2147734651 +417988662 1851675911 +2387447999 2815474531 +263657826 524088661 +3017093052 2678597479 +3665076879 1956374286 +3021349385 2599380661 +1430630275 3216198460 +522633800 1375983453 +2754161232 3167591395 +1013417654 3438874769 +94080296 4225709547 +1214167337 371030936 +3130191653 3662575418 +3206250450 2856990611 +2921041875 3898829114 +948049278 948049262 +883832332 4198438135 +4198438135 3897426128 +3751347246 736203887 +1563616857 1968756309 +3248157210 3773505277 +403598030 2897355353 +2603501035 886575330 +3525516216 2235867820 +4176954827 3091390100 +1070702373 3390824540 +1352275276 781158056 +2876608229 1880798749 +2242981717 3404563164 +3355484295 3355484311 +1912841611 113088980 +2619970249 2658275960 +2927303291 3037888296 +2490663730 3848964005 +2112113393 3443235734 +750563149 210276530 +4148819107 4185104182 +1379988844 374651522 +1809195422 1612114857 +2293893154 2293893170 +936088332 206817222 +903231062 372738417 +500472077 4269240811 +445522900 1577563455 +1104118148 497607369 +2387799807 2565309610 +3798137928 2849187147 +2980908684 1064167009 +415274696 3207421131 +2217319930 126070941 +2446422270 2327109577 +1107920850 3338719123 +47415549 1878265428 +753673921 3552546919 +3480231152 1638286940 2105380309 +665299783 3019022550 +2501267187 2770225292 +331763019 1556182648 +3140060998 101441414 +4058902475 2760932482 +2071966397 4110966782 +2288268875 1150289784 +143553809 1693348311 +767283339 2309573314 +1549478256 1986311794 +3021659419 2705985938 +4171057751 3063678694 +3045263921 3997764400 3997764390 +665982085 39210323 +469537774 469537790 +3875495722 1835797953 +1176439731 366963418 +1955432743 2714691702 +3740717407 3740717391 +4127557998 3099023407 +3896677113 474674888 +731377550 4140933452 +3709616486 841688438 +863038340 1502970555 +2834475687 187272356 +813234783 2393761999 +3110664699 572461893 +2723130430 3245090207 +668423450 1559713515 +116853004 1824155937 +2905725948 3913371047 +3340884964 1582114805 +1192355959 2980994303 +1199254984 1323897291 +3270340342 3519393095 +3005826124 3005826140 +876748929 3306760982 +1630974274 1259932387 +163118970 163118954 +586342986 3389653359 +1001555119 2835799918 +3849036446 3776963838 +3602261055 2018603606 +3406649182 123860610 +2327097456 3396452419 +1391849142 865113354 +2870551307 1670523458 +2992193794 3296810549 +4249573414 3818636225 +3102172020 2285997967 +992034141 1918081378 +823134489 2037306908 +3245684615 691165886 +675035570 675035554 +2780737406 112535522 +654703493 2338030524 +895429934 1207240789 +4060754668 4061014401 +3411039869 3810853730 +1492413144 3789212275 +94540221 208087243 +1447198517 4289609852 +821862665 649167150 +2146888885 649502954 +3239490730 2696832923 +4127704621 3741042041 +2224706813 3153316418 +3816209212 3063479746 +542924405 257375464 +3241537650 3180981773 +355684163 3109516582 +4134527812 908248095 +196476710 2508237022 +4290515938 912381674 1997753539 +3976469610 2272836315 +1478215108 2008568735 +1099010635 1235215719 +1096028231 508927936 +2276485337 2276485321 +2166585829 2166585845 +2036444162 34377470 +80846037 1794761546 +2165380419 1894021244 +2901035469 30551474 +213558733 3604152754 +3624853037 424970898 +573277319 3759309133 +952291417 1134623765 +25197604 1583485363 +3225265564 2813781835 +3986913265 156618854 +1539611862 1283646695 +2222511141 2712760499 +2067909039 3079700088 +665946992 2753928984 +2682348151 651034950 651034960 +1008149682 1248773171 +2809419810 3190209923 +314861285 1882061434 +3401622048 4286957307 +594108407 585239156 +124305430 2614747942 +3417087108 616195017 +2402326540 3632009271 +3252381117 3915458708 +3630362064 2793976363 +3240582785 2449065216 +43471967 4014418757 +64513693 3214362853 +175058901 1107840074 +1031287502 3008196633 +948662072 998249787 +1377442436 3273113033 +3798927966 3536671209 +949510925 1134977491 +1989630962 2722479603 +3291582044 3621992199 +1751715291 1751715275 +2229183304 3128525732 1462547995 +1565931793 1521583777 +2142404591 3859568428 4110378286 +1259898673 3638482973 +4138162141 1664897986 +1174533837 2021378487 +3932296388 514320312 +226325287 1669088864 +3864700678 1350587087 +3099197220 3099197236 +1237066351 2758870008 2691759532 +1123961560 1420274291 +2833686642 1427018597 +2682968466 1354006739 +1078049053 1148610740 +537231301 4189012476 +2852029288 61398187 +3082485096 2740775613 +1919219403 18555801 +237964777 1024648654 +2374568729 3887888478 +824397317 1603523020 +3938158759 1836810238 +447793218 2704478030 +2993366978 310366117 +1306806777 2539680510 +1721975369 3691075822 +2615911373 4031764786 +589066356 3116697231 +1362422732 2723099191 +1227681364 2243636793 +3038981606 3038981622 +2802029637 1047146543 +3223121492 3247124025 +2743304098 3288762539 +30438512 2749180381 +71822877 775189506 +3323299325 2916312688 +2777582247 1180976352 +408746013 416827115 +698684757 3823146204 +296855189 1873362058 +2974549761 464455318 +3523173823 1409323966 +3874859345 674463895 +3503868174 3544482067 +3196253529 1093155592 +4291253798 3435961815 +4074395816 4122579069 +4219471802 2760649181 +3145467141 691791578 +1985711204 3055419775 +2516520800 2156213299 +1662513679 229772696 +373474991 373475007 +3783194952 1122135133 +2419407773 2429337316 +1420013354 1739374363 +1248290885 3584335466 840666435 +1734987465 3777926551 +3165255102 2236505823 +1145051796 923146560 +1804558770 4133136772 +2972538065 1381602483 +1165528620 2475377472 +1461071117 2292899632 +3276982860 3344201121 +894253079 4287581222 +91123993 727541223 3584112608 1015694912 3822194379 1920275408 3777384592 2083434025 1065884973 +288368285 1882875889 +3876900968 767824829 +4176568155 1056513106 +1098206604 510979292 +2598407088 2138826261 +2851235134 3075327869 +3837304145 1604298384 +1261012019 2237340762 +788154499 1996498474 +529619664 2178020725 +1271067941 65111898 +3661184637 2948097935 +1396951011 4138969674 +30088579 946179440 +370420723 370420707 +6574879 3381688959 +4164007034 1936004654 +814178512 814178496 +2638913044 2960578927 +4184073135 1195338862 +1822673020 2178194215 +2859316185 2859316169 +2342934101 3523732218 +1048116000 2480879256 +4044858843 148216424 +1933822891 1933822907 +1166678981 1166678997 +4075378884 693550239 +2618318223 1019430926 +1890834990 2569041510 +2476435923 1442040328 +975696261 2206560246 +72294269 824939257 +1287944060 1430788135 +1608043043 1608043059 +2000535853 3812039131 +2300483665 740935568 +24685385 2583012344 +2236152589 1370301029 3739432306 +1893945413 4208417946 +3186789742 2748557102 +3772837433 991364030 +1904642234 1892236509 +4010838081 2550562378 +60587381 609845052 +646480498 451238259 +77289752 3965044272 3705946929 +3521942179 443209372 +3187662690 640372331 +1103820040 2592062347 +617505034 2918747251 +2390309384 1356225163 +1354846169 2128480541 4057797277 +808371291 882842436 +1079975015 945402980 +3393229052 1604598951 +2841781227 1798618639 +647261457 4059880096 +3035876662 298585105 +1649318600 2928725399 +2773433049 1044156840 +798066973 960694036 +3322939314 1583907883 +4003188635 4003188619 +3208042701 2875889189 +883131449 375989694 +2146336769 1497611292 +1326030191 2832623018 +3732870187 1829552052 +1216641802 848146605 +1841719201 1275412422 +2667391598 2667391614 +3379943715 2987835920 +2199848923 3447386006 +1939282116 3134979200 +769563304 1518373804 +582823666 2933624987 +1655416149 2838840522 +2200938786 2785493123 +2135225609 1653456174 +2984772747 2098192121 946479022 +673088222 4089748910 +2046171863 3580641382 +1502848440 3136860229 +3092469777 3092469761 +4255635769 2450299566 +619415350 1289857300 3459442041 +2369275562 4187438491 +755464806 707911170 +641960945 760564848 +3524523844 4184752159 +1902412304 2436415285 3512008828 +2781810873 3600737104 +858591465 3443955269 +1895437419 1152263284 2451792527 +3975995461 3453033048 +1872890336 2618657701 +3982656045 147513721 +3852783362 2222055477 +592608816 3403457923 +4112952179 1719084256 +2960872533 656785884 +1816920738 3317582190 497558805 +1159273166 279846778 +4127445116 3288412967 +3312930686 3312930670 +965573179 2802435410 +1908368314 3393846749 +1238088094 1399813418 +2556691225 2556691209 +3432562015 1936858248 +370574607 3564336792 +3457646354 2164066629 +1404558883 2737780103 +1429980034 2937374115 +3978321855 150387112 +3825930606 1802268719 +1048714982 1289135105 +2351330056 986776112 +1227140241 3048974416 +4272258914 1082623829 +4095046682 1472578813 +261233465 3154172606 +1761383353 1761383337 +2905089904 104207683 +3222940758 3207842673 +3161816164 284348777 +2264703586 2428848509 +2807940390 2661112513 +3496905462 335855953 +1740831429 485540890 +2830789637 2725776346 +1844379805 2889742114 +791609971 791609955 +1878547453 1090047828 +4265195786 1566348830 +2876756448 590373080 +1685593944 2165921677 +499273564 887287239 +1082818826 115343019 +3030737324 817431233 +123560661 1828885852 +2512268418 2512268434 +2257192243 4266012506 +698123507 2785846413 +1569020738 2062461173 +3552133618 3552133602 +185123886 2061174889 +82057570 353629525 +1595913052 451369425 +985988367 2450211569 +2133040469 2047913180 +3050641760 2587832364 +3109360799 1609528926 +3722062483 3513845114 +1120977230 2090880463 +1645754922 1811663967 +2852115305 112840263 +1149071121 3799373776 +1190598235 301478226 +4015631723 892075892 +1219204484 1403598447 +2361985818 3128719869 +1364282160 855202965 +1259977403 1258338687 +2466163289 3219532296 +1958950800 4283426703 +2531322536 4208389648 +252407058 3857449947 +1403449106 1380598039 +2418738749 3088619828 +1214547609 1536302370 1224989845 +614600881 1545619120 +1667378506 3765293746 +2454628017 336903510 +556872807 2809495094 +2015543329 1068790774 +976199874 2594791133 +1689122466 1052195173 +1035608659 2130970810 +287367896 3929699324 +4067466313 742189241 +3742513978 1672690781 +50101301 2561850689 +2855074561 1681544494 +3932105647 3426242360 +178846435 2869097308 +1056827276 1788128183 +1478723384 1869815733 +2680083936 1743945915 +2985090845 3820309762 +1088986806 3828471953 +1816861803 3846028404 +3174852928 639217605 +4169378262 2897069930 +414645332 1007630383 +1330020717 956153476 +3731250073 1876197480 +2445298452 1833981764 +583306514 3446281029 +3513021845 908401052 +252027104 2389322799 +3290485063 4184239134 +2652535226 4182932702 +1035337850 1922106750 +12785021 1644600146 +1375315393 3439324886 +989328937 989328953 4250436248 +984880377 1652360168 +589703674 3799536050 +692479852 1708445441 +3863153020 3757833571 +2920841103 2677067278 +503146986 535673677 +1015340291 1389893872 +1319978311 566496960 +2835302121 2835302137 +2230357061 2064409194 +1426778680 405714491 +2602660038 4221863863 +3318402703 3980602126 +2100192984 1471882867 +1129639734 884249095 +1571483549 286733346 +1117335631 1770174178 +2977230046 957407593 +1976754641 1274641424 +1972751099 365857074 +486585846 2749955297 +4061852876 3405717426 +444975203 3894698832 +1520713004 1149361664 +1899955073 3341976598 +857430639 3809434808 2062332998 +4004187450 1885806230 +1401545800 3390201181 +3692737340 1272321767 +3390450456 954586843 +364058275 245415594 +689558008 3441402496 +763573332 673608974 +343173209 3677038677 +4090546218 4222294541 +3126617676 2876574113 +277345885 1223054914 +3375897964 794186007 +3457694164 3457694148 +3978390555 1721577106 +3806333068 2819503287 +3467451201 595537009 +1108504305 2303745921 +1113853043 4135557402 +1535809563 908948109 +3657558744 151302683 +1563513343 1563513327 +1415496799 1714540392 +1000457599 1736461249 +1052337499 416976452 +372282805 2742791146 +2150034045 2544348896 +316944245 842446140 +991326139 3209814898 +477671884 957090716 +1181163328 341193171 +2789594226 2789594210 +762300667 2180604708 +438170108 1757141636 +1384139851 3096513912 +2664896120 2224578299 +4042593156 1412451202 678934930 4239826749 3748381454 2893336003 +2266697583 513362872 +1507348780 2609367127 +3102655705 1888157451 +3127797850 3318623341 +1875315234 2567441705 +3579375585 814590029 +3318761159 769616732 +1166117497 3823959144 +3189920019 1661313274 +3730574726 2431207934 +84118082 647144931 +4205728966 1718580151 +3990979484 369241735 +1541383539 336688154 +1466622184 13948693 +924650162 2396826534 +2695327072 3465258043 +3001273558 3603092327 +3488172448 3422911099 +2311363383 378047697 +3639399180 2295348193 +3365479632 2568287075 +3310758699 3132258163 +1713713035 1713713051 +3113432737 3284074358 +1815570572 3879310433 +74161039 2692414785 +252454962 3793962661 +79402310 594154938 +2042784009 3054197048 +3335458184 490587568 +1184711776 2308088627 +3156483661 4146629160 +927154808 238253255 +3378351865 1507253328 +2307204863 4281367740 +2126662811 879316552 +3491157279 3002171336 +2329576832 3128156344 +3399686236 3993964539 +3453871426 3267917643 +1179243798 936223860 +1836389198 934766762 +457422248 2476144491 +3875442993 3343235117 3625800972 +660268334 354611826 +3434524473 2090194622 +1511750958 769096306 +1663132489 913066276 +2578075832 479520078 +1594436088 1594436072 +1556217895 744897910 +2548118072 1455182035 +1239559959 1712333113 +3521072120 1518638957 1518638971 +1209392580 1047272329 +2018461177 2764988894 +4194562889 3711433710 +3661950984 2302960764 +1373800672 3245851819 +1916637359 929134749 +3008453073 231568758 +1048274182 181219117 +2925461897 667217902 +2368386772 2571683072 +411460607 2593090174 +2256655717 2931597450 +3197254393 1158076546 +3279232022 3344643751 +1845271586 3225958698 1185532291 +3526317085 1204632299 +3651484992 58107675 +1335912122 327268061 +1597834306 26362174 +1511886605 3918016882 +3240870739 1793358778 +3391485388 96596023 +1910169452 3306624663 +3915774301 258183490 +3853147965 3358846210 +3061999654 2171266665 1967780830 +1830757585 1476525504 552126633 3282442869 +2972824329 4198291246 +468559780 2602493728 +3957830421 2961863686 +953344049 953344033 +3034828792 3131073403 +3805121501 3868404962 +992020432 1658860886 720540871 +3928079270 1548840388 +2319361709 1302356562 +3129785145 3834297000 +2999912462 2999912478 +1560591103 1560591087 +1426108617 2437942111 +686389334 3179835239 +2129503315 1050976780 +3323995327 2164254816 +3132385563 3132385547 +3237182961 2957984367 +2982693630 2917127689 +197454703 4127104952 +1905695637 2903820844 +3694767988 584004505 +1990832463 471998296 +3241165682 3620648136 +393519938 782041315 1143498058 +3399327160 2921285819 +3947178904 1161675872 4125335629 +703331840 4269857299 +68840663 2036721571 +395848930 2646419419 +3145137764 1080465699 +3322064354 1383579587 +3297507868 1808984272 +2611524406 2902803735 +3754899130 289195241 +4083269056 1745116045 +2867622683 758723474 +2380742158 1896263705 +258762820 2343052041 +3052149569 1005333339 +1056882071 1608302832 +941934801 854073616 +3676446023 3677677501 +1487273860 290536649 +42628881 2737375191 +3108730971 214857540 +992320855 1562811475 +2691387580 1156585447 +604527000 172963621 +1742327176 1742327192 +3852540541 4187796162 +64931425 2024950432 +703750706 982553765 +1229294093 929683384 +490913026 303008291 +2104537796 2733815224 +4232305428 852615279 +896427858 3579369726 +1372338888 2357233885 +1640670168 1640670152 +3321578928 2812642136 +3482747003 1156334002 +3613559667 2208170687 2212727016 499085531 +1334897380 631589028 +3798788243 1120664966 +2067141622 2910253396 +3341000688 1830078165 +78100844 3118999014 +4162648351 3030133704 +81795974 3009488378 +326496169 367007487 +1942047811 640039462 +998179497 212772366 +2380167309 3795305970 +149488318 3301921055 +1565804874 900685691 +1196605515 2453976596 +3351332472 3980521211 +3811613420 2441339287 +1868445661 777122018 +2141506868 611256537 +3586016217 1401212575 +2325218745 3481700232 +4006473371 2301533700 +2693960925 2747291636 +1237346266 1472138044 +1269918430 1668194989 +1248647671 3211990115 +1168752625 2604214384 +332458605 2665548178 +2981273366 3526389671 +427761407 484914364 +3026425598 42321018 +802654888 4165944957 +1233825243 2689576914 +219875877 3331389498 +3392850561 3683436800 +1980922219 1980922235 +1835312633 383687140 +2997420866 2997420882 +3130752209 2479193350 +1718581331 2874460374 +2341452782 2705643449 +2123257205 1383822473 +878640434 2743637413 +1165172577 3040503200 +3142598225 2464950167 +3108489429 2164336476 +383740064 2712777715 +1271051588 2273532447 +1372563259 1187247312 +40971520 136151257 +1757504478 1757504462 +4014429848 1162695003 +2216938413 2975441234 +426298196 1408767279 +2435779656 3574617437 +3385260162 3394716685 +3480133982 1487216799 +1906099854 1741459865 +3700648575 3138430440 +3165939739 493785105 +4121766160 12025707 +989658062 2856346959 +2642927866 954623445 +3875248424 3323075051 +4160072382 364628233 +1715703355 83065064 +1298576758 2567703844 +2843341934 956025139 +1707553856 2023178451 +2094576152 2703252429 +3706138779 707972108 +2176015305 2176015321 +2770213093 3546361978 +2275075709 4124628692 +1605479133 2175793634 +327598209 1042352896 +681592060 4187250352 +2191470083 69351204 +923950526 1877578249 +1254729905 1819578032 +2951029702 2880917687 +1483502095 1483502111 +1062929039 1262814990 +3770885423 1864408684 +3498203246 2759240385 2872128806 +3169727870 657327262 3908973919 +473529467 920432958 +2947163099 1674998226 +363864695 1101956953 +1514996381 3292208436 +3412719379 4257838451 +433753845 2819558314 +1208239991 3585900614 +3126627796 4222572718 +382797378 755816931 +1712770806 1712770790 +1687630838 1342622791 +841815535 841815551 +1521245388 2304120097 +2635279774 3811626921 +3879186843 2544670482 +2143477022 2005468457 +3839469616 218636171 +2720593106 410609299 +4188631102 2244085224 +4265298456 1331012557 +2219723134 3309154655 +3224961233 1790724368 +1185735297 1323066790 +368345603 4098142995 +302285197 3927437540 +2932743071 2932743055 +4069162208 2952959155 +758352652 4118788897 +4252290984 3664724135 +3211115713 237511616 +3036107517 1173853173 3730285634 +2494145453 3020728644 +2563145720 391558276 2021356397 +2527215491 2758409002 +3437411313 3437411297 +2173753101 67275122 +4261746143 2165354166 +260032166 1918867365 +1403607477 1754806250 +808890890 4028253613 +2301476959 1376114078 +1196262156 1258638327 +1288349181 3758312770 +2684610223 2502174062 +1583950422 4119700839 +3120561541 4242167228 +2802808580 22567775 +3324374508 1170807796 +3150195296 4123964709 +497413127 478508787 +2148611833 2148611817 +1734091432 2266519056 +3653914818 3119386055 +3650644043 1275492173 +4132171814 3202589543 +3827168566 3398522646 +2683216771 248742768 +3213756206 3130346863 +3024740437 625747420 +511332215 1904941126 +890175837 3818857826 +3348946493 2029115924 +1839933135 2387577114 +3620782689 513932982 +2184765370 3112710621 +467807204 3372947433 +2429882201 1613641520 +3837861578 1390330017 +1944629436 1944629420 +723924957 723924941 +4051108866 542854965 +1826950534 235539450 +3270076419 3631135932 +4278967541 2449525971 +2674841033 4111439477 +1446363202 4171081717 +3861380364 1559452129 +2695345851 2734991460 +663012110 1140789007 +766258721 118267360 +697258454 546307540 +2323700345 2178411646 +2819781479 1474383753 +778343420 1064230828 +1075800515 3027467772 +2076083500 468947543 +2765183210 1603205211 +3312400298 3307985856 +1621203312 2101827275 +342632788 419205945 +3887067556 2680686628 +3904059503 3225748411 +3213598505 3920826714 +1675359470 558011065 +983627470 1212116569 +388565017 3605151998 +1720521993 2305303612 +2158671430 2776879921 +2361003040 995506879 +3690096230 3017268113 +3641568123 736735908 +3194485277 1014488299 +2295060744 1625728907 +1595883738 2553485117 +2004878322 277231077 +3397620381 3397620365 +3231085902 892948687 +3421312202 3493313019 +2039594618 2039594602 +2334951977 2087598478 +2961716115 2358721024 +1658597173 3001451497 +3973363279 836442014 +1828994079 3433131304 +2186314109 1555342964 +1959426013 3082465524 +3494033455 1366964890 +1792818108 1124484111 3742773214 +1684130210 2817550869 +3334948628 4290045039 +3179188058 2822482621 +3814286622 62533183 +188445942 1678523607 +1412232969 3857145887 +2200234217 1545250510 +3303427341 105366642 +1313676398 981996520 +2240770211 3821949084 +2552802755 1258916330 +2502479252 803001576 +627853631 678907454 +863475585 1865594176 +3546209281 3351427878 +2701085536 2701085552 +1684443246 2227284669 +8907846 2800600162 +3067227951 4225779448 +1037006995 3367156183 +4130882242 1553012579 +2435785069 1847369682 +1442080343 1873899024 +2539859027 141738176 +2242966448 630169091 +977728996 2712999401 +2977872074 3871139375 +3626192465 4042377981 +799775513 1688011880 +2145013948 24948839 +3604958976 1099521299 +1115676003 2780364870 +3750860482 3023065973 +1627119416 2736604224 +1521284420 38148639 +686417076 473106255 +3620948044 228249527 +3035506909 2951369716 +1944421240 3930977787 +3868473798 3243700897 2079668504 +230655210 2390637659 +1954545253 3397220602 +4260260942 206864079 +732561559 732561543 +3362235652 1982763503 +1733950562 346574421 +1106772259 4234791434 +1387596782 2764920953 +1050896231 2227680287 +888928905 2801788575 +1265093594 1433172917 +4140277652 2383738600 +4113155697 2525085331 +3701129126 3188772770 +2320016095 2955348892 +3953115072 3395759515 +2558583360 1390684869 +794149230 33528137 794149246 +3712519326 4147469503 +2612319580 2762615471 +2571301414 1478983779 +2637825655 3788466135 +1481386315 1256521986 +861042456 899411768 +2975891462 2193551856 +4142266902 3255349415 +437308201 829411736 +2488466514 1400864360 +1294119625 2901259405 3601637727 1795236654 +3484132801 2889215680 +3165276502 3165276486 +1496800221 1327865067 +4184179041 4224363446 +292752609 2733764537 +4073705831 2753996064 +4172969373 3666898659 +438967507 1537762646 +4215738325 1709042780 +574286467 1707027498 +1223259171 3934376714 +4206872220 2929112629 +1583730360 1085319371 +1889130038 3664376133 +3427458644 3990617647 +1928385614 730875865 +3549459556 1535074383 +3056130984 1783744893 +3641125697 3641125713 +2096142275 1908336636 +1714825010 423605157 +2495576377 3640333359 +613066270 2755887401 +1775134406 327216943 +2345294507 3129785122 +947873263 598912315 +4058073268 2543373273 +1418385062 3163547457 +925989672 2266857812 +2653331351 2379037360 +3359762656 532781235 +186479527 1149238706 +3733162424 17943725 +318527260 4282196231 +2950838874 992074667 +32710432 834273139 +54297710 4230618554 +406738871 3777238288 +590912516 1981651551 +3446408882 319719987 +2631854635 501916066 +3490121114 353227133 +782898999 2453784215 +2502692182 710475377 +2564778515 3132357626 +851751510 851751494 +3672516975 122894776 +1127892254 658956308 +1862684571 2866847241 +1960758552 1213173863 +3940303109 3183106778 +3041129825 3137030070 +3154650335 1604803996 2322488545 +1504523649 2921276071 +1414813558 918924999 +4135222581 1682068881 +1031785049 690719262 +4036333306 3044021149 +2227433293 948917427 +4212859161 1689590344 +3088794661 4159456826 +3208906019 480169479 +293439336 4036765885 +4014618924 2993775796 +3435639240 643620299 +1570232234 1162591622 +3068177880 2456225785 +778535164 3269720752 +1296133686 3284662294 +1260344975 3512025880 +2338236364 839001633 +3551019825 3646458413 +748689562 3657874027 +2689395393 437620182 +468935673 1651581158 +393198784 3611815007 +1914210989 262593153 +225905693 1332220340 +1181014652 1287909671 +1704168428 612402808 +417892774 953675623 +871841899 3299157807 +2019603150 1312389711 +3557445939 4282241868 +101725800 4085622205 +1815581304 3632810771 +2267455233 2410827189 +648546751 2575783870 +1727821604 1435211790 +760591350 1407863889 1742085827 +3036043764 3553598223 +1805184763 1556100388 +4267923616 1325685771 +2103745990 727998113 +461747155 645535020 +3621012687 2452115918 +126238357 126238341 +1256182579 291076442 +796209442 3615250563 +2091744685 2838698011 +1476622004 2149653882 +3628091569 506621606 +1702659258 2579959701 +3312635596 2679868200 +4098478094 2654111257 +2243364353 1407970132 +273484550 1690423418 +4204272801 1749712080 +1035578458 569158670 +1715176498 565254835 +3551154501 2048782220 +1421873896 1381876541 +2685678505 2832028440 +1170592874 1134954918 +3639313899 1707331810 +1386861574 660129121 +3356384550 3313333762 +2955345996 465261153 +1854627451 2154150829 +2987403675 4046125089 +711241483 2732990254 +1471209693 3446637781 3899784162 +1555850218 3868281179 +482939439 2139594744 +2735391764 2114187135 +984545774 2156839856 +3288537044 1692304047 +3572057628 1194941969 +2615055143 2254546528 +3467156848 4262460107 +3808139647 3507659518 +3021294497 1493745627 +1179500864 3966187475 +4051276300 3412165404 +3951520401 2290540119 +1512928924 3110336839 +2421775530 3173253394 3870089115 +2186720169 3615281934 +1730695848 557711043 +590455313 3820591030 +1871432004 3977113391 +868074738 462755469 +970682820 3631486879 +2779960190 1451421535 2401161886 +2984194063 291022734 +1307333949 3892981506 +3040814341 1466386138 +2218655454 3481748638 2349331807 +3363926349 4039466034 +2831539298 293203541 +433477387 3077244500 +2917659932 3760642823 +254239285 268409194 +1290582219 1392737555 3246253293 +1730480398 2544964882 +383768693 1873273744 +2917234841 1391515870 1391515848 +3830335737 1614602238 +3935255180 1835124308 3083099100 +3401990144 4041944372 +4065105070 3802132271 +2043533451 1689654200 +2916490494 2786042838 +5362510 3469714393 +3292020931 3027595219 +2829943955 472363898 +2840205008 3751385721 +3906160262 177734881 +1987468627 3478448570 +2745952765 2762037588 +142866944 1740803603 +2176302731 3208705218 +3761476528 3588848395 +227244807 3376304729 +2178542759 286231264 +1788877041 3406250864 +31910819 3762837648 +4254147803 108856516 +1398851040 3257454388 +524298451 83903546 +1262382582 1766267473 +254356125 2020297438 +515709347 112155548 571291271 +1483039464 3594184912 +1220354237 969984927 +3024890227 1189429260 +3635070510 1733053253 +2457742646 3533777937 +5192651 1203445890 +4074165638 3459391991 +1003942854 1273126929 +3949683576 302880237 +1818702231 1032167989 +4057107330 4057676414 974984265 +133658228 3767858558 3708041376 1982069464 +3075401527 3170567075 3358981008 +1542004616 939303691 +1778758446 351867247 +2993555349 2016800651 +2476485679 2379845112 +3455978191 652845053 2566081989 +3589623042 3542628917 +599002226 2792331109 +3134718805 1997356764 +2122369023 599447166 +3495188492 13015799 +916740341 4189587900 +3512291738 1122617687 +1071697666 2430984227 +4100198729 42415608 +2992556855 2284748874 2872308845 +1659983257 1525268424 +2912682900 3768164847 +1766279462 3778553559 +3799088117 2683037584 +3234578707 2478895340 +2478895340 2226865025 +1535755519 1535755503 +1098062096 405828643 +1270476297 1051834414 +1917972845 1677659780 +2179023618 2310751224 +2395650755 1394006141 +158121240 158121224 +2035977408 3381367365 +3193751889 4245744262 +245701042 1280989517 +3261825495 3862783344 +129754197 2177397212 +4262896187 168733928 +1032716511 40278411 +498490055 2444864430 +2867756425 2658115256 +2221289536 3342414039 +1321267678 3619471465 +2287024850 1152562016 +1220508412 1451830611 +2850747803 400597778 +2403032156 1930741732 +2757051562 1547376539 +3249331575 1512088134 +217470219 1925701716 +385225863 2869437550 +1058394758 3579472119 +1944176931 3904647687 +4197912309 1201566419 +39287083 3892325359 +1553891804 2195554275 +1373369793 1373369809 +338749803 872379252 +816390749 4148238434 +2780365954 1682053290 1682053283 +1756710584 947763539 +1958049283 3165177514 +4045696459 1733875330 +2240433813 3091774084 +1792036480 2783679379 +3222538256 1871229219 +1299869162 3787130715 +227338696 409705836 +1177379627 1955818568 +3325553353 3540425336 +3658243096 1500838363 +3872573693 1144457224 +2233341732 1940300057 +3753717298 1758443685 +2392804350 1526256504 +3702253026 1597738354 +1025077253 1177493273 +1234133817 1854054959 +3208542735 2203947147 +2624375061 3110459129 +4292665003 64383343 +2137786405 3155218988 +2128813164 2128813180 +1069524004 3587948213 +2556574871 2040881584 +454026243 2634281130 +1533297177 2161183464 +1417545883 3456199262 +2532599940 3390423407 +2026799430 1930789182 1759147145 +3453126312 760654294 +1373382373 4216927424 +1653187967 592535356 +2474965583 2322745484 +4178816041 4201589657 +3805561589 266481804 +3891890729 1456766616 +4150962263 2225502659 +1625477609 1625477625 +754041902 4002927737 +1878960027 3907115282 +312960014 2282797242 +1389244924 1452847025 +2206699215 360664061 +175469787 1374090450 +1385610081 1682504118 +255665859 3225683189 +1750498711 3609703600 +3089388805 3862025946 +2399528859 250977010 +1512668843 2771785075 +2843561211 3409981220 +3740139895 1739345488 +2459950307 3030956373 +333587009 2382097494 +951130752 951130768 +2309346534 2517509655 +2879091427 306729415 +667105424 676465333 +3524045728 1295821932 +2165992582 3264796407 +3637825345 2550285142 +624328759 2535024911 +1821259565 283171794 +3759146763 3292206676 +1483989242 946547101 +1633159543 3029788230 +264394848 787554099 +574974946 3360212525 +3151910096 2399109987 +2206139519 141735605 +4131808843 2167781240 +1411399820 4207254625 +3545530230 2052229974 +685201060 2564153807 2234602893 +45725958 1348355169 +4151344143 230920320 1207294882 +2805233671 1050211081 +3609997021 1982759618 +1961704794 1802998973 +957276557 3989895867 +1167217219 3361177468 +3240767796 349092637 +745098159 3820101437 +3337709695 2272917725 +4108714794 622786557 212020637 2175690307 849871768 3733924710 3559754687 2137941203 +635903664 315325963 +1894757684 1051711329 +4270147188 2854562015 +2864374831 1786474269 +429996990 169219273 +2477550406 4234371985 +502475322 1607170397 407892245 +1322971282 3030955475 +1553677512 3194826700 +3380195858 2934610093 +2660102846 1467293961 +1454586903 322775122 +1377137435 3470596296 +1157845826 2693974094 +1087614025 488137115 +3810626785 1859175990 +1416145674 3811352970 +448758472 3816480971 +655626649 1943021161 496481246 +3008898913 3032874422 +834851852 3138305812 +4029873363 4081319980 +1933835470 2817223210 +3787504297 4283637272 +846976630 890529724 +3736859993 4209195784 +1784755115 570709538 +1551105935 3455576592 +4169178065 3530442784 +3662657308 3662657292 +2268471462 839815907 +4246935433 279834514 +2387159154 1865067365 +3338463587 2897931335 +3030296981 3938776458 +455497544 89876061 +4147557657 2904845768 +2639063098 2494226197 +3746557213 2815575220 +3101687744 2133788101 +566489964 2474128151 +1537368882 675577563 +2291024452 1005736192 +123735987 1329116890 +685768237 2241667268 +3185517384 4220196919 +3414928695 3414928679 +2816634790 4017472065 +2855371782 4048307066 +289022820 2189801087 +1630726635 2934005288 +2823791402 3189103590 +2968017524 877681887 +1936111905 2761796934 +965655679 447921128 +1226115633 1025444656 +22156087 178410154 +2821766886 2864481281 +1332467890 4174010790 +38398656 2226180251 +2063444086 775838807 +3122658711 2539402416 +2155713179 3046442056 +2111848932 201832959 +3529692458 1536528667 +4128212034 174596536 +2989448229 2777550394 +2938575895 1318371783 +3056871587 2179906602 +833281613 4137672206 +386541521 2730881910 +370935328 3994920051 +2883381705 1438910318 +2532600615 10387763 +2877381383 60967936 +2473064029 1772672098 +4034609274 398189142 +70024232 3121050365 +1527954321 4017964358 +1759275902 3806280674 +4276834516 544226735 +3365152406 3158086164 +2179164091 872172402 +297279067 3299989022 +47736748 47736764 +2677528879 1795876081 +919031025 3301865801 +3616406010 525379285 +4285829653 964818698 +445376088 3691690656 +685752958 2796469645 +3649362672 3250075378 +178126297 2411109534 +278427437 1292082130 +3471416685 650302084 +1146553350 682949026 +1534442069 2881480429 1534442053 +4074827839 2535076648 +75020284 101294520 +2939863393 981363638 +580923659 2751439645 +2515253624 2048194555 +1529114190 516914898 +1138458543 347695057 +972961662 3375455049 +3159075620 1964761252 +4169295242 3209025595 +152651816 1293004867 +4071204815 3490917070 +1130101593 1657580808 +2079871307 4146928238 +4255368447 1204755838 +1421118898 3740029945 +795677095 1450429363 +3088295741 66077954 +1092994787 1903695708 +3106388180 3322401343 +1666953881 39462600 +2114771214 2084155663 +2589267861 2956122547 +3437818544 850784755 +2814550137 1697518075 +868708021 4260930124 +2715208646 3200382983 +352715529 352715545 +498315895 954331472 +3996923418 2913898467 +1917534390 1210076801 +1381380945 1232186102 +2446821158 2446821174 +376538420 537654100 +2759834807 2887128070 +1203502870 1188568469 +434387558 675802775 +824697339 4183198355 +883670444 2522584535 +3241088095 2082279838 +3314584620 780970327 +2941569436 2658754705 +2313889582 1261350255 +280889234 632334907 +232673569 3120730484 +585755387 4047300914 +2111370313 1703448302 +2717327545 2970125096 +1076675151 1433789006 +1919848004 1745483039 +159217131 2087213151 +670153816 1099066528 +3919180267 4282665556 2824328445 +1124885592 3833722523 +361483987 3189151276 +1187636194 1372699861 +305159095 2814528562 +1788384678 1949537367 1144161510 +2600391827 2452136826 +4106638257 87408550 +2988157411 1150054474 +618651742 618651726 +3799224189 4176142786 +1780303999 2333679614 +2061260025 1475363738 +1156968439 1455324355 +957210592 2966908339 +3137138653 3838290901 959289570 +2280270322 2280270306 +4203145693 1063397108 +3881490313 1769331347 +2917777227 301474562 +3166281948 3313749393 +3154083066 3979459997 +1729092893 1526273204 +1495457182 1495457166 +4025812838 616211841 +2310723390 253810313 +652954859 753393056 +1859827403 1296941460 +3288958699 2248106996 +1147890898 2266779269 +3088939849 2874597087 1617584046 +3840160801 4088602704 +2751128826 502691229 +1336191020 2352266561 +2291127046 4171384585 +262520916 751494784 +1840361608 918087197 +779723432 3514502763 +2159780744 794980125 +2814404747 2665779924 +3532768429 131994898 +4074621873 69707686 +4124080711 1043365312 +2159069254 3695920673 +1949959078 2639511105 +1678319219 3982159628 +2933985732 2933985748 +445096619 796736207 +19178753 3450847382 +3638318162 3034103045 +2627847663 2175440686 +494200309 1409679548 +639470426 1518493355 +903419030 4228183393 +996116450 1499654339 +997326981 427217228 +3659653655 2052516390 +2884623396 2884623412 +3675239298 1946517023 +1206274857 1485328782 +2401099195 1868633192 +807175734 3447071204 +1609941701 1343717216 +2264154483 143851482 +665299778 2935134435 +1879462371 1315162320 +2543983001 1957812472 +846645606 3607038849 +2913920816 3541733192 +917550235 3006025732 +1635786796 245793212 +694889939 112796453 +254256655 1988968742 +759462011 1752567103 +202279743 2436304984 +2858124934 3400807409 1941049553 +2736391506 2233800137 +582911001 3404329822 +3470874087 2478455478 +3043574364 4038293201 +2107405093 3796452154 +1611684556 949126100 +2520517423 2944768750 +118013411 741778976 3324604803 436622508 +1037993868 3235310300 +3501180967 2999559716 +3695746639 3872951450 +1030535255 2188471075 +3454491959 1513602438 +3545108851 389806816 +1477516073 1477516089 +124475430 3556492225 +1710062844 2884332011 2306455051 +564381719 2644285160 +4126346307 1889291626 +2211982590 2337199049 +1863513137 420092108 +2291759345 4204356464 +2287002627 3000825840 +3039822833 731264112 +607297545 2451174008 +3561106334 3783376762 +2446553149 827054155 +179513084 179513068 +2600402151 3865583520 +1174766471 3249409430 +621604091 2050151870 +790705243 2353359698 +2773682699 1287180098 +133490454 280972257 +43201949 3928475522 +2557993635 2557993651 +461881954 185952618 +3813001983 3319697278 3813001967 +3333365834 612792943 +337956116 3387872889 +3782781476 351524521 +4223760626 1133602021 +2578624445 2974459522 +1322551006 4136652649 +2322486568 330305003 +1325163332 1918788681 +659025147 3510243122 +2112802322 1357801043 +4260567274 2947561549 +3115232015 1559709838 +1119550653 2258485698 3378240907 +4133081111 3865220144 +3621786909 3833367594 +2888098613 4286813284 +2447811195 175774397 +1201298409 2701045710 +2143506146 2708933099 +2608431942 485637009 +3277836876 3688369591 +766189533 3244501236 +3542091029 1885863946 +876587843 2201655914 +3995927065 492094149 +1052434472 1052434488 +2988564081 3696307174 +1539490704 60414883 +2695786262 144236465 +905432975 195836287 +3468003708 3821497895 +1790812240 2359041810 +4263931279 3872726690 +3253933826 3769591145 +2177435581 209137300 +3320822222 3121837704 +1261190192 148259224 +4267659054 2651432313 +2994818813 4270807106 +2850334218 2096193965 +3165993440 3165993456 +1037188210 3287623525 +1079738081 822656063 +949173666 2982807061 +739248238 544467193 +4068263109 2910621418 +155949061 2801815500 +4103235748 1566571208 +2691465702 1892711703 +781496737 4119286332 +2640248930 512596547 +1654184964 1243990216 +3361548137 1478011967 +4116215294 1853847817 +2366293869 1962406034 +91405908 3886128687 +3716403444 1448284913 +3455779807 556210206 +2370106433 3732171437 +470657236 4253074863 +2420379430 1651399281 +1946543010 891915453 +3978713775 3216722875 +258615688 263302932 +4241781477 3882933868 +1431846485 495976416 +2743990912 4169226117 +2841056747 2112590261 +1404156450 2212333373 +2145001422 2145001438 +3840645350 1155641857 +3647486012 2064680551 +669331441 3200940144 +2580241091 2821663910 +261152637 4262449620 +3518953556 2208361519 +3106489351 2197165846 +3273482045 1681714452 +3875860906 948313605 +3934455986 2340044830 +713411242 2594048397 +1659151303 1961742912 +3884971898 1539471201 +401409546 3022029243 +619307696 3425688323 +3268637296 584918613 +1496765778 1496765762 +75429451 1591588884 +1032760280 3363973243 +3831954234 3357375581 +211774812 989407185 +4252315654 91920737 +580045581 2048238962 +4197976874 2917422054 +3339842673 3527658982 +865675575 865675559 +852960855 2486314946 +3902115511 3664751110 +480907258 1831374063 +2404268084 3424811471 +2969885573 1364102675 +2703568753 512339695 +1594871933 2966556002 +420168583 4089138560 +2008381427 1705759628 +3424524944 2871102716 +3302261313 461966422 +2759353391 411416056 +3234608096 58449695 +1604200057 3492111221 534483260 +3973441507 2567196368 +1967641378 3255918229 +2448443610 2448443594 +704241372 2926132112 +2934841196 3778866727 2061109628 +3979459975 3964492694 +2275896992 747841011 +1343967871 1518556202 +529049354 2108894285 +2741576206 1283496985 +2028054648 3835669123 +2084472799 3877894282 +1558443700 1601827593 +364423448 1236414669 +1342571738 2741621026 +2483915766 122901575 +2712051356 357281671 +2897562640 4050042147 +1566497339 928090866 +3409561115 691202960 +1495019872 2808199731 +1192802108 1139653351 +2046053530 2188229068 +1923625265 2948952112 +4092735670 194898698 +385398016 696577811 +2629784107 3962460578 +3338606229 761663401 +872927515 3088164552 +1755231681 1926766272 +3494903465 2532172824 +3942627002 2861344459 +3235166738 2699094611 +834515933 1593217048 +2409861416 2807883320 +3947723791 4141371336 +936614395 3709560356 +2040351770 2359217405 +2795783437 235524479 358775908 +3446596862 1670544342 +965606029 662793188 +1821112485 2237164474 +3941616931 1504828061 +3569996008 1266436234 4071092553 +44896946 575240781 +238722435 3913676064 +2878345131 3200821812 +1535929782 208980490 +1240993215 813540286 +888560393 1758547758 +927063504 2925077035 +965551033 1378827326 +3632177893 937852949 +1595187250 3749195429 +837355457 647741435 +3547786063 859073880 +642445137 2566306960 +725287028 257061577 +1526831483 3196361892 +2799445430 1653562769 +3005836540 104239281 +2336964433 2557783184 +4187535533 1258305362 +1711653772 665894854 +3194874609 468597654 +3524405417 1536557582 +3025429472 3235461555 +4026051625 1616653198 +487698572 755144971 +3112475646 3112475630 +1045277498 2162743829 +432230013 192188116 +581718752 1122813371 +675442367 675442351 +878878043 4046762047 +1663780750 2871108761 +3505631432 3080669899 +3680565031 2158301814 +3027915889 2375216624 +3090886373 3928674924 +1293020453 1293020469 +4282776507 2519418738 +1094141016 33592987 +3060195825 351645296 +3933966078 2885138141 +82748168 3238470124 +2786695854 2786695870 +2857334506 2292320798 +2159518088 517803347 +898144786 898144770 +4059517879 1983702889 551686601 +841496286 3545128831 +3197639014 3197639030 +1279812044 3504558071 +4291569341 2343300514 +2319163026 1360298987 +2531615861 1909820 +4016936688 3649346499 +1344399029 3663605475 +1250142955 2253067996 +4075814199 780737687 +97483101 2430726704 +1492657480 1453502539 +1695162023 1245714643 +2216173766 2216173782 +3152260095 3328688766 +3714045945 573457353 3714045929 +3826771853 2661384946 +427764640 3274812645 +3384298034 501290596 +1269032510 255946857 +2515802979 3253890631 +624434758 3713509438 +3755905522 4038798221 +3323678031 737850190 +872480421 2190532012 +3193295372 2904140001 +4224255775 2088121822 +2526745447 3587479165 +61114940 3788850663 +1973926853 4228683532 +63184135 1230193714 +2195448025 3642946952 +2078584074 2656417893 +1880414059 3687783778 +3197360299 3057344728 +1265705644 1265705660 +3410474406 1569671839 +382244643 12971018 +3558233710 1294602031 +3929030796 905288801 +702308924 569287783 +1469785578 3817344083 +516919597 1685115008 1836113571 +3183463188 3315191400 +2024639155 1636733901 3719116342 +2196306183 2196306199 +2004271165 550232884 +1791182033 1803868278 +3112360414 3875338367 +2226821644 1460331063 2226821660 +2525881881 3647628575 +4259617408 4259617424 +2302531931 3035250300 +1438941344 2757131251 +4187147213 2937508786 +3177790239 3177790223 +1987924464 2001206467 +968789203 3120017466 +1263187947 1906280180 +1859633864 1937902640 +2314643873 1598312902 +1108300297 1651700846 +3523309642 3523309658 +506738364 1754254828 +703709051 761146408 +276180190 3356008809 +1837246381 283407698 +2861729782 2367240906 +1632274162 441609957 +1133118076 3804370983 +1603960156 3694352337 +1970083228 1970083212 +2221865755 2863663291 +2730807574 2149006066 +2029618756 4127360071 2782686940 +1603140007 306400057 +361815995 2920297330 +2665629421 2665629437 +2848697448 3013633963 +1646928973 170888626 +3439228805 966141516 +1506183731 2257292876 +160419125 1113590378 +3513538662 328149143 +1419151471 2549663416 +794980698 794980682 +4144619619 1200372682 +3330969854 3330969838 +2365502429 3522503924 +1783064793 661261704 +861895512 2661388019 +815812187 764015922 +770972448 2001122163 +3965563757 701137348 +2618786776 2432994573 +2621510151 1112912644 +2180798958 2386661817 +3966944786 1252904517 +2678766869 1858578460 +851273681 851273665 +2966881581 614412539 +1080009618 3901652677 +1071544119 3258297222 +2885265423 3372453774 +3555637785 3737928424 +3578085462 3578085446 3283904310 +2933103243 1720100280 +2407302158 4010009113 +3256313880 677718451 +1503345442 828249749 +1164887055 1549706136 +1687174825 936524799 +2682409401 2682409385 1783014974 +240447427 1387622396 +2979187348 1407687145 +119235988 3290490873 +292376238 487775225 +1942819347 4123461441 +3280874133 1842153628 +419158849 2773216358 +4149150726 695255930 +3983945805 504236324 +2006675485 3357305803 +3424552462 3811550286 +4146201871 428734094 +1990890950 2492057249 +1700782620 40837494 +3953142912 1831210373 +1616325678 3610938489 +3510597010 2771568685 +1757523047 1868901876 +4103391589 3301618845 +2062824001 3479903296 +4059469229 2486017860 +3774151285 1456282983 +2316499028 2865875189 +2869102600 3441560851 +2301017695 1230721820 4038710625 1191030686 +1210553357 885920340 +3525988991 2853739201 3635041322 +2634185031 3298842977 +3340326245 968159884 +1804681205 2135797341 +2062408473 891997182 +1592259576 1419226125 +3370245993 2761077326 +2185527730 4274238238 +313182139 500722532 +3734958223 3812351237 +3320610755 3320610771 +2415471621 3711395901 +1853785237 2250946204 +1140609545 4282963359 4231426407 +1612144141 1372130916 +732606903 1958069008 834693097 3391230516 +1585155616 3699424357 +3699318799 2010078546 +4090784830 781038626 +1626371921 1461687613 +2316720457 2809784933 +460669163 460669179 +432106771 1836502934 +3338175943 2621287620 +1440691090 3227397829 +3175290362 3175290346 +4166794136 2435960923 +1423440153 2835161694 +1906868422 1560756227 +3793823020 640517207 +4152047603 2314802060 +2226753762 2515283678 +682053697 1080251990 +3836524550 31830391 +2968724099 741448304 +641734467 4228148172 +637735563 1641427156 +1188181302 2902431489 +76049179 1036032914 +2931909607 3074951098 1929413093 790506489 +2870172526 2870172542 +3329828440 3309834545 +769751759 3241544717 +3513613304 2807703405 +3003408385 3504546176 +1971424735 1501497643 +2606066802 4185503603 +347907688 217707947 +2136127309 3157691940 +3791035863 1422198978 +4068766261 4219455868 +572063479 2757320409 +1566774095 3194652999 +1660503781 1660503797 +694081803 947896205 +3915722799 1221927276 +343391077 343391093 +1905569407 2804029064 +1190550976 1976931667 +1785893346 1952163541 +1016009746 1732024389 +2666904495 3130611948 +1618602182 2783539127 +2165394872 529700932 +811156549 1636202636 +3395286685 4078760066 +4261515399 1668711552 +2329238153 383616440 +994104017 403431184 +94333618 2348086835 +3455978205 602610146 +2227635106 2806691861 +2705531784 1689317131 +2182186726 2811714590 +893398343 453461696 +2676880442 1719105373 +3176310946 2870966037 +2550061725 3589310313 +30427915 3857064532 +328638135 2367412742 +3499776182 3623954049 +3623962449 1526940806 +470294403 2747898684 +2257271410 3872999450 +2107146430 1801675209 +3274219933 1572915570 +3093065983 679856174 3093065967 +3209217471 60037500 +1274147181 4208922244 +780907692 4058868439 +4048476727 371295366 +1504632297 2365060531 +2562996979 3078226038 +1173307391 1173307375 +1334914489 4203412030 +2462560659 2740750970 +154454243 154454259 +3177711404 287384336 +574455466 2414474002 +1481153668 2119066569 +3280937308 911311825 +3999049788 765830852 +1654315106 2613224021 +908551313 1312251446 +3171662949 2472697756 +1403455286 2900676626 +848061025 4093566624 +1244618607 932395960 +2533529404 4111733624 +1781265292 2939184503 +70844512 726593325 +3198510750 3198510734 +1445466599 1445466615 +3658995391 310841022 +3591297759 3511084989 +35299546 2467319759 +3006634352 2371914563 +3250364542 2045814345 +948646238 3797554025 +1751039933 2125901474 +3428498303 632446401 +755561421 2987903908 +1702275371 327444541 +2082924539 3341663645 +3810698142 3810698126 +2200032010 3027073193 +2193088103 779295798 +23643618 435126997 +823110708 1873548751 +2128517586 1455059008 +2653557331 2653557315 +1846278043 2734047525 +1675231689 3050736184 +1500396426 1384626738 +1095037796 3576881416 1561163609 +1171694263 2816615942 +262852184 31642765 +3718135655 3672357434 +3992407393 2073739571 2642851353 3480428941 2419356548 864169606 +2955674058 2955674074 +1196201465 686604789 +331551987 253360794 +1090554924 2304667991 +2044499442 869455321 +226523305 3929928216 +1515457105 923064822 +3120398394 68213579 +2639817587 2639817571 +3029762731 4092572450 +2403606150 2552839298 +2285147045 264531116 +589722207 3070502684 +3129292509 2092260852 +2977342837 4167931674 +2789741221 1752521146 +4072212349 1550822018 2521221579 +359108811 2097737620 +1958220262 2209178522 +989328946 106467493 1087132830 +1157298050 420716981 +1182378584 1233594523 +910689437 274678580 +1832768193 3109209536 +3906067581 3340828606 +41914298 2832155101 +3395826618 3877779564 +3407822779 2100384612 +496630812 3043483655 +429878674 3891887315 +3941123958 1114767047 +1475099378 115311321 +511931807 3327534039 +1501514477 3734654855 +906970823 3775687488 +2786177959 350081014 +542742740 2927792948 +980820714 4059625037 +454187081 3873503982 +437267358 2775886271 +563635788 787024289 +3375007569 4277339280 +2883679586 4125870421 +2311271356 878374124 +3556474612 4287583583 +1085498213 3652550563 +1690899326 2749353865 +2475976944 1117860291 +2230922653 3995762581 +2239200310 1360562449 +3095981300 3095981284 +4290602464 1999069093 +1850424754 1383210789 +3169038879 2037475016 +929730842 2131747573 +1389313184 4231819251 +3150981655 3216130598 +1339681413 674138794 +1470401539 4211632316 +117546680 3213679533 +346824932 1861732073 +2571972522 3617291665 +3755525974 2807549002 +3204213051 3797526514 +2908151755 2864860290 +743126495 2573585928 +3138594411 3928324724 +4059918237 2398532660 +1981011712 3778770195 +1812630605 1637539108 +209422633 3480808344 +2357954421 4104568246 +1166514294 1166514278 +360685456 1743269813 +568896788 1967683193 +4170964284 2573026663 +835217450 4062884406 +4245862160 4245862144 +1814602535 1794692704 +1719856535 2313056527 +2916379962 2779138074 +3750541024 4023402800 +2218700510 212682601 +1105921449 511133232 2040486668 +4152004556 1643142689 +2727725286 3422095911 +1886925040 4248111580 +173084739 2157746556 +2344451806 3645814655 +2875126136 1166273996 1089749509 +1517547173 2945547210 +1605610961 1605610945 +2437579285 1385205043 +198442801 687016406 +2159461608 2576916176 +3954901234 3104486029 +3351354024 1550616259 +1150088412 36435143 +2886605924 1043771775 +1590991888 1488039221 +1200412463 514762424 +2392093766 3115518519 +1878757088 855925165 +877374842 3441563403 +155776852 4057815343 +2261358200 1347673136 +3485896773 1519721612 +1111646586 2946637969 +2622562044 1963056004 +3186449048 2493881677 +2971498055 2971498071 +811260511 2114306974 +1648783888 3303378723 +87473217 285503842 +1285712216 4222342541 +966902361 312799752 +1587880641 3203773888 +2978994242 3346100195 +2065251729 2295553825 +826128321 3212305470 +3492582248 506203325 +46902362 3231732130 +2791349072 2791349056 +1813298413 1361862619 +180486322 2707888165 +2215105425 1486430153 +4162408104 3142072458 1555104045 +702510030 3099807065 +1500546100 261030635 +3469161659 1050149490 +2297560231 1005632246 +1007390865 389321808 +2149940922 70883715 +1580255268 1605707077 +2112725700 2355055285 +1104692645 2922975960 1282777787 +725127401 2183468223 +904084239 259413836 +1625041916 1399383311 +321069487 321069503 +400832328 3829597771 +1039300964 3904182377 +3436946943 3436946927 +2068154930 1081642170 1081642149 +2816880244 561270985 +1053754550 2106831489 +1654813714 40004310 +1399045807 791057388 +1000063218 2147041493 +3209217225 3901605998 +4093031229 1247553794 +1074131752 4049455101 +3642045909 704941690 +4032701556 3627246223 +2229183299 4138174168 2260115946 1199039904 +871979947 1280059924 2089504317 +2162387349 2063545738 +80963687 4291648054 +3840008308 3281278607 +4187691502 4187691518 +3038921443 133122890 +2079013632 323870995 +3055699058 703709029 +4218951229 453706260 +894682849 1540479431 +899231002 2595492752 +1666707656 3234165801 +1610158565 4195822444 +2660708620 3020043745 +1733092064 224908731 3310486072 +2810194310 3574546020 +3737228083 1492234934 +914343369 2738613816 794296891 +2586194654 230273632 +21564099 3371954410 +3626525417 1183162457 +2159260497 4145683876 +2540897875 1356278487 +741976342 963042806 +2740563023 3447935192 +2456561059 591347612 +219099651 2448145066 +3232781110 4168189578 +1028058293 732340476 +2475112888 4112764656 +722666533 1302321123 +665496245 2598570895 3301193745 +3644803001 89770064 +25498031 326817390 +681592043 3746332148 +3131187988 3778885743 +2608065663 2940108348 +1015938865 2223553072 +3332206813 2262346722 +594765462 594765446 +348163004 555463916 +1579576302 3197720238 +1867840565 2009663356 +3347386854 3347386870 +3391314465 3004879613 +2772230668 718788855 +380470156 380470172 +4198878449 3974209382 +1504063510 916304561 +142473398 340690577 +2788771282 2116610451 +2245761662 2634526123 +1383171858 3669467461 +2246320935 3582325689 +962477036 995644567 +2689947575 3268471816 +1041450950 2594753989 +1563683998 1196120685 +389009871 1330071768 +2223829001 3810546463 +450093081 1418315592 +2916636460 2230558396 +2741801197 1763933147 +666587033 618548680 +3743791335 794956713 +115120333 2588183204 +1050704230 4238285697 +1006842084 1499705551 +1077571681 2219336894 +3977559263 3977559247 +4251742705 1286183552 +517037951 43603198 +1360605125 3701633514 +3786668664 4104773635 +2635062697 3908694286 +3224700572 796485511 +3847413729 3211862068 +1318221324 3163542753 +1907860823 1528383462 +939278108 1365720454 2914176092 2614797433 3134196976 +3784048291 2992757404 +3648356351 2849725935 +188485820 1804490737 +3434092364 2234821793 +1107559445 3008047408 +2077158629 3418287226 +2447754048 3971112403 +2577429438 2509648927 +683702907 2717962162 +3084117727 1152249739 +4246456773 4246456789 +535053303 727121350 +1771701199 208928462 +3081668674 997965654 +1299394041 4246243784 +3591730405 3947629578 +749822063 3392851640 +3256189236 2446115231 3151652057 2446115208 +3731303179 661176898 +3203455330 4146476355 +104495970 806370115 +1852914013 960318836 +2841744907 2946446164 +1231835519 344214248 +532982309 2333268626 +51536837 51536853 +973283795 1695365677 +1602113274 4244290429 +3657131267 700449724 +4235747283 1149163834 +1767871723 3556906767 +2609882500 3939776447 +4112725178 2691432669 +2366122740 4158365209 +3105472791 2055927590 +4089470524 4090779761 +816163595 2680963668 +3085909220 1906105087 +2520316556 129133153 +528443093 1787748682 +3133505805 2778470514 +1383596778 3346052993 +533450046 1272191113 +2899093813 992894588 +274229969 2983028778 +2902810330 963924285 +2228057713 240442167 +2278483823 968250286 +1147553001 2058656958 +270436825 957546632 +2534291573 1080221756 +389689217 611988063 +3688386192 2776870076 +2487075125 2453087850 +3814320947 428687706 +3837666902 3122049101 2715664618 +1449118308 1556847487 +4116091034 975224729 +4122171351 2689812326 +2672664200 3838470916 +3765673036 2717846455 +2934038239 747755806 +1851238560 2321714820 +3187873211 1410663980 +3096122561 3413213680 +1100351540 735715464 +140153960 2392301483 +4185921495 2611316592 +4095304603 3740781842 +753720244 3124879369 +337077349 624576412 +3704697118 1334051266 +952987222 3632481569 +2448402569 1162235822 +4043190695 120072694 +1566852972 2885860993 +1703988841 2382338367 +934362932 934362916 +2991928762 1982043101 +284835580 463464615 +1340764478 202392713 +3336831962 981493564 +547216939 2206514594 +822737709 2961221057 +3339251519 3515057535 +1552550642 2672769779 +3532670002 2870696613 +811160071 316755801 +3400359384 3874143003 +3728932084 3614716943 +101476042 3248460468 +2508184603 2508184587 +3819044180 3455943860 +3678117656 1310702923 +4045868047 806044251 +427120926 2295718206 +148773836 3248865847 +3748720097 3211843149 +111067702 3977735169 +3548629876 1819887503 +2892962243 2230772262 +1464535663 3659623608 +898823229 898823213 +3720829084 412768908 +855785464 1149940603 +4091241851 1566621874 +683744616 1711839557 +3677500722 1022395554 +3343394166 3343394150 +1357433188 2294971748 +4247201465 1034024254 +3547341614 126312825 +1129367462 2653571671 +3023848477 1986509332 +3749994144 2103506405 +2677865347 3340758844 +2577698186 1745539117 +392565066 1420709974 +1720577483 1013798548 +420662050 3905393438 +3493015667 865420570 +3270035027 3713657773 +4215113872 4033112759 +4153067470 2105051471 +1277528670 756192361 +4194327887 3717391182 +3417533048 2873348144 +3110231107 4241589989 +1329843552 2993620027 +98688097 2743987360 +4110525056 2401021531 +1421435738 2442320232 +1724619670 1753607473 +730362854 1842246401 +1300529891 3935963996 +2584352964 1148816303 +2195448262 1162017466 +3860965985 2818520736 +3789873314 2419156126 +984502494 1705731935 +3145127396 175399963 +224494484 2759991801 +2355723491 3977222474 +2695856804 3669176496 +1269002414 3226100217 +666949024 666949040 +1739601876 971555571 +1091785487 2154545304 3248500571 +741830417 4107054240 +1130065002 3288200901 2132151658 +1741330999 2599470214 +3964563987 128965783 310219756 +1656600169 4002406361 +3749226226 3169767141 +2085496822 344249057 +2206031123 291079418 +538438204 1908925548 +4005866524 2565591387 +3756369391 1610305461 +2986125809 566199910 +3004387058 3647293157 +3374870045 3374870029 +2599943860 1904294687 +3690978157 340000671 +2756654992 951351221 +4215419351 3801407299 1614050672 +1153267722 2288203458 +1782980298 3061640177 +1009802275 76774416 +3986749317 1990345987 +1736545121 1375404448 +3625352741 671502312 +3049180097 3696935104 +405842772 1755166009 +1665617464 2767572165 +704065849 3585287376 +1326144577 2950838870 +1103925672 1024019325 +696972955 901449822 +3300636588 450775255 +2177278367 3149662282 +2493758177 3707299088 +3701723938 2011520661 +3606869963 980456578 +888363203 504675050 +771364928 912018116 +3373833645 3019208731 +2613831543 2464067799 +1300846426 1765049003 +1357484605 2628859394 +3810033827 1400511028 +3852575345 4000495590 +85121951 1571017308 +223500915 1805935365 +3941069850 3844424939 +606904963 1129381699 +2786898361 2367059285 +2848880943 4073591404 +137347543 3551433922 +1820221045 2467414800 +1047400635 38032996 +2508647951 1465905790 +4018298037 3943709201 +3021685158 753424471 +2864281410 66501859 +2108790304 4270806131 +3457122212 107343679 +2489159765 718449914 +792860883 940381242 +2994931049 1833010264 +4145454298 2981770403 +4102026590 1401743654 +2457779626 1199870610 +2193334115 4038033267 +3278007295 3073696732 2665441609 +491627815 3277130169 +1836381668 857675263 +2883145117 605367860 +2594410078 3447266793 +1849150459 2836286632 +4291310285 963348603 1965553842 +2037642277 999074562 +3099227967 2223349505 +3709335591 867935606 +1573312816 3490178709 +48803567 1748637617 +1032437697 258190125 +1320371142 1137056689 1641912240 +1933035481 1933035465 +1515239037 2853127892 +4014445602 3484299651 +980336117 2463933325 +1452933644 3007089185 +172018913 84051510 +4279176762 2137552130 +3520349614 2553001970 +3916583661 172158290 +3962929705 20702872 +1855133382 3616332215 +1973241558 3969280417 1973241542 +277024633 2001820542 +2112341662 3520965311 +2483751159 73342150 +3995467623 1288769312 +930251141 3460424780 +3940149298 1701579738 +205873157 1446389722 2436938794 +2185532892 3992447303 +2509782267 1439406701 +3429958760 2344607754 +1279631243 266814581 +2707402419 3164603333 +2675649775 4259822638 +1746257346 2969080451 +2066880546 299629973 +3093953407 3365906380 +2933990382 2037559825 2655287007 +1105224001 4114159958 +3925368314 681290453 +4146723254 3440646535 +3548548007 2642532320 +1913466492 146667824 +1945090757 1197671436 +1117779285 372252742 +624773528 2741348147 +1034462963 2455806564 +3399956985 3997182424 3399956969 +4065788564 3608318440 +2599132716 2505888576 +3966963310 3966963326 +1196576650 2310951087 +3001108950 3001108934 +4100023394 391185994 +2821690237 2521971628 +1779033935 3119087002 +3806760947 603233164 +2381752252 659157975 2381752236 +1067686021 3012106586 +212396066 266694019 +2929227645 1010480571 +2691986699 1357405156 +3049093344 4001292508 +2635734914 3525286307 +1145063159 1747957446 +722503226 84102475 791850242 +3149776547 784315036 +3466416870 2262082598 +1101089094 2524851807 +3356617744 1808112872 +2292033827 2928348100 +1729868363 4114285643 +2185624734 2989272233 +3021995513 2271006440 +4030632808 4156165507 +624118693 885003436 +2335139422 2040407551 +4132155049 2241406742 +3996606447 888199825 +1305315664 1305315648 +3471105449 3251861785 +3902746217 993662937 +3713808112 1747614659 +1449942209 3449160662 +978259810 4231073907 +2584634447 3550996558 +2893474770 1775028347 +4052617637 1344573130 +3736986736 351181891 +2408688363 3981447156 +2534596023 2310211334 +1358718589 2982665958 +3468557596 2434102033 +1263204522 176187072 +1506183714 1972073365 +1589107525 1617833370 +125354211 3543748560 +3900334503 2678569440 +1661293725 3804887556 +1625383441 3628779459 +2251649880 2653197211 +317441942 3497117797 +1884978595 1884978611 +3120527834 2804732477 +2552701877 796647258 +1680999389 1442445355 +2454471522 2953712469 +2422157370 2373609237 +4194374754 4194374770 +3388661647 3388661663 +1617104367 1617104383 +2824943026 937022797 +75654192 3867058759 +1134803433 1673374158 +16514409 4121947214 +2246531492 2246531508 +937774548 1154215743 +4171275782 2856039494 +3635932575 3635932559 +3759098516 377939572 +2729628367 1382882136 +1739066549 3800826090 +2067506524 1524977607 +4263755624 2051428523 +3350495274 3754118590 +731193663 3670234664 +2510501300 1813060094 +770968253 2313198539 +570544057 3895353758 +4081695742 1261401896 +826235327 1020492417 +4209906712 482976219 +445501168 3174876099 +745523059 1727461900 +3054005676 2970660567 +2822754469 2171958188 +3395917567 2738402152 +1641165508 3253070495 +1232068063 3642079695 +4074048985 509922462 +88459223 3277084354 +366881353 3049033976 +2926354228 3372129999 +2620645966 866992345 +2809901625 3770257320 +791072997 521853036 +701194245 2302065706 +2879108333 320721156 +2198394827 885334602 +2276700117 1960692810 +3673134092 3673134108 +1698239232 1490610451 +1588585642 2876360979 +1162850016 163938747 +743993633 4030338784 +4246496325 3098663052 +1500253205 3658941706 +1710765453 314330354 +1581661377 697410518 +1034505515 521011088 +3719420666 3579847433 +3629269851 3833595972 +585832526 631122895 +1849002588 3662204625 +74720283 998761215 +1579004988 1690483320 +2039476516 2889681679 402164476 +3104899078 1539508577 +3068286614 2085506599 +517841081 4210102156 +2325509730 2521717845 +3179603367 4281697782 +3150630753 21263798 +1662793369 1053381502 +3168693933 2480556019 +2882838274 3130819094 +2893255452 2893255436 +3806702246 3099690993 +181889653 2073280851 1224762381 2250020394 1224762394 +3113547279 1014631002 +3516308236 2185851155 +1730256212 23825065 +1199447780 1199447796 +3589208907 3845485878 +2135239427 1558361514 +1144333337 1311882494 +2002862671 1025204824 +2476795151 1967691416 +234998448 2021873682 +1633883325 200910228 +3831287347 3503853086 +1459102263 530439302 530439312 +4254489637 1488129594 +3188915195 853716004 +3004138362 1533802763 +335613568 4085844075 3679977640 +3366303513 4125047880 +1249303874 1249303890 +4054779240 4054779256 +3111256792 3329915419 +2827154865 3140428865 +3363380249 2946972510 +2373338824 2033282251 +1605006327 152782000 +4177546096 4177546080 +3523735120 4068222947 +1905255173 3397542092 +900293478 1422791775 +2956812714 2248936965 +126989692 1530430257 +648036821 2739380810 +2776320265 2316564792 2222012540 +2433942338 2733514997 +162136292 1620951118 +1710526585 4177489534 +2557552419 4015371542 +155340116 2025046283 +3135494505 2645508184 +3212071525 3077322063 +1217806486 302526890 +3313464215 408460827 +2513905112 3115356941 +1125472826 3567061341 +3474733154 1802289731 +3088121187 633266890 +3548800867 256727700 +783948063 16556159 2710244316 +550104302 2346711727 +3866786309 3620607450 +109399393 2765672374 +3973137840 2104538133 +2622163354 2753568107 +187785513 3780176109 +2721954492 1453685228 +2649322632 1594574038 +3005379973 3005379989 +1088103313 319387973 +3120184140 3801079764 +1058224246 3242320337 +2085709055 3005349224 +1589045479 3859489529 +2736224920 1609746364 +3851742546 651322861 +275417169 275417153 +3573844974 4201175151 +3300222927 2291303454 +1338407521 4134708896 +3312064756 3120908303 +3870465413 1776921332 +4098278568 1430147196 +2611385629 607960226 +3664649263 173432312 +1219019526 1219019542 +2241053556 3147607961 +556154604 456461719 +3005655811 148846012 +3356536868 3088146959 +2865569979 2615838322 +3785327640 1176302043 +2657877417 218124568 +2867271817 2462818232 +2531764426 2531764442 +3886422663 830194304 +2360564193 1599503670 +3064574436 3064574452 +3085909229 2057103634 +2570914755 389518205 +3610607337 3991989660 +3546449194 1764983802 2628823667 3201138254 3716967834 1558677748 351750129 1888043199 +2597123307 2611318242 +2717266692 3118283768 +3744573318 3777673207 +3861045336 2699504269 +4251292748 854094753 +926430958 926430974 +3857814199 2991191568 +2774702557 926430964 +3522326392 4171594221 +1171001074 191154667 +1846018311 842259443 +3528137602 259759951 2386316707 +149291927 2568464048 +2247540062 434681320 +2143258328 4068558349 +519244525 2778346258 +3987825542 3024071671 +1024066873 1338390696 +2725289179 2454121668 +1348915432 2044386621 +2970037747 2970037731 +4200974841 658305790 +591366154 1190629004 +2666043355 52891076 +488422749 3871470933 826153314 +1230240483 1379136330 +3600506680 244770093 +353691073 3400022249 +2245960916 3544836689 +297950143 4109279083 +2627010552 168389070 +4209383640 691286241 +1187379465 2868081518 +3189119035 2009605362 +292837151 2569348574 +2559346791 2352658998 +913197564 2879289265 +2482093297 3599527792 +1885474447 2270558525 625350362 +3309477807 3309477823 +579728021 4201963658 +730726936 2827832269 +831767719 2996736758 +1189797896 2881399947 +2428015975 3005623417 +1673643343 1493801816 +3244787262 3019395999 +3364283965 3915149826 +2915041318 910892155 +3250531338 166876091 +2149586726 3632558295 +2057067571 3993700486 +3423058164 70721375 +2527851073 186436893 +3649884632 1353602843 +146925118 3323535915 +2024454505 1743286847 +1409504757 289340314 +1205100127 2094134026 +2584035573 1799700924 +277305718 2064766161 +2795541807 4266888826 +129153497 4149907592 +234269914 3578927933 +770883508 153339993 +566983709 566983693 +1705067595 1205764628 +2896150443 1786427938 +2425253884 2425253868 +3897846132 2361951199 +3123155288 1682558363 +785619390 785619374 +1678903113 3512825838 2322582457 +3361153483 740962946 +1439003188 1247371860 +2044512949 2341673724 +2262691414 3125265718 2774413671 +846032742 3720696999 +789014099 3040005427 +2630404683 454456322 +1083358365 1140779828 +1591262586 3375515403 +3406080844 3831081143 +3814246328 1929880133 +3316372221 712844354 +2045660088 2854302381 +4224099294 1455734605 +2750883067 2532560296 +2829740515 1732554826 +179769797 2737895692 +1618572357 2495842922 +3235999514 1006988086 +765596015 765596031 +531098867 3361342106 +2610495387 2363121938 +4084816471 2668181222 +3118566249 118388312 +4117592526 693550937 +2779187249 4143047984 +4235456042 3764432531 +565126050 565126066 +216549561 178944830 +787082895 1765968654 +1942545055 2476912970 +3531767987 2853652825 +1702397264 213507299 +2828238085 1105469111 488413921 +3436910630 289845079 +3648272473 2868163592 +1396857746 3266984217 +2381361495 3370593264 +1960269640 922642013 +4294404569 1111043569 +2307635847 2504712189 +1288784829 3045649431 +4225014236 1269708103 +14060109 2663102244 +3879773593 740724052 +1958361305 1953633015 +1830195370 1830195386 +1583074113 3414226752 +3759097342 1922746655 +1227631248 1227631232 +1654429892 28859646 +233681349 233681365 +1763987115 791140130 +2249057919 2262948328 +3257257309 4269951348 +3956598361 575630479 +1601298836 33432436 +2393394753 261175757 +1068727973 3968884154 558074845 +3920012051 1312154275 +310664221 1130168756 +3523759361 1060356432 +1513893046 3266994833 +2278256396 3510620151 +2630226625 2158997478 +155670119 38601760 +2398092330 3135458532 +3418006166 1288565287 +781988447 781988431 +3801733442 4143721004 +2706872927 2706872911 +4231969054 884828735 +3869157660 667170567 +1369240166 3759249025 +1886031899 314628740 +2698420015 4197202261 +1250399904 2791001892 +1471062412 2481475447 +777313882 2289701410 +135672410 351355837 +1568890776 2859990204 +4284071482 877032797 +2029291189 1986364855 182942284 +2222925089 588904774 +3836584639 3159831208 +226780879 652921100 +2920733151 2920733135 +487524949 368244119 +443830412 823839863 +96408015 3685527403 +1261235290 4234008401 2419514614 +3634221916 1647152913 +2750035349 1556280378 +4265620161 1041856 +269583382 269583366 +470821813 3799305724 +754777799 1025452953 +3262517002 702131387 +2015458489 130980402 3932622006 +1630163765 715193468 +2630595294 2997523327 +87096730 3323935101 +2359270158 209144985 +3688951995 3726308978 +1582043797 113328266 +3404167100 643923175 +3585515528 92614960 +1121047345 3541161694 +457484122 1192456875 +2566229124 2100210205 +4018310457 122362633 +1618681546 301025184 +929048761 3848280872 +444024998 1338465601 +167329427 1180533100 +3872554036 2438563279 +960754411 284649442 +1332603820 3054108631 +238331192 2497713979 +3901234856 1891674819 +2987283951 999376696 +3564425956 997249719 +3395279438 3806636239 +1059553587 1177304515 +1856513186 3568413461 +3838563148 1741094083 +2498855077 489522092 +68134063 1564731884 +4157761129 2302097240 +1738601392 1032180943 +980743013 2149209673 +3577256864 1209859301 +1924776185 2473248766 +1774419112 1094028952 +1281919290 3211592976 +496653313 2599566742 +1212077134 2984076701 +3642682788 215744169 +3733660908 3733660924 +1541908066 338671609 +1014116550 3988965281 +868055093 868055077 +1802316442 442941707 +3384875305 3287980942 +3910951550 1974406217 +4101302613 1724919277 +3318607855 1378923822 +1645654013 2542537 +30689183 2150416222 +1098309013 2828246916 +891308212 1107137760 +410860423 902412420 +868441141 3866889164 +2307070768 1025183389 +425890024 2308056741 +1380806 3838685764 2856651739 +3255112163 1358637148 +1623620841 2327664689 +613431916 4211865623 +3178887949 1409693042 +653374417 528355856 +1250825546 2813035373 +3667218355 3423368901 +3712781714 883739688 +83436843 3701755353 1966915918 +1336344802 3434023914 +3815319862 3207703297 2788833418 +996031119 3953926860 +1838208300 693528723 +1428545113 3996164414 +1846955693 251571973 +3118452568 2571895539 +2717707786 187349415 +3928185270 2645331863 +725856483 282440918 +176967141 2145296250 +1394275760 3789968283 +131968672 23390075 +766690379 2641642872 +2325109014 1085160881 +1426722079 4192359744 +2846199496 1300424675 +1973109613 4088045592 +2167924109 1535400993 1466716402 +3509871024 2909403403 +3126651496 3359965611 +3031906645 2082668012 +4181445782 2603773281 +3234507581 3154874644 +740640788 1691095935 +3935834097 1046550630 +2182050700 1246946679 +2462346989 4164591378 +3224190545 3890425312 +3179705451 2641805976 +737773430 3992516434 +1971268481 2016508950 +3617151075 3014247185 +2601200475 1838497860 +2171343687 69359830 +1792231277 1183273822 +4247361078 3641727413 +1468744504 138072379 +809546399 2497261640 +1787424275 3391211500 +1804114559 906998871 +1452638409 2155092394 +907575443 3146934124 +1035199997 523439444 +760778946 611049845 +1349709441 4032664016 +3460183773 3241535787 +3184939817 2443661054 3400514943 +3229807674 1210480459 +4113433758 4113433742 +2372539955 1350397344 +2981437048 185091616 +3643145537 617178009 +3294685542 357635738 +2285783392 1749278779 +3008584966 2818127753 +3224962124 2459772120 +2371694054 1873756417 +4173127082 4218284549 +2261922356 2441829001 +3263031493 2408362691 +3931596551 4002885654 +3299872302 3475395193 +3610223033 2029753896 +2390581022 4047329342 1744590655 +52233125 2599229660 +3242722946 3701873422 +3426031926 1261902614 2912333831 +4092469191 2613251277 +2296807815 165537664 +2750749217 1004020192 +800666591 800666575 +1949502623 2338119262 +2271801485 3073551858 +1248211058 2430485370 +682687543 682687527 +98688113 1222208466 +1985472200 4036558836 +2960792823 2536847375 +2100067666 2690410457 +4154924663 1393882438 +1557748236 908640503 +2925813186 2675615349 +4142928894 166563787 1687210413 +2166519937 1834140583 +2041706419 3037824083 +3508351192 150201357 +3288668841 1260606014 +1912662718 896633119 +2788501984 2242964389 +244959397 3191228112 +3459956800 171967874 +590802164 2634257120 +2566669968 1696797877 +900830635 931128792 +3830315655 3988873856 +2080326405 3232552746 +2902418955 1628283732 +453168876 650811009 +811827466 811827482 +2507608464 2555699768 +1573294177 9783456 +2132832264 672160925 +3152359454 590024745 +1335525356 1335525372 +4009382377 487518674 +1943697692 3112894417 +3657318596 3015518888 +2461311992 2840667898 +463695823 1241331453 3455023642 +1700742711 3422259334 +4134437740 1543037719 +4116056237 1673922392 +1725257512 165164029 +3603991379 2102088620 +613979809 1026891638 +4241113763 3372024132 +2999800689 3929692902 +3572326891 481371362 +1644923734 2530159137 +3244726917 681343468 650295996 +1178660771 993607050 +3795251214 712762905 +4019046531 3636179056 +3606367318 3109923697 +2831627478 2367813081 +1614880586 478038305 +2597141406 1326766518 +2566878131 3475982071 +3451084560 3451084544 +2110935213 2110935229 +3112246059 3112246075 +1162047542 3134326154 +3260762430 64265801 +3920406652 1456290599 +893426372 3955809711 +652752518 1092457373 +1134580694 2506254006 1264843239 +1169599719 1159788772 +3521072102 1216641793 +1343560286 1865974249 +3746016372 1249705673 +3279089298 2663266494 +3803176322 1557771171 3451242890 +502689752 2953893747 +149694880 2881849075 +2449634775 2967437670 +313659936 2387773541 +3951031056 3396051491 +1001431168 1997318547 +2377549659 1901532242 +2653733894 108565857 +3454973159 4092351431 +1223601859 2461867260 +1681519917 4097635780 +3932102904 2376777107 +3501603159 3180984510 +828533172 2955222537 +1284756554 3602329709 +3369495512 3369495496 +3203013790 680201407 +4242630715 3113607912 +981841548 2893962871 +1624210589 3635865236 +363019571 3129240736 +1369489631 1594859294 +3639362811 3639362795 +2273155713 3425164710 +3710173095 2075535780 +1114627711 354107902 +1091281756 626512903 +1961878991 3397902363 +2423955967 3430805419 +2853867405 1969752818 +120379384 3577793683 +411488540 371922887 +3702922329 2090537207 +2014001045 2393407388 +3151900185 2293412303 +1524593873 3737445638 +3169806640 2632095381 +586187620 2129713219 +2063400481 3175353846 +2679024657 2594707898 +1210304688 1711611848 +1512072773 734301087 +1951668459 191052276 +3078074657 2512610630 +4034646857 3689782264 +1389774717 3830614484 +3759196857 1936662846 +375680673 662585095 +3793216606 1234993129 +796305816 4011300512 +2118564814 3327889743 +2970938202 3446762865 +3588775088 1511553992 +2663564013 3650673412 +3887668453 1621575686 +3218867128 3210336955 +2183323034 3765717264 1729037347 +2424910435 3289308486 3915797793 +1918679411 2966705534 +4137582734 3380895641 +739799253 1064935242 +2689561866 1729445549 +633561429 3348248796 +2461901612 4029740631 +1073891352 2930789935 +2261130805 2964433555 +987306327 4207076336 +4291984131 3143083452 +2592225674 3305149485 +931894957 499003972 +2117004806 3820651591 +3637330686 1916440237 +4238099928 1618492285 1436365722 +941014873 2350686421 +3435687557 3833985882 +133359644 3585336588 +3688343325 830214846 +343791854 2102369202 +532980556 1317867703 +1082288902 2471393889 +3364127959 3364127943 +2727561586 1531801371 +1029875242 3427505179 +1013772572 794387790 +3742444102 1845857335 +510833335 2777634316 +4012582718 3203319455 +303571415 1392330086 +3512608836 609675055 +1582157757 1457035424 +4121897791 29430824 +2775579352 1126750835 +3436560368 1685923541 +4181370484 1911220526 +2942478472 2689551883 +4136804133 1305511724 +2670459743 4047287966 +964215761 3104840115 +4249596895 2636916766 +3524970573 3926577573 +1410511280 3947911235 +2125419045 2466140218 +3552289228 291792308 +2340974215 1436297433 +591909685 3205594236 +1620169303 1620169287 +2431856469 1341580268 +3883764373 4288751754 +4222367187 51952442 +3382604539 1601110322 +457938233 457938217 +807608759 2119045894 +4237429488 2313631683 +1339072408 4241485092 +4165844270 274780025 +3353577969 2233445633 +1714446795 3775454968 +1569010142 1569010126 +2466361237 10971018 +651718974 1689928841 +3739091823 2995799724 +1626669639 3904017878 +3999950612 1702904944 +269463747 1141675287 +1052677304 1052677288 +148756513 4114572368 +1110315605 1110315589 +1184645806 2932310254 3426372911 +486590316 486590332 +2542622308 4152295273 +2132388753 1030520096 3519609203 1842538839 +202167506 2738850422 1929836497 +3107496373 1227263996 +3818596869 1380132300 +3173288913 675349892 +4112888366 408387193 +3449171512 3681206843 +4093073143 3120644736 +1214084559 3122689240 +421033097 176124846 +2936170649 432711880 +2602825185 3845928423 3979373703 3581373555 +97380747 2391340537 +29591011 2814778567 +61552509 1133009346 +2757309882 3468588065 +4288112798 4117021762 +3257130991 2373551406 +1419666352 3847679491 +1960355523 3020850410 +3339315048 3164031147 +2116187657 2571096103 +3964276063 1469254792 +1099860958 3806015999 +2543114033 3494822438 2871628087 301703638 +2150729056 771028531 +2948151690 2948151706 +3334840128 2020792603 +324543065 1832289576 +2117512409 2117512393 +536059555 3125470468 +1934393520 1251693975 +3039433986 131273061 +3562264728 3441348089 +2211153427 2355367916 +3637749933 36866116 +4207661384 383415371 +3118166132 141690521 +417644404 3975662025 +1462505590 2958944711 +3942429773 953144612 +3294795688 3476340075 +2169596480 814160909 +1959017176 4080474724 2833818125 +268078302 609858604 +195486170 1808302517 +2536443707 1392861694 +4228677398 3864403398 +472001100 2532397376 +1907172067 493453776 +3446207059 2939517100 +2318143571 562054358 +1784561185 146199261 +706513070 4176161273 +1262146799 125385336 +2486853566 367310857 +2346933430 620751782 2094779031 +2677236692 151398063 +3430939375 3698853432 +1887191738 3449621195 +959752059 576672808 +1782394340 575618537 +36606876 1672142417 +4241645704 2267936267 +2998192997 81757834 +966759287 966759271 +4286081309 1200453803 +801302756 332701417 +2684197260 2775154835 +327970775 2635337584 +3738036602 942050059 +3099914858 1208589517 +3976339302 2153213313 +3097947599 3546946842 +2344722953 3422979509 +2028255563 766755448 2601496834 +1319223321 2400565480 +947936170 3495782758 +4246049007 446485347 +2220311845 3674794842 +2382522999 3752351971 80582992 +25605394 2391089822 +3204192377 2734798942 +180458872 3690490112 +336291358 2884747561 +1653757183 2844023467 +3356514274 3820646885 +296404521 4174770830 +1716184451 2330414378 +2222359342 3029369209 +3922749247 1376946238 +1731605718 1347759342 +2747178477 2987564036 +279727551 3828801916 +1520869766 3207951592 +2182857290 375984603 +1593443756 798420439 +2353214401 2395633856 +2583496922 1129639741 +1130184834 3304203906 +383287207 2647716854 +2279940874 2576563870 +2173491231 2173491215 +1005154446 3732680591 +4003727208 339191997 +3872009164 2657298913 +2541116796 2541116780 +1282783668 2670784009 +3016096131 2099366256 +120954370 122600989 +1659729988 420881206 1159724864 1633140508 4038116957 1848024201 2684825933 +3812133522 3797837115 +1204616882 3691619156 +2049048721 3747178564 +1287873665 1818757859 +4200238318 176937647 +670602333 1230081634 +3786779476 2768024880 +2164460127 3748141409 +2700416680 164801131 +3001665966 1409842425 +1198866513 3465822096 +353335726 3579612390 +1376093742 1389419512 +3291672583 3811564310 +1667051064 3668880581 +876920187 3580770173 +2863094482 2004088979 +828537737 1191737518 +2124857834 2879590017 +1001657999 2981846747 +1528456081 2997932375 +267428645 2514010848 +1153184171 826422669 +2323594715 3780009938 +2836007512 153819405 +3552641864 1618346858 +3484356695 1201060070 +2815932981 1838817660 +2468266165 1507673178 +2628130607 1342747610 +1706620045 2938698212 +2756150422 848672807 +2542850994 1258111269 +173086904 1736104773 +3829431994 41174698 +3480107334 2454964151 +2857738546 1456259507 +1574555109 3745418506 +3835292452 38611391 +951807610 3373197835 +715754065 3541186440 +1642427178 1177832205 +1186187219 2443020374 +2439084875 661985026 +3647194813 1293716898 +1224777720 1382929540 +3770038968 1994289069 +808310495 985461613 +318979345 3889811303 +2108095142 1943835457 +1498333384 3328770744 +2828094596 2417444207 +4088216724 4011088895 +1867584071 3040078583 +2380247836 2306679905 +1822408403 2166085463 3531171372 +1925000018 4056625683 +2342287347 3125859226 +1797587434 2359176360 +4068932086 3229318727 +147330445 1610214642 +4020385383 2740692000 +236035681 2260488886 +1299834219 1642342242 +95156473 3602437848 +3925460582 2309019034 +3248686931 648316844 +2364653435 1536192178 +4086085545 260382478 +1539093320 1413649648 +1247874148 2308818897 2610064785 +2300678006 3911035242 2494900972 +3092491344 3205488557 2992664105 +2360293022 438352574 +163006324 3213196185 +4017734550 2460935463 +1766319823 1766319839 +3223402965 1229851228 +716912063 2001662773 +3619961100 969087265 253791968 +1278610000 1278609984 +1838739987 2596606970 +876540775 876540791 +843346593 334876916 +3817152358 2425384343 +3905002322 3905002306 +2490237449 2871600238 +2958444549 3133137980 +3479879786 4010600155 +1919101752 974974955 +3665598594 1948521653 +669524852 1181732751 +570758433 2936029942 +2056338168 3332073363 +3934390548 785464447 +1736383373 2048417522 +1719954738 469601469 +342601471 612662142 +3570395916 4200799008 +638849029 4136974284 +557916385 1478736646 +509322212 2923626473 +1010847852 42758039 +3725550086 444356801 +1410050248 3540842081 +4074801000 3212126397 +2450536017 1082491280 +2685093706 1002518893 +3869869114 1457203019 +40191732 2605467797 +2429261127 930873024 +561238861 561238877 +2160661141 3816659244 +4099078197 576948777 +243633877 3243330884 +2593989391 3360063323 +2574793828 4232515945 +3467187848 3123123637 +3561527597 1531519442 +2841841245 66034786 +329578497 3987892608 +2090427899 544967218 +2682403522 1931640693 +1968190232 3309334221 +2655735249 1956284769 +4009606686 4009606670 +1818199710 952045298 +1894117297 1894117281 +2410512698 3734546644 +4165955581 3792522050 +4165937688 4238296027 +1149049617 1149049601 +138429165 3928578834 +3455034102 641567057 +2340666823 1734590550 +631224118 54389015 +4177770790 68097127 +607178987 3219424603 +4203147789 2758386439 +2433852243 2982419372 +1584059481 1571169935 +596560334 3461937497 +2804988425 2562104440 +3200118873 3659793214 +3509739321 3509739305 +241628655 1288553158 +702479197 2377448107 +173084765 4056949163 +3587086174 3435115772 +106809549 2199943803 1220740645 +3727066739 698722060 +2339279414 3037735687 +784354113 272489574 +1231696732 3996047815 +2939583040 314733267 +2913811149 3221172284 +1652135499 1348966420 +3170267345 3849974022 +1778675494 184219863 +3213246450 477711574 +1460870704 882526620 +2343001937 695930000 +1651538416 3876582613 +3147727610 1418211229 +2917955528 2470481867 +2076993552 4073181475 +2043775869 1105106370 2382308566 +1167087490 70894005 +843096235 81523637 +3796991055 2504437838 +1462060130 249416878 +2495741878 3815082897 +2933990389 1796287296 +2978153470 1866418377 +1773216797 1329933035 +3148613527 114291366 +2482821477 1544174067 +1678197612 3815711489 +2110170700 1270335905 +2565157423 2565157439 +4000916116 4239486703 +2553730156 1032885143 +2937122617 1968867378 +3132491725 3648000288 +1615481142 3136366273 +3388638547 2599436736 +1609710556 3864279879 +4238119223 3782777232 +3307047951 2147100657 +364074157 3174962459 +266475559 669779318 +4046238505 3529378190 +1384649575 517800804 +3994318190 3520949493 +2903897594 2049901251 +2727851800 215300827 +241205888 1083965368 +2992121979 2363799827 +3845468690 3567773958 +2562651696 1749809435 +663674423 2095566982 +187228601 1966648839 +1632992593 2976582461 +2275826599 4010762313 +1680110851 2825139114 +1564825923 933747313 +2286892613 2114905923 +3012451518 1729888009 +4168039196 2197983687 +3199225835 445501154 +2361235364 846575401 +945432893 945432877 +4030661357 540121874 +2131165285 1560649466 +881332736 2372102604 +2740118560 998055525 +2447368265 1008314175 +3261278007 957791110 +2670777459 2086550418 +3364813926 2419928716 +1018286049 1923719821 +2756511508 3108119663 +2939820488 2007886581 +3418153166 3996543065 +273805457 1107145808 +1183801483 2662660820 +1724459833 3378894731 +2380932942 4170114634 +503693548 789492609 +2495881510 1455435479 +2889212030 2530240073 +1931890296 3993724691 +60755236 60755252 +2244984014 3974298828 +3368356782 3157353190 +552313427 1452949302 +1472663392 2388472883 +496043825 1654366925 +1675941474 1675941490 +964606503 855566372 +3364916543 3364916527 +2313922177 2666994944 +4292102764 657532951 +4213932203 276532514 +813144083 3735841024 +3319527739 3024705508 +2787325956 2373004873 +3668720803 3760419996 +442579286 4126612908 +4007087961 1775368766 +930436958 930436942 +1129767768 1506272155 +1605981135 4052876812 +706556602 100063965 +1087587913 1436001518 +3154606419 1388576186 +718845114 757366987 +265517493 265517477 +2353378033 4005512086 +333174727 169127488 +263309795 4246447837 +342427816 3378028651 +120039212 1869359681 +3080927388 1367190157 +1082466258 1349000301 +1564692406 3666368667 +2079686880 58319027 +1502135376 2735436204 +659259934 4192064809 +3957986674 3548365413 +4176919852 409717825 +2296698028 742050519 +1649781011 3755550956 +2896086566 894108378 +3937662025 1778864607 +4242518006 4242517990 +3136635096 3543121050 +2077059880 2669135624 +2241255170 2757304074 1316255779 +3684553536 4185099717 +2228981873 2527355376 +1790273113 1418731016 +2136657912 1893839300 +3337697152 23251788 +2487739512 2991451411 +1883938432 1165460371 +3432516765 1272308260 +23951221 3025341738 146651418 +985987414 3658777201 +3505664465 3244977168 +1733358160 4100813795 +2549692209 1850860070 +2039193993 953865119 +3855874425 885457246 +442271088 957669876 +2055301789 169706626 +988478112 2098959357 +3320652550 2588811895 +1433902389 1433902373 +3694354682 3694354666 +488090282 2397998694 1984014747 +2608550304 4072325755 +586617668 1376602681 +2754219468 3429560020 +2344134021 2151065103 +759786166 9632903 +3843527422 810225649 2118443173 4038071561 3443319358 3856956396 2204426686 +476252968 3622473707 +3809363610 158934141 +3208177535 3208177519 +3879122007 626724041 +622465406 1258349197 +1780770640 2195031759 +1526591233 1052720768 +894348185 2211979742 +98725759 3262481662 +731830005 2642470028 +262489843 2486087834 +2397234044 1798052913 +3038815474 342075635 +832882126 125130062 +3463309787 3523683268 +2754111554 2912690165 +3314986111 2335280104 +2615401448 3021064707 +2858891112 4170011029 +2775360516 2093033721 +4248749676 3661624550 +593352346 593352330 +3849063341 1463497746 +115612804 1561912287 +381975096 256665147 +3595046869 4089706618 +43175982 516277127 +43695806 2262487007 +1041070987 2088627886 +140197426 3463729613 +168477748 1459523102 +2106713555 2142030650 +3950525201 3963486672 +3381333845 1472048883 +1580188139 3436612622 +294213672 3275081469 +2878152701 2237370207 +2019594719 2019594703 +2768441726 1104447817 +1788257482 2502257133 +617967342 3925713071 +2194867744 305308787 +1802136901 1802136917 +3286486373 2149277398 +1844477990 932821953 +770045261 2382440484 +3654976971 101022411 +3152301261 3755420210 +3522204948 2444930671 +1742612993 2210144128 +3157869851 228735710 +4209383632 1015200423 +1025687102 2075229065 +355478651 3587573170 +1185752426 2895242701 +3315941120 1405935308 +2555024959 2555024943 +2574145235 2574145219 +4128196871 1628435990 +2744615514 3783406525 +1970418617 2613537832 1970418601 +1901614254 470633977 +1290952874 198092051 +4136726884 2331345023 +314561718 2060030363 +776898213 776898229 +1741864353 297829494 +835522500 701485449 +486879781 3559780396 +3977775289 359845230 +1778002537 741444927 +2190139221 286135290 +3862095578 941539446 +2599644346 156824001 1499571628 +4234212194 3433775934 +159391915 2066167870 +3747943433 401512544 +3676086888 1909746771 +208967053 2843257377 +3278566046 2580683137 +780894727 1285402880 +2310219346 386224901 +270863515 89315332 +3485860918 2812640769 +2819077584 1411593827 +2407223715 1992437392 +3429523236 2621450511 +831204911 756659192 +681592050 3500910302 +907327329 3852825990 +166678141 1463752591 +916515629 743585732 +1272757609 2447174356 +2504907096 1636640155 +213272048 4075821251 +2218182213 2197900275 +3395683010 1620465525 +1979698981 1710067786 +2230316132 1879896234 +721918797 167344676 +2345759667 3451462362 +2356116851 2256698394 +1995783450 1578053611 +1174766479 3383630360 +444223772 3398283032 +2357208618 940811909 +800146617 3440324414 +578908523 3529729177 2667218830 +2927635567 2041456096 +3441610777 1314710949 +3108694003 2750096282 +2291212803 687152730 4286089909 +3335631599 3944525368 +928200499 1258284364 +2117225726 3736399646 +1004110908 1936403047 +656547352 2998230989 +1069909403 1508224840 +1734590997 1734590981 +2935437749 607115260 +1207437981 3900224820 +2201975664 2981955805 +2284760511 363714060 +3268551914 2039815098 278700883 +3504086660 1658546041 +2992727610 1186321498 +1485507097 2078336350 +944433499 4176304708 +1649095475 4016150874 +763879794 518514277 +3395587267 1598658300 +3537600639 1854621694 +768378332 768378316 +967482466 697577045 +920988895 1637561782 +2696664939 1153216226 +521813332 1246661423 +1278978459 193098591 2632711940 +3150541325 3541299556 +1803047389 3625377218 +3276609482 8978725 +1806268853 818583530 +4181949639 742223190 +258248525 2286786084 3290656933 2286786098 +2507003748 2682917503 +2412992497 1521709168 +506505193 2060184910 +4037969986 616595445 +1160673480 674159511 +3112624253 4166595813 +3539397102 145899961 +1343327044 1335770121 +894911775 2600082984 +3136768300 2678322752 +3655191040 2675229976 +1845447195 1138862212 +1936508108 2151271735 +1334483904 1855156200 +3589373848 2501267885 +4200544492 266771329 +1300803948 1261701096 +2652244170 1640880691 +2187133341 3580463668 +3063752684 1701173377 +3943808721 640508196 +3534440786 3302367725 +3089311244 1470385697 +3439154703 3758190716 +3618013926 4235809830 +2030143120 224842915 +1643849527 2177410730 +999897838 601575858 +3600262353 3978791061 +2709138604 3746845384 +110954566 2939422263 +3615467612 793764113 +2078178293 1122132435 +2059968435 4241712844 +3540966647 2119563279 +1396092833 2685827680 +799992782 3057675598 +2551906068 1588110658 +950376255 1806506024 +3808452941 1965068965 +994747152 1719579171 +1850712306 926736172 +3449595683 3499826204 +3441382235 386134498 +665807585 1512390688 +1635269983 4207295845 +1096215408 1096215392 +18882427 1105598793 +2582198270 1210262729 +1207566653 3439023313 +314294840 3046293037 +2316794477 3488987524 +1325807704 3658940688 +2653495383 2726463138 +3662732371 1682839510 +2752880546 4027206659 +2390240045 1949038532 +630870855 21786303 +1401287370 1172124653 +3231783175 1150969353 +2709834426 3734557078 +1360282079 1360282063 +178161957 2449282070 +1637716477 3459082997 +2469536962 2469536978 +994366627 4032478364 +3999250435 1207561191 +1948956787 1379949850 +2630748868 2888551864 +2290115924 908034873 +1804158445 997890130 +94542807 1535771454 +3232239159 1562510004 +894370445 1924740581 +1314685163 1184821730 +174710827 2410406836 +2597403494 220415842 +1642744445 2698199764 +3576827117 2391422789 2328516882 +3650234784 555190003 +308552713 3164356539 +1474322841 1474322825 +2830982226 4095235333 +73596038 1141646308 +492439764 3337843863 +3847339964 2063724780 +1719155121 397325339 +3236236770 2325011139 +2761240408 158358695 +3600835786 2826873330 +3021467651 2226050218 +3108607633 1071121990 +3778490692 3920535976 +3127680111 3891937966 +117324773 3389287715 +3635095183 2758652686 +3083265980 3083265964 +1883475254 1735178771 +3758465946 3595979536 +1102288745 3602340440 +1261813676 1022235515 +1163715919 2151480142 +1243012797 1593877396 +3211855002 2737884867 +3460687440 3750340347 +1881636217 3320849758 +2122877752 1772849992 +2139010606 3354417546 +3420617069 3046886073 +3390180861 3390180845 +2356684784 287760067 +873064459 4137175362 +362195765 825197674 +3789162303 3982423804 +402788297 2487146862 +2128057162 4150058363 +1050684572 841365895 +1207735476 111023961 +2155356550 491496391 +1628210496 112575443 +1188017406 1996090313 +4290745907 3449385548 +757209258 3064779675 +2481882246 1719312119 +732148255 1006411653 3592343599 4211672257 2489802070 1355595295 +3960691780 4164297988 +1580960767 1455252094 +1748967299 1748967315 +855595421 3313635204 +1501056878 1181026873 +1255525060 2458792576 +142328211 3441981462 +2255956506 3533976630 505717749 +3279410473 3735326606 185466009 +476858275 3388214643 +3533134671 3979743643 +862334198 776700039 +1764881893 2124814188 +934475265 2948154240 +4237857210 209347714 +314055292 4090605873 +1245543068 83644556 +2433619598 444353818 48507737 +2715164618 2675500670 +2873434145 3201405920 +136502675 1642253932 +3362756295 1764011592 +1245938676 2217858452 +2011513006 857048111 +404965436 998946407 +2698181166 849606165 +4252502970 3187307979 +3681730907 3500565060 +1727034665 3553074318 +743013628 3014639793 +2621044411 1708217727 2856282212 +2940548133 250680876 +1633967564 486516791 +2344380940 94040289 +440772513 4238795360 +1668250947 3414306922 +832027841 4024861287 +2334112132 2005478728 +486958238 902731945 +3123478840 1276078893 +3795669411 3381101450 +1798140355 2908510757 +2801306371 3268175921 +2444038587 585459816 +2183094410 1634007355 +1184755279 2040407630 +596752336 3462683747 +3043574365 644406512 +445947772 1794019332 +1709780808 3054857803 +3434538527 1699874499 +874957194 2735686715 +2985778487 992028265 +2612667933 1124728756 717057045 +581051049 775720974 1048314668 +3997529041 3897905680 +1649444767 1474780747 +2604173614 2281698150 +3681892070 1980311591 +2348652680 3895926301 +2836629419 2655982654 +1382535642 2449105802 +2073497035 3994905326 +3249975744 2996425043 +1723827867 1518396946 +1764812988 1409179623 +1703767639 883208944 +4154919981 150481604 +3522204928 2109378323 +2308631363 2724149515 +1756625726 290751135 +2655057148 744263335 +2341358100 3305020783 +3980054710 2613365514 4278345367 +1424545397 4282007338 +2040127240 460734272 +1869838400 1014971746 +3678890513 1114372303 +1813808108 1813808124 +80899385 3493982376 +2696697570 1518828879 +2183306746 1682457863 +2079947238 263906583 +1973420510 3163646466 +2522174871 1062583472 +158493353 1427394062 +1052433533 2184865956 +2871470767 497561966 +2347759457 2949662241 +971360734 3459227625 +2658149216 3397890099 +277380605 64902484 +4277668418 1717264726 +828519733 1443697446 +516049817 81592776 +2468463387 3106284420 +3333881674 1169596126 +4009185039 2400421452 1875530303 2292035944 +3252630198 3898397841 +3819599318 995590129 +425443327 3933159016 1964981675 +3204303704 3954200799 +443064140 3736257697 +3916370063 148312344 +1511084995 2353454058 +761451706 4250789329 +184547218 1209309902 +2902407974 2076843223 +2973181440 4191212051 +636103 3595015510 +3970587051 1951280085 +412804986 3519877205 +1740411627 953894882 +2935251337 1558758392 +949244908 725672719 +3046813316 1719712223 +761400422 2632695810 2201400937 +3879412237 253139570 +619798120 1496696767 +792212321 3061375414 +2281766459 2978850445 +2277329582 1560055801 +1508231717 3359156527 +1058260051 2669547194 +984417660 3663700529 +3628984226 614704149 +614704149 3264957706 +848811682 2400428578 +1070265958 4185371569 +2232195703 3923192144 +3880369034 2735880749 +1055132815 1055132831 +924270947 479981276 +771446501 1246346780 1913411107 +3248194870 2578540310 4258444295 +3182659271 4016772563 +4017406862 2194659481 +1899209965 2322085259 +3912908323 465972999 1236259100 +2598621053 1078699124 +3292589164 1294232449 +4012381753 3038444456 +3154680772 3314365833 +1836931312 4222345803 +252173300 3589503560 252173284 +2688786618 119756022 +2081252804 219624351 +619104289 2689196670 +3175693360 3175693344 +3422987550 1282797119 +1478637581 3403562084 +4181136994 3742073947 +3498949342 3465649410 +973608743 2435265540 +1749265174 2725621751 +2305202945 1300628118 +1386193178 292778741 +930888749 788665675 +74604031 1638683487 +25003531 1416842229 +1542446945 1403306864 +3023623620 2037941151 +128004347 4257225508 +428131944 1875128548 +543411938 1642338413 +2498726912 2539246830 +592865277 1651595103 +905603565 1997167685 3862216722 +355033052 3596564324 +2347048279 1842012994 +1687171170 4229377378 3757475691 +3705991012 543480425 +1675921669 1675921685 +3639783584 3639783600 +3274549088 3274549104 2967377219 +103895122 3559194861 +2492545461 2510149610 +3222149788 4063486855 +965572260 1035060287 +3621611751 3621611767 +1578347273 299453029 +3533381337 451115535 +1515299126 1153101331 +2948740763 1237054994 +2264837156 2800286911 +3120851725 3790898546 +493895371 864846840 +2099348945 3435505670 +2458650503 1571093465 +91881871 2033626752 +3708256767 3458595734 +2110970702 1510562203 +2242290934 1532342097 +541055308 3236994414 +4044504955 1454550078 +3318186355 1248520950 +2153139599 2531006488 +2124754065 2485023812 +3236194456 550413426 +3446609951 2229467336 +1073450392 1358947917 +2204536578 3698532387 +938667018 4111329034 +2338442821 2952246924 +1709784892 1709784876 +2297627311 1166883182 +1490930338 2267413763 +3175971856 284839203 +873924175 1329524302 +1594753120 51025715 +608516221 2516053204 +3825334926 3825334942 +366501993 3433022808 +1557626239 2519660348 +3221133248 3993584196 +2795391149 4293409042 +3467265211 285880932 +4092434189 165411737 +4146089946 3137511331 +3565126947 755387911 +1888541512 2080977501 +4182923812 2695095977 +3628742690 3628742706 +2683490912 982715147 +1748819329 2726842970 +543589862 3730397814 +1952302080 1810299441 +4101501587 1808981356 +2845662141 1337764533 +1297626343 1297626359 +3619445562 3619445546 +896788410 2372707398 +2155048918 196677105 +4003129303 2921428011 +1672021015 3648232340 +244802067 189752300 +2128173664 1110106564 2516048173 +402264452 402264468 +2035178424 1162030898 +3659019294 1914309439 +1786154904 816057435 +1285500910 2358801337 +1204013988 2637796159 +588829022 1963766914 +805862987 1694819894 +1855714142 3510479490 +2597596712 4032169539 +2421604684 2224179895 +841861729 1694253190 +506953204 2237351695 +2529404639 1988341660 +1230750965 1886850474 +4202431637 3862640266 +454734214 580432849 +2853590933 823191098 +1857132632 2576536205 +2008967806 2008967790 +4216881015 3891852771 +2594991189 3530459612 +2431569504 571239725 +1568170821 1770276250 +2905634643 1701086166 +2214864660 3867772015 +2804804064 2282335871 +307778723 2215459978 +2255076448 503813208 +4060843601 3443389405 +3463453521 1266352272 +2159365768 627744779 +1544393551 945743182 +3850256368 901686997 +3880038858 3950714111 +1501844 3210263039 +1383582380 1112491251 +1253433679 3947999064 +2815099197 2773785160 +919217873 289086214 +1665077902 4044623357 1896499737 +451165211 1883938436 +485166832 1980269507 +2402557319 3531631236 +3756276843 2898536339 +2066925960 3700779607 +399871379 405659258 +2233329156 605605143 +3140708607 2968406376 +3946403454 3946403438 +705129263 2440909932 +1175507023 829941425 +2271161803 1693472253 +4104242490 1420393053 +527361167 3146112204 +708379061 750628860 +1127485186 3531942398 +470339786 3957370363 +2422462841 2055856457 +4220226099 1434321312 +4183391370 1562498021 +3046183962 3982664939 +2894126776 1030689107 +3562512821 1674558517 +210690578 2735807999 +811041984 3653630547 +2434103856 3546939215 +1315678140 2895077233 +626517093 3949108569 +1384727962 2283311458 +454274177 553160470 +217528900 1664233220 +1682350845 2778691273 +3540861796 3540861812 +3414176565 3414176549 +3443835593 3963527800 +1331557635 4092113852 +3326122121 2695897016 +165638653 587268447 +3569570316 4219087095 +1153696306 1145545466 +2950141933 3177458180 +2459200601 413569032 +71642889 3253275448 +599301553 342898871 +324165150 4062988476 +1557445560 3672343227 +1891243122 3874369395 +1423210863 4185598382 +4142108460 3560596055 +3038946055 401878020 2222918655 +306959439 31830668 +1062471613 1850224258 +2562492455 2562492471 +3035310889 3035310905 +607620247 2591183280 +762924444 838151313 +3166335371 2759900610 +2397302921 1982920430 +3341738958 1734843677 +573692631 2876997734 +635775578 1578160354 +4042386887 2132366532 +1644218316 1800165334 +1901715553 2089633424 +1488627223 300096418 +3695255761 2868647008 +2084819510 3569609479 +2600274535 1666670646 +3320499460 1107950072 +2323627767 3528786292 +3292225500 3312969549 +1032606024 736359508 +4125735198 1022257727 +3124608171 3660579124 +38038680 3799568224 +2018702535 832001366 +1241195767 1834692816 +3849016300 334830743 +3651779832 2654239355 +3044763417 3044763401 +4290399816 3662232413 +1186453846 447162423 +145803173 1397377196 +1642711221 4243819610 +2921137162 3202836339 +3047638340 978455049 +4029907269 429260401 +2334522773 1908716170 +3769250310 2393991249 +1045060752 2668607139 +2861203118 1212928081 +2410589947 721253682 +2110616854 3336573408 +2957499705 3122741416 +1280741337 88371870 +3683308853 3498943100 +1165460370 3978567379 +2897813126 1326319354 +2354689245 104470391 +480343045 388604876 +3488705186 4211793173 +3696312278 2850520561 +1699600037 512288172 +2072915420 1877189255 +3738951942 3659742305 +575608462 4117989778 +1490666558 4048749371 +3877487824 2749158243 +267511449 1481540456 +492421657 1296862558 +401934073 2680457950 +1954699480 1093786651 +54804835 367920199 +1347861303 3284906089 +2916875444 1699663705 +2107655732 697929375 +4216725481 2442410968 +10994921 1534644814 +1681398376 2171104404 743543229 +790098848 2083750530 +3147990597 2782486156 +2681431978 2663984446 +2977758543 3066217294 +1472098843 4125599291 +500503780 3340907727 +1482715484 809234449 +1267600525 2107490802 +1612961060 2932201976 +2366220713 2939557134 +2204528358 3225457665 +537626574 1076283727 +3661708479 1404215464 +408492883 2366798210 +4238999524 2745029631 +4057074008 1661989041 +742467197 151671668 +1764674160 78163541 +2735245310 2758677727 +409325427 981788896 +248105854 2510829662 2344258207 +3616210923 2328820238 +2631357488 385451907 +950757886 869784287 +180895661 180895677 +4097233108 1179303343 +2949164268 4056260277 +2673681999 782454353 +4140475118 4010589464 +2216076694 2242292519 +570045454 2329932302 +660852134 2820455511 +1849568443 2810657618 +2523664745 4000395982 +547386421 2442588028 +336180370 2522631193 4130124302 +868758584 1668293317 +3935737103 1510778520 +2766236255 3990516638 +2088981261 263961956 +1145985627 2393238802 +4232264539 2027319364 +33069675 2237339252 +1088599855 843958162 +2014637368 2541536348 +752045850 2763720969 +2464529044 3550787311 +1765360925 3257388212 +1633118943 463289630 +1737743408 1036230531 +3316212090 2745463563 +2094626400 3931461939 +3510774737 1009449488 +1944534437 436603578 +1486471315 2049764259 +348572175 183631436 +3546449211 1671048148 +2969094460 3550792049 +1398359742 2063863875 +1539197804 4090916241 +2763384469 3747216522 +2733294127 1488020305 +3305511473 1062485999 +441569603 2982964330 +1962263125 2267499813 +4026564346 3282777026 +3908126251 3738269090 +2177435556 4084664127 +529063142 2322841089 +173936284 3994091409 +4267087461 3343827180 +1952033390 2535934777 +2900508006 1641666818 +2902873188 2902873204 +1197926741 3222416890 +3377901881 3228950302 +2474029465 679724648 +1972360889 3396273448 +3014455147 3755816344 +3430523577 2481056926 +1317813467 2177092804 +3280430084 3525472841 +496802365 3666267650 +2601051109 4093559162 +4091325436 3764567473 +1053411425 3892540621 +812320986 310308651 +181409908 1032580460 +3984457661 2589562498 +156956339 2923854804 +1178948486 4063268346 +2321065496 2321065480 +3663590752 568935980 +4160946060 2643138005 +4040574799 696049036 +4097981463 2604963878 +1685879528 401963819 +511659194 1597708163 +3052584736 2367872869 +4059745431 3007506313 2228228518 +3379668393 752976153 +2766670060 2235960215 +831283418 3657201469 +2785382432 2755093741 +3849118585 2652577041 +2837177788 4075464423 +4278574343 600503812 +3562465445 3436053962 +2754842328 2383956079 +3631462589 1811600894 +884076018 2298685918 +2876782977 1866630656 +2711059754 2340030733 +345682180 345682196 +4200944349 176255458 +2915823197 502730306 +1365431408 1043648370 +1880781366 1765120500 +1727216862 2754917122 +4239625609 1470615214 +3738144729 3695415388 2590071765 +784094561 61950413 +2237749194 3176610518 +4249509978 1797283302 +710121574 127461505 +1124980071 1371685477 +428233014 641143553 +4206467341 1680470117 +2852485331 2852485315 +335088064 822761811 +2528792836 2528792852 +2694009093 1128318095 +2665624657 1863867280 +1577011422 3604985215 +1746658695 1746658711 +3415877777 3551642145 +1612997016 4047872589 +1053655062 1053655046 +3131963856 3131963840 +2028537908 2303479443 +2624368705 2687158634 +963441253 3414267116 +1643199528 532539580 +1735550535 1910701593 +2982397465 2906536789 +1584940591 3864427512 +2812419025 3039939088 +2105634794 2093165901 +2487193923 751993060 +359191415 145975796 +953389203 399662848 +642430786 2308865251 +3406418925 2373492228 +331324319 972986536 +2917537334 4147443463 +2282379727 598307867 +547566951 2965575145 +4257341897 1094086520 +2023336295 1088793910 +4272816263 1927992470 +1108606223 3488213338 +1827262490 2383583485 +3976696321 591772711 +83168428 2042819265 +1003517854 1003517838 +2038845946 1215499421 +2667835926 2420617770 +1202747550 3738074254 +450314398 4197394827 +773007376 773007360 +1380693938 1060252965 +4107227800 1888835635 +4008393351 2739741334 +2894013099 925078306 +3593700017 3049978198 +2999349676 1307087575 +187692993 188783846 +3593515726 1246564434 +3557123490 2319127222 +2698984303 2926219182 +264100381 3960094741 +1781587456 720206355 +844110774 3927678865 +1223525776 1575567797 +1672346400 182604659 +4237807455 33256072 +3211406751 210269258 +3574748761 3233602027 +3775838496 3775838512 +2919345492 1084480303 +758135461 1347047267 +357848221 1191043569 +2676813467 2676813451 +1887952101 182500460 +1126760681 2970775118 +2420692646 3366578007 +1207935526 2104246721 +2106149528 924872027 +1019621760 738192517 +2477274017 230182166 +726039112 1103421936 4290674548 +175074574 1422421657 +3427295209 2486588005 +1333814877 1798067304 +3549508829 2350928683 +39314795 2502932016 +2617790445 2383794692 +2235454689 1841696528 +3262849642 2446798043 +2028720236 1880705739 +3121096542 3563857375 +1097336225 1520111046 +2775650990 520120303 +1179449708 1399784293 +1417843140 3448469407 +1908993679 2924448526 +2951900845 978151041 +2822719894 1906366254 +231664755 800995610 +3885867327 3053265148 +3839604400 4125136661 +922167996 2620796228 +1838539963 1358630024 +1717771651 2970055978 +49202671 359199041 +739070212 1559660895 +2044368496 4164492235 +2123993030 2752273425 4202624186 +2659393598 4204907849 +1727941643 760329538 +3744573331 3995782252 +3795256657 1839029894 +234728502 42558999 +350251483 882276837 +1416729294 3167361625 +3906871986 1202757171 +2233743612 3891476140 +2062539942 2958161902 3294323553 808046007 4251404299 419380646 141389634 +1171899115 228308697 +1808465488 799831814 +3522204938 2277154477 +875074187 3224854585 +3344023372 2271827099 +2851231055 2427100044 +1931982540 3674156279 +3757613858 3060321941 +2037272658 2057859333 +3166860347 3298545384 +1139912654 75845465 +1946457808 1933142389 +83325354 1641321372 1306063175 2180426021 3910460587 2423951 3273177840 1692437185 669099604 +2438694083 2517761788 +1733127443 1980543745 +2795671120 2716207075 +1911981594 2165644029 +3203283079 402848896 +2738266242 1895738549 +2897635829 4063899546 +3673398835 3766618714 +3994535416 1294081664 +3815203895 851624582 +3289318018 3747477149 +1768910270 3093938697 +2874518515 2384077391 +1577693948 88392359 +18584284 2590519377 +3783854493 2813993524 +722899376 2223462403 +251905299 3052354796 +1855669583 2682332134 +689063565 885329892 +2805494730 132007675 +1150424915 3743205043 +432925898 778557043 +294523512 447156987 +4148018339 3643798666 +2357642990 3304131439 +2713320827 315230372 +1839836244 2158284296 +2020092297 351888046 +777741625 777741609 +2398092340 3824395341 +241617830 1372755521 +795676334 795676350 +4267414220 908597025 +1650152451 3502433622 +3591325376 3121373267 +1891393986 2489224745 +2830609136 3115027096 +2590985119 2144318785 2223077194 +1076722792 1841405571 +4163058043 1204631080 +3114219398 1671245273 +4235649871 3190281550 +466107441 3979788592 +101590851 3410480746 +4219455756 4129914359 +2745324354 3905262922 3666415843 +1744004881 3039510480 +2345294525 3431782274 +3975308163 2224203580 +947966732 718260150 3932466461 +540370140 447690691 +1293846896 3608304469 +173851648 1342737427 +4066463777 2956010486 +758428420 771084127 +126823785 1227861720 +4267184274 4137817541 +2725948013 318481567 +363514983 2195703328 +2193496982 3175799474 +3974259365 1311184406 +1620453094 4066327575 +4134116317 1716664276 +4082791778 2036779349 +1423599935 3537088040 +1195474268 2283296711 +1312549909 1028957468 +3485107188 4137531673 +302967055 2088297102 +1901905573 3154252746 +3548933457 1058616909 +2105062720 4083345981 +3518261692 3674370808 +1111773770 2609744493 +1415271185 3475225347 +1079954098 2086470027 +3929556444 2666918480 +1117933479 2357421024 +1471342992 3526386024 +3888361109 1846269066 +3918397798 2864005555 +2576886834 4237136549 +3572807981 1782546884 +4184400050 1377417267 +3929601869 1829930691 +559732766 2468879897 559732750 +2632015299 3116800490 +32486443 928554932 +1620697612 1720470190 +77566054 2905624734 +3700166538 3128718893 +1067308136 2373279677 +1283301453 3694703008 +2513843467 3946152020 +1078552384 1938655699 +2562317524 1083613625 +2802521461 2802521445 +2187532592 134624847 +3869300839 3869300855 +3955626497 701388672 +793762989 666395716 +2541789292 3054321559 +3933411028 2830984843 +1914802249 3812099551 +3018471490 2075561973 +935441764 935441780 +2932474957 40923336 +833542563 3644890012 +798790188 722327654 +2881657957 3361485548 +4003497378 4144691593 +2653258206 2653258190 1865121995 +4106365792 26024280 +1075214234 2103330685 +485166838 2080935249 +4218297458 3147561498 +2590462625 537109190 +2755409279 164116222 +3578032574 2025786889 +4232172378 1973401250 +2287067444 2770656667 +588000719 4213972174 +4141503643 4195653192 +2050593239 1067488614 +510797807 2830647099 +4031319642 658166518 3565273634 +2454917840 2712262895 +526857097 4168491192 +3183280910 85390489 +2280730638 246326790 +2831314510 4162036943 +1356688937 1972660888 +3185455412 415724751 +2266503638 2163256295 +2915965277 2304295977 +1158793064 586999997 +219939807 3608401034 2318250465 +256839188 762521968 +199321207 718556496 +415530324 415530308 +1717335446 3113032487 +3657353415 4078309718 +2344964878 362921753 +3297272820 3204412820 +3156080267 2922060994 +3817548992 4272332920 +897380243 3333235834 +1271774821 3118643450 +883257747 1936837228 +317502205 3349005396 +61006088 4019112796 +3367904281 475190110 +207034907 2350439995 +218685376 1157118789 +1396149337 710553944 +3723764193 235480070 +2136494480 134768053 +2514871884 1156155809 +1273362391 4193168518 +2585513493 2932173578 +173579331 4151070065 +4227820583 2996562468 +1154974106 4181788029 +871916522 827488851 +2908865599 4174308448 764450369 +1109151868 2391978791 +4201536747 680627119 +960922517 3204522908 +4203589200 95918633 +445579902 2206832043 +3962419262 1376396617 +2324224953 3463570472 +2096597341 380452194 3876775783 +1265938530 716286531 +323280747 1569629592 +4034214650 2190202781 +620517230 1963347961 +1514853029 3368655290 +2615812026 2615812010 +1474281293 2542413582 +4293218111 4293218095 +689585296 1946640239 3611808612 2275853852 2750191276 +604329327 593853880 +1521288740 837119024 +1463578343 1521565018 +2651973919 414834518 +2214914566 1056418441 +3853288586 412394811 +1078232735 3403672670 +3044494055 2445994400 +3415530817 3159903574 +536644398 536644414 +3023874784 2608922277 +2204806330 2877649222 +3054405766 518056695 +871338512 617037544 +4061952362 2362647003 +3818311022 2274991920 +3451347196 3551374513 +1554886322 217841401 +3974910724 4228296521 +3479630612 924279968 +423302000 671062357 +4261565591 4174678883 +2409626094 2409626110 +3852281169 1844053871 +3272665609 1760735020 +1228430635 1857727138 +1058741629 2452005492 +4163061912 931874637 +3690647155 2933056970 3690647139 +3783133681 1783689856 +3158326752 958490547 +3236838334 1963461641 +1934910535 649226687 +4165746235 4165746219 +221763810 2968153027 +1339461464 2199207328 +2401343712 1023346359 3441257853 53951748 2527498679 +605058953 1324100782 +3277717055 1043678698 +3613552941 1022896594 +1263360690 1019594291 +2129800610 560583681 +610238339 3790978928 +2600720943 401400248 +663344604 435923281 +2629207166 4294731085 +3776460783 3262435116 +2488629577 3683518216 2488629593 +1150301090 2432780309 +3213239875 3183977510 +3855595089 385614224 +1325548567 1770969986 +3029284483 3228749866 +1739657758 628609434 +2693386591 2693386575 +2721828883 1763494449 +1625125202 3466159135 +2308210552 110592019 +4085615926 2436713486 +19870882 1840629181 +1439996678 1439996694 +632502750 1221757357 +1359569145 1812033154 +3388301712 2101908917 +2700351155 322943948 +1969455350 472983767 +1779855917 777370834 +4096293452 3027922772 2813887927 +3518633417 4042279800 +4184617302 4216433265 +3658341369 1020348648 +3616721013 1101391616 3507589180 +731734360 3147883749 1128813676 2536162208 +610962019 2137781584 +3093761100 582502753 +2654253697 2381644054 +1374228424 3118716875 +2135785256 3348711114 +3349744786 2645603991 +4112725182 2758543113 +307616966 2465853713 +90931917 1430186162 +2493057850 2493057834 +785344475 2340453842 +2682765351 1290690084 +3085839757 418493668 +1855075596 472482273 +2683641337 2495866613 +2023547256 3552293381 +1164064216 295355163 +3913708721 1944337216 +2731368371 2731368355 +682601014 682600998 +1491408655 4288892046 +2571601459 2123907674 +434957741 2096768836 +2780388892 823717073 +2976930036 1012975019 +891138102 958361662 +1409245370 4110763211 +4133499026 4189461143 +3433335463 3456517366 +1555578934 1603803671 +3301683435 2042530716 +1546586418 3104873241 +2075637007 3509716622 +3744267524 3744267540 1741842031 +33964752 2944616232 +2456792779 1355819412 979598389 +1428706094 2760511929 +1305046948 2303117521 +3317475015 3714663394 +4198845399 3821984688 3805207082 +4091835765 1705305898 +4023248940 2904849729 +4193760878 4008980281 +3015914215 1814032115 +2456683402 221221421 +1016708727 2523968323 +3156313003 3552724514 +1374411371 1632163444 +3273808108 454163351 +2023266354 3481421511 +3813468770 1073926525 +1869787742 3482241513 +2644527582 2326662410 +866975247 1750331790 +4248307475 2989695724 +2059413115 3078394797 +3449424098 1462588395 +2660650612 2668924024 +3955322366 2319170000 +2764804547 2764804563 +1677343131 2347338383 +1416560167 3112182775 +3879650059 3972481582 +1025427591 1396608388 +1131089654 394825031 +2552819714 405070614 +1274024936 4103899818 +3234078985 2109735224 +3623141034 2689082765 +1711488760 3401159040 +3977533985 2746400135 +2915033633 2786130400 +568441717 3024501239 +2570592740 391993833 +247284068 2548953215 +1564561539 1355922986 +1581869860 2442373567 +2044638568 1100452541 +2557080784 3502281003 +649849708 1708366615 +3924905316 1654808911 +1849105594 985807069 +2343521041 4126354374 +541076557 302365988 +381113532 722104564 +1472628466 528903909 +826057154 595118045 +2710335122 2710335106 +2874220361 4173369541 +2372719485 241584245 525397442 +1213547608 909809293 +2884731193 3861802152 +2323419685 3355937610 +2340878892 116232001 +2588518948 2588518964 +3341672732 2839109393 +499171709 1399887810 +4144599349 3716794573 420451946 +2643810531 4112182613 +3018729275 2062008818 +2120926632 2853513085 +1313691201 3160749840 +3456538519 3948978864 +2236006036 1650328303 +878813509 3132153740 +3728338324 2434987240 +2582461544 3094747051 +3903734149 646556793 +258598926 1371033113 +2606476747 1548916354 +2108906979 68972390 +1706131266 1483429091 +1545161092 2144254687 +2761488585 3855590510 +720598498 2135069397 +4274106311 2948851396 +2976168658 1643949947 +1667411714 573172110 +1199860276 3379769295 +718933603 3628377546 +3101258611 3101258595 +3220545581 3463754651 +2425664607 2830186763 2763076303 4179095944 +1391991804 2559839655 +4124267101 4138144322 +192519786 2054447323 +3249684326 1854470121 +2307525595 3489349534 +1887075973 917688940 +577112396 1923130017 +881804836 3784010409 +2121907379 3433303514 +3791540272 4082645909 +2788701805 1350924379 +3353150734 2934895887 +383990421 2629122186 +201699191 106299177 +2953420879 3220594331 +1154003791 4217581528 +887859904 251513939 +3135523115 1775666520 +1904674422 764357575 +2530014176 1151592883 +3007093822 1000588322 +2504801003 3954895253 +1701121414 605309409 +1770242479 3379160696 +1811746399 527648097 +2664492781 3787618458 +1643934496 715685883 +2770938857 3905953752 +1318474590 346373353 +2015146253 573224804 +4120086140 2039561255 916003769 322745649 +3366780197 223510828 +4041218897 3226756747 +3087666335 4054845150 +1444111103 1821424026 417984577 3136698387 +2763337821 3180086719 +3761680030 2484396735 +1036947682 1971919869 +2627701300 246706825 +1487035232 3885357093 +3678269275 2105527364 +299342293 3949406812 +3107774213 3107774229 +4165219463 1611737817 +332597504 892807941 +3719526464 3719526480 +1546700015 3014785040 264635438 264635448 +117365060 1194329631 +966675570 4118870240 +3420139378 1544269939 +1997346409 3604889560 +4072846567 260229046 +1943695471 97222172 +4011455352 3722069499 +2017287324 1837453137 3118193808 +1557190891 130382306 +66681364 2924782753 +1166872726 720327030 +3873101243 4255233157 +3065849999 986110222 +2027053330 1160695621 +3732518576 3546011147 +1490788097 3803926166 +597845258 3621886706 +2997822455 2917625460 +3900532715 1502953567 +1736993059 1138091445 +1094001259 1094001275 +627255092 253146841 +3729414587 2852864365 +987346979 987346995 +1067595414 3363432759 +116290981 2689621076 +2009435817 1884684069 +388166951 2466770038 +3067511312 3819880227 +234620133 3648855068 +877708336 2617203023 +2493075489 2493075505 +4020502867 2452493740 +1057122979 3871256442 +454649339 1224373928 +2086943192 2848395035 +2002548183 2002548167 +4073483341 2228124964 +2075637005 3476161380 +3311935022 4041704047 +953924801 748055024 +1716559331 3823092445 +1970933161 1567794271 +2527085689 2538326632 +1821367134 1821367118 +33682293 2651996476 +3574649679 1788591590 +2059237025 4281047197 +1954155549 1954155533 2032210356 +2612667921 923397328 +2220785400 4248129920 +1645264376 4204060956 +3579091149 802687336 +490334836 3188551287 +3150736108 824726904 +855554212 3267778526 +860893968 928103943 +153079199 4228952414 +845265515 2529327256 +3568441466 1722427733 +907867261 1885196660 +927785398 3288813969 +2057308578 2884577795 +223181180 1828077095 +4086260556 3065598113 +2185036326 738877889 +1969679820 1710482648 +1807138273 1907157302 +2521524496 2830525493 +1421031207 2099237494 +2994654586 2006808349 +2302230854 962884922 +1634592823 1745674089 +1187846875 2208458398 +3836180799 849600062 +1094673950 3570254143 +3875726039 3405215828 +879544164 879544180 +1932897646 3414164537 +840479885 1776564722 +4088104733 3020272308 +23314568 3087537693 +473459167 1271835166 +1569997153 2976050102 +64297830 1967312322 1853497739 +69439359 49997054 +1329919768 3784374989 +3776402919 849059539 +3354736404 3674584185 +3059510745 3967872136 +424530624 4240419443 +1122040432 718053880 2769821859 3360020884 +2778419043 2778419059 +1283759124 2294395769 +700995233 1734369142 +724350383 2791441016 +2879091428 1336321118 +2679120265 2475817056 +3084703780 404426270 +3053034591 3852755210 +1456690068 1118605817 +3724669212 3724669196 +4135872014 1100706150 +3419114322 2073728582 +672097373 1832582754 +3686665429 3241030474 +1788619036 2059202166 +904931406 923759321 +230958643 3737657946 +3247601895 2694075296 1769972979 +3175123541 1100596188 +2796344091 2098221970 +2171000274 2262997402 +3164369711 424235758 +2318553769 110739173 +760081573 366402679 +3603341607 3415387488 +4084582620 510341713 +3566136768 2892827532 +252298963 2137259564 +1166153377 2712041223 +2246811694 4293732473 +2770480894 4073716191 +3309381893 5254442 +149168057 3088969768 +1349253404 3053004561 +1136352665 955537374 +1173533260 2000318835 +871246376 871246392 +4223364883 3574044759 +1284969977 2329384680 +3338582960 4076959235 +1953918339 3269490365 +2091745940 3448574463 +2668582081 1365423289 3361245934 +3117834288 4261680870 +560257944 2046113980 +821685749 4136566025 +1478969409 114736704 +3292791413 1190837274 +519291959 4038976134 +2040861968 4078520219 +2657853795 3329167050 +1883075931 197115460 +3476155280 3938594132 1858860904 +1642055829 2823340700 +4171201930 3977420845 +2294878880 1992595736 3617123195 +2591849646 3757590009 +2283223175 1485077906 +1417764335 4138131246 1417764351 +3326122143 3065004638 +3413211340 3149119201 +2430606034 3804903571 3231122249 +393704081 4206435382 +955550309 4094352796 +239088890 4102609347 +285982736 4147297723 2155443384 +976015612 2425158823 +157696656 2160719083 +1274359187 1638814660 636927600 +528989667 2242899036 +4192873323 3600963956 +3292794998 1831201233 +2784753112 4139104817 +2217705805 1569433320 +315319397 4214164204 +3620241389 2644599300 2644599315 +2470768089 2870890588 1876913215 +2519338123 2519338139 +73200838 2757055393 +3885540661 2361669523 +3724712971 2300290388 +2859593514 2069593883 +3534638481 962861904 +1967496630 1385645457 +129355027 909235450 +1683782778 2007794412 1856795824 +3068973939 1775296012 +3098718415 2849909809 +1517974638 3703916847 +1311538184 403128468 +788154502 2046831329 +2811124736 3306869765 +994600020 1589817390 +1183715070 262248927 +817735344 4078440430 +3336287561 2215912274 +1013103981 394087044 +1943054408 2574838091 +302198509 3558947638 +38405991 25798454 +2121556909 4104190966 +2391160055 1413832912 +837196497 2550077482 +475553894 85966999 +352425598 2407524425 +492081735 1877601971 +1102820980 114888551 +1956984803 1956984819 +1248751619 3327457370 +4099459997 1153992756 +2064658503 3740304748 3208765181 +3738649943 602023910 +596359361 2258626509 +3382686116 4098181156 +1561182827 2738380186 2552829358 391218536 1681641528 +3990718544 410194091 +3140532873 3455308014 +3060711130 1897146037 +1975383622 3973348410 +3476029885 3851598996 +4075415663 3577276088 +3365908525 6444754 3365908541 +3316090121 800484664 +717964173 3685342948 +2366760043 2116719732 +4015095318 3544808622 +2717949874 3136484905 3352984862 +3394463770 3194895483 +3877020825 3877020809 +14519025 1304541552 +780958081 1852946814 +3918191298 1737908085 +1689113670 3282381345 +3099183215 1402344364 +3136625287 3604529792 +2305106461 1731507124 +531263025 1523355862 +3424096420 3179270355 +2264944956 223339761 +4262321106 3251702675 +2206147736 4240563899 +760827240 3415530155 +1985365813 247230156 +2804030635 1828537560 +833029293 2643776863 +798922390 943553582 +3075412402 2239106580 +3901541518 760715801 +1089823871 814264303 +1272662663 1169595609 +280212033 2346818655 +1008708638 2642610882 +3708976337 3708976321 +2182278065 1959331750 +3576260267 1597941035 +188935063 1364778662 +903598723 3394352675 +3574342734 1576259794 +2624710183 2186487890 +3891098542 11940338 +82289328 1755650819 +2095682548 2545150223 +4028526636 736793943 +1859428017 1261924106 +104352288 3936137317 +1151790997 2815109002 +4012865933 347887858 +1849863682 1274605508 +2596761309 760988354 +898582467 328071146 +3022361594 3022361578 +29064297 956617157 +1098326112 1854404403 +1925998732 679389511 +3391656746 1742711579 +1912583679 636788741 +789621234 789621218 +1990262564 3815876031 +2942604595 1314316122 +3890095222 3379116118 +982218737 445501552 +1211378441 3005202232 +1683831397 98241930 +2205682283 453593231 +788695190 2533164081 +1687282939 3589049790 +1676509247 2164627452 +3605922728 11518333 +1138420195 3030265948 +1788315622 2995449601 +2525178128 7971875 +2895254748 1083405412 +314864614 1900180225 +2050160755 3510443290 +768478295 2765945770 +1961730089 2367438734 +1262561970 697710131 +3372587042 2513337749 +1766431788 16122199 +3452701471 389382622 +2701680968 3358663755 +989021837 1509429243 +849948134 2790474007 +3749994172 302225201 2573279719 +1764269686 15823815 +133857362 4024380414 3498684666 3780641043 +1146353173 1146353157 +2978463688 1085466589 +3909189094 3426158629 +2290446842 2483085013 +2460823309 3075701588 +1402673957 3839343708 +697172944 982515811 +3862751661 3277615797 +3864653924 60124521 +3677540418 1392367605 +1426935949 3016083320 +3141739577 61998526 2403273246 2403273225 3558812975 +3903560033 3510380433 +3592280633 1241417640 +3793190624 3405560499 +3819997967 2112546961 +2179605991 1788455606 +1264179012 3798851615 +1811625707 3883365364 +3287131750 328328113 +2978965144 482247003 +693909538 1658271037 +1667176462 2092097039 +366743740 627988465 +3112037729 1648144310 +2137569432 702191437 +2630045857 1752690038 +2563639585 41288327 +1966694555 609424388 +2533164082 3796736677 +872807520 1164725043 +2398881645 2931693480 +3599652086 130686166 +907172883 3099462381 +3665454233 3665454217 +861492953 2929964936 +377280553 3129439296 +3471581326 1270300569 +3713844005 2651271980 +4099111853 4117657779 +2347366069 4132396796 +2213515927 1079442690 +2435689486 2435689502 +1015018873 3060755838 +2575739198 2959015497 +3303007681 2910236374 +3033578067 602564525 +3441714394 1496426569 +3988874406 546663409 +3309420649 3154935615 +2180686958 194042169 1527109323 +2871488534 2232775345 +912499730 2214723998 +348379718 4132477985 +332680428 4230723045 +3920002580 3920002564 +1795014229 3262291914 +2018245225 980151889 +281996315 2428350084 +849073277 676298946 +3484866876 4043158307 +2347875833 1183715070 +2561178237 3459830484 +3059917009 3997378822 +2032314061 2123142322 +1285070568 456227658 +1142400843 2084330260 +392591115 3779946050 +1505587903 71017150 +2261784165 2327531258 +312434404 694062799 +3047696991 334013800 +556844024 928290949 +1781728463 4249915854 +1760522995 568588384 +1398980440 3395313680 +870617353 3117437230 +549307839 1237207998 +2112341646 2789149944 +3561946531 3113771793 2563275318 769908149 2580052940 +1948866553 1948866537 +1868966067 1868966051 +1473295363 1082876074 +1397585443 1173420298 +3657300954 80967723 +3955264513 555509120 +710433554 3636980155 +1299443352 2239797581 +791595100 3984027242 +1663523286 4058706049 +697433531 735210866 +4215240128 1155947859 +1447720348 1932993671 +734209300 2542393152 +1150396304 2756444644 +4126227368 3535858027 +1682299522 1758236298 +1559283136 3984499596 +1903246873 3023857406 +272834549 1168956390 +2228692438 2321526737 +3791272298 652763611 +1710257039 142993934 +4239740488 4239740504 +2995767500 1616666498 +318605682 2177274212 +681592049 3846997872 +167051695 3165319675 +3082177717 2898112588 +3436475094 3436475078 +3737032648 1846079453 +938832792 1663570490 +4140729169 3625498768 +869009742 302497450 +3804547417 1422456606 +1574203307 4256124878 +166953641 1398190094 +400008017 3648395398 +3880803441 3285959520 +1770277203 1849650618 +1987338257 1420133793 +3326211749 3201779116 +1020496060 1020496044 +1103797315 3572759914 +2943992944 2897230933 +2472404653 3896062151 +1780068876 309545207 +2288673138 561466709 2288673122 +1371554718 1336570303 +2989688799 1700094984 +3683764614 3962575863 +1220969850 176430877 +3129804304 3154152227 +2367812334 4233132716 +2571008609 2571008625 +3056172169 985475475 +4189117713 309061760 +1056609351 535982966 +508816759 891212358 +3473060564 1933259060 +2841929903 584356923 510678072 +2988231221 2555531626 +3003838068 1312120985 +2176302734 3259038105 +3852542303 3685189768 +4166739521 1136503527 +2501224304 2501224288 +562928866 3018717123 +1672168322 1755006389 +732773131 3434345026 +3799297359 2349904795 3433878360 +269774797 489422756 +2336842946 2336842962 +216832719 3045249732 +4178106114 1377509149 +3619997976 885081676 +2624768561 2041858854 +3801443218 2763042349 +3720337641 2883651150 +2138571033 353704477 +3094119161 2365468527 +3138390009 1933348072 +367814151 2317655318 +2002376867 2238711946 +4021369642 1966556037 +978268238 413731545 +1288702788 1288702804 +2190134105 2139608616 +1624450513 1029998608 +320535693 320535709 +3004637223 342334838 +4036269402 3685568771 +963542822 2398234817 +843354387 2579224715 +3254122335 2833725202 +3493547651 1348245546 +1167761381 3407100019 +3874844674 2522829621 +2566742648 1323434724 +2485118272 1138069261 +346669545 1882997208 +3159640037 1571630458 +2661999329 3120060420 +190355614 2054701225 +1594321797 324170684 +2570917842 221020037 +125299356 1573278599 +2796389471 1269938861 +3347611956 2616705416 +2980129331 3551882828 +3840298073 2945069086 +1939954676 1072233055 +2664198080 636174156 +2207215633 734882512 +1046662009 2928037758 +4237275859 3234781283 +41171913 3065795630 +1870748594 983783717 +1309235143 319651517 +3200276976 952997059 +1218833857 506808022 +1299902372 2447928728 +199480084 3416606831 +1042938379 3876888404 +2405655513 2457218718 2457218696 +3547606772 1594158740 +1406233032 3051207395 +551010190 1101171855 +2699962571 4088756156 +66365914 3841952181 +39576860 4031811528 +3905454581 3097274768 +1855454315 1715018261 +1533939278 1862603690 +1920050440 820431771 +802289726 4040515889 +3047824731 3047824715 +2446055176 2346942859 +339385370 4064525565 +244103232 663096524 +225945267 3864751052 +1600935550 3045861471 3045861449 +1290569743 660221848 +3767756308 474112383 +1149321810 695953171 +4126149024 3370067699 +3966262686 3886528959 +1639856962 544688373 +2920803678 1571459545 +3208737123 765895027 +3990062169 3026302607 +2813078276 4161255263 +4202727489 547918726 +511126738 3348860549 +507322212 238584719 +33843287 2213560550 +4249412579 4023545729 +3652318572 214639315 +4185281781 2856828348 +1266477812 1266477796 +3281332314 1036944829 +3462047299 283849015 +2512041158 2062193591 +1642978668 1642978684 +1929281096 1929281112 +725366465 3502911958 +561875991 242180995 3483600944 +4199521646 2035602479 +453717326 2334725637 +3127780305 1780934061 1629935485 +1575144439 3272021446 +1125272774 1540283297 +2462240617 1907130958 +3112231020 1185382273 +123459609 2929012574 +2736996038 2736996054 +3838102625 2194521270 +2626531209 2626531225 +2557721098 137223597 +63854305 3738354751 80408382 +2115731400 208577228 +2817218676 3439098488 +2372262067 2739942772 +1320622313 2437868735 +2688481236 387981999 +3214307335 2698140438 +2574903795 4147268834 +56134650 3271198914 +3470739257 1224172830 +4207342785 2285063104 +4256413051 3706106034 +3457462591 443724028 +2297376718 528404303 +1166308938 2303181746 3112580731 +2839546559 785443518 +38031959 464037155 +170749596 1155847278 +2721857212 2735951463 +1973078655 1973078639 +2899480736 562665837 +771360842 2862287986 +994809807 654310104 +3596352358 3780427953 +2478228202 4054677377 +756477181 4162261588 +828959796 4230731216 +2683596411 1221192612 +1066828975 2650738820 +88105716 88105700 +263978577 217049002 +690648807 3034131872 +3010026203 1239025362 +581389693 173997012 +3765801519 2283085806 +3074934184 3074934200 +807436688 1395389859 +2973517660 2675120145 +4173845613 1325615155 +594532835 1065128135 2886991964 +945436781 587649924 +1411837082 323384957 +3729934085 8768730 +1108773121 175746198 +2094251064 3757760051 +1519018396 181325686 +3208573806 2115581497 +93044089 1385063752 +4168502611 755316451 +77615851 862095330 +3155523533 3804993458 +1289306314 3288399341 +2810811793 3275388759 +1625505413 180054860 +3433905300 2400635052 +2262738552 973509057 3283594308 2536707081 1061246376 +3626694091 1288794400 +952378286 180628205 +4245709735 1259923564 +3240623139 1960123655 +3326118578 3382335013 +3307679460 1085198591 +1159505734 1359513836 4280923807 3202586326 1409954663 +404733770 142113094 +955791095 2780726982 +2184371244 1360949147 +1019667489 3917436023 +4176986184 3889114715 +1015586668 869979777 +3241148773 2207396346 +3443792414 2149868440 +3204273410 2865549877 +3612656510 595802578 +2516861622 502669441 +3884755097 460155080 +4131404795 2719902756 +2939531097 172448296 +175122720 2391850355 +1892001544 2401628555 +1586774799 4066742424 +1964843730 786288773 +3633498984 1461073085 +2906615762 2363295643 +3848235947 3224796724 +4005432828 3455298118 +2567027794 2567027778 +3879070465 4209046144 +2567653336 3398266739 +2579188553 1255637998 +1191941411 135847440 +382960837 3019506202 +4092753754 1622270653 +3736338841 3502867349 +2956787380 214842121 +2297774720 140919588 +3240027061 1271662355 +1333042428 3365697200 278077617 +2295916082 3020831181 +2236600063 3684883304 +3296333487 4213513582 +2659323 987821106 +4022774970 801237213 +2190282799 2190282815 +721044031 3874900264 +76277816 76277800 +3869998958 2381945401 +3690920125 258052482 +1225477182 986252681 +531504033 2955688291 +287989615 1957968814 +2822995295 1026271754 +2000680256 952432124 +3035473528 1243418363 +976638576 327403093 +396942995 1293273075 +2454527165 2454527149 +1501514485 1629248915 +3653796623 3852882062 +3966805353 1881377477 3051981824 +2253989335 1431736688 +1690400688 1284467221 +1903246879 3024407262 +1805253559 442974480 +1030859585 293790183 +3517197558 2460192820 +1879333286 4242088001 +995818589 3443213940 +192678019 2537645628 +2328410198 3386415317 +2840098530 954139084 +226214859 81082498 +1630065529 653344753 +433236872 2234985559 +2837870237 3834427700 +1551774986 2762833581 +612034358 2233422089 +2014520988 2720384913 +4107496168 3389997264 1355893547 +2601668618 668204973 +845188137 1996268696 3406393471 +1760349573 2982643802 +435520409 1987979720 +3443716908 387009332 +4251170213 2297885356 +3359422080 1685797816 +2691310726 219643639 +1042119455 2407358881 +93789125 2447423258 +3835499029 3694421178 +948828406 4252953425 +106486764 2954405632 +4127351947 3502524098 +1499706510 2953626127 +815220494 1593413775 +91001262 4082152505 +3623953233 2280082509 +455406683 563014834 +3647488614 1471359386 +140580307 886998614 +1852027149 341690468 +2402991687 3209943378 +3707252373 1873892508 +4192323955 3513786394 +400249131 3417657581 +2299591468 4055590465 +3405152137 185255086 +285859333 635726396 +3288149146 2950089835 +387025138 1826603576 +989071137 3170499166 +3279568722 1602343733 +1289121231 1105568603 +163744492 1228976535 +3505279734 2276264716 +3982883562 2377195839 +1100102244 2637294432 +2455221903 4279532638 +872193221 2611661324 +2251809763 743221968 +2180005314 226214858 1328625763 +3898426732 3898426748 +3231417951 2480179102 +530723290 530723274 +397913074 1210297843 +2017773934 1523867850 +2517722916 2517722932 +3192588530 2717486661 +2740111190 3219648434 +4025003380 524881295 +3452898243 453819062 +3008287500 1894956556 +3627847289 2885422575 +3307729983 2632285992 +3893440390 2344485370 +3529696601 2326727432 +4159149201 3169521206 2617728785 +2803183257 2673367752 +3532614651 1925643314 +3154200600 3658613607 +1931972020 3844661769 +856286832 3365257795 +2220565651 4001010554 +105785234 2131249875 +745810267 1440553554 +2983960382 343139423 +5357955 264687984 +2715390998 3749977777 +144737191 1001340896 +416300396 2077274369 +3024475902 1173109346 +799800220 1916225757 +41914303 2916043198 +3123877134 3169048207 +1358718582 973728169 +3542862372 3542862388 +4055026913 1673221438 1568179775 +2893608885 929952252 +1599458504 1280857571 +799334815 799334799 +2623777965 3723023428 +2352910832 3061824707 +3248954413 3070490898 +590988288 4247995232 +4169537418 447286321 2051760278 +2199021812 2431511700 +680867245 3575737874 +807299138 3551277661 +2130296970 951490310 +933600610 2209496171 +942074327 1010965862 +240029033 4004027470 +2080900818 312654995 +1008366910 3685126281 +1223435243 2664349198 +1662069126 2047106551 +1682339142 552246561 +3066840740 901454991 +1253577751 2757293175 +221167741 1033438420 +3053637348 1245878756 +3477150265 2930042124 +896875186 3649791525 +351617437 2601929259 +1410161676 1560798945 +997806378 3388654861 +409148633 1023830408 +706622968 1166996836 +1844176242 839724126 +264606220 1589682656 +1443759227 3601382662 +1812041125 1951242905 +4159433667 4159433683 +2218655435 1237651149 +1662191066 3783171978 +1224497643 798791592 +2409673905 828930902 +3498315329 3780815133 +3240234386 2593873093 +2626735462 4245873318 +1452347459 2304547178 +3028458821 3961721923 +1311531650 1227513065 +709738755 2607208362 +1460176876 4000184471 +3663028517 2090498198 +4001219564 1305202432 +114200220 2095501639 +3028467136 1485659020 +401653904 1073685155 +3714342894 3544066226 +3449313869 3449313885 +2601769236 876526191 +2333238604 3798582707 +1370347660 2982096612 +2343024956 352885095 +2924854239 3916450972 +3286458431 3127697921 +1219592795 1219592779 +2557420208 2800982787 +3579002552 3579002536 +2175472800 3226564581 +518434885 975776950 +3869554686 323855561 +1414540761 2469932190 +2697884732 2856981650 +1739716882 4090869691 +164960716 3486942108 +2610705916 4075355047 +3448372339 3842612151 +111115361 3457207478 +1392030092 3233126548 +2067485861 2741387180 +2443019764 788127503 +885122731 3091078946 +4005185314 3906396397 +2627212703 577374536 +965845372 2879934257 +580103991 2776421254 +142422658 3547309725 +4249581408 499969075 +3174678189 1206361861 +1036124658 1723139550 +1449054009 809514664 +1327136244 3690664852 +2606252672 1743712039 +1854221194 2242087469 +2705662214 1109618513 +3208548025 693621897 +3654703234 2031893643 +566489971 2591571482 +2554700672 899703429 +3544420024 1264167844 +1264855225 1911480990 +2063640232 145407035 +3114225502 2479485183 +1111772032 1111772048 +3948392031 3251487499 +1742947634 3734319323 +645514816 3790395404 +1140109918 3659136105 +3159275626 3656142555 +269613689 3310177406 3310177384 +485626402 3004337027 +1266035570 1023829093 +1757511156 3701032729 +2117839368 3197146420 3219958429 +3721191774 1912432941 +3592626059 3655415275 2129144994 +2989590072 751812780 +1549410719 14871902 +1950096480 1723168927 +3144308830 1014111742 +1960236579 795903750 +1189596782 216659769 +4067145845 345202730 +2422209190 2468147697 3173877841 832234586 +3697512898 1819842510 +2896354364 6337127 +2827606938 3942953835 +1071981917 4072264034 +1521780650 2231804933 +3104117600 2734522419 +4007743843 4007743859 +1600516483 2960863530 +1775931335 1775931351 +4179015286 2495691729 +3512076845 3077702852 +3809911594 2795690779 +568109576 1449110155 +3761350926 4230816025 +192359672 77318765 +2178629614 1512416175 +1853515574 648110730 +3600681319 1019254842 +3779049196 2202858881 +1784785840 666977813 +2862700347 1682076761 +540728956 950811943 +2417571589 3702627532 +2666994675 838926234 +3285450105 1308005103 +1074558100 1738245359 +3197564928 128477189 +2523144952 3080916077 +1996296026 3805294961 +2223449649 3519094576 +3282799029 2266147091 +1397310530 1582724067 +2457275042 862305557 +113928465 113928449 +152126382 4096625401 +1290582218 1240363102 4131202031 +3064699995 74298813 +2959841208 1902106276 +1607505148 1732412758 +4154289439 3956459486 +3427624973 2687361595 +1199120751 4071596462 +4044906199 4044906183 +405382392 26129005 +2578201916 1480930668 +669744401 475163296 +3868948598 1658917076 2145302919 +9977439 1319776158 +1464232960 1675363347 +951070036 2438421305 +2976356158 2215843465 +180153066 4089782566 +3583931101 628019700 +3440504921 742218760 +1245360332 2791592225 +4201822900 1530962298 +3214992827 3673121467 1699325284 +3252173422 2506357551 +2519104981 2188056172 +1855886350 832770585 +4068769872 378928611 +3807198647 3274014260 +402493743 4079717614 +2301174179 2394944412 +3907119466 94532045 +2243331073 2646385191 +2876203739 3143147218 +2852915388 2726874981 +1692016159 3797773000 +727408758 3067664849 +2890281789 2360348213 1870833922 +1041973885 1105832660 +4273475975 2193856406 +2863353734 4021898594 +2906586984 1456162320 +3875501810 2519219955 +162751237 4140693308 +2126405452 2126405468 +1690772533 522168554 +3616900287 526383272 +2455901081 157604318 +1317952505 3240781790 +1349253378 2616786474 +3095288890 2833985373 +421630737 2698675152 +158488686 1291924787 +2119721839 2668581185 +1707440403 4252928493 +1140911895 611868966 +3601575552 1883485075 +1644097443 3288988806 +790032428 2754966848 1293686081 +54108415 314077566 +3190678273 4235469108 +3358026124 3358026140 +3089461175 2582568208 +2187493430 686092275 +603773016 4278751899 +2423631313 1490700423 +2600919877 1356318092 +3297968882 2660730010 +2035804477 1113860866 +2610608389 3115072810 +1851778385 301334150 +1044455921 4052250224 +2308714425 1507794984 +4241413633 4204454784 +2295610678 2619104273 +344529930 1574380466 +1247955415 4021960038 +511524635 438982546 +2997782376 1394898464 +3664784957 462998018 1938161973 462998036 3664784941 +3184377083 3319824164 +2223076957 3881233343 +2640409671 2879266943 +874417875 3142391754 +2739154414 1557758642 +3974403829 1037977990 +2822674039 1367792976 +1267641812 3439611689 +3222649377 2201223670 +3860623093 628374682 +4248996274 4248996258 +832013127 1766084446 +4021053321 3580296376 +186714272 620794867 +3739103958 3739103942 +612609875 612609859 +1454198609 1454198593 3016999744 +901773953 506943744 +3038921449 3038921465 +970418956 438141943 +3425808782 1849159948 +4255887182 2739206105 +1548743460 1977336233 +3602668701 2810563362 +1287396202 235650514 908011483 +2582145573 1843337274 +1772318311 3007761440 +1718190282 1942060015 +3862683208 3091131211 +2570009033 2658827218 +3432307780 1381416735 +1280661496 3971597817 +4110717569 926064896 +1532250499 1219475754 +1429167382 2247471606 797936039 +1263706529 873754742 +567130786 3638349077 +2181296221 3722698837 +4075814186 912840083 +2112894849 3257360406 +3117276426 2299721389 +3519084539 860444863 +1730571357 1730571341 +907500826 3777464486 +291209876 3035304425 +3039860352 3145526149 +3194958937 571435038 +963337155 963337171 +4244913763 1685803205 +4174964923 2021023332 +1697735193 1706913096 +101064445 1233119590 +4135702104 2772669351 +2436159786 3224493339 +3759969633 514556817 771696566 +2140656116 3489628943 +545659298 3575273987 +2212560485 3176684 +3720284974 1103010169 +2338758054 680150417 2338758070 +2043048758 3915865607 +1014962073 3219010996 +3336305617 3712838150 +2674568449 4126038144 +4043679010 3745966635 +2374589696 3476907795 +3194119183 1130976938 1340164864 +3428936706 3210544949 +3634026710 428141909 +3778454704 4974960 +2805900499 2580599843 +2899246748 2782580615 +2444006405 1470956492 +226803662 3005321149 +87073798 325098896 +1408741940 1408741924 +2289489709 2440988468 +3337390448 2522635093 +2578761759 378996958 +4017737252 524484154 +3462213838 2863912025 +861965748 2499744335 +73262859 28642443 +1132650417 4161151920 +1609031869 2712614836 +3624819136 3022545597 +596070574 2303658799 +174946825 1935088696 +1237505862 856534919 +808288617 237511374 +2915824797 3431790984 +435460032 3928212876 +3745084017 3631163366 +4170547483 1851407762 +3424833502 3927119337 +4238023912 2418966827 +3742141412 79706089 +3926656097 3521832096 +3449706883 860285244 +3421490972 646121735 +756939308 842060609 +634812130 811758077 +1399992237 163646802 +3297240180 3589055119 +2333847854 714599279 +3018900464 311250580 +2688425501 1590257588 +135435094 188608615 +1942235231 2630585758 +4154394167 106350736 +981073617 3742114566 +1355045772 809648033 +3862016652 3963359863 +3452358385 3774334320 +185341589 1076251735 2837210174 4178021532 +3225691660 3074942199 +630916791 3926626822 +2269460397 2666964306 +1964790212 3967715336 +2180210538 4229903323 +865746805 2966545724 +3908443165 3631104418 +1623479436 3775993953 +3480231143 1954381728 +4229827288 3828181605 +3569504412 2824169859 +2195557503 3693648065 +3592164411 715030180 +797473411 1457052714 +2444528218 3107310498 +420636991 3069947432 +4020509139 307537708 +1517725668 3286361787 +1133931562 3147599380 +1582009460 3840809615 +3460446340 910096341 +3488398125 2125113298 +17286949 1387133155 +1769271172 1864573048 +3990661377 1262570379 +1582206676 1582206660 +1852500955 1881597302 +1316171150 223393433 +4194578056 479543307 +2380420679 2723008982 +47543630 3288836569 +921896860 2407952967 +498729809 483604624 +4244360221 4244360205 +2141840807 141913913 +3846887288 978425875 +625318431 3455412645 +4277464665 3029546526 +3620670258 3975061413 +3850295105 3944564848 +3473148845 2422104388 +3056595704 1315233669 +3664801065 133945240 +1776172072 604655248 +1148874864 1019150421 +1910568079 2588621019 +1189956268 1401720001 +1838631672 2099971181 +3925624678 3190056343 +1079288020 423177647 +1714728256 619494355 +2135582960 644315288 +3325189067 862756856 714990622 2578961769 268679131 2461614414 3578865664 1817553034 2619329448 3880011111 801877045 2486280945 3778452244 3221759254 2089127296 1889809687 3327514789 3178791136 3546162520 1667301244 1477333768 1967293495 3973114825 1811842758 4075878515 +2884549662 3335660351 +2932028916 290320153 +2581800982 2775483028 +3428135084 4024940344 +3190179276 574611489 +2124473432 2940696204 3547700913 +4089165245 1837045899 +3735015653 3683264269 +789118060 1998937601 +2820389078 2040789233 +455086398 2486418285 +3039066284 600797633 +1987090019 3594304988 +2099315667 3455649068 +2429718459 3061334884 +1041681572 1193810139 +3257118463 3257118447 +3438891214 2054829145 +3589861723 837022276 +3543318748 1977229718 3987156460 3676000292 943106300 452528983 343327762 3836235670 820146246 438972390 3373670445 2789267849 4222774049 2256628441 2046922086 3697982989 1154433517 1506608116 3609330233 1216118921 301527575 3153179000 59445914 11778549 2840772147 927792229 744765851 2106966996 2703628617 1156495814 1280678442 993462354 985674216 2803382385 4240064424 3822687135 727152051 2810788346 3875347710 3800502734 1328612552 3022398790 4221026157 4045331055 1432887765 247978900 1569585508 4140774313 665502302 2824850028 470142520 3181063043 2576176902 2646147053 2087904992 246529706 951343769 2573151487 2480756828 489393693 1907410034 3539783451 1838706970 4215442379 3451121772 2445067269 3826997709 1378658710 957137074 +1794941664 3523057069 +697433935 697433951 +487234171 850472868 +3061514809 2091155390 +579580393 3590512453 +1721456992 2720955782 +2512445711 2844749266 +736134820 3061052479 +2458374439 3536732256 +1361114554 1361114538 +777360223 3820071114 +1056747035 1120277650 +3411575696 2891389859 +3459441377 2065377334 +2777863641 2133238942 +2247912355 2794605085 +2904388127 4005637574 +3037201490 1140643066 +1379638685 1186378257 +1968759976 1659892861 +3907519642 1061109355 +3986460930 2848055455 +2757137132 2689157505 +994603996 3204126284 +3403521980 383939815 +3635762168 3377703059 +1360012214 1360012198 +793859901 3121370370 +1731135912 386675581 +2412180476 366486961 +1999389405 2007843316 +2626501276 571696003 +3675358602 1584556309 +3792149102 3801271033 +1781975910 2588029335 +1659512510 1956314377 +1893050683 834571240 +4156743653 709654819 +444548078 2757226415 +3698801272 2358165504 +3304934924 650239201 +1595755691 1713353012 +2217575029 2292473404 +2109378324 11484271 +1563551589 3239833492 +758202608 344537557 +658608741 825849068 +2458149539 1231505034 +1767928311 3654510534 +3867334931 1965904961 +480451831 2031083992 +3562852503 1537702914 +3838161839 3527007342 +161325981 3223883828 +680395626 1831558485 +2291856659 2291856643 +4034751026 3169676694 +3868791365 3842463869 1207419546 +3286871820 3680272183 +1454799176 1474396819 +4285688773 3860834060 +2675404128 2673235952 +3048593542 2199034001 +3802562259 2506130531 +2301451587 896127082 +87274981 1140665123 732869898 +2710668591 2710668607 +2900421293 3541134916 +2503021259 2806027668 +2597502073 851358327 +694713356 694713372 +2407302173 4261673396 +3419651955 184305155 +3211893374 3721802847 +986633256 3147299581 +3109047482 1936246978 +46058186 475610093 +2077002239 2589872126 +1292008123 3785231237 +3322760342 1559203879 +3078164415 3078164399 +271634758 3090457049 +3678481020 3253834500 +1542577077 1924980220 +464685688 1546126084 303037165 +3950150303 2185944843 +475239035 311400370 +3843628009 2407985112 +389092440 612585444 +3315464666 4054864445 +2431309842 3027185338 +3795950011 3896836466 +3628905840 4039221059 +2116796149 2480774076 +3682205596 487416465 +1441685648 3594650293 +1953048529 311012880 +2746068660 4192627487 +3225172854 3545452874 2364974935 +2530790681 2212236777 +349373215 3041330634 +470516098 2820464565 +3931424227 3329459274 +2664657888 3873401267 +2995651650 1469101045 +2791590710 635594247 +3672424833 387751424 +39448369 3834874406 +197804861 2987993626 +3506704883 2467804881 +147296114 3155830043 +2769133327 2743163738 +187762436 2720926559 +2695435870 1210988022 +969279845 511571100 +1563477633 885554432 +3979005777 1425909473 2875481222 +3282551650 1662554947 +1136919717 3085337053 +881698765 3366681906 +2211624592 2211624576 +4187832987 2375014930 +3806665255 935086130 +979030560 4244162675 +1590111621 3096225868 +2353956682 71484129 +3477098642 3560887763 +1519497082 215824820 +2966260536 3826700755 +2514487075 2022675734 +4058432899 1363733802 +3850224102 1293040194 +2257857038 2257857054 +2874956924 1046845233 +2348269244 318849521 +4246440807 1284062067 +2616889232 3863972349 +2259998877 3158875409 +3001712522 1590397536 +107541292 390511435 +1622652164 916791791 +1879367011 3131605724 +220420742 883392737 +2486222442 2998649037 +298447059 3555073082 +2624750257 195164480 +2440612404 891703247 +3327931627 774327796 +3943105777 2434655616 +637594421 637594405 +338247398 2733507585 +1655305126 4153052737 +220090136 105900211 +2298225997 4058953778 +3728825272 2565038765 +2784044771 2784044787 +1265520098 2695142083 +3619313226 3619313242 +15082041 347008895 3361201932 2619937403 +1717559491 3958297322 +677996723 898057248 +3224435148 1494826017 +2493681054 2493681038 +2263595283 2014599404 +1867629135 2360664664 +3199400329 3166622382 +1090963491 2158825226 +1194723291 1194723275 +3726805484 2623479447 +1666654655 3780107208 +2452709829 2070082538 +3014428497 31596278 +311831573 1503863343 +594560907 1421909954 +2319567582 2207406975 +2110474738 4135756685 +28261910 3168713905 +4260797085 3380241393 +3955258058 3925128187 +2378282031 1458480622 +3001341564 440247591 +625588010 3708507931 +2191752369 3168566538 +1472895495 3364780818 +1093961732 2847022687 +1377244229 2275591793 +1750797837 1414995556 +1003381314 1743039989 +4279699029 3862886346 +3142967646 2136753001 +3623721386 2922964621 +1341550882 49551491 +2422517231 1031655224 +2465663247 1776501390 +4222076956 1159726097 +450408226 2912551997 +2540252879 966052126 697610190 +1716214614 1716214598 +2030606808 1619668749 +559984576 1261742917 +319483604 3459643321 +3150475746 3150475762 +668958305 668958321 +1786026603 9377396 +2772750030 2983400322 +1566659816 3582945583 +2890447052 2890447068 +3046406395 1101433545 +1084416434 1321296205 +753867346 241594117 +3507603425 843987462 +1533743301 3681662113 +3857616955 3842722558 +2311776356 2425303664 +2731149108 2013877977 +3281512934 2290803528 +2974636395 757903256 +194725020 3782017432 +616388491 2158111861 +695916125 2841605236 +1033772444 2615712903 +657660331 1493805174 1811457147 +2399250743 3297936216 2018077289 +4194575416 2330487644 +201033647 2348193912 +2661473141 794786090 +890621367 1213388550 +1557434620 513817767 +3374438612 3863845255 +3910357979 3295478212 +1318424416 359707685 +2177036761 2177036745 +3144013434 720312149 +414430457 414430441 +723038850 1507918499 540485277 +97200460 2596507164 +1928560930 391399573 +2134067316 2981826191 +3771681823 89445598 +725040512 2281033875 +913405816 748622317 +2853144253 1024347554 +3637073608 217291997 +2729167328 1802145407 +2183044914 2647726810 +3419243984 1388111912 +282306048 468396285 +3192595505 2724796071 +3051379007 2332727548 +967239927 2808691572 +481492705 247938080 +214854613 214854597 +425314074 39087595 +2551520448 691814995 +3272564318 1865518569 +1715746260 3512777913 +3248428118 731667254 +1121554577 3447624784 +2990861040 3995920520 +50135375 55119694 +150090649 941627518 +131375182 2713213647 +969235567 1622180526 +4246766763 3219516622 +3123392442 3422298589 +3618845487 3189347054 +512259574 4280000373 +777239913 1456680014 +1742946006 1622928113 +3037695377 2558253894 +254033693 254033677 +4181038777 1732313225 +686418175 1731840382 +970635999 2082012977 +628920391 4131081241 +4082094053 3281822927 +2218913911 2865597264 +2661536454 2179255735 +1459000237 2469034322 +1603053426 2502536061 +3645392156 3785551816 +2975622647 729056198 +2715960316 3543205297 +1561129417 1147182968 +2826653111 2111709117 +1697385055 2740212638 +362893679 3671535518 +4121155979 1005549012 922127092 1005549021 +893911818 3931949229 +1106658054 3532366102 +3730440795 3730440779 +940653194 3441370939 +260507705 2861691326 1103072777 +756091729 3137618656 +218443032 2535849179 +4132722415 1625525368 +3221617092 224931721 +4163969175 1280724390 +4175798062 924635786 +1046098022 4135831645 +868225837 2757636036 +2094914116 3129665839 +2043847362 1735995613 +347175680 4212542776 +283190470 1483531191 +1495913957 1104918380 +3543802009 1351765374 +2311584133 1791872090 +1679341085 1320354773 +159113297 1057103760 +749333626 3380560925 +3493985603 450998396 +1552738066 3285172563 +2228458343 2148600608 +3726132776 3627452987 +4232826466 1066565765 +1144156866 493528949 +3074089146 732939467 +1791238881 4089636896 +3016524830 687078207 +3415877071 1386841304 +1507184642 1838576426 +536684646 3246823553 +311180014 549504175 +3216150299 3776399250 +2297659893 2354418876 +2776340789 3063033468 +983271601 4091031216 +1401265075 777263820 +1647094179 2495819658 +1495886624 2083758963 +302285189 3793216588 +1705190590 4058555849 +1194266614 1194266598 4111861505 +1682603487 3225691656 +3614783896 3314133581 1152849700 +2458533285 1419709100 +331630318 331630334 +1610786449 1989765610 +2200432823 786427910 +1350985927 1867138110 +318921857 3457118118 +1935731840 563367315 +2338324665 555819838 +2822742066 237579941 +694752989 129608386 +675903292 160244712 +3328054373 3328054389 +3406393022 3693150153 +4106970930 2382308045 +1922396362 295666226 725650939 +1690980582 2424134145 +1536829159 447430048 +172733655 204320358 +1990943077 885674476 +1827175526 2557454769 +3807086840 953247123 +3567167874 935647157 +2667397475 2880302794 +3633423224 1698977275 +1606835799 474383088 +1105231310 2532453381 +2722030297 1107237768 +2568258829 2213330020 +162064191 1944324158 +1522961318 2064277338 +2679250559 2702184157 +585832519 294437714 +3607893929 1066287886 +982066780 1346408199 +1795057560 108860507 +3901035634 3761748057 +1831069363 1108406816 +3421290137 2662337246 +2101847665 820790528 +2605082695 3067488192 +2147587339 2373820482 +3329930260 2267642745 +3247335332 1695851928 1462576937 +568608540 1985736967 +3250766494 2744671935 +3153232282 1857522900 570455072 +1914308973 201119364 +4178174876 1032569784 2794540679 +953572782 662010095 +466420521 2975320781 +266184438 2648674002 +3151190383 481675704 +419199226 2552805254 +1296488335 1491503052 +348647969 2628259398 +211149247 2398248872 +960627325 2134675298 2682907348 +2923026707 1477490938 +1803239039 835829441 +121984413 2437688171 +1918930042 2281513995 +3572500243 3930074437 +1687675572 1687675556 +2424969511 2959448182 +2746263164 197355313 +253684372 3114318335 +1407255430 2466534854 +1854633101 2664953829 +3879629246 3310161417 +4005870336 3659836121 +2231812142 2543880313 +2880380798 3620863625 +894072257 894072273 +624213259 2211367992 +4248746659 4217854480 609242065 +4282574016 2521700940 +2684162655 979626910 +4263733398 2423209071 +863978961 3797608464 +3199957925 35409339 +3319424649 4113153142 +2077419843 4028467393 +2767941312 2010077267 +3769859336 3264074635 +753732151 2793761986 +100103430 1836109789 +2976097456 2150802986 +2652748611 1895153958 +714534543 2593753870 +2776165527 341602726 966150025 3179739156 +2972721834 462894867 +1911777879 1911777863 +2135104595 2846201516 +87232009 3954380910 +770819525 3572758524 +2221513 4267490168 +3440129353 322429432 +2416784743 734728502 +2753629592 3439606432 +748847633 1304786870 +4159086393 2604052988 +3624045095 855604064 +1952820583 1280831059 +1937894775 3412268020 +3281571485 2257404194 +4267571154 1072504723 +1284131038 1538307433 +2076769841 241706800 +432288129 3859096725 +4018429460 559946095 +3647120054 1013551905 +3801008770 4031805454 +833617096 653106154 +882227410 2250300781 +2636978561 3120754749 +1477981595 1226597138 +580632258 1026378613 +3695452333 1884150043 +2626027002 1626263709 +2942024199 342219008 +609503895 3350293414 +871082650 1442680930 +1384123847 2107929810 +3806702255 3733696878 +523009675 2678335928 +2593778168 779004544 +3655516961 553200886 +517845712 1728085347 +1770572364 1394289760 +2434980950 2784584503 +1272728132 3259423023 +3168938477 3180862546 +110451569 3458134768 +2756672335 4162788686 +964835649 3372228928 +2366285412 1832734119 +909497820 3495640054 +963625849 3824203624 +1342003187 3738268570 +1136983371 3424102008 +2237749192 3225235403 +408559842 937542613 +190145463 588951957 +636001050 1728106306 607905477 +3250920943 452666668 +742758662 1854187345 +3440331694 3585277497 +594546246 3871966266 +298817541 3733244953 +2318156182 430653233 +1501159837 3569111957 +1152610636 1920686753 +1756838538 1736605671 +2892004075 1189183476 +2923572941 3389840434 +2936456928 1739264691 +5675409 424918864 +908904468 1283382879 908904452 +1839571071 448505854 +4116061787 3659481407 +4100278604 1511080801 +2952778793 951778456 +971321025 4257885158 +1352027425 4254821110 +2023396172 2368773473 +3603226629 485271507 +3742364096 2134880140 +3911665503 3911665487 +31913648 3953858059 +1270786349 1780765124 +1748071716 702244799 +4139230883 102453898 +7346927 938573136 944808849 1169091116 +3020729221 2836140251 +3622798278 3020714145 +538711156 3420815 +2384707692 1493140216 +1992322715 1309287954 +2619031907 1008534598 +3792165054 1560181193 +2985778475 1079030357 +905191719 374354016 +3977448461 3977448477 +2409464534 3941922545 +1691267324 2908789927 +3781890250 2508071474 +3406798573 570366276 +764728199 3684197466 +2903567365 1990429644 +1979586346 2194625726 +2827138544 902064323 +2261912508 4171790577 +3841309597 198596642 3295460738 +285789612 884551977 3764936839 +4116947294 2849441535 +1392733745 3748034342 +1752621706 4247166765 +412519331 3644281475 +1731998121 1731998137 +1873993676 2727759415 +3190013806 3720345593 +4041730389 2824834291 +2432634663 1753537142 +713161844 1180431543 +2329649027 448535356 +3745797364 40573791 +945192136 2015784651 +3269383461 3922299194 +2305979649 2773433639 +1033365702 3158181412 +2478560778 1092585829 +3724012067 2420479242 +3938840298 2140609106 +1394290422 1194658003 +2991066172 1926862833 +1274170315 2741908154 +1075470298 3280266301 +2919281944 3195093112 +2918999979 2404856381 +409291951 376944494 +432464973 3776537906 +433328427 3100995563 +2406465827 2406465843 +944699701 3646049891 +3956631474 4075961637 +2947048620 840334039 +2468740936 4002015482 +3792263298 1454789813 +283610378 4200530054 +1700733831 1391877786 +4096409120 2284765933 +4167113395 3017607116 +2647156322 3296275541 +3054212736 339602323 +2551841737 972289400 +1424491510 231648102 +1891064744 413485419 +2949818229 1033739580 +1577467531 2396288194 +3137974662 2711598033 +2982334962 1507425902 +3190090359 3407681862 +1743505814 3656594017 +2176302751 988630443 +700316931 411449574 +1657243476 1657243460 +2928749358 4236704121 +731584700 1630007271 +45213623 3822275351 +4247139657 3425034744 +942811734 2422999338 +1873537140 3291586859 +1264590661 3522048558 +2813825850 99156501 +4141051399 2513843478 2513843456 +1765200477 4266469474 +3742343466 1804278163 +1820540750 859826976 +152083166 589548415 +3945459433 496376024 +698074557 3784975541 1027098754 +4294226618 2964527894 +4062645105 116970191 +944382808 4105544589 +1889634586 1749734379 +764275927 2372654694 +2615335604 438192463 +2921596821 3230537274 +1133815467 1133815483 +3024532321 743203232 +4089187544 2299017229 +2918151693 1251186021 3707164274 +2348860101 2405073063 2276179196 +3156342541 913828196 +453572684 2058678307 +3910345605 1847650892 +1690115708 297205041 +2224699795 1372103276 +639422984 922352949 +2389083667 622334102 +1728227 209936220 +2515497196 1897631104 2178794497 +3870733212 3579511692 +842849315 953060124 +21211502 1803794479 +3818993115 3719708133 +1967246311 1341566948 +1788309836 409426615 +2355875942 637382134 3277135271 +246772020 1537291471 +2412411979 1837631030 +4127463112 330485639 +3585717747 1717136794 +1516749284 894843369 +62222100 3481408127 +3035632102 3955948327 +4259999758 3618285967 +3751636399 1207624812 +1585823507 3574624662 +2942309959 3627594289 +308958556 1499750343 +3915312840 678552797 +143656807 3787171616 +3917054867 1258723882 +3145008023 2956240550 +1208874910 201117119 +3997146852 4062650601 +4074982944 2077490291 +1434682943 3708572990 +1764342161 498016070 +2214190009 2069161022 +2922519069 1440684980 +3585019921 3585019905 +2661730634 177135483 +1788937783 2986377369 +75690552 267965760 +3061459326 3226423625 +1784683693 575480900 +4072041549 1647082788 +1975823660 2253565857 +1483310476 1483310492 +1017694751 2629185246 +689811559 549237302 +2962877813 2001784618 +505854616 251116877 +3001014441 3391271429 3579997198 +2664860913 1754378221 +1315810580 3198124159 +2648954508 430620257 +224929180 3069392017 +3474495904 2813952548 +684567815 2937867437 +1743782440 3335742717 +2156148674 2116707013 +574330523 2127435268 +2676363451 839611955 +1230862162 3491943941 +2682347808 3486246259 +1552377213 4134475761 +3674610989 2730713477 +1308368750 837122607 +878828918 3063924554 +1463305316 2979244415 +1801805623 1063402403 1200939920 +1133604929 2666772063 +3956044422 3101182177 +1417420063 2500240586 +388055848 2505292583 +3063054198 985697111 +4008585218 585693987 +2758766472 1668059915 +2777208583 3467083795 +1567664727 1567664711 +1682753503 3286148126 +2595929254 972486977 +1198030431 1198030415 +2095275975 1626326614 +1474376530 3984006139 +2307572594 4210194715 +15217286 4085745889 +3586743426 2813386909 +159903014 159903030 +1227937222 1204250309 +1082327636 1117685904 +1500736012 2507065538 +2326967194 4048599933 +104259345 3009642455 +2846464999 2846465015 +4242266756 3857257843 2798591264 2451111391 +2028837628 647118946 +1117307785 1601949880 +3846670986 2040469293 +1636715406 2205856015 +1574554977 517885878 +3290832495 922871992 +2826974178 600943829 +767248024 2495130976 +3200934133 1301717418 +3742041490 2958673093 +3364618307 4150552938 +1785049220 34922463 +1186769063 34519730 +2087094674 1735037125 +3773902601 3773902617 +2290829193 2084674744 +3547327623 4212064100 4051598112 +2449686602 622736507 +288375914 2029761229 +3564520236 3564520252 +927698610 912414298 3186729523 +702912243 3882655898 +636851837 2050029307 +2394369916 2579205415 +3909561848 2801636992 +2244431878 1272121210 +881416153 3907286696 +2294852229 3638849370 +2678847416 3053867603 +1612806580 145921605 +1424669044 1424669028 +115047435 3598992706 +3504702857 1943606254 +855399143 664884979 +3740267449 721626504 406889285 +2017894618 825177899 +866160838 1013302545 +3536061097 1184857093 +767057901 3862888964 +4127351939 3368303146 +1006106549 475722236 +3614557507 355588912 +3739544739 2213587428 +3893923767 363478288 +1991316529 163760432 +1488532862 697251145 +1189499612 3172247492 +3180435710 1781782473 +4009460251 1442534565 +184967455 2047534046 +577843960 808664173 +3994350397 282458023 +2927650801 148457875 +3282311451 2703630521 +408482165 3768196658 +635628687 4032805651 +1959652271 3609528556 +1996659933 444663154 +3725817000 1084269693 +3837776232 924481727 +3140510376 1428901501 +1773592362 2497793819 +2079502832 252583125 +778922107 84801811 +2900810017 1348980448 522908295 +4008916843 2480946530 +2837885151 652766984 +2042902190 1575097337 +2876138753 3754492032 +2011819619 675431882 +3760086332 197969255 +3652160039 3595991926 +3974853017 2409878494 +1218031224 3265322948 +253583883 3594606402 +960318825 2223037528 +2478488826 2478488810 +3825179639 2366466974 +3565434273 1625869923 +580604564 2130611005 +2709734547 665529524 +3889297781 1069301897 +1950545918 57435337 +2136769679 228896014 +2517526686 1061274690 +1065754151 4188990515 +3234183462 3234183478 +2011050780 3469374727 +1175223028 3634278728 +3512239590 2377426122 +935883756 3163454615 +913288992 3520114547 +1044515493 2801189292 +2728660758 1269216246 +617494694 1983974596 +2882838352 3484863203 +1203131596 1846790918 +882961511 1347698502 +558807934 2523564126 1587608223 +4029919110 3904953730 +2376832628 2376832612 +3219783705 3219783689 +2782955154 3210527034 +209269572 3872109577 +3074827758 1903015353 +1013044725 50581692 +2040785544 84554763 +2777994323 4232724154 +3268312658 4245740293 +3025823684 3025823700 +2661799719 2192428324 +3972681527 4185568144 +2020959689 1775188846 +3638576683 2483975586 +1785741386 3635754098 +987309725 1087883554 +2844260322 3450493693 +1066163216 254162191 2834590952 +422679523 422679539 +3860966006 3170850759 1291267649 +1364505218 2531937686 +841456736 1783086172 +3609851611 2450496196 +1605904007 759107801 +1348062884 1348062900 +2921753184 2256106803 +2531109498 4061989698 +3777160772 2638320388 +2675577562 348232354 3878399275 +1493368284 587323984 +3377992118 3120301953 +1790816023 4033592980 +538435237 3224300490 +515608081 3431733875 +3451400764 3451400748 +1660540829 1465520255 +1280317890 3826814069 +3655206779 1938146989 +1102797413 3971362205 3971362204 3740224762 +543519782 632674263 +572361986 572362002 3062168117 +1907860815 1394162510 +1358573658 3554287037 +4137576875 3865073716 +2747188688 2505139829 +2428991968 3389316005 +3297360993 3318975679 +2121481142 3311861639 +1498007143 4129510454 +1007216927 2701589448 +906829036 44337032 +1839978340 159650409 +3677777420 2061293089 +2541354268 1658856401 +978039948 2034899420 +2723997659 3911804283 +474032668 2526366225 +3274837319 2395662038 +4206600323 945663548 +1636318369 712470880 +3382686142 3382686126 +570103830 312698103 +2593389075 1777511404 +617572453 3278501539 +849347061 2799899818 +911157786 767337442 2560575211 +2369544028 1506628996 +2893479682 3538916930 +1042643158 2581187961 +3222608415 1660648945 +2588156693 1494180926 +268078284 4083918135 +547969724 647615985 +2215714610 418651059 +1608719780 2525473087 +2915228595 2624605901 +964327806 1757957882 +545392426 545392442 +958575447 1120649673 +3660722594 520364547 +1219286601 2970965240 +3520016409 1646835550 +3042894262 2961401992 +2558366650 3065120401 3345831573 +3558916667 714195698 +1080959710 1264640895 +830725659 1513219441 +3813094514 2148982039 +1520521733 1716189153 +1010888182 2752915114 +680237473 3906775064 +1659729985 3272102330 1682138700 581686294 1378786410 +2727426499 1256439221 +3785827958 198117953 +4177919932 3228669169 +448619787 589697090 +3522240620 1261551489 +2575686109 1249097897 3710628376 +1152877779 4293269548 +3684443966 4107388575 +188889334 2940185415 +3078945630 1146598633 +1870489826 1684806595 +2890283894 554739543 +3973363273 467334392 +1474617901 2320501956 +3554686010 2724914606 +2045321529 2342503772 +182356982 3712598994 +1087308561 3414188192 +1716784681 1062357646 +264485604 153111247 +2954799162 2051199819 +4008335467 2246652002 +2974011901 939451482 +2296806273 64252950 +586892324 586892340 +832858038 3687793553 +874535458 820896661 +3644839518 1568568809 +81702154 3297411069 81702170 +1617594183 246609088 +2260565180 3628817383 +186865516 4104298263 +2396609795 2489866801 +100059555 1757643898 +849205311 4043304269 +3081782498 209481667 +2920636865 3433620160 +2624828636 1583219089 +2924145891 1123215690 +2650485204 2255450297 +2814876705 3224681165 +2804673658 2804673642 +1210491626 3727252047 +2949215442 2037796222 +4210067134 3332644105 +4118558320 257056137 2785583368 +1980574100 3528372537 +3429901892 411843849 +1851888267 1318695106 +4151083309 604343233 +3418661183 92919358 +616454851 2594758908 +2457845435 1511604338 +3886180695 4222342128 +809875558 1673611393 +2294002715 1518110354 +44633401 44633385 +2765188183 3433925862 +1445845496 2720932205 +2317977669 3294725260 +700380090 2683082389 +3780555570 3984332709 +2304918281 206687608 +4293947812 2340611369 +2634441206 2847001447 +434387580 1044910375 +22550534 1897244918 +4223910734 1157531524 +3869813559 1384482704 +2418257048 2150151003 +3078227964 2530833894 +1934290985 128682388 +1795153844 617424975 +2403705071 3247498641 +188796257 402870198 +3120864508 564952291 +348024339 3133622266 +1162030446 537925103 +3874830417 1393517975 +1493715940 3847865295 +222404662 340735239 +1434484615 1434484631 +321487827 321487811 +3037789591 2696885414 +1996567041 1742852304 1996567057 +1462722870 2049092869 +2757118746 2757118730 +1820668526 1403944009 +2823573370 2823573354 +2572647587 757276503 +3157339015 3362227584 +1388926157 535854756 +1937400071 3500588566 +3545939457 3101236118 +2209832487 2158573408 3932302387 +1002511460 1962914175 +2091732541 2178034196 +478443797 3187176252 +3878133644 3043042231 +2027220116 2914306151 +487078818 1589509230 +298152532 1305672249 +2804736011 916762964 3031871641 +2849826473 264182808 +4148810968 557453339 +4162645608 4253765035 +3171807836 4176774855 +3644714041 897244584 +3565148779 4031043170 +1079101007 2411408974 +80283394 2322991139 +2308698032 2308698016 +2245217406 3894047647 +3493047021 2924876562 +2044214347 2499962310 +801690402 1529110147 +3747258191 3216307610 +2145125477 2145125493 +85147581 85147565 +1536575527 1418958198 +4196458000 1651424363 +1485248073 2779256046 +4247084851 3980354023 +3085839756 401716087 +2211168500 63739896 +675065996 3817466977 +2273671445 1813879818 +1448088640 537911500 +3326047096 1367349441 +1709969717 3541664025 +4196960181 2194514410 +2035589482 1782192589 +656665919 1548373227 +2857991437 1734767716 +827220606 827220590 +1334433095 2096807616 +2625723806 4255539113 +3156335181 1984603940 +133552377 360193753 +1161004017 3776492666 +693566118 3119289153 +1882824291 229922268 +1865072104 1118671312 +1157387159 1845293381 +502834288 3073956316 +1605973895 4219212932 +826564864 2454048972 +2069522388 55669423 +2088114973 183283362 +1410386525 3641526850 +1188676712 513612487 +1094127145 765876018 +3286259290 4000290512 +2743180875 892316766 +3938839637 3935504842 +3917769985 2625083520 +878673125 1464966266 +2516151389 2516151373 +2541745473 2984154736 +3583320932 4031423804 +3625663539 2564931233 +2301576473 243484158 +1393300625 1292132432 +796854708 3458383368 +1307400258 4003590115 +4173686996 1670709823 +1956513003 3759387567 +2119070023 3809163455 +3201339729 3008676486 +4100841323 1096787342 +3123460090 228335243 +3540176838 1882308529 +545548295 930071296 +2795233692 2276187207 +1067066130 832910661 +2961293681 2269787649 +3056595695 1603731805 3998122554 +3994525974 437196920 +3706676081 2298574793 +2679928410 2679928394 +3454414319 4129994043 +1141476373 805799196 +728395049 2173294478 +1027212212 374592591 +881693508 293159038 +2052622851 2623619754 +3886660960 271916581 +2051561770 3444107245 +1830973548 2396046460 +2885864848 3812423677 +2962361583 2498702395 3840564280 +3608781368 3579469357 +3297501968 1924516220 +33843279 1931634331 2079339598 +1523371212 1523371228 +237095558 2432461562 1684796625 +2174389515 1926846709 +2072915416 2072915400 +2055556244 1675064287 +2742619053 76374354 +1908445985 858234102 +2012464768 3985992735 +1028507108 1701742079 1110958741 922546200 +1557948613 4093177370 +1103520852 3746557999 +1382161828 1416931647 +3001499118 1765268079 +3865472386 3004944665 +1299711272 468721131 +2229905744 2346027253 +2499096433 353258954 +1855093941 3315224810 +2257839815 3350631328 +1487057784 2131451 +4050270710 2703034817 +107038379 3028570000 +4285108467 103755404 +3526325483 3417640418 +1661416011 324018562 +1413204031 3642506024 +543861788 602730513 +814607453 3429570146 +168875631 2811830594 +4223760608 831604915 +728880117 728880101 +3991296632 4188039931 +927917806 2053659215 +892120675 408323548 +3517426860 3873829688 +638628159 726074920 +1023797324 1548529569 +914904093 3907009259 +2976458584 2693328781 +2627913553 3846161549 +3806742817 1367678710 1367678688 +3250894321 4188695142 +3534385720 3662794285 +4097282635 151364277 +3771303930 3611365003 +3649634450 78374341 +1795786573 3652020276 +316944246 859223761 +626412867 2758427645 +1045630287 1807610702 +3618354528 3813574195 +196923778 4231909301 +3701011942 717953303 +100102968 1956874457 +2088140736 2928352083 +2732558985 4008121774 +3338157493 1034127706 +3151652053 2379004764 +2922480827 4076073586 +1999367604 1311191631 +2792791881 1438433262 +2273474082 311995190 +2108323067 4120878504 +2415670801 3137936592 +3141362932 3047549967 +2562930583 2227026708 +2653516435 2386517370 +1961719796 295195028 +262480138 2868052653 +475805002 4012368749 +336939803 3095739268 +3151587029 2352800092 +4084716491 279079042 +3740596028 1734275746 1342348131 252449776 1238529931 +755139958 1358436561 +2639827337 997005998 868283644 +2345758896 788209675 +3709335601 1035711782 +2655814246 525461914 +2897228714 2204193933 +1333222662 425067781 +3219402192 3003904572 3828620917 +441752346 768736501 +363474135 4058289776 +4255410393 2895071845 +3197807148 3219178899 +718639660 1967601523 +1178975234 3543601769 +3182925723 2260932507 +3014980423 752548032 +2175557878 2815759299 +949740453 3261553836 +1266981708 767588513 +2581962151 4164983507 +3320953711 176820142 +782931171 1743790045 +2602359264 4126429049 +1337729958 724311639 +1684312750 3092441081 +1724087340 1724087356 +2238507106 1819398741 +3741090918 1837395073 +3093034467 296488135 465835100 +702204578 227691434 2238512387 +3044670549 67647964 +4085381343 4085381327 +2543234722 1488921902 +1723776116 3086126792 +3537843286 1061458482 +1906269077 3363882419 +3730567815 2445200022 +3687680431 2823127213 +1468085376 3842216027 1080403333 +582728535 76016102 +1894116108 3320906728 +3238670183 1242079017 +2965710433 2471080041 +3833469822 158039085 +1808159393 1244926816 +2796644421 2513665319 2923898010 4190735683 +3255460903 2640030070 +1424792165 360123628 +2125370574 986988623 +9838438 1381199233 +2341715000 4052831277 +82087714 3587003011 +2329352049 26863334 +1293310446 1211077049 +3273692711 1397514080 +1020255127 4012643310 +3099789222 2057129453 +1891647445 1403288650 +3178268965 1562895660 +702125780 2516422672 +1699172154 3178569237 +3927311339 1806183138 +2996172526 4195071293 +1101025470 224336649 +1893404476 3839425393 +1280376923 1657672037 +4208651412 112298985 +1438855455 558257118 +3724505036 3479153285 +92200905 1874479470 +3239204079 199013420 +760555390 3675073353 +3479233242 1334123837 +3239592824 1899116027 +4100966160 3690356277 +1468861833 1544310456 +3561005241 1064314543 +233681042 113703738 +483569227 3138338671 +4128551903 370806945 +3862398582 3862398566 +1101696170 159084443 +1710196475 1930525988 +3824679050 322611606 +3243361831 2487669796 +1935469552 2336713411 +2627104607 3455113180 +2301485636 4214108473 +2710818047 1521202558 +712735154 2455802675 +110582448 272876291 +3464020485 796009753 +3289718890 3252990442 +1581832582 3588935674 +2698509264 67201141 +2430981913 852597854 +2606772607 393079528 +2028647976 2172436715 +3270998648 1670761211 +4053983748 2638713534 +1925340681 3237617992 +3525662663 2546544214 +1901756443 2366602131 +532991748 114418520 +3359764460 2151280116 +459609546 3928050939 +2824385952 2201011835 +2959619558 2584533271 +1711177917 1285859714 +636999571 663317283 +1176868102 1932105825 +685841392 3901021532 +2157484705 289106784 +2304131889 14077530 +1460737648 2895354827 +3292748740 1776553211 +353350635 3181010069 +2455589903 1534366207 +2419129306 3608967211 +3500824799 1529472776 +3046183942 3647112545 +3116847400 3720442536 +3449626649 3344533342 +3982952021 237959114 +2308290037 2401191177 +4127230064 3000420419 +2963218041 2963218025 +364058821 2865562364 +1564920599 3983652134 +115228357 2497499148 +1071374914 2290564170 3374656995 +3471780911 2948416635 +3471607978 3799584019 +462227912 654730699 +2390208534 1550463655 +1666049368 2305201259 +771484312 827635674 +1956328801 306815297 +1835146147 3564208522 +2136741299 821438682 +827119690 3858267259 +2405906138 2574997803 +3577689545 2072095598 +2275345589 2959651347 +2924853567 586086652 +811612307 3128495980 +2465291538 2927475629 +3780409919 4143739176 +1559085534 675819647 +3268098090 1735526533 +3828919809 1178200960 +621047338 1878617115 +449112172 2415518231 +1155912757 356384297 +1920882038 166088793 +1824731290 3510993515 +2667134810 3491747046 +3298029889 3051669824 +1948806623 3131373064 3652144779 +2763630840 2937041165 +198342718 3662891423 +2316570509 3935599346 +2534155646 1176438089 +518275665 4065617286 +3565156008 80965770 +2378849756 4185084551 +3279138954 725608198 +860989416 2978697771 +643439702 2921505569 +3943291298 3573904061 +2435681444 1559589156 +4173825679 4173825695 +425329971 3888934484 +1346145756 2234057351 +3303948806 152170337 +3616429727 4094843998 +1966520311 59198542 +2627109652 2498779247 +3874973582 157697170 +1987385098 2623967865 +309070333 4245928258 +1998971609 1772362647 +1664436385 3454096758 +4046115111 3112851251 +3822636431 1028364302 +789679330 2865269294 +4286956089 3990876480 +124647791 124647807 +3692902947 2768405788 +3194990976 2901132472 +1571150106 4256197347 +1673899289 868478441 +2374105006 1905845999 +959023445 1365455050 +3799987133 1262383764 +3740184964 1975612127 +2208782642 1716104868 3683214541 +900437922 522171395 +2197586936 3965599976 +3104274655 633554696 +1766996718 3128083631 +1936982688 480410404 +175833016 1052809796 933269165 +2058208369 1925542166 +2777609649 1025188950 +3004024463 1900863805 +1947244110 68984015 +568120039 899678624 +2960648094 3452654505 1392407425 +3581331918 3623858009 +2679659256 1731671153 +1212112325 2160106764 +2873479656 2263445547 +659517985 51423712 +101790238 1718328256 +3677007080 2495977168 +2466361224 4087829259 +764449204 1855282767 +738115414 3126296097 +4103391594 1882788301 +3897153258 2520601165 +270485262 1866259215 +1201393044 789042408 789042431 1313120249 +2100495985 2229373277 +2220438355 2875968442 +2862072765 1240015490 +2168498299 1774566719 +1168122508 655778401 +490691063 2473751209 +4181660480 4119555340 +3227837693 3227837677 +2940082453 498255747 +2982488664 828483739 +3427023157 3295022716 +4128954739 3745796122 +1589618783 92399926 +224729948 1915359697 +2889772205 3888053522 +4054328626 2645724581 +14198391 2710520330 +781156246 3789936935 +3648909129 2856300536 +261670458 3347058013 +1205420580 3605609916 +1444616215 2745625638 +3695685076 334608948 +4252637599 2788578654 +3730621643 3607743362 +55968326 3370668678 +1626515169 2130490400 +900386631 2209907204 +1702777388 1702777404 +4032956691 934202240 +4112236670 1487930975 +1099252957 30107636 +3051237512 290635700 +2949409458 1892415013 +4048091742 4048091726 +2148713272 3582546221 +26545739 26545755 +335404077 2778831556 2405873797 +1880304752 1880304736 +1009346193 1177318992 +2718788898 3234329149 +3739689845 1524420924 +78871168 2208205849 +1496677449 3854354616 +3803566481 3398700266 +3835051324 344089969 +2557237100 3656470144 +1242596350 1242596334 +1451027781 366619516 +44390759 2437659958 +2428193443 2428193459 +1799236122 3973859051 +708630725 1020052220 +2096590983 1082533014 +1785541930 3018502413 +805301955 1390730492 +1574923568 804908934 +1794548478 1614976457 +3835353182 1036164073 +75789762 2987084597 +1727442144 4132578483 +2747418661 4023882298 +1058449713 2175555632 +2340202501 1830575248 +153404305 1432966454 +1587266548 3811932431 +3614069606 3324448502 3592870055 +3710739153 592912426 +4002235509 4002235493 1188915875 +2131075472 2245875107 +3511476152 2408938067 +2087005402 2907020075 +3383383436 1404684727 +3643588911 276045048 +2656314414 1697662731 +3999948590 2138297721 +3918801809 1161860422 +222481024 3739620955 +3875596395 1844461977 +934470263 2184810740 +3779912936 50026911 +1672252674 2147271965 +2866150600 2866150616 +1059226484 3140300820 +4021222908 348667825 1748779952 +2324446198 2324446182 +2161736581 773522346 +4125390796 1879354947 4033107447 +3211704341 3511515834 +2831383026 2646144997 +3530743078 1387087138 +2229422253 2446080260 +3922402309 3113496712 +2424802529 1669203718 +2405861818 2020265931 +2330981829 1328835982 1459414474 1243811213 971908837 3479114928 +661170537 1925361752 +639536036 2614961700 +1180706016 2841250995 +3016380316 2742768273 +2201475202 317314211 +4242267643 4242267627 +3472942051 3244736092 +8205247 2592159612 +3169920967 1080827588 +2938580375 1370277030 +3825553732 945745417 +2255757983 1204977736 +3682259629 794404434 +3828514084 4154488591 +2685098432 2685098448 +1291708278 2847104721 +2994163230 265287999 +3989219712 3485258899 +1347384254 722678815 +3591141780 2309186544 +3528328619 3151162402 +3292534088 3892122228 +2596926559 3104340234 +1371454446 3860783162 +3936430353 1823712710 +4264830120 3558192253 +3627422229 1914599196 +1189978330 809749655 +2170455839 3335435720 +611187000 1693989580 +2763338185 124048991 +4219174254 1365668921 +300166608 4197719669 1426846268 +2275454863 2923662338 +131938983 3791559858 +2272676590 758641839 +3160688043 4272559576 +4226306133 1528832023 +4039142484 1391102009 +4286196888 1951219626 +4000987386 3853070023 +2543324578 2543324594 +989694506 3032797753 +2442550498 297023427 +2113113133 2064378002 +1823823084 225750913 +3798611427 2494964503 +2996721106 21043603 +3152272116 2444562760 +3254284610 2690900810 +3180096353 1505097981 +4203759987 3827539973 +1624536367 3529140255 +794892805 2598106586 +3812829947 3183257906 +2645186331 1311186834 +2131398758 1671516311 +736867046 168468481 +2658831858 3891616506 +2045784373 706573930 +3831107499 616999458 +2767337330 458049651 +457810367 3140396782 +1271460132 4190200094 +2802378543 839125054 +3200124443 2958333138 +1004567075 1854278435 +1264847744 2943361720 +11067844 3453708191 +2481588682 2741856507 +1725831787 1520670333 +455984768 2672487352 +1564028682 1564028698 +2663795752 1620170028 +2534997277 622435092 +1398192055 3900912912 +709471705 1794944136 +1122435709 434738622 +2284905527 373147828 +1072786767 1072786783 +2140811027 64119168 +1728883228 1425000967 +3466211509 4055543018 +2032384046 1331919754 +1296727064 3219152293 +3279749775 1288374040 +2638652448 3056885349 +1690114943 832618161 +1251086088 1810737565 +4101361348 2574548639 +3317636814 3317636830 +2492786084 2321908031 +3137190335 2024978737 +4119420372 1530836143 +3249567382 2127212081 +640449988 3691641737 +2897225638 2135845441 +549102968 2117970380 +3931551461 3414289018 +2668202796 2282100311 +4234141898 2157476473 +516448054 2379687718 +1861399118 4128157913 +3683940005 1337378234 +1398788317 3962449168 +1104540404 225501964 +590021231 3532482362 +920142650 2423379037 +4217039676 668798695 +4062892733 4134125442 +2210867855 2626880506 +1392030100 830442489 +2295689891 184776348 +1072324988 435648049 +3829139266 2357161187 +2091417908 1900242127 +4276164373 1364678154 +2998609058 4271549205 +3281863066 2297907061 +2734357188 2734357204 +2875124650 1886190733 +670533976 1118647693 +1694227165 3581512162 +248801110 3859375671 +3411600231 3483521892 +43881613 1602328434 +809880630 870349063 +1447303914 3136303398 +1704290546 2570017435 +4061367336 1019585259 +2751272121 300608565 +74269281 1493139104 +344045671 2939505206 +3161712137 1668257674 +2450784574 863892639 +3115227058 4292398387 +2404825440 3601453115 +3973154817 3470334358 +3989984931 85877404 +1402865447 3368370806 +3176271099 53112612 +1839326076 2660533608 +2547140845 1922589659 +1225714858 641470739 +264726177 905172688 +106943603 1356558093 +2070531848 3726623267 +2532954690 3980787171 +247478644 1927008672 +2055010126 2055010142 +3014269477 4190578732 +3517432709 3517432725 +1197387250 1275843557 +2011008760 2848460909 +1138388842 987587533 +480897576 1199283453 +485094980 3360599327 +4282691545 128683710 +2430632521 1517099256 +3485606743 3945132816 +4287669997 951804242 +1217916165 868574769 +3361260127 2998526542 3361260111 +2659224400 3562753781 +1345734277 3396404058 +365722966 2800307815 +3657558731 4228160898 +1048345627 1636991741 +2713437520 2713437504 +3583117577 1038367032 +519273320 494741317 +3945335087 160637562 +697307481 67991877 +23906379 581429624 +1637570668 3333601153 +2455716691 1710113759 +2470023601 1047339072 +811164400 3635412061 +2146952953 1672635522 +1267242782 3125169983 +2596120116 3431769049 3597002828 +1599823856 1955606002 +3763473026 2024554141 +1361260723 1835379162 +2974033881 3880434334 +3325096635 1278654395 +3272761600 2344865997 +4269555069 445959106 +4001333944 716883885 +3246042145 3038574560 +543468062 477613353 +1831300113 3956108138 +3073585180 2174008337 +1845779868 3437190279 +349387073 159588694 +2717349450 1116681851 +4053358092 1617065185 +61847787 3097500148 +1279347163 4184974527 +948636590 1613347314 1693761081 +3017743224 2688040420 +3660029427 1599972762 +2625535122 3978172869 +1500087158 2228825921 +1507419568 1507419552 +3556162406 3556225073 +252969173 1262732906 2440908611 +996997056 12458360 +2090038356 1881153583 +3376659876 3292394877 +1190660371 3413526778 +1268307288 1268307272 +2583496911 945085902 +692497909 4014201002 +628618432 1489591232 +3435016188 1925419542 +2734630231 4003973094 +2000010847 144355208 +1553092810 1010418214 +3362787801 1634474120 +1514398788 1558206217 +1031075364 2376456612 +526193855 512207038 +95230062 1015920178 1535080697 +727511853 1884475332 +47193431 3298701286 +3683249155 3683249171 +170329334 3232026158 +609406221 995674994 +3012074404 1141703465 +3168380750 2560778201 +214339244 2967423762 +3543521072 2915156117 +2201042193 3741656012 +4194629416 3184595965 +1561897424 1574130275 +3671688915 1466908204 +1303450012 2403112785 +4187280720 894160099 +3296731068 296875239 +2744610569 1374296316 1946195125 +2508010192 605486435 +3077327818 2872508286 +1450456074 3012170006 +3280951879 564862400 +3610873572 3610873588 +902223993 902223977 +2559512164 2759629726 3091427175 +4182661302 1372923542 +1842355465 3885872440 +892261563 1941496420 +3347997761 649076070 +3409582500 150507668 +786220707 1754051210 +1920524383 2471048606 +3996039669 3901668522 +2911308589 1192296325 +3643113124 2047237161 +3980159541 2870686076 +1200434499 3862839402 +2068428747 4237238069 +3504278169 1746775752 +1166728228 2644020415 +2532958255 124177692 +1326777379 2702541596 +183571923 1383296271 +766015016 3820457539 +2529933113 2612096680 +1460507392 1587502589 +3645162484 3813654168 +2255987909 1935172108 +3533962779 727407871 +3835308717 2343644740 +2270092134 1730371991 +4223249924 1229779039 +2712939262 2359274953 +3721518355 2375335808 +289828586 1033043282 289828602 +4114550034 608277331 +2773178580 161273273 +247665048 1542719531 +3680849035 3950476994 +2791011459 3487466819 +2387385837 1166651474 +2213976054 3006347345 +4244209474 2126730467 +730729713 272732279 +2637177103 3751587148 +2309971508 4077997007 +4216288567 3574957456 +1234340122 3954037739 +1577045322 1577045338 +1976104132 794382495 +3412190106 3306769259 +1059862850 3030262499 +2088437037 220744347 +1315599460 2733203544 +2798918104 2011475725 +3870513771 2539083362 +3073119708 4097297041 +368689592 2917015488 +1417173935 2826458222 +2409290556 1383499043 +753723543 1341269424 +3906477193 355789742 +725664221 3870084564 +2586596234 1036485179 +1194485584 190749561 +2722449028 4144890335 +2259195817 3686712088 +270442376 2829469347 +688116967 2013800352 +2348585680 3543097131 +3279202075 3416461202 +1153749083 1730284338 +3071054997 1428286266 +2633206891 1923457259 +1235574678 2236971303 +3748030656 1849091667 +2692218266 3246720126 +2974919170 630104373 +3042675768 1825518727 +3106282927 3083818516 +1622517787 2446644680 +1309860206 554232313 +2415648555 74769737 +3932682055 604650066 +3927985002 4208375771 +4173841301 930669450 +20923509 3111336841 1602388575 +286988256 3450246579 +94662033 214567146 +383287210 2698049691 +4107391547 3518323944 +1161561939 875693525 +1634861959 3984297366 +875027970 482508067 +1980242773 369340396 +3566180940 3566180956 +2835747910 3400774791 +4001316330 1548646221 +3416096189 1173155988 +2618010394 3213331701 +1901364336 1822929807 +2474261397 1370583174 +2189997810 1865940709 +2599768208 2150486691 +2625035142 1902767569 +3455978207 636165384 +2414575681 3963132272 +2697951381 3147485852 +177663890 3459764781 +2946494153 4143365944 +618049882 675781941 +421663372 480457335 +2639108962 53189461 +2642299781 1926292044 +2738969328 4024575957 +940683663 3537536024 +3308828165 2101774796 +2438528817 2438528801 +3363175388 1841003352 +3090831881 215727150 +1784421123 1912505781 +3037279200 1346309819 +2901926222 2553785817 +3209971779 1957544298 +2129153030 3450842465 +497266644 2091764409 +3655369090 2798718347 +664366633 1371520408 +1299105476 2841831071 +240274025 4102759256 +2854502186 3162344570 +365189122 2021459978 +2878597344 2038439384 +1193936974 1193936990 +2129504504 3357605499 +817460354 2409281693 +1640336434 988376164 +519155748 3665316009 +2153511403 2153511419 +3564298817 2983865408 +3355230457 3420702718 +1545886128 1393309551 +361813877 3875543309 +393768319 1905549054 +3958877778 3370609413 +981317384 3550694640 +1250231774 3564475516 +3089028363 3817431124 +2749458649 3570929054 +3173306900 3173306884 +898630442 974773321 +3598414600 1891107376 2891322763 +2408462627 4162246737 +3245117207 2498052390 +4003428412 2396019625 +4173330629 1530175002 +1641882154 55509651 +2838287684 3829897220 +4265144229 1248223993 +1519668114 695400133 +651198588 2520400689 +1954424511 126912897 +1823211941 127878858 +3751933690 100125579 +1023742682 527801473 +3740644488 3154128176 2227909131 +2808911593 843510862 +927746419 2149031962 +3640493723 3763868172 +3497651065 1697331276 +1508022666 163034171 +2195258408 8029251 +1602187692 1203046456 +3910724597 2962589670 +2754161239 951967415 +80609334 3326760209 +254272607 401598748 +2262716469 1941841438 +574205702 3322797245 +1047474950 1326273121 +987098497 532996630 +2956895598 3446720471 +1787092371 2453468160 +2406019578 1770982702 +165326697 3963757134 +3124628775 1454290016 +1341209299 2881460794 +1155998056 3755579051 +2145811174 640629723 +2258522935 574422928 +2583291109 90047062 +1790935231 1650773099 +3869651665 3902930704 +3974325969 1592183392 +1642670330 470516125 +570269946 2084858269 +1009692699 287559333 +3935373193 3410943150 +589929136 176063253 +4133049200 1050564949 +3937154516 3546006017 +2289779954 3062635543 +2925090944 3503446696 +553314849 201232864 +708516488 51037195 +2222403647 1613419009 +2707696018 2729275603 3926432813 +4226293897 392902574 +12832131 3074196796 +3700364462 3700364478 +3353806730 984669741 +4063843378 1088441309 +2449381708 1430666797 +3195933469 2852890462 240679145 +3898048780 3329990945 +116349936 3670915779 +4203165946 1558098333 +2486805921 1281560689 +852489609 2254407342 +3970238181 3150114332 +2133264203 1970305794 +3447555003 518710345 +3098311635 1046961239 +1045080673 3751026832 +1831932673 2919447005 +4241720960 2366654966 +368886425 904287944 +3962515050 2838799224 +4165970253 1713197896 +2206639363 3621984932 +3886143562 3989273709 +3145298590 3190779583 +2624540148 926398223 +4260763796 612070830 +3933829856 4248596147 +1738285674 1738285690 +1201809522 3101951338 +1864834644 1318370863 +3813443688 3813443704 +2735904292 3661781695 +2519835189 1710922071 +2094865134 2115069103 +2768499712 1343758980 +785369711 538684590 +1416748094 3609520457 +3939362899 4219389086 +3704982290 4042391922 2635043390 +1265459133 3623243426 +2347875836 2074673073 +4117672158 3967528706 +2257135517 1726569524 +1229394698 3408146078 +502903165 2903664596 +267065656 266469813 +1950927651 2864235677 +3693819277 1133717025 +980763267 2308420650 +3116442133 2148050716 +2147016273 3526557191 +1550421430 1497359233 +3791972810 2589158598 +1776257266 2632226021 +3968812381 3968812365 +652044978 3767465509 +3330604215 978965510 +3031383726 3927676506 +291950848 3385180364 +995512415 868848054 +3590199147 4030111118 +2948297726 1378376734 +2373342357 620863520 +2027386072 1473313312 +28280592 3397127548 +3165002462 3014316717 +482984565 3332185660 +3340183591 3340183607 +1454335437 1125990820 +685348176 686048265 +683791779 3424866204 +1554766459 1569255332 +1611142617 96101512 +1683831413 1711453210 +551288264 2186314187 +1537689440 3711324356 +2811340985 2202835774 +1910640608 1504358562 +2678117262 3626829967 +1578765337 1006701406 +318577993 729260197 +2225856050 2009461211 +3169441926 2267394759 +3617066849 3311416758 +4075935851 3719802978 +105394171 2674872488 +2277778517 247804380 +2638911596 2928442492 +673528051 3142463094 +2072580726 4006088657 +4005698049 3700354966 +388128106 1653418752 +2275839525 2686583383 +157929074 3467377690 +3671861100 4265587327 +210893598 3889057855 +4189296336 321389372 3853937013 +2195724712 2932368235 +977768247 4121326470 +1991332263 2686849849 +2155600455 2314771926 +3200807507 1631785713 5797590 +3570415430 1237779255 +3557734696 783436225 +686773737 502090584 +3677443576 3945036435 +2271874172 2817632049 +1614363701 1634682941 261417946 +175332456 3684333483 +4058767961 794120734 +4255524028 1549436908 +141966757 4146268844 +723021637 477571468 +3029662261 2721317279 +3234160602 1354097707 +4181660509 3142286178 +2543812066 3073134827 299967790 +3698622817 3965566132 1818733503 +1714084407 420170045 +1089277478 1529693655 +2167143713 3572404550 +682917663 858004958 +2501826957 1284536548 +1309626855 2860830076 +1336443073 658681823 +2140982601 752298478 +2490653127 2400166084 +3119264582 4107581246 +792342385 3752633483 +2160588281 36606409 +3581161989 183156172 +3008392873 4036899858 +3501597789 3954916980 +1038882034 1822750963 +289609648 3701361155 +2846251120 826256843 +1701088794 3075191549 +28356321 590876947 +2262159013 3885256122 +300880796 2644470097 +3184966649 3523864830 +4250060996 2370964617 +909336357 4223373499 +3397761423 1602427918 +3007553979 4000815469 +1300977673 1059940974 +2059551976 668105003 +3896969484 3016965623 +1333783413 2606737724 +1681501018 550026923 +2459526585 3343809291 +4077441773 2212760324 +499285070 657043150 +773457211 3719253649 +2765991237 3607685994 +3669510281 851229383 +3376451429 899791852 +1052404842 695773915 +3057044178 2856405139 +841459205 2087416380 +4165923197 3815806562 +1222684359 1222684375 +122289947 2491193234 +136297520 2546114992 +293147751 3938727642 +946261805 4141360068 +194522054 3508578160 +2507270434 1880542762 +2435146673 786165670 +2540369636 3612337871 +4048691262 255684642 +1072812287 2829844862 +1254046071 570914384 +1940854515 447097219 +4269224427 2158204148 +4284442531 2788173212 +4220457321 4065758531 +2914233686 3352944231 +1125933533 1125933517 +675611433 2376333710 +4078414074 125820128 +3525176202 1327090235 +3550988742 4146242231 +1159308807 1159308823 +1203820672 1955910021 +2216159982 2326655660 +1802586372 659943775 +1764368179 1659084453 +712589673 2782385037 +2879668877 3747125201 +1483121320 3516010109 +176630961 2097150232 +371546937 3399175206 +3350307212 3902885729 +3725516865 2845862119 +2233567551 1073182343 4177232311 3147938968 642369315 1230587720 63990431 +1198452867 4137983530 +1996587890 3378637925 +2289017593 3233648104 +744244053 708705994 +2512002221 1627071556 +272624610 2170908413 +3351869608 707326077 +1971345469 906684418 +79661284 1822103134 +1884988865 2679303872 +1408904316 2481188136 +93652145 93652129 +1126062155 3541825912 +3578529965 1923873042 +3803688731 3925849288 +482634772 1563829103 +895621406 661490217 +1853386286 362115695 +3903141537 2181967117 +2671858577 2747295030 +336962743 1427262480 +3808246852 1444813625 +3863607815 2373228822 +965599369 1313104018 +2739132692 399424111 +603317857 627555472 +1292974661 2535373466 +626207862 938409425 +2199608884 2551532495 +2898090669 2601893444 +545337204 2673718169 +3707475192 3624632941 +3188676192 2451896627 +3665953222 3232287393 +367256247 482200822 +1307537613 2096009906 +3613772101 1513871244 +1008622302 3464304873 +2857875084 3021233761 +615066389 25218519 +3865055941 1849527308 +954704571 1605728321 +319726580 4094433561 +980294590 3109399561 +2132893035 1246299636 +3106670801 1364320528 +1904267652 3538843084 +3054142656 940831839 +1803066491 2849920434 +444158977 444158993 +1962644870 4101912529 +570326736 477178684 +1328211600 814281909 +896749691 896749675 +2781027659 1025973524 +3279074699 949209556 +969748583 1694708278 +1892346138 2713332022 +68272864 3974608315 +2704463516 1594349457 +80575344 4286140757 +1934686012 2776105731 +1946173651 1868958764 +1574986411 2104348373 +3358034252 1648173751 +2314857434 3801848757 +3847562613 629860365 +1075117083 1075117067 +4120162609 3390238768 +1978909946 2831095179 +1003021867 1953294926 +3533204590 2284903920 +2873790266 117978262 +2142629542 2594864579 +2252773723 3156437586 +1221747177 1221747193 +1062222112 3410619749 +3957649353 3092852920 +2845619684 2008887225 +1228837366 1132447313 +70016288 2983631219 +1479726867 3943207674 +3351721882 412911485 +3877197834 107862899 +591794359 1045188614 +477005717 1459580810 +511875054 4120193977 +896875183 3599458680 +3786412680 3492621341 3517529264 +3322620224 1673294604 +1026308935 1564697881 +136313016 3246734528 +1106366602 1504397613 +1039661790 1801448297 +885751420 2555911463 +2804514751 2985836363 +2178151425 1638473110 1396282161 +1425547009 3281571456 +268147951 404229176 +60591451 1929598000 +1628056163 2938410320 +1935063808 514898651 +3051979876 3051979892 +1568560602 132195883 +1977504850 503555309 +2195724707 2848480138 +1971206516 1773433231 +4065079280 930744565 +4270178077 3381385908 +1351360673 1838636406 +1326950857 1262503800 +1914773738 1914773754 +907957812 149823112 +383452023 1986603842 +3363952278 711242977 3363952262 +3864525352 1871640720 +1863840617 2214327808 +496433254 907579571 4205381761 +3796042534 1109371609 2418526585 +2664125600 2585147365 +4279492753 1136172429 +1249543069 1261623401 +2784758254 969122233 +2312305298 2300605381 +3022020816 1593337699 +643107349 1826167980 +1319134497 3883873014 +1349570705 4023169149 +160134555 1500851556 2710184717 +535053299 660010906 +3198499555 18592586 +3830898342 448823105 +2602209377 2345748640 +864578593 3887994950 +3054501902 2838500879 +4191931120 1526437204 +922792961 2535153046 +2856406210 3335247221 +2990439766 3999223399 +2647953427 2292108780 +3067498555 1104602586 +422945057 218812154 +991202895 1348208216 +3459371893 225435964 +3109010558 914733641 +3252075710 3809156873 +3098728031 545748894 +1287360132 2216662088 +981268722 1596197333 +56295317 3711981450 +1951563203 3772512746 +2185933250 3717583989 +2627427179 4086360436 +2211685663 3518856744 +1476391231 1580096769 +3398541526 3398541510 +2547019434 2803774875 +2172100690 704010664 +2720572645 989572540 +3101789671 1625848735 +1259940003 1358257552 +687014409 4155909230 +491695074 81302723 +32793232 2746689717 +872049068 6900417 +2726567613 3847267765 2466014082 +1445307016 3203695028 +2221399823 3490289461 +2672871004 135975312 +1457670813 1457670797 +679262307 525747146 +2200380975 2778799086 +3811924049 875484595 +1266454662 1528267511 +4224473627 1660409822 +3008821215 3138339406 +4208284503 60267668 +304986244 971554777 +2293769554 2346893327 +3961928655 2402297550 +2117598210 3021163531 +2031110177 3813626950 +1113605386 2274143931 +1096023245 1096023261 +1813962982 4205044262 +1672676721 1674678502 +4082785324 492093760 +149770105 1495746376 +3285731076 2291467256 +2111309612 1192446529 +2964232867 3319623324 +2671818705 2212584976 +2683232283 3758803602 +737727984 4024706909 2234761608 +3672400994 4153017923 +3166301171 3360401091 +194467435 1981250283 +2299062045 3590574754 +573201794 1823312142 +4154817157 491559594 +2798166249 2798166265 +2535961282 2535961298 +694570698 4128114669 +1179238265 521694078 +3687804363 3687804379 +2717488149 283385098 +2902682062 2902682078 +2550244608 1022401336 +2925289783 2993490310 +1578772566 3536485299 +1592088407 1592088391 +1956674840 2963598541 +3097686774 2659481927 +3506925578 414539707 +3753634316 1989297350 1849836449 +335613571 1197434471 11130940 +3266189678 3859941433 +711102009 4062569406 +1315329911 3793465424 +1184865788 692433841 +1708506912 1870389093 +2090866115 1555750053 +3514796437 689761901 +2766214187 1980051825 +4222482980 4222482996 +3740712479 453818588 +3887359663 1878893944 +2677862028 3490416225 +787531405 1913163762 +592435442 4271375070 604457613 604457626 +3126941490 795532438 +2985185751 4046116198 +3891038312 1389721504 +181115897 4152789246 +209488711 4279196134 209488727 +1193650414 3352278845 +1888322275 903207389 +287190578 4092065260 +3477285629 1136438338 +2247902900 1737667817 +3279597382 3732516666 +3748938187 2399376002 +1568858125 1107735666 +3656678234 1873464972 +3379777839 3379777855 +1884253255 336032726 +3041135767 1355611392 +2816495800 4263449019 +2498373994 3600757197 +633560904 3129933405 +1497243690 2740681446 +4043509182 634298911 +1029914058 1832535277 +4268841739 2540851778 +96660181 3872894282 +475937327 2053999441 +3976792979 3091019884 +4007442342 1079539431 +2581436824 3487091277 +1809055155 4183839500 +4127923695 3887146299 +1581315719 3879999104 +2885307874 2634586819 +1161811080 2340131339 +42946265 83724815 +785347634 3801344691 +196627133 1376810340 +618109776 1332313827 +2121166763 3235467214 +3745385310 3433817343 +447034201 3443570100 +2832439586 3877245077 +3337077115 2580911282 +3891802355 515182234 +245855916 3181367489 +3097984989 2360232180 +1400647594 377424013 +3467483058 300124805 +1791125210 2440300646 +4290213892 2446454345 +850576522 3568746848 +2051577763 2051577779 +2645125620 632408847 +3729588463 1356465553 +3822967257 3822967241 +366842505 4107120046 +2365429186 2716130269 +1072124598 1327969415 +3723956307 83303654 +3429053634 2183925109 +755466308 398192921 +25029212 3040341713 +169919659 2627049762 +791270555 3013580819 +2022778252 1484659553 +3421436944 3081114473 +2928210346 4212249410 +2970870087 155951817 +3605812267 1271379695 +2589998700 3037795283 +2635653012 2112652883 +2018801001 510277336 +831550445 1018834698 +3549365473 1623080710 +1688433460 3306597326 +3147987980 1825130209 +2005591409 2713091575 +4133013175 2227229200 +855932825 3386459262 +252025999 886404366 +51423719 3124459190 +807264537 1958298110 +3590448239 1408932526 +132112915 2243349655 +886446661 855618371 +1228717858 1822483075 +1334178530 1334178546 +2238963986 661344069 +2939717260 4253130716 +2100025107 520327916 +3547710003 358659660 +629900786 3639820186 +1635370622 2174346466 +3329076424 3051566581 +3817194976 2078093924 +1987909702 3496761489 +3811614737 2246854563 +3960623791 3960623807 +1125560189 431374786 +993138140 3583363754 +2573648888 1959165805 +2282948515 632804487 2282948531 +2255076453 4252209900 +2291433955 4182587203 +3755927193 82117342 +3875423896 4000157800 +3895720003 3436171644 +3364618322 107249925 +3234053907 2267400940 +4229581514 2808331245 +2558357002 2801197413 +1970903601 527285030 +3525590553 545718059 +1066478251 3162909492 +3408509870 634713070 +4232074452 3980757433 +3016528395 369747778 +3181206586 351433493 +3743496612 576767897 3076142536 +2857461854 2082950143 +2276055043 3064006052 +294875517 2525017938 +5370903 1365898566 +2343325728 1921713016 +157005414 559313830 559948439 +230204207 3366511342 +2180834048 2702792965 +2267256034 357548011 +3227256541 2917060084 +676598087 3277271744 +838399942 2109604871 +383237243 1889383844 +3882324786 3953633187 +2026965680 2026965664 +3124183436 1424189660 2969317217 +3471480745 1682751246 +4159754085 3038149626 +3734567195 2245010834 +1157105102 1618027353 +3601763741 2706300820 +1793351533 1703070492 530608611 1736625719 2566853678 +3670113905 3112223069 +2053125611 2423578868 +3087100910 1457567855 +2419233664 2305218378 +3029102605 1175741540 +2441088842 1452806523 +1838139215 3096599948 +3320175025 970305968 +1005243897 1268924151 +4107143118 3688418861 +1209650703 2409587096 +2517144268 2525361820 +1856531251 1713422668 +708852641 507460320 +1979344329 2184067950 +2080812288 1426322345 +1988988189 2022222594 +852754126 1996338766 +314759563 51990101 +1044334836 4053784591 +950650650 1296330237 +1336464173 4030004673 +3037779027 1551777466 +2703537757 3434157653 164303970 +312353518 4169350424 +32992483 3112474972 +3521915758 1832031770 +2739252008 1987332931 +3120527835 2821510098 +1390845836 218966391 +2975949714 761888702 +1033017850 1780980438 +3074242127 3294395985 +2136323663 3270377038 +3843527421 2379264037 3655812827 2599686054 +2947561548 3216198240 3731398561 +326416067 326416083 +1737149895 3598846310 1737149911 +192339406 3659475791 +2774923114 1017744724 +1479084583 4247181037 +1863168776 3666924957 +1990982408 3636211083 +3521716951 1575467075 1224857712 +886330304 3930052435 +336576297 3184127374 +3303855081 3922827214 +4166376353 3220068318 +1357073281 1060599462 +4037361848 4037361832 +1905897195 3220069364 +1527439012 2547479695 +2076354471 2054024182 +3369023814 1681336609 +21207879 21207895 +2436495020 1245663425 +4214419193 1781412350 +1288833630 1285968361 2832405609 +1642833161 1754016251 425656184 +2842186555 399250459 3929736690 +3496140204 3080910273 +3857324487 3062273088 +931644527 3652860590 +128543675 2118799976 +1228916354 1170627229 3513089699 +203720390 2397724240 +2111723045 1867410201 +3610921392 2146004611 +1679504426 3235061275 +2844420390 1991348514 +3916623712 2851599931 +1554073515 3466848207 +962988521 1151441359 +2283704654 2518597081 +3827152300 2448208360 +2105823834 4048397245 +3007720707 3007720723 +202459069 3351279266 +1383937325 2483829124 +203668949 3779312908 +3351432279 3467095270 +1265990019 3724344387 +2233550154 3714061165 +3644147400 3173343220 3068030173 +2517668379 2544028044 +828112969 4241781496 +3730507055 3729970766 +1403174741 4264768202 +3447839718 2861015578 +4202495272 2059568637 +779978269 61605553 +417682681 595626185 +3713376248 3713376232 +3837217130 1988661709 +1274118187 3089941410 +3475728210 195467187 +1964997428 2214921556 +2900135234 1630691061 +3668130687 4120869152 +3711018071 2351281382 +2323712918 2929673334 2670017831 +2289154523 569220510 +1853140980 2749314425 +965104554 947238043 +384711641 384711625 +142086642 3199249293 +1771607111 3936945447 +3234694387 495800134 +3822456208 4116854763 +1072225961 1150714904 +3503718150 3349804663 +2768895997 4262627554 +2857285419 1156208820 +3662807333 3558329644 +4258734451 4212361952 +7150784 1808024133 +3681804101 3160963482 +865850746 3092320011 +1587912482 352677302 +1332494412 1399404449 +3160216717 327637490 +4048400605 3125636084 +2239949423 2618756273 +4166077177 570714242 +1202822392 3566869115 +3587395529 2514223992 +2140462396 1690679575 +3992574826 173303757 +1039935518 2985502527 +80503234 4008611369 +3451196113 2769067782 +2853185320 2853185336 +3543019500 94378775 +1039007854 749641977 +2853043801 2695217470 +1731602162 1816088307 +3321008463 3619771091 3697581322 2913179064 1930575709 1387984076 2761046722 3114781948 2854175839 3039148257 2312485541 3951493132 4069862936 +2007767909 3371114476 +1580928800 1661383288 +474434724 2181862031 +2172809717 3579405482 +3706268538 3629130288 +317819336 2840255220 +1220183730 799148595 +3504553609 1589342648 +1336819214 2102112281 +2186467310 376040377 +974321392 1541061571 +2091380705 492740384 +545947031 3506681017 +3067835635 2493827680 +2222555516 2776837927 +1727448337 995112854 +2619564561 2017007976 +1989569642 3845191365 +3709215394 3847596398 +41530035 1384961135 +1390080039 2510818678 +4067882657 1380335478 +2379364845 2531131652 +2777477660 3000161036 +1604071862 954352007 +3124817148 1094185644 +440723214 1752677145 +4171870784 3005455059 +95574498 3653467843 +463057123 2803613648 +2925317800 605639275 +684797852 3712873095 +4052657753 2310047975 +3410878063 2056595640 +2681080710 3420155652 +676614307 676614323 +20182408 1825277213 +3730418956 321612266 +3446981769 62833912 +2527159797 353599676 +3407561700 2683035647 +379820937 3511425518 +3966511437 1269149081 +1120553056 2221928243 +1942214555 561307941 +1922405590 930696423 +3631569178 3977032541 +3984589246 2798734025 +2331003900 3024592305 +2140271253 1740693654 +970033642 4007402331 +2302893181 2450168020 +1689648659 3672131735 1689648643 +1406363632 2518550859 +96569532 3416932327 +58138713 3448237064 +1539738949 3197133708 +1937211948 3647297344 4045531969 +300547388 3139399921 +467600666 4195682301 +2560285556 1342260703 +4046977776 2871003075 +381835774 2719828909 +4086714620 1906408625 +3890795059 2817197645 +1729132559 1307377560 +60788275 3878476378 +3782311140 3143209956 +637752803 637752819 +1166408984 2314038491 +727213993 727214009 +402964618 1501239597 +2532507485 4253548404 +2525417232 4279801195 +2070603442 3341643355 +2365753211 1586508863 +1224222478 1917319274 +605166137 25118654 +2257932363 2257932379 +2835707726 1637535705 2835707742 +330082683 1942932658 +4878824 1563512893 +1415147439 2009780344 +2013495619 4197064364 +3927405617 3018582310 +4261110075 2790556146 +663930742 3255828177 +1815274087 3139069984 +1238473883 3489236996 +1480789743 3767566904 +4195480434 474102885 +2214532919 136229795 +328976949 322916714 +3418529563 3730864013 +1224009793 445226560 +837929994 2846110651 +1140850771 1593868986 +1288076103 1244931353 +2216575621 2158147404 +2951618800 3822967235 +1773457812 523401471 +3594458400 1699627379 +2329453505 1409927360 +2164299693 1565567179 +1015678707 1078521996 +2865385500 1012936391 +2385587139 227272112 +1212236734 2092803103 +1478117115 2140194299 +3619892320 603128200 +665156597 1585586876 +2327215660 2169366006 +1444233815 3665260262 +932961230 1482360143 +1374462104 1998317788 +3409108749 1438871488 +3262484475 768323775 +2122818937 2827582846 +1988968795 4217234002 +1835369583 3181260730 +1279858676 1974736928 +2495462918 749871991 +519184594 2301209221 +1276863665 2149548710 +1008241177 3013698888 +3309035041 2654907872 +2611360630 4221394774 2091057863 +3613981481 1128489368 +2764707518 1278601183 +2267788888 3347300837 +1561547366 805138353 +46275617 2022852576 +3355867371 3399824556 +3978431651 4071476231 +4143409733 4252728456 +2887355335 3006728768 +984513209 430649662 +2108231843 1854635844 +3746829070 2673475343 +2087536935 118106208 +2163835079 3485841750 +1875036969 333375237 +3460949477 3460949493 +3748830136 2037064379 +3192032171 1009830862 +2924746503 1360528985 +2222946320 2762604853 +1220076814 3558516377 +754697938 2723806341 +3875860918 1657307527 +2817637978 3146688427 +1260549246 3309134409 +3592912782 2922237081 +2732493934 1309674735 +1949637211 1251507538 +3477846132 147675886 +1777050077 2599407348 +2386758345 993344302 +3203226232 4205300654 +3715193850 2856835285 +1409996960 3977446373 +3548708657 727562790 +3607078691 680967483 +76478563 3555570631 +707491475 3095110179 +3590630451 4016108448 +3558152365 4176380577 +515345358 3263466329 +254216528 3373463979 +185389194 3182905331 +2282884898 1450037909 +260316726 2567055383 +3471988120 3471988104 +882143512 3719170253 +228777196 1667352471 +901437490 772701133 +1760395701 3991904106 +458580220 57126055 +2881199244 3017088506 +2051120844 1095564087 +543068833 2514539382 +2614627460 3642471369 +3198622201 31217097 437117694 +3838534563 3475888540 +3212690036 3212690020 +160795827 3488421994 +1757683862 1757683846 +2244836123 3822871589 +2958235847 1506804032 +2212719313 1879123728 +4280992594 4280992578 +2177435582 225914889 +346980563 1535772183 +1210262099 3796830380 +982481974 2129712524 +2389337486 36002585 +3042733095 2810069344 +155216193 3513102678 +429142065 3324060353 1967643942 +1160306027 1247055732 +2757250679 3213548788 +1936540490 4278250861 +1325276209 17493697 +3591909040 3632991772 3088154389 +1930691735 882105890 3213048230 +1250215205 3652351580 +158143310 615867343 2559319758 +2626493172 3751825736 +3241702467 1860109674 +3918545891 3918545907 +3428803756 1714125505 +3623699247 3142594129 +2604291362 2127824003 +60130143 3568050204 +3731603833 2627834216 +695073286 8652221 +363560725 3037796794 +2862766358 1446448609 +3328820793 2612432961 +2016807858 2619452974 +3523963123 2107104887 2599827077 +3480987030 900049703 900049710 +2882251162 194772331 +2779031303 3375558656 +3936584966 1868926586 +3846141007 3739885271 +918161206 1557748241 +4139191140 3324440191 +3928558746 3877703184 +2112526450 2857237363 +1195543820 3499855137 +2338971725 3299612964 +637377179 2867350600 +1130424920 1547626144 +1276380372 2541984175 +2973963385 2241411688 +3066703511 3103532081 +2430310071 1716651376 +4255242747 1086989874 +1680789176 1411808007 +3335574294 4277997487 +530082235 744258092 +2437109406 1850420877 +562950398 3497156575 +2954047847 3059249502 +1472317038 2483773231 +2553840020 888404975 +234612674 3314407011 +2832889430 635980135 +3570621608 3005814979 +169215255 428139594 +3654852803 1662573745 +265366003 1006432404 4069335497 +3343865178 2448089397 +3177676565 1055723036 +3237765090 2940924117 +3731326023 3731326039 +1591626014 1978473023 +1096687259 2183802372 +1928725442 3142052451 +181504679 2933736672 +416174760 441712323 +561223687 4270185161 +3861395991 1801240980 +1413474294 3413917280 +3658154410 3914571419 +1944816492 3582640828 284696956 +601636093 1890845268 +1577400968 2319131677 +1860447344 20051011 +416658963 728604666 +2925465853 2091368002 +2689990999 1918737353 +1803713840 502887602 +3173327479 3173327463 +702979574 3960121927 +1048839597 1048839613 +2040478596 127768464 +2747785039 1168772933 +710896934 3414224858 +2770215927 3849493958 +1236935974 906525399 +718719198 90208784 +3202210011 4050845819 198939483 +2262799505 80705124 +3706719159 2229432582 +2875324118 2704773873 +367103886 2953418009 +303388950 4217757482 +829940865 2804383986 +3148325709 3051754043 +1499562373 964617306 +2331888902 2094662050 +3098806614 426422887 +3468849254 854147682 +2459997061 1472739930 +2560582319 2560582335 +1077335978 1637446661 +3198157876 1239850457 +488691701 3484677802 +1975396702 2618912588 +722084592 2603593417 +4029947016 3372780468 2852710941 +1711307560 3133267947 +2669529313 1558395424 +2091230641 3847280132 +2808647115 1419196034 +2764376267 3130485822 +206608041 206608057 +4161197488 3439561995 +2730516954 2352873890 +2933240902 2933240918 +273012563 4042389434 +2557270124 892057601 +2214516918 2214516902 +30373128 2934752576 +3056403459 3852078653 +3475046194 361396941 +72935285 1252958929 +3051837994 2234707981 +507209122 991513198 +979977857 1958346006 +3700160744 2430054147 +4264441123 3054293661 +2814269266 3985918850 +2466071233 707944422 +878546293 2209529626 +4022288496 2684802525 +2188839696 1902537251 +3428250507 4037213545 +3270941291 1429542516 +2266719360 807351699 +3782716426 4184069037 +386010356 742024207 +3206259304 1082173867 +2988531081 4085661358 +207838539 1322059374 +103287628 4150711671 +675556052 810637620 +2903925063 2903925079 +3778966043 2957877394 +1110057135 2140558037 +1082733721 821939422 4253647209 +4237540442 3524206645 +11749654 809242023 +4066682638 3389077657 +75300253 2891632514 +3249847359 780425022 +327624386 2143421301 +3658486899 3125817626 +246655651 3352665756 +2717003556 339752361 +2210995443 875475552 +3106031915 2616798900 +4033728232 74740995 +860394275 3728711690 +408466623 312772798 +1969202830 4229653390 +353835677 353835661 +2672581587 2553580837 +1038364737 2770004765 +4083221776 834336803 +1591486657 245674240 1750949996 26982223 2379974596 1196535214 +3144897422 4139280140 +3835764757 4272259356 +3403910819 765152856 1012748402 3747226670 +3450353625 3450353609 +1651677492 778513625 +3811378452 1487145460 +3461707926 2595356594 +3554886278 348240119 +2252354922 3746788518 +10965364 2070231449 +2941315049 3848082382 +2292641354 1872427954 +302615545 1577539838 +342110765 1186659524 +1274911367 1085714308 +1048715003 689461183 +1738084861 548265487 +4182665749 3941117786 4142761267 +2276483147 2808102759 2530294588 +1379244417 3948979712 +2291469246 4254521316 +406672479 2274087326 +1554724036 2776895625 +1245483965 1792533015 +1876653995 4271970129 +3414463026 2477925555 +1970095737 1409675368 +3948282172 3026448743 +2177461579 961123960 +3585823043 2249475888 +1282749846 1938384754 +3687338472 2690336927 +3149401533 3649285301 1069392002 +3505311849 3138881998 +3931922823 2203530746 +2214789815 3492111055 3203746612 +1300320111 202414494 +303617482 1192791282 +1577564234 4221167582 +2923847639 2839002434 +4242362419 3796221497 +3110861800 3439169085 +196777296 3334016245 +945404253 306105698 +427296985 4042648990 +13289730 1691846136 +3918297610 702205285 +1315483027 1315483011 +3974693793 1868583703 +776514865 1102735318 +2274652512 361838495 +2771331447 2151564880 +1895523970 3860704175 +4217048468 2365134079 +4087484404 2814339758 +611249256 3265144747 +3623915049 3071090135 +1707223109 1973773466 +489239070 98166057 +1484122619 796185258 +3884222897 2069682262 +1290434236 456672871 +1278501859 3648601692 +1291506102 3484947978 +2199231419 210371176 +2461756339 2953480922 +3864242969 2931185758 +2319235648 3717804755 +1569914884 1382614601 +706979214 3827146393 +4071745827 823263754 311261190 +3604573673 558368216 +3421904557 3245492804 +3462937688 3462937672 +4028930251 3567028116 +2884790361 1500823763 3276465292 +2742120636 1561185260 +1528086004 3641430932 +2514088874 2417661083 +603870956 2506282391 +2181840975 863090353 +3511178215 997488627 +183255563 1288669239 +601888403 3429576301 +995310978 3296209290 3859403683 +971464793 971464777 +1176126113 1256476853 +3054778180 2174176772 +3809719469 621112402 +939409048 1783216855 +29699275 2489680788 +3111884134 1670131585 +1506547095 4081450160 +912557944 406929901 +2545353279 2512866805 +2085875339 550127780 +308806042 2478474603 +413084641 3035905553 +668423451 2424848844 +4158658374 4158658390 +825938652 2220183441 +2995514245 2537800268 2537800282 +3577906904 2411349531 +3192383904 3910474349 +3754934953 4245647384 +556399668 1171336780 +3453546217 4118812888 +3908320931 2756535174 +1137046797 3181429618 +3193193041 2804072830 +3886587495 2508350537 +1860849406 2126215689 +4080970486 3785826641 +124263446 3202627249 3202627239 +3039249866 4141014253 +899405981 22413108 +3246798523 162144539 +3709620111 2727427598 +3957599223 2054665844 +3335578595 3721838154 +3954159936 1292385037 +2376838791 2353249942 +3924426637 3361557234 +1681540285 3712002865 +365001356 3671717559 +3235629101 3338411730 +4086591062 1243759905 3366564199 2130499818 +2444998857 864281720 +579063454 4085138111 +3633060234 1854682157 +3267203360 2959832435 +3174811107 3357049930 +3668800320 1974097348 +3407179406 2023099407 +3440960530 3440960514 +3291892284 494328945 +4233330077 3564027444 +430995664 1087254389 +3856279595 23935906 +1652279951 1556266619 +1342522893 88950386 +1483117422 660415673 +1003819788 1013775351 +1456039583 1041009758 +3151145216 3304151259 +2795133068 3506005111 +326107350 1867600103 +3647977347 1347204967 +145046499 2132624970 +90853068 439916376 +1843532480 3135472723 +1651576850 167529541 +4079729103 242451164 +2180844367 4032351576 +3057787610 3899666673 +2993540945 870145168 +2423860705 1338194230 +608444356 3678273951 +3455094469 4138778636 +2028993626 1248157749 +1805639974 2460970711 +232235347 494073260 +2864967339 2641383218 +1111651238 3366355645 1603229530 +4115319682 2797493667 +1745146061 2358555300 +1015621744 3152717909 +4291456445 312184105 +180740542 3011665439 +1800949819 923159780 +3347662571 2666599855 +104653885 249252866 +1888630713 4012750888 +1452376585 1452376601 +2542954611 807979789 +2505268999 423532566 +535053291 525789940 +355354362 1690450883 +755072239 526066974 +487026089 1538367758 +2560838625 705721120 +741956143 3444111352 +1507184668 2274794503 +2565856541 217807618 +2500314934 2908071748 +2603388000 1038834491 +1458330921 1458330937 +2299721394 2061130291 +2886663217 4155952832 +1466534838 1196102017 +119462943 1419019486 +1964312187 1964312171 +2070447506 3616163027 +330694964 2309046664 +2576782924 872142967 +858416394 858416410 +1630846396 2766368840 +3169431297 1692302998 +3573918467 1525429674 +1377709462 3682714417 +3036828664 690206848 +2543104949 1220530505 +3783962745 2253639272 +2580979929 900555460 +2814163987 555487738 +1156072768 356534212 +2687117165 1072567762 +919397224 2894724267 +2363587281 2363587265 +1402208710 1476315809 +563307832 307304204 589380549 +3864944668 3264302087 +580564036 3179923209 +2493951847 1768300320 +4281041469 4001236500 +2952704140 3048283319 +1802007958 3236993472 +1537969628 722489681 +2796307069 2186334069 3727469250 +2843624578 2843624594 +1850470359 840944962 +3957935296 264503963 +3084623646 2361097257 +569140228 1351365901 +3910701793 3534698528 +1111262389 4198820092 +1491720153 3514365630 +3155335613 3460826251 +807251339 1236808148 +2474629538 3561200149 +67543216 107934997 +2481127801 1197166974 +1804661940 4170891667 +1115268123 2303668680 +2656597838 1197023698 +1859924890 514145131 +1347237439 571511809 +3277139737 2551784514 +4256805182 2840724617 +2484414865 2924506960 +3125342197 1664034202 +141334633 4210985842 +1277829209 1062267934 +3233395219 3266999587 +2048631236 4253001631 +1819971967 1140001512 +1816330472 1434086717 +1215591342 3176274681 +2428638427 2487287080 +160276266 160276282 +3989255742 470471519 +534573201 3328559670 +1559309841 3112304061 +465858719 1430080065 +3034259635 1910225952 +3773241590 2221492042 +1318536617 1629661454 +2212314375 216097842 +4090885554 1312593229 +2075637014 3627159985 +1581638238 3322108393 +1245671718 132062913 +3207423670 446044627 +677380870 2502214241 +654421632 3886396293 +3910804663 2208711536 +1660783484 3933161776 1361220657 +1020701262 334371023 +1994334339 2755669564 +3711048083 3370009210 +230583145 3793001623 +3576097978 1626872086 +3794858223 3693084481 +1542621002 1542621018 +659452171 136421422 +1098010259 2582753658 +679034326 2782814369 +3835463504 845742819 +826728204 2660311031 +585832535 1907648962 +802663659 1031818622 +3671103330 3630059331 +1424011928 901326171 +3332568663 2553832137 +3962390649 2256345286 +1426113573 4113876524 +2540320892 3627477799 +257972365 3536944114 +3327105260 2086546433 +3842791466 3187138426 +296907847 585960406 +3062273090 1113329666 +3334657898 2775661182 1320754130 +1086513860 3066755721 +1674429217 1839515462 +2983359094 2814981718 +1642552201 2822052024 +47258127 927780443 +3694933896 2872680099 +2426113251 2279524693 +456090000 3809324028 1536595381 +1652385486 2399755855 +3521099484 2932640951 3542398796 +2219822579 1017197978 +3502639573 2928902778 +1217675844 2852950545 +1776334239 2213952587 +3833026408 1747400193 +1327918970 1392415358 +1365941178 3129497200 +3042804016 441115787 +1790989354 2262611686 +727154691 4008375270 +3529125233 1153507739 +2696871077 1220748643 +3842197502 2356107789 +3164852599 1826799184 +1089032705 2476686979 +863009274 4094690443 +2729452254 4182172521 +2828487766 2828487750 +1577317511 2268721302 +1088576921 891798455 +2109671335 1900917156 +1997181867 279344674 +2899027462 177625975 +3313358871 4229639206 +2622664469 724147722 +4251866262 60943642 +188632494 3253653561 +3693514575 2075811647 +177301076 4142143033 +1153853727 1666677726 +1047270343 3797504665 +1330880463 2946798286 +880484754 802543813 +3335787488 3755690405 +167837404 1864306090 +1741183058 3840362733 +405448566 405448550 +869389601 3693937328 +2108800412 2060287111 +697165453 3062266248 1831652569 +2820918620 1808977612 +1017730212 579878463 +4171509333 789936890 +584690014 584689998 +2011041398 383412609 +489000219 603819429 +2949458295 922240592 +3203151006 3190874733 +2598150870 2673104615 +2809647929 3930116382 +3885637055 947316353 +2000784361 3613487449 +3230683857 1900779105 +3958635789 2115459954 +106718097 106718081 +2129650401 1166800680 +1934892580 2976608959 +1139896911 1142354520 +746954601 2348385432 +3765673049 2935955464 +3797595710 3079295817 +1652649391 1137543605 +2093112604 2093112588 +2024977002 1800330445 +251722020 2311305892 +2642691776 1035981425 +1335738055 475222848 +2503167384 2503167368 +4259680525 2506270834 +53864788 1871673870 +2263416398 3256200914 +405597179 3484626697 1876454590 +2824929849 3360364552 +2760217257 2806374424 +4237238010 2404238237 +3700016067 2488416100 +3559958534 244875639 +3848707266 3800614261 +810274456 810274440 +704133967 3517771110 +3748963201 1857993089 +2991507839 822555368 +4257723265 1172844515 +2287843462 4067201735 +2140989674 3456280653 +1635585531 1927086642 +1663145751 1039525524 +2163069176 2163069160 +964444995 3248349820 +2452075108 2021512041 +445706442 1581152710 +2560840716 3726847031 +3716724888 188493349 +1976104134 827937697 +1063882559 838205714 +1465122912 943030360 +417988652 306913724 +3692987352 1544129805 +2239324110 2651817256 +3538915605 606168074 +2498652165 1013253162 +56838205 2454370315 +3697053655 3166072678 +1430766690 2725858478 +1302450404 431740649 +941521896 1073548861 +4143030525 1893238596 +1894492537 1006356834 1006356862 +280238963 280238947 +1633121146 3064645917 +4080641895 1254262560 +3705040588 1905290039 +152011202 1537730510 +3388915413 3506858332 +1806506294 3078533127 +3733165108 3439361641 +2979004295 2979004311 +29459047 715147318 +1675264218 1547602310 +910124920 910124904 +2110452873 164647280 +3212036083 1447281548 +2861104760 3734021487 3434376622 +648983067 2382404201 +2661231455 1564001377 1437730844 +4237212671 3844117359 +332645448 1778729055 +2277583398 3675609559 3114036582 +1590133020 1343241991 +1427576000 1427576016 +112420535 888558960 +4136255180 2017352028 +1465694732 2465784033 +4088050744 3451499565 +3302903258 3287584317 +1166936031 2071087928 +2358662401 1369952384 +2988311454 54505919 +1358745028 1106766729 +2983104697 4179856030 +308298267 1805115647 +1603881100 2559145143 +224048693 3578005833 +667788762 2193364523 +2318434247 1953035929 +2978310409 2396545912 +1035359474 2873007317 +1656225283 2575997860 +3257938056 970745355 +4053768046 2960887790 +3832759672 1872699833 +2866901954 3270064739 +1900552350 2220663242 +4185726305 1919529287 +675890972 1297156515 +1703298836 3865175151 +2630033175 2630033159 +3606931692 1558981505 +3154672390 3099718001 +2687149967 2349577841 +3509547494 867192087 +3918463457 3918463473 +4007516922 2186145731 +2555707136 3452792069 +1406116622 4259163919 +1330717834 1723630893 +585749246 585749230 +2425999718 607456922 +3262296932 1976568286 +334454330 4230054894 +2846469914 807314923 +765463390 3382270424 +3223187186 1629431525 +395251568 2251640131 +2481245001 439092206 +3889784286 2003999721 +196973004 1198294049 +4123795447 4242721378 +926091344 3951333564 +667556509 550352002 1076356404 3958432363 +3966195425 205326791 +3302745864 3995906443 +1273377109 3495930058 +2150583938 1282971317 +802225337 2109703590 +3931380541 3113153233 +2527510447 3615473784 +2528776634 938668054 +1657194314 3172265583 +3147823857 2733394551 +4159717105 4159717089 +2901524345 3113249640 +3390077584 100457576 +2345920072 4108775756 +1793402908 2186462928 +2691423941 1322233882 +3851631438 3032898521 +2129650403 2103006575 2676300424 +1856375893 3817655795 +2122520618 1381960205 +1787569899 3848612489 +253448649 2948617170 +2653244425 2237656921 +763432601 992606920 +2435505937 2107670828 +1001199635 4238209687 +1244684759 2703885680 +1550643813 2986182044 +1698501528 1698501512 +1849226262 557140010 +2516059620 2521894351 +3677345915 4172485686 +3430420561 3710426377 +1129934849 113987968 +4067201854 2989638842 +310293761 2601057245 +895612275 1037656817 +2892632922 3304879805 +942748785 2903399114 +3589315417 583306504 +627893231 627893247 +2496953095 1367190528 +597724160 597724176 +2693140968 2869840251 +1082752366 108033081 +2582729409 400901568 +4251618273 3677496362 +3029323293 2087670805 +1459737626 410952590 +1807999647 3885347164 +2707942979 2360519728 +2629876467 3060157594 +3015251771 2691754015 +4272597050 2979962626 +472567308 2373653084 +2376563006 1759307566 +3303948801 68282240 +2922888581 3039580491 +3246100358 1176486343 +2430238717 1918021672 +1229219032 782942235 +1228008501 1855379306 2171935693 +1137596850 1187356569 +508235030 3556612906 +3013492585 723374670 +1726597742 1879681839 +3135498869 1931535386 +1070778579 1742050906 +3092277201 3092277185 +611523744 20320243 +3136172611 2281250684 +2294507700 4288533327 +1077924045 1077924061 +3990130459 2157791122 +3125339691 1807898036 +176255963 1690919378 +2838287701 2794706140 2794706122 +63151284 686323941 +28045885 3735967252 +3318978065 2533221514 +1223782195 1835724448 +1210337487 1438821336 +3076874849 953472946 +37590988 1391851041 +3365866059 1303968622 +795908746 3437830643 +1178436542 1618975945 +595745209 595745193 +864051731 3683334563 +1301643235 3205077974 +3914713182 526910079 +3726562078 3934055231 +4276494103 3305165402 93426144 4037052162 +3003451915 3689860930 +3458038911 4150983678 +832179136 4102397986 +2875472610 2479644226 +3027480717 1873843186 +751509504 1905272781 +262454980 1683508873 +2858179310 493036729 +2007030105 2872452872 +1920146055 99102610 +4105154510 4270965081 +3833199654 3523735511 +3806567972 3438117936 +971525360 414260675 +820554851 3302870485 567704036 2694441062 +198259799 3647858114 +2501381493 702361404 +63674599 3766596534 +492896135 3333570966 +212744675 2911324588 +3802071017 2840386510 +3791599347 2800000037 +242744798 2766447743 +4124654214 4124654230 +3706049502 2613872255 +2487240050 3542962789 +4011298579 1040105879 +1731842105 3103967656 +2437363608 1260160091 +1847662078 1544920777 +375135715 369298506 +4052555960 4179487163 +1376097903 2378944696 +267597373 3893643554 +3986002739 68479064 +2930569462 4030681937 +3495195707 804452580 +2673270395 563512923 +2567024543 3617769332 +1377764302 186953850 +311885178 1338921783 +1167911530 1167911546 +4093419091 129401536 +866952136 1953268981 +140460603 1760903908 +3077974034 3774944339 +55554569 2144676127 +3052284534 3689732039 +1890174774 2437192209 +2458834846 24306601 +2749520276 2438136825 +959396082 4149650675 +3589134356 3165594495 +203554330 517987837 +2536593433 464367455 +3868093995 490171810 +3325476553 3119648568 +1298701793 1072168976 +1051605241 1332685336 +2021088792 3152617435 +1747508786 710265011 +3688792174 2438144239 +2685607841 1183657830 +347629735 1162657526 +936182924 1673406583 +3755421180 673448580 +733120198 733120214 +1397360751 1220339839 +3944193123 3359596923 2143238834 +2719824192 1946230725 +4109973378 4065058740 +1545811234 84343357 +617174452 2633099865 +556474969 2797700414 +4228738046 1475632905 +3557607852 2082568663 +2009165770 1333983995 640751922 +954895731 1557835431 +3243644591 3243644607 +1113887157 961634300 +3776827774 3757099337 +3982272178 1524263461 +3638466124 2021906529 +1948391915 3165572322 +3028077380 1685322783 +1112325606 1154412801 +3392273301 3786345372 +2615346794 3496155355 +635127052 1492061043 +77892564 587734713 +3631665714 4111262899 +88095611 3206390436 +1796279139 4006931676 +2880050250 1559045158 +877432981 3917978250 +3497688120 786410195 +2838868747 158315064 +2532604404 2530999065 +575371833 902916030 +1948200900 943141303 +2284406905 258631752 +3889115740 3685972743 +2286545629 3203964628 +1482925978 3874692450 +2280914261 1511509194 +3988649705 1770780351 +2242214551 74621360 +2873207519 2002779422 +2545326551 1675860535 +3454980012 758924856 +1005645505 1691685277 +1127786172 2385410535 +1476622007 2061914197 +1346299457 2483320896 +4015011815 1865566201 391707620 2722627744 +719850175 4010555597 2563335786 +1381235114 1976035697 +2071632933 2265173562 +64694951 874751545 +1443850225 1169985188 +2472325075 2472325059 +389203130 3624357781 +3326297202 2380578661 +2779741906 2772739219 +1783993692 905975303 +610269697 4209647604 +2481038713 1952091464 +3399831742 3439113514 +1625387466 1625387482 +3884849999 1282211778 +601889927 2683710537 +2876650609 1544850928 +1887520362 2239879373 +2990126326 2362735809 +2529951613 3760402900 +1752102062 346762745 +586531648 2170133773 +1455963331 1614259964 +1182587745 1468881312 +2294374002 3127356787 +475352446 407436617 +2836481269 1977352858 +435456090 905094589 +2740503364 2740503380 +1431054688 2800034341 +2617852667 2643751204 +1092261319 2086627481 +2516434139 4184886482 +3419754413 3755195631 +1501139556 3720372324 +1666001313 4084762751 +4051806645 3827181546 +945065300 1829214232 +885046426 4070678454 +16657106 1646094483 +291912424 1273936701 +2325604504 3465881435 +452740114 2367629381 +402021350 2664606487 +1283759606 1791273543 +2584418771 25307735 +4198961181 450780596 +2490544533 1166904732 +3064929087 3567772734 +461687597 1584876699 +4095677237 4015004365 +2959714058 197337830 +1412309574 242573370 +1011355639 2687442570 1011355623 +261422194 4186531685 +513658980 2864220772 +230347832 2754854023 +2146428043 2517351325 2764457986 2165555203 3153005493 +1937133208 1530771789 +2215540035 633509994 +601210480 3648703043 +949655518 209985023 +2279510288 4061721576 +792978220 2480840257 +3481165972 2893305972 +270664827 3767340452 +3786037806 1831597670 +2201279794 3191354803 +2456679175 1610087428 +1891137789 1868985940 +3545987579 3019965988 +605494018 3529475125 +960527840 2016438459 +2887510626 1122619773 +1935136261 2416910890 +2741289182 1405248429 +3981910524 2280063911 +271000823 1688154320 +2618368888 653972973 +3356216506 2761115869 +2932357723 2150882642 +3908618949 2225550348 +3410689823 3019820788 +1247204725 2075264810 +745537904 1683112796 +3662123514 3341188005 +2089239612 58172100 +1683737887 461629384 +2940533551 1123751505 +3669964945 3959819334 +520509149 1712958383 901311188 +4178572253 4045202658 +1056377096 652425108 +1690003608 721790797 +1007847408 2167144131 +657212649 2477816526 +2441918319 2407842734 +3287681906 3998483571 +3565412304 2875193976 +4279107178 3976691917 +702608373 3162732688 +290996136 3241115820 +1501527136 1135659813 +2062051438 3923535151 +1605335385 4198237982 +807530819 807530835 +3595544127 2657269054 +1724922807 2805837081 +709395718 709395734 +4004957922 2881990083 +2510493748 4208306764 +3282964671 3389283496 +3051234451 2603136789 +2985174045 152869397 920836532 +3789698022 3789698038 +3157752034 958427166 760433631 +2193454710 1178696657 +775577043 2564928300 +340426303 809811240 +1334528974 105403737 +320358526 2369396297 +4257870003 3761403341 +3772620005 242514518 +2095859176 2095859192 +28833925 966539610 +4288464356 1204520425 +2908631949 1347309298 +946900905 3912038143 +3284162833 3284162817 +1709780801 3355462387 2937414464 +3499043122 3499043106 +3992075105 3832058682 +3223710321 3382703351 +3343379957 1020352998 +2150956239 1433920594 +3831789785 3831789769 +522623608 912429843 +2058327951 1750945304 +261126862 1316049497 +1850472680 3633819413 +4003082951 4003082967 +190691172 190691188 +3809719465 554001944 +476262957 4227007726 2375074489 +3270760485 182272563 +339889900 3015340646 +2348160829 2439419138 +6143101 2491634063 +3006277087 4090207774 +2530981181 3101576980 +2694229933 2050395474 +3027817690 4097250091 +2248018020 3791193657 +953572787 3304700628 +3909516556 3778468343 +1883952327 1152046092 +1666550346 2897154725 +3535805188 3362424671 +3052284520 3454845355 +2074619719 2351946870 +730757376 2437446419 +3332358986 2027520510 +1967875997 1119099956 +2556364417 660233639 +1781105778 1781105762 +1118161720 587131181 +2374689463 2292377104 +708392128 940444229 2199530124 +3864929120 103919667 +4060515848 4060515864 +4081959540 2600047007 +4024298672 1247516949 +747763387 475750277 +3925780015 2516748154 +1422574840 1932792443 +1305989171 3183263820 +1864935394 3741337813 +2494123612 3934320391 +447009860 897197855 +3119096591 4141702946 +2653733888 7900179 +2193550506 2193550522 +708173210 214686077 +3063924467 3063924451 +40010010 3614158736 +3909385885 1863536948 +1926473156 2398757803 +1865202713 1785427883 +1606333897 529179936 +3229759103 2348534270 +2856260954 1740677410 1531878571 +3770700564 3535974239 +961922778 470288701 +2850147251 561228506 +3875955182 3911556729 +4052047988 2833923737 1997575956 +86434024 70520125 +195657725 1490320194 +2443510845 1915602740 +1351784816 1187482435 +3113733902 939193094 +3226723704 1002821888 +286562494 2591571362 +2644855822 959887887 +2780177082 3663408246 +3508397945 2870174590 +4219324893 4219324877 +653792299 2206711714 +2443947702 121899143 +129006541 4067594248 +4242396186 1507075688 +1974406208 2190493907 +504229807 2479182559 +4176289129 1061666367 +3021474125 3470173243 +2625284622 3176808466 +3524840078 2714679787 1601623803 +2468560392 305824388 +2113998356 1078741375 +3729409283 602233115 +3840609595 3840609579 +2833407958 363796842 +1754997770 3057236923 +4109999364 4109999380 +817426241 922786587 +2533316374 3388348337 +2098748377 3327694494 +2187326083 3221931050 +997780079 1311704492 +3311562531 4162381271 2714722907 4123457749 1150318873 2292875054 769134396 2236122216 +473359585 1265258038 +4156648082 4156648066 +4280880969 4137881582 +657242887 3256767437 +4093461242 1167203798 +2407893333 752995820 +2437681407 2437681391 +517154531 1206461904 +3872997669 2365689146 +3876330425 1913522661 +3312852865 4187599015 +1676518653 269694453 +2706680534 2218932473 +2022807090 4281299109 +607952372 822807647 +4167905900 2145804289 +626931976 3789765684 +1148192248 3025757563 +991463544 2141115629 +1309284754 2383991230 +1635321785 713500712 +611482797 1056821060 +4162282427 1204944754 +2375864871 350147424 986103859 +905376520 4223702411 +3586972850 1956074573 +632758411 3930602196 +2727346542 1454522415 +4265548584 1700249597 +4116772884 1537640313 +1971558935 2231868425 +725795422 2983808508 +10217924 3111190431 +3066492486 1165458490 +3392578449 3842211142 +3137636927 1956657238 +3736081319 3736081335 +1188951162 1438416944 +1014288832 3957731653 +1432811750 883276326 +3205029134 3371433241 +291703347 2447969882 +3384033055 2780782046 +3430676806 1328587153 +2799037243 3720433138 +3890590339 1152942900 +2924617031 2990806742 +1779483179 593602978 +1163322900 2607931775 +3936481770 109688915 +2270047843 1662191050 +546984955 1307718692 +372364092 745506673 +4154235869 1044204201 +3747151587 57022325 +3720284978 1170120613 +1241809222 3407315233 +3047172725 2161583116 +1000366829 430561280 3397106450 +3457330147 3457330163 +1900716062 1987710783 +4093073132 2604881928 3089462543 +2710654520 1968164036 +1449800017 2024855776 +132390427 2266719378 +1419002288 3580061699 +4048448553 4257953578 +3881846562 1604803627 +2987086578 970167013 +350739434 3539939675 +3807061722 3383414434 +1728766945 388283168 +3456808119 720457012 +1561217925 42000986 +350499470 1899730329 +658170866 3635203483 +2095948093 1319849561 742286522 3893057980 +930691026 502658170 +63586983 1007084708 +2753905664 1722420229 +2414956984 1357096109 +2071387216 3864954027 +2400997514 3549612333 +655315214 2333907225 +1474498835 963318678 +1094565034 1094565050 +2222710286 868009881 +217898017 217898033 +3680849834 3680849850 +496467351 746239152 +4053353295 1569601932 +1111935611 2800003269 +1494402395 2323010846 +3371417177 1114443156 +4241103559 3191197696 +1686775704 1686775688 +2561470818 3124755779 +2330711399 406909216 +1966168635 3081833202 +863211770 4176296331 +1365929246 1877153065 +2384317630 1469421995 3488451023 +3918579206 1187784515 +1715395722 1412370462 +4060189639 3147857319 +3428297615 601193420 +378278294 1328677746 +1907683714 2178428853 +764371430 2662800641 +10718915 1201963175 +3895263533 2883115474 +3828130416 2722346581 +635416169 1270561087 +2575517455 3098074264 +2116781926 75900289 +4200103389 4132315892 +1072995657 4145256952 +2227496365 3197148676 +4171307166 60407999 +441142356 441142340 +2212849884 2212849868 +3245259894 4149390799 +3671448010 1218828539 +544369051 3533433335 +1777548203 1961291298 +508190988 3138831863 +709906406 1775266087 +2581619035 1394823432 +322364609 3089018128 +2187220278 1887446023 +3020411472 3092255715 +666808179 70136346 +2400677613 786669339 +323384934 3186385559 +949445083 4048489426 +2144930912 2729343781 +3332620745 2093617016 +4006713579 3740514804 +900350915 2745613735 1040755708 +3786017898 2830207693 +2979285453 2034813159 +2589494471 3227884886 +288174899 1026005324 +2202101382 2881065609 +3299455246 2770450713 +80134518 4209151175 +2047657847 2568880198 +421395915 1429636738 +1671958497 2341364365 +2499476380 459840585 +4158411650 1623124582 +384840657 3978400262 +1571924795 1571924779 +2063746247 1804748118 +691242192 2887390051 +739799260 1182378577 +796348351 2010286504 +2922202620 2922202604 +1016480960 550710160 +1616907240 15930026 +1179054161 651831653 +1599540558 1252501721 +704266417 3321091750 +2203423192 2802481440 +89635481 35307208 +3304014976 2225657228 +3389962677 3367080777 +1032457751 2307175810 +1897987416 4213147163 +2636378097 2636378081 +1108407631 1337076558 +3442657265 4159750256 +1346754692 1346754708 +536864316 2614587505 3307602416 +3108552220 3380823576 +4172608969 1306454904 +2339346236 1917819623 +938544940 2188525364 +287884831 1983416858 +1606225686 3432955815 +1802772353 4132210323 +3660072773 2055852256 +263166509 3856255252 +3141419302 4111561828 +4123678742 59288241 +2103994235 1159271464 +2984138144 3956161924 +3106856867 3516126945 +2276752793 3447019298 +3630126451 18049738 3630126435 +3062041546 441159419 +2836378188 2080396407 +4082879252 295026761 +1816563168 1766652076 355824856 +3596782057 3448651894 +608153951 1866741896 +719953498 2231161397 +2965285748 2955405209 +340947031 1694990804 +1189347206 2807412770 +1763830632 2498307459 +3401814013 786148180 +3689978428 3689978412 +1024495893 1024495877 +3452648146 3371014291 +34281535 2778263548 +3979013739 2793144341 +791410083 1818063495 3845369756 +2873523403 1794536340 +267250160 2784797275 +1905548783 3146768174 +935348087 984645702 +111533610 2929337574 +2753683949 753219681 +89562280 1323680895 +2989290955 2776338251 +1143231180 754133217 +143159641 3351932680 +2085105814 1000635431 +2550732100 4016315439 +3711471542 4127865742 +2120575316 1707871256 +221770976 2143835345 +3340617631 9870940 +1854422872 1484502925 +4023836473 2301097519 +2948892798 3218950969 +2591630305 229866294 +3164740575 3526483976 3968052363 +2560697608 3838707747 +2227951319 3939898340 +1352085034 1352085050 2941644434 +2584629089 3850827168 +2376026713 1254230536 +2986224974 2166444505 +2330981837 4113373712 +4095115489 544006710 +2097274371 3438313130 +3935823045 303899162 +359518579 3487272461 +3026086254 617853423 3896580910 +876866323 1508577004 +1648320436 1573103695 +2231796378 54499435 +3649649700 1832570383 +2839544444 3955484967 +359098317 359098333 +2217609268 3962708127 +1616748263 2590057888 +4075896795 2719454088 +1252928404 3999032041 +195686351 1935319345 +2171237976 311970971 +1572901812 3865220664 +109369833 740493784 +3697867417 3574245070 +1380364340 3108463055 +318659074 1248242786 +1599476192 1599476208 +4130271076 186504025 +2463024023 2888967956 +611314781 2875256523 +1133572441 3056332574 +2667688577 3500933376 +2560054423 3264192515 +2531692881 3723936390 +249411282 249411266 +9726144 2845894227 +2284659759 2602579323 +1446646777 3060625640 +1113750752 1628083365 +3940167704 3447305691 +2200727835 3797370590 +3778568527 2901409141 +1159505740 1321865709 +3991248580 4166596136 1398768057 +3447772816 2276724161 +4292031722 2742832219 +587633929 744267064 +623503175 3354858688 +803411073 770369446 +1095205952 1543202065 +994040147 2558729637 +1024063024 1648037314 +3316289939 3196267116 +3982246006 507083207 +3463838040 1538753947 +1663394288 336626322 +2759789508 809449145 +2717610450 3503566213 +2136812563 1629027053 +979544927 1213449886 +1877618179 816213692 +1236200412 1236200396 +1913896194 2534574627 +2046924797 3021782801 +3083964945 3103778573 +2405764986 469272406 +1176532873 3994823866 +2830118219 3629600002 +894065333 2730288147 +1527310021 335759372 +3828373244 874049201 +1417599409 2750581275 +3288907402 3288907418 +3252630182 4042975718 3629955927 +2929780118 2101963559 +596395149 2194663908 +3165420762 3646625870 +801841903 668285048 +1276670620 3873264976 1719430033 +606901111 3766299106 +2188892195 2242461461 +3681822784 4189437660 +2301672275 1253499813 +585299581 1749681876 +3641025691 1055006738 +3740692818 4038691322 +3468669209 1110938110 +1228719723 1850891868 +1967091315 1133322208 +2683956952 3668462382 +199428541 1936217236 +2801725702 1398716162 +4110218414 3401011001 +2987964170 3128021605 +1116723432 2253917287 +1814632079 3551429400 +4219007455 1192821340 +3663157951 2190399982 +758056484 1158064831 1113098660 +1585713822 1397159615 +1367322508 3112050731 +722912841 3535579982 +3084140023 2894272628 +2981071955 2981071939 +1255550959 3824271974 +639804729 1099569320 +1061139353 709343688 +2174159621 96884940 +3974165921 2267196534 +2594506447 754451296 711807027 +1640089220 1745584607 +1682774745 2788970389 +2403213623 3283996066 +1241622662 1673682774 1594491591 +581739382 197481159 +3957759458 907507860 +2841476943 262707433 +1346955619 3318179530 +866201879 1572882224 +1074412459 4167786965 +2518403009 119074033 247166166 +936119238 4151877167 +977623158 21352522 +2314411158 4068621687 +3711018066 1295169534 +2408930913 1763938976 +2774254863 2865983234 +2039483020 3921713783 +1296624108 1262118167 +1745969492 2297290611 +605995156 605995140 +2476760323 841750739 +2751896726 4018257270 +3470477218 4032270507 +3592913782 986132289 +2499468235 1374158978 +472150266 1197332893 +2539604328 1108076525 463269578 +1598049725 2939838612 +3139185252 4048993151 +1169305449 3164213461 +336878352 2886425123 +219969654 433168849 +2889882241 2850666752 +4016904646 2931790519 +2717046103 1265502062 +1447717883 604170729 +2512039338 1591698061 +364384411 3332289119 3418498052 +633600417 344062048 +3630010508 659197047 +631868600 32015789 +679931669 3781844508 +873319163 344673861 +2425881271 1447839238 +2363404234 947927993 116509118 +817160510 3938358431 +1136676992 373165147 +2661474055 3244627968 +4213727819 4213727835 +1689861113 2291755240 +4051204858 447321995 +3935219166 479966335 +2199776280 2149231067 +2966734135 1704521230 +1184376571 166830015 +3205637212 821789448 +1009988846 959163615 +2711571585 4005916416 +467600664 4162127067 +204223705 2986548137 43463070 +410429458 2496304197 +765847276 2616207873 +932643953 4089183728 +3546504198 954496470 +620918981 1395132000 +3679584952 4196026299 +3358201246 3091204009 +2240526545 2240526529 +2448074858 3075838661 +3354448756 165233232 +1937964 1519197000 +1897582551 3536419491 +3843217811 799834746 +2423899788 4222848631 +1745731814 3864904231 +1646814138 1066728925 +196920230 3428108122 +3838543344 476305621 +1385631630 2446163097 +2109823869 1952646594 +1247061132 2403272823 +3062264764 296235239 +2135136819 2322316890 +1014340951 2217127920 +2917814482 2380972008 +3981992172 1044919319 +1492771212 2640187233 +3557745717 3800278337 +1892508884 1733671352 +2152259556 3602412543 +582373782 990015271 +3224597330 2649187273 +2852563854 2790773378 +669120136 464717610 +111799616 3179314131 +1794452199 1190300086 +2634387780 1942203913 +4104044108 237272792 +1193980581 1743773642 +3895616343 3954191572 +1668030180 1624854223 +1681864820 1132846735 +3871451097 467352222 +4045330300 260913191 +137437726 56145193 +3691047868 16392157 +2422883556 994734847 +2261199548 3884467687 +4229533814 2107258954 +397306867 3269597536 +758152493 2251977761 +656467889 1238154160 +644362579 1031750829 +2024779246 232260274 2097954341 +3373553807 436693272 +2562050362 2687223389 +1612245134 3577091993 +2994498603 3186286680 +1209507255 875382544 +1951370848 3878203 +77838289 515530256 +3242234023 3752048374 +2831604885 1175273116 +2735283685 2354712428 +3639861482 1911230541 +4260944807 1975633910 +535509803 3811525584 +2210166470 665778593 +4216881002 2771329702 +851474865 2516554150 +1544098258 3024555397 +2744312066 2309407396 +787748104 4064091019 +3492939023 3451778713 +3451663038 2638471433 +2320247253 2765615731 +1296985506 1296985522 +151470543 2584192817 +101665839 1659154809 +3762830382 1068940409 +3420231557 66725529 +1475879892 1335912121 3072740404 310490431 +4127525207 2699932656 +1369712266 258517805 +3815270572 2841429719 +3726037144 904552260 +3205594211 730255324 +2123286139 3049419698 +1230260127 1576081423 +2119345564 4129503523 +117646089 317728558 +2802977552 2802977536 +790023612 1440565795 +2212861152 2187943084 +2841365365 4287166611 +3318354430 1232106783 +3725528348 2914099985 +846681188 3587823999 +1519625194 1519625210 +3439577282 2129987939 +200196326 2933500439 +1800197587 3538275707 +3602678246 369421094 +2112341652 3353189103 +771805400 3393878864 +1470750789 1164709004 +3727073307 3519941266 +778350382 3380404874 +2735413357 393704324 +511322044 3058470129 +2014469927 736873056 +3218032954 760235613 +620233428 107770799 +2884858629 3659985795 +738843496 3146015933 +4292443713 829863037 +2302015572 3940746235 +1087799524 2888795931 +2183503012 2234881599 +2985220400 1258284675 +3559632010 2822210533 +1421749074 3373741638 +3100556719 2624887406 +1403738123 3250297172 +1553681690 1906638581 +1360607271 3518195062 +1262521976 3949194444 +2454228450 595572846 +3437266757 3437266773 +2309459479 3385110064 +290448909 678583969 +2823281810 2065709523 +2987049361 3622745936 +3287171197 3977217218 +1001658008 2491388237 +3380245378 2915292579 +365158523 3193594290 +2275139615 2573324510 +2662101411 443792506 +1820782366 1265752458 +2413724840 592106603 +2096322622 4044614025 +4082748855 1615631472 +3178309265 3391075910 +270528913 3441041505 +3095043602 2064045637 +2593363018 2696324053 +3406966072 3852283684 +56043331 289534119 +735681004 2266112230 1237453036 +149193632 4234541778 +3915847305 4131944888 +3768162523 1825284292 +270765531 1123569604 +2093711890 3633899693 +1411837071 517022939 138831128 +1996174434 2731782023 +1894835696 2183097051 +2719264583 1838148822 +3800073767 3075682144 +907093163 928818389 +1565967893 1210529965 77189898 +1460112074 1557148257 +4055067835 1121893224 +2479738291 1610272972 +905821095 2775476214 +4226523567 985966839 1882325782 +2967561936 1121245539 +3879520510 45115359 +2912497838 4081144954 +243940728 669937171 +4217941068 298269601 +2631453726 122245929 +3701551963 1011708680 +784345186 4202664533 +353913735 3158238592 +857667564 2857808504 +1417446588 1474624324 +200824457 1581067762 +2032704104 3426397008 +4281697769 3549887310 +3005559177 4070290491 +2334233271 1493366636 +3304856993 3118638198 +4187007067 2532067685 +2998576385 1557250198 +1934346703 1330557134 +285469260 4057681015 +437304434 2052630373 +3218721753 2807359753 +166392943 199150254 +2348115671 223845443 +3506914894 1355078034 +9822810 3373053493 +4289023290 2872611403 +2951434220 3681472641 +2796466005 1336960737 +656938929 1193969678 +2099724540 13323441 +566215937 568533120 +3173375563 3455706805 +1357802214 3481762854 1297238039 +1164981919 2242469766 +2372782019 3502233276 1725003765 +3308349549 2373787227 +1386201002 1115403622 +2880515055 921184558 +1223421021 942629515 2158773871 677713524 +3601816995 2567989130 +98123257 1653938633 +638823549 638823533 +1507868242 1615896301 +4211761322 3679857563 +1431976275 2953330092 +3566709084 479740620 +3242539092 3775974836 +2678085780 1994648831 +3120591391 893294214 +2087143783 388376946 +868728513 1148275158 +1108439657 694681156 +1784088888 3677393472 +1063531010 1063531026 +2467860277 12318426 +3082365326 3330042511 +3160928039 3197991542 +3461915914 3750481586 +3073508396 3073508412 +4051957946 3972041949 +103764577 494841526 +3549898863 607915590 +1086430811 1271679300 +1193822204 897366998 1523294179 +895091866 4242651062 +3545711303 2036211542 +1529705681 215392023 +3325960752 1428614539 +2758687690 2743607035 +227813235 2423718134 +3371696639 1567302760 +1850684150 3954256598 2628598087 +2649634610 3489719205 +3299375165 3526707220 +1729316458 2908215501 +367052644 3571049087 +192770346 3884660198 +1951066675 3485229472 +1535376125 2876563927 +101934488 1630973411 +2720196121 1441806686 +2627118525 3890545867 +2102439803 3238280882 +2776812227 238258301 +4132898066 893363130 +372861194 106977979 +148912959 2141326081 +2955048580 3393229257 +1599422013 1259971593 +2988419869 2228903586 +2548173019 2594440351 +1533767242 2268298162 +3873896598 921257955 +1077569988 384091311 +3682113901 3956901522 +2912474588 3470841395 +1645221564 458476007 +171330584 1035513252 +1347793783 3991503942 +3807667878 3971848023 +3468662530 3468662546 +271650159 3963102648 +1560730644 2244768623 +132226046 1713934559 +3208705237 1894121543 +3219357010 1156507791 +3779314064 766096821 +2317247534 2317247550 +930637929 3146538328 +989613429 1345187626 +3206265190 1050991511 +2314226282 4036533158 +3003666191 3843323022 +2241869360 3036023280 +1057861023 1398787134 3014706575 +3312388544 2175831528 1531403944 +2780002717 928526212 +607343992 1959758843 +3844303886 395234906 +699857302 1091233575 +2070903543 2843330407 +1565766250 427099070 +4159934183 996799904 +2743785846 3918812379 +3445679274 1733948193 +6431309 721101222 +983771667 1641757676 +752214380 11656456 +1407241479 300073472 +3011708689 2823036880 +2370720890 2623156530 +1276400866 2785124309 +3528195849 3365325954 1197732021 +1296958042 1070716450 198030251 +56527593 919907534 +1415262174 2844547689 +201624223 895123109 +3931930094 4156559218 +1278273209 2851812648 +1350386656 2503072179 +1000024398 591529433 +2486142488 1590695899 +2726961302 1970359345 +3241960239 1628447470 +871167938 2148140643 +470522081 121743904 +3328686707 1498172384 +1364600786 85317928 +1199775315 3865623738 +2677178453 3790152518 +3891168113 2373511919 +4094018522 3060216757 +2737403674 2737403658 +2887617273 3024790476 +4213173974 3667325781 +1342486174 2506848937 +1144037180 2492115815 +2782172633 3869762696 +2162787328 4019899397 +1880381155 1392822101 +2049505723 159457650 +564652867 2676191526 +130369902 2844956729 +1426401208 2401076909 +652058670 2828576441 +1934529798 2327091297 +2600207785 1872642820 +2752404524 1797837876 +4245961478 3497597265 1826155127 +3612592116 3974350095 +910337595 2798354377 +4052703138 466755773 466755754 +4008052193 2272280712 3275089325 +1764073585 2630633207 +356774068 356774052 +2706524689 92969158 +70156216 677382000 +170111490 4163975477 +3876411546 1409448573 +2389037436 2789787175 +4219053514 2860514555 +1665697769 42430911 +1400525220 3930136920 +344796851 2827975200 +2275247930 3069960285 +2001877926 2087970369 +312668214 2357208337 +2675514791 2997464544 +2835053567 4114307498 +1159505730 1475049463 4200392071 1769928399 2860865288 2095996055 2125041890 +3373850244 371608009 +3369353986 3369354002 +3595781505 3860228630 +4069964226 2772855925 +766700261 2974855715 +3506721556 500091001 +2271829891 1679025401 +3400829041 3400829025 +159927776 3784480691 +670832162 332846997 +3731220917 3480152060 +1862795951 2023504238 +2076368206 4093638873 +459133533 1907501172 +891984832 891984848 +3520246962 2736113314 +3010260375 192545958 +4275265270 482245969 +4267141971 3063804844 +3167447721 3711494151 +2971068034 1225580213 +1511686447 112811256 +3877082650 3475210915 2058464111 +348582382 2445323887 +2776046763 629285172 +2423795274 3073433197 +2441574934 776286385 +3279262386 2886118536 +136819245 58555602 +3910345600 1763762835 +4269700374 1354444742 3838120746 +1883073425 1102075216 +3407162236 673926041 2960658409 521793968 +110582460 474207719 +3906498044 2293572529 +888752911 1936795800 +1612996315 1606710953 +4139401549 3776803492 +2799437026 2388373461 +3923172823 2301688366 +3015528505 173217289 +4231639703 2782143398 +2981745743 378091598 +2519768903 2506568999 +2998430675 726777132 +914415092 3986216681 870497357 +808657730 578846954 +2934139842 302162549 +22985720 539092859 +783641358 2357828761 +2243195878 3809158885 +1395674145 2769528587 +705671475 2789731779 +1312619563 2290480811 +2940861315 3114125543 +2420712856 3162164449 +444779954 1844039461 +2918756221 1170084548 +2839034108 1602335921 +1234969991 1759455409 3122388605 +850473633 1844622198 +215394333 92270724 +1109791645 3073430932 +1095900794 1313208843 +3676476981 745698684 +2424712900 1463531439 2424712916 +3121287024 1332301141 +300244829 2299862882 +256318682 3874646827 +2931277974 2705599527 +3572075498 363282779 +1249060690 2236016133 +3936613256 1918741615 3893911316 +1367027874 2331517373 +3096317397 1553974858 +1701329295 3947608538 +2346095062 4173829095 +3429715294 772852457 +965533434 2462253963 +3845497164 94034973 +482814979 1351239868 +2299303211 3298144600 +3239210125 3239210141 +3607264207 3607264223 +3528213324 1693568353 +2502429958 2502429974 +1641428360 2352366877 +2118623129 1673543112 +3344891032 1921491803 +1872366537 1246144491 +2931318027 3842731055 +3365898656 3365898672 +668885176 2064794029 +6724719 277365432 +531012798 3565477321 +49946076 2344419665 +2921660469 1497322364 +1004871097 1972723614 +1677250597 2242882092 +998661505 1521344237 +2490945997 2268218788 +4118072594 2245917081 2781265550 +988947482 3845051627 +3061030688 4068576236 +4212635033 1653073734 +1963468435 1043782265 +3940167695 3824918856 3296307086 +1870553580 1878271639 +1148212439 2480246384 +1339489883 175270226 +2749931431 2922599414 +3111881245 444230562 +3494409041 3830311648 +34958609 1488630214 +1040487037 1269407605 +1940423657 4215777240 +1796582857 1545638776 +3645063694 585176361 3341601678 +1906633844 1520450191 +3365275059 1999304908 +2633829779 3042729594 +3521898620 4066310951 +2820196010 2267708165 +1047855118 1613698585 +1391991788 2291397783 +3407763389 3407763373 +270561834 755682358 +125650714 915187336 +1325452099 2705324668 +2465772301 477076068 +115612831 2014907976 +160402478 2742453913 +3067011597 3568163442 +1832593238 363734561 +3474246207 3244749308 +1716494715 1905516095 +2224773715 1919522932 +623760001 1986818180 +2530420204 1516548759 +3569547408 2129480380 +3588051239 3529949302 +1065257073 1697696240 +3405500941 1734665939 +663994092 966102423 +3099573894 2306671237 +1191346935 4250887540 +139914295 1473632902 +2792660530 999622835 2124198362 +3977003634 2140508187 +3379633593 3591490088 +2358134919 3405524096 +3002137411 4099639914 +3871471602 4003201421 +3692704792 3166883687 +1970845449 2093965688 1448755262 +3027123218 2408475560 +2092718687 487138689 +3531686624 3215145992 +325681737 3625457912 +1392320028 191016145 +2021487969 1828843700 +184293291 840619477 +2462871318 2332040314 +2592210149 530652268 +1794844886 52603318 +3113977810 30855045 +4033936354 4146396907 +2075119189 2708402058 +108179247 3787063766 4045628999 +3797732098 1511232547 +406861834 3270121862 +4146094122 997078906 +344853849 3030319880 +3240789867 2163420514 +1045228764 4011384401 +2243482068 1441943737 +271700002 432143854 182619453 +394054150 1990802928 +3366599487 586892350 +2603935288 2353424941 +1038891638 4155260481 +3456394322 185820978 +30595436 1256998167 +374889211 672610596 +2453942314 1800917517 +3152591634 3781066067 +1880286734 2076190735 +757259832 183163976 +1511680964 2610406793 +1982090249 2788256645 +100465283 4030618666 +3358322818 2670435509 +144845324 2739417313 +615568950 3770895387 +3096119902 3772862975 +4181447410 1261245178 +4169147443 3677694903 +3226095699 133984954 +767681006 1730838858 +4164071733 3972855395 +677742453 215235900 +599405519 2158878220 +33340965 1172263980 +503718725 2292811148 +3152706419 3722933494 +784666724 70831487 +484079894 779890167 +1950244398 741229177 +333234807 333234791 +4221491362 3936677588 +1688022912 3815884421 +386010355 725246604 +826470706 3194073523 +1993173740 2047692311 +1527096455 3504472192 +1230862160 3458388707 +3940549337 2544139144 +1946793470 3275460450 +3920028281 3010455696 +1559838697 58869070 +3640798031 3983158616 +4292236642 543713621 +684839052 1210600924 +4191119431 2290165718 +4185410643 2489114816 +575261335 2435443622 +2900518453 1567024490 +428267466 4182094587 +3050030690 2445888579 +1722636371 4125231788 +3560049496 1657265051 +2287563493 2312101498 +31931678 1599964610 486880809 +1875624742 551495717 +2831803001 716016642 +2503109124 3797738591 +2601815672 2572961531 +1022674628 3109349001 +3183818329 376737288 +3922266182 3922266198 +2662759268 1027882623 +3149551698 3149551682 +355083370 3143062235 +2140788372 1216579049 +1386638154 83312819 +3009092242 3932869587 +637643328 2747989188 +1890105928 3280648471 +2477732262 1078587749 +2977861680 1660947339 +1707841728 4286674501 +3253436959 1591286986 +2642742909 1970654914 +346568154 346568138 +2666516294 2038647607 +345755434 2605129499 +1611704093 3653620969 +2308888955 499242536 +2424820780 4039392700 +789220466 987688681 +1170710664 930197411 +1849370734 4112557350 +170018371 922000252 +2947212306 3451866165 +2031091685 2033177964 +2408431491 2408431507 +3870103493 3883690764 +174871149 3213872057 +2055581367 2022037300 +2923359161 213987886 +4241281554 3055972505 +592828058 2105428556 +4165343832 4165343816 +3751861029 792263468 +2554300004 2581709401 +2416830788 166082079 +3646404061 34818804 +3226757782 932656405 +810364973 914544324 +347077466 347077450 +436983105 1191920708 2851962029 +3082166273 1249539912 +2501917767 146727872 +2228443189 2693694541 +443712110 2541863986 +407400093 407400077 +3377979864 2360789283 +1184476214 1508514055 +1575246422 1280773468 +262166153 3628056258 +2111349698 3966343626 +3703949235 4071635767 +3744761423 1445639308 +2364484545 3774948948 2418084093 3379884262 +1117543522 1042640451 +4245382693 2112998458 +2207597276 2620963660 +3805623390 1939959785 +3469715437 2112182788 +1268278347 2397234542 +957210347 3151358946 +2933990369 2702951239 +2173431035 2252686405 37452297 4031370686 +3613098260 420229743 +3126621215 2123025630 +967931051 2103093556 +633377880 3561830912 +2109109195 2356949135 +3300444632 2263203611 +4228196476 941538087 +3895819250 2117213669 +3986046609 3808907251 +829614534 1041915728 +3855495546 85618833 +3450140594 1823599923 +641867710 2257187228 +3065004906 24780749 +1510664750 1567192640 +3219710332 207757510 56758934 73536556 3656486695 +442579285 3691856074 +1430419529 1864901816 +608303499 608303515 +3136365757 110941588 +3945519264 3590718451 +4096468435 4096468419 +460843091 2428680890 +842446116 807348159 +1039969419 532913858 +3614097513 2248992078 +324166627 1303592522 +535053281 358013728 +991463547 2191448498 +3671233315 2625478684 +3380147737 1114335582 +1687185734 2832930710 1290965383 +2057893901 2164466932 +499589248 1646877773 +2638597525 2563510573 +3691113966 1158254009 +663057136 2519514866 +3345939698 2549421273 +138387524 138387540 +2070777677 2591594034 +3707922530 1288327765 +3101388954 534679157 +4134306628 819110943 +3337697166 3149558927 +1580646669 1563551588 +296022172 2780438276 +1574342908 1158777511 +3146476811 3891756495 +727823017 4090249240 +4057615485 933652692 +1490425100 3842187767 +1474935015 1273893814 +1358019532 1066530955 +1681058376 3860361077 +2439196648 3341052459 +911123405 2095770649 +1527675447 1486638755 +4165404431 3872398478 +2541344677 432961722 +1468614944 1697648386 +434395066 1982280403 +756800343 1654809794 +221572708 3082508611 +1311858354 3384283699 +1610420691 1911611968 +3001216721 3001216705 +2787254771 3239296864 +4264267107 2173670108 +2394256619 940929946 +2676848758 2712969671 +912413359 4022479105 +3895296727 1453652070 +1324123627 693555426 +2626501075 1649033773 1163003692 +3800370279 2924029043 4268918304 +3145918570 1477330613 +3066888189 3249994580 +2287666744 2512271463 +3892657917 1027745858 +2048328675 4098981655 +3910831036 2966026471 +141237502 1050584009 +3990034350 290342649 +327278588 589833132 +1660485013 1660484997 +3940363284 3459015535 +2951618788 3621635839 +920703800 2615968045 +491484094 3687265289 +1147272709 917713472 +2986940406 2986940390 +3670992213 2715327363 +4016343044 3745652319 +169939650 3640991946 +786774570 4242182157 +1701065842 247369573 +1858434872 2564468013 +1507207949 2032518500 +4181731456 3758080403 +1713070679 1713070663 +2595818408 2982404035 +1487266195 28284928 +1442161700 50514472 1974559913 +3043239238 3546459537 +765218904 621968027 +1979920833 1227939268 +475518290 4031041541 +2928745828 3511595352 +83841578 664307358 +4082330578 4082330562 +3524448720 1629774356 +3770515399 623666010 +1056055690 2703936571 +3372839091 2070750387 +340813839 160681870 +560219795 3723035904 +1317091483 812391442 +3018060471 1956100916 +1629927280 1609745749 +3092342071 1596085648 +2354806981 2354806997 +2971906330 4113550333 +195812881 195812865 +3008395193 3508914084 +2935417467 3920830372 +1938285789 3152889844 +917494695 3184969696 +1986912367 3724037808 +1013391818 3764007149 +3223997007 3516070478 +1840750353 3373230032 +3536398404 3536398420 +3843527412 1947430070 +3052284518 3421290113 +1921091356 2056631940 +2494830409 3280639077 +4058822455 2631226274 +825251365 2484575290 +1305140440 1314498573 +2772304012 3164272007 2772304028 +4175441005 3174729465 +1357184 1392341791 +3434423100 682792812 +166496102 89728385 +2434432212 1085440431 +1144592148 1656966766 +968576451 2765842922 +4272230917 4272230933 +2083094294 2337476529 +2605680095 2605680079 +2113858534 1045256961 +1231441795 4041281383 +1816675131 1816675115 +1911961214 1911961198 +808154915 4151086101 +2252738148 1616688228 +2003898488 2130504955 +2580266304 859910717 1538976723 +2292208728 799313907 2030602881 +514111622 3276700407 +7763798 276683889 +763661361 932110038 +892865682 1497090515 +3616333098 1804843231 +3496144663 582902060 +2233387897 3532332290 +2554125147 47009874 +4112130614 237230855 +523031741 1925307573 +462678124 3505843324 +3323007488 3437188613 +2741758938 484722749 +68770377 3169394926 +2627884771 2258938107 +2587559414 3236586055 +386338664 1510792005 3143743025 +2896207044 2228668575 +4038696126 2989604639 +631916026 1158424715 +2057229812 4228566809 +2092273472 1541865316 +4083596967 3518898422 +2838306434 2838306450 +2466923350 3475505265 +2847962703 2298101336 +2942710321 1323369264 +110067781 1300657770 +3809171366 282786369 +1020244191 869422902 +1845134601 710896952 +208115034 986447934 +2390110328 3155053805 +4203780589 1587695634 +1087411282 1515814149 +550454317 3544732356 +2841470701 4046856530 +2461234120 1297601763 +359060572 216026321 +1735953118 3233979241 +1675772434 1328415315 +2936607574 3779686513 +1989055795 3581206362 +3726106132 3012729199 +3894734132 2787207375 +933097093 933097109 +17935657 2254863957 +1570652945 1905904599 +916538585 2083126869 +1207509811 2150787404 +337423654 3985844326 3475280599 +1106887484 405690225 +4202916205 3386832516 +4273355558 3321448516 +3750268456 200788221 +1713542883 2876475210 +2672802234 1655295125 +4150037295 2511280888 +1087597623 1087597607 +2618546757 4164983450 +3954054778 2098029085 +1508324189 3824540514 +2001010306 2685252622 +3166751659 3464535604 +4074114615 4074114599 +1908671302 2306918019 +493867627 3255320180 +744447544 3077856453 +3190238963 3683283597 +706579598 3666101145 +3311985417 3441256248 +4237721941 3100513523 +1967007536 3235360917 +24990282 4080140211 +220011200 3303198917 +3216020974 2842797230 +3390831636 1041093487 +2958845002 3950108781 +2759542664 4206309027 +74672550 2813284439 +2648687110 2369679201 +455622141 3176764738 +1543274892 1803160357 +3388357278 2359183017 +1369592451 3019451971 +1737870404 1422954249 +2036006896 4198557379 +3633506550 842191063 +292786856 552590955 +2274101556 2507308249 +1266614337 3755591911 +4087691864 4087691848 +691296275 4033259002 +1871790714 1871790698 +21555797 779999219 +1102559980 1614496129 +1666661344 1666661360 +3734536857 3103555432 +3474272692 3768370092 +1946509946 511313419 +1306666504 2734808733 +3307604432 3307604416 +1044441256 2821603435 +2170028155 2914089669 +2509208898 3001167605 +2350729640 1676919568 +3419974379 405282072 +4146193273 2200944703 +2813442469 2714189484 +2833660023 323213027 +4165762922 1248629709 +273973136 1157943221 +549447966 587914826 +1400573474 3951215414 +1451340679 3039665536 +1891465436 1447379527 +1995962331 1888031195 +4138765908 780359819 +3132987580 3027726321 +2436903119 2436903135 +1751202711 3893415590 +383773924 383773940 +1490664422 3301100289 +1028118386 3927451749 +3644379435 527517346 +3658308556 3385973216 +4093050518 2748499505 +245175505 3527918854 +2778298089 2778298105 +3717849056 3107679667 +3131087387 3855784082 +1796991161 1441749822 +535790792 235800267 +996091589 1003096076 +2271103210 3208603475 +3163903212 3720208551 +2203174386 1237548955 +2670768952 1003633107 +1056439397 2237813484 +4274261671 3484651698 +935808144 1589479093 +1463513963 3180769634 +1587506924 2904093207 +2108062997 4094642092 +981062071 1177968900 +95990977 4241700765 +3155992469 603221549 3054450570 +519110085 2053078298 +3161526325 3673981820 +2328284837 469192108 +214870644 4148457805 +3228919901 1439910516 +1562022772 81141647 +1331818450 1142516845 +831965472 811507059 +945230943 269816222 +614219962 1543103691 +2837247698 2773343702 +3388770580 210487919 +2067297072 2087462556 +3510904391 616531840 +3451120911 1339790065 +945016689 1691622803 +3746531289 1664277150 +2973889322 886164251 +2601045774 4074641170 4091401146 +1854436462 1859078447 +336154597 1873331578 +3511377410 1584484211 +1256504023 3172081766 +1687370426 231043787 +1750836837 2907107578 +4055228778 3948009947 +732148250 1106365527 +2237938624 3167358789 +21431892 21431876 +3598627889 3665144112 +659781713 3795122144 +3432981033 3432981049 +485856847 3852181070 +385209841 369085050 +385823542 1774034449 +2143633454 3252242105 +1946731556 3452748969 +267725059 590976410 +4191945702 2246393126 +3592498246 1547219511 +3337062098 969164949 +1500403059 1001423898 +1007198143 1083406782 +295871643 207447624 +67060348 3335891239 +1272456781 3548536740 +2986661735 2761889577 +4072999967 1261573320 +531850926 2506793967 +3113848898 1010802857 +2467049064 737961232 +3735521112 4171686012 +1609302201 1809326779 +4177754357 4118243754 +3339060332 3128489495 +3656020596 899429576 +1047326291 2558209210 +1854940313 2783550686 +364949585 2404749190 +1036390891 701379810 +3823552052 4165600217 +433339348 3710464376 +1655283926 654848231 +3712494894 3712494910 +799611442 987628322 +1440480662 1312849941 +2243232861 3639991924 +2106961657 3789900165 +132000647 3921577344 +587994118 3623509462 +4060834624 1207555539 +873338711 1227800038 +2281236038 2281236054 +1695166101 2007511996 +1236963288 1522661235 +4289749537 1332496951 +515342732 3873501047 +635581036 253059073 +2939340597 32479338 +2730186770 1078524137 +3991709930 1972234331 +345554699 345554715 +133268366 133268382 +4025471397 4277194728 +1975191045 798872124 +1099631266 3487677699 +2967648103 3689330486 +663677927 754801846 +1250093730 1621704815 +1707756705 428886685 +2778557841 588431191 +2002151791 2002151807 +630793101 2530918117 +791624560 3215881833 +4132517187 2118249562 +3612593573 2649537196 +1773105252 3274567017 +756950944 2792906995 +1980883541 858213340 +1467272531 4292819386 +806395330 3079609294 +830605950 357720478 1888211925 1840677983 +3701232277 3701232261 +2882221589 3544787116 +2269899159 525156547 +1900687204 3265617374 +4029492434 2424797113 +1047856175 1599804794 +3386602067 393541818 +1466891974 679273233 +1733392863 2218973726 +797045771 3566415188 +727526705 1325187895 +881384018 91205395 +2068396130 1984152149 +1770766118 1291708631 +1912744111 677776238 +1643474745 1851659944 +2377934891 1270606677 +2893371774 1930884578 +795175685 2712107212 +3376590650 234477661 +439302291 2021274659 +1407900024 1407900008 +2028594862 288527197 +1323789136 1638869931 +804125471 2642853322 +721512159 2452943112 +1672124860 2710569703 +3161596789 3161596773 +3622014821 1077591034 +2184076926 4175998886 +180480343 1178751984 +410437268 385522415 +741431030 2276189521 +2849297129 672295615 +2695213826 3872967715 +1380507114 1924487003 +3601946947 636012251 +738486778 356816579 +1829518518 1615041159 +1171854319 3127316856 +1120010311 1583771606 +3408605633 4142884593 +457688917 2372195519 +1720511234 1456427805 +2451756414 28116626 +2146065680 1301929575 +4229692299 1796013012 +2477202456 2282830299 +1107054297 622418094 412561225 2350976795 3972761643 2036887088 4148986324 3437775866 761981053 1285636663 1166142192 4177896228 2577040200 168592724 3199914943 +3373709536 1858406579 +3150934528 2811262489 +254839486 2877520841 +1497092731 4096546738 +2202659371 3629883828 +469075645 3229817748 +986742482 2727875437 +2888986596 4150666208 +4050398578 2135657075 +1182187439 2616180846 +687426126 687426142 +1422775968 1458918856 +4274614071 2198653858 +3579423411 2858156135 +1147204288 2837763880 +1518544126 2054372319 +353072795 1335719461 +2740967527 2772357235 +1229445728 3557450180 +3669530358 1184212305 +3767191687 3532295556 +3629709952 336746373 +4116695362 2278150901 +2311681434 2183405949 +2613795385 4242092040 +2471268359 3901143830 +612411542 210330673 +593561845 2797672892 +331034707 1655509676 +2800690880 2323251269 +578537485 2603956082 +1716256101 532088970 +1549723081 3238006318 +669024737 2808902966 +682340578 1870348873 +2494735260 2973208199 +1470280168 3709734955 +1894625247 3084535503 +2726087111 904237252 +998016386 297185693 +919692060 810875335 +2470244092 3303814823 +4256987848 2405544931 +705688275 121186645 +267821919 2151886472 +463503222 2200650002 +1972182566 3474965691 +110582436 71544895 +2369051041 3064332742 +469727902 2972583593 +3131957241 3635909886 +3927419636 3591725407 +3979472469 3130666972 +2665750060 2988705335 +608509510 1985138311 +4282708180 2911313337 +4217685372 665929845 +4031577661 2251569684 +19088475 1608535225 +767644651 4065794786 +715147310 1213309039 +162230843 1429732607 1944376036 +1711565000 2351776112 2018398691 +791455354 630995950 +3226870793 2241004421 +1895285419 1387944654 +3799101066 363926368 +4257200583 468025528 +1770505101 2914572004 +3430661901 4268499412 +1075825730 873368565 +2229855891 4270308203 +3622946172 3711881929 +4127452426 1378756282 +89697049 2207602782 +2307571296 3848909107 +877806965 3531822890 2395092748 3351029751 +558076791 4039511444 +1512494425 1143069470 +4264331534 1358032413 +3109073042 1275459027 +737056944 3521122248 +1704965087 2899460577 +1862075069 1967869826 +1691004117 2148406108 +3713188809 706391478 4087650188 +3052517566 696636169 +22904339 3732103051 +2313206629 373618332 +123245150 4000213481 +834930277 3163951340 +1133612206 102344495 +4084195052 1388553212 +2429267394 2996996213 +3313152635 576182056 +2482122290 4057880119 +3087994420 2086246047 +3558808325 4059531482 +2879008702 3787008031 +3440717466 2312672206 +82856075 3207988152 +3312060247 3010289097 +228050204 2523343824 +1721672525 3636138532 +347231321 3988441096 +1541506619 4142803628 +4143180304 3522787107 +2414369103 3653539662 +922375445 2702438428 +1183675919 2070317644 +2183563366 4170880433 +4199443347 2624804972 +1748614226 1748614210 +4116111987 3799233526 +1395357098 2540321435 +3284706725 2961607370 +3612817760 1582256691 +526136643 767150896 +2468255900 891960711 +1450718128 3476643349 +2886180407 117313680 +2625484082 2346991027 +1866336677 1866336693 +1060977200 3177355669 +1590325113 2980936574 +1120651474 4174193285 +1944364784 1626524629 +1091398760 1091398776 +2736510389 2043767786 +3493354489 3250112744 +2133498453 2133498437 +121945886 3045242665 +2096095178 703977531 +4255509549 2033371844 +4047398044 1631084945 +2561903574 950346225 +3223197604 325007145 +388425812 3326065711 +778007422 573338249 +3448510400 3448510416 +4224752913 2053587398 +2514511641 155339870 +2271713709 3306451460 +3263609204 2920673689 +2773636060 2773636044 +220726155 3055980661 +2219697692 1654734353 +1219755520 1935202835 +3364643519 3316524646 +1573106936 380755339 +1327715009 2507073946 +1111090243 2047642596 +817450009 3434269534 +1896900162 3199228238 +4227724711 1472837110 +361461630 2810953698 +178778004 2156972480 +2606334283 2263468664 +2419047844 1958484912 +725287034 3932242735 +716275968 558362843 +1967792089 1967792073 +3125692317 3862608948 +2197919314 2373952261 +3590894629 347313708 +735086194 1799595365 +954711104 2786798328 +1907860816 1410940131 +1689649626 3331486809 +3573167327 618740510 +86293468 4107516743 +956319391 1517235294 +3837914342 3837914358 +746564034 427532238 +735533935 3243229090 +4090213846 2679062503 +4284515178 1861148621 +2228859046 1237622338 +539580791 1032216547 +2466886485 3443871446 +1575589803 808825455 +674365775 146810764 +2441390338 2197307677 +1246904264 2452118905 +668616312 668616296 +4008335461 2145986284 +62722080 44065388 +1836729763 3969663623 4202405788 +3982388594 3982388578 +37441644 4016019991 +2337913944 1832920336 +1408399069 1408399053 +805511744 2426567913 +2987572604 3816392748 +1530093280 3859329467 +63713457 63713441 +3426913490 3086287773 +3214931626 1389448589 +1594722349 684475538 +2011346364 1977882343 +1380404481 2269001878 +1093335701 732461194 +3261434993 41318656 +3760346698 537777787 +3451315427 3119141212 +1314685597 2490003305 +717953307 2025358738 +1957073855 1631229352 +4182046010 2562070166 +678888583 1418576282 +2954290481 2954290465 +3276637593 201936862 +1726235667 207038956 +4039833274 1726562422 +290991700 4108780479 +1292792569 1186921982 +269268877 365348821 +2121554240 2277581581 +2303853693 4206977378 +2827325421 238613061 +606346902 2061248049 +3616245767 707161114 +2056217174 660101409 +3137613951 3868743656 +3417938344 715791829 +2712813543 157172723 +2300291120 2263486660 +1305417758 950740298 +945717118 985838431 +735939361 2857520439 +2909884028 2237566247 +359772334 1878598137 +3578184323 342312742 +1653043743 976791240 +295453415 2684178848 +3879662773 3172677884 +2504408383 2504408367 +3464693809 1429531703 +137981688 1902164883 +3935152014 504327449 +2467988442 1500115874 +1239622853 1239622869 +964391840 492242163 +3139718413 2804239204 +1262409973 1760528810 +3580004441 2485963140 +3058551288 1002514428 +1881105829 2039716931 +70324386 70324402 +1488136355 1226792326 +1615118520 513069208 +1478322345 1598800408 +371205279 3867876251 +318464330 4114285317 +2516107229 1462762434 +829664613 2663596968 +1111792485 3973118627 +1190528331 2298736248 +3337947060 613674015 +2243413202 2243413186 +3705896288 438197811 +2747388653 3064986019 +2170619352 3348750574 +2373778667 178898786 +3334497897 3334497913 +2121372902 4073547287 +1637816123 3469257215 132998405 +207827861 4006215258 +2820447906 1192081685 +3252630189 4182433179 3747399236 4195107160 +3501612162 286498997 +2379162889 1175932216 +1729614541 1729614557 +3460339530 4188940653 +156932099 2713636030 +1374899218 335593541 +2653074571 1516911534 +347880398 1917986127 +2030114540 1756829057 +479937391 3048179386 +1176292155 2840073153 +2091841423 3597645336 +1051303562 3447103750 +3437463059 2636910565 +3624494366 3525685130 +2799776889 763730558 +2545024192 2368791109 +2874115691 422615650 +2099704019 340254509 442718528 +2971117302 1690718154 +352182610 1302960885 +270385301 4090899082 +3414316093 2603260930 +615875233 2096452304 +3764341096 2011214740 2650836669 +3728932071 3396607926 +3922175634 2538289093 +3584264552 3094433451 +3217820702 4146276668 +1355851091 2125407393 +1353148717 881502996 1353148733 +278815200 278815216 +2102393685 2582161098 +1968501220 1407572441 +238610035 238610019 +8881608 2279438595 +1862481422 3490584591 +2460742519 1538278480 +3227903693 4049506352 +4221281896 1028861776 +3462416582 3260776493 +215317423 3809588344 +1651616780 276298561 +2044174690 812846403 2116422574 +2015458472 4040451852 +106278152 4238987299 +2341498731 2005205739 +657674581 3296253420 +3643024802 2243199853 +3786022334 4241281567 359581407 +1508840590 328121804 +118817158 2886821345 +3677951231 493427388 +925309755 696178430 +3350868013 3854230427 +2657233750 409603814 +1793175547 1011353650 +1536836189 2429974626 +1624088355 2259780636 +1638614727 2275437404 +343620725 3003132970 +1844452951 1744814822 +2825987431 266885078 +3724755719 3724755735 +394302518 399148981 +1540334326 2111670599 +4200686326 4200686310 +3453961632 3061488371 +792391507 3174500370 3049221659 +2095095796 1523386772 +236058435 951737648 +3649808796 316407943 +1347205901 801308364 +4049975758 3508764505 +1623058416 940094100 +4200214700 4200214716 +574681690 1178436523 +1616381537 194120383 +3254748779 3493894754 +3969152098 3484628547 +3724285061 271959210 +1576630134 1706495687 +1513585921 106547328 +2375084282 174763458 +2233970954 2809901755 +4044651065 286740510 +3896412746 3832787565 +1529560773 1647210213 +3473154760 3688209396 +1897204722 1897204706 +1319019945 1045856536 +2430287403 874700212 +1163221709 1004660773 +3016044738 3751898826 +1641601144 2153563373 +4218129911 3243277254 +1970346777 4195199063 +1109215742 303790815 +3313565479 288704729 3216030286 +81205704 3619460871 +3270758891 3503518946 +4279514166 3268292871 +3571193118 3549494569 +4236639302 2139911266 +4115161189 1027776569 +944436940 1778549537 +1488496525 934265586 +207829650 1246264510 +2456650382 3690913277 +2657429268 1866762857 +3855720267 335397652 +3620012588 3962492737 +2061021593 2814417167 +1057528502 4035677329 +2746948865 3063112742 +1113410222 651988975 +2876047006 2056573609 +3932947689 3932947705 +3836451075 4246855594 +1229187506 132703027 +225528619 392502767 +1968174460 685732391 +1706976764 3952434655 +4047399714 3320254304 +3225680988 4186778385 924684854 +144891760 140885315 +2204326904 2918407964 +3338014387 2421381686 +1817760384 982862788 +3738503753 308228334 +632267998 1241636852 1616404490 +670736200 931708509 +621969094 572363191 +1651416949 1764033827 +47901934 3012600185 +4287412176 444947573 +3768993970 1472491571 +2921449337 2553086824 +1477599213 2368008564 +3462417432 3069357477 +2524655928 468613947 +2504533588 3730212788 +3351213556 1285923935 +2892249374 2143676969 +925309432 3398295921 +2959111039 651546856 +1084732796 1141027367 +3985929736 146132637 +2253486942 3783557762 +2480728931 777002692 +3581443749 2981060026 +4137687013 1867370759 2614552348 +3075285034 3093930509 +2191168535 2958499878 +1772151876 3712877368 +566082819 300687975 +121299143 1356006912 +1614396709 827529081 +3646359459 3338732956 +1939261207 224094502 +2821443836 1673249979 +2486140132 4060320350 +625984264 196662819 +1043991712 2506219507 +4070665078 1780230875 +2028256136 3625137931 +3755570600 1385388483 +3095485339 250377566 +2161885093 1065961059 +1340499812 733266537 +4093073124 2412792116 +4013974448 431865524 +3092933290 1777567313 +2543027178 1484766933 +1260728983 1602993186 +1385321736 1385321752 +160177700 731083433 +1703604725 439744410 1391129555 +2561755966 4087085703 +2478067313 4124539888 +1754479214 3692522233 +3250826259 436724204 +2760399668 916951759 +2170006406 587400161 +48637295 977116777 +3045015026 2840495077 +1862631387 1339419621 +1642660611 2936516336 +774536951 3537748340 825575849 +3003470388 1187212409 +3187719330 3173577475 +2308243548 2961706851 +3769226882 761048739 +665598331 285095464 +102558995 4194193280 +3552053546 3593322898 +803624400 932779619 +995925896 4207878941 +2139704758 2139704742 +514340884 514340868 +3047636401 2806390192 +3693083076 1031758511 +2881594492 3721785127 +2611300213 2709414751 +2359467400 2648011956 +453655449 453655433 +3213147330 1073030506 +4109025436 697120145 +1979355541 1316171164 +2540714566 3148600689 +3660688766 1175685066 +1822112344 3479305188 +2479358190 1897159511 +4030138052 3936331401 +2910396877 2372175666 +2985968598 2493896374 +1641648621 1818271534 +3340466825 2226811701 +2152762981 1674586348 +2101741328 2101741312 +1672356246 3646561044 +1358161937 3385085366 +31592894 3034705439 +3541269800 1873675755 +1115019810 3246809987 +3414049073 1370070839 +3045262975 66148439 +1578459312 3416732949 +799742013 1345583906 +1965198565 3568280431 3109350420 +2825713173 948396828 1757710643 +1783909131 1840390722 +440219721 964748462 +2204253450 1000725555 +1219981206 247769393 +4191488945 4217464752 +597293103 979481070 +2654896704 1550256851 +888904908 3178949894 +941130674 9916709 +3558667502 1113222654 +1943972493 4102454258 +1744407811 2967010218 +2072641236 1312565177 +132390411 1998277442 +3483313152 3615861779 +1550285598 2498154559 1112125378 +3808713406 500881695 +1546058034 1352094358 +1429604528 3557797123 +589585667 1430154154 +652462915 2073623164 +3704211566 3926704231 +579323272 3820746013 +3728762926 224657529 +920992283 2245687442 +2530560842 2624432862 +4071438216 2393795357 +923365884 1543637672 +2055710628 2274158399 +294215090 3428990285 +483310166 2943309169 +3474576784 1185962092 +1787096570 2839715979 +849652491 3292086868 +611523750 120985921 +2972004374 32988039 +3549884181 742587779 +132555168 750931062 +3229439332 769763663 +2489431888 3855848181 +3132742648 3053416595 +1550614717 1550614701 +1254726354 3272440872 +3580502271 3634314674 +1271783054 161217561 +2862939587 712853233 +4289898988 1578771713 2170399782 +330626590 1718341116 +392424903 2572111936 +4226137429 315707440 +437694198 612777044 +1915579616 2642568357 +2214900495 4267741004 +2170127620 2750178655 +3022860243 1981958458 +4079357489 4125644582 +2866242323 1387574679 +3314311726 704548463 +2951492192 1356025139 +3915420734 2701745545 +1644777807 2745892686 +3452100590 3452100606 +1053188009 2068354840 +1788499125 471872284 +582683459 1771801316 +1198381385 2253220092 623696581 +4094237764 1851227913 +802459714 802459730 +1872384260 3018688832 +1800444132 3554717417 +3941534499 4182673436 +1107461719 1018990096 +986271129 3994883823 +2348983169 520261297 +153585116 239258724 +292623248 84003747 +134309381 2909459420 2670959066 +3882714308 359137439 +2341884793 3679971060 +2962338693 4216978365 2052954714 +680539813 2147878330 +2554787667 2325677015 +2940873209 3938456318 +2775722194 1152795283 +3662961963 3721308834 +2789304447 1430782742 +4021026883 3653466162 +1383625700 3080613865 +4045144567 3733957289 +3105772511 1237190686 +3574695785 3549964871 +2569360609 2844068026 +2625136786 3817643461 +4178320730 2497525328 +3962862769 3349646775 +1907497309 1482550644 +1574397759 4179068968 3316166815 +3604112380 2364085680 +2417162360 1172120813 +4255978302 2507491999 +674427133 783770082 +1991834634 2388748926 +2725264458 2832212907 +3160190953 3599917997 +2553844148 1426939481 +1743121806 4210656914 +2714874222 2714874238 +384602047 384602031 +3177398095 1916578136 +3777475605 2256567580 +4032436376 4124358491 +2353543584 1974646501 +2266145518 2421587129 +4047966589 4047966573 +1153343010 1511190421 +43106622 1081383714 +4022974378 597120018 613163163 +1290460045 2729942756 +376339790 2649702873 +1889849406 2555575646 +2587115262 1550772745 +1004216919 3211872367 2432110310 +3179250071 3870884006 +3615586044 2113198454 +2847732299 2138139677 +2802250920 2953080743 +841722029 2814019652 +3173411262 2172155401 +3709868183 2961618342 +1998863096 1998863080 +146689632 596992307 +2696413784 2166820227 1468073167 +1411986725 2715724090 +882508332 4201737047 +631259204 803795204 +4278249916 3390694369 +213459751 213459767 +3872203232 3872203248 +4269955870 4269955854 +2288291807 311246986 +1144788842 1144788858 +3886679321 2563404735 +106513461 864444284 +2405830629 2729117050 +1941949550 2767114543 +336207402 3052239885 +2769547645 2410830328 +3304025044 3304025028 +1409653145 3721448414 +3648270830 1072339375 +3271697491 1331637946 +766910784 901142483 +823440590 38034521 +628433253 1550029306 +530155701 1941058812 +1414284024 1176612741 +912607905 1114930038 +3513455342 2576272559 +2179778383 3602760014 +1369760211 1502576442 +2596767536 3625570453 +2577698603 151871668 +763631433 798491316 +4066651733 3904171978 +536864294 2245479873 +1031932435 3870677996 +681218374 681218390 +3874286723 1618503110 +2518430628 1383723440 +1622130534 3096234621 +2580516029 715968962 3736767883 +1086374909 4048891972 +1838015269 2606535482 +1238852561 3146484010 +727469304 1956293504 +691468617 3588803173 +7599784 1968135603 +3351432272 1105458347 +3420042390 2109163559 +2959451438 3989091257 +3313980244 3041910712 +4133163865 710898952 +237412491 3519986370 +1340132240 1323332515 +1623425069 848232706 +984821432 3313876751 +3845946961 2296570586 +3975273035 1270522882 +3194134674 3194134658 +1439073221 3431034636 +2087118965 1258287146 +2664160540 2968399419 +2210903147 2217180305 +3976195453 2481118164 +3479055169 810312573 +3105174023 1667088662 +1695403792 868775757 1401506448 2312585427 1502449022 +2863206338 1780731491 2036196810 +648753222 628948535 +2945822261 2644589930 +787367538 1394140531 +1360986299 3599136187 +165147140 1743790236 3432087158 +3746827638 1126422346 +1638010994 1362300442 606069619 +3645765973 3514283953 +3625809007 2797097542 +2329034830 3606788825 +2899550068 2233729935 +2120821469 3700324834 +3554065921 3802297197 +2459400031 594602632 +442709870 4163912239 +1612703740 2601948891 +287586503 3271909718 +3373230022 1228954785 +668030832 1885883160 +3005220327 197163492 +3052176494 3511974201 +615204658 3953202106 +1649051749 3747351453 +1157867612 41148689 +2298187814 3389254615 +2444341085 2536322882 +2492116237 1181951090 +919982334 653099453 +592548112 3803588459 +2538217295 1290824346 +2835127998 3282953503 +3617317254 4291572181 +664140413 664140397 +1001152144 2153307299 +1970095743 1970095727 +1907013441 817789782 +899537857 3176990672 +3105230500 28904511 +1701255394 2202807253 +3571646372 1679887274 +3590199167 1576991976 1576991998 +157707733 2705253955 +881804854 4086007559 +1092395257 1320338524 +1885354445 3336211475 +2755380368 437677749 +780274662 1462088218 +143810023 1167495666 +1674958805 4272079964 +1443979140 22633695 +4070139678 92099647 +1039661786 1734337853 +1293659996 3197439431 +2657755500 3440549121 +4119540551 3508648150 +1083069146 2047634726 +4017864891 2047946600 +854252354 2263499350 +3834289780 976711833 +1336152387 2722573436 +590638224 2443642947 +570729514 3075370523 +3006019907 3996000774 +2433900856 2549025581 +370013528 267991451 +2498397057 712868737 +4294597153 404480480 +1368397860 2766342681 +4272094771 2942604704 +819660359 4234240339 +1808470170 1252729469 +848519087 2859046559 +1769645364 1074925785 +3676855074 579303043 +2600520067 2235382058 +1055017846 1950141127 +1784816149 3215453809 +3443762418 2321721830 +1621311172 1621311188 +924502154 1227469101 +3561384538 1396493110 +2462631838 3954652095 +2212397787 1917320900 +2307856803 103757456 +1819494011 3580808031 +236642577 815137513 +3194896025 1619823304 +3701722215 3168454198 +733154337 3957069792 +576675997 3106215732 +130788191 2761868936 +2847738554 1830229508 +1135750196 3313210831 +3110922230 3755650906 +1486216695 1793878982 +944244673 1516516544 +1871787192 598069050 +2311414598 3201373509 +4241346878 115181944 +3808195854 1819326105 +1674375567 2862629902 +1227450130 1043153221 +1338542725 498208602 +2368492186 3603302525 +2568044160 1574376376 +1191151614 521540962 +4068237935 684651694 +2747202748 2175261671 +325372713 1247078149 +2030143128 359063899 +1510133597 258764642 +895803490 1125300093 +1204842889 2518858424 +3952100144 68797589 +1148510348 3307077084 +2924705191 341980640 +1391831574 2931474599 +529693966 3248151833 +3065562175 3822907198 +628433278 1969469769 +3269407835 3269407819 +1111832928 3002683941 +796209443 3632028170 +654577316 3216874696 +2623589048 425238588 +1446780708 2563238168 3836020137 +1488379631 2531324472 +174261764 642954427 +4141880760 1522675899 +3930115072 3288409107 +2351755581 3888104212 +1877963365 2599490796 +4100341376 1022649235 +3445148218 2093373789 +220639500 2878641413 +1338398788 3151624452 +3463053626 1388835494 +2458496358 988201639 +4015758023 2397260242 +1516991304 3323899604 +718058302 4187734318 +4037161371 2996996480 +1910087331 3700734602 +3540513128 2642478763 +565395090 2670428101 +2449327192 1851228147 +2624322177 1533875604 +3021041495 3463595504 +2696254554 4108367925 +1971202137 470532751 +3803292625 3803292609 +2303444716 2303444732 +2722286582 2526267622 +2032127778 2114331709 +32320390 286309830 +2653413119 1906177212 +2045553624 3348268315 +474803185 2115464294 +2595818432 3757054144 +2571797234 2571797218 +1935168758 3490292275 +2797931495 1865530537 +3544664340 2906131065 +62658385 840479888 +183484777 2691528792 +1252037784 315222861 +4221335130 1900957629 +1015133660 2996202119 +4260567271 2897228726 +1727502857 549944376 +3276463738 1455316423 +3335737960 1722464701 +2989526094 3496795855 +2312502375 2312502391 +3091593762 942195605 +4187988982 1200194518 +1549687974 244046167 +2906174426 2319654955 +4121838674 4121838658 +3488558028 562164279 +1706068616 561883572 2632586269 +2982654247 2982654263 +1169797608 2874347563 +2545461978 3940414115 +1556612634 685873899 +420746440 420746456 +1266952503 403497360 +968297212 1766301617 +3557091974 198448326 +849326776 1768314797 +3092094853 2380646333 +165349711 3536824152 +3748606133 1896459498 +1168746106 3521079125 +2512800533 2925480553 +4233609321 2172870965 +1625227646 1625227630 +284823963 1261116232 +3934736401 1141050064 +2268699879 3333554080 +1984951470 1984951486 +3151384555 2640301794 +638937922 1936354653 +3758822175 3873805788 +4116392099 3783325834 +3604510419 2316259136 +1434880734 2160892777 +2350085523 2220659971 +3942971386 3425359042 4073873035 +3013110645 770779434 +1112843395 1822947434 +2502222557 2786140660 +2078987778 3359876521 +2823810209 2823810225 +3900590462 2093855071 +3576432102 2051885335 +3191553524 1799522063 +1546110740 647914607 +2854571890 1253838963 +635841500 3596857846 +696359460 2063967935 +587584603 2100120388 +7394388 7394372 +3964289221 1660613868 +1001120728 3348606235 +1493130373 2766032042 +2701759110 2710209461 +669171942 2952112641 2952112663 +1338407531 7517812 +2316033942 3870357799 +334871781 1356356730 +50279509 213869002 +1836136408 557508877 +3877197851 2459436511 +3490530259 1474413882 +1965219928 2145909747 +2812117968 2812117952 +1203242281 263200654 +3561864665 275867668 +371077882 3414835101 +4027397698 650930659 +626843186 626843170 +2501825854 4253659295 +3691504634 3805651139 +4099107715 575815484 +289912524 4293182263 +2286584799 1817024542 +1243107077 3366162348 +1985469089 3981257590 +2094689572 2095179535 +4158471994 827624963 +1567031539 2090415734 +2751920625 670791270 +3265064759 2483852176 +910063165 2706645524 +2517557617 2859263216 +1767893062 4219235238 +68826337 4273270534 +2869576755 1948867660 +278348683 2837402589 +906268406 3629933670 +818822165 3731005114 +1336583567 4171407374 +1110698571 3211882041 3733511022 +2584779463 1406416261 +928337805 2136814779 +2565145897 4256607384 +2838664044 3332248321 +2255410529 149406609 24766390 +1268268839 665545312 +255915401 2353170094 +2474634340 713735780 +860461114 860461098 +40987715 462253418 +1772834024 1084887339 +102335751 312520281 +1881816321 2474510464 +2291700229 221109708 +3329859609 3329859593 +3341016432 622672605 +2853501067 1241727682 +56837038 307476025 +1941537238 50815975 +407275662 2612769562 +2012957138 2615217540 3018020461 +2256260371 151560598 +1868025786 20709847 +302840641 2876213078 +2630864687 1910720222 +325887384 738766413 +2227829650 2616657605 +3332871520 433071653 +3194313371 2838665713 +4125903442 1962475269 +3637579043 1947708938 +3252630185 3680288792 +3694073805 3694073821 +3649802957 1288626213 +4043607303 622929426 +1720707143 4215673682 +3340051755 1722805337 2417819989 +3814196277 3814196261 +3794793370 2877062013 +3068647703 100319014 +3568251140 2956918255 +3956485725 712991217 +2050755344 2089118243 +3865773056 1027371064 +1842284023 1672421475 +93095462 3795267009 +3256189235 3134874458 +1568709021 1563760491 +3669326172 2813201351 +2787091650 2786159268 +3016139682 3065531581 +1952947598 4217512707 2590941069 1268036439 +2650905186 2650905202 +3269836204 629941820 +1744096728 2120223515 +2300553033 201452339 +3772090704 1076308213 +385250780 33261895 +1627774385 1832648112 +2564074171 588065128 +2619267569 1114001582 +3721631723 521676514 +3186058222 3779219385 +2828259845 4089544234 +341137439 2204894189 +781233305 3871323358 +1849730983 919071734 +2887156050 2055215597 +10677435 3145378418 +4140911972 4017935487 +179362808 944664723 +4115131612 4231650897 +2330981851 4247442158 3403944079 2244141154 1985871188 2679855297 134257389 2396628659 +1141029878 933126674 +1656537561 2847951701 +873943691 3367779151 +3408566421 1494096204 3408566405 +2299374159 545789313 +2263283619 3403179678 +2390955901 3579705812 +1850812496 4190270947 +1491938459 2556246034 +4045753391 809023964 +1392924321 1408917366 +4056887507 2083118124 +3756134442 3904938117 +2398885097 2116915045 +2610555089 3293151494 +3555633934 1352849312 +3494700998 626176382 +2321304561 2321304545 +879043341 2285251940 +3150691229 1052268596 +1589514126 2608464442 +3201941418 449362061 +3278007286 4228718486 +3178052012 3740387777 +3400789716 3980457903 +2213337370 3180769996 +3768560261 542732108 +1429295570 1054645869 +4272383072 4272383088 +1710257049 310770120 +1549730032 3494496843 +910915530 910915546 +2522143772 3281420295 +2917814476 3862189793 +894425978 1723236637 +90535534 3971575609 +2018094652 2549958769 +3827589438 3686754363 +997540893 3063560628 +3943883536 515600949 +2422246069 740107430 +2580608596 2012464697 2012464687 +2202989060 4089390831 +1833431239 3477080406 +799301398 3873932278 +4267967644 326320519 +431510503 1365538803 +3145188578 4287295427 +3116695081 2585533080 +3639801531 1098541165 +3233927780 1321134652 847952999 +2844335992 1524402669 +1153742984 3383655947 +1271687983 2177678072 +2798950266 89538626 447378699 +2678815370 2748252659 +2353361385 3125957080 +52826739 1743719194 +4192323960 3597674491 +1727855777 1727855793 +1001871798 2606796673 +3886428621 2781980257 +2278859423 3858002250 +1144246010 1624703938 +1918420186 3686654781 +2524184278 2929339121 +823561156 224573112 +2750745345 465588886 +1318514239 1525659115 4137225512 +1667990537 500332922 +2105511027 46799130 +2915348378 965698933 +2597088857 147961352 +1859319749 991693594 +3373694030 3272749007 +2951696122 4021900162 +1370690033 2380611174 +3008576899 3473528106 +947561405 4174333321 +1364596238 1413130138 +1883328383 902833384 +61114935 3946226173 +2117980037 2554953206 +2458421162 2458421178 +1811998311 1818932256 +886819210 1212429978 +3482726949 2513054557 +1319544778 2589598459 +3984573330 2605846258 +1487939609 3058638686 +634688187 1218641010 +2449605118 3609797343 +2382977380 1043811672 4239898729 +1188875015 2492701705 +2021028611 2776042940 +2157848213 234273948 +3039287714 3485178389 +3228303483 1694810546 +660395491 3659838556 +1633802752 523182648 +1992853812 285936031 +2782465890 914048430 +2404434352 1277224988 +3145902330 3129605919 +558311151 1375881774 +91423862 168822215 +573927920 573927904 +114055437 3344609394 +1607331892 1576028878 +708818907 2725692748 +3442713326 4008539054 1689208687 852478386 +284510261 3877677948 +1441086165 2358434864 2209912113 +3908847834 3034955939 +3938515628 3563970422 +1383225323 1780642370 +2088704426 2786420379 +3326368293 2722740879 +361563185 3595483449 +2451860636 967834811 +4016039621 4016039637 +1481743903 4027750620 +4264926855 3043528320 +3217817540 2988679561 +2148321316 2028415993 +1308385735 1335876867 2598959525 896148469 2819785081 3711788942 4134303047 +2250776168 3680654794 2160817505 +3643275315 216774746 +951347519 2197925438 +4253343451 2422852232 +621577518 2159388527 +38566035 2328859818 +1250134633 3054691150 +4129944739 336660870 +396577950 2327424458 +385510238 2318861567 +1406160903 1406160919 +3258210496 2020062803 +327687878 2236117431 +3940854441 3211824665 +4113441575 513889888 +4058103015 2908512182 +1238110929 3024967265 +2435656235 3405041231 +1744849580 3872168128 +3480232235 3095672500 +837380454 837380470 +3930777937 938292999 +4186545844 2275726661 +2078955229 4008099316 +4247110033 2975787357 +2966195302 366142512 +1684276606 2272568671 +1693630729 2685901493 +690272011 690272027 +851972182 1190246257 +3796848239 3132570129 +3256605547 2211710955 850693129 +4147210497 600329344 +980763281 2543307334 +4256947790 3166631119 +2188547712 1387841704 +2770640190 2725253705 +3808182911 3525094888 +3951936705 2435627990 +2696452725 1933382682 +2782597824 3736127850 +3107957847 4131146982 +2188977068 280176577 +1906310835 2447242202 +2642916413 966835202 +824871784 2772320532 +3562123127 3013032016 +3072722737 2178765370 +3002388458 2707639643 +321062293 1710970756 +1625296066 1887288766 +2358720202 615890529 +2683313077 1733513759 +4041336147 2476122560 +3818223622 2805370500 +2246781451 4170416431 +2290925013 3398358620 +4053350659 1463074730 +439926055 179839794 +1805346733 312751442 +2526520383 2932404401 +2794628743 3218876032 +2107306182 2162755511 +3527450003 2394426988 +3469171582 895125418 +555250532 4123850575 +1980911660 181679447 +2966051188 3263877519 +3643255779 2380854518 +1409653151 3822114120 +2963453794 1915137859 +1140567041 103794070 +2239729189 1207186887 +4028343047 1087677930 +2866326726 3105356727 +2961662327 3570083535 +2090376030 446607066 +99320506 168566245 +3821017337 2154254334 +1814349045 853675434 +282508531 282508515 +1973474869 1630614908 +756199482 778791755 +2961270380 3787093377 +3406158146 2033433019 +1716256870 1873059991 +4209769173 3598441802 +1514857278 1642314377 +2296144445 4138685730 +3890816676 1184465550 +4182208781 558340953 +3323323475 1267447213 +3387481618 3952449093 +2733264004 4208358367 +2238957652 1715787683 +1818557529 4227416094 +3800516689 4220864502 +333701014 3854104881 +3507381927 3232471264 +1397426394 1387428454 +2326595403 1547561397 +4034488097 2954713312 +3676096145 2135725638 +1105705065 952591976 +3353206733 1302887792 +1019255265 2217884960 +2558016237 1950291269 +82653275 3458212197 +656272036 1059888810 +444429111 532130786 +110596135 3559566884 +977497072 2214047051 +51434009 1504026883 +2358631990 2246889233 +470828575 1285448392 +602381067 2425950786 +1368993056 2485258604 +1775354230 1764138305 +759134020 2129182729 +3333881666 812736758 +2835751516 698084103 +3834979851 3788170068 +3267932544 233507507 +1460436321 1772707766 +1460955120 85958357 +2125017840 1415262147 +466860096 239799493 +3605321363 3711813996 +2365391753 2068615353 +3341352262 3414603041 +3355878634 3859549915 +48977262 48977278 +3704564482 2619388981 +3110833244 3110833228 +1790468209 1900007919 +4287620729 3364343934 734869065 +1802103890 1774126355 +1852555797 33521692 +1776923122 3160404846 +2352973499 3756298117 +276748087 168063906 +3997665191 3248131040 +1877060130 4088716270 +1304935028 3848963215 +626548260 2070133180 +921523236 2730011739 +1456063590 870930747 +433431229 1750019970 +2594401997 1011313828 +1979802092 2955749015 +1707475721 1267058893 +1029877782 3092984497 +1555269300 2728201561 +1718592529 1417510339 +2718145269 1047492307 +1609864995 822733852 +2991253799 1595469047 +996298711 14424905 +1197592723 4059780972 +1821256579 1724809020 +1272295309 2216252603 +1580807781 3104874746 +3701308544 2280462427 +2032850960 3463586083 +162810598 3904236210 +987873941 1534970156 +1675830247 3289630707 +3225482860 306441239 +3232670113 2733838973 +4161262443 30194072 +2632276520 621604075 +1770435919 2588277644 +3806721994 4287582986 3107095817 +3931233754 3101703723 +3113185835 2928531797 +2252671227 2252671211 +4273528426 161855698 +1814568960 14647919 +4212040474 1376436706 +2240504840 1114536075 +2849401933 3870109884 +581060496 360097699 +1808180636 3897248136 +2329381572 3574681007 +688074469 1963119226 +649059086 4107654937 +2224542144 2063544659 +2313841866 395499478 +2689770834 2555567597 +151460260 1346949479 +1092619299 2537279779 +3788933200 1394615208 +1466788876 845508602 +3954257148 65654968 +1967561754 3089612011 +3230491453 1830632964 +304973252 1638503305 +1108738717 3867139202 +1825891868 1864777240 +3235987550 978397291 +3393614082 3549020046 +3748843698 1743808602 +1209011021 3191982642 +265315640 3760597232 +2128541727 3623917790 +239913950 1625615977 +277707386 1765125030 +2407486435 3362852444 +2594210702 178497807 +2742909221 1165773404 +3254476229 1330860010 +1703701828 537920031 +235800283 1289600549 +3943494871 3697634928 +398195438 1256981679 +4040082215 1014838902 +1113694273 1780394215 +591220217 1921105640 +1574344322 918661789 +1119879501 1291399845 1631718450 +2474266874 2474266858 +4102664201 4257226296 +4081700477 2049969876 +1063048904 2267421899 +1507486714 3808389315 3075675414 +11084981 3208956156 +1285774124 2211141719 +1443661953 2117303206 +3512449963 1986363947 +1533045729 2060339316 +3768858885 2810561242 +1718214178 1718214194 +2887785124 2592731199 +4077428041 3750730222 +4172072161 1492774432 +2650317417 2650317433 +3347405001 3756704878 +2964012540 429036472 +2731703954 1206282461 +4127263594 2913269703 +1211267348 3144981113 +3641453015 2233851238 +1950692704 1760757299 +3690977595 4073799330 +3822636440 2851462961 +2553967002 1040140770 +3575895936 1600156933 +4022854751 4022854735 +2593736439 2812135778 +3440480347 548771848 +3801913623 3548708646 +4097211104 1604793352 +2663879971 2620710416 +567586145 2731339680 +2029346880 3523412507 +4007527467 878852184 +2878509270 3988390119 +2987386798 3004312308 +2107392460 3305779169 +2595755252 2002117920 +124640688 1511620441 +1699541519 3929612221 +1904427896 2597245682 +2136849848 3747410880 +2368459088 2348450019 +2428985638 266202839 +4246857334 4066233297 +2561272082 2516655166 +1627183048 2870597859 2870597876 +1935630857 2821149742 +2564721989 3152176195 +2151344090 2134447268 +3780954479 873535928 +495919211 3872181215 +586477573 2917323382 +3452992026 3452992010 +4199279521 2793664118 +4158294400 2902881413 +2342287351 1766253155 +1461272999 183729075 +1340657862 3230138053 +3037364832 361993816 +2303472944 821737611 1002072392 +1889030972 1369224944 +1128817504 1128817520 +2858320437 2858320421 +1213987595 4090245698 +513988840 576419133 +636775505 4046430615 +2526328603 391705346 +92142705 374629862 +4208639837 1130053492 +3716339046 203960578 +1512533992 3558156843 +700211151 3339809073 +1253255023 3116156935 +3641805619 3919454540 +3122839609 3779986974 28696879 +3251004883 3729935148 +2147519410 853272883 +4004140472 1847914669 +3486103162 3701862662 +3315418291 3381863898 +2900033225 433082169 +370023435 2721891128 +2763973338 847191339 +3093516440 3042645642 +765146528 3158048903 +1694926134 1061401617 +1896902998 1390570087 +4108889001 1307654831 +2174119481 953123774 +4283037416 3379539773 +290706178 4243880714 1224027171 +396589298 676816101 +1417004627 2792876759 +1042777615 2876409812 +1555862587 2164721342 +280092050 4199234600 +3281863064 2291024475 +1856956524 2841109015 +1616060855 779019754 +1835874768 317850229 +2514636793 3963872510 +2319222503 2219335094 +2897626345 3602983576 +4023744184 1158276013 +3365459579 1134142386 +2083853116 242593364 +1536174305 82860598 +2512002223 1660626798 +3689465962 3464453290 +136489616 1586659509 +2909630357 1574740403 +3553114050 640665187 +2731870360 2731870344 +1875223241 3172942446 +3620337963 3723706018 +1085486049 3139087158 +4123655101 4123655085 +3359841901 2930304402 +2065387928 3141988147 +2958449030 502197751 +4265127536 1245770699 +189615525 1226941524 +2024473792 2364045979 +2325555134 2547771335 +1165001771 1165001787 +2449738336 2236249755 +3660265997 1920924018 +3872800654 1615185177 +1797415003 1797414987 +1806045405 1678826005 2609336075 +2090915160 2301614477 +2970091913 2926243532 +823422222 1361554713 +3338017576 3338017592 +702691589 2542597507 +3517048426 3988737082 +2355630398 2321720927 +1942056907 75693204 +2991760217 286729480 +511889014 66517138 +3439871990 714920659 +2774586486 3446568398 +21320193 18880384 +430823723 2544688820 +3433286469 3331796592 +2683156054 3044436257 +2789713694 3771470911 +4233101865 1525900952 +2910379654 1722493126 2605075703 +991140117 1435454003 +1665495622 2354242615 +1050230635 2165235651 +1742485257 2019190951 3455771916 1835458474 +2239570360 2239570344 +3478635305 1759358060 +236772513 2466605375 +3241868612 1943843337 +3229936235 2084374114 +3310755126 3700423697 +1277806668 835080097 +680703607 680703591 +4248655131 3264018834 +623375100 2044953255 +766293856 3204120108 +2845321739 92942164 +4000656731 3178653266 +714686812 2254789271 +3754680250 133247453 +2678909177 1446166526 +4293757531 1039191364 +1818218478 1784414874 +2565097409 1885140160 +1562465881 4219787561 4101697054 +3468178915 1325192284 +2717444079 3923057966 +177058309 2718907866 +4056532825 312200178 +2536499906 1997256906 3262025571 +3756058833 3704953953 +3925142850 2391899893 +4128660325 3392266234 +3459236682 3409726063 +375821023 2995354919 3398541880 457334331 +431678382 791964399 +2414761119 260574257 +3448530254 3448530270 +1700629954 1413884021 +1683159805 320472160 +3417377998 2415074202 +869901975 4063677142 2778344410 +53458183 53458199 +602885046 145715200 +1420731291 3924528402 +3839026363 1204488669 +3460129188 1319155007 +2414485631 210839528 +88830023 2629943254 +2570453868 2617729815 +3334782418 3115766149 +4053548317 1978938530 +3917104180 3212402137 +235089285 589960963 +2015029179 3445279602 +311629054 998902729 +880097560 2894651597 +376982135 3596433744 +4049214390 2799280007 +127594559 937964328 +3545615304 2014301149 +2277708234 734677875 +3912962682 1902998863 +1294909605 630801338 +964868762 583778411 583778429 +2797104666 2387956477 +2922694744 2501337741 +700206846 1435066978 +2308492368 641377643 +1699422342 4215550689 +1806294936 342555739 +2381228587 2578833844 +4005457926 1988810321 +3521418459 1171674322 +2586480434 186026701 +3876264660 1651739800 +1650937372 1557160707 +3662681623 4204559390 +1337660092 1065254375 +1634533341 2958965698 +2791249623 2716773959 +1845062770 1845062754 +1362496559 509042028 +4254436099 1534904165 +3764691019 2305316372 +3246410818 3740797941 +713634100 3944739231 +3754157353 469683860 4276126108 +1916571295 1951695966 +614831902 614831886 2569752382 +2471251383 2552125200 +1365725617 2360402006 +2084262232 3915451789 +671471370 1509159538 +2178207473 1392625008 +2753417404 384800743 +1587943814 492201683 +508579291 3821520580 +2993107702 1144897762 +1296065265 2371600752 +3060351992 532021101 +1301682906 3926975157 +3273555203 2384245225 +1654610737 1185489453 +3524202128 1035201699 +3129388178 2979944237 +2803928272 3896355701 +3933007829 3732769884 +901275821 1044394066 +2144917907 3579740794 +517964243 4160754022 +1788342274 1788342290 +2720120879 3820726415 +1829528770 1820499317 2958671942 +2764285388 1849431493 +2907707701 4154405779 +3962349636 2349426479 +2822548233 3766566712 +3659889819 67315730 +2057136399 348938904 +482927300 339540617 +2094662860 1463127351 +2067111616 3043551315 +382404002 2207899157 +3660694883 3881598843 +3253492927 1017317500 +3938174715 2157591858 +19820570 1454135797 +158512836 2744497823 +2437680107 2780218082 +1751161286 370283191 +4291278792 990886115 +3804645330 1043434169 +3000243042 96321798 +180397544 853817976 +1916352320 269613509 +4067130697 3895867886 +2404506531 1088209290 +3382572247 984116838 +2506697646 3801072367 +56541152 774376869 +3476190355 3311788823 +2878360974 4011939581 +2714467669 154567928 +1275146310 2265591953 +3203600339 2548173300 +1992204674 1992204690 +81512287 1592132619 +2190032192 3188419532 +829373509 3820328122 +1811802406 3347891313 +326705481 4038026744 +3117815313 2634333382 +2767946797 1989986245 +3472404415 4065045166 +2476789852 2476789836 +614416513 2551249389 +1252464378 1168739420 +1700113555 417246074 +2651035465 145172462 +776441745 312924657 +1986369625 3136214046 +984568756 4231338015 +4086838183 2656615844 +120000218 477913387 +970070718 970070702 +620918991 300166606 +2174279914 2239860436 +2862850043 2085634238 +3467532507 311481502 +2593950357 912906118 +3298194006 3143632106 +1513179580 3080131313 +1191490653 694677090 +2297141642 350401581 +2127840235 2468801268 +1089749070 2390833871 +3924985605 4075274087 1457377155 +3972369247 435840660 +2696347176 672274667 +598496953 3779888446 +4046780973 3815101650 +2542890326 4025425521 +2577815499 2883335316 +2251671838 1688967743 +101220988 4217727271 +517636621 2667231858 +3859720326 2967409004 +3393665891 357207623 +1277771044 3021711012 +1050963883 1205586466 +2569060617 395305272 +4097208083 3462963606 +13305449 2828736334 +644631245 1232715940 +3800658495 3748520005 +1547817960 3811351149 +1700452894 124896237 +2691045008 280331445 +2036069854 3921939583 +2028287869 2028287853 +2040047313 2040047297 +1170210678 2741635927 +3251429138 2256145851 +1940769931 2778267348 +2853057213 1901715330 +2280648983 1596438477 +3069670165 478816796 +1792767419 2996231374 +2892794232 4129961004 +2131641755 2131641739 +3261413044 1843488712 +3505248574 611122313 +236328971 935844162 +2864540503 523237862 +3691950414 841079290 +3867600652 4066228200 +406000791 2942921136 +1279623056 2707935157 +1188134034 2489211782 +1280653189 393422326 +3683831761 2642978824 890609075 +1249991502 2217584334 +1989383400 2454939965 +1821084154 3706055382 +3318158427 2170679035 +1526399614 3072650313 +3946769882 3946769866 +993976159 4066295450 +2159238385 2338017136 +3370115251 3370115235 +12172330 1583566685 12172346 +2132722162 258691045 +4100180903 675943858 +2532196434 469987578 3943645459 +4010081852 2161916007 +182946998 3766649489 4101208705 +2643091856 2430047651 +898495520 1853312613 +3532783909 2698497338 +4002597113 3358788194 +3865245808 3076613831 +2818828225 1200495380 +957169742 500972239 +1980941025 3169835957 +3175043390 682419337 +3517340314 2732630141 +1650431749 3782917331 +3981801823 2238095257 +2115681820 415845584 2686010897 +2075472816 1849712131 +1342225413 1408331056 +2495284424 448856586 +2484562578 1686652205 +2085426971 2786130853 +3744027936 677703993 +2550421263 1315099483 +1767726505 2264559896 +2432362997 928165772 +726378952 4028384715 +1216641808 948812323 +1963712368 171574927 +2890806181 3506030794 +4170489999 3774398734 +339867719 718919616 +2530582963 625839322 +1975648007 1734637590 +4229936808 3571495440 +2788367320 2054477069 +1072638894 1401012985 +3024360732 3251987363 +2354245357 3549306642 +2561016599 817775991 +1043797600 1043797616 +2879217026 1713326475 +1908889963 2278671202 +4154424968 3301424547 +3190638042 567878461 +3507178323 3507178307 +380939153 2637298035 +2318999284 1561720136 2347481625 +2902024099 4019293596 +2862768308 3575082249 +20970321 10793718 +4136042884 2592563913 +968774989 1976465812 +209552545 1251461472 +2258766782 1751565626 +3589315411 482640826 +3496065011 4241789836 +1498915904 918087195 +3043380527 3205202158 +3685612600 764592960 +3873244905 2278930031 +3139706074 684597282 +4097409028 1491858408 +2951900836 1923590515 +1589499454 1658340233 +3793105451 1179130197 +1619713087 966309694 +1556898781 4072748276 +2285626831 3971211291 +614379665 2405272096 +1726842466 1776979029 +2156948612 3881489353 +28316315 1543942416 +4261716155 1794445183 2622031460 +1528026299 1022976872 +3142842972 1749634403 +3018630168 1418686300 +94679004 3191920455 +3344156075 1944071220 +4126405539 3523774876 +3298475495 1907987305 +2776169184 2776169200 +3342675696 3814107211 +929049815 57054822 +2759054282 2891343611 +2158360340 3204045439 +3312861048 1361439227 +376756895 4176750664 +3291993463 1720663028 +2671268033 1722228672 +3375703743 2042747951 +3966961670 3440195907 +1980064441 936942091 +3024060962 2839225326 +2783376504 2422122945 +3340739563 724384583 +3651478919 637146006 +3281404888 3180121371 +2921864374 3743756945 +2924177148 1555242673 +1956617013 3426833532 +3074405352 1632122411 +2141604750 2160652441 +1490191536 1588212680 +919692057 3293418473 +2632586596 1753197673 +4279773421 2148035844 +3775197661 1392803284 +4216522677 3234853577 +1524128800 3567504020 +2034049436 2000414865 +1778087349 2346339324 +3305950404 4146485407 +883883628 1534755863 +4084178072 3501425485 +3841726006 3321669514 +1413005509 4132567747 +32481370 32481354 +3630971824 1650587157 +3148746340 3607144297 3607144319 +1912709526 244408103 +2420267881 2171987534 +768092978 1142685605 +1470934567 1646263332 +1792923844 4282137737 +1446193179 475081833 +2631675889 2631675873 +1472755565 2032650576 +3362615594 2015717778 +3742376462 2316065656 +2733159053 2733159069 +1144484477 4275754596 +1402327580 2009891025 +3489453834 1963361467 +196982447 715560302 +752312744 3618084078 +2347792602 575369466 +1493705588 3777220063 +207340019 1735545242 +2720402375 1069916868 +2257023918 1966807801 +2906271566 4029969585 +2856170163 886939168 +750019156 3506445236 +3445436225 2873057393 +1026397823 1026397807 +3493894780 1370698023 +1570361021 371225483 +2675109162 736844059 +1193073352 1437144053 +4270397547 483487842 +1637838488 1174083931 +1631141322 3608954093 +462655830 3209546363 +1705513779 982923610 +352416269 1846667461 +3793310897 3240237910 +2183996399 2759957307 2183996415 +3141461837 1348987387 +3009341025 1752699424 +3176417665 2360325654 +315171435 4255198818 +2360840401 3460797243 +3119165620 870335339 +468621529 2489720766 2426812431 +353275218 2011723781 +1207117602 1707514499 +1137098196 1872943340 +3057329787 3057329771 +978668771 978668787 +3610905169 2182015895 +2867956145 3409691046 +48637301 3231648650 +999941734 960869015 +885297269 2255448106 +1672609290 4214417851 +4266296696 439080823 +3313152630 1445392337 +552277285 734611036 +518196036 168165945 +3446338645 3136860410 +2391101479 2195533152 +35280198 2507423009 +469622777 721234805 +1922602319 3040021329 +3468450406 2959169122 +777604841 93765311 +871193209 933588072 +2514575508 2244675823 +746865745 1698139024 +3920378672 2268671627 +2947889118 2017915497 +3812820172 3812820188 +2547663784 3029893501 +3602646625 602594448 +799575628 1099599991 +276062874 2167879805 +4230175919 2594891640 +196822390 3989723335 +131232975 131232991 +3801659150 3416391823 +1774784837 3431346074 +1276692154 2231424733 +519410442 3331750061 +3696362585 116471439 +1291988170 74220013 +3797666610 2290147237 +899136597 3396673988 +1313725640 768490864 +2392308761 2447186760 +1935246842 19655207 +2631488344 2727028467 +1793282093 1959480452 +2664089455 1748497326 +3580438195 2810702810 +2501163342 4255102425 +3522250704 1322519669 +1409899367 966610235 +3429472174 838085177 +3422554854 168896535 4026670129 +1489544377 2251490024 +1810508025 1810508009 629374174 +1325408153 1325408137 +3677420037 4014402678 +3227893336 2399316378 +2033921154 2390700189 +1945215095 4234124112 +2973558056 719109629 +3771637656 2164124965 +1856625010 1196596014 +3781136143 2708080881 +907575450 3264377469 +272020473 421953480 +3266851995 3266851979 +4025234078 1322495657 +65241311 205286898 +2552931251 1042264794 +2708398018 3817487971 +4156455760 1065663421 +3780326485 3780326469 +2443035596 123419191 +3663921726 4280909641 +1719981873 2485043760 +4039186336 2683842789 3977877285 +2942938594 1738110968 +1719417888 2885573841 +604040492 3648347201 +955959147 499641716 +2699577811 2602228288 +838426880 968315445 +4083538268 1854952140 +1079717550 268507439 +947077939 275958092 +2075633209 2032616239 +2571432120 4287033787 +785207163 4237013742 +3679333091 520979292 +2781504992 3718143909 +3829295689 2537640174 +1758890097 2058930662 +2366294312 2023327328 +1848014111 2230099873 418808557 13944778 +786333215 3879766750 +2575843899 3967828722 +1091816200 3941604899 +3911536432 526671553 +466393916 4279787367 +291928693 3646080554 +602170495 3794919617 +369142405 671903564 +471356901 3283375370 +2165235636 2165235620 +1498644681 1227989294 +3724465324 875095015 +538516015 1126436986 +3514891628 974057729 +4168405435 3672516978 +1861367362 1659439094 +4232125729 998300406 +2132377704 3136556396 +3448290576 3328170874 +4273493943 3006403856 +3895116539 1985016109 +3170762217 603992921 +3226797072 2704647400 +3055127372 3055127388 +977663494 3257027425 +2828263063 4157040560 1706110345 +3999711205 1106188579 +327138721 1141212614 +3073115565 122482500 +831385086 7186143 +787549661 171180062 +3871117984 3671773683 +3357679907 817506844 +714917801 3653661465 +1474894132 1474894116 +3743104078 2246045391 +2674341121 3057876263 +98677019 1596884702 +548969094 144392439 +2831840814 3837266553 +718688985 1214540702 +651936847 2062944334 +550400783 2111295672 +924727170 1183932835 +3680288229 939454316 +3059306565 1402559628 +953563346 1262187155 +3558124724 2425085785 +3361895379 1708620777 1669205027 +279995664 396565373 +4248289215 1573050814 +4236484345 2083734014 +2612961004 4291012691 +665216625 636740374 +1344772880 3936516020 +2536290545 3966182256 +4220510617 1001944680 +1919982918 1833407777 +4147038938 2643530403 +3168756957 816564203 +2276422677 2922626314 +3836022401 1893061910 +2125542098 1123221637 +614481596 1682096625 +4037344465 2763652368 +2262632267 2566028034 +2804258423 2536234329 +589528680 3727128400 +1298274964 1298274948 +3629243463 3487417280 +2128951968 4209538144 +1106399139 1936940437 +2798849190 3269678065 +1445827871 3368140744 +2394328561 1129250916 +678660268 2514247914 +1466053743 4271409838 +2295267478 1893628773 +395868835 2118252868 +259157808 3796664971 +493482023 4128244409 +1964575125 3949598090 +540864072 540864088 +1700714021 3946671946 +689104260 1401625284 +1217714638 1217714654 +750449672 1917724811 +3439557822 4066164169 +3176071993 361137077 +692927046 1251130401 +1015846284 3712969591 +4136810800 2781797515 +791594848 2795756595 +2771269446 3056240442 1304494881 +4062387224 3296763112 +124331822 1311311289 +1146974071 1146974055 +3146048130 3023082165 +927182057 3901305560 +2592241880 325336077 2479523940 +2249552634 230948747 +1364308607 2191261160 +824417362 2903446803 +3198061553 1918476957 +2647097015 3454203434 +433035816 3385830635 +306376544 526308389 +4261873053 4133314694 +1510433697 583310288 +2911926896 3623430169 +2524609471 2714815934 +3030982757 3409837804 +2567868183 149635366 +343604849 2929626095 +4242898133 2789713713 +609997123 3461607421 1122551590 +3161450605 3161450621 +1643746340 524995176 +929952245 924050620 +4024390451 3482319194 +1083043198 2975890569 +3047389145 3377834654 +410852627 2493889348 +1159505736 3996991643 3463536320 +62245851 2989484498 +3109843610 1720215659 +586924073 1174101208 +856544374 3569710545 +1630889326 1964576239 +4127525197 2532156452 +2420311507 2028597236 +1196747987 498126906 +1298674838 1896532017 +3139587164 1462576400 +1787896278 3964855478 2558018535 +2845532709 614170668 +3406951727 3029592095 +500256169 2922211608 +2173538169 2355266662 +2981363025 257410704 +1015608931 1993543654 +3646232149 1978804170 +912161419 4047277067 +182891233 2791999854 +4209290272 368768613 +1557688369 1505271088 +1797546440 1917185501 +1245754014 2178494121 +1656815755 13884104 +3117555134 3252073450 +705587038 2460793065 +5845842 3536240514 +3046180915 105900108 +1401014272 905174072 +4099972594 2786632691 +2366492202 1144884883 +1608719789 2158101652 +1237778504 1088858759 +3575337194 1677746267 +428129527 836879182 +2684390235 1004232786 +1542945961 1872313870 +2855289018 3877055381 +1614563246 753194745 +3675515531 3540481464 +1846830234 570638056 +3491008688 1030204210 +164752157 811546901 +1998744177 4230844390 +3885971982 1863680910 +1272435553 100921734 +2944015959 2487075558 +2376103987 647837772 +3689066624 2782648716 +3785563238 2579870849 +2336943836 1970521444 +258462109 2015002475 +3289559400 292374187 +942166858 3691151946 +1876689924 3350172679 +2623665129 389216216 +1722029814 120239378 +2828720263 4072856726 +3769567733 2827791530 +1123124992 1647805715 +3317107329 3223685376 +2244217088 2476354323 +3382484450 423522538 +1512684227 2997944572 +4010304394 3560223291 +1740731702 2341176337 +483037551 483037567 +1892292489 1892292505 +3437077202 3437077186 +2376306180 4235759689 +3332028144 2509110229 +2327304020 3009935673 +4138431329 823169414 +1538556607 472502952 +2440451004 1966427372 +2786835803 3635091012 +3415090505 1587812793 +3306661514 3726968726 +502934717 3882378164 +4147737381 649712733 +3750788042 3128090363 +1228030342 3223135713 +3032419906 413945513 +3873761750 1348213745 +2981736932 2981736948 +3549648904 165091632 +1556528651 1556528667 +804798166 1506470631 +3727365866 1976567078 +3637440706 264569187 +343402055 4211047961 +3681426917 2939378954 +388090865 1530137702 +106884384 106884400 +740525356 2817172545 +1144842710 1144842694 +3397941632 1423393939 +934196406 2335367809 +2058873183 3646058081 +1926660180 464258095 +2430023852 4020253143 +2352611777 3575822054 +3933573405 2627358484 +1835550249 914773390 +3969671397 1596754042 +3596309050 2881646941 +2425906139 2061840850 +1407746787 513567393 4085506502 +1631349156 3563550616 3055177001 +1916460279 3383351504 +211620038 984525334 +2128655832 2642642727 +1140356819 2351910742 +2298088837 2298088853 +3325879589 3443634887 +2714042635 3814895672 +302405139 3871627828 +1213284699 854188612 +4200103383 3136424788 +2333159385 3549171369 3306050206 +3926433276 3956488411 +3877863930 3605372061 +1858698222 1429084089 +3294030216 3405572639 +4224784696 2720707373 +522732606 1248030089 +434853897 3386678221 +3511550239 23504183 +1794671415 2620821392 +3793776895 4161921406 +3718217172 3054703791 +1690231881 3783352056 +4012324335 1773791022 +322507674 3705265003 +2778675073 1885173517 +2192605136 2548927983 +3245870563 1929239644 +1408445703 785375766 +760850442 334404911 +2433410528 3284473608 +3188436006 3606082860 2149562661 +1915058197 3049405101 3321628938 +259247500 1803840732 +130066549 130066533 +662744387 670327805 +1699650655 3653249416 +575472805 1209500125 +424523709 2455256724 +3579343084 3325674391 +1984670687 404721694 +592560037 1051766970 +1090287523 331507766 +1643327257 610417058 +3385539088 3136055075 +450174346 3346890797 +1072005427 1951535316 +3806767889 1109347280 +3512608856 4013523611 +3016544040 3016544056 +87739557 2877479252 +432687943 392605266 +3965361515 4208018709 +3932779179 2597445154 +704266401 3052649824 3052649846 +1328745599 2176129217 +3599458681 912945512 +842560795 820052718 +3758902601 4233996782 +750056339 1316092416 +791540859 1850861886 +3212368236 3611182359 +84359902 3361844095 +2674896242 1858996851 +2437991890 2486436229 +3214639612 2647498663 +684629822 2068098697 +1121081613 1305527129 +4141875257 2716312245 +3382428745 3107330056 3382428761 +905336453 2709393785 +3269512020 467670329 +55168858 55168842 +885995600 3212066987 +3780332387 421506250 +2811388788 1064472463 +3393772221 1855570338 +403598036 3899601818 +1147938048 3057532691 +3924515100 719828232 +1011631648 202531955 +506625368 3782955405 +4040527772 3157332625 +1220651754 1927286363 +1705728819 2612275533 +3900226220 2718817473 +3620533549 3275880837 +3962492400 2533736840 +1576708732 1838833969 +4207641703 895577632 +1055937778 3958515354 +2795412848 3148994371 +3230942936 1229194867 +3452190786 2228172622 +3272340466 2198625677 +982707546 1058289973 +1986468629 39589306 +3737434510 1034951321 2872692505 +3198823008 1136521632 +2015442489 1541546856 +2931105745 3626046992 +3270400291 3559964 +3655852720 3087653653 +374233174 1322413794 +4191588427 4191588443 +727408763 1516975423 3151552932 +1058575458 1234144125 3048314453 +2505750385 1500447735 +3700025683 1432896960 +2389644316 1423747089 +411463729 1241342657 +1610890610 884405342 +1614341079 1351527289 +3151334415 3224075150 +2638092644 3972135039 +1324207958 1324207942 +3789924611 3038618897 +3155805760 1553143493 +2090192614 97825793 +1317752198 994779953 1317752214 +3469557517 2585411954 +3596812702 467372969 +2855377739 924284692 +198527015 3351287158 +655934800 3690896629 +3125763906 1576847437 +1383866406 1964141142 +2216884667 2513539176 +4176829414 668869146 +594405227 3376342389 +2936580269 3846805764 +1629324147 1417014810 +3083344811 2025383998 +4020315695 839692113 +4291254520 2664500845 +1793756134 3677308337 +2875433763 4040806410 +2824084056 1757201907 1757201892 1415936141 +2846684091 436113637 +1649617588 2095855951 +2394785885 291351156 +802230781 3964463842 +1273473206 867079825 +2090004613 2689638746 +2995916823 854545456 1589741460 +4079023252 1356924143 +3873614853 2077543372 +2160382285 3021116825 +1629049186 1020992853 +975310108 3489105756 +3894073282 608282211 +1365813142 3183464753 +3271016029 3271016013 +3647664103 710387900 4205715904 1445862400 +1376881817 3630537064 +450985398 2094091573 +3989363737 2977445118 +881717926 1635056449 +1603021469 111613236 +2026758088 430316183 +970137458 2035974259 +2246178089 3054439458 +1975537944 2366632643 +519556308 1027720571 +2957018068 390675598 +2334233250 1828084753 1245413282 1499664688 2170923785 4249102263 3359900672 284504161 +3254757792 91752179 +4205710484 603829215 +708549312 1666685086 +2608056908 55014839 +2318159296 1136551251 +3922458737 2098731504 +3949965633 3603608166 +3741235502 2742794350 +134717787 4278387282 +1396869072 3787181155 +545431067 1218372754 +2543098253 423240933 736999666 +1245874268 1119660231 +1657216325 3295875994 +3079921306 2546429053 +16777628 2449275975 +3362409655 2632101507 +3442823500 1458502305 +482872375 2115127155 +1209838568 2984853197 +4055732576 3855116347 +2910364725 1240104811 +1974186671 3328929437 +1965194155 3597286360 +558827756 1786977280 +3876894107 373317448 1620697860 +606731077 2829026412 +1367184607 582678577 +592485776 2269595627 +930598257 3264768230 +512353654 2446680407 2113019722 +145912762 483137155 +3428514487 510708457 +2274246832 2652132512 +4248981898 1534053389 +861716132 2130713641 +4268922389 2741125898 +367277096 2654870251 +3175363150 1221834274 +2495489332 2669675913 +4066588054 1717993079 +3259663847 4291940051 +1937763995 4221087809 +3400072840 2416488477 +1012965663 2812859356 +1067470211 2891580714 +4264309649 2962566480 +1970606259 2588494284 +3644188903 2520785657 +2466688106 1837498744 3971434441 +346129285 4282518106 +4188357580 3408509473 +3715679039 3826998312 +499159732 2317807961 +38505699 3236363216 +3839054240 4157784684 3634986725 +516857028 1744547768 +2769865264 369510805 +1031125158 1716628823 +1986925849 2286630494 +723650284 35214593 +1165758544 1195148279 +1606910627 1779607178 +3134890309 3937943619 +26136385 892882580 +3158427037 4169799202 +2542958490 2529520705 1997697940 +4126793280 2019090117 +3722928306 87898149 +1864920243 2946702796 +1558386914 461384643 +3376603407 3813165720 +1943213854 1934451775 +3538043818 392218177 +3201468145 1871329153 +2887421817 1456456280 2887421801 +1984334835 604917644 +4281403874 2794896637 +1390828779 2408905865 2424933295 +2006962210 3808464170 1922344323 +2071002495 3521056488 +448026290 3152312869 +1105252897 3588934134 +2204587978 2779722477 +3384376674 2795052138 3384376690 +2672010366 897315423 +1834495847 3204145257 +326210681 1011455070 +3565418704 3164179602 +3057592402 929855749 +42812385 3848395574 +3105455815 706909014 +2193135957 496591068 +4185842916 2797753065 +3603702664 944565714 +3991877092 1938937343 +1748336851 3745106988 +767758181 1863400442 +817217019 2837058098 +2280921931 1346828034 +2816728450 2868920601 +2251068252 2485909959 +2766120684 2283792919 +1341401862 1103171682 +1894372954 2752412061 +1592777802 1915676062 2857005151 +3659801144 1251000531 +284031813 2253495875 +181136678 621171393 +1799789558 1137516677 +408765699 205701681 +3867656177 999421927 +157005410 157005426 +1810725012 1443166207 +3232061339 3746097426 +3509033719 2215001460 +2557191713 309757430 +337077859 3660193395 +3868369719 802615174 +1600474824 4101702859 +63952198 1177337143 +498705760 725571109 +2559740807 3048318358 +1471331084 4144267612 +3517458072 953940238 688245867 +2619745427 1463358208 +1976104135 844715350 +1642670325 386628028 +566398371 3767650951 +703534240 2740811763 +2923886287 4082622296 +1204129559 318783782 +1936673747 1265542644 +1063016231 3848090230 +1466303889 647676742 +3205594870 1040225844 +4248238246 1133079902 +922792485 3138940986 +3512583124 382479412 +1032896837 803225498 +3735681529 3735681513 +522960556 2769888568 +2357095883 1715630389 +2945759815 2921414080 +2344810793 3609858881 +735681003 826516294 +743189125 2240465578 +3929972555 194298626 +3503346844 1421783441 +28035203 2466885735 611100220 +2708648800 1381833300 +372669836 2210898792 +2880329783 3221472782 +508360544 321481765 +1214791849 3397438764 +1412973067 2208454959 2677012308 +4290360390 882922630 3612789303 +79441840 608113173 +1607204841 146871899 +2065969410 3690538531 +1067800134 2001129505 +3340511809 338842470 +2987951988 1344297036 +1835362105 1872854696 +468486240 2193733435 +2012259131 181466610 +911157755 2040469042 +393715560 1498411197 +2981562683 4263741426 +2460329347 573202688 +4052004679 2061495516 +462616200 4032436235 +1780192727 3765231980 +350499487 2184949832 2184949854 +3886811390 3886811374 +1476817102 2076555858 +2012044737 2343212736 +2824088527 3222995794 +517508173 617232275 3689209138 +1926968246 3344508818 +909257541 2516196748 +999161260 1820743127 +1061244207 2336037969 +3501472718 3501472734 +4014391996 3959387352 +4012406525 2041794626 +2603792896 1356516883 +1971156203 1966875902 +1376093750 1191604608 +3787395440 3486020419 +1963062748 236325201 +2356158281 1568751598 +2342755524 2526005385 +3374473802 3944790651 +3341292234 1310036973 +3759444228 3294644575 +4059517871 3102455554 +1086005575 764764886 +3298051747 952711994 +1439021997 3007738180 +3377255061 2028961948 +743460777 743460793 +2879953844 4000128079 +3477610292 3477610276 +4209064049 785126619 +604860542 4254078583 +2176302713 2906708072 +2765891215 361804568 +3763136962 3675520099 +2742140530 3188641125 +2002724346 2106433750 838381615 +2737357164 630428664 +3027019939 2853009546 +1417420000 2804803602 1265278893 +2951349489 3731212144 +3951421028 192881231 +384233754 663587837 +2770709154 2770709170 +3446237148 4034030736 +3127521629 3526079860 +1910941101 1827264488 +1065783558 742656738 +2275795759 3667333095 +80263604 390976334 +465703903 465703887 +2544531496 3915065076 +4227895769 2380634248 +92548940 4212552887 +2977417246 2977417230 +3345348723 1324522312 +3557246362 4279679681 +1730273399 3620454115 +43168587 2201177199 +1227470430 2326402531 +1236272951 548111535 +628334013 1558801022 +4170667169 4170667185 +2494081734 3414480311 +3186505466 4160785309 +569427617 569427633 +2033651328 1370215301 +2142456620 859788887 +833353810 2209868051 +2649152373 3627007244 +1998734103 473199234 +868271082 2661332006 +2204870239 2519628554 +3258219508 2896109839 +3687612147 4125874330 +1479443781 516029479 +3995011546 3034350123 +270421442 565471331 +1958728452 3455659871 +1776473415 4145397440 +1617975943 1617975959 +1737803161 2821918686 +3523088682 3170174221 +3644361084 1879076391 +1707779929 2533716254 +278277202 2628431094 +817457182 3521046313 +3167665121 3719432857 +3236838321 1745352624 +998220636 99494353 +1673794564 296452703 +2256143331 2501123658 +3728110033 53759329 2696227846 +4062739232 1485293548 +3911215533 2869320516 +2961007379 3898799845 +3338564536 4203752113 +25490389 961271882 +3821098598 3652948833 +426522695 4123190099 +3393312853 3131542986 +1508802866 4157131995 +1365441409 2681334784 +1043469571 3956741052 +3587642854 2255722725 +4057155949 480024196 +945745413 945745429 +4024298679 1728284697 +1108766989 374601586 +1281179009 1281179025 +969016609 225317600 +3960632425 3238869823 +3105478740 3081735225 +2151369533 441938196 +548215361 2977977408 +1925626706 14213637 +2186915460 3073227209 +1545161097 2228142776 +1055868320 663869037 +4242419108 1725304611 +1083106131 4092582842 +1912800884 4005767321 +3193575477 2213438405 +2638150451 3173347660 +3251440362 4291309133 +1961878981 3668358412 +622685829 4065655642 +3663293748 4006013135 +3883588016 375697429 1501640536 1434530076 +1992806192 747317379 +1166878184 1697819709 +2552511154 856188453 +4134173622 2678112145 3507323265 +3020658035 3510381258 +2536297025 2870426480 +153280285 2128951988 +1658221366 3791447690 +960263778 2083413077 +4162724372 1505852777 +4061598880 3126163429 +2775226184 2288018549 +364886030 3329564346 +3117928908 1522484279 +2858875274 1513884335 +4122927231 1518036990 +1145262503 486115830 +4219492444 1191909575 +4145752485 289842128 +1991353171 4065824704 +2543023957 2216081175 +1899713197 2730411294 +190713893 190713909 +2810994709 3606790410 +2936346600 1829020203 +3352057473 3678865872 +4293387877 1057992954 +1705964331 1030278306 +3694866764 828205943 +698573371 1670801362 +4064583272 3389349291 +4058876483 468756348 +2285448568 3926037499 +820499316 3409986124 +1603021141 3198488778 +488794823 2754484032 +1970311834 2698058698 2050410621 3409803814 +3369315527 3963157824 +2616121792 956352837 +3394545626 1564752939 +1897464645 1331701132 +3992893806 368961583 +427462765 1440994907 +2304996346 1099928203 +1355421243 1659977983 +1693332325 1207625722 +354396434 354396418 +1218508599 3045132285 +2379407828 2379407812 +1758944097 1758944113 +464126327 60837446 +2537717879 1666284827 +1243517920 155810762 +2999631019 3132508355 +3582374000 2457243150 +1208349776 679525569 +4223324403 974581402 +525498064 517015925 +1654404688 1654404672 +3924186144 1435922021 +2204133412 4106481855 +1230884426 3366698619 +1708107108 1708107124 +2343329141 2250642790 +3763460661 3763460645 +1524905782 1262676497 +2319187051 154229959 +3259077906 3745360723 +739621186 2821890805 +845853429 2940035038 +1013940133 1692005597 +656487622 1598428065 +415864744 1631931348 2908339581 +3209078560 3209078576 +707256849 1841881296 +2658020973 3564311940 +1910804430 965070674 +622280647 714696278 +906744346 1662877889 +2067048425 2067048441 +2456320608 3665339699 +1048252674 3180919806 +3853057742 1460215375 +3039773958 3039773974 +781522682 368346295 +2869848266 3790773850 +1737245934 4023419577 +3926750647 532403177 +223782513 1617423008 223782497 +388248920 1072086300 +3652899316 196063124 +2866696872 993673508 +3932091195 779675122 +3419809642 1277168583 +2891064097 1716342006 +627853625 578241704 +1931423311 2833550791 2808455873 +3924731507 3048212250 +3071480085 392114729 +3213294081 3995382335 +2751156558 1923153350 +417682663 1867768036 +1411528614 2761410466 +440687582 440687566 +3815475077 2269533786 +2710499228 1645754964 +2756672339 1426059949 4229899194 2079000132 +1622098489 1826963390 +3753162222 393897391 +1977313245 1701085410 +2428384614 2537720486 +1691344168 1114077584 +2650501206 147969905 +2321278295 631900144 +2527587364 1301667598 +2160799519 1564296043 +3160836748 560732791 +2908217742 1868042895 +3475308720 3342865667 +3962392298 3439648069 +727836875 371292034 +2545535638 2683016469 +4193539886 2846178662 +2248296388 2980762287 +1003005855 1003005839 +1028254073 679899486 +2409396363 246789048 +1329264880 1329264864 +2117839360 3085737491 +1600190829 1904097234 +2942669708 2833728865 +2000380019 2000380003 +886691499 3723292468 +3008925275 2942835012 +967634788 80977764 +2152225838 88349300 +2502761029 462332029 +1270786337 1579433718 1579433696 +4071106638 2479471577 +584961233 3022613766 +3791431184 3303259695 +2242428319 128090462 +1878125613 1531737687 +1982750078 2298293577 +1398355000 1835873339 +490110884 2697654079 +2248035616 2248035632 257124723 +2972106087 1190930720 2972106103 +1622407193 389984510 +3215242028 55078976 +1025045583 2101909592 +847623888 847623872 +1235972081 2475411606 +2207509675 3184239390 +4272204501 2990075228 +876585917 312226484 +2782826376 1824503476 +3129211175 1845442067 +921557304 500138170 +1018572717 3251370002 +836295416 3066928171 +2437421406 1397193167 +1648501060 4061814303 +574043516 235974700 +378975092 2822557603 +2037575495 96077095 +2884040299 2884040315 +1521328259 4241931751 +1408230077 3751931796 +392226789 1148593106 +3197050217 814292697 +1778660306 3063780243 +1519599176 3653288988 +2654253646 4264711630 +1442487784 1099338795 +4001204452 2407649051 +1824083755 2677395558 +4072731554 3351218179 +955818596 325559167 +4254906690 2142741219 +3006762712 3006762696 +1271559738 2310544733 +1041040049 4110448982 +1358890903 2160144521 +3096206207 3825606021 +861047182 1492028047 +625949588 4236872405 +551761331 2024638682 +3759026040 777304557 +680472774 2674509729 +3600792345 4134766664 +3362032861 1397342196 +856899463 2738445459 +1951417910 1348372241 +2068975483 833692767 +3173142379 671286644 +1257017479 2036827286 +643736991 2358653451 +3891245798 3948807217 +3289636658 3712506803 +1770766119 1308486262 +3808106880 3511231635 +4096386191 439934156 3975335192 +3461641087 1477045133 +1428776277 1697285322 +906528397 906528413 +2671828461 540536900 +2191766453 1555293692 +203131347 1608190990 +3503413826 4233795061 +1107921149 4060259906 +2469076792 3571583979 2469076776 +2404535494 65265937 +2827875478 3984066599 3984066609 +2165109128 2942318859 +4166808603 344639122 +2774428762 2913243581 +1908299805 732214690 +3958420520 3638885443 +2809117963 2177945039 +1822695512 1522078585 +2230990325 1256386730 +2238371090 422406995 +3364524657 948039446 +3559388603 712727773 +3643467771 3649777714 +2431333223 896022300 +4006925786 3349996776 1026316604 +540829667 2719451740 +4129523642 871279069 +2965338686 1966394524 +2393276322 3814820011 +1756882882 811892189 2330785768 +2298455820 323312454 +261864056 170298084 +2623688887 1975057641 +3794618230 408278346 +128611563 786645773 +3404827248 3929861717 +1668710660 2542606687 +230036451 2023837269 +3311562535 1000591724 4294536368 3185690572 +74255212 1672018711 +1168229370 1202880725 +3212565178 704205515 +2725957620 2725957604 +3270675588 2864329514 2250448654 1098850327 1226385621 1842504610 +4054571827 2760511820 +261328409 2655564104 +1832218566 2971595959 +4012987045 3135733706 +4244025533 4116199810 +2118004328 571740627 +6917875 2569799820 +878673128 1515299115 +984931410 651259117 +3032991032 3464197924 +639252446 2424179158 +4181352483 1722706845 +4149901350 2305500097 +3355822056 3497235971 +3035152980 3649841986 +4209735131 2440280478 +3187310506 3143039117 +4283359860 1563327632 +3578729312 3578729328 +2584537495 424917168 +2077152073 2077152089 +1859928586 1034740017 343200302 +1943558364 965993031 +900426508 2295956471 +302359944 4215628940 +1238619206 2878688605 +544681957 10511724 +3785687220 3938458457 +524516706 2150833277 +1266976937 2325946894 +41361089 2726652374 2726652352 +3541006210 3277398453 +971986908 264720199 +3908065733 2002604300 +2827407416 1408638660 +4028081235 2363081380 +3065746223 3065746239 +3962230895 913487544 +576124891 2677806053 3924307396 +3014001681 3747112656 +3943623983 1750793703 775795382 +4013842799 316855468 +1645196427 3921229524 2630511477 +1191394669 924431003 +1086248945 930327277 +538029314 2111003189 +2254481255 3437176657 +4236639301 3421249690 +2266778182 4032931321 +1047249774 3576798191 +2011246224 1034731755 +107080961 107080977 +3320924051 2419617280 +3942099387 2129510504 +1388938808 2336115259 +2870076126 1865408767 +1149449956 3197069567 +2759974985 1098126072 +654263991 450646534 +3218757296 2419947037 +1905677027 2498638288 +1324111788 3926787031 +2254039752 2136253411 +2035374976 2064845445 +2990273672 2990273688 +1817860654 147405170 +1084451801 2588067486 +300350890 3501514598 +3123893110 2483217095 3347775318 182049098 +467296364 1153812993 +1759200627 118002533 +106253663 1464388737 +617975795 4013005708 +485528577 485528593 +1949287957 4231320330 +210782894 1495373103 +3493412493 358863346 +2427610578 1381356141 +346325714 1358557331 +1991698168 3656226939 +417810460 417810444 +659743727 3732757306 +1594986215 2409887136 +2243413206 1447746801 +3819351635 2992925882 +2013269219 217021382 +1389672821 3655332668 +105085020 2129532680 +620953204 3082195087 +4064869575 2698962270 +3465900363 4208933496 +891249190 411937173 +631320155 2545678674 +2219695269 3952236460 +3092759504 2697926085 +3085842184 2583587381 +297008207 3131973848 +2227227721 3321927864 2530384351 3321927854 +3579330807 1181439143 +321272338 925723205 +548679233 3848158712 +202623475 4129745292 +3107033210 50753547 +1531340560 1531340544 +1342497724 1470725356 +3383324545 2986051463 +1346186284 2085390679 +1684443232 1956577069 +3893229758 866606498 +407690115 3288174378 +3419318310 4233278423 +399197135 3336191281 +3537728384 1922880147 +2143369605 1537471419 +3035592392 2633497803 +2153115293 2153115277 +4003840721 3948724488 +1236220989 1004262420 +59028495 3643465713 +4225462402 178459786 +3573332059 3379638192 +1480119563 2548869771 +1963294365 3822172309 3567669538 +2931282773 3773242099 +2673486370 4243608451 +1008660379 367847717 +558473355 4058495682 +604473533 1960591746 +1951913869 3007861476 +3313373148 3707460291 +250902509 2010696196 +4172504150 4181581013 +1014802642 2990099821 +4209221018 1890254118 +2016018115 3978038517 +1293504041 2278951566 +1515973477 1053682280 +1695996730 2533783702 +1347634346 487921549 +3185739203 3473708954 +2945625266 2239788250 3883757425 +1773857396 3471911403 +4264926865 518306116 +4231031997 3174772098 +3398373821 2620976258 +2239000406 1816872039 +1355139843 710841788 +83325372 1301139343 1176109770 +84881769 1609222232 +3406415422 3036144479 +4031528232 1879328253 +2895608450 1391199864 +4254484021 1754301802 +3012605299 533570586 +1018749168 1776724555 +1712210498 3933359605 +1817638364 1905109639 +1924609541 2607417818 +995580746 3028596077 +2925513026 3268006627 +2973645038 4076052153 +2001113903 4078547704 +3118739785 3946419704 +1488488080 981193909 +3904356810 591794427 +1377476293 82309132 +756128024 2527153803 +2696911403 949989794 +2326370025 2002392133 +2827118704 3038918543 +3956589774 233951315 +1669204983 1214160378 +1503322029 1491993010 +4215776053 3334859882 +634888199 2428630848 +1162160916 1162160900 +3266430838 2208781236 +4066073030 1271812769 +3492997102 1968283298 +2775912922 1363876395 +1602634189 4147060500 +3132513412 3404387705 3903720808 1897112543 +1615474493 3519569154 +1723857680 3493345827 +2583507433 1385533912 +2127229947 3866735807 2491290660 +1777173343 1551682093 +3519459761 3972643248 +941271800 1241195643 +915158917 1673225804 +3127667795 3417212602 +3407162230 1126227641 +1502247886 534436138 +2259348560 1851331755 +570657815 2727708720 +1331873633 1501552032 +2556245720 2556245704 +427760547 3323494812 +2132901818 190906126 +574681692 2312846097 +2538020843 267861730 +3702021768 1201319308 +874884157 3103960866 +3319641906 1374768850 +608571265 2351028913 2605344790 +4058932076 1179026199 +4250613453 1174280683 +2779934714 3521529483 +1641524550 1884423381 +2427813107 2427813091 +4287025118 2786530814 523844223 +1930851 2439077340 +3115864893 2586511618 +1993746531 1981912010 +3198763494 451458370 +1077162534 942338519 +4003573824 3553612301 +2417871076 3538114575 2417871092 +2099914712 3780950285 +1489090641 854407158 167061382 +811193281 2475422610 +3384465949 2921683874 +1039448127 3342732072 +2581691685 107605596 +306066338 306066354 +2220038962 2154821325 +2216785638 3870174231 +1558395431 2620876836 +848332533 2391045034 +1009906944 3265572613 +3969136440 2773675323 +2995869516 1724673207 +3421976428 3496099589 +578431903 1227072092 +2345980096 3758399059 +522646740 3730008495 +4061509283 1668039453 +3055240175 2615931192 +675147974 528615329 +634753727 1312162472 +2916099933 4222482274 +2296076136 3645544637 +22167792 75250115 +2001359718 805390743 +86565000 86565016 +740701479 4051125843 +1762945645 3626207634 +3168653644 407966131 +2188669116 2188669100 +2370248766 2370248750 +940185898 3715929589 +2543709629 1788690562 +3298570621 3298570605 +482514263 2527637204 +127956826 1536942781 +3715797777 3715797761 +2562393347 1075739300 +3529437778 2517660397 +2348997120 2249160744 +3656755053 2327220356 +1182646995 1182646979 +927175483 979420658 +4058319370 3582905787 +557978302 557978286 +4215457838 1260785337 +1705166817 3762333472 +1465135813 2215800153 +2198025808 2383314915 +1489998837 3284527786 +3740679314 2409716179 +954657519 2189678136 +4018278058 1862654144 +1684626233 1350607022 +2122973748 1762636011 +1192594208 115999589 +1641220973 4074478021 1815805074 +3048753954 1108288167 +4293298791 4293298807 +1514500613 3151765034 +942289882 942289866 +2917323416 1410434381 +2136780926 1858496714 +1491394970 320307258 +2999436696 2622124112 +3092250487 1551660532 +798138749 806602357 +2140706689 2207972973 +3794983767 2668717268 +602950318 3152031474 +2157256266 53259173 +765491482 3986596843 +3858890152 3173142379 +1442665772 2311918657 +2758873206 2758873190 +4266423326 1884998441 +609352780 1590449967 +3894746950 2410493841 +620260595 638812826 +4193229308 1882154919 +3861606075 3171650920 +1740064031 1686228936 +1722420116 833632761 +3575234043 3454059031 +3112121762 687877821 +4032711653 1348668679 396507932 +160547481 160547465 +1226852359 4120828164 +1573294191 244670126 +1715476616 2129042973 +4264336103 121100713 +179331003 2393289586 +160153705 1879041351 +2155546141 1588240290 +4128891545 62895838 +2853285765 1054297676 +1008241159 2711701782 2711701760 +2433575953 1763778256 +3115227044 4057511743 +3898607001 2375570308 +3822405262 3157632025 +2052585735 2675770902 +1645716613 2183386300 +3178514673 789500784 +3217424598 3132313841 +624608760 2475009389 +1329483668 1394034169 +2913847036 1687174833 1224880 +286303034 3902328562 +2653741484 2896642505 +1506546652 3806525585 1665460872 +1191006314 717592269 +1810588065 1743172195 475253200 +3404165660 2253955601 +3240771855 612657816 +3100869058 1729800138 +3714198604 871915127 +3836462235 1513428384 811302924 +411351237 4178027260 +2837425486 1048048594 +2423880068 603997705 +2264514567 2183744278 +2098844753 1084832656 +455116588 3761556033 +3606869955 846235626 +1970059110 1076147585 +2139187584 3495644507 +615528185 1835743944 +404376992 2439525107 +2545306487 2545306471 +1220742387 4010938243 +358671382 3179744935 +3692220064 3049830928 3779277625 2741965469 +704989950 704989934 +2474267473 2635333051 +3582370746 4262758845 +687086235 323346962 +631920608 2508116653 +2769886128 2525402627 +3075817918 1496743455 1496743433 +2909832934 3995360279 +3278007291 407360978 3076313500 2098672621 3265735716 1513660001 1492929946 2429307219 234874472 +114518914 2918647709 +3380704485 466289772 +1631141324 3642509367 +2665782396 2665782380 +3841553863 1001678934 +1132703889 3645830214 +764710718 3830510882 +27196746 1652499109 +4172788067 2779182160 +2389681285 3200253274 +2276455704 3967747819 +2754788382 2581472063 +802489940 2690184751 +986185677 1440198578 +779331860 3854474048 +2850896267 2904919973 +1921365865 1921365881 +4058471879 2520293462 +3062896598 2999633917 +4151354641 2538854864 +2096951042 4104713995 +1463996137 3620990030 +729098990 1467126969 +3456425333 3332939562 +3873708128 472198888 +2323594710 3184803846 +194962413 194962429 +3095048823 3760648528 +2660175944 201327988 +2689146458 740839971 +2559446708 3684771151 +2746190176 2538049347 +2694137343 1637036970 +3819935758 1298985540 +2301132833 3236565328 +4196613258 1333284155 +1396057271 654130563 +1176091968 1176091984 +2512106333 221305666 +4025097150 1804184585 +3090913084 2927707112 +3678539418 3271359613 +1109061911 661227302 +3541907971 1510101674 +878122929 370822054 +1890277401 1992011614 +1368138293 2493110634 +2569532106 3605139398 +1841830042 2663024849 774899746 +103142981 3386488615 1932246140 +2218330917 1254918956 +1173492930 3837015426 +3323566021 3680311805 +3686118809 2014109662 +3318985687 1412903234 +1673355259 2955605317 +2682125158 2141636354 +1775610372 2673517641 +392705371 873201220 +1051783773 2110072058 +3282446540 87027424 +638177798 3883245431 +3752009396 1609649385 +3827836021 3562797432 +3543490319 3543490335 +4064435401 1271356535 +249672006 1956190609 +3874693552 2537739 +574642080 2336878835 +203700795 1476897522 +3385300684 1899127607 +1510339918 90253785 +894571950 22796335 +3554627356 3554627340 +2440247104 945813957 +3510702374 2406350529 +582478659 3934739068 +102271808 4045729253 +3766203279 4055607822 +4139911492 3077871135 +3721959355 714825320 +1749485557 1734829523 +1709365101 1813357403 +3402689084 2195766375 +654783714 1743545929 +3537476624 3435178621 +2607973392 1717178485 +3298494861 219154660 +4217806689 3967969603 +2520477010 4134139560 +634730017 1971384902 +3235469404 2234750864 +2279902092 2279902108 +3268644153 3959902398 +3228177831 2382370272 +861530345 3213469390 +736316456 3755299924 +3667771438 2452643798 +2190231886 3503777231 +910521796 2072311330 +1015146261 1434371594 +2238948151 1134829492 +3985744384 1241954872 +2918843441 294951206 +24659706 1247263627 +2396654249 2319370264 +2063758224 886827939 3946057195 +3886608016 3357180139 +2779212192 2361202200 +1139484381 45234882 +3626266921 1826364052 +4175156316 588639495 504319175 588639504 +2823670536 4202077597 +2553030391 2223068880 +304382592 259616659 +4264011502 4264011518 +2311456396 3010421409 +1992665182 4228165628 +2772034813 3084485640 +1353592385 4096534244 +4163061903 780876046 +3398686722 2224588811 +2785812170 789870587 +3160943782 3998053351 +4246302661 873132812 +386290899 301434938 +203154852 3828594643 +115296442 2186218774 +1760449065 1479235224 +1491884116 2019083205 +2599448592 1730518652 +3941927471 116194284 4229346009 2652598437 1548289530 +3804053848 1206771085 +1359639517 2964507057 +1068383554 367912476 +3962590242 1333847714 463383022 2569974059 +3058746298 1541068927 +1977505524 2164449817 +1190660374 3463859633 2872851937 +537626580 1176949423 +4148795388 345336231 +1510466369 4218077014 +3010357446 1020194721 +2630668845 965058194 +3634199044 65475657 +622168662 2977977421 1466876193 +313137391 1355104312 +3584165086 3632386815 +329134856 3926545821 +4203582019 1229643091 +464598907 2216059944 +1547329771 1547329787 +196550108 1296302407 +1247883605 1811982556 +869125214 2916551275 +269304410 269304394 +113251072 2690509061 +447965358 3060648431 +3882896522 3754458413 +1362289464 186364219 +256382929 3749543440 +1337560045 4257221280 +3005597264 1417097187 +2736859382 3274931022 +279522837 1569780019 +2519869852 2517144972 +2346590986 951134395 4192411250 +1797202337 3646035668 +82744519 82744535 +521477654 71195825 +4115011258 3612722909 +934452505 3341635144 +1953892540 1651219825 +875086770 3261010765 +3291819972 2746888585 +4099612265 342941518 +2944501774 1458122265 +4246168465 4241603910 +2458837357 602726020 +2545814523 3677150244 +2508720075 4040606848 +2865653787 4260225682 +1044068627 171628780 +4026608778 4026608794 +1847134179 2310328541 +76025377 1127103968 +3189338176 3847203561 +1595427954 592035054 +3229817737 2539935928 +1991177327 2011351194 +3008311053 1386680690 +1176473285 2246960566 +3914471631 456986062 +2000622120 3762918653 +353609907 3722146115 +3888386548 3450356505 +1799355908 2565199126 2597750888 +2917904440 33974317 +1990291828 2445732372 2955987935 +2724537133 3382241913 +296588786 3326282725 +4106182863 1084603441 +1967693385 3931188462 +990791387 2368473134 +837226883 297832764 +157902162 170368507 +1552779740 2395997521 +3504135698 3719403077 +1941195402 2932954925 +2360518231 3670218357 +1724816523 1648389844 +4285463771 4139257028 +4127230076 2839224580 2637893169 +2410246375 247249846 +1959928843 7606667 +2032821698 2233024676 +3964483308 736747896 +2561562117 1601268172 +601020696 2095825115 +2190610001 3706489231 +107459083 540886850 +732014755 2536356662 +301465832 100071171 +547895357 2781906964 +3411838770 106852976 +3136192652 3514063991 +349377357 2106152128 +1905552500 1084668559 +2710728548 3179633257 +244670142 3005490441 +4275514815 3955033000 +1413192745 1177590680 +1591486668 3283092477 3039705303 +821299567 54917503 +3255967246 2424655887 +3205856394 1490226477 +621545642 2347725460 +87485352 270839008 +2786165987 1351889226 +55244870 1963251255 +3384378053 1676836074 +2404085945 337341086 +3038855695 844823950 +960486816 3213484787 +2600274553 1968667774 3105120751 +2617663562 3892941933 +3591742452 4161870095 +1715073536 1715073552 +4284339117 3300277252 +3202817167 349304078 +2607408848 2008439157 +4104835695 2548647086 +1525667333 747497946 +3683525307 1189297014 +841506987 2693803316 +3462904064 3980933907 +3624442433 2609664404 +3842195295 4247270745 +2514445687 1705818694 +3319546925 2797556420 +1360353488 1956302709 +266385455 1036127038 +2115113731 2037640636 +2375377896 2092075959 +1603424002 1603424018 +484720425 2756668824 +800150217 3710210670 +3918135734 1514189191 +2588089317 3164924268 +2586187054 3896115436 +3596253600 3243387500 +727561582 4052749514 +1026436358 2306659088 +2405826589 3667013044 +116825199 1698185902 +563511138 120778346 +4233181714 1344364731 +1914541129 3985665784 +1063035241 668080206 +4152583253 3505231347 +2515253609 1796530264 +1209448402 1304649619 +4032925493 2660528252 +218023513 2226637097 +3455860972 807023489 +2679299650 2828263925 +1083999027 2988319414 +2507332987 3201476772 +1673635423 509116107 +1937101113 2625240841 +1849009111 1433463654 +1742136517 1011491354 45330173 +1712910840 2974083451 +3960143731 139469338 +999773593 4094626408 +3988509988 425078046 +191506006 1517993249 +811761567 3389974366 +340896155 2559079240 +1205358357 780434954 +7390432 2441473189 +3498612286 2231665567 +1161941590 1553866097 +3653749958 2782839537 +1822216555 3421823324 +3013363223 363703700 +1216589353 1679451775 +2401606162 1781631557 +1579655613 3520030462 +2430097673 227813688 +198783751 2917880832 +1412471721 830802695 +1384196377 4199789150 +132826559 33954172 +1679068207 2771227367 +621674907 4027352836 +3213767644 1759224647 +2619617763 1667541190 +3215544881 3901514544 +1062866921 2747730904 +3242915598 2993582622 +2822861341 1618188308 +1459483010 3745775005 +1677204973 2782803073 +2440346877 2440346861 +3189343923 4113501146 +1819887496 3148525395 +2096053270 3264976551 +1528141298 1425738739 +3951215673 866323759 +3099961789 2131659049 +863419300 2817090367 +3222031497 1998448588 +3987423398 3398878529 +3581573409 818720480 +3578748619 2532456852 +2704173857 3708986614 +2358134924 3491849798 3627256183 +3209807477 1460150298 +3819189041 2356975152 +1579187892 3777459535 +3936610548 1478934819 1409792016 +993259045 1472193580 +1861555638 1641098631 2202708886 +1508168602 490281853 +277130563 1138540668 +3316157998 1448596089 +3331075995 2724555103 699330820 1704651767 +562592404 1574500089 +3044353887 107805342 +1872496654 553155197 +2374175287 4232647824 +1570075607 692411248 +2432048679 514763539 +3119125760 33860392 +3893401722 3424651293 +1948424271 2511389031 205550902 +1485180598 285812881 +4087940876 1355257655 +1713212503 394521840 +3914145729 90766528 +2721854191 1405365806 +1988828381 525264209 +1846392211 3532969580 +2382386905 1669904286 +4277165060 1482742367 +1087605613 2047114386 +1159860188 4040149174 +11054582 678179307 +3413587412 1671312384 +2745407407 1233635438 +3784907670 318076742 +2627118520 2839604160 +467252796 330948717 +4169888833 18594718 +2758710461 282636735 +2079775503 2079775519 +2602853947 1967976173 +4069063925 3265672618 +1618603315 317744972 +144137674 1346938107 +2739272505 2739272489 +1794920930 1295312597 +2048933474 2730636362 +3100462879 3609735644 +2051860017 961575855 +3924186153 1586920590 +1625041918 3216755401 +2723113597 303828 +2827738062 573244761 +2316217801 1607901079 +115645376 2581671763 +978936277 2947875420 +3752036531 1268669908 +2897228712 2170638699 +1199713565 2934768820 +1434383646 2639208306 +3217757151 3417327636 +3715458325 3033407498 +4217952627 237237324 +3991929196 4241636609 +1609777121 3974991648 +3541814189 1542464095 +233778832 2139507900 +299744655 3554380763 +480988297 2863233976 +3672204757 472001866 +4211755717 4130583578 +3239013643 140573742 +2401844990 1542334934 +1430826195 342364218 +3818248408 2289887332 +1869131692 3472961472 2046820545 +3242858165 4238458620 +604281074 1250388727 +1237689114 1008714219 +1107643498 1107643514 +1933285559 500262918 +3267463654 2091652375 +1622957454 3599189647 +1905483922 1560348114 +3448122519 557330854 +3495506161 3983018864 +1768135098 1768135082 +4064685338 58384099 +667788738 536941036 +681040390 3977000801 +2259918680 759976691 +1950195677 1785108561 +1119598478 265925778 +2948710819 579107869 +3770331114 2950884699 +4206814006 4034899473 +3236664391 517452327 +3475877041 1617572694 +132390419 2132498426 2132498412 +2291699027 1529248172 +2704490098 2704490082 +891944120 1763235245 +2271567981 2442578834 +2672382851 1131312938 +334155758 1218794415 +772713846 3332073815 +841506995 655031350 +227325350 2979243239 +4188355715 2183021109 +1533371696 278809237 +4031129255 3849246944 +173166958 2078551226 +2307097860 2114610527 +1318591710 3772880906 +2754399587 3582415580 +806799914 3484633318 +835101631 2969577340 +762491956 1590193932 +2017634557 1307575892 +1245142846 321580703 +3957042012 2798567889 +912449061 2712975197 +2279422746 1998298339 +289655648 2377721907 +2579001924 3970122041 +1269899114 767205630 +1625129000 3783065052 +1979226145 4172819085 +1044853034 334834053 +1922405596 3146317738 +4039791512 2793510980 +1047076362 2429824270 +3563597378 692811085 +563209828 3999998552 +3573853887 3573853871 +3172782864 3294642723 +714933628 2435818033 +2700550334 1165165023 +2995523589 3625906806 +2736469955 2262353908 +2323738184 1371577181 +4236315874 1629964227 +736845504 1102548083 +1859265811 2278579436 +3724871798 3127928559 +849514807 3974797702 +1958960803 1921907338 +1170376477 3357717393 +1787747287 3280616982 +2902877033 1657853134 +2992279326 3654065399 +3233592231 860967047 +2413028525 395377746 +687675984 2398748077 +888278264 6654355 +476870657 1857007834 +77769338 4264022071 +3962559354 1230405899 +51877696 505616837 +2858420535 3711301044 +2607538525 131319156 +3055953794 2088641437 +3660873428 866159210 +4149805689 1229892324 +3666092834 3895760939 +1715235661 1042082340 +4057184836 4098767104 +1287144042 806391003 +2464283272 3250414621 +2648558733 287900132 +2668618961 923088134 +884021538 1038188074 348819587 +3119395007 1895218366 +3136513609 2519336174 +674726643 3507424909 +355528710 3431028305 +592260966 2389343074 +1087430930 2350047149 +2412744645 683627276 +29132369 214397318 +1103520856 3813668493 +16214862 1643012206 285763125 +533630398 533630382 +3509390779 82615666 +3046416127 3623242600 +2103758344 2103758360 +520037930 4121498651 +1497297015 3166111043 +110606999 4158307238 +3805485725 2941445419 +2390240051 2049704268 +2896070910 2896070894 +3831743811 3094600486 +515234737 155768742 +4113323116 1564611479 +247060035 1004196912 +1285500915 2442689420 +2013721778 2767402042 +575610950 1902223494 +2459783297 1739569166 +1679855467 2884716553 +2569432519 3732852800 +1335956451 1032998474 +2787210187 1370048642 +3283912852 663914495 +2079780373 2580267301 +2756121336 2481118317 +3031612375 1281209200 +3302011885 3541465483 +3466125302 4241187821 +2419940173 2252807346 +2420458972 1617722000 +1124714270 790822718 +883670443 2505806882 +3641968775 2874527108 +56367169 2331651648 +3402421648 4290639243 +1578065922 338961187 +4229128812 1790103959 +2393099151 3248959580 +2208003038 196568681 +3313912172 2800329588 +2071215634 4139198724 +4205381787 4285663093 +1736826147 2035325793 814769670 +2904793093 2484398042 +1280556171 1414043567 3000094420 +3587642069 1989322076 +1708991637 4028667548 +3765804843 2217316532 +4119655670 2196086606 +2061407104 1890174284 4244844959 276955954 +3390007636 1782763311 +3349714247 2506292950 +2872290770 1638686905 +3818580146 3731637776 3069915089 +2684290357 326447740 +1573541698 3884408053 +1099351377 385034782 +3198938658 3198938674 +968396879 747318360 +430875081 921218936 +3651752206 3747725930 +3780619338 76671046 +1984537200 2783622748 +1743554852 3176915903 +3701410382 1338343853 +1722816997 1317967461 +2187367486 2610331839 +142714217 3440862286 +668202865 598640368 +2640676663 2640676647 +1330225731 490781633 3591208998 +2754104289 1282372384 +2760031209 3805138894 +2972738799 3727615032 +1822561416 2334544395 +3022087823 3467718348 +916095329 916095345 +3861115466 1674158002 +1776235218 2086469779 +603171402 3285055435 +2769025750 4220021028 +58819774 1809712606 +716883889 4110965680 +1185413582 1185413598 +3825893353 3850853326 +3263688170 636884050 +3692029417 3106029556 +2342287352 3209747309 +1917179344 3018823267 +1043607621 2246256044 +174612498 1951349829 +2531065951 3706164616 +2076286596 3657230200 +742454367 721333451 +924138754 2495841166 +2426926524 3773209420 +2439043200 1007336882 +1199286523 3610636712 +2612667932 1107951111 +1472116328 533258064 +3731313040 2896520629 +2738925030 1295185703 +3956843369 3649901784 +379023177 3601685215 +2097674498 2487278949 +3037426559 3037426543 +4070529205 2782438634 +2205317157 305340972 +600844783 3012977633 +385716131 3559464330 +3807793449 2121968999 +1239559945 1477446456 +231223310 2266917273 +3135978911 592726539 +2381299299 3546854876 +719816761 2481526709 +2023385715 1310036748 +1787294028 2723687265 +4027032205 1761928178 +575988672 3416426323 +2683156433 2486722054 +2713073842 554258056 +1603036919 1627788998 +681304029 3395381492 +3892629003 1250974530 +3730108043 748296623 +813938864 813938848 +1034179860 498200185 +3307421619 3013188301 +398752728 1112470797 +2182079783 2182079799 +4055916041 2597586990 +1458116515 522478727 +3115801310 967052137 +126827338 3264512613 813323634 +4097480984 3554054043 +7237625 2811927518 +25329062 107727937 +2655812925 2655812909 +1163787925 1426744620 +3754151332 3845962047 +1261754703 3641966117 +798241265 1349999232 +2767558359 3973042476 +944244684 1701070391 +3672203668 3672203652 +3045667409 1155678688 402273680 +2478490333 1811988962 +3908780627 630588145 642762454 +515244463 3349380561 +3655053153 3564187014 +592102626 2232399569 +3684633933 140636196 +2184094292 1130990137 +4112124309 476637242 +3180794206 1525108990 +236153303 2483712335 +2515362676 2025033615 +1663671773 4152591074 +3778988229 418919165 +3873046314 2469179149 +1985956489 3775026616 +329532812 2812098976 2006547297 +1664687293 4024974740 +748661192 2954644592 +1348088460 167613025 +802910487 802910471 +4060735110 2341856510 +2910149837 905361970 +3305388658 3305388642 +2550881979 1246035304 +170499858 293955909 +691128422 74410906 +3210545057 3765633632 +4038292628 1441584492 +2760552826 292219458 +2545251241 829881605 +750809878 1022603669 +1718828534 1030392391 +1871207809 1871207825 +3234784514 2276622901 +486787656 1395347952 +1392973141 153523402 +2773271262 3894475181 +81992203 1370597365 +3329823090 635205389 +3413522662 823890455 +3693501189 3693501205 +2088063229 598788158 +1314603842 4043310429 +2943113903 1090949114 +2827406802 570718829 +3446334441 2112687585 +4159584941 4177944132 +1262611325 2301282394 +3500018479 3984913530 +612834655 845326945 3753065630 +1596760044 1596760060 +2192000857 106254600 +3772608477 3650558196 +2901372023 3018309456 +2652687389 72700340 +2627742643 1126484684 +2933579057 1938437158 +3404167939 1835443644 +3708019382 2736645255 +1684876215 3020561443 3470512400 +761884450 761884466 +3329074835 4053612922 +459496521 1718241016 +1290475265 883003274 3403740918 829051606 1525069017 832034129 369566039 +1176122108 2812140456 +1287490960 1583733180 +3360779030 1848349607 +278912528 1001034549 +4220747330 1059993675 +3521029119 1266074026 +2952491347 2952491331 +281261131 3990460597 +3998099544 3998099528 +1981695151 2695241592 +1571152209 3173102214 +324478212 324478228 +2871299511 562763526 +1302797801 1386107726 3046486445 +3939414544 3009564469 +2132616748 3587777185 +2371574786 2295453493 +2621582244 3777824292 +1334782371 3781069724 +763207415 2478915270 +2740337885 957233948 957233931 +1959347575 1048900303 +363285223 4250593696 +559053593 3248242895 +2847821848 2255114675 +2956926464 698867191 +3601101889 635634240 +2776903211 3121917364 +774857870 2596818969 +1961718324 1170917327 +4186023980 4078681431 +26690349 2929356225 +3885023514 2732588029 +617396826 1987792437 +2549404302 3295114649 +2872236895 1475301201 +2333031801 1644021118 +1730650445 3787053326 +1739768069 1130748620 +716350575 2788743864 +2973645024 3841165491 +2222917087 2222917071 +1406592226 3712634819 +4083933834 3168116539 +3316031017 3316031033 +603922778 2933613558 +1664645239 3466855893 +2172030661 2460139539 +272195490 743541763 +3840637562 3635531275 719805250 +1007355272 223982859 +2690166295 2690166279 +688639753 607692831 +766233564 3612700816 +2862700323 3204197404 +1881202378 1881202394 +843604378 3127338851 +2584688058 1072796619 +857985753 3504336948 +1605402179 4124499130 +2250985200 640500693 +2648268026 2648268010 +250257148 2432125104 +1988579664 3875864821 +1894417172 3618927380 +3312121906 1284217805 +4064231685 662209068 +2659318895 4120928942 +4162003466 2417923515 +1493371085 3972455090 3309976187 +1447716773 2082547884 +2820839667 2708915866 +3873853307 4153351844 +755214354 4005663827 +2150264865 4079157478 +1224834002 3210079109 +4136852789 1593555562 +672979513 1584105384 +158157972 2256204363 +2265619692 2176124801 +1630843462 1274324001 +21882997 3194268499 +3445783464 469682749 3233044785 +253806060 3164050049 +2012353699 1964407946 +2783493245 2858465474 +856895437 875839396 +4186311530 2935115006 +2118666177 1985572080 +928743199 1141448136 +3470512396 2953450977 +2247180314 4106742013 +2490497045 1008908986 +2124103233 249136998 1299838077 +1390472437 1830094268 +379333186 3484730461 +281055682 4053161447 +184559068 2245155463 +843087932 843087916 +3537695944 1742192117 +2368668864 17070675 +881996075 3978520244 +1856894608 3420136611 +1726330193 541195489 +944562015 3715664732 +3913001784 3296850387 +2751076495 1901668079 +3023869581 3803376100 +507209150 3291303074 +2866879935 2359618011 3531298775 +2853955411 827682164 +3418787791 2559861464 +1298217925 2500925210 +2641276571 1883037188 +873209579 1116385550 +289427055 2537257144 +3821826005 4143955177 +2118594481 2064651174 +1651848314 2021760029 +3967599272 4033244788 +1531356971 3677956258 +2245493502 1489882633 +4170672779 2950688565 +1312306757 1736273562 +298047681 3092133846 +27234603 1022823768 +4091390255 351360248 +2315978269 1817878434 +3181650010 3814649277 +1425342462 1796007442 +1992389769 687086329 2072671150 +1576140038 3924906110 +3735184896 3735184912 +778007397 1698867194 +2927391654 1407848001 +2384566105 3207940137 2986868288 2263372260 +248587060 2268752601 +3153021120 877682331 +130323937 3422991223 +2719649746 1846742139 +1500612695 3224918484 +1366536043 2753373556 +2223153490 3953390611 +2235950532 2433266569 +3319740680 2607569084 2254882699 +2747422380 2747422396 +261683438 2077220537 +64296873 64296889 +659483353 3182154250 +3282531097 429535304 +1923134143 838427304 +327860763 3731853444 +3253026672 1799032444 +2574765168 2574765152 +4221338363 308424996 +2076718477 1764510962 +1804398535 11541637 +3863730784 3915957541 +4106701649 468740300 +4244968532 2734620729 +681338201 681338185 1194560286 +2479668468 926975758 +744285813 1262406186 +2370583434 951593714 +43251120 2653267663 +3368132717 3219490395 +3029936506 3340520194 +3856556246 3382710989 238445674 +4148985949 2859340404 +114915902 2633019661 +3290179863 2656033655 +3726747799 1174168998 +288293335 3825198438 +2170566579 3052671275 +44009478 323858001 +1227735863 1779060624 +4188694689 2822944118 +512304757 2985901449 +1166856162 1588281557 +1696031142 1696031158 +3891878034 3391067761 +645147495 3189955442 +3062232036 3062232052 +2061468765 3403505250 +1197776611 784555472 +82057571 370407114 +4140400305 808612016 +4137836704 3785235443 +1906570127 1947757070 +1644057833 744467160 +3474167073 1465641286 +2943225064 547534544 +3045617443 3363589785 +1158977457 3325064887 +887945558 2802614894 +3360541592 1730083109 +1881875871 1610541259 +3040008172 1100546817 +1953887595 1789888030 +269409233 409209360 +3021570555 282799639 +992320839 3167856831 +2684472117 3942486746 +1921569267 3876712288 +2075637009 3543271888 +1793410353 2980306868 +4080276345 1408935806 +2132554625 2590315520 +915878705 2267969693 +45916859 958382981 +3597441880 3841493915 +3719515226 1386295349 +2304279757 56168114 +80361377 3132229757 +21699113 842673806 +3924953769 4043753496 +3727597882 4251438685 +1428516623 3596987212 +600039478 1866472453 +2075778368 93801427 +365861157 2033915187 +2689561878 1930777009 +2310665675 2596138644 +1100832578 1886749021 +1613177544 2012992632 +95517536 576150527 +3914128478 2717837289 +1649916709 410346134 +2505694515 1689927501 +1603852068 260006169 +3610869100 2956061395 +255820875 1274888724 +4245679704 4229184572 +476259103 3473951198 +1559448426 3170875341 +628096658 2169356243 +2594131992 2160793051 +1933547973 840896780 +2420809835 2420809851 +1699804448 2549315915 +1429683102 780983855 +803430981 2817766028 +1745915831 2299673862 +1619501808 640171101 +2883801623 2916760102 +973696582 2448924305 +2424085653 2424085637 +2108211025 2097485536 +339200434 2245165861 +1281370280 3814719613 +186170087 1592670624 +354127314 243743341 +3584515754 7996827 +3479256282 1343408957 +3242683938 1701994371 +2456223322 3525470141 +2965511007 2965510991 2425421134 +277554766 1494043855 +3226754148 684552575 +3356901421 671549138 +1098733444 2622538975 +352181683 3198419162 +2412999300 506767747 +217960731 2391813522 +2706126753 2348520063 +2414646530 1046629262 +373094976 1107161811 +2259839724 4141765015 +1863247383 3824246903 1274731334 +1278272553 435629198 +160952440 1698258218 +50636673 3971887792 +1575559867 2432806002 +2739744823 1233315472 +219962166 3651376657 +2232434694 3473649909 3345767084 +725174415 2586655000 +3687862571 871351970 +1854918319 3143785838 +2119538679 3619568080 +4099275663 844825112 1564756955 +2118885566 2400062217 +906971102 4248849918 +1050226956 2535994849 +3711406566 3711406582 +1006388580 1644601906 +3509859054 1126968495 +782715868 3405502233 +2339921694 2893921343 +3457414740 3178022447 +2121387254 3116462132 +1725277224 173107947 +2395936996 567953380 +3127616519 2121479936 +758666271 1319922888 +3783783240 1359215197 +1560274517 2120479482 +4005870811 3132443858 +4017028451 4017028467 +1115144860 734735942 +303392104 3752764093 +3315267676 1861548241 +1190230835 246140778 +2665570537 97226456 +3066602164 2419883784 1909989721 +4100333367 1278278580 +3862705186 2462454174 +1992112535 3107753236 +506960351 1629104715 +3440422830 3440422846 +2604513770 1413400102 +22451147 2672354248 +3196326967 552325776 +3135468927 745982404 3470780005 +2546113263 3596215864 +1103679110 869570769 +1860260985 95943272 +2362646300 3428448529 +1608719803 1415373145 +3276658588 132497991 +3214921451 3214921467 +3390275513 2773455241 +3085394634 1262519291 +271283627 527055924 +2307444645 660529338 +51255755 2587007636 +3915722740 911423892 +4037231202 855736387 +224772692 3944168372 +1913463437 397239282 +3725146900 4109619771 +1006414184 3602820779 +1865435636 4244925199 +3533003751 2514277063 +1274830475 989879927 3858192264 +2489166001 4101247140 +3108386425 3652453961 +73096877 3136438034 +1460476826 701948686 +3688767337 340353237 +1704417173 2185158538 +475562130 2257603708 +1766276741 4198315438 +999495587 1804481948 +1018864083 1825357626 +2682241303 3292329766 +4065617293 131849458 +646992983 1130303605 +3845461622 1217551313 +298086993 1228928400 +3169727869 4146821749 +1061301224 2099977771 +1400349557 3663089955 1767966365 +2435180629 232145395 +1513040610 3661660629 +244146616 3021071048 +4165575324 1466626184 +2840698584 1669139981 +3026947425 1716490144 +842558658 3503502698 +3331237461 3884963804 +1718983102 153159199 +1140137672 704856371 +661804994 661805010 +2704065337 1876377886 +2179577495 2081280532 +1480915027 1480915011 +3576941831 2810954262 +4068537860 3305326687 +2254297757 582952244 582952226 +471746100 2007532505 +3319614297 1834899006 +3962584427 3962584443 +2476917024 1695186427 +98539042 1626953603 +2186359151 4240057516 +1775366088 3642495692 +489574431 996906127 +2246400778 3524153517 +2665191717 1636994747 +1133602020 971672548 +430570196 982899632 +1810575536 2530286000 +659100888 815921901 +3063409413 646785026 +458346701 3469456036 +468722681 3460164264 +2276910129 3588831536 +2660995323 2850372402 +3294043028 2837473775 +2837845774 1996626410 +30271825 2652353125 +3767353955 2572769907 +2531344678 2862190273 +1236663753 3341344722 +4273645047 4141040592 +167668957 2558877684 +1692508072 1905980688 +2272787636 4125282137 +3713838325 1843676604 +3078265970 1208239973 +2803873581 3232205700 +1090107551 3894256222 +3819163224 2858507854 +864134134 3107685335 +2974781399 4148129638 +3392578446 3791878287 +1639383692 1595474551 +3088413043 1019320332 +3190270580 3429979279 +3811609689 2304290576 +844771141 2297981324 +3472778109 1908037730 +3669575863 3193046730 +1192137705 3304249294 +2324071739 1287896036 +1837611210 89066035 +3442373973 3416429489 +590384914 2003908933 +1554777354 1043314795 +2642180058 3304107051 +1026659575 1026659559 +1093705153 2116071581 +3621629076 2085768169 +846866461 2471306658 +3883915807 2370068190 +2180686973 445706452 +3212698654 2435717929 +2800763878 2990203678 +3185717653 697389100 +1654395938 2591021618 +737505172 3344868847 +70905236 993067001 +3909385886 1880314559 +1653993700 1653993716 +3980060269 2278282484 +3640765723 3097723282 761586376 +1461677114 2976125201 +676561294 158659225 +1241360472 1241360456 +1141506355 1321198426 +3513473620 1712105240 +3818901209 1047575112 +1127272693 3448008332 +54090291 4041757088 +2688880111 903124268 +2446360975 1684095451 +480959021 1307931858 +2521914287 1360221294 +3096327358 1172113161 +533521938 839551729 2895685655 +1104412076 1287148993 +3100058896 4051654691 +1990666896 1495793827 +495834044 1956594566 +2390833858 393183075 +548288299 2638272692 +2117426119 1962900032 +2844609384 3971188116 +3702011198 3702011182 +3302508674 1652171957 +2715114812 4276209009 +84549500 1794084903 +3810045119 1054339262 +2837565421 1154429508 +3597880855 2927881776 +628448659 1842084717 +2507656414 697794921 +1486141183 1897665406 +2032570065 3940020173 +1722501196 1722501212 3953315767 +102931812 209568864 +3700518628 485593321 +3311938177 436006310 +1080410745 1717334601 3643876478 +1574696668 1574696652 +1517974644 1803407646 +4099261818 486924061 2176833878 +3519954793 2964181592 +81355021 1149435598 +3272966875 4124901060 +4107714466 269462531 +2555813724 744283601 +2184769835 2184769851 +130432326 2199024951 +1509960327 1509960343 +1248831497 918914616 1727150712 2270300923 +1567592687 1567592703 +3387803890 3387803874 +352088143 2125311643 +4247558082 4203698638 +3827157959 3790064214 +1285717187 3433045670 +992249886 948062015 +574907181 514334660 +900889405 3304587522 +68173604 2308138409 +2257794567 3770551574 +594407600 4012612047 +3366869456 3128386147 +368680292 4226991231 +2669899723 1338571906 +1154123501 4265104441 +580560694 1786532626 +1274194957 2617563246 +362625555 427977722 +2327055178 3234717861 +3914360744 4052954475 +1787048171 4133360408 +3520138078 2442375810 +3484146661 3498781036 +691005214 3511613082 +1284026556 3468824689 +2072428103 3800029508 +1510284294 3154845047 +4260829639 1410525815 +2349983948 1725582676 +747867975 1046188627 +3983963204 3599110959 +1925012764 3155792657 +3795723927 3201744806 +989063164 2636676012 +4225321592 1133298451 +2539214685 2661582708 +1793527589 1857869626 +350286404 417868847 +1639346920 2720701853 +1735610994 4051378189 +2236424962 3664649251 +4056371854 717682063 +3265579050 2473007643 +4233558540 1223401697 +2891469392 2668205027 +2697931933 3273866036 +3867823678 700001161 +4148105248 1540154605 +2717021559 1739516496 +1282888190 2533340446 +2659689372 730238599 +1330699267 1040822256 +1179037026 54718787 +2782636129 2043285664 +3141645037 2497204431 +1308852019 913535878 +1582507104 3705815859 +548886563 3587220577 +2881552980 2881552964 +1311640464 2122671613 +3844321156 3191870810 +4061808869 73449580 +550058438 2998193090 +1464034182 3843402721 +2248896755 1634410516 +3802286387 1397320534 +4062550552 101428147 +573215284 646625929 +1939385984 1939386000 +1437534418 2452924798 +1142238825 2522353496 +1422066212 206111759 +3609322796 3010851415 +2551145769 2302427032 +999480570 1065337301 +362536053 1792485203 2209540026 +3496082013 543348081 +1549618180 2991337488 +865969735 5160473 +4232002906 4232002890 +3056520264 2969613508 +2599285412 2291464233 +3254874415 787405179 +2203760772 3140910245 +2896876236 2632570679 824032212 +3855990858 2615352754 +3604719209 2939636082 +3629313268 2123039768 +1274830473 816257303 +449245566 2771265887 +1824466036 2766561945 +1919209459 4073686858 +3471283134 2229058698 +3450045725 3580529844 +96874855 2040746354 +636001053 3752059999 3174057543 +3417916994 805126237 +671049222 3547053137 +1983925946 1549330837 +490852919 1167977606 +1265757051 1062580900 +2892033685 4053243018 3684619565 +666900721 3566147968 +3136266426 1621805913 +2767063603 789628279 +2203474956 2203474972 +3068990286 1161126863 +3073025481 756584812 3370767333 +2013556319 1308213121 +2293707779 996597948 +3654517556 469207769 +3536352039 3407527871 +277429654 277429638 +4099280731 4269419588 +2770718051 271085648 +3591631002 3820357646 +253975970 1991009813 +4216220979 3480610650 +3734762072 3346956443 +3975830674 2686433747 +3589152486 2883232791 +3929960012 206021047 +499315158 2950869991 +2221098899 4215909498 4215909484 +284818415 2827458862 +2884113013 3464722823 +3401219586 1178975234 +3308181632 3308181648 +2238573788 3569206006 +1602527044 2714155039 +1194578097 1882270135 +4072725332 2772957375 +1788280402 498227987 +1821036112 780322787 +2447053572 2682187593 +4203283585 1079662502 +1007481745 425946438 +418975506 1645394259 +1219954373 1025484826 +3518233943 1968689136 +1210770864 1330504867 1267176469 +1301082068 3906833081 +1903246860 2705632503 +260506190 3213402329 +2470244064 2834041509 +1234123790 4286207375 +145777048 1168745051 +2769862390 3690241351 +1308197114 3151122778 +4177328517 990635129 +1629852494 1629852510 +2130501876 545723540 +1800891578 589313923 +4231934682 3631397557 +697530028 522440897 +910915546 2227570595 +3611956073 1385991768 +504624914 1897063866 +1399880437 1326550972 +2634276191 3610828133 +3989880150 3046772334 +1935263177 1935263193 +1904329872 1061711523 +3114974919 248140630 +4205663350 349959633 +3447443356 3447443340 +4278689786 1929434763 +4121165254 1999142561 +467158219 2691976084 +1618027334 404391713 +2010585244 1134280081 +4063530344 4020493392 +2689561879 1947554598 +2554191620 2909147999 +3471428252 66428547 +3404710073 1822435253 +2744781156 4017932405 +1039661776 1566561635 +3243796131 19501724 +3016957621 1956893274 +1459102258 446551205 +2224400219 311850066 +3845674410 2175720091 +3535828615 461040531 +1856854255 177982865 +1672161811 4185078778 +1380404504 2654887117 +1140609546 2706366379 1382456605 944315949 +1710959679 3378947880 +3971660843 1828357973 +1614189550 2504855214 +1928235878 1401254295 +3665866662 3665866678 +1277384326 1637954785 +3427806181 2268404076 +771917582 981604505 +123591765 784855260 +1561410729 723680792 +1653447634 1653447618 +143913351 132462486 +3466764361 2604119519 +522478738 2555007429 +4250395419 4250395403 +3101255634 3493752723 +1678942601 307514040 +2732969236 2210518639 +3529671567 2607879739 +3078469060 3078469076 +262043058 1081677133 +1204497982 3487266922 +271302627 2955536080 +2372487273 867784511 +1417092823 3464858726 +3439833063 2853824672 +481987031 3544390383 +1449803636 2101470095 +3232762737 3324117744 +687090060 73230199 +1761768038 1246859175 +187856088 3279542172 +2634685105 3890742438 +2936453190 3449034295 +1074395882 3115712091 +836525426 3703710354 +1849739873 1638568673 382156934 +2627212686 4173499151 +680164970 1006960845 +3248565886 1363158430 +412464686 2642484654 +3873989414 1683563266 +1668195756 4154882699 +3595756781 3595756797 +4016987481 2593110428 +1696996549 4294920730 +411385607 2960750231 +1547815408 1779972956 +18841877 2493115308 +326264524 1763169079 +2597566546 5351661 +1901581012 1094771641 +53032948 3991082255 +1441256523 4156233129 +733199321 804049428 +3022307108 3117999529 +3155638451 1022465056 +2068388800 615901581 +4060922826 130296670 +2630176442 304454545 3194191900 +3699209446 3649258357 +1371936924 2656889526 +3113718100 3212166168 4061437609 +11043269 3481211900 +710596866 710596882 +3109523442 3067582949 +4152262429 3106020020 +4240285326 1820367247 +1631048664 3806493965 +67042612 2120784079 +2301586254 1426868174 1295136463 +1855264263 2561890067 +266167066 3820499920 +1626458044 1486712039 +202069704 3185155275 +504665793 504665809 +4224932425 3065454840 +1461117219 2415066902 +462775010 3492363754 +1901763626 2611205645 +2106516298 4059024763 +555648589 2577056481 +703101821 1979344340 +1970354845 2118075682 +2654823282 2359528563 +1279097850 2738944213 +2967269796 265315647 +1571442589 270226466 +1505555116 2805537513 +1851248183 3854029436 +2616771654 3466394167 +3536750181 3968548822 +4071800722 2707657413 +3713747102 347295913 +762491 2370881458 +4226281145 1193069886 1193069864 +2540913724 2540913708 +3634335536 3634335520 +2179104341 3418639084 +4160718836 3229277664 +3941755170 4254826627 +3421931868 738452172 +1326884208 4037439317 +210548338 3813500766 +4207712490 2466716454 856756553 +3707525408 20991347 +3925553352 3285604852 +1865326489 3395314793 +48146525 1603517166 +261199981 3107663451 +3579086951 511377508 +3078272983 2905565040 +1578498885 1637518732 +45101974 3271994486 +2532224380 364583463 +79342708 3647746836 +2517143273 1416604750 +1220823104 3439180997 +2051593236 1402645292 +4231017773 2088188306 +3100268411 1636284082 3490867689 +2400344813 3673401819 +1960749127 1492263510 +717518810 3309001612 +746052755 3865937076 +2949015106 1050633897 +2098858343 1459408160 +384054715 3292566898 +988478141 3845828775 +664745745 397259958 +2973455806 32214876 +4167909182 2691592554 +3392477610 2857797125 +2677938369 115406806 +4189021868 4189021884 +2798623731 3071893901 +151930467 2759380426 +3053483359 3128390647 +1595139370 3595682061 +1158543749 2813243818 +1246995302 1739209111 +284282866 2661964275 +3825086041 990474536 1673495695 +1236493061 1513120253 +2727500698 4259508578 +3428573612 32012344 +510642260 1039686713 +3272432221 3678689858 +3369744335 2226618906 +4029734558 3136189119 +2072497839 634019192 +3569578820 3569578836 +3566088089 886369758 +1802998212 1208626351 +1561253290 677010061 +2235999131 1764986116 +805799830 836399409 +1670118964 1022887583 +2313241324 1914758679 +799580496 1450569955 +3206634985 3397834200 +94359784 2871778209 +3321635430 3399139239 +2408724259 640470026 +1014542682 2348757181 +1165102776 1161542407 +1470914351 3463276667 +1747088352 3404880180 +3176808741 974425402 +2823380432 4005088740 +3120998125 4011942226 +3328316878 3483207798 +2775939342 2246938895 +921450014 401438914 +549124618 4255699763 +2909357292 3904339863 +1169305446 385022658 +2211485339 475862546 +970391089 3572800296 +1470017558 80687793 +978714905 2424192661 +117880238 3180331257 +352723252 2193514911 +2418392146 3168619757 +3667748295 3972479040 +3959054140 2733583212 +2436552008 4199928436 3885875293 +1243163963 590350680 +4091307439 3392736415 +136502662 1424144887 +1128654261 1955770569 +2909353410 4073432014 +2726458487 1247631174 +411750282 746894893 +3892456315 1469908783 +253945995 1593053890 +3048918824 598216515 +446104241 765098326 +1806395219 1962149537 +2719466560 1802105029 +2725865081 1042042984 +3443899374 1040550009 +3645366319 992340462 +3363551230 2562893001 +1775989856 2483059800 +696542070 3513291463 +2739346207 670020062 +1770575541 1770575525 +1371680350 1371680334 +3917582069 2348026812 +20709847 3363235184 +3712829397 900207708 +416266683 3389088100 +3581978181 1585823372 +1166033049 436042480 +565955539 565955523 +1091895530 2180033985 +3447070057 3656404056 +1504167802 4041764078 +862046707 1880546189 +1842421776 4030036259 +289829302 3890545041 +453679311 1622052305 +3557134929 298304407 +3483381184 2569536851 +3666604142 2111767293 +1725604150 4145447583 +3791807634 792045972 +3155414194 3307944997 +1087558494 2934932863 +2492484640 280396027 +3890989391 2932721210 +3287453221 4078221389 2535601195 1910987025 447698707 +3334953674 3050564589 +2303574205 2303574189 +2867923821 2255813778 +1786257557 1156994874 +1775535711 4170155912 +1192965799 2530674934 +4144621667 4266914577 +4144923551 2329490248 +2368435001 1952866984 +3483401893 460884938 +738983273 3219123278 +2163205632 2739853071 3135537045 3567645189 972136785 1285135333 +3971247047 3673518213 +2857573784 1432465315 +920724184 1013570061 +2158398115 690765450 +3674738133 2729297500 +1832513299 467149184 +3887303205 3835852858 +355598213 1028728764 +3285362411 3888675086 +242606276 242606292 +407409851 3478497669 +1094432388 889213385 +2663365549 3388075585 +3985286471 943861462 +1708969392 1824525009 +229173703 1206387776 +2586946696 358701316 +907715090 1038950981 +2115825028 193586911 +3559589562 3116078786 +4289020956 2368354321 +2369118790 2446537761 +2262547567 3135873710 +3707717585 1792574612 3918535101 +3358047059 1770775468 +3170052979 3855443482 +1336843194 702490077 +2764048481 3142398112 +2108017813 1051321146 +2312132752 2197514933 +808078781 2409128066 +2912490886 3455902177 +2614181461 2674204618 +2626226963 2126278380 +3500057412 2914714655 +2656018591 3596212808 +2159700881 913790288 +3933665821 910932916 +347381267 2874464250 +3642036211 2307681737 +3499885285 2375657289 +1955843507 1826441131 +3024569447 858828320 +2878142047 2348305180 +3816147217 2219020394 +1322722826 3247820826 +3511083730 2362382203 +2454160034 567919530 +3319792512 4289036947 +4097475678 282140265 +1707368685 556045572 +1125849873 807811254 +799458241 3297126592 +2446693682 2212948382 756547789 +2182362940 1343568615 +2841529647 3463676142 +1507178619 1795579231 +1165601577 771356325 991829861 +2851889186 583672148 +1540909409 4138591136 +106556619 3398419348 +3178629312 13616709 +2272114526 824112778 +1981430681 2219561438 +3975521104 1454380789 +669101993 1637456654 +3186491877 3988090659 +291026583 291026567 +1682068886 2955583094 +410308123 2598401170 +1388123751 2667374419 +371227166 4078976297 +3153545902 2487914489 +4265548576 1566028645 +2141225793 2141225809 +2575633489 2892923287 +2117672667 3830565311 +4070950902 2755022354 +2539608427 512667535 3055141748 +403808366 3750445295 +1710317181 438425259 +3300090250 811764781 +4042338874 2243039581 +1811330241 3059649472 +1129174560 327685221 +3420190944 3934494982 +836694821 2801320748 +533197406 3699529066 +976687931 242290546 +1974165475 533197386 +1911588471 3567496528 +4241709756 3166164455 +2032132735 2046977084 +1526405879 3603283316 +4238514118 2046094519 +3146897036 3532963425 +759035015 3213357206 +1366675302 1442100401 +1166213603 1346107484 +4132879218 1015616627 +1616531135 386425905 +3515315655 4013825220 +2554074190 1325955282 +277930044 1343290983 +4102314294 406346497 +1616748285 1616748269 +1008542924 1843457313 +4120869420 3591197527 +2006828630 793313785 +1006180961 3970158663 +3731193539 3703999722 +187811911 3864938454 +4260706381 369598770 +4190911793 1837388848 +3783921221 2717299818 +3925553348 443401375 +2166807387 1888111308 +1225711274 126507329 +2469815092 4070451919 +392054357 510179292 +3644433171 146519788 +259788495 793464782 +2289330183 1180694788 +1394574841 582525384 +1669748054 41440881 +889919972 889919988 +895474090 2120173061 +3222608410 2318513294 +3142365992 29231101 +3594412854 3157223924 3378764411 1329059661 2418998426 1423400743 2472685889 +4227693500 1812580593 +3955388969 1276753550 +1995085109 2477971529 +3607649160 170399499 +2587863259 1900717192 +3658048417 3720861280 +2115831923 4206120218 +2499743183 2043627547 +3522822071 1133350156 +640363930 2681453238 +1921797460 2799549231 +589256240 2052369813 +95435594 1047352699 +2134370381 2449649970 +2446554961 3773092998 +2994878612 2393282235 2191950808 +3726201345 710164651 +1032325457 774285968 +1237251062 1406959386 +3824117613 3824117629 +2920065177 2532141278 +3116143596 1339874455 +351463725 351463741 +3561938593 3643307894 +297975658 1603490779 966852242 +1663557052 4019128347 +1557158212 1610384927 +1343413024 766440307 +3697895819 2230396372 +105694512 2306928368 +899924595 3821738764 +2085781656 1306554189 +2149237879 555960134 +1022925250 2009169867 +2059679788 3734507572 +4009185035 4066761842 1332927926 3447388940 3263326311 2137125956 1806659898 +1004315111 3084758925 +511506866 2965181221 +2463055771 3074498820 +1636038141 1220817009 +3442421027 2760668295 +3259457913 1806476034 +246611805 4210035300 +2727601746 739285454 +3730566041 2746474974 +3646001804 2808722017 +3284390744 2235937677 +3788948007 2886968160 +2768124508 3780328286 +1868333815 1168255696 +1212400083 2510954284 +2969296510 1008560871 2797108943 1037094318 751849319 2102650978 +3235803730 3906802174 +634704497 4278667248 +2761308692 2188596607 +2878903132 2100296145 +3484668032 2542003095 +2434915793 2434915777 +1835060909 3697629764 +1341164261 1341164277 +4061894412 487463190 +3427692232 1735943380 +1364830086 1336383953 +323200972 528557601 +2612667906 671733045 +3306810161 2026716720 +4225656981 219190451 +383912951 4242068934 +551830894 895044665 +1322237359 3114368759 +611655662 1382106041 +682888325 2557457740 +2327227389 1519435586 +252204322 3424519299 +851464798 1119988223 +180830624 2957000087 +4033634843 338266606 +2099379238 644255601 +2796581748 3687169935 +1217772758 13041662 +518085840 2873766639 +2458733944 1870595150 +763982021 1952220698 +2166814517 2237081706 +1418601222 566305399 +3280916699 3033712850 +1322757617 243716720 +1278313836 2959829836 1920155269 +3673485553 3757123097 +3802560316 135115623 +1103567430 1873676346 +1338751048 3853719883 +1836971021 3207403135 3222356836 +1722835241 3500733326 133654681 +3845008508 3206238759 +384167225 1156870312 +1866396127 4279681566 +1932468797 2419254804 +1091322685 2739788034 +283794878 282593164 +1257926467 1262298730 +2325963073 2034988611 3540773640 +2653844041 3239423662 +157210320 2420910453 +1021725773 730471716 +2386162964 1513122309 +3620558718 910211935 +2748679734 167104534 +2502250209 3129364604 61253428 +3767974965 3259647850 +255872392 2319060253 +2305128442 456296878 +593741652 169003312 +2137525270 2814988330 +3597591003 1804438468 +792873648 358322965 +1971161476 2023717599 +1226684911 147567416 +890846212 3001812968 3673915641 +590404247 3663963170 +2970969714 2323469338 917521779 +2991202875 2116955390 +3135256226 2754737078 +1652172119 3381837524 +151286612 151286596 +3853955075 2711033020 +429499593 3676202296 +1814673066 1437593374 +1430923586 2243883765 +3649926722 3148950005 +4121953242 129725365 +3308374917 3967013821 4066599514 +1252283872 1622355877 +1509628246 4232634993 4232634983 +811286153 1751213224 +1814470486 2530006129 +2602872033 3744474896 +3593124304 2293454831 +1821398768 2743210077 +3357389674 1535317445 +55982286 620581458 +2123785941 1607851028 +3588182585 3884871592 +3547843806 1719720681 +3790337054 3027317273 +1854661747 83107597 +2546769405 4095522114 +4073421929 4073421945 +992208163 1490763616 +971147671 3063847088 +2051726678 1074552298 +3607777812 3078696296 +28311772 2215729735 +36877993 3495126015 +1588683988 837368472 +399786764 2401602536 +940254100 940254084 +1626361197 1626361213 +3694263117 4021197348 +548830423 1447462512 +1167734647 147148870 +605697189 377457794 +2238309742 1941187631 +1335753880 2153583140 +3874063469 1459706408 1019039161 +1015899566 9900262 +2456821143 494834864 +3255115442 1744351774 +4101795410 2571128570 +1150024553 3657930390 +2165660062 3533444009 +2620029539 970893770 +287316135 2626080502 +3207578637 2669646706 +3350115750 3227686838 +1662981402 2114899971 2324261854 +2402502157 1863888295 +1138247042 3101192587 +3582680748 3597011159 +2604571700 1736885865 +1362499926 317679649 +2827173642 1352416443 +2816887826 1636417619 +2171405712 1614651380 +3409957170 662065573 +1583448579 2524949180 +600978421 2058239657 +1233740268 2940544663 +2985551558 1871710982 3908323767 +3873853360 3873853344 +4071204805 3323140890 +3882361969 411763475 +3657895396 488300009 +3694384259 2374775271 +1302515567 2790034360 2189423291 +827636491 3009573442 +1150989812 4086066969 +3069508514 2779258901 +3414607912 3881057009 +3577683731 3644074989 +3854915408 3710711723 +1465500147 790911252 +1011381581 856729636 +3301533300 1024215183 +2873057388 12896791 +414814793 891373806 +2443468986 2443468970 +1847887734 3649126097 +2396318153 2720794488 +2838680767 436529342 +2048031091 2652188698 +1862473982 3219150793 +1664956752 2304850165 +575445879 575445863 +1220791500 4159566598 +3465008178 2184828877 +2702200715 397227988 +1694925252 2718604463 464167300 +3613962753 449853334 +4119234524 3859355838 +74419455 4204459390 +3884699322 991325917 +3329930258 2234087493 2234087507 +564100646 336827863 +2231958147 1041706020 4028783676 +1849312025 2662834270 +35590721 44166429 +3135489429 3619619898 +2776532808 3459184203 +316944228 557226623 557226601 +1832144815 3593032906 +1503745048 1821319258 +3754163381 3754163365 +2250812497 2130567788 +3125953881 2827168542 +460078294 23315697 +2825190185 1970171749 +2624509926 679337751 +755145397 3258297933 +4110014706 2538636517 +1728542145 4055785174 +1086337394 2925752008 +1640828229 986440588 +393843340 3985917566 +2549453185 1627359346 +2043554859 654343892 +53702821 2935641004 +345786658 4261828378 +996290149 3767470316 +690371672 1365503136 +3315667545 1972363784 +1608152087 4226072624 +2585226255 2715753358 +746256733 2701173801 +4061036477 3386054292 +2650646061 2744423058 +517778177 3570422237 +857764455 2560752243 3809744928 +3209826188 3653190800 +151095536 667130008 +1061957995 2376288152 +2911213531 72224210 +2356199540 2306799247 +4067912276 2773393343 +1613897648 518513155 +1545934979 518750320 +248245747 1040684428 +311958632 2211168592 +3485721501 2925482036 +1904676941 2009356708 +31347247 536567790 +1356650094 1856005871 +4050946234 3564322013 +1157294028 4059579895 +324193542 1901641825 +320350479 503882392 +1235666735 867307628 +3493134117 3899500332 +2165930865 3256271592 +2049207051 4010355247 +4143900884 1375010668 +1220468519 1341134116 +2614166245 3646403404 +1954760180 1954760164 +1847303088 1596518194 +1299105478 2875386273 +2027153408 2502882175 1474908414 +225007529 2085454616 +1792818107 2045161349 2466139206 4282851239 483794333 +2188119799 1192988358 +2871763350 2350041697 +1122891921 3986574416 +604278490 2368528683 +4245439995 1431448100 +3373323462 2393191829 +1412090309 3057556477 +552112958 3066585885 4267477209 1717997690 2191281907 +1253713586 1426778661 1253713570 +3300565856 298790949 +1789650235 3065495301 +2252233844 3358296719 +2146081694 4233296297 +1649763984 973584619 +353458216 2844820161 +928287508 773255279 +741829535 977169224 +3025754714 1118387133 +3582182559 3178137182 +3960732896 2205619379 +1071756015 2645967404 +2077534343 1992641664 +2425825899 150455933 +4262720225 2000555435 +1217270325 1822861692 +4198289379 3501933148 +859381031 3387483254 +291537940 1861217135 +2164056464 2652312995 +1501181468 4150472209 +2146836374 1328314465 +2606272117 23609916 +1879434718 927521897 +3454637113 1109435864 +1143387568 4176479260 +4201707673 3637991624 +2364945143 3734125271 +467351334 8243394 1560779 +2230436097 1234359446 +4146970409 1174662552 +942196608 130864415 +845527061 1797310730 +3752560292 229355300 +2490192724 4229573945 +661992915 3412043328 +646428945 3098039750 +1594101785 2892322632 +1810561232 3001397091 +938385472 1285965011 +3725691042 932845315 +1776217333 3695569562 +2868611577 232670665 586822398 +2543324604 1616748263 +1265961842 3126460685 +2417349756 89692976 2385459761 +359366720 4164609221 +3051241798 1859135878 +1320840582 1320840598 +2161809431 4058400138 +3550208343 1969470448 +653899834 2501706589 +37349603 1680448860 +2401343713 790227375 2083633858 +2217599681 3577476544 +203103164 4274910055 +2493600749 3874954756 +2205506549 3871326908 +1639423082 1040923341 +2960804135 4152436832 +788627938 326180322 +1377023709 3503221047 +3592421713 1700926086 +2515437907 1501703610 +410203317 844888298 +3191484756 3382421305 +3965533776 2108005705 +864198059 3248370722 +4252007482 840142685 +556253444 2723286511 +4079071587 554319562 +1949236992 3858459923 +2339318931 4189628869 +3503609741 1276072690 +340640885 1164922380 +2862004025 1952726965 +1681621249 3400275072 +379880971 2952725314 +77767020 3087277335 +1638869901 1686415547 1405193970 +241722945 4015585344 +382934295 89574182 +1361707409 3743140221 +708531305 651548928 +495108721 3856144358 +2321442901 2464399859 +2207652987 2689521074 +2348549376 1572593413 +93157190 62047009 +2689551743 3688300264 +1019018963 1019018947 +3825767555 3568396793 +2460225681 1766200390 +2041098734 1922046383 +1866090538 1119853083 +984323514 370979805 +2570810856 547003453 +458914030 4251737785 +586356472 831955859 +2214520667 2776232190 +622499469 4124770276 +1834996071 2497094944 +2824915678 3999226729 +889103676 2833128807 +2732223590 3285755031 +2621447533 1710117522 +2796465992 2902322781 +1800350366 1800350350 +1351003100 2684390215 +911459401 3470655224 +1842703606 3707406151 +2933238501 526124652 +3309434490 1635270033 +3189920014 1577425167 +258023023 4150869981 +4178823978 1143526171 +1137766269 1055457748 +2165440576 1867932869 +3775978057 1243899003 +1256881897 3982961333 +1139686716 3512583108 1762342955 +643553021 662249841 +2419845953 1032036839 +1133051500 3165160471 +2427230136 2008209069 +3926727827 3134058605 +2492075659 1616176322 +3686869756 1320965032 +3263952608 576037555 +1066995130 428764782 +121422867 383943405 +2106318268 2869082860 +2954381700 2131453636 +740194766 3362537256 +315902884 315902900 +3787232839 3646982637 +218760384 1187347027 +3398105493 1511741498 +1491526738 1165585669 +3081818606 3081818622 +2826401701 2826401717 +1150907460 1100089097 +1794727501 3012522802 +932137697 1469243446 +2470100750 3548037903 +1603736371 9286873 +2866666070 1363064167 +1709406558 2850286722 +2419123590 2197377505 +4161080429 1612894091 3706883972 +638502570 1108520289 +2153921697 3748766477 3148181856 +3993237085 952260162 +2160565471 1096783260 +3281863043 1938694460 +3399031279 748701889 +3618569168 1484154979 +1247699060 2257704601 +1901560621 2848168212 +3288656214 2649864422 +1557598357 1147260489 +1301541042 3521374259 +1832082932 3048563666 +3559164803 3060572554 +2867710111 3008549470 +1548854358 2860888935 +2867295550 1214091414 +67047584 3934727140 +258484415 258484399 +295599943 2463774923 748169794 +283317453 1451344763 +3471404954 1656164112 1982641699 +3574300089 707066923 +3254529566 1845264409 +2687582887 3565939936 +2458642680 195116284 +1350342752 3613429934 +980439065 980439049 +1400097604 1762896388 350536239 +492271452 2360403399 +403512766 403768014 +1961633996 3021260673 +2694146108 3328988135 +1561089092 3284069596 +3846743028 567639052 +4074453604 868689891 3005016949 +48502338 3473869301 +1074749259 590545684 +3005705664 3339830597 +3659046538 3737228077 +814990420 1439926719 +821078862 700637474 +4206627115 3775032994 +2577830090 2707787729 +2876831247 4268448142 +2530273515 1440655842 +3039907066 916204939 +1398336374 2868554449 +208072287 208072271 +3026015522 1475582099 +2172572374 4230643126 +2503805604 3076751503 +507467052 507467068 +3983824861 3983824845 +2271989633 2948048896 +1297005490 1693546789 +1797010282 124055515 +1951266518 3971715814 +829796013 1692208914 +1828591429 3936211523 +1848032093 3957797224 +467373356 2913720896 +4225034513 478656182 +441199136 2246463603 +2152889970 1943866739 3623627802 +791157527 3318577130 +849090082 3205277102 +1882142487 1456244372 +3827294388 3526277977 +1661364976 662193227 3541718979 +2503175321 3981322744 +2716228777 2258886158 +3117895552 2432387583 +33859351 1146292528 +2313922191 2901881614 +1059649636 1059649652 +1916367384 3005170611 +1661853502 1103848738 +2904204174 301648153 +4191237581 290959780 +1265557087 1347365717 +3078413726 2005983145 +866514470 1950514625 +595798629 1283177708 +2446910907 1399956836 +493632672 4049825779 +589264621 931673860 +4062392327 879008534 +4052016347 254258372 +3170831921 3062060838 +2982334951 3165679286 +276449115 4184024231 +801300770 1372088451 +1684151411 2037565722 +4130288696 3293525037 +3235550635 3578848719 +1828577312 1546509497 +547489648 3474044227 +3097905532 700821031 +3718661142 4140855542 +3096794074 1829961789 +817251104 817251120 +3596998559 559050590 +158744653 158744669 +609430254 485266617 +4266833057 4247935350 +3179161247 3110311260 +613527259 1338710664 +269569917 3359646164 +2974263184 2974263168 +3843894756 3781783268 +2062511923 3119254874 +3421373557 2024379494 +2485633094 3922227379 +1638434327 3544913456 +2904995619 3069332490 +3138854539 3440429374 +2043323984 168022005 +2601551708 1996821969 +3453515173 600625774 +701113545 2453137518 +1082371043 1917294154 +3710359622 1800713761 +1095673900 4208115031 +3980816885 827945939 +1623567162 2435615837 +1267366423 33436198 +357493904 457074339 +3509716628 3854588665 +4192873321 3567408728 +3236842533 3693207098 +2162993995 1066510100 +1034433237 2300145577 +3986469187 2034542384 +3456144584 317339357 +63486224 3920276456 +4209623369 2142843391 +1418484749 1049230937 +2584784602 1648574781 +1914570799 3561415160 +1738640992 2203263283 +3248704175 3438782433 +641739200 4144085317 +4136061670 4244301847 +1317080837 3531345116 +3105726856 2217875619 +3168328602 3814830955 +1288213401 1288213385 +804692733 2118292546 +2222659117 3630663918 +2847487744 2953361448 +3469582492 699651463 +2441152881 2132925680 +2353648783 2353648799 +1443131000 375818003 +1664247514 39315773 +1618939068 2751532017 +966001571 1191295388 +3192513946 3958280625 +3285266628 3285266644 +3722006730 1871878598 +3465720024 149709828 +1848990890 3744673772 246382082 +3944998463 1753445694 +930430407 344997952 +4170503095 155797766 +2298910821 442623738 +797064494 4161163129 +1631760675 1141594640 +2165249045 2373194892 +3341193445 2974049275 +1588277319 1472637304 +328460414 3708610804 +360251705 108850366 4104695561 +1222877022 1222877006 +2196434855 3201778678 +4253472890 4253472874 +2139885764 2373870729 +3593332976 3233268628 +2337461022 3755500585 +125433292 2432561185 +566414388 1502919820 +966894323 4191786371 +1888263705 270369231 +3037749356 3292018688 3615686529 +1145476410 1585759743 +1214657581 2015547538 +3784497501 143361065 +2914548258 2607301507 +698935509 4175883882 +300324944 2114045411 +557806965 3420841788 +111207359 2164549500 +2177182433 711098400 +2581845653 3601517724 +2535372479 2757340862 +594539706 2201895115 +388749436 4127574823 +2057983903 2327923295 +2220235596 2676816055 +764658535 647797558 +1615881422 1477777853 +518275671 4166282982 +852311764 2563229737 +1374396491 1089295874 +2240842608 2995487043 +1134071408 861133336 3842003931 +452598091 2993172405 +1545648776 2407900171 +2702601676 1169563548 +994023636 421369263 +3111774904 3001843629 +4158538353 2749536240 +3786686438 153942005 +3582452565 2997376313 +1667797438 1667797422 +2422788822 1937926727 +1824613575 484913650 +25671554 25671570 +582342881 639196144 +1646226697 1646226713 +208524144 3316592768 +2351010869 570640807 +968240192 968240208 +2563892983 3992502697 +4093964243 635669753 +2060984932 3325961087 +3979043340 3926820122 +821978492 2225910576 +399343589 1568691578 +1281128956 14762412 +1212244920 1995438779 +28266291 3286325879 +2953773852 4275097100 +1695814488 1989833627 +3113220717 2326215058 +922526082 296894389 +629957713 1828842384 +664936429 1362641426 +2416148360 659631024 +1184976881 1092921473 +3766003871 4243681886 +2526726688 2888691065 +2579644186 4193403125 +321139206 1723557959 +521900924 4252288063 +1543153500 664106439 +4079561811 145277120 +628650197 1054196090 +4136941968 1275474592 +3343882345 726461784 +1831127587 4092212490 +3527716720 1914711363 +1783158260 192001568 +265152386 3016483723 +3031899588 1078188937 +573484060 3950571527 +3592641073 1252457264 +46014025 2588519662 +849979542 1460954151 +1277867230 2629158327 +3089859204 3759369080 +3202879531 1782129752 +1190479484 397815573 +224275717 272686796 +1167272643 1236029674 +1571071198 1571071182 +1994668869 929376637 1850297754 +1597787634 1371883419 +921423574 1307957687 +26668232 1217838813 +1965416355 228527516 +2298560140 191453856 +4257891030 1533490929 +4126847862 1296424769 +579251155 755006764 +772071450 2343356651 +1533272024 3057213723 +1617761892 2020483592 +1542017238 2253013223 +3837744506 3307875925 +1805752704 4016350341 +3093065956 495302377 +2337567120 3857630645 +1673472898 2821246441 +866913386 977299921 +2710725032 487181072 +708680040 3875045053 +278076870 1837071108 +3565692959 2975279326 +2044078154 371289197 +3841261759 4127199852 890813872 +35368143 475168524 +296842839 828197606 +4289715271 3369583574 +4261700125 4259738548 +758217649 758217633 +1738759421 2672537058 +3575653747 4103795738 +3268030911 3268030895 +597727417 2746116386 +2423109660 606870197 +236476095 4015034024 +292229645 2022533755 +1034201399 1094082956 +2169999559 1675159872 +1358895403 3467268373 +2417591229 2502582932 +3432519109 3630843148 +2789896676 2872134121 +3546784161 1831039072 +465501225 3601265806 +1922115884 2256785480 +2972100429 2972100445 +3892337139 730700186 +1948483460 1474411743 +3814949329 3332725776 +3232789758 1405627359 3273461769 +3451895869 1321001762 +1955615976 2449857386 +2998342502 3693189297 +2258016329 32064686 +2854196992 3485119763 +438150049 2414763923 +3810130666 1593157314 +3001404105 3734873637 +3261745391 4233154606 +2165000453 700707532 +270723606 2096529585 +4231651822 574953533 +4191358433 826808661 +4104200201 581267000 +2508374477 701961650 +358527797 3641973878 +2409268405 1570828215 1812506700 +351814038 3227190475 +4232625289 2944453550 +3565560421 4096271596 +3380522111 3380522095 +2229480063 1430774465 +865730425 2245752649 3027053438 +3258304631 833262416 +1182407203 355935516 +4159535693 2547484466 +2483296124 2121332785 +1679751517 4190276980 +2795744000 1403400467 +144547803 1797432772 +4125483675 863884383 +3064602340 1909367039 +2664729296 3633743203 +2322494889 2497919256 +3867934567 1432555318 +2758396439 3918078512 +2357212882 3865068759 +2105595367 2026945206 +3568816944 224490627 +128833708 3266057943 +349322116 1908100292 +1537198893 4206346116 +453427782 3517174839 +3126805909 2019982833 +1423714250 1423714266 +692297719 350640258 +2008144916 2164093817 +2735117943 442424646 +1089660448 4136348396 +3160686936 3160686920 +3868501705 3305279086 +1131817883 3456541970 +1210825597 433595842 +3370055676 855663015 +948129011 3920765580 +168892913 2048903012 +3927771876 1874339040 +1231919339 2309014931 +2579986627 3032865319 +3186116792 2103282515 +3059356903 4140754848 +2269571892 3616883179 +544351169 3568191702 +2461237110 1892056193 +1009464575 3602544599 +1864151161 1864151145 +4075418749 3971980629 2456998242 +4244574480 1434967093 +3975374292 3609808057 +983246797 255829938 +50390595 4251614076 +1763352625 2783587632 +22609047 1410172948 +37406655 1099461054 +2922793760 1601717107 +1520255770 3213926891 +483333836 3963800357 2574021056 +573258996 3188782105 +467942799 2001528846 +364378510 2709458702 +3402638372 31456347 +274244327 3998145038 +3004612081 3721200230 +1688871291 1962432095 +3264828431 1717523352 +4137582723 642197616 +794785049 2890225246 2386001615 2401695209 +2010267213 3975680818 +3620687316 1606807337 +1478393312 2550146981 +2391752553 3565212238 +1769507416 1623312525 +1356546464 3911732979 +987573378 741150883 +1028731432 830777941 +1584796152 2883471725 +2300532755 2300532739 +4077246397 3052564017 +475339368 2011290559 +516670355 418204160 +4074278678 1428740338 +1376363067 1613390578 +183731425 509226550 +1482957253 3936430348 +303685070 1287138127 +3264811661 3824694244 +3842294013 414498955 +2821197107 816314487 +1752298234 3468639779 +1806482479 2951495160 +3372839138 731205767 +931176045 4050907227 +271725245 4282309044 +2799832772 2044542601 +3476899681 2658622902 +2134233850 4208217136 +2432197409 2220910406 +1826654691 1215893596 +434025242 4242920693 +178467343 4137928795 +4046260349 652500180 +2609308499 776916928 +3280115606 1553244455 +3887141129 3838856057 +1140327498 1231995003 1231994989 +386133313 1064205788 +214064978 1744571923 +2981223025 737861606 +1959014084 2497027721 +4198051776 699119072 +3298223439 3798929223 +3660346926 2717780591 +2616268362 3937357662 +101822542 3688401615 +250549515 2371756098 +3630813116 1787954417 +1235691066 3275377941 +2895371846 4073121825 +3071982755 4061597146 3071982771 +1867158544 1114051875 +652823018 725572429 +4008509525 2332531948 +1233986540 3039792279 +2678150023 1429816863 +1683612340 2910839129 +1439286137 2241771390 +2321995187 2464311514 +3320726420 705978863 +2832775489 237740352 +1407685477 1407685493 +67179062 2209327879 +2906476277 2894285756 +2846441031 1067866451 +1934392389 3328680076 +3225830739 2441814189 +4179210368 3557194168 +3275202982 4136859735 +1961608235 975556514 +2130218029 1209591954 +4143536283 1703312402 +1190532375 4029256852 +1784913946 4254714938 +3328340971 3328340987 +666383302 1291419831 +3095048820 719320340 +3859821224 3548364395 3976791568 1863900867 +1705828052 3934623881 +261229727 660636193 +186387216 1726361980 +410696385 2782435302 +2129650405 280119408 1504727445 +3231925347 2751768540 +646397368 290588741 +3597844879 631682065 +4108343095 3022605200 +4076895752 2445698708 +3792342518 3432872529 +350870376 4098602576 +4170562301 2370214696 +3918113180 1404443720 +2096743850 1731340941 +1961390057 830272846 +2769385019 360521458 +2376481243 3618444228 +473404617 1760474769 +4052779099 2330675293 +2709591638 2895514713 +3447119879 2979213582 +1971263068 1393570503 +771453914 1020747819 +3927891418 1754742333 +541335244 2483175678 +3754307997 3791657506 +2511275989 2005488732 +3748336263 3553421188 +4275263114 2964405051 +4171569787 676103547 +775615461 4013105948 +4094545597 4094545581 +349497639 4062906486 +1996293074 1996293058 +3467782264 3709068111 +3843160853 2957918730 +1523437591 150901808 +3880475781 2116869123 2695013722 +1692009841 875991270 +1471693199 2786014222 +2866790067 3305931732 +1601127071 1601127055 +3922097390 3103484281 +3550464373 3283392489 +26429636 822996222 +318450420 3580141071 +1831268304 400655403 +799210658 2677256981 +1645800379 2936494656 654687297 +3417438013 3861394708 +1371062946 1371062962 +3791779688 823687339 +3768087867 2128365060 3405810669 +115612803 1545134634 +3054583252 816769198 +1888150167 4184441881 +1021056074 410251373 +3981666465 1263390384 +1239813750 3408446407 +876900838 2691408048 +2593779662 777290063 +3801162555 3850008050 +3119979468 2348859959 +327284451 2560075612 +3664733177 2905152111 +483446554 3263906527 +2739184606 3992652265 3306348546 +1584886516 890524061 +2741657875 2741657859 +29030837 2635769164 +2992904924 1136415459 +869861250 547803555 +3532614632 1606868523 +209811188 720157920 +3162291373 2369104911 +3414359177 4123520001 +310384760 2791706049 +3478863186 3198257157 +3900852194 2356488939 +9859694 1523983161 +731108435 3971432122 +2054218818 2540060430 +3428541050 769394205 +3657965491 3989432026 +3536566525 2976344203 2124281489 +899532878 3043119823 +2149384722 201746618 +1080638813 3592582484 +4262786896 135632811 +4197158446 9491065 +3710006185 2146942734 +736040557 2100317572 +1966323140 3887650659 +3976496332 3927772471 +136280237 4160418012 +837266763 3669347604 +1920813990 3778942529 +175890931 3418300794 +1294737213 4185251966 +2943726576 2887864147 +4242266781 2870551860 +4003446308 3380105897 +1766984372 1766984356 +1135910276 424933087 +3879146455 3535027046 +1175549448 1702684635 +1345023788 1616904791 +2603632780 3640800375 +2846652898 1251455817 +3603061840 1465256696 +1478349319 257983975 +688045509 1414577434 +328592661 1551492659 +3386739833 1086595688 +319805299 1961896453 +4058624427 1483011029 +3183912850 1371130565 +2471323097 3151451272 +2512184487 163539335 +726478329 726478313 +4276139872 2613095461 +3221767371 1656945144 +2310530865 4253086256 +3953240671 1159516606 +2890567386 3246719482 +4276086379 2776087156 +4280501361 3321295105 361020902 +3555566699 1521054360 +2063203557 2063203573 +3518953551 2124473422 +845928170 1237537371 2038080850 +1564007976 1564007992 +173280790 1481780401 +591909022 3928732474 +1159921636 3725957071 +3342561848 3427185486 +1884976969 661243886 +942319186 3173241619 +4206721180 1413799303 +2258135264 625451332 +2362794978 2362794994 +215600428 1725824087 +1632267564 1412029505 +846844633 846844617 +1567867906 1567867922 +3335372101 987820954 +2909234997 2909234981 +3650425835 1890474722 +446323211 2689088207 +1430828981 4135137788 +457156736 1698054533 +2813346761 4142566775 +215081347 2976252202 +3361319948 3361319964 +2982853857 1760342202 +3956543877 3285685324 +1703379496 4233225469 +1384915931 3449582020 +3813538047 3813538031 +2907714993 1461178579 +286250076 938167505 +399867057 907233958 +3992550132 1558249696 +1195108585 390039109 +2226670814 3424715113 +4288870213 2995470746 +1660844795 1660844779 +3697995535 1894198092 +2248987023 3299607665 +2924809187 3511815300 +3699738175 1697797438 +815205034 667273619 +3370704348 580206929 +888251133 1432589396 +1953172547 1953172563 +831279517 2632219188 +1665369596 1434716081 +2905494244 2521342680 +4283180162 1725790371 +2250754117 1973437580 +1205201199 1153307896 +2256406799 4279570267 +2529372571 4030365458 +1851790522 867098028 +362793870 2559406233 +3220697791 4065534654 +4128768974 38126414 902692175 +2150934253 3290689377 +4239332314 2711371837 +710772851 608029978 +1582873970 1620181786 +4116688286 288852414 +374031880 545210013 +3761270551 54452518 +1756553622 1738088241 +1531748700 1531748684 +3313123588 3816053065 +3963351668 2416555231 +3264006092 262047265 +4065550547 463253683 +3931942843 1882797695 +1498920623 3095578489 +2015521949 3140549428 +267710898 1079666729 +188853450 1021058611 +3647411748 3647411764 +1395963058 2918741029 +3313790028 1530334424 +967578770 2072379194 +1903920192 4063215583 +2124131575 2950516843 +1129420959 242473536 +508569690 305104299 +2159711165 1656132226 +2426027985 1515178848 +904522715 27174060 +654807463 654807479 +4267031967 918976842 +2238009078 4101721415 +166721570 3334708629 +3095271204 2457759167 +1976612590 1703934137 +3769178524 816899468 +2497079495 567376653 +1788528508 3763083146 +131919016 1354049731 +2475752959 1279252584 +3289183713 2171015478 +1692616409 2865268638 +2898344278 1930252778 +2411710816 2867462693 +3279359786 1765422784 +1456991832 436008360 +2738696249 844294590 +2120804381 472212898 +2910460391 4265002678 +582955144 1729169072 +3863536922 904481114 +4276846792 347847389 +4021447861 182526186 +1099000194 1267867209 +3068384017 4188357574 4188357584 +2164167528 1944689639 2025983165 +755026561 1497286934 2480311729 +1696536618 3858577092 3996929989 4263169504 2892514460 2813858786 +1410050619 559871230 +18285835 3258773570 +905605058 3076045971 +2276125353 990865432 +1091450597 1314941548 +4239868795 2627354769 +3822235600 1957348451 +3168905713 1212057200 +4185060021 1693717226 +3454057331 2345080332 +2249406053 3226554937 3343998265 +3134306519 3905502804 +2965005112 1835675963 +2501890538 2870440781 +3640968566 1939242261 +12142494 3249257897 +1788232862 100734142 +636851818 731629773 +1391358497 1391358513 +950033135 326051374 +3546449197 1736798363 +3868450443 1825212856 +371839614 1668508041 +1060285887 4225313518 3205774127 +2006852127 1827649246 +2538275236 3474167081 +3432585141 3389018602 +1335958427 2893165919 +3304454766 2602453886 +2347586713 3571093141 +1328319611 505488818 +2879687772 2416506065 +1527178779 1725709444 1890796511 +694780570 3407386749 +3720096795 4234738143 +2577009665 3464553856 +2915958345 1128140732 +3810021955 1237357077 +1874209953 4116142908 +2737145623 1655274510 +1422508957 3191080340 +250982988 100961110 +314276466 4011966821 +1929539941 903127766 +2484035279 2082110143 +13860307 535761708 +4272245686 2486579079 +1686165510 1020531063 +1799782491 989597508 +518937423 2305509484 +3559065430 1227132017 +1887149186 2492948661 +436972542 2537908678 +2738537839 1686425009 +3227938229 1857370458 +3138535864 1178512453 +3580161989 3001381658 +1712910832 2839862485 +664245120 3550294675 +2036151255 2191308688 +1339071794 3403565261 +1187063687 1780320960 +1781496213 3183240586 +561626831 385431963 +751851989 4176368250 +1488131308 4014215947 +698798682 2472486453 +882546504 391915083 +2266010504 1067455521 +1367051291 1618841234 +1190660358 3195417697 +3912512746 120540237 +2628838522 611822621 +1850985888 2601954110 2359138367 +4098048076 3521001377 +254313128 2227547773 +1988658185 2716326446 +596364116 1225856313 +2266166175 3584634657 3944589916 +4172917085 2593571157 3913653602 +1584613601 3691072579 +939512326 767008609 +3297626714 3657595238 +710058296 1411962835 +775254037 3542053130 +2018524740 2857501960 +2695384502 2666681745 +3943269030 2784537431 +1632042030 1354693753 +889294795 73206927 +14858615 2169421794 +3260811025 132063184 +2050737885 33811890 +4229634104 3591874259 +785327543 1729650448 +4081019174 315786945 +3364301241 1975798664 +1683911280 1890461251 +3130675215 3488352142 +1774233195 2040492968 +119606814 1216154471 +2703462196 3711729545 +996267620 3741613951 +1380697679 3648561201 +3140809753 3445375816 +648579964 1465095207 +1015889656 1247420539 +4277344881 1781643030 +257622091 257622107 +4257487987 3638853088 +3991517033 4025203288 +145376989 2165149163 +2004406739 704119142 +115087104 463168562 +276396477 2924546953 +776345780 776345764 +1421039875 1442900470 +1656574621 218696994 +4190759401 3572794337 +1476403033 2662287913 3778107678 +3579963818 2468533901 +2281232952 1153402413 +4132826583 2688903526 +2452196547 3664287466 +157482913 4021262278 +1168276298 3905426802 +523946539 1418478004 +3379935034 3322793041 +1244904216 1244904200 +2318389315 3427064188 +2121990887 2161743784 +2524391044 1631694703 +2488653920 3054733101 +2788643763 1545126618 +2905833053 84929652 +3651866015 1195798878 +2343902686 3424519273 +1202315089 1536030680 +1462406321 1776423766 +1582518046 1861494175 +276448013 4252470628 +1188774184 80178282 +2865994843 2865994827 +1763625324 1884174375 +394050940 4100901671 +725698512 3888385123 +1854086337 595115994 +1694123312 2900957512 +661438191 3043709871 +3392126200 1093040763 +3266368478 1516078697 +1997211592 777863133 +2674285662 1277388799 +3457558171 132040196 +3224689207 3392373904 +2664386287 4015604280 +133338902 1754335124 +3739591768 909269415 +2441635680 2042281011 +364710350 2714838650 +3574411201 3574411217 +3905089404 2785891171 +3774518717 3869078709 3883513986 +976981576 365671284 +2913005107 648435795 +3709534505 981652366 +163192570 1241432971 +308911341 1156859730 +1434373028 983208767 +148443240 1399802346 +1017950364 3040265041 +3498320113 2294702486 +132698067 1182738746 +1675970197 3605929116 +536689901 1218898190 +517302157 384959204 +3011705135 4074148474 +2229183310 4289295505 1736103711 +427256380 1392262247 +578395008 578395024 +651545667 1807738286 1869923511 2974564030 2644383766 3885840309 3505913821 433165282 2322347213 2899058261 1958014651 +3320860524 1497499287 +1727455862 2622130752 +2692987010 1442356381 828077237 2910597646 +2277242306 4206511815 +212249353 4083105592 +219023054 1528084057 +3597960941 3035775314 +1982593788 54270631 +961170865 3437378646 1680787639 +4172176995 3716060636 +247329289 805280120 +3939794705 3179546566 +1776402875 1776402859 +3111020233 2982923896 +694795259 745729074 +2524209811 1815555436 +269855223 1226477520 +1860791354 3547684683 +1086743246 2064693838 3326970447 +250464210 3284409030 +2229509462 2286988913 +2577659813 2425302218 +1406903403 3481489941 +4009185042 1551998337 +39162161 665578454 +1353912413 1726136948 +4030915253 3997885162 +1810196402 2351054117 +3158372383 2033844446 +1930029284 2396334297 +3721604657 1090734730 +2058335063 1496710356 +4256579631 1605677420 +3548073130 879035494 +1086446958 1596953647 +4021811700 1386117912 +126509330 1965580205 +814578561 3653429091 +961097447 355784096 +1585357802 3338399102 +245246582 245246566 +715879356 715879340 +995806728 2012370589 +482206551 2515329520 +3823038341 3823038357 +3728150596 346987273 +905365237 2750567565 905365221 +2959505792 669965645 +2565491598 1188360335 +253415266 691304277 +4139911508 3181702979 +1147997675 2729240802 +3117276423 2249388566 +239066372 1921576287 +3010895840 349617732 +689585286 4285813448 +2445892834 4245846574 +1881999557 2587558240 +3425094205 3425094189 +3209100888 1958896795 +2668116448 972233651 +1984339366 3609865303 +1415936134 1639758583 +3946346703 173681435 +887551668 1723134729 +2296263886 1137516623 +3082351564 3082351580 +1496728887 1496728871 +1244702880 2108633081 +3931562901 2076722076 +3415530829 3361234994 +379943460 1868315673 1731369800 +1947408172 1947408188 +2466967580 2520251409 +367626262 549644115 +1797640169 2508606424 +566703075 261533258 +807016828 432001494 +1470985825 1729190591 +2017972904 707362517 +1891658645 90207667 +497711558 2036183713 +2445577464 1673267588 1885989485 +1818891346 4244503813 +321775442 107515734 +596643906 541402487 +1800603452 2314767079 +771472801 954303942 +2150094677 330824387 +710763133 771885762 +3638172957 2086392994 +4237462923 799428782 +694725024 297538508 +3602766352 484329251 +897196819 1111832300 +2153209198 2005406767 +3195822255 2603500289 +4069735390 1780888138 +2952490508 2207017624 +2817948634 2610587510 +2866299656 2649203336 +2299439475 890552346 +1634166224 3935169067 +4084355280 217397109 +191979316 930668249 +2008790184 612197483 +4263121114 460112486 +353970649 261939336 +688752092 2085206353 +1651988902 2816614465 +381188191 593853832 +4158291473 1305727905 +3462582014 1638127466 +1439588643 920840714 +1272771301 1210759690 +2351181568 2633366789 +1259974338 827661533 +531628611 622038890 +449398950 3504168279 +1243223813 2886876378 +1350217455 149290897 +4099891212 3190043361 +2874115693 456170884 +3178640093 504500724 +886759044 3096201673 +2295946402 271373059 +1993037005 3424416225 +3092991061 2360945116 +4206395017 403387630 +4092259237 1274100353 +173648882 1000134029 +2301070648 3136224545 +4287800578 1422700542 +3601734534 3601734550 +834273419 2946661304 +3781397605 3841749312 4035356993 +3460757028 3492534302 +2883679607 183233094 +1414959638 1414959622 +2845631587 1199827549 +3466633990 1289790071 +3821906938 2529540765 +3341497418 3540209787 +1333146052 3675281289 +3437907388 1356357368 +3340373176 637666733 +3297139926 897852657 +1502980910 1103931589 +2435682212 783884095 +3782830282 3156211195 +2079014908 257276337 +2398893611 2398893627 +1478479225 2677833276 +629885230 844953529 +3372252003 1472581200 +1574094669 4291804708 +4262235984 1036360419 +1218425373 1885692852 +3958166895 3250088108 +2731380193 1085173777 714496310 +120082442 1052873573 +4033622176 441486323 +2252538983 2483991111 +2872532278 3190275079 +3160638656 1971082733 +4201868249 4201868233 +1734364021 831965500 +2095966924 1988665121 +2520517439 1007413098 +1197061190 2553727543 +2290760352 2124609371 +2826333853 3480232226 +1244169836 701209623 +908335379 1305704698 +888732636 888732620 +4050726987 1613694466 +692195194 1828609291 +1259934233 3531848262 +3546449191 359843449 +155272809 220590030 +1836034179 3743453296 +1928222946 1928222962 +1235799214 2730112495 +3794600828 2296151089 +3958428350 706461961 +2242411936 138265331 +2438711214 2172344057 +3108307790 1485448658 +2728876939 2633848949 +2013280185 2706880552 +14108839 4192689888 +4253533297 2377792998 +2652692516 2985366031 +3056217061 486610113 +2090040390 1647092279 +1942874407 937373491 1948649568 +1313417768 2596795443 +3482588747 133359480 +417524255 417524239 +2133192548 2133192564 +1281288410 165520605 +139043129 1156107432 +4105626368 1005017349 +1138269021 228328277 +3665548373 1173307850 +92932923 3933126120 +2372093210 2907031549 +3677910293 3677910277 +3293585962 3293585978 +3414952752 540057976 +2277369143 767087129 +872894260 640040863 +3146648194 4232593035 +3615573718 377651953 +3886559729 2663816806 +538206224 2417178915 +1208239973 462512778 +2849826479 364848494 +952683723 3129655791 +1104691830 596673121 +3862281448 3940614176 +714807117 4199626930 +2095876628 1231759795 +544667618 2276552158 2075220733 +585535094 3596661335 +3436385830 2521554391 +1859928602 1484860322 +4125541642 608710311 +734637307 586874569 +2497406580 3378661519 +968727830 4219357607 +3117744289 2699819642 +1496497414 1893699703 +3448241984 1372852723 +1463489943 2142488835 +1284896292 3021109929 +808120011 2660624788 +562672261 492619254 +4166595981 2171555058 +1717864701 759408212 +3205662339 1563023738 3205662355 +1192959337 1487883352 +3381889615 3705428710 +2232749830 2051227963 +3168523765 1057717146 +2307144492 2804491848 +1699722591 3682239624 +1174164778 3555940557 3937326780 423714626 +559733829 1774708588 +1139851583 855651902 +224150585 273009661 +1244410269 1620187700 +807840654 1524633753 +2474874959 489494156 3555753649 +2692891734 1001065249 +504201219 3004326461 +493315040 700594597 +1241618488 3095568443 +1691244288 2966615301 +4158616016 3321954980 +4074397645 449105842 +173433188 2851819647 +2850734520 881783973 +850072643 1834566192 +1295383350 3254416903 +3107721190 2139948801 +63408658 1678846382 +2572596509 2155814068 +2523656470 1403767229 +4107031018 1201992539 +2903936137 58669991 +3496794851 4267479882 +2340218947 2188457520 +1761139204 1136604255 +1368997464 1368997448 +2561024633 109302344 +1145886121 1705521422 +82057568 320074277 320074291 +2086077088 1559831013 +3947379356 2462478372 +3923091362 3554035822 +156973622 156973606 +372647402 3778916187 +1954479787 222195105 +1760730164 1777067471 +967556096 3378050067 +2539083369 2809988942 +3853203132 225234412 +224053586 1814007550 +2053511793 1207824600 +21526506 2421303853 +2360791197 3247106097 +3815008611 1511122634 535131950 +469192107 2974762018 +381019317 1968638204 +1040066980 962543067 +261194514 2484163909 +745925713 1604327431 +1772834029 3167057746 +3663161369 3931443568 +450808611 1874446364 +176319976 1934820413 +2253418239 1872673662 +4220531114 2919116434 +3633432001 2131777273 +1531085520 1994717519 +186948516 2766835064 +429981544 486718622 2896731 3977524399 +3783466572 1298706849 1563138153 +2223041847 3455413648 +2570118378 301489229 +1528771335 2031965206 +2515354100 4169061135 +2446115139 3516607542 +206113990 486480823 +4096410029 1962629650 +724042342 1442563713 +3834780060 2161521955 +1195695626 996772269 +2611489185 2864285814 +2582263508 2715385919 +172442153 3772957311 +2710579794 1754668996 +1920671806 1976811913 +910366698 4085993510 +3002510132 3998188249 +370407124 2506985401 +163579256 3304114636 +3621589506 3540212003 +2481421067 3764826708 +1830978172 1230203175 +2894158643 2867507078 +1273645739 2542585557 +2428584565 1429970492 +3599186358 3949162390 +3406166029 474118676 +3546501319 1169065744 +319225673 1023664120 +461200951 524990831 +1538658793 1218326990 +648118816 4030716019 +270260211 1322578828 +3812273917 359683646 +3408257998 3048640634 +1221758795 2153038667 +3217578548 476446671 +949619094 2101678017 +998559133 2544836501 +949218090 949218106 +3957404990 2441531551 +1184317243 1528334834 +1599874353 2719443767 +1305012580 349429092 +3741868423 2704377750 +3568589557 1077676186 +2911271224 1655755565 +2841857460 1532187215 +2607790833 1053592449 +2793002076 2766400775 +3356017529 1590409086 +4036241518 2183979148 +1148106902 1347195953 +761727880 20391709 +1347634546 3843445363 +4122436357 3568361683 +944174062 4018949784 +2931735267 4181734236 +494847947 1078851497 +2568675501 2568675517 +3255371244 1614041751 +2977846811 2977846795 +745627647 4118421089 +2157974314 2784897805 +2403119543 864797456 +2433217640 3096013988 +2269795955 1511944018 +3514985969 2897014493 +4178184024 1657376653 +3528260349 4020040898 +1790802498 1246197237 +3921958172 470940433 +1569031774 2536670719 +1541189561 2981380510 +1695760763 2555384996 +444071709 3353778859 +1642670332 504071335 +82981123 2078874097 +3018064729 2865742636 +609427184 1706432605 +3272941250 1285880049 4036422691 +63874542 2947646073 +3796114548 2771962511 +366007381 3112276204 +2457421329 207603308 +2072472471 2072472455 +2988534975 2988534959 +2161829874 2161829858 +3890590348 2667027406 +3429898275 3429898291 +4235247256 4252764507 +3561330106 4267247747 +3129343472 3129343456 +3817476632 3817476616 +1451061460 4218985903 +4051800847 4051800863 +3379845789 3207243060 +1572720688 2976993752 +2007853241 519822120 +72149636 3646364091 +2504500020 868608719 +2102603728 435438691 +1721164122 385568035 +4243564860 1766287719 +2582019227 2179416959 +1445232668 3745373895 +157746483 2961228 +3717745221 465365644 +1915264562 1915264546 +2556885649 2065461840 +4237385974 784469778 +1408893826 3879427997 +1202571812 635769435 +3238769339 2725868421 +3689258899 3000327687 +4005726289 758945670 +1246695895 3514373488 +1097107000 692013613 +3452108594 1519585529 +45880755 2179086647 +1935574175 2953368032 +885179133 2210956258 +472484311 4172993614 +264445912 2821398811 +3091208730 2421330124 +1127515287 3571651726 +1484445732 1835155647 +880177647 1220447802 +3961324908 498043137 +3840102803 3839453818 +1290551584 1301723288 +1370965429 1484962794 +1894513457 2444135401 +2250759651 1892985412 +3609857447 1580432864 +2670831257 875119304 +1453448992 2161262451 +777972694 3580707303 +1764148056 1764148040 +169359930 505653579 +4265194933 3923315708 +466375722 3970465307 +1613866232 1713812091 +3820274489 2928628392 +1766576691 4116440666 +980681859 2275613226 +2490905748 1295697135 +511341697 4148419075 3988866992 +3934621456 2961941443 +3430175895 1914775974 +2630014904 2126091949 +2181772568 2903916211 +2235905146 478305878 +3457369677 3042421554 +688127328 4179801147 +2619684708 3691115587 +580198678 3494121191 +932801017 2139214590 +5361338 1418094997 +3010244046 1108712281 +1247516930 213150452 +1421487528 1421487544 +3896855033 2652074728 +3062453308 2519702119 +1214664203 67951426 3023914287 +1745395580 1100156967 +1559729338 331292893 +1482082421 2241695804 +3914969233 3507708397 +1161951223 1418923086 +2110315795 3756244864 +2769511772 965251015 +1979207962 1169407409 +3647492613 1028737155 +793925180 3130900593 +241414520 241414504 +1462639047 76715094 +1531967077 1115824578 +314864623 2051178798 +1351553481 834278354 +787053089 1664670861 +2590519430 1093796481 +4157826651 2093621572 +2231007165 323649172 +723872180 1300591341 +1292821750 1606191097 1853187677 2529814326 +3425899124 1839582860 +1745163297 1183965534 +1686672475 2650901330 +1771003812 1864519415 +1795286556 2415738375 +422143506 2922098259 +1025333810 1731525797 +2869948111 2869948127 +2738801623 3537560432 +2580408101 1143136058 +2101352351 3404017480 +627993085 1439040245 +4166548131 2521370250 +3422541918 2176949225 +2994878609 804752883 +2250203760 2473064003 +1844502942 529391038 +2812429114 510645323 +1847735357 3999694206 +3984322572 3773960820 3860521719 +3006702864 788912188 +1063281015 1002008134 +943554168 691055616 13506285 +2501337353 3167600952 +1359973313 4209164125 +4040065032 1455835200 +3016993404 2452971815 2452971825 +8697471 3076872252 +2002614961 2771880082 +269999234 115569534 +780312439 2929788998 +4031305501 4031305485 +2196096762 163068811 +2822633021 2822633005 +1012417707 3141772956 +3122809519 3002831214 +3929463103 4082630206 +1692401815 2253794324 +4001525507 1114728253 +3289041547 3698272715 +1267058072 2073431629 +2509739536 3452723556 +1878534086 1878534102 +1605531000 203253252 +3314454906 885115459 +2647625258 2545732621 +3519507706 921734557 +3904005732 4233704304 +1588778728 1588778744 +2095732849 1680221462 +1614979109 2917276218 +4219150875 4219150859 +4097233110 1538495873 +1726840479 1908199105 +1834907923 1052285178 +2178757033 599523571 +1307001780 3653124430 +501366146 2368132021 +2447727061 2165074524 +3358331392 2904825988 +3378451346 2460733125 +3121127042 4011258506 +4151571299 1231646028 +843363009 3810878934 +3087741185 2078357469 +2415762369 1832661206 +2926606451 235773210 +3311970214 2907528323 +1061420152 268857595 +3272195624 810965227 +883593553 964870800 +100393650 2898053722 +4136131071 396733566 +2782233877 606109724 +942093568 1706585861 +2883770482 1520538982 +4133219321 3417602280 +2408043161 4148449150 +1631246197 4089059596 +2349103529 237012223 +4011335525 918831689 +1425771143 3577618322 +2042119101 1511170690 +453428305 3701934982 +905302234 863010495 +3497740837 2989627185 +176769177 123401551 +412305758 3508267881 +1250684942 1749739033 +3656707956 3694939612 +2247695429 472871548 +955403329 3865971264 +3812027715 4067917948 +2282908913 2821798142 +2979137171 1110225443 +1070129784 3778839277 +3150776336 1160922343 +2247028478 1135005567 +80051572 1118943176 +2915312983 2915312967 +1056204200 184535491 +562134619 4127864351 +2755570806 500236374 +48502340 3507424543 +1415883571 226066778 +1034566306 3036302595 +1176371366 3169414722 +146819297 2813508138 3685397611 +3272941252 827542476 2291320514 +65875618 180703146 3495979285 1807363438 +1969710796 2164153568 2647053089 +2203972199 3504044644 +2548722343 3439715574 +2703084551 2833788694 +1630692659 894783308 +1880998200 218589946 +450989418 3138493901 +2871878485 3943829188 +3903596763 570708164 +2509308565 1413196144 +3525565566 3116729225 +3919730676 3197138192 +4176340728 3598882939 +4109119274 3117301517 +3618987844 3599038495 +3665842970 302174717 +1438955575 1438955559 +3904778997 1483356074 +674909356 4291211969 +2006223149 1809052100 +2465044838 2986900353 +3365679902 2544454463 +2683805083 3722544991 +2616971054 3144099183 +1259893742 629047225 +3613857738 3343105139 +860916849 952964592 +1073105640 2562190123 +1667751012 3597209243 +1108634706 1478919429 +2166120001 2158518336 +4202406076 211683313 +1580975421 2075479124 +965662790 3305290773 +16397069 934575009 +660770208 3779550135 +22128639 311129704 +279971742 1141928873 +2974650787 3223077788 +3598247185 2974849478 +1925674970 160316102 +942213108 1553433871 +3117276417 1354754047 2148722816 1930440820 +824357770 2497669409 +571145843 1168846816 +965606016 444684179 +1610511000 405369319 +1412502715 3873962446 +2455248592 661900093 +1246556613 3156252940 +1741985896 3685477309 +2219685622 1140674262 1012335943 +4117452364 2750994871 +2046218730 3125612183 +730967783 2102810016 +1072423386 3189080482 +3436417496 1225692941 +3983401961 1165132308 +3627159981 64082756 +2293154819 1444796400 +2974246763 2120732020 +1851950468 1226321631 +2002009745 1788771920 +1994054827 3314114850 +2229550603 1045277533 +1559954027 2884698255 3391409780 +227307353 2903722248 +30682532 2231621951 2254019620 +2342176649 2916683564 +813621862 3183371905 +2197431728 3754513429 +3578128800 1561249523 +882227168 2813359539 +3991022086 2164795255 +563053638 451754529 +2375345016 57295616 +3739128580 2633768739 +1550142666 3199778355 +521710115 382981404 +2041234341 751959226 +3289637668 3289637684 +3624090090 836968805 +1984639135 197791265 +303730375 2088270623 +447222746 3499573309 +3474073126 2313931110 +609900342 2919860502 +245876377 2925802845 +3865393328 1390946332 +4202958544 3171028987 +1106453375 2584794561 +2917234818 1005630645 +2207759770 3881558265 +3968494955 1083330861 +3087920119 2702671024 +1976652661 1656734199 3985006908 +2700550199 807691427 2617751184 +2125598930 1146124947 498136442 +1977649842 1115313715 +163031207 2166869311 +3389615121 119170237 +1410940128 1136317619 +321056471 4143840358 +2348777792 2738386885 +1679311423 1256832326 +4003159815 2778109952 +872034917 937252076 +3592548182 1835779185 +2587056304 1859427587 +558514318 4081777831 +3151782979 1239137030 +3412393010 804198046 +936226423 3933158644 +2667804552 57859765 +1502581998 3289602478 +3103595712 4134814291 +965440240 2256924611 +2299618335 2299618319 +2701275776 2214053032 +2511862098 43875347 +1590847331 2822291658 +468166295 2308260355 +1698379192 1991747996 2790693677 +2232050430 2232050414 +4024298678 1348182663 +2269009814 2099503399 +3119677032 1646725279 32893622 45764929 1252852172 849654988 +304846591 1020554410 +193053424 222683093 +2902433899 2202152418 +2527159511 4145135216 +2465202788 3686665661 2838918398 2171261068 2640267050 +2119218375 869200836 +1163936483 428428106 +241473084 1719814252 +473376237 473376253 +107249932 473376225 +3905093192 381199220 +1016083882 17070747 +4262095651 224831498 +2049417916 2657278472 +3831186226 2913650611 +3927855773 716967220 +2679802649 956234728 +1051119655 3348737376 +62611612 3122459463 +2898187798 3245888246 107676839 +33939248 1597921429 +3735184915 2359734266 +3597545060 4084402047 +3889094505 35893454 +1330723703 1407229008 +1737773375 1299965502 +441660636 1291597383 +3761761145 1830372190 +1998536277 274513998 +3965520735 1970857608 +1879882535 2332728928 +775624688 4035261199 +1973770211 1822825460 +723312212 723312196 +30715547 2093932045 +3902339551 3486885677 +1428203147 2372283586 +956787789 330267954 +399214655 399214639 +2915972387 3198002716 +1319454931 1319454915 +2622387274 1630335410 +3319439695 3324768078 +1595646184 3620963360 +238150349 3408246414 +740021901 4241670116 +1555132059 2253463058 +4218831892 4246433663 +3373183532 2921495361 +2385942369 4031403398 +4260946122 4260946138 +3123788677 1550987523 77120444 +4207559788 946451991 +2188313986 2551632022 +1302551160 1302551144 +2352773269 1479660188 +3597267513 3970115958 +849464107 3753039028 +4116215889 2336581510 +154360266 1666324862 +285962279 4227960182 +3898539689 3898539705 +3982585127 3613316214 +1544394107 2434640527 +1597311605 1597311589 +3643281928 2199338275 +3819199555 1609026087 +983963020 3748916087 +3062963546 3228644541 +2600378023 1447621321 +1576787596 3242476832 +4254482168 730144877 +874358367 3878715752 +3354736386 3372587061 +1233278690 2586756547 +4154028125 596370018 +4242083399 3412242304 +134405850 4097153614 +4053862812 639907212 +4179620810 4179620826 +2017881099 2668246627 +3325123501 2897432914 +3127625692 1403756359 +3924214172 3527592071 +1086729508 3118855844 +978581605 925894380 +3236740719 598722744 +915607862 1738789535 +851968518 4141559659 +2268218811 3129967749 3109010536 3109010559 2401486180 +2651305149 2200012162 +2818930106 147581058 983061451 +3927162793 639022872 +4006011369 678057153 3423969752 +4093342534 1524004641 +344619370 444355073 +1313202996 1812245199 +3997352708 1322391312 +1376016575 327299665 +679755245 3039656978 +321285582 4085177177 +1119025511 1723768118 +1478947578 3065563074 +3764686077 994701890 +3495256463 2238223374 +3294784927 4147872118 3157361326 3982239359 460292600 2106522168 3747884763 1525606785 3547578449 1571793214 3463437534 1703999242 173173574 266364530 2251435172 1121768839 2329526582 1238163993 2011751262 3538432641 2878238760 4016550712 2903780504 791060301 1106450549 2083832100 1256010034 1894320892 832581413 649481358 4138887814 3181456111 3140589572 +442891455 1032636270 1301078184 442891439 +2210096159 2210096143 +1562289141 228989801 +2754045049 3412761951 +2648210053 13164364 +1099881269 2339973414 +774075497 774075513 +4119983181 3787691314 +3217578529 157671904 +3391998451 957671834 +3599172185 1607315100 +2581743671 1983360646 +871609234 1520676549 +3931824717 974274355 +1115070277 3959794243 3854350732 +4073687534 1078843941 +3407722551 697747593 3424195348 +893893196 893893212 +3502558614 2403978970 +400832326 4064484465 400832342 3796042529 +2932400476 2184889287 +1156254326 1245840981 +3194502810 1478134909 +1021772598 3112638090 +1616131811 3346576848 +797050693 797050709 +235190754 4084244162 4084244181 +3747891175 604822982 +768774384 309995989 3947879004 1337887368 +3839745712 4182085397 +1004446504 1736103933 +2594868718 2594868734 +3332600896 4082106565 +3527758847 3312775612 +3309863267 3572944071 +1091997542 3449472304 +2659462254 4161925433 +1345356855 2518979433 +3823525274 1571117419 +3159596308 2342536815 +2927001423 4085934424 3135493516 3135493531 +2436114794 1979022277 +1608643568 3769828053 +2842520523 4136808105 3601739172 3584961566 +1422188952 3522613044 +2168478844 4174457596 +2863496571 2512497153 4008385087 3941274604 3155188887 706513060 +2469103249 1048892998 +4029131842 1349790691 +1012366248 1361034464 +3206194286 2896651310 +3706489455 928902318 +1862614338 121597685 +888136883 145032652 +2636668211 2576004940 +1677882903 1677882887 +1039943838 2488700924 4113246042 1753754655 2314163241 +2433930471 1202005942 +2221395814 2221395830 +1957500056 1148676941 +233939880 2607063403 +388204370 3203270149 +977241198 536705327 +45375299 2230449788 +2999156752 3797364349 +3512701615 2605756688 +4288202494 1535197641 +3350086891 4283795729 1014095714 1713917291 +3913110292 2129041023 +55111028 555285580 704292831 1250704916 +1822140422 4278813047 +2568523984 1276971380 +3521072123 1568971826 +1075453637 871004412 +3895033762 458484739 +809217310 4226903321 809217294 +741321530 3372911709 +2512187590 3217630481 +2807903020 4277466771 +934808702 884714079 +3091803974 1630890814 +2942908661 396667306 +767930320 1199460157 3727934563 +2694499325 3501137748 +3216321832 4063630827 +1842715013 2084619676 +3306305334 1907157511 +1949931337 558486866 +3352399382 936757985 +3152452148 311257 +913306441 1718455478 4215012327 +603858108 1678040560 +2620256888 1414836987 +1497023897 3749182078 +1364353232 215550587 +3130863827 354761636 3417730575 +3237432630 393278113 +1929167480 1406751243 +1828776077 3729558514 627971570 +4149536937 3540384793 1984825855 3540384782 +149358926 1224190567 +1938696677 3736974614 +569904233 3799746904 +2621927211 796131490 +3146403794 2657668218 +137454343 3971933184 +2185153996 4153184083 +3672624405 2951206922 +3703406479 223333912 +3991638869 3738758876 +2338053523 4103982714 +1599456680 4263768691 +3138436733 4051207435 +628364022 3954825553 +842628009 2618170111 +308265039 1002159192 +2186663285 1624786714 +2097684209 771067798 +4225372637 632200660 632200642 635597999 1430920930 632200661 3657437739 +3578484527 1106195834 3946221649 1965815671 11275889 1936474766 3353031778 3143771786 2032926139 +1547253234 537914355 +3151725608 212473656 667061563 +1382115881 3629784728 +1354501685 1292524924 +30219925 927065779 +3739805708 4104473313 +482984557 3197964676 +116539530 3473151328 +893401865 1729645599 3328934093 3709660984 1116505454 +246442093 4115234948 +1095716056 4009050656 +1408724786 2732485338 1619266483 +1311308039 293602816 +2063508705 2145226272 +1209392618 1684821851 +2419020129 1534925750 +2410004121 503454568 +501498061 3679584946 +4090549543 4186571104 +126688809 203848344 +2074086230 4075935847 2267731946 3652692513 4075935857 +1485400832 1616081171 +4009185034 3640889680 3278491027 48105547 2271124259 3777722137 243660632 +3816675379 2366373814 +3909021601 1783839328 +537362361 711166786 +1473120562 1800960435 2940703949 +3758706655 3758706639 +3934934596 2079534300 +2482989128 1125198173 1125198155 3820999701 745557144 +1360070376 1405392553 +3615981361 45664567 +2922174165 93729116 +1950806025 346807854 +2423275909 3853984844 +1512783664 571766915 +3777860098 2092751139 +3335021862 2075238502 326580951 +762270762 605337500 190276009 3463519759 590713758 190276030 221606125 3089155332 3480297365 +360309377 1340051734 +1234272124 1275834417 +1863229445 1905533571 228463207 +1142788708 1204576356 +3279763663 2367712728 +3182922635 854633410 +528401085 1368166274 +1927706480 1355679043 +1849194898 3903930737 3037328279 2832134590 350707923 2510976678 3141364781 3141364794 +795764458 2552739141 +3835815227 2098931711 635165668 +1665851943 1977746294 +2480955968 171616965 +3527491278 1800205902 3400916559 +952251809 3675822642 +1737551815 1619065709 +1001088026 3358879203 +1344049522 2398680691 +2575779030 1490674368 +4221630251 1231362210 +805511769 2706993749 +1310005701 2956431628 +2424731819 3003056344 +2504588115 1424204730 +855153161 1180335160 +3137103699 2924914618 +2081001868 2081001884 +564440479 2503823688 +3460030631 1329768182 +2099494372 3812879871 +3052009336 3612381677 +4078208267 3024973917 +2133922548 776001039 776001049 +2410969395 2049837238 +1918975010 823241109 +1308211630 1847545071 +1104187784 3506140797 +2562185907 476923852 2349336119 2349336096 3666084813 +1743618090 92798243 3540648255 787720163 2179370393 3967111146 437687413 3667993961 4154356947 785091514 742683930 2816431970 1021459141 1449436767 2408684668 3976744941 1045567144 1100874362 2707591567 1358246463 3887475492 3981431200 989719158 3749026851 3805380010 3046129705 1768527194 2453700883 3052520852 2863299163 2680767677 3374741525 1340989070 2843892612 3355760638 1767393019 3280146706 4071585547 +2161237711 2573320152 +3704491803 3009529746 +1346174315 3137531764 +107109370 3398506935 +2526096174 881260911 +3654311066 1191420278 +3184443589 2440656410 +2500992238 2575534767 +734866239 1765849834 +1240344577 1405154644 +2574003873 642606944 +1998731960 1122135981 +2410612438 109560561 +3095772984 2995520804 +4076994826 459615333 +2704598538 2704598554 +3704309548 1937767797 +3916325406 3069318808 2521076265 +2961735246 887018703 +3715670980 1760152991 +210921153 2339881408 +299985458 2913463971 +3633767209 2781474175 2641803928 +3156754200 3974199293 2875643162 +3271156835 1494966215 +3108599815 3047682838 +783571341 317257970 +2180005316 1362181001 +2539756925 1678846142 +2273130062 430894509 +3992455923 3992455907 +683555901 934061491 +3185027582 3185027566 +1394998099 999177604 +1170358132 1154081680 +1115300198 205689729 +3145376442 3691915997 +3003235715 3003235731 +4153758964 3021257744 +3286744281 2092819369 +4283011294 4283011278 +259520662 3527694311 1461240195 +1051723807 1963824109 +1660509230 4293032302 +3112800564 1200592089 2147963272 +2609911400 1272137149 +70611607 2998737685 +974878264 4294148416 +681495270 2055727377 +3205971204 3583315295 +3673582036 2250795816 2246613177 +3588182578 3767428261 +4246617027 4246617043 +1748599842 2986869583 881525141 1748599858 +1104417313 3984968525 +1263688606 816200105 +1293974390 2635392854 3760347847 +117969437 86435441 +3511606629 581232778 +2423147619 3231858634 +2356568414 2086356713 +1450949838 4073338959 +2131660602 1038841931 +2975001557 2953852026 +347623634 616643513 +437921008 687527897 3867878732 +3988161662 3025310303 +1729310816 3702666154 296525627 320189599 2747830360 2738169651 229415167 +2711701772 2095447543 2095447521 +4144473765 2248889786 3185046493 +1340365170 925697369 +771035450 2901009143 +2701419766 1877667655 +29459059 916478746 +488942040 343834912 +1158365683 998706762 +426050602 604343835 +4018906610 104883673 +1102380490 971736315 +2858515105 2858515121 +653792288 2022157939 +2978149417 946058126 +143791642 2549664491 +773786561 1156394368 +1585855450 1407923517 +4251444712 3532581931 +3199921134 776038329 +3561005238 3619487367 +1872695484 1936152568 +1201147001 1903224816 3846229064 755078475 914235747 +1963139052 535511191 +1240993201 578653616 +4217232084 4268737577 +2531061548 2848752215 +3088012130 4224311933 +3673316025 1686425918 +1711796602 2655660629 +1617202251 155769346 +551830905 1079598440 +876080280 3423171405 +1358535371 1139715458 +2330591764 3261154671 +4247725752 1228534701 +2317793472 989124165 +3398582421 3189254986 +1148745814 530935665 +846949925 2639160364 +1558894950 3632948890 +2103460967 451091556 +2581274846 2953584625 +1000860114 3142915483 +1375260059 2779491076 +4194871675 4089648371 +2832505501 2893875131 1672439092 +2991288280 4139253892 +3366379957 2478133244 +33362869 33362853 +2079323634 92614555 1269428498 +3670122919 146987940 +1326396788 1326396772 +671845383 176536836 +3735395708 3844155436 +1714154804 2466910845 1838862861 1838862874 1459851123 +187788643 3039629383 30356188 +2918678335 1319355922 +1460161413 699896239 +4174690714 625244599 +1729008791 2290800431 3146921273 2509917115 456158342 4079531140 2113197364 1980584708 1345189742 3036255215 3952004374 2055774885 +2735648510 3117122146 +2089856012 1710819160 +2912664225 2912664241 +3893886067 3502401804 +2746689713 1783959216 +1967641399 747365015 +932464461 3412868667 +4230123838 34235391 +419372250 865757995 +1006652718 2725871481 +1398751601 744604676 +663094619 2465885778 +2694837872 2510104835 2865765552 +2693872370 900347067 +3202579376 3177600566 +1807248617 3255775788 +3791591806 1117069641 +2664115725 114916964 +1351418667 3399974429 +3821792375 3821792359 +4007522417 2456689435 +345064622 212606766 246357487 +3319546915 2629780252 +1159076994 1137631413 +2747544441 200461129 1188890494 +1538444905 664748997 +3166090301 3166090285 +1096641227 2970557826 +1841290725 674962698 +1763647106 1427192505 2654021575 +2698779694 3843125210 +1983884019 423238796 +2866879917 2209206139 3743165461 137480500 4148323505 915170243 1032479667 1628233905 2906646599 2065035075 877877683 3822990876 1200227968 2092766914 +851671667 3074589164 +1631141314 3474733173 +818702080 3787865635 818702096 +461852672 1443033107 +1039534834 1817387477 1039534818 +1353485661 1554155874 +2528219530 482201242 +1448189527 964444902 +1434330954 1434330970 +1140171921 3649960771 1758072920 2472528233 2601363044 1758072911 2360479824 +3961411669 3961411653 +3124616871 1640620211 +1593045898 67658285 +516634501 3921872537 +2866469041 1500069718 +1133849342 1132110258 +1484597969 503998214 +2626688160 3661975903 3622677796 4267987552 +2116422137 3947677128 +361489204 523676367 +553444834 1189131309 +261296485 3917767162 +3346950361 3841920392 +1954147979 3874653396 +754857624 2625166372 1815081293 +487494251 3868659864 +1257036462 2698788847 +943336000 3010138352 +965495540 2346319376 +3436628496 3436628480 +1336247008 3523309439 +1828011406 1828011422 +2348177581 3063449360 +2627118510 675141618 +4008052214 1871655241 +2364151116 3408771520 +4227803380 1796543406 +2424285123 1005918204 +253975973 2041342650 +1098926611 804559866 3294414451 1779528832 +1075285282 2989434142 +1785694046 3952220415 +1167698567 401044118 +3651635461 2814161626 +4033817391 115817182 +2403727537 1009155750 +4253929988 708942943 +1890108811 3836672450 +2461471464 3727868733 +1845484118 2143597937 +2732146618 3677228955 +861530357 3414800810 +4035715572 1382232809 233981278 4109508110 +3456908821 3989139642 3989139629 +3129327938 3801037539 +584044510 2871278185 +2827332659 3226071968 +3186341567 1168848171 +793587536 3330374371 +947170194 3250712122 1906972371 +464744505 464744489 +3290642658 1112676062 +3855268903 2702165689 +3626659463 3519807126 +3859946080 2008979756 +4217685386 1235417147 +1596021106 1596021090 +3740894120 2401535068 1499797461 2865381739 +1337025308 2420049169 +2280216734 2421408909 +485345127 4048611104 +1927059213 3728853362 +1737870511 3218159480 +1739312258 1739312274 +2556766549 3837817852 +431033866 2137227621 +3925845665 242444464 3925845681 +221111493 2218729990 +3677544002 2873923677 +2824292580 3060627628 +643460871 1734133782 +477008634 951356464 +3743100521 3938937240 +3380342472 4128826571 +1689576531 3687018156 +773455958 3907946353 +111908460 3961375745 +2327300263 3712937351 +2706023533 2329256198 735271621 3622074311 1434507154 2413144307 886270232 +2162061578 3895194299 +1607465447 2721287667 3144050336 +3780368592 2264813429 +3594684359 713850564 +2255044747 581999298 +1366191506 2326167597 +2915484268 875359744 +691034900 2230303909 3863804765 +2052914010 2773442501 +3706153490 3528194629 +4009756617 101466488 +833496206 1103121898 +3121226863 3781414843 1291279032 3121226879 +4290412215 1234532870 +3068640570 3068640554 +729513932 645573989 +2120621670 2120621686 +3133333070 3133333086 +4127351954 2299322894 +2643586814 180042207 +787043507 2354075084 +715421542 2263348631 +1864312829 2005128532 +3242588839 3895039200 +674174201 239093961 +127360055 709241488 709241478 +2689708316 924907472 1443088396 2090454791 1945365239 924907463 +3973536320 2924195012 +3878483425 1398542588 +217664748 3102792806 +2045363097 2711617493 +3592248782 790180056 +3266590794 2291330118 +518858357 1501724698 +3908345157 3621049463 +529763738 3968326326 +1602985936 3869018875 3675106799 952931445 3742217276 +2281952021 2817524028 +1770416207 2695314347 +3829222648 295265675 +142026799 2190754296 +2902229864 3321986453 +4199754461 3991697908 +846865672 897263024 +1523379568 1729415901 582703604 1729415883 +524603210 2203210107 +1104192073 826176933 +2370394546 477639461 +1348285306 4239919389 +3696259027 3874385984 +3956633622 2602663159 750237894 +3832104330 465074235 +1598163597 2180422628 +2897353319 3812569107 +1703250954 3678106555 1039502474 +1284824100 2992016575 +2160902678 900079329 +3866022058 758682899 1785887629 +2898417221 988663450 +3936762128 1940640803 +3900623423 1050173736 +1904048869 2374530668 +2039740550 2039740566 +804636546 2766586763 +1337151293 103199504 +3728814683 1000490308 +2810540453 1544677036 +1985511600 4250047765 +512495683 1501403516 +3770380470 1795423895 +4283991480 4283991464 +3568657026 1843855374 +2211132976 1252173746 +2681511827 783758444 +3134207962 4022856765 +2595340568 2647849165 +2775412658 1189328663 +710058301 3263635129 3938667748 +2350501249 228491776 +3516415535 564782062 +4164741352 2950866219 +1311700577 1961745056 +3028036521 3363355406 +2646381059 687035888 +4070728107 1588753442 +2077204507 2077204491 +2738231944 1982579741 +3018729270 3018729254 1978120721 +1693285218 732050539 +2370144980 947489721 +3262825126 3443551063 +2901016485 3646779564 +739288252 439571431 +958221430 1595891153 +2541665568 1781549703 +1792848670 1466824745 +498378910 1634037929 +3971631118 3971631134 +2570211932 2954020300 +989085513 3957900217 394239982 +2938861199 3525150785 +1774353031 3808545887 +412332723 1914936864 +1097953453 2996068434 +3781008948 4264732296 4200598489 +2164214818 876767530 870635907 +3865552902 530763335 340441558 +2844053022 3874414142 4195383615 +2015333264 2846405557 +58769302 3850921642 1367245638 +3722820956 2896762833 +766358388 531357151 +4212048413 3469305876 +1838363027 1327851543 +2384312508 3518129009 958412149 +2829634033 1924523622 +580658704 2345659189 +3650219454 1052328457 +659170286 3350630329 +2815817729 919955862 3891607345 2815817745 +539521597 3702248980 +2004404751 572921230 +1068537742 3506345103 +1862293402 957828450 1468655467 +4115956258 4075917099 2638504098 +2766214193 300321542 420925652 475636152 487447545 1399770162 252818319 2158897876 3222879186 1399409221 3129155676 4052309022 2840264329 420817752 2371029830 282491286 1881847651 3923890678 1928653753 364808691 329342729 3896489099 1226605523 1106242637 2105242909 2199332906 3105831868 2133995196 2849063174 981907933 2497909552 1238080960 3149201677 1945507395 3132232851 2492587822 320372969 139513615 2577523710 2524972174 1258031379 2244955059 1995479891 3879639467 2560077 1471571186 2825401057 +3955535863 3955535847 +2169829705 2169829721 +3572489268 1877241940 +649306253 2223251455 +234464796 469794311 +2970091923 3712391435 +2423049712 1816067246 +3345801190 648258697 +1104338112 1592885843 +401176267 603225070 +3591297737 3212127520 2091589673 4084032495 1658405911 1368035088 3617429716 3309287038 2347579236 2325248606 129858822 2854919224 1029202496 2122907860 2471738610 4112212978 3703894597 +1931837742 1913281391 +1267289075 174581379 +1113724571 3486164345 +3044587566 3674861679 +3956608977 2486465558 +2814213579 3662481044 +2866032136 2994194858 2626844301 3145193418 +2912406578 2012639923 +571585490 4187541613 +1107054281 3420859430 3032197306 2416767890 2325531780 706254403 1127716271 2603656771 2847707937 4122476075 3698665725 2272310645 2308852279 514529389 2218177599 810425698 199636527 308356338 1144497437 3458120118 2086912857 2817292241 2232919982 901574787 1334768027 +3104349437 1167008322 +3291808809 3291808825 +4267193627 3400706782 +382772581 382772597 +3998900379 3544585220 +3351612160 792988379 +2947349801 3058861966 +798218924 2445360343 +1300899566 1259563897 +3200114473 3200114489 2408322713 +126463780 29275583 +1196227318 875499847 +846191815 756583766 +301152360 2850147243 +3699164350 2741714829 +1686397163 4216441195 +2533472551 3736500320 +3773229228 3078637271 +1027087254 1498731617 4115885361 2878626474 +2886283820 3674638167 +1641512086 2620989489 +4274814773 1357660284 +1382227742 3490315305 +519155244 519155260 +3223159352 2792619579 +2203796132 1823074345 +4096893683 652845588 +2655190359 4076826569 +3255786668 707715777 684651968 +4035858792 403318461 +2566965890 4292411037 +3799824723 3713514938 +4124419964 1584057187 +4235734171 4235734155 +4184373070 621355474 +4256246934 521588086 4092145703 +3606205351 127449235 +2316137613 605805410 +1914683365 951888460 +4166616891 4166616875 +4279745519 2462495124 180470608 2516238251 1109736694 2107050467 3254263170 1033213168 3236613219 3471919095 +482640801 3931846262 +2327490045 127565612 +3952970210 3405778627 +3006162035 1796990268 +916432184 894506797 +828764961 2817554246 +771006685 890846196 +3800274046 321045078 +2737017416 2593671860 2707856024 +1300141705 2269575598 2730167545 +3036352954 2705123275 +2797359548 913615601 +1394770181 2863665005 +334521421 2959992114 +3358583598 2702666169 +138744071 196726272 +619010004 2459175208 +2606931556 4151145 +2389727708 383612241 1335864976 +2975253251 277573350 +258402579 57584535 1375791340 +3968063793 3539432406 +2431640610 3932104969 +1606216496 3865459843 +4225286781 4080675540 +4078588610 1953515381 +3698196987 422603589 +2314214188 3539312325 2650137846 +3898008825 3117052904 +2113340265 29521113 2855453502 +2675920582 3681092023 +423232883 693539852 693539845 2353307267 404164650 693539866 +334335697 2723721036 +2410428908 1365388361 +3045850985 2950300655 3203778012 878907982 +2752623804 64979943 +440682527 1973310172 +2976415735 3843200169 902179444 3874778762 1048670672 +596022050 249142915 +1675492817 125210640 +1584364380 92221895 +3752608388 4016188281 +1432832283 1432832267 +249828814 2458723673 +1109014682 3857618530 +1026179775 143069857 +135227908 3024348233 +294861825 294861841 +2744253435 1428030490 881371461 +1303382936 1860909349 3242915116 +4069997349 152181548 +3815094107 1411359826 +413847863 63971945 199711110 +2450480047 3737046033 +2037511868 3932645863 +3255824853 1410970204 +1602527054 2881931225 +1835268530 3747887437 +4250796674 113571466 +2026660690 2076203525 3805137901 2970987774 +4091179569 300008240 +3267173706 3123531431 +3799980279 4201265517 +2098492492 858985377 +2598190119 4047876448 +2530569538 288400130 924794699 +1543452831 1908810312 +304605251 3620905340 +570604960 2109605951 +2172635489 1026163616 +3026544840 364245471 4117470657 +605930227 474205837 +458072512 3140854099 +3272902953 1112796056 +4210545679 2224511345 +219231410 1636789339 +4057133479 1593617330 +1428561867 3590589570 +3184869415 461167148 +1581088773 2330968707 +865664952 865664936 +3594015700 3518326079 1491995790 +1646286263 803663632 +860317727 3630753992 +1047651069 140509065 903653950 +4255329713 1880497238 2457247837 +2995523599 1345827931 561858456 +1057515913 3275629240 +501239671 1791837684 +2459532963 1789024924 +992320857 3519174653 +1465292612 1630101870 +3237920949 3938272332 +1344477532 2202069959 +1944816502 4247208371 +2869039976 747380304 +561976175 1115612998 +2199055689 3529514308 +1997548040 3833939374 +3895314782 3725852393 +3684682388 1351345913 +3221462773 2369552427 +399413502 2016296905 +621978273 1147630288 +2965005118 1936341663 +565559743 565559727 +1286776556 4155178228 +3876621164 3490887028 +3976895918 3585489145 +2477912674 3477281131 2980119394 +3263860268 3263860284 +1284230599 1192554560 +3553299009 2031417667 1588343664 +4080541343 1390038364 +4138992697 1792068911 +1496251463 512846428 3795233996 944508137 2225568762 153375616 1982857212 +777368982 2263669553 2263669543 +1102091472 4228080459 +1809436569 576160335 +3855925691 2297231730 +1111751537 3255096038 1402470401 +1038255012 261438271 +280116740 1285005385 +2959540642 2169168137 +3638304398 4035189145 +3508741777 1575874614 +1650922558 642047391 642047369 +42337705 2034670497 +2141783662 1695883065 +3513223533 318592644 +1927795870 2163455167 +915273155 2759451114 2759451132 +1017064431 1569859886 +2911913930 69272301 +3072731968 717505804 2434143685 +2804686763 3581270580 +844060432 2301125560 +3856990811 4223885403 1889453380 +1287268834 2869948099 +2533670612 2423809967 +49488067 49488083 +3399933765 1236367756 +143605375 4169097726 +2985932163 2937634109 +3410670700 1479042998 2239209387 +3299820647 115912246 +3100640364 287776892 +788180288 882818003 +3755710568 3467701172 +3347679133 3128982580 +585593257 2606230798 +1510382270 1986369801 +562891477 2829904749 2785545546 +1787784382 555888073 +1586136469 4003710010 +2931036410 3001423317 +1438739659 1685961103 +2274006049 3014688849 2150051830 +1445598840 1564920292 +43292428 3523585824 +938912435 3427710924 +3764687231 4002687804 +1471987915 395166261 +1599785402 1478271352 +4235193462 3660660177 +656172094 2481369438 3484536223 +1557348226 2727147957 +3089254272 1576439429 +496528914 2834646597 +6064863 913981153 +3353969773 3556372808 +2040937309 2040937293 +995008714 1341184984 +3201452986 2275653674 2899029635 +37496819 768238989 +1395535705 1564152021 +590879878 4149536503 +2574000667 2688135314 +4198879135 2598754120 +73829471 1282341256 +1911588462 3416497977 +1466696025 2440385935 2409823294 4161150750 +3480231150 362893678 2071825071 2247311720 362893689 +3122525037 2888090066 +449375760 978240309 +1422988550 2334398583 +3098335003 3541475218 +3909098243 226938051 +788695191 2549941670 +880827740 2745237196 +2997226410 3848559757 +3432498771 3432498755 +521046405 1759673420 +3152040068 728230255 +2271113124 3182018345 +3705154404 206327401 +2954526380 1687417537 +1321792597 1532535242 +4180375087 3397638011 1852509176 +265380972 2461516592 +323082592 1105460551 +2401564319 4130356318 +2227247855 501735226 +3753988843 1923417358 +4276765785 4099569470 2747897886 +341675370 3210603865 +2392897690 1653087758 +2090848156 2090848140 +250155595 3286748180 +3667311675 2992331187 +2805902172 4199873231 +3677113010 4280775245 +1391846167 1614877314 +2610198312 314020861 +4009399215 2340811002 +579603814 765469361 +2472028530 3134022126 +3514726572 2106203188 +2853257847 615444707 808165712 +3079114697 3009894766 +1475523589 2014405594 +2523324636 2683566663 +1751235125 2262311292 +2406897600 2538349395 +2681688137 2770648249 +1039941082 1846894123 +1294671391 864620298 +539705699 2881205161 +2760511285 3068543978 +16879966 1193543687 +2190820709 4126948844 +2225234376 2476731851 +1686029282 1686029298 +2884295422 3668762573 +552923917 459664729 +673458218 484219163 969817220 +2789837349 3930790371 +3080191856 4125048908 4292438536 1950817603 1626549451 +241470887 1330314742 1330314720 +2155884685 2436195700 +3323887032 2583685307 +1243456572 3094322916 +2701800561 824081718 1245045283 3258947943 4094725606 +898582475 462292116 +144248729 1147683221 569609672 +4049434557 3005447828 +3035009579 2794488980 4059568573 +2832505475 1236220970 1643029949 987484784 +2895843629 2380339892 3530210461 +1727335348 3351342159 +4036870790 3837590349 3519801329 1316561026 1314470135 +2195172993 4188148145 +3061913189 2989900012 +1299959906 1541999189 +4086558623 283260744 3692889675 +323299624 2111818237 +2396766294 2268585706 +417137467 2794225619 +3158471383 865781862 +3281507158 128497778 +1537477853 541081588 +1744112964 4207147823 1744112980 +3092931701 2873893930 +1399052966 3962647383 +1850948399 3691391736 +1235254103 1050814960 3128777161 2303198420 +2167915050 2496047131 +683547401 742690616 +1939559780 4113543067 +3181984464 3181984448 +2547839153 3251562160 +4221306959 157896369 +2187991559 1409743126 +2570714310 4232637367 +1244199152 2927616451 +2832899156 606345263 +1556307750 2462462146 +4279544758 3652923777 +1148500041 1789562299 +1084860697 1919182485 +3329414632 1321647147 +397508550 309077175 +2909187442 1370059533 +4063149807 781619758 +2993905068 2543613399 +1826733161 1311921614 +3760886062 285379439 +2958822808 3832285989 +743063626 111910322 +384054718 3383926494 3342899721 3342899743 +800470977 2161171696 +4045754183 3550696004 +1794350284 2168231380 +662503799 2697547334 +3634784154 3520322933 +1891169272 1891169256 +205667932 2823301841 +1216133806 2054915385 +1731301213 3646953300 +2670223472 4026061682 +1025284776 3396404755 +3683587641 2226303115 3820571656 +1072000623 86825134 +3606670233 61104584 +3149435381 3149435365 +2374277626 2310555331 +2893107164 2893107148 +1704162614 1795808313 488735771 +3481047088 3157134237 +527361049 2492535639 +2244628778 3346908429 +350499482 2101061757 2101061739 +2567779884 1344221876 +542476806 1201495665 +1235246404 728945183 +1766220720 2408155336 +3993597760 4175870419 +1286042888 1286042904 +3064260744 228199947 +3053417362 3532641998 321056453 631266525 +339233927 3452358906 +3321857261 815546432 +3121411561 3412532696 +3830675272 638489164 2397457905 +394708371 2619934330 +781386559 2423135294 2237027051 2423135272 +502059403 585782438 +2649887263 4066025121 +1923049864 62726307 +1337325793 1551288864 +1206370877 1859569172 +4240182361 889679880 2562031401 +287943173 160867802 +458656860 1698624711 +1175012171 2341793556 +454054494 4172392937 +2497644637 925941406 +4081019185 500340784 +739918156 107875849 878743986 +1201649266 1422807910 +3445692765 2900028788 +2908257447 2303474409 +633799010 3168817327 +2844042667 1853017890 +498752673 1834996086 +1646773807 3089147771 +16015617 2176103552 +3589977399 3449717154 +3784527024 2600444756 +2960703092 2654036168 +937025716 2684140367 +556904376 4181171899 +3106533026 2997398050 +3314744358 2486996240 +2989371767 4122467910 +3520641501 892114676 +3078322389 2891921226 +2172845201 221820470 +2255161309 3883550006 +570013521 232071245 +835898730 892254582 +3674738132 3674738116 +2839624608 4232725540 +991835503 2140020152 +223667117 2845993298 +2335975198 1496487111 2374786878 920392642 2374786857 +1798840886 781110202 +3432020138 2976773019 +3284582200 1776223547 +1561549057 2255821952 +3345180019 100888288 +3256518104 4183422240 +1266359141 936124396 +1421834155 1441109967 342450740 +4049743761 4049743745 +1137552041 1707321358 +1976104158 1350107216 559833987 1230600553 +3258541275 173400622 +1277563628 3421489544 +3518830641 1571624240 +3886471435 3064441949 +97336472 2692842921 +1074698036 184026831 +75837028 2290331803 +79641554 1259023237 +1767278185 375205838 +924619062 1105390994 1410519740 1984936799 3369253749 2833073258 4260886318 +383502786 3973644238 +3175434368 1006093403 +1573510307 3322126523 +4086918529 4219953686 +107576519 3742330198 +843149062 587318881 +3461298984 3422575444 4005175293 3422575427 2909930384 +1629266248 672261195 +357344033 2297756207 3881529940 +2714692944 146773219 +4261700104 336475463 2675677324 3907408523 +1630864491 279958159 +4256959917 2652890910 +1138209862 311478839 +1189285828 1189285844 +213597842 2630057925 +3510255562 266235745 +252931515 297346152 +1809788077 2821574649 +348504227 2033169808 +3011398870 1708324071 +345463742 2219390153 +238781406 1169200767 +3444662816 4174795428 +3445181615 4069767032 +2549362480 1701202069 +3812292179 3992845619 +4133054153 2545733240 +3164597026 2857863353 1927913533 +477763722 477763738 +2063040533 2075624122 +2803020840 3547044887 +4106650536 4235859925 +702637364 5998425 +2505468180 1404065268 +2214940740 408771337 +1646100897 359862368 +4205252762 1721970275 +3212098543 306106407 +1781700236 3114466913 +4293322933 4272904711 +587123024 1729554659 +2011572145 2011572129 +671686246 1230325328 +1508578804 1508578788 +3534488899 3888924778 +2371096675 520517328 +1397829751 2594687529 +2278577520 1022787413 +648036827 2840046532 +532344650 1728679646 +3862634452 2717523630 +1446587509 1911650911 +2966971614 2966971598 +3403051396 968432958 +640413334 1290370753 2889003122 2943889266 +4003915543 1162199828 +605675905 525109176 +101576210 379115357 2582496851 +1793936623 1848285732 +2480999432 874104611 +47512127 4061831676 +3845884267 3845884283 +64698561 3541718976 +1397095600 2810222349 +3024395130 4063224917 +2337159388 673415761 +3820996278 3501907210 +1113285751 1113285735 +2538071132 2183953617 +3068291506 2557240101 +2824025192 2891078661 +3289925602 620445150 +1136218020 1136218036 +811993012 3835568207 +1856315812 3522426175 +2506370959 2506370975 2564792283 +223309493 1714794192 +3461475924 4174822764 +1954574741 4277769862 +2720494998 3659406129 +54804839 2784485732 +2318487079 2996701046 +769398636 3062032533 +880097564 4169383879 +2653525479 2653525495 +935609057 2868201504 +1497987173 4087908076 +2647139642 3150500078 +1312753271 2755079504 +740863840 3825996851 +4293293789 3033341428 +832557253 832557269 1586789116 3753745063 +1326459308 577870273 +3004474955 3300418212 4096461583 +3251383368 1550431581 +1322906785 138155206 162198332 +393343019 864422571 +2791231997 1646745659 +2761827992 1271942496 +3725868096 2080296431 +2471532167 1175253095 +1799514529 2056013920 +1556847483 2475780158 +3174479049 2787022958 +1253172742 2618104673 +1425932809 976818565 +1163074649 144027255 +4078414061 3578152524 441088203 1588804523 596764820 3653402332 1334816669 +3408439703 3677978819 +352516032 3551265605 +3219572239 659147160 +1166831774 457873434 +2181570824 2888000547 +1614551589 2744985658 +1516325645 1411982692 +3031218725 2615814627 2431191098 +2490719791 3821224952 +955789450 2676124421 +1782084605 1782084589 +1085934133 433983850 +823757498 87384797 +1144156872 2428887007 +268078294 4251694311 4251694321 +2875509262 3718911001 +2973585334 687233569 +1692766874 1868941437 +2957996695 605119398 +2385934331 2121980095 +2199207015 2199207031 +3813536570 230024285 +2815789090 1462062485 +645688292 3241862095 +2990385529 1822933807 +2423857021 3953955284 +1625142930 252078035 +1430939171 1730070794 +1854116137 1408589632 +1498220023 2336252870 +4275005204 532473278 +360839682 3718025507 +2173531847 3098671958 +121014747 121014731 +32918169 2076411753 2948034270 +3600525959 2603307623 +2331458448 1395835811 +2927379616 401370476 +3966269167 393427512 +2583496899 743754474 +3969490897 3952621591 +3294784925 1444988556 1259509246 426789590 2226049910 2477209865 4137654107 2112953649 3699578159 2258408013 3331419931 2628666759 4002388973 2476996780 1915245616 1122119316 2869514229 2867223305 2419416151 1372310628 +3809994230 1956577863 1956577873 +3845089400 2308158364 +3358110072 3532046733 +3059974770 501164894 +3810077747 3013645388 +3042601093 3042601109 +3963815184 4253087779 +1325477461 2657867233 +203937702 3367533121 +758096660 2003396223 +1869597224 2499493117 +253248014 3509582863 +4047398034 382199734 1463308755 +1183239014 1183239030 +2389328310 3880087953 +221932437 1744264092 +181811981 473888100 +3421436935 3380883698 +1685757783 835554083 39376138 +940539730 3461538046 +4113168548 3573358233 +54258105 3494964798 +1605812981 1605812965 +3466617738 1934399777 +710540315 3332890244 +4099854182 2960884341 +1590630988 2349229473 +3155519663 3300117368 +3983349934 2928451094 3669600291 +4163012666 3834216194 +806959688 1205916255 +1020704876 3399433752 278494377 +1469466011 436498270 +3431390896 3431390880 2823851797 198262300 +2684844178 2684844162 +1191376411 3836308612 +3875748995 2833118711 +1920084361 78665710 +4062756154 3495377941 +3248307830 3828919815 1082741713 1082741702 +1492820622 2693653913 +1797459547 1206797832 +3488843404 4198863743 +863950043 3953726674 +3585734822 3826393073 +1446595202 1043352245 +1019001309 2048431842 +2137802630 1435187654 +1179753810 75147283 +1146896540 960083345 +3583999049 3583999065 +97975957 164643927 +1710403249 772341926 +3356898342 3074525031 +567489052 1534583303 +1656880157 2489311650 +120889251 2096049296 +325525677 87609605 +156743069 1376970292 +730361830 3910502695 +3332242282 347260882 +2695385657 418226812 +4168083085 2770857970 1109894763 4024351205 4168083101 +3044850094 755047481 +802822058 4266868877 +2708024919 2514972628 +3655006027 2843295033 +804108345 3638682236 +1386892555 756500546 +2988770934 3863555025 3863555015 +2097786968 775985819 +1369828228 4216487032 204587209 +4216881004 4216881020 +1324230713 1696142965 +2611413221 3974522988 +212728245 212728229 +2783262707 399561801 +3781777849 2446868030 +4276105138 3974829349 +3443588266 3343761307 +3439881899 1669917995 +312065815 3377352340 +478600294 1313666177 +359038868 4012663739 +3199636326 2674526615 +48451200 614742619 +4256333132 36600005 +2552416717 3716859259 1826684037 1271115172 1954767976 1344244558 +3950224415 3950224399 +1226646491 4091507140 +1200825012 1200824996 +160563003 1272236530 +3067912599 3067912583 +1022884188 1448971217 +2061865652 2061865636 +890990015 185270652 +2459146459 2347908837 739775624 2572787922 +4080769917 4080769901 +1922175034 1311637398 2515503965 +566489957 2356684780 +3653516940 1542354551 627338644 +4126119483 4126119467 +2501241015 2370937140 +3841767211 3841767227 +1283915208 1082229195 +411816832 605942405 +2865048368 73596035 +1247471157 1919393681 +2519034776 2519034760 +1509727835 61688152 +3630059348 3665791668 +2536776922 2225537777 +2605491664 542200295 +334065825 4185673056 +2839798425 1572082511 1158078334 765858141 1317075531 4098018655 144557870 249411272 2419520328 +13775243 3588488642 +875208238 1293353583 +370538658 1721132803 +3356053970 3098267027 +2085836868 4214485769 +2564887514 2219982891 +2281104461 1453942066 +4280917717 2206533980 +2264356184 608096364 +3398600397 2473469051 +772266926 610194159 +2976470944 3906269413 3906269427 +320289134 2982216175 +2207583975 178681270 +98894986 288136165 +4266926152 2792280413 +2995827995 3210361103 +2716541200 4112845877 +588084695 2945596745 +57872117 3124486886 306589697 +2841401685 4049641674 +2968648582 317649889 3695035898 1994953072 3307867601 3703722737 +1703749201 3385704293 +1734358342 4020669769 +2796013834 1538536562 1679915707 +3899856913 4264485584 +1660374563 1139916551 879885076 3998220572 +2442550522 3667573718 +2884570154 3257662597 +2566719300 441610249 +2706902436 2711451945 +3641259435 3641259451 +3684838551 1464611238 +1837487610 1672468637 +103694795 2245104258 +3472775501 1647595515 +2009247491 4271025273 +2346985640 3139704848 +3277935850 3895939923 +3740056664 1185709709 +617924282 2825789845 +4015756311 3827965990 +656013987 2874523617 +3948658307 74246186 +987523434 3128409029 +3083644327 235063218 +2071858784 3864118100 +3140065925 2243803818 +587286917 523258627 +1189032565 106720810 +7900175 3435428750 +1498090748 1803703720 +1807122019 4081645002 +4124298368 1632888923 +3661356727 4179597847 +1717243941 1180330540 +843932291 2017906305 3425254845 +3078399584 1435757798 +3217578541 1864464325 2172675730 +3045847126 558585703 +2444861742 1294424296 611694301 793690107 +2228807535 2423542702 +215801315 582044746 +2875856721 3710259251 +3275504884 2007581512 1272181785 +383203921 4284153526 988946710 1367266954 2215945370 3962489535 3321254904 +4281493152 1549241843 +2855737175 1270463974 +2982855644 3190969159 +3788206808 1262864909 +3471739418 3682821867 +1505837074 1563941978 +1447472054 1899835798 2269138823 +3904086380 3200720129 +154207208 2647077379 +2193994394 409444451 +2909245282 1999297688 563248747 +945231108 1026738719 +4156251052 2817609665 +278055594 3239381393 +3092626596 155940776 +2547381340 2776457712 +1527190210 2919077758 +3424653566 1417330655 +345927367 345927383 +1871780518 3347255783 +3485591274 4164846157 +259252914 3203713627 +33575349 3682639868 +1297972669 1304337570 +1210814437 201853219 +465863191 3445148208 3445148198 +2753679062 2753679046 +4048051885 3660005138 +4073279669 3890875644 +1836529793 1818690471 +3832848660 2143392895 +4102950194 765380005 +2867343909 2540445776 +3439135600 595754178 +1023088657 273081030 +4125679610 395875979 +1516649462 3446528961 +3793776889 4061255656 +4247706543 3645339884 +1103232691 929297356 +3375053512 1997375709 1196323828 +2923553735 807485696 +2833296224 967690277 +2341865810 254848005 +1080220923 1453448996 +75506546 2866107998 +3852882065 4220952387 2059201603 802782296 40250729 802782287 4166298212 +2264988107 1367947924 +1511000227 3673636231 1782421660 +3677541120 285354259 +231159363 4086983548 +3600986607 1784994106 +4175935743 1421511745 +1579055551 1694689071 +1751198955 292372801 +3089354304 811452387 +2200478684 377096337 +544723344 1931713515 +1794761054 1794761038 +2149036500 2035085497 +2400654015 5407422 +2202119632 1667592765 +144043999 1661508638 +1815099905 1357598614 +1855912093 2525996580 +3100033655 2887807202 +3418922107 3418922091 +3985623548 4116379559 +1754271839 4190750110 +2124348459 347600555 143033937 +909409064 2090721277 +2513779810 1188263086 +2363501033 2294038361 2294038350 2917267918 3292129215 +1476621985 3685596365 2520147654 2675979940 +2922147279 757835802 +989793937 1887694406 +3657585142 665257543 +3527020727 2825408518 +1010037899 1010037915 +1405419296 4280131429 4280131443 +3617878907 3806441826 3617878891 +2684442849 3273583158 +180840974 940998674 +2065517219 1914470037 +199224283 2357217732 +1379664941 2709164740 +3919148225 2106772447 +3791298583 3565814822 +1588996828 339191675 +4225879212 276754641 +642340678 1065149860 +2382718406 1484732087 +665950659 329581478 +3161522042 1007478850 534916363 +3210980880 3254127723 +1192293044 2070247266 3624228203 +4100057892 4250972647 226528956 +429900833 2004991999 +3000722811 174112946 +3162913598 89080457 +3510158911 2606765374 +3278255758 669507993 +2156785253 1916382137 +3217624793 3263324040 +47244104 3921936297 +471676998 2281674273 +291146323 2092586925 +532733724 413088017 +3024178759 799336786 +3069660138 4048322893 +833113270 3790652049 +3774195602 3031878355 +1473950121 3742035199 +2602615987 3885344218 +1082258320 458619386 +3854374310 657129125 +2816689569 180481565 +115217508 2761293913 +1253876948 669046524 +3429865734 599697223 +4152033942 4205388870 +4042740286 159636123 348241437 3791735290 1592044939 +447228041 2142752696 +327284449 2526520352 +4139073635 4139073651 +3914025401 2641718153 +1215578869 67463100 +168822357 1765872364 +1977355671 543777958 +390394687 2729558780 +2701125433 2883124904 +111799624 1752378652 3813016417 +2587446387 1037381088 +360502533 3632486106 +544676178 1836899333 +1587663475 1807633164 +1318559567 128960846 +185780928 781528147 +1465750050 2588483371 +1585977108 3829159033 +1248238959 2391397806 +68662966 659857543 +364724262 947694390 +3092222720 625240325 +837176679 405196147 4102805792 +338996906 4063007967 +4096232142 3131463762 +1074242629 285710490 1760901757 +1607215772 1785140103 +3260455252 1112760121 2722031272 +1256920041 182730811 +1546755749 3855316620 +66092418 3046478773 +3691113964 1124698775 +1309307755 2680780066 3505846443 +349140142 1888792057 +495441460 2966827983 +4023103495 2225478422 +149923094 3978881803 1847800725 +3918103662 3026175225 +1000896885 166036689 +3466125289 4030391630 +2143706638 2143706654 +487621939 4093751116 +1468871359 3986083452 +1190211511 2585252631 +3592043152 717925628 +454173867 1217378594 +2991614400 3454068620 1956018501 +1924054434 722765315 3561944746 +1812148757 1347912877 +3233847299 2184144378 +1379140874 1269695164 +4165600080 126845867 +3426830304 1791239603 +1159505741 1739375211 2272390819 1519742255 1387254198 1019403351 842594004 3992636200 3770191571 3135632763 1739096398 1962103136 916050822 3468955268 +1918481734 2059058566 +3429165759 987027333 +4117019641 299351244 +1279613494 1194132241 +2345745439 962700510 +2642671400 515773419 +444016235 3743671842 +962296436 1221098697 +1545721121 709001952 +2672898415 1003540920 +3150784280 3153365709 +1003129353 685198392 +48637303 9550966 +1447665273 469745135 +936821191 1358714616 2920483913 +2105868157 358494658 +4123323816 2365726571 +4113662511 737144824 +1578810597 152525932 +3844026959 4280037976 410027490 +4285439438 885731780 +2163205662 662093936 +206177364 2894385199 +1634246992 2813718773 +2407709147 3318387652 +1186283368 1415485844 3075657917 +9465259 2388436002 +27969090 27969106 +1526910046 2741483497 +921536054 956856202 +1263770461 2022366820 +2588437241 872930925 3391448693 2569559312 +2721712867 1147085660 +2939552395 2385754819 +2401730765 674218674 +2221860658 2895508403 +175198603 1194945397 +1263984771 482569788 +920190973 1419443028 +3688848303 3483194478 +3282974552 767260064 +689565548 533980951 +2303895103 2303895087 +3820459929 319006174 3435011198 +785114323 913380798 2113484858 +443122199 2870463014 +2958951483 2274612229 +628433274 1902359325 +527959201 720324982 +1984256408 3341552205 +1323361956 3490387007 +2313922180 3205728601 1089947613 3697526734 2717327839 +4193404738 3127258339 +692873253 1566970823 2739032412 +2547179160 2566154587 +749886491 2009529988 306358751 +1182082750 2825649417 +3477690503 3614858368 +3301266473 2153583502 3953360024 3597142143 +2093457314 4238907334 +570371826 1991698149 +294370758 2873963461 +2031136877 1024091632 +2136481292 2209828072 +3619208834 1362555918 1267995293 +728271283 143705292 +3231851046 1670733463 +3798479471 3641140398 +2343940008 833712829 956913023 +2891712502 1256228935 +2291634992 916239491 +149168055 3055414534 1814443962 +4283541616 2560851420 1569466453 +581454181 4092299756 4064733582 +1624486683 90527944 +2575248432 3543306133 +1186077643 358727810 +4279849013 151474323 +2818768266 2182247942 +1046175524 773399228 +58510945 3930906170 +998842502 1054749409 +1462033014 2768496583 +3082229196 200240514 +1122206574 3123177007 +3070815618 3070815634 +2983747030 2983747014 +3080214457 893354723 +2336602557 4223886466 +387322465 3011426979 +2623513779 547457015 +3313612992 2872432197 +1967932311 1041131184 +4066858157 1168788562 +1112470785 1112470801 +181301213 4112262370 +3318997565 2844599812 +3650164260 2741361321 +3009076674 436934755 +297660167 4110370816 +2975299660 3020409306 2781647027 +932573718 1862979297 +3980788903 2319288711 635404182 +2602461692 1458801585 2456086448 +848960246 2660790609 +2400472895 2079899710 +2579112684 151010257 2791845882 3959749015 +1914017623 4009573862 +3106315060 1043621196 +2270644715 2270644731 +2560617374 2560617358 +2687031397 3450524993 +2619068728 4157233979 +3485786866 725207025 +3335787500 3957021825 +753908645 1650746540 +262743628 2788752212 +3413064089 3574867440 +2733437399 1375778150 +249951884 1961421400 +2702314757 2490007244 +3108875981 3293718036 +291716615 3998334724 1715119360 1715119382 +374277804 3395780823 +2086660370 3707496261 864888763 +901210209 4037851296 +3725371197 3404416258 +1732145439 2790003649 +3179282386 3488499295 +2720920824 1180213869 +2597712443 101978052 +2556546836 4126735481 +4085406938 325842101 +4023669857 2685328016 +3424284079 4237994606 +1023149218 869735433 +3754579056 3754579040 +1068064901 3164795212 2088657964 3062106115 +2307676866 1106672334 +3128935683 3128935699 +3215067423 3407109064 +1636176903 2366736150 +1817288528 2150704771 +525498342 886226689 +3042711090 2985750693 +3335391754 2849832968 +799329309 3021965489 +1369798677 1514287008 +3598278007 2363750697 843057712 +3481602769 2138048272 +2179417279 3744508716 +1103774019 3563371644 +2142517841 1505217926 +112457354 3003541344 +1129154095 571096046 +3655798663 2378002816 +3955664485 2994437977 +3196076017 3571755120 +4289012577 3522605494 +347341785 1885474440 +518907762 3552858094 1091158622 579033203 3351526669 3351526682 +219363946 4282709211 +2954192098 330158019 +2028769988 543885973 +3558362373 3558362389 +2064221253 2064221269 +780533856 2633144115 +987861740 2635745687 +3339577607 1642452502 +706144330 2349837421 706144346 +4031130060 175361079 +1701196517 2229411436 +787072679 4175169714 +324512291 2516636956 +2291279300 175694008 3255923593 +1205461840 4199703467 +2257528616 4217021437 +4092366663 4092366679 +3187073196 3080957633 +739379514 1463773205 +3249156143 233429486 +871673259 1965909044 +3479479903 3664897928 +2930590561 2930590577 +3105252891 2034416772 +3128598846 3440104585 +1171899119 1691344698 +1815036946 2941432617 1476783134 +3094920839 3597954970 +3722485959 3858994431 +1008082000 2346311209 +1370376635 1348342116 +3267859593 690934712 +702125777 679672989 1230611189 3014465607 3946835988 3014050880 1023383773 2273799901 +1548957139 436052458 +490826954 490826970 +1831576503 2461186320 +3000063151 3163889720 +4209383620 1198027223 777360923 2473010353 +1747682365 2287486773 964766722 +1958879827 547096748 +2545095635 2716349754 +3373444705 3915940512 +4075049833 2738368997 3598093164 3329183310 +2266166161 869625158 +933269830 3465473813 +3900893977 1357798377 +1212650492 3299734951 +1390356101 4199129946 +1141695237 625565900 +3511050270 397788866 +2958702268 3264729883 +1859674551 4080204175 +1280521934 4110370393 +1246281200 1127894877 3296122690 +317234257 355341190 +1356516683 2473667842 +791796502 487022583 +601397269 897211052 +1878212918 3611969376 +2885301604 114919769 +4161478926 4161478942 +704911960 2088073371 +1909217372 1688473863 996444108 +3341832164 3750324477 +3041620476 1371821719 +3969233088 799358547 +1158254014 1812603401 +1652073941 3639414346 +3109380332 2064462870 +2618423545 2840260584 +665820592 1603117063 +2824716164 3485495417 +3576490547 3576490531 +2125582677 3337390300 +3295339315 29415512 445944475 +1657463513 1583553416 +3681395232 2375432307 +350023579 1926050052 +1947044581 288049996 2003577817 304827602 2245083855 1835801613 1311778916 +609063941 203334879 +2206407142 3353953062 3982607639 +3671646700 664822336 +1411373620 2720301017 +1504947901 2997987275 +4057724769 1591653777 507932086 +1431648821 3877376913 +1420616216 1420616200 +526137861 1664046540 +991195222 1462556519 +2226455641 4093851433 +1098022729 4234224293 +2459524238 2459524254 +3551596133 2763630842 3551596149 +2139980808 3553024157 +718125682 718125666 +1470730098 1911345253 +3278002449 510540058 2765239760 +1478594016 2149577343 +202002610 2789017637 +2181993355 3803365549 +3505056635 1557181106 +2292796305 3683982625 +1881090443 622540595 102892826 681957728 368696517 912886975 846437072 264901796 4193138433 771393781 1218799142 +3082288119 1463028582 +2692975500 1653403575 +1908897278 1376151082 +4225748858 2879402502 +3154083057 3828461424 +272500478 66979115 +4034514977 2965545952 +2652415317 2056276474 +70743678 3476270495 3445248350 +1677054641 345885014 +1703390402 2095229910 +3835097290 3835097306 +165459030 3698320231 +1596760043 3191848674 +1475879876 1067470239 +3341605119 2325322110 2546761404 216105537 +2501632467 2501632451 +1831899272 1138499491 +3041046808 1878837453 +1195823696 2222789603 2222789620 1325672745 +3179102526 619927135 +2955777195 2955777211 +326036400 1201473045 +605937274 605937258 +3713889150 4162637641 +2276928210 1985781630 +138703058 3585972883 +3531727245 4117228064 +500984005 1407111914 +498518169 1606273224 +2748895298 810538997 +710883850 3186122171 +1158607387 3515293828 +982439044 3615313142 +56658960 1907252598 +2905038403 2039979056 +2519224880 2440651139 +3085839771 653380356 +3556125485 3649435602 +2123416735 156395944 2123416719 +2332492732 2728657615 2550849767 1444949572 +1661330278 2255770778 1536485553 1126248061 1212479895 1536485542 +3400521587 2245011980 +771767054 2019358479 +1470730083 43404148 3268084573 +2781307118 3873281711 +4160582509 3506222212 +3696362584 2439364580 18769059 2372254119 +3529910347 2005767349 1890601336 +3085416578 63403189 +148942111 1805851662 +2102739145 4242140155 +3032927317 3129782780 +3354582697 1817478158 +3841261734 3183688656 1933139438 430891710 3421178313 +1887981560 3387866775 +3221072049 3111558429 +2881258704 3524017524 +1025018766 3148066959 +243534539 2765946242 +1833225847 2052130118 +2247425645 1303152004 +3968800727 3968800711 +3914326832 2026022044 +1129639715 565474314 +389090005 87603915 +2615948246 1255512551 +3156256466 4184251525 +255828367 2418758670 +4937533 859914094 +3308928099 3719106506 +2834457527 2954331309 3319957294 3495895406 +2314437508 2925005001 +3040929041 3682301073 2548699830 +1661848573 2278354503 2226977245 +1415508889 1415508873 +1157146987 4268929890 +2360154322 1182667397 +1831875499 2377823182 +205959433 143822523 968274034 +1067880310 3910150107 929990874 3926927713 829325125 829325138 2921459986 +3349801556 2759582265 +1309394981 2676007325 +1638043442 189696717 +3395425903 3276077042 +3581161991 1435357956 +2341232381 1935715152 +3559796451 2645305205 +2391288170 3394843099 +820835102 1346893898 +1864312824 4079239353 2403089549 854546297 2190531436 1686874098 1195473916 3917471602 2382072934 4147406801 2008189197 1751424456 1102351881 1101409828 3063209218 1794704720 2642792010 1843807206 3647691053 3960093516 1487221865 722722594 3368043526 2646037516 3876807004 4115199336 3371126851 334397141 795717079 1011069557 2551512698 263950399 2153295953 4232171573 1116262426 1655041746 1956994975 1992867565 154735741 2704688263 4167481856 2594751188 2916417429 152871930 370723845 4051639135 4181703694 310232490 343631741 3632276519 313149484 562064900 1108822266 4260274233 888196965 3899855232 4249345355 1592085301 +1834653132 4053389345 +3194402618 317113877 +3185932989 4293131231 +209928992 3510259352 +2705968041 44373785 2418776846 +2913708221 1682718626 +1303678696 2113484035 +1746869496 406576780 3427521892 +4228104292 1996587723 +1020888874 4100966157 +3342449506 31587167 +3280712425 1961859492 +2712851675 1736774852 +2232616734 2911727000 +2957087463 3580668883 +1602893020 1602893004 +3912623135 3004124892 +187473382 1882488027 2101121281 +808989523 1260953558 +2996591973 3411753799 +3260660664 1186182739 +743813715 501725370 +1039516636 3051104401 +3776816429 2393572804 +595729233 919666832 +1618372241 1618372225 +3620698415 3936077038 +3515427254 1022615050 2878267265 +453261207 514032294 +2005680748 2647429143 +3129382235 4242349650 +4132702394 3688600432 +1258093225 3040778254 +2569852764 1467399372 +182576425 2854851375 +3738251838 3007000393 +2669326778 4145644693 +2743987382 2591087254 +3870820056 261118863 +3987676801 3611610637 +2182831291 2350053988 +3848887783 199152288 1338348019 +763206899 3560387168 +2488304055 1531208244 +3696110297 2819453832 724369833 3696110281 2819453854 +2595796580 3195433551 +118852189 310384744 +1655121276 3663955460 +1225209838 4204908040 +3536353293 3734305906 +1917354547 85085558 +91089895 1930058912 +968379004 3955837574 +923243491 923243507 +1977726983 3763920605 +3306873238 3420312434 2774687858 +1678148528 641814019 +1697978695 2576796374 +3994183069 1677063714 +2071554097 2071554081 +254374133 3543978410 851316378 851316365 +3416084023 3215073424 +3603543395 2189986506 +148169122 3743136426 2300523011 +1810922781 143979700 +2923054904 2654677731 +1414075459 4060800362 +95425289 3152319519 +4098824239 2855840222 123028255 +3231392311 98229609 +3328167029 840188809 +969028309 3249931612 +323913002 2432601925 +3834751199 2957825800 +2273694212 1537842249 +1178944378 738444118 +4123221963 3735770933 +2298375547 2424146494 +3447515332 1067609225 +921345396 3307984863 2566573588 +275650492 2572115175 +1894234431 2161177263 +2687338801 1487861798 +3915223257 663805967 +2468811645 595832258 +2884310256 2467427779 +376057413 2384909964 +1686879433 1641295127 +1954424505 2586339503 +1127090316 1127090332 +2696111425 919756775 4061461845 3679946342 3407583669 +3528586368 2533614995 +2554108913 3545793939 +4269950139 3332723583 1645359716 +3635475755 1234301620 +1529843547 3873352786 +1666035516 64451313 +2489746979 3227855132 +895650585 2665933077 2742549340 3470608672 526882699 1954923672 3532745899 830528993 3470608695 +1413843715 2893665706 +3289647966 3289647950 +3074956115 3649242042 +1102075223 3214301158 +2005296296 3499127915 +1495662745 1662068514 +872912508 3755749031 +940499105 3844641248 +3475976626 3231007518 +2068323770 3274887317 +4222149220 2396808041 +374908769 2391768502 +727197757 600804148 +1679120458 3798496690 3617193083 +2841047415 1806284788 +3556763069 1400564369 +1154426870 1209788497 +2826861913 2552189726 +3962623567 534863438 +452545784 288841756 +3685963584 4146238456 +666275870 2724519743 +1025284778 625191041 +663730259 2587830956 +3857456903 4189378569 +981574756 3846967375 547607543 +3596782050 3278047157 3182224802 4100944004 3771714631 4158188527 340794739 424563611 +121114850 1061327811 +4172589174 4200935879 +364245897 3060687022 364245913 +4048136048 81859787 +3410811884 1082054264 +2148103393 1482043142 +3113418824 3621921776 +3250727626 3467205613 +2489437589 720806282 +409770441 1864772916 +1683767852 691809089 +2433527365 2616612492 +1870380183 382329254 +1148592293 1148592309 +4281562571 1550454603 +2778256002 2778256018 +1318198003 2734714010 +2758482874 2392630749 +417098000 3566021518 +3207026089 2481707288 +1056187045 1056187061 +437681847 2383095586 +2678374728 3392491956 2556183636 +605622352 3316504747 1907751848 594849269 +3964155119 833983532 +1005586079 4191841374 +1096732645 3443606892 +1358726591 4023245163 1015450536 +2815206908 589908913 +3519044218 2882432541 +4151272940 1885172375 +2523399040 2488348050 +421815443 659182448 +316944247 876001350 +3974461532 1228699847 +1403639554 3059578915 +2426192383 3471879908 +550092821 2996396310 +529025281 2628939814 +2468987675 586895341 +1814268040 3287281181 +3630459273 3347879929 +2158920571 2896354651 526546514 +643547261 3748660436 +4008304642 2075250717 +651631902 626476350 +1338634767 2850557326 +4163322389 448926892 +2567654556 2026471543 2567654540 +2625457032 2736671672 1386560649 +1828235902 1094320521 +1547747263 144195533 2255332202 +453804835 3081924636 +1515786388 3459586297 +2313793045 1660444858 +3698716430 2540159129 +664952811 1154924693 +2292832627 2522959884 +777801923 3193119484 +2517355502 579995577 +3669739706 261946589 +226470743 2533013990 +1910385927 1203823104 +2267492572 2662459975 +4192582728 4192582744 +736343790 1282374521 +255301303 235798307 +2112526442 2723016397 +1183132942 296086809 +2511000762 1441587421 +617041924 617041940 +21227993 2146587368 38973461 +3394804957 1719594978 +3114657234 691360365 +3264419884 4219598981 +2340678823 3056705188 +2672364317 834810908 2324529429 +2612152767 88633286 +4012684790 3362698442 +3594466087 2485948493 +1011902870 2245013441 +2680533387 749832792 82749289 +810741586 810741570 +43849121 3192458358 +69713379 1838148682 +1001130517 2743606444 +3928194475 1088345122 +1006106559 643498408 643498430 +1407913003 1174677410 +2701181542 3660711553 +2564048081 1730696464 +915247467 1272703842 2421866773 3744704408 +3133771406 3568769338 +4272274099 1255449549 2447697868 2002314807 2002314784 +2174554186 482536883 +2714969811 2456165925 +1681143012 963007704 +1325105310 4092295359 +3941927466 1571671833 1311116731 3639880538 4066872676 3653112212 2813714209 +2510579584 298774149 +2272796709 1729796652 +868269049 3364217455 +3119510843 4022275058 +162698880 3290622867 +3493215527 1606521273 +29803160 2373077028 +881699568 208766027 +44012116 3101099945 259468212 2743144216 +2442826723 425119324 +824072326 2890942495 +2317699427 2987017732 +2118307678 556560617 +737171733 1530037178 +3800014148 181529211 +3261846652 2344582951 +383203934 1069273297 2615252550 2458854316 236264465 595450906 2372349033 3883698244 +3748916075 779852130 +2991296602 116669885 +3620962312 3620962328 +2666416711 731564569 +3911534311 3970866614 +2205026561 2473472038 +702065858 1555007935 +1962326359 2003157990 +2330500716 499153025 +1578610478 412011950 1296614767 +526922731 3763428446 +352606267 1356260594 +1287993907 3779672182 +3149617652 3505358740 +1577121714 2911235365 +3701949485 1819436782 +2367372222 3755936777 +3473150952 3412809259 +472578778 833152317 +3862622882 281801987 +2500083775 1001292289 +1499662377 3756382360 80996249 3756382350 +3631041598 2695218794 +3998973420 1650532179 +355784322 3828199075 +2223114856 2296067948 +2829473504 2829473520 +1004992364 3096936215 +1445798581 1152408123 +162808654 2496000985 +2378755712 3008328581 +4187807825 1956370848 4054161626 +4237972196 2331016447 +2497249218 328900195 +3157603510 56453330 4257348241 +674160534 3620337959 +1494948659 1115323063 2024526156 +4281340356 2091644809 +670678141 1797503170 1799084386 +3701761048 1858703835 +3922942355 2864054906 +2435026823 2435026839 +3805561570 4129638851 +1646147199 3864713258 3864713276 3405924877 3864713259 4103064040 922248897 +823687349 2532949082 2065280531 +847298646 3213801760 +3622181564 3474243535 2604406247 +3077609504 3862919795 +4260811602 495888901 +3107175559 471769490 +2071138424 3458395387 +160228774 1007992154 +4101371844 2164130479 +725579808 141349890 +225914910 1352711999 +3794906164 1211241935 3794906148 +1977056823 4200942541 3032737642 +3294784917 2670501879 +317051590 1034256406 +81185510 2216781847 +2041726931 3305113686 +3469364358 3469364374 +210787839 2102845760 +1756635926 1506207735 +1742988122 3854493355 +3120745333 2349147857 +3706988203 2136530740 +788000695 1885110324 +1364213451 980190200 +4267008330 645850473 +2045292726 2045292710 +2072789073 2072789057 +2720554388 3649785839 +150729580 2045240824 +311832447 3245130984 +694360243 4191188000 +1033571663 1242952526 +2309496252 1873202919 +537061617 1435808614 +602084425 3346591470 +788695180 2365387895 +1341234787 1012684234 +3450426631 3355918567 +1279084400 1953985877 +1558386943 947935592 +3566153808 2975922364 +1228452346 2315656917 +1331180797 3839584852 2473089225 +3952235380 1264148367 +1992212758 71955889 +521590526 4008997343 4008997321 +4162241621 3772191196 +3502739619 2232594913 319686022 +1845962148 690393999 +3128885610 3140484910 +1046599357 4043639700 +4202032624 4202032608 +628872795 499846881 +2254121114 461433451 +3199750543 3902116300 +1894625192 3360924944 +4035836607 1853995688 +1756056418 665299797 +164899885 2785118930 +3738387397 3751505416 +588923443 1968584268 +194164377 194164361 +2942588546 3076876957 +2649719447 923440038 +1440188194 1145682563 +4027957606 2331031716 +1208023187 3968290668 +525574698 2156826432 +2111024442 1312404043 +1069543366 3867786257 +1575026525 2394233385 +344146723 3004906503 1839378460 +1937673336 1937673320 +1040788214 2658050375 +1090592918 3938864177 +1667497406 4183413922 +431619483 1729762891 +617349525 2183560586 +3662308482 242034845 +3252630205 4015841172 3420929283 +932190066 2569666542 +2133013603 2271967178 +4178779893 826745555 +698832271 2911251162 +1861061413 2936701323 2296919206 3646662084 4194176032 3175580476 3153095243 2674803564 3761822692 3701417074 +1982912133 1982912149 +2454673357 3942427941 2454673373 +1394393159 3046878174 +2337196357 2449921932 +2984084467 4072060805 +4110482977 3687184966 +1885665161 1936900869 +3910515165 3392378612 +4180619798 1531697329 +3247882286 3998255225 +3627577481 3923322808 +1460459698 3141083173 +3574819505 512816304 +2830515873 434515719 +380292612 3001176159 +989988972 3332000892 +315723205 1692544268 +1188883326 197572425 +267430475 1658590228 +3982647814 3978106961 +2074285275 411691596 +3304711172 3693098794 +2125999844 1609683199 +1546983912 261605419 +4141324778 32728614 +1800741291 2718171188 +1292238670 4273788906 +2129784053 3419932074 +1402147416 2545974771 +2393053506 2807657655 2640863297 2824435277 2640863318 3015711142 +4156556824 3772272021 +3254748775 3426784310 +714874801 1770348118 +580383439 883373339 +776917287 544275027 +4237133684 114047887 +3733147195 2209621732 +894797866 894797882 +3252912254 3976254710 1815175162 1781757 +1189402514 2126250105 +1957837669 429096940 +3238096387 688493040 3555925053 +3869898667 3364938292 +2047958334 1259000393 +561682585 1291729118 +1193060968 1703441005 329447928 1235214424 2344116622 3303194174 174567361 2801882238 3298149580 1385860942 +3851872259 1871658172 +3154606403 1120134250 +2893466686 3171124639 +1797590265 2488488664 +2202656094 189233897 +1304787958 2097480532 883078452 270745807 +3813114856 3389108757 +1031833417 441776120 +3090583913 1029453509 +3945045866 2124987462 2845860385 +2124111705 585048439 +1154511390 1914938687 3978109502 +3134893973 3141691274 +3631523356 3493426385 2607998224 +1715005646 727805066 +3131255939 898198461 506049638 3785817217 +3515297813 3599151789 +3016879169 3952827259 +6980304 2007756149 +187861010 2995532869 +718655882 4170767419 +3935209682 274817669 +1054229861 1054229877 +4096121331 4132058999 +777401485 1753266162 2125773284 +3585141673 243464974 +3964556675 2186321212 +686219398 3916657377 +1616426005 1616425989 +1293905960 2424147709 +1951852149 1907022943 +2857502270 3926389982 +2143665626 1010888158 +460508737 1038325606 +127195325 2891002242 +53352934 2735489831 +654122176 1543787163 +3381450176 146046291 +3876280927 366953374 +489906921 3773084888 +69489871 2245338455 92915686 1391445594 2696034897 92915697 +765644437 73643322 +87168985 115051144 +4043316008 2334834685 290208579 +3526022142 1927895394 +175272334 3475654425 +4106459959 104682557 260807683 3249074640 +2741347066 977391799 +371384263 371384279 +2319620735 634992104 +3381429355 2531982274 +541166854 3442540641 +274504168 2848344107 +3691487315 2815543725 +1985969796 2938146302 3002202775 +2744816210 3092944836 +3414066920 1174400259 2059695312 +407273029 3265307773 2079901338 +1239596919 3337840710 +1398128441 2255999484 +4188229463 783313784 +2041737098 501585467 1381945275 2423299262 +3900581588 3197512044 1919104279 +3126637366 2515410449 +2389580041 1079077166 +2007768843 3096997812 +252375995 1765650276 +4015460296 2383271883 +3815203882 633515547 +2844701259 1798952719 +1791066394 681458667 +1209838581 1172566590 1371532525 +1144156888 862636557 +1502630062 3170104765 +2435887612 2328040368 2529371780 2343055281 +2063134620 568400247 2063134604 +2266635556 3525042111 +2403079693 2291578482 +1946363640 2566281339 +1361504234 2856260955 +2987076951 2660786160 +3180655608 2068596883 59597776 +2803834601 3087952068 +4204673695 638994526 +3579128810 598768630 +3139706057 3875528524 3427908176 2233536172 1312561765 1288791302 2583212244 1720906948 387051173 3082881297 1752233873 1488957133 114368696 4290566817 2713094591 2828616532 4055011250 2140836897 4071296088 4082632053 3665792089 4080862335 2029596827 1453522510 3194317982 2193668537 718900146 1981582279 3280179467 45845900 1660532035 2732216794 717341220 348446513 2411534005 2138870077 1307060082 824685993 719222592 3506105697 1229294147 991240114 566830870 1663849915 2619407948 684770109 1703178029 136681543 4125188425 3470641783 569786824 1504566076 2538039908 1619761201 2425963692 1816369304 1131675629 2496940470 3654953244 144070629 1380497036 3452097766 +2863673462 3813155926 +847447615 4114913390 +4034157697 616337319 137207552 +368669829 481455436 +3461885926 3134416641 +173578867 3162186508 +2326248851 2360220525 +2092789301 2367036051 +2433182017 2142579302 +1965416358 2171199206 1965416374 +2779595219 2730401580 +112792542 476011103 4201525082 4201525069 208320681 +3167826047 3159316456 +457810337 2021396493 1954286033 2515103862 +3994217234 1569251416 686619066 1026987913 686619053 3559567934 +1774686838 4213936071 +636851835 1016849330 +3145936732 2340654535 +1094684251 2792775954 +3336377409 2209247055 4165065908 +7819274 3318939565 +3338608494 2979953199 +223393432 2383376717 +386010364 876245159 +1901041068 206085591 +3665168692 2721352073 +3661166046 2168757282 +2066333169 2911225494 +3141069819 3046865956 +847632373 2108880572 +2499760914 2683290949 +546567921 2688628142 971881839 +1675560601 3507970775 +2969384004 1312397548 901801257 +239741648 1869788971 +2233486205 248960450 +841894354 3504223621 +662700511 226685448 +1743233773 2124774148 +1578689886 2133922537 +1536205079 930782149 +3117158565 420284885 +2660273532 1823415089 +295933556 3258287641 +2063308816 2063308800 +1595870917 48891613 814024820 2875631651 1919785587 286887725 74074774 329594574 3520277628 4280434452 3255370880 3563030434 380321775 +1622034416 576405205 +574060436 4257420660 +227178406 3765732186 +3652611907 23035290 +3104472968 371531863 +2541576053 3632367699 +1642670319 642857982 +3587128971 3587128987 +977489386 1301312581 1908955078 +3410862565 4233540313 +4148434331 225361736 +420514444 65504951 +2874260781 3735866820 +1792359800 2779759611 +1896984265 3352700526 +2131023099 1433468328 +451244738 422815587 +3756640174 2825378350 3756640190 2093613730 2825378361 +1412835244 1027634135 +2927050394 3102870626 1068993643 +1465032128 1465032144 +1346770681 3713127029 +1328093917 2101119483 +2952107720 4220725723 +3488400605 783935476 +732361593 1349746758 +4051352354 3557690268 +1472575458 847125227 +3948846155 3505392148 +510246383 3468739898 +1175413287 2791564039 4131283990 +261417491 80155776 +123158636 609544833 +477152487 542286739 +1379536180 2774714575 +3191355221 3675730502 +2122165097 1176091069 +3793958118 3815523841 +572389261 710788569 2325640328 +674237916 587760263 +3464392673 4060749600 +1951664316 3695820775 +1092879038 1236291871 +3070194960 3070194944 +2791254031 2252790769 +1302644317 3034031701 2539930722 +4151834424 3386518843 +4101510921 4101510937 +2819856280 175613221 +1964875528 1964875544 +883822924 4147858295 +1974165489 768084070 +3590448245 1509598268 +4108063734 11760577 +2934592093 2816446244 +965749888 2941732955 +811537625 2309028798 +1348840456 1348840472 +3332438001 2691059814 +3157913873 3151353331 1002962592 +2630433566 603034409 +3483684988 3152844327 +4265418464 439851685 +3079789816 1561450884 4070496877 +416113508 1867740799 +3109008992 2958791980 410786085 +1469203032 859730061 +3740679321 2527159496 2527159511 +598360798 3056249550 +1087415322 577918205 +2662914262 3002947815 +426890572 2666442592 +4017553648 3897981379 +2615574332 2816101233 +4077895780 3706970190 +4090454767 4090454783 +713246210 3560482314 4003935523 +1682640856 3123310875 +1116706165 3216481417 +253681067 3247813002 +3216542156 2608917559 +2973744224 3500804923 +61552504 2964381440 +449108896 1202216059 +900291093 2392379164 2392379146 +1074840085 560925399 3766981804 +3709021331 2553228140 +186721987 1211106538 +871758534 693712918 3891412743 +1348016016 2401324393 82140397 +1370260785 178126806 +263712383 2870468741 +3212911765 223123100 +1335753862 3686041335 3559945937 2203390202 +28937605 2600246636 1454916505 402725064 1337473177 4137051562 1320695555 1008322636 +1531608443 1531608427 826509490 827333183 826509476 +1912598144 4125389701 +1587657037 3191712434 4080103419 4096881025 +3723536374 1473800273 +3718337405 4176398434 +59205016 639954509 +1239645674 2111516800 1725631580 +3798731628 3692428033 +172152449 172152465 +3280283621 3692152658 +246248421 2401870621 881018 +3706970181 417991820 +937966985 2342051502 +249833782 2804736007 +451723146 3971057211 +3412681972 4238196884 719973401 +275317253 3662556634 +2681092460 4255409431 +11698672 2167205012 +3743791353 1096953832 +3463814088 797416711 +1279004522 1821131739 +64589935 3446086535 +3615250291 2881333772 +3770524499 87929861 +1068339054 1770227402 +2602429874 653348173 +2256045075 2762195693 +1917536089 2291315262 +3857325550 3717012911 +601407292 3191163756 +48228108 990143836 +1498271313 3866872198 +979338842 1046511549 +1370167422 4074053513 +863819598 51602296 +3110068582 938464151 +59211298 2957741955 +1392030098 796887251 +2448304862 2548923241 +3372977613 2078987058 +3922942362 2981498237 +2717769650 3030852915 +1338074157 1365868690 +745778632 2030401258 +3839973121 1337718422 +970149986 2579410377 +3766854392 3714713927 +1184415692 4000706081 +404862877 2585005090 +3322761386 1849365765 +1951301234 2011889502 +3717811829 1297515068 +1376471942 2292964806 +3318244249 1152966223 4084517320 517589118 +1196092786 2901658227 +2824084048 1795153170 +3528067836 76715184 110054065 +385859150 522034202 +378595964 2452048673 +3355993833 3459907790 +1675358786 1708507469 +2029006771 354096844 +3677593710 1011569136 +351261956 549181063 +411541298 3481246629 +1845155868 1845155852 +3822636416 776700051 +1414717324 2560517047 +1943742929 587381440 1943742913 +1308041221 1308041237 +358293185 1601268160 +3981602603 3284467892 +2965448295 2802807840 +2522886608 2522886592 +769173055 1796060478 +4047122857 2659548335 +335461878 2599364469 +4100080637 2998086008 766410697 +2878492209 1213273894 +3572818204 1501454097 +4224429748 363070809 +2712382059 4231880626 +253456109 1274505554 +752471904 4209079347 +2358965475 988774730 +1018215926 2151352903 +3111529604 2030572511 +789904079 4190076172 +2214180267 2029689698 4007797099 +367495822 159325593 +431999831 3756857840 +2429686280 862144415 +526923629 3725541522 +3202370072 1451088805 +1755439661 3822521540 +4235042994 311687219 +4208639829 995832540 +3909638672 3894789923 +3035506903 1480312381 +1794865821 4157478036 +3642136127 1331404284 +1972434172 4138253715 +1669156648 3326319613 +1832232467 4269043692 +3155497921 783374395 +734393951 911331019 +3812524339 3999621978 +2509884303 902912061 1932827610 +1009512141 4268672948 +205719557 1384488922 +1204432979 1447695034 1989890531 +3563101401 756476296 +1737966519 3391068432 +3324205976 2175348827 +2363582709 1600308890 +3498369055 1613549768 +3579762750 1822712189 +4189724147 1908391356 +1229360243 3440318732 +533996650 113735680 +628570051 273535434 +1592986792 547155051 +4054860980 746334031 +3378398407 2466186195 3328591168 +2400686371 1125857798 +2422302996 1566075503 +29602008 1577892398 +4264580398 4264580414 +218639930 936811345 +343419863 271385456 +515661131 2911296788 +2769576162 2320428076 +1697045696 1330197476 +2493424672 2559087295 364666483 +2097492721 1639690871 +403786919 2319166198 +850386879 2940322684 +2915851789 2789483647 +270322755 270322771 +990507805 606765314 3070676971 229226164 +4204700753 3636243334 +104978122 1348796277 2549176371 +2862221874 3949858990 +3112113572 481817977 +3272941262 2225205706 394915413 3413720102 3457037904 +769424616 437821739 +2700133805 993164340 +2218330923 1355584692 +247067656 91281375 +3126621192 1737140363 +1259036350 3773179145 +5790899 2396084279 1041886668 +4113828699 2164476923 +1113516790 1902895438 +1452638403 274313962 +3480215934 186644831 +4182030379 2452482978 +3944193128 3263935786 189804076 3499916844 3445995119 1910550005 2825365608 55579228 4135746698 2893038321 1876451824 1539506044 2413427856 2379595876 2589231511 748280577 4090675954 2993748995 +3106472040 3817579435 +2264905955 1673856967 +1560999644 1413651537 +3580664857 318356318 +1815883592 3041913072 2171448380 650624117 +2137866706 30543483 +3056720555 2150234713 2533241550 +3749436168 2604576309 +3347201630 1541433470 1879584255 +2161400049 3436371919 1107969708 +2576016066 2576016082 +3391222228 124760239 +3816291542 1029748662 3930789994 3957523687 +3390061313 1003008560 +2347743055 3326856603 2573046104 +4184909868 3769761844 +2337985428 4093317615 +987672682 1597823685 +4050322213 813036346 +3780200867 4021610119 +1845655458 3756158245 +755139960 1391991803 +2564295943 3319834130 +763766416 976139445 +1961500374 3800992487 +2431255188 3026325231 +3595094278 246634311 +1975231904 3341104748 +36145584 36145568 +817184140 961536865 +3202579370 396117270 3943801576 +1597934063 1597934079 +613162041 148921068 +1276705962 1276705978 +2650732826 3529647074 +2339008299 728508725 4136829442 +2521261499 1298474354 +2922178715 3417451524 +1577191973 351650634 +447247751 4074976729 +1028475564 749505751 +1701105812 833902831 +3314160730 1426667573 1381894571 1426667554 +1952096491 363549154 +62630533 312802063 3987175924 +2883757178 264825885 +1579774728 2798634364 1128273291 2061633077 +2290755046 1267019559 +1478011302 1423118401 +2050514931 2050514915 +4070589960 4199431819 +93804820 3779148409 +4261673378 2185361941 +1287984895 1825172668 +1604014027 1283366018 +2055778254 3006054745 +3761762299 3276829949 +3848574665 212838190 +3773147000 2173084141 +2143794578 2845116461 +2514908796 2717232177 2717232167 297573397 3789273494 1976337713 +1252070703 2861848824 +1349870876 3784166343 +22955967 2857186433 +1863390993 3907473350 +1850869158 1360979031 +1157105098 1550916845 +1750429609 4178008768 +3893069479 4045732086 +3229264524 2175706784 2367322721 +1486075787 4220121026 +347974824 4147812263 +3363926344 2429808536 +2359064963 3713222954 +504585476 504585492 +2016538695 1339916083 +1752818363 853535853 +2806689373 3079699554 +56605230 2108823161 +3206063920 63910037 +3992736137 2549311912 3614097401 758405806 +766381593 33567070 +1540083835 4242092466 +307071545 4254777192 +1352555852 4044430111 894230199 4075006932 +436518851 3094994940 +2354859483 3494809560 +194462441 673076423 +1662191050 320052570 3089342258 3089342245 1862901958 3237092603 2965687413 3089342259 +2842953616 3250465640 +631036485 1013642156 +4160944881 3820080001 1571883366 +720358434 3112065429 +3851137466 350799819 +1347763665 1194348559 +3640562281 3146318675 +3108101574 3965177530 +1267047644 3210079825 +1615037651 1363209066 +903463590 903463606 +4143536278 1619424305 +2844558014 2788282655 +840956276 1549119887 +888278242 3022977021 +3821033412 1790855688 2693520292 +1396694507 4169816290 +2067526677 341916938 +480204906 391234245 +3161185205 644907741 +1496715785 4285745439 +2386283137 3155423085 +2808524890 3769081259 +1812084944 3636255110 2996598076 3615453027 +1801922625 1415863872 +204901623 1684637525 1082614697 3229319010 +4173801123 1149358748 +165518474 2220228905 +1466795418 2177598134 +3955993020 3986436849 +3416950495 3926845259 +1686042469 2713948828 +3859118547 905150246 +2219865022 145110025 +2989243939 2989243955 +3572210299 2850303908 +1455875111 818527935 +1208285226 2312284685 +2560043341 2197160996 +2375731939 1601846779 +530527996 3282276007 +3987977465 2246437086 +3602287591 3898490016 +1950973411 4071697500 +3575177086 3575177070 +2118443018 3496783803 +2157359727 2157359743 +3360108742 236046263 +396270267 358350729 +1126027426 1240428291 1240428319 +653443848 1479083421 +3042733104 2961067925 +2903149626 2711273309 +2377822341 1949098362 867942570 +3646377035 2243959742 +2580976473 3066305423 +746458118 275574135 +4027861793 2741145425 +1647266115 3547354218 +3805010221 2255846802 +958360108 3218308928 410264385 +1920594324 3388427257 +1628684999 1182511556 +3256242570 321018925 +3490673351 1330753366 +4226370079 2783970977 +1900210704 4023054777 +3757373653 3547753881 2709191208 +3567142525 1028851953 +2464991139 3988669852 +1051263864 470840813 +2841925154 3007397870 7832381 2542597357 +3329804289 2217905703 +4150388120 119303771 +3687139231 2526003016 +1151422652 2367402096 +3221464604 1639874065 +3088413051 2560055585 3923131470 1271679302 1153541285 1153541298 +1190959824 2583865149 2938979604 +405574589 4115836804 +3656612777 2561268879 +2583229033 1215527886 +1591458278 998433585 +3402202983 1026531965 +3006186413 3214805330 +3787395427 3267911370 +1081088344 3363300763 +3508375932 2911634983 +3768985963 278082420 +2996708327 1793899454 +1925001521 3503583280 +2606530474 2886855561 +1039007844 3450988535 +366817273 3112655838 +1141211247 2208902840 2208902830 +2910309600 4086793395 +2642411214 3195936335 3195936345 +1887039870 3675660447 +1998846153 1453368430 +2005663632 505539404 +602879521 3264368432 602879537 +537719192 207639117 +1826934707 523433690 +618305970 3055547194 +1422629045 3568424465 +3483644539 3068555289 +846856401 1192184070 +3752995466 2943940397 +3450692429 755655844 2338090559 +1575150384 4230718613 +3864956237 4091047986 +3384731097 3179787433 1887687838 +2756252927 2651589992 +3534710830 276714354 +650707189 57442748 +1230438116 1230438132 +702170742 1486678993 +358034072 893186085 +1644973625 1685953764 +1223190038 1223190022 +2908286415 191637516 1631128369 2986237144 191637531 +2179663694 3321447736 +422156485 1635483148 +703889932 401127671 +3569908541 3647972424 882508052 +2775641017 4229488009 +3958262002 2722692520 +3174183780 3252467544 +796209451 3766249140 +585668185 3609215534 3623740008 2030678997 1718916180 3607984391 1585323947 3080743457 3028708141 +2179620943 1889869452 +955520456 1549529200 2400077539 +307113865 1511314606 +2504919362 1223637853 1272484597 +1164528676 1164528692 +2015704902 3676770182 1754661687 +2083162994 3908666483 +939166697 1493586878 +370433580 3994042199 +1879239214 2190911097 +3056740011 1398103758 4251205209 2708355797 1398103768 2079514420 1398103759 +3055221317 4051171994 +1818058635 1441428152 +1173719325 273090306 +526604039 2588919385 +1801884954 4015358118 +3428541043 651950860 +2864665979 1177784498 +1484659557 3011846124 +363474122 3840180731 +1494801808 3525626275 +2050629056 4234820472 +2440247105 1231033488 +2609984273 4136854480 +1713499601 3763572246 +4089080222 1282687935 +3963025948 3963025932 +3671410999 3671410983 +3442966506 3086066910 +74577532 2070349105 +3910783926 120826890 2598934913 2846377873 +3718081157 1674489676 +4287325648 4287325632 +4209597562 1267865174 +3876437458 4122798714 +533123769 548850863 +1508811755 3386195480 +2027851871 480478291 425946136 1932132616 2148282134 3694272131 1138859059 1792169822 +4068804800 3249412395 +3540084814 2033660623 +4110763714 1499886813 +1042434485 1814472375 1067087180 +2593939546 2852062231 +3462582005 2178644993 +1894074136 3505318605 +651550531 1705932412 +1998006869 1756010483 +1332627881 3013473560 +2223232831 3666597950 +4264015164 2293542149 +468308747 4229380674 +173936278 3893425703 +2364824455 569479990 468059271 1806439836 +2871683421 3502497140 +3210977967 901978106 +718125502 1164034783 400934174 +2728990426 1903983245 +3338548234 868674950 +917021886 3380303625 +2632466291 3634356806 +3874816963 70470050 343267711 1186700499 4289205892 357544726 3640911917 4264006886 3511276624 432295336 2652300407 +483429641 3989439163 +1180519096 2094833595 +3794574324 3768601 +2700023702 2700023686 +777001775 1462600812 +3419047479 2839401915 +775434467 2775905610 +3975416297 279742789 +2969810902 2128242161 +366131654 2044516809 +2390661320 2706108160 +4029792841 1733613816 +3817949916 1950534037 +1038045212 2190154769 +1231441797 1710951683 887486378 286207564 +1272181259 1772488532 1280659266 +4071539629 3055421764 +333363536 333363520 +1897140003 630445066 +1696364790 2235490519 +422882722 422882738 +113505585 1863220827 1620768285 +506443784 506443800 +1789260778 3443456347 +303074576 2148405301 +4174260985 2868591036 +2103707659 1870178644 +1507973455 3448313678 +1147974658 3261254797 +282198394 282198378 +344375385 1554076478 +43471965 1899613812 +3870339294 103181673 +1048204182 2772813504 4030883186 +261356298 1564427810 +3922879367 225985989 4140245138 +1812268411 44163624 +423763309 806638226 +271236403 3433011574 +2462137947 1253045768 +4278107380 3046611745 4272501984 +2441756665 362984680 +3461643636 1124171161 +1047498956 362869047 +1931013653 19259177 +3432697244 3484778568 +1554471931 3211812031 3598044196 +3602780488 3328384752 +877813972 833514937 +2739043453 2125068482 +4233876305 2509088912 4233876289 +2425680452 1108590895 +1963603476 3142463216 +691162462 2297560875 +4189781329 4189781313 +3343793093 3500667815 +471293570 3133785781 +121795977 3646157920 +3451041574 4132851905 4132851927 +1587557867 2295105353 3778339060 +2370252625 3733067853 +1602527057 2834560758 +2271597854 1129217577 +2853445174 4088106769 +2385708422 1883217494 +3751324528 1932638429 +2967378360 644611259 +919505774 3039133241 +1458824930 618686454 618686433 1525886469 1626552198 835809740 2303554967 3841104836 +898614713 2158249886 +3504908889 927214088 +32992494 2205557801 +501155391 3950411810 +3560365117 4042219316 +1899363400 2147231051 +101033133 2555088104 +4293356856 646409996 1869120453 +2209037065 1334701870 +2824378242 3163427741 +1680196835 2322919754 +3780641053 3666460852 +2212916893 607239102 +3513894753 410060176 +3963520553 258814606 +267133608 3099233899 +714270355 2554394988 +4267697639 4267697655 +3039547749 3431791754 +422975826 36297733 +248313496 2156135356 +2240090519 3346706608 +1449786709 1574554826 1574554844 +4127590619 645918916 +3657558725 4127495180 +2870212279 124609030 +1854623515 1854623499 +3927415519 555196089 +2962983915 4024255220 +2603761817 3910906078 +3496884948 4024902696 4052130745 +1087865752 1087865736 +3056270890 4021165083 +918275943 2426070838 +731561765 1596236003 +1974604169 3495008952 +61882762 43103566 +1799505340 2505295591 +1765610472 1952111357 +4051017231 3592065058 +4264070687 953662174 +2992641458 2284041562 2135041843 +2832505500 1655661457 +570368927 3569569922 4096250623 1504782185 +3144863157 2332005651 +3938174689 3175095331 3129856262 1721373728 3129856272 961141191 +3591377888 693075743 +3183823142 3677119450 3818006209 370353265 +1248102094 3930076761 3930076751 +1605896698 1081046892 +4282272522 3641712827 +1029748658 1363225907 +2168818235 2425616974 +649947696 497774415 +3375890575 1378410776 +1629051642 3572119453 +2090782752 1308729971 +258832361 844350424 +350832717 3710211323 +203656437 284616124 +1718431454 1641680126 +1335302297 3889824020 +3802347476 2721376552 +3699203050 56078683 +3263952617 727036120 +746394003 2615323258 +2548355863 876105008 1688306307 +893720057 3569456872 +3846449431 1069010640 +797132478 797132462 +956922570 3623590949 +3887445188 2265682057 +2490272702 1745222665 +673024931 279358371 +3787202395 3055901778 +606115199 1486475068 1581995752 +1332775231 1719634475 +3241317891 631383740 +1436243237 1184073308 +400233103 484325144 +662572464 3681520649 +601700048 1954194237 +262751368 796320267 +2301974573 860148417 +179567864 3512154747 +2397118825 3222586073 +1995568399 925147483 1306838680 +690057747 3534132204 +3362045530 4083639030 163377717 +1617131236 3121336804 +2732203220 828072368 828072377 828072367 +194900771 3491568328 +117599720 4040361012 +3925953325 2366199758 +1759621634 1210064194 +1651290718 2303851647 +2008315496 3642123700 +2042210364 2131004630 3678656113 +1896098190 3265183513 +3814271026 1981631450 +1417375859 1881010678 +1109917426 385242853 +2165500458 1522966555 +943226498 341016493 3619804509 1642342260 2537255675 1759785592 +457169870 1094855449 +4192636719 2498979576 +113320182 455308626 +3570746261 2696504202 +1585167164 1585167148 +3717951047 4051720127 +3586003168 3586003184 +1015688670 54830057 +639040596 1244608569 +1554111277 2150649732 +2426417695 3408848606 +3096878936 3733581216 +870328346 3286180093 +1335438861 904878944 +3580282134 1413437943 +907007504 720239395 +1337755008 2616314188 96872581 +2630256250 1183166987 +428267465 4165316984 +3625120929 3335985526 +2922494150 4278136070 4278136081 649983930 +1507266987 1507267003 +1371341649 4253825168 +3941927472 4265253633 4241799889 747637198 1677877223 +3057676597 835430604 +966242166 2000301524 +1557306273 3230334582 +2902897946 2072975357 +2549941693 5245076 +1642960895 671499892 +4047886278 1460003857 +1296695181 947735282 +2475579442 1734412958 +2217690532 2564528715 +2455646340 3997589471 +98915416 1727102224 +3101106941 399088087 +3367824309 3367824293 238741325 +2346482011 3875088648 +2873235929 723519657 1913565342 +2433274907 841903563 1592385992 +1442487782 1065783553 +4091801367 114385190 +115612830 1998130367 1998130345 +2809783968 1155927525 +1401216919 3841948207 +706890924 541517952 +2562585586 3132821090 +3634251387 2083058596 +1909459748 1012611911 +3421931766 2641234264 +3091146313 3787782111 +2043864065 1764361009 3355241856 3355241878 +774367712 2295671724 +2213629835 1071658946 +3518473247 3518473231 +433521460 3782871769 +3608116699 1751326660 403374495 +644022537 3404961675 3783340977 2892258035 1102729125 1085951519 1210825593 491479212 1210825582 1994039598 3685305110 +3628075062 2731339025 +129640472 1108155867 +2172843867 3442831646 1009476690 +1297382012 939315495 +1121554585 3581845704 +1600890900 3060364136 +1961110339 4072252982 +556894379 2074508572 2999490347 2630219938 +899228579 51583388 +68048656 1922240053 +3230084441 3455192707 +263418826 2172602093 +2493043995 3515365724 +3312454948 4083462079 +1838078477 2229355122 +3503846852 2294375305 +807821382 308907575 +2553539041 2553539057 +3694243977 2722166847 3591500452 +2435230544 3487543029 +383899298 383899314 +4210822768 2738175820 +1248241330 3516426789 +1130819823 168642616 +3349210616 3821166984 +2074696150 2174249969 +3820782673 3820782657 +1804290639 1806148785 +151397025 630235196 +2818851548 1521827911 +134889146 1646313163 +1362021714 1638878265 +2207663852 294757783 692554263 1101064901 692554240 3636206588 +2688594224 838534734 307859023 +3056941514 1382724554 +2493113860 4064614485 +1172161437 2568679458 +1258052894 1377268062 3880804227 3249595885 +2068190723 307537596 +2996495067 1549364894 +544688372 264755215 +112528805 872708780 +1181290165 2355242730 +788576018 270545221 +3853986376 3881275229 +1590761390 2394346466 +4272779287 34042936 +1820525465 1799268808 +64933716 54876503 3760397356 +2198444895 2803865224 +3002154365 784583636 +704846032 4074770275 +1315472455 2306217344 +3039828106 707419910 +144137666 759686109 +1250223645 1815494562 +3589315403 348419860 3309794415 348419842 +1971391990 4029217351 +2633898313 1828834798 2279026105 +227597379 2651503996 +3022194659 1424386180 +2784193863 2784193879 +809990735 1334151768 +4174084080 2555236053 +325633098 3622633595 +4112528026 545661026 +1063602701 3648229988 +3007590685 3007590669 +2557860947 1418319532 +3479247971 1143068486 1143068487 3638538204 +4262449614 4262449630 +2253331946 1485576013 +3310953664 1800723027 +3953053893 57186656 +3107117226 921611838 +711476377 3515954762 +1522013348 1942519337 +2742900025 3967230729 2538416318 +273031764 4066904633 +1098522206 1899875839 +542888477 17107689 +508626419 754402144 +1075314040 1573127163 +371026152 3091997995 +1356917185 319814336 +2275710214 2363833978 +4109001299 3757623468 +4137708177 4172731446 +2238518103 1639281145 +3592583493 1836619626 +2176097653 3221922064 +2601839600 300903125 +460801891 2948954650 460801907 +1803587038 1880228841 +2304228073 1874997915 +4121224429 1011638521 +445706447 2703955416 +1578689865 1781592558 +6555962 3615131211 +1123703142 2803193090 +2968992123 271547556 +2982331084 2219776247 +1727248830 3484247583 +1879827538 2881864806 +3847113346 2084522659 +3208466077 119606093 +643301759 2194479914 +1494483782 2155947831 +2912028713 1709365400 +3654862748 2245888904 3696418700 +3873608685 4266104388 +3252630191 1659275218 1225099611 3780954478 +783034687 3087330878 +3439637144 1312405540 +2422713075 2422713059 216199287 +294665091 688762666 +3409016137 668705272 +2841585946 3134043115 +2108323056 1784065072 +161155956 2467497871 +883497097 1865523118 3105775353 +31801065 3840018648 +4054995424 2647908568 +2980562695 1857551922 +1732159368 1751991135 +282289096 550585588 +2206658248 3580486859 +1179734027 3170959682 +2783013880 433911675 +1983717554 684148360 +927381814 978685959 +2332981238 1795587602 +1969007732 3743024427 +2916853505 3390497575 +2845950975 3806820223 +2189238628 3161193328 +10109895 3117986368 +1209896919 1569288048 +3987892631 3165469954 +2900316994 3368721321 +112732091 1323731826 +3511808760 2080472173 +1496966377 1496966393 +3226410318 1745238223 +3180410140 2274794257 +2117172372 1005001967 +3505132630 967050087 +4202896991 948152173 +3989850296 383941051 +1681886478 3725266191 +3065004612 3682095391 +595773103 2514404718 +2237771938 2241826445 +530552222 1029612429 +3095667411 2567802934 +4042593175 1710380019 1817256889 +2896047385 1099984360 +4179729044 1553656319 +2073920008 2700325533 +765854796 616298103 676905889 +1584479244 1584479260 +286271213 688316754 +2517629999 2517630015 +3568716773 706816441 +3032884347 547199272 +4164088041 2704359128 +491229515 1510102965 1697536622 +665516446 743552425 +2535659113 1430013784 +2536511403 2880782900 2186753998 2186753999 4249672025 +4194635668 704087535 +620456424 533182507 +1268600584 279144843 +128731383 645494697 +605205360 3238985931 +1118519506 3315010195 +957345950 1914161321 +2791625914 2402279299 +1119536737 2479670077 +2397150557 2413186402 +1857906674 1746727323 2156943122 749594590 1746727309 1177199077 +579983048 280784867 +1414127002 3185660986 1246222717 2142348900 +1189614114 3793201703 +71429336 412687475 +2532645166 3286452143 3520504697 +2276881906 426871526 +3469621741 3221928600 +3320726428 840199815 +2190078514 3016042654 +3409050915 45186588 +3876894091 1352255938 +795919763 795919747 +1633969387 3940553647 +3111336006 912365089 +1100004222 78834795 +1695163650 284705333 3116071822 3654294813 +3773126578 3773126562 2722088794 +607409001 1734299224 +745876605 1008673808 2037713108 +1814602545 1962468902 +3358355422 474329005 +4229225344 1423280787 +2105441814 2753592497 +264313403 264313387 +941791854 3430488879 +316984925 2012400945 +1359932198 3665466993 3665466982 +2563169805 1645615202 +3188149667 3363780508 +3678901005 3678901021 +3817074472 73805635 +1248327690 732657581 +3608574387 1264686298 +4285974406 3604591493 +884901095 4008392630 +3916762451 3594779066 +704396212 3423730767 +916127242 4294830509 +112507591 1718042521 +4040116776 3228783667 195850080 +2256918171 2808146015 1605424644 +1889435546 3817004907 +2592753523 3115589645 +1465922095 3144613870 +1188590925 3552618532 +3983505522 2031850440 +2473138269 3784578404 +435295797 1190866923 +145537385 3248236374 +2748179035 941315410 +2901102283 3466988988 +111520060 2999544167 +646300767 60039582 +3367066134 1959602324 +34271284 2724022431 +2138001229 3912881700 +2326527777 3009630285 1841471722 +628986450 1454200581 +2076851162 3109828669 +1930031045 3718542106 +2346626642 2524789703 2193106519 197044418 578685170 3705602057 1737856281 1588692248 +714852166 1497019191 +2608641449 1850865944 +2919515787 2075856066 +327595983 327595999 +3643993767 2452467936 +1168976671 3466256862 +3512491520 2489842195 +3548375548 3999094705 +2110325099 1852652386 +1441788823 4004439330 1884968073 3753670310 +65767840 3418990309 +4136005609 593820630 2873817989 4272040914 +148074166 2597800081 +1629591177 1586892014 +1189809537 521787959 3275464462 +1131486700 3598696275 +681637061 2167684842 +985619202 1956364856 +704266659 858955408 +3140719696 1786117291 +3344331777 3457719702 +3467445903 2151011608 +3559478539 135323714 +1889291625 2936921176 +160134558 2760517545 +3344757615 1828763322 +2109151330 2340138859 1797911960 +2011393667 1040644138 +42959467 1524203672 +2685314154 2813031913 +1518791207 104503332 +1331504768 1872993157 +1047897459 3325260812 +3735331843 620085770 +3952922291 1915977677 +1207437983 3933780040 +3410950269 2143909218 +3724732500 246635956 +2225554390 2840578535 +1120587271 742544662 +543075567 3825876024 +2565930225 1447337345 3026071398 +1294143087 3710892216 +1986724055 1098011238 +443642896 2296017746 +3435069409 829849727 +3686665417 3039699064 +1303854016 393416531 +3734742438 352699457 +2511005535 3597408237 +1722603988 2774293289 +925795841 49509670 +1073003106 272721987 +2545008802 1859272469 +2016037278 3365004201 +2465490145 3282374427 4140717813 500054488 4044529425 207233991 4044529414 934989366 +256951068 1616121356 1884510672 1884510663 941827345 +407357965 2832599410 +3539866327 3000907362 +4078209 3807779094 +2772750038 4247388025 +4070191105 1051985853 +3816708352 535173907 +2728922091 3379619343 +3092935150 610359731 +3869286111 1985308554 3530685997 +4100732736 151536280 +1193901939 2035524122 +3524201192 285665921 +2712280757 869160682 +1355690764 2482938679 +3319740703 2640767966 +2143969236 4287945401 +1868928620 3370896407 +3196016462 813068249 +4161328468 3387413295 +3824706648 939914907 +1312854823 3404383161 +2771281752 1611444109 +1911917745 378305190 +3704095161 2381091247 +1732313095 1488605444 +1972969258 1242304283 +1376635710 1753281095 +2883400939 2596726520 +387804816 2977303320 +3011602869 4175336794 +1454168271 1389726476 +856286836 2831861960 3432368281 +851940157 528510498 +3146735365 1202885836 +1796026173 2556783157 3921933859 3485715787 2556783138 3267452162 +3233371940 1658052879 +604098608 3738876821 +4142378185 2008350840 +3519939854 1594148495 +3803377041 2763820854 +2983618925 1636300434 +2507443046 3897390838 +2971333393 3943026848 +738941296 2710751240 +3212052476 1197300135 +2508657539 986912957 +3518195044 2171116671 +3653110191 1965637230 1965637240 +3051478680 3935398235 +4001100198 2490843152 320694337 1850425585 +526193824 4287068133 +1015248348 699051084 +1842268465 226932784 +770178573 1362423396 +2740923041 2740923057 +1923832618 2915074829 +4277906123 3976697792 +470824332 3112455031 +4281230054 2617618433 +1527731479 3857306250 +1284600611 2885173276 +2241438900 116021099 +1703963136 1183010978 +901554016 4159628339 +49770127 515118116 3593250843 474864939 415541614 1261342779 101520388 495936280 4195231841 2513899624 2716885191 3329481771 2961071210 3253859184 1179667577 +2182264283 2658420690 +1099876636 1338414865 +1422593425 475045719 +3470638944 1239893563 +2798400894 293090655 +181083756 181083772 +794332404 2087052313 +1056014977 2464470243 +895360220 1628164964 +777466282 2638425741 734158341 +764255787 3773824418 +2314283296 90933668 +4171583716 1346262783 +3472588530 2794086555 +1748247943 3881022099 2434208640 +3052712919 2017426522 +2383635142 2979129095 +2248644654 737448057 +450314387 1800468111 928279053 3318699344 3506960248 1611073692 4214053970 +3382532903 776533856 +2815661968 2815661952 +942158090 1900360365 +918475417 3268628350 +838926237 1418880052 +3563287128 3735652848 +3808333189 1038312874 +3590264676 1586381211 +2455824196 1739768515 +221356903 2634617700 +892251259 2890752296 +3662108530 517156109 +219879678 2678609865 +3278406714 2522209027 +1877649414 879133025 +799658404 2891253055 +896699349 896699333 +1789944927 1802165093 +817259496 591106563 +4204515643 1863642540 +5304632 3077290811 +1455520770 3478511309 +1345881248 2762124652 +3166575729 90802433 2420557286 +3225594238 653316447 +2885274841 2470279582 +3105650256 3083747317 +207608569 1721593614 +3259901072 2398790587 743069838 +2563409684 2597495919 +1185541495 3028341318 +1053236844 1941552764 +2323598394 1080360797 +2602973113 4129929256 +584153271 2260797446 +1485143004 908196679 +1863520408 1929584475 +4165105718 2046366209 +1201552897 1303502052 +2424759505 1431975174 +1815410584 1815410568 +1183333690 1183333674 +2256555888 1775177716 738004309 +2795180656 3055420995 +2677208407 1272975043 +1951754472 175383869 +1395209102 1054475893 1049876750 3732962757 3584100498 1049876761 2010917007 2010917017 +2667030199 4141576729 +254617779 2773550134 +2759898150 479958999 +338144418 1551155989 2395930045 1190598510 620356153 +1530206297 3985986590 +2658248256 2900932293 +3650654732 3729103415 +2278785034 3690106797 +3078427226 870572989 +3377341586 2013499845 +1849651464 2331194421 +3209527121 1830278881 +3202669367 1221530127 +1159443744 3936231781 3085863871 +2806323711 275746519 3063798886 +3439424158 1464299199 +1591980919 3614671942 +4251569084 2844506343 +1053436088 2419988923 +183724580 1764626480 +2888561739 1412534786 +2272611321 105043913 +4206866926 2848266671 +2000458574 308018409 2000458590 +2051293767 3223522162 +2617006853 2470660300 +3437919804 2983092259 +544271473 2193896944 +3768607258 3061477099 +512278868 1699239727 +1553327039 2130019774 686417058 3494945995 +3250570291 4170042294 +2046722730 2516360513 +3872722277 1234081949 +2290039461 2290039477 +4005753083 2460507 +1236058155 3575833327 +374379466 3940067053 +991729536 812014417 4268505710 3222282372 3021246362 432580230 130467773 2354447458 2354766274 4150320826 743786149 3329325573 727738464 +757264557 1570734069 +1591858604 3133970135 +152170336 2805716019 +2107189237 2904155818 +2691183978 3993769421 +2424921008 2523430095 +3994810360 3456588667 +3359627451 99551080 +3781091915 324942850 +1540590341 2466502874 +2624534385 3021227750 +283549442 2634829877 +4124790920 2420098589 +2436791907 140572124 +656246747 2928743756 +1271504009 2958848005 +302909626 639089885 +3285658010 3285657994 +1842986727 2518112996 +1823724973 3424214866 +265397937 563389869 +1703320352 4075172723 +1509628251 21555794 +3227674433 2400718661 136820701 4256386517 1289437982 2178904092 2768920213 1518182660 +2188181620 2731830412 +2372355265 1755394545 1519467478 +442057649 730173350 +2737445077 483782807 3334711660 +856495395 2343984656 +1203635257 1303043536 +400880271 476123355 +364861280 2620820531 +475711333 132637676 +1094388644 1408455487 +1791043616 1791043632 +118615119 1882652760 +1986619956 2616340441 +3147000386 3336471886 +3863153023 4203213566 +3395542191 3395542207 +837308527 4290158264 +1878777967 308019217 +2295725923 3420522698 +193033576 2227950251 +710896928 3560491365 +1069387037 1952785570 +1377034844 4057462220 2378148615 +2710671215 3341077432 +451165196 3952779044 1632274145 156390455 1632274167 +2633302036 397314921 +2841290356 229902479 +3537172748 2942741340 +4107678715 1748227108 764867775 +3883611674 409956456 3661084304 +466570529 2120895582 +1868365427 1868365411 +2275214943 3977485938 +3261548490 2032577238 +934043243 2793917512 1875285323 2612514837 +91693956 512551135 +3857137098 3401598600 +1965768877 2169540295 +1912245065 3060351992 +3199620535 3994048035 4027117328 +854704389 1261555075 +3023111276 604450470 +731133008 3931003363 +2723229351 3788613289 +2988854439 424323808 +93625309 2784058594 +2187416330 1228257453 +3069623032 4268250235 +1647513639 3177344374 2119983801 2180132388 +2135183682 1463235150 +2946239452 1319545681 +779431829 3078219658 +4122399652 1926179625 +548406766 2950816377 +2235484241 315971462 +1702125924 2381640259 +268688957 1930877460 +689434946 4071672547 +4080078274 2553849973 +3158833340 558665713 +3626314405 3798796177 +1427407232 1866980485 1345437445 +2291024476 3083998262 489955836 +1540413221 1450825802 +3100614747 2169119180 +3067024360 1945423978 +12933688 1856833083 +3971843431 358154550 +2602980462 3906016505 +4256082146 1005837269 +1416337095 2932716441 +3293063248 1301771747 +2596469000 2834171805 +2047594240 1689698422 2890748199 +3400229908 3776372468 +3425854741 2287280138 2885776902 +1443513430 3358167921 +297524296 264664610 +3204013703 4286740697 3982627716 +2985503924 3587137359 +1952229249 1507209905 2933633046 +688279987 3904233677 +3169727844 3472755839 +594022235 399518802 +3955821354 1467781906 +3634684773 801726109 1888614394 +2283475186 882617573 +1655081769 1215810575 +2612667920 906619683 +3092638146 690442187 +2474229738 1278994805 +1985526652 3383698481 +1211613281 281270432 +2884966311 1226457523 1507081184 +4216896277 4021728684 +2251684049 3210259553 +3339432619 823828002 40518461 +1204787954 1353439454 +3015223531 3994241807 +3666489209 2156444542 +3237787339 2564014466 +841744462 1229224665 +2275332216 2643565468 +2654738371 3684263932 +3802840558 2672403733 +1911483021 3894098930 +3347165526 1730816615 +3739401284 104831791 171942267 +200096601 527723806 +110511625 1737506872 1737506863 2366309380 +335188785 189644246 661366071 +569353911 591622662 +697497264 691475996 576345877 +4071632120 56019579 +1571585008 1720130243 +1140808905 3556708462 +302362028 4184878785 +2037969419 2349742009 +3466914798 1000302521 +2649398230 1850954225 +3867645112 2766909703 +1810261211 1675100901 +4008487579 2844817602 4008487563 +3066821450 430986264 +1889320653 3833976980 331373732 +2118566529 1248080128 +3104513636 1137908303 +3325867876 1972679273 2182404952 +672791509 1700119660 +2230917839 589640654 +256359370 1641065677 +1366637553 747461744 +3607036097 1327587147 +3447006235 1702277576 +3147140413 2305644290 +2292387252 3433992793 +1499662380 3806715223 +4076650708 1305231004 +2834864178 2834864162 +2010729210 1412651330 +617021611 1399725145 1380370638 +1273410955 3913132036 954851027 2103499124 575544841 +2127008243 1414442848 +1621584314 3649109141 +455497095 394879635 1146659712 +4236708269 898906948 +2473831633 4028173584 +859168518 1416453446 +411617914 425115147 +2499898872 2095993491 +78941465 1476487627 +3853736191 2555713918 +2926469445 3703775116 +261997412 4183463551 +2070357793 1684183286 +2029437425 1567837808 +1661791615 3529054187 +1432136591 4024570382 +182349800 69872171 +2258198385 2258198369 +3347071964 3941258065 +3211665425 1801222854 +2865676247 3128426361 +39605161 1616360216 +3840051500 2359167335 +1383595134 1607841506 +3145090672 3079880903 +698592227 1873253962 +677029290 817023643 +1998544837 3356238333 +3192128403 1337952768 +2548644710 2133492647 +6125778 4193542750 +3801463785 1539907928 +1877584160 1289043301 +2514074332 1410496391 +206881103 3094105944 +4099459991 4078219986 +2955409234 2699712005 +3441584297 2519384600 +3915420717 4050005915 +576603286 3194190406 +2355737990 4200546916 +29459042 631259221 +2350599755 1008263022 +1755883168 3001032761 +3092529575 3550697952 +2452979139 2452979155 +3029710694 43703463 +3371920342 969589223 +3800621249 1585041344 +1674924760 1453978227 +1709708417 3981985536 +3756716338 3756716322 +3947044999 3786159254 +1003150110 1045884991 +4152958237 1649851138 +725599110 2606812129 +1754723393 3869409856 +2331627881 1242886862 +2875474130 3027505534 +2123583892 3145006923 +231799277 1588292690 +217271707 2593558157 +1610247022 2234981945 +2811781306 2397062365 +3512893981 327390902 +118737990 3382455866 +4228144869 2682348140 +932906554 1426140419 +2066367025 4089506359 +3428401571 1466356533 +1556898773 3938527324 +1833937439 862506718 +3794869593 2513659221 +2951209058 4175853714 +773636722 2154511079 +2553590324 2553590308 +3685450826 4235469641 +776457200 1817695112 +180536032 92321211 +30447763 560632867 +3297507855 1957864266 2002429326 +1211613309 1582045963 +115612826 1931019883 2607094370 1931019901 +2526158960 3727955208 +742527998 2852485321 +2476873055 191365660 +2003499968 1868219231 +3178233837 2990259329 +2012954760 2331474428 +4003932389 3671516758 +3096562938 3402139719 +508620593 680622528 +2678065078 4276888465 +3141352585 3439928056 +766020355 3813856700 2540074736 +11868533 2450985788 +108711013 381657612 +2680916455 1953109673 +2530629109 1751732412 +1907860806 3701616017 +789485868 1073422423 +1388229667 1698009866 +1282604083 2042846629 +3886283331 1338053166 +945038867 1439608983 945038851 +3741506461 3574521218 +463042647 3382210800 +668700224 2623004699 +1605005150 3108875981 3435420722 +404580023 2907222544 +2142945696 3003043571 +768287155 3385199820 +3732880524 3461107809 +1959106743 1715523875 +4237458809 1540564318 +2898189652 1148611385 +3933646025 3788636270 +620919007 568608542 +2713631873 541245184 3742551974 +3613223440 403568437 +2322624461 2784986405 +2160932106 1684478465 +2859408493 3737229511 +595385337 3693049104 1325613679 2508539939 3221022686 +2808015406 2825561721 +2175317446 2961405543 +588567449 588567433 +1974971310 4263723769 +1660233250 1660233266 +1099255972 3369988649 +505064987 2130711698 +4225372616 1078590941 +1587106768 3143561315 +3863251899 954726258 +4032858817 687500736 +298635411 2557237100 3000651174 1122461334 1586339607 3017428796 3896933937 954685121 1429049815 +4096524880 2974262243 +2447741189 2976074458 +574122711 2797355092 +4119965976 2891565261 +3483194484 3483194468 +1792422207 1848608318 +83325368 254005331 3027139630 4101827028 3117512190 4146375851 505184399 2908748815 2103516504 1713331541 2185330380 2154235015 2520858363 +2673215286 174938631 +3413429151 1211056714 +585631974 585631990 +1557688367 1471715832 +2009346948 232593609 +2681413971 3965547948 +10982585 1983226543 3289263774 +946081321 2719241819 +2359808596 2839767870 79026239 +2937354348 1263606502 +3769971709 3124811586 1980947700 +241470891 1410834300 1397425205 +2994270423 3412271728 +947116066 947116082 +1582967732 1102227424 +741475754 2992496807 847987663 +3413831049 3682856622 +3325691285 4005056855 413090860 +985217716 4109803086 +669805364 2885326109 221037263 +3403272219 1877121682 +319681247 3723842824 +2841955995 1152466450 +3509131509 951208362 +2636216091 1488108744 +2898250877 1861150914 +2807395954 3716773235 +2809859322 2696244619 +861895507 3616873654 844047277 2578632766 844047290 +1895723277 1700169829 3985373042 +1578716348 319766508 3721645031 +246928121 610344424 +1950517636 215698041 +2526211593 2526211609 +3436939299 2694270730 +777056826 3542103446 +2462599043 2856306544 +3589496881 2422076993 +163486954 1091634267 +1694455481 3069543720 +2123234177 3129142272 +3320701627 387260799 1350298724 +2256945180 3780570129 +802232784 371958371 +3721860623 1030257775 +1507355516 3954258983 +3169920549 811614044 +4045922119 3905191104 +2744816205 3646181156 +3829881947 3545171707 3394173135 3774759944 423218907 +72561621 2683574090 +2996512785 994054854 +2527431359 411231868 +650243644 311118321 +1108849241 1682817544 +1771795236 2421800588 +1058965410 980041838 +1483515925 1976887980 707620055 +486402626 3365012814 2202829898 3854026211 2202829917 +1954335144 141652843 +691924244 8140409 1015660671 567280116 +388686181 3716207084 +2354415592 3534025259 +1150705175 4290118934 +155994559 1645746088 +3381611790 2845527695 +1252806560 268345620 +3679531877 2782128108 +3342361513 1978756888 3272729307 +1415958764 3360154519 +3421289832 2720656464 +14323568 3199886153 +2340074308 257004910 +683030302 886621225 +3923968439 741332969 1163584052 +994858960 690895989 +617346221 1372208514 +1603410187 2113760322 +3948506483 163357699 +3513234122 1883141115 +3554046310 3767829377 +1150332823 2261019302 +279647959 1908198466 +1769984553 1027069582 +973293537 427547837 +2751623400 1415980456 +3747198681 1933236126 +4247666783 2019796252 +1500480426 1064310665 +2496803940 2867362153 +1220731333 1338599706 +1559936299 2310523572 +1799448504 2415281837 +2274708800 2953354195 +531544160 2842781784 4165429037 90663876 +1683983365 224460936 +2916476856 1606141613 +581969317 3967419521 +4146627339 533088834 +3720082992 1857024821 +2977394012 2977393996 +2446199876 3411889951 +1208172529 742425357 +1492224131 2268718634 +3945029522 3158471365 +1055905802 496048059 +959543021 516993362 +108782714 2936581131 +3694548469 1076494822 +687695265 2724861565 +3549417914 4291964950 +2715534988 1492749943 +2184031093 3629845786 +980763279 2509752078 +3859291911 2066483204 +1051979351 1872299526 +3751636414 3268657695 +3755613873 358502576 1232663894 3755613857 +338732291 3415458730 +3549262962 2041466725 +878034680 3966046592 1526440059 +4012445305 4137797736 +1428879887 2464788044 3973276551 3956498929 2464788059 564635032 +4238746402 3683208853 +2762417381 2838505114 +3003471426 1842335837 +3726486964 1555591759 +364875248 747401411 +1187344596 1020304815 751862943 1187344580 +2237618205 693305577 4138364632 +1720216872 364349880 +4213737799 4213737815 +1711806371 3992802918 +3136947224 245016305 1871999441 +660852157 4109876427 1551199394 3206340756 +1126264732 2149523587 +317975890 2452176258 +3337980276 2827444633 +4161956061 541084885 +1564005683 2859788109 +3437375800 3222502203 +353875809 2505420192 +685581242 4247664767 +3219914357 3826720083 +2566719301 458387852 +3857940415 3176274366 +4132212153 1937971774 +4202185162 2269199155 +2138537024 3065544205 +2883279468 3219622295 +3614958991 3233701902 +3475557967 1815922254 +3234489365 2476444938 +1767698275 2675451107 3978432842 +2244021409 3732204742 +2829386098 3124881178 3988866675 +2204695895 3464058580 +678908036 936624095 +1487560788 3895829551 3245440876 +171598126 1206319993 +699562575 4076243544 +330947150 4141858265 +1887920513 2550168742 +2913678979 3884372028 +2965731812 2965731828 +858889073 2739838976 +1425049191 3431085216 +286986354 1603986277 +2079686884 125429503 3872571364 2917564623 +432534090 3754060411 +3645764929 1454970176 +3509666658 2995589955 +3576827110 2211073537 +1199842159 1199842175 +560854724 1679521417 +1786784257 1066907942 +1123240336 3076933237 +1191849681 644543998 +2783075111 1247116896 +3147423059 2788649402 +3244452052 2349267471 1669286542 824399446 2830783589 3695886549 3915783836 1854591261 1776392023 3463561824 3500784955 409977842 420741076 2121196661 54914442 1926959069 2350645891 3772453255 3438432869 3445562664 3302311298 +3953301645 4060911547 1014873074 +2112603574 2522405783 +2250085309 1459860873 +1526405870 86503858 659252409 2326757230 +3445644758 2917826721 +4205725311 3476650134 +3972438694 791012836 +3176148677 1982003380 +1347036336 347586819 +247182456 247182440 +4132814033 1892163204 +4236227967 2900225835 4228560616 +3897446198 3913724433 +3627740841 231060504 +2641385624 108758460 +4264133759 2111579149 3861501482 +881252368 3932574055 +2954192106 464378957 +2343101249 1385238809 +2093904796 352321169 +2116731952 2363589684 +1338444211 1230259404 +2845295133 384209844 +1575286520 1670087557 +1213119476 3354517775 +1358718574 712945451 661124121 337422007 2419089456 3557659949 +3445120622 2954667823 +4001100217 4002517480 +3319178933 2598805670 +3267911386 2070761789 +2204719302 2765537185 +1655333168 2184642179 +136141500 707188275 +2856476782 1954401593 +3682231857 2997804848 +1767361461 2318773756 +712737815 4151373862 +9692534 1986837449 +3060922386 1198097491 +4237212652 475355919 2177824030 619813364 +294428512 939070808 +3888495051 2806217346 +2791524618 2593895525 2593895538 +1652950407 3818362644 2684007318 +1331637077 1204893404 +4290924283 2517404594 +3471021303 2667708635 2700837928 1106917457 2675225659 3174834418 4206904355 546787037 776354689 1799200203 +934898692 3169127007 +135775299 6944117 +1621708207 2148450769 +95228616 3077869771 +2830568142 1713767001 +399802723 3867651786 +3868492837 3868492853 +2584292379 2540727954 +214245614 3113749560 4203645581 +158042389 3913862154 528926363 104223832 +1238966388 3033405081 +1798665231 3559240600 +533818165 1269548156 +2435628392 4050528939 +2131266312 41082269 +4289179363 1475891036 +1284339140 2094010606 +680832591 2443910299 +3104452383 3001029084 +2303640699 2802378843 2717863332 2651380271 +2691432649 457054930 +1547131299 3458341770 +471594238 1040362441 +1750352835 1868610983 4289113084 +1983812385 1166122208 +2700906746 2931669157 +1442324645 4204487596 +2147409853 2214331083 +2416687622 142749777 +1961603014 2632204054 +490840801 4015220768 +2630540810 840552805 2912598918 +392157603 743306896 +696865549 167852658 +1005986292 1484223257 +351261954 3689240583 4153168437 +270045013 101401581 2880021194 +2634382702 2634382718 +2601252944 1675093493 +3266526195 3539691895 1931960204 +1148632204 1391120488 +4225920190 1131491103 +1861061415 2987489708 +881471300 3518740505 +4038190282 1552020934 +1104725407 1391927092 +1539738959 3364909902 +3433355309 2685634432 +3081782520 578589293 +2171618696 2171618712 +425462891 3511550062 +2566719297 391277398 2566719313 391277376 +4172998209 3476584512 +2597883864 2599055643 +1190728043 3746248148 622226301 +877596697 4148920994 +3865554979 2143154448 +3591367335 2718852342 +2533164071 3612182880 3612182902 +1047725609 1047725625 +1270463313 4063938199 3929717245 347267336 4080715821 2254561424 303330038 +3521702119 1487315872 +1546319165 703516881 +3957796043 4151018281 +2348319038 2348319022 +2962781216 536792691 +507651415 3417843657 +94318351 3184880474 +2061678100 2263130479 +2775339807 2290538974 +2403879723 905633805 +598978002 98214277 +2540206357 1853266954 +4138453143 3882665392 +3227674441 2004958504 3954109843 +3813451588 632225327 +4250164984 3285287035 +2247244617 2955747257 2955747246 626217966 +2586711724 3859627969 +357223572 415239417 +3394188529 1806718832 +2929003343 2929003359 +3965563745 2021745056 +4289744485 3884673260 +2689941302 3934433558 2620555783 +1143330303 1183834238 +2011972762 785221809 +4201131609 3833814613 265125852 +858279771 1160484260 2275184959 1538941179 +3643136941 2476272276 +1413606383 2462476600 +3243583389 2030569876 +339734345 698724344 +3728354156 1100110593 +1932450620 2395152231 +3210371896 1934242093 +2357894918 2357894934 +1584884408 3527834963 +58345081 950965832 +3321936657 2757419241 +239810941 4251680706 +3132807098 2921437661 +2398092320 595197573 428458086 1904761811 1017220617 430945616 2107131408 2063439838 3678748689 2660579819 3761589391 +2786623706 1385355042 +673348520 3512913859 +3640014135 3264595344 +1629022743 3958698388 +2702737685 32672962 944480809 1363879231 3736077157 435335816 +2582244187 2789048388 +2691028892 475163271 +1222135990 2473151242 2711346817 +3799894050 2084263966 +1462183341 1532812818 +2640894669 2567991474 +3914471616 205321811 +382370377 701176056 +1182358435 3898818077 +984868949 4000325451 +3235987545 2723919839 +1234115137 1001833318 +246667707 123013 +3434567981 798022963 +3942991001 2454387912 +3890246436 1295408399 +2449535420 621724785 2474412785 504281456 2474412775 2286659248 +1095843213 1095843229 +4186615048 2008809520 +3068430270 2814488607 +1895462704 172597379 +1316743931 1438973292 +2675478512 2716561739 +3087031573 2464558060 +2985174036 769837945 3037089640 769837935 +1493435150 793825049 +1417863429 1948900911 2146737889 +2334233263 1797463298 2753457408 1944017920 1635178281 3670947395 3229484779 851733590 2403121001 2020525519 3801744814 969505817 2519072242 3025115004 3830448959 99491988 3057646123 2780720680 2632837997 3377068799 1581212121 4126964332 611476220 71775365 1965916281 1789108795 +3493006747 1532914450 +2546927372 115873783 +3535498543 3831790673 182344262 +741767581 1881005361 +1089189978 1773056829 +2984512061 1190927892 +386020803 4219118058 +1607608828 3958350802 +1857669946 2289757259 +2263871360 2329959855 +186137567 1445347358 +860271324 215387485 +3134513207 4187497652 +1778656980 398732206 +4231256508 4231256492 +4171425750 905517750 1047721447 +2730932638 3705025449 +1828395311 3192431864 +1242465541 1185626905 +2307368687 1871432248 +2162969632 335271539 +2640821619 1028602906 +964762522 540963691 +1041127706 3398845437 +89497135 89497151 +1522730964 3037024943 +4001725519 3408048216 +415015513 1240699422 +3056740021 3345881677 2247290602 +1770983166 1770983150 +2638285747 586702931 +3756989324 4011651541 185636499 4204856317 +3369112145 1901483398 +1120226081 1033192672 +1512783991 1763081040 +3334468637 4247603618 +3574561455 375267704 +3425493209 1134949768 1866289167 474064830 +660664647 2939916339 +1713653684 2132598863 +3879643576 3215273133 +773131755 3961172444 +4087943252 3877942319 +1959668063 1066082462 +2519577229 2374107070 3079133199 +57290143 4035474506 +1881041561 417451742 +3563291563 329801586 3563291579 +420612637 2489707426 +2452402454 3957663201 +305932938 1052178221 +607558369 1786901959 2130101520 +2909781790 3297227978 +3203767890 4004002565 +3506463491 3421747380 +1617958711 1282913187 +3035317579 425596162 +3300280740 1324739903 +3633060225 3586889914 +2750846238 32366049 +2077618069 3071688236 +1855745030 2863608391 +1955707891 1953161100 +2731609613 1545150066 +3158581190 624821431 +783377927 615197529 +1777569744 3568273097 +93201035 3990384047 1237344468 +1192113447 39693430 +3371588046 701456217 3859670708 +4105952397 1593803707 +1123549879 594298374 +2253942106 3610518699 +4276366617 1346788117 +2122313169 714154547 +3080189056 2218124691 +1981201255 1981201271 +2111073938 2808745925 +3770884872 3677365661 +3760313145 239043240 +1635980320 2706943603 +321342006 1557779207 +1664512617 564984793 2545294158 +1005692447 2087224030 +2522797499 1917482354 +4086976484 3739384456 718824676 +3494174823 1131233846 +495170737 659911334 +1728574978 864568629 +229072935 2776391030 +1534292189 99637956 +1901947747 3641707722 +872630881 872630897 +3824078392 149856827 +2641866933 2557160675 +171550724 482573897 +1714164399 56166394 +2189765277 885373988 +3435414714 318255325 +773649264 127088963 +3453246099 2555024762 +921852845 1836190318 +2989337927 3303524032 +2662712500 2351212377 +2774666144 1795230829 +2181187156 4254381615 +3572866967 3584703152 +1402211951 18004142 +3578400823 4204234384 210293923 +1754016455 2288933316 1537693526 1406472089 +1125552096 2089150448 +1708682172 2777924455 +2742821512 1520710557 +1860517346 1960864451 +803190824 2782240835 +3022604919 4121082120 1445281625 +4100323375 3951407598 +3657558720 4043607123 +18741605 2851038364 +2389653035 2048166702 +3078791040 1654724243 +1872033629 75589492 +1255664550 910262106 +2392458280 2759101163 +706912914 3084008749 +3370660080 359561820 897911253 +813023019 3770411854 +2690534579 661831130 +1420856656 3680638831 +3943316937 3391046510 +1762285941 264923917 +2344879929 4204441135 +3156973297 3937519488 4124905107 +2724169462 2455860551 +2951230491 1011368392 +3986429988 817496233 +3590199155 1375660556 1375660570 +892617288 928656024 +812451027 812451011 +2006679775 1089477020 +203613139 3991708972 +3239624887 1246471989 +1179949584 3275675755 +2857226751 394368126 +3796802316 3159491732 +1010159954 448300058 +921213793 3509361056 +67616505 1362207230 +3689006458 1806310997 1002690902 +695678749 2672539976 1534598767 1672200884 2304992532 +2698725636 1026814303 +4165377440 1789235612 +4131885055 2980556414 +194546511 2418232654 +1920940267 4146358612 +346763805 2793399220 +2162738108 2146331779 +2459413491 3083055002 +1333273795 3709984490 +1700610785 1926252598 +3967167999 1024092286 +4148080949 1823536746 +142260937 1173121849 573835886 +2780737398 2141670730 +3878504633 893214773 +1368555071 2828844328 +2297551171 339873584 +3771410082 2177749251 +1953019587 4135678009 +496198604 1527126561 +3914219349 712809547 +3310329674 3864510829 +1264590677 1049966090 +558042267 3065515592 +171493547 927060184 +2539983915 2132721570 +4257085556 3241814751 +856185178 245310958 +176558488 235224687 +2219059824 3054424029 +844242474 1389412124 +1794013304 1794013288 +1023146028 2364915009 +2069217745 4177533968 +1213518585 3599244798 +2845124463 1691161528 +2734620276 3111328861 2734620260 +1111009576 1731348971 +68742385 1681719152 +421675674 720296061 +1788394576 510685667 +228789105 2707136503 2723914125 724930582 3903521510 +184439287 1163593670 +4224154167 1920816368 +175516161 4220011216 +2288584488 927439170 +3490107147 2243423810 +3233993374 109295294 3233993358 +1396407316 2299109579 +3077729521 1824232413 +1549158432 1485565588 +3706324674 4189664477 +2109980151 1745478229 4273903714 +661945629 962655394 +845556577 3084274080 +1337896828 3138350636 86917169 86917159 +878194978 3940177469 +523760744 3594311299 +940701012 3991904959 +1278637549 1264797778 +3601153638 1277246091 +450314378 716333611 552462962 3592960364 1315837581 234236007 877652131 1717870248 1591553448 1208094413 77533473 3761240966 30989987 986997009 3305201692 +2504321601 1014809664 +2462298882 202558499 +1032379302 2816986970 +3629141230 4147200430 4034199919 +713030995 981191098 +2240417665 3712029956 +1811625385 2775939352 +239837348 621666879 +2827875461 3698847066 +3328340149 1748440214 193912469 3566674002 1067250642 1929211557 2117581544 1040279717 3687363962 +3936900949 3226749946 3226749932 +1739612100 4272341385 +2203051042 478249189 +313268425 770376824 +602246525 3264123509 4284332994 +3479851645 3273961134 +2085973692 1987924455 +1123993969 638088644 +4109991984 3569666965 +925196020 3285482009 +3261693783 4004651915 +356805278 414439081 +744421175 276769680 +3458250946 1065539957 +3502175928 3797346628 3797346643 4182274576 3502175912 +379739482 4221105341 +1665979742 2951996137 +1061060108 2606787809 +559657736 2337985931 +4166867183 3925016632 +1610679015 647642867 144150944 +2076016185 72201150 +3602841642 3602841658 +1842736853 2000318330 +1940271065 3885847198 +3096155237 3904543482 +2489825437 1011326772 +1986590407 775715670 +2881407498 1733823931 +3538898764 1522128033 +743813709 3552103333 3288752891 401059634 +4024874771 3140629242 +1228426669 762730745 +491667390 3761133599 +497720045 2605609384 3819472953 +3240371758 4276526444 3237189748 +43602426 43602410 3739729602 +1138897324 2299802071 +3980013581 2140775538 +4031893481 4031893497 +4066791079 2478823136 +508867537 2769865470 +3631723169 578486993 1701720950 +1372465801 1351415214 +3149871175 3573913536 +3341480939 1939733236 4122086927 +3270413576 3850896267 +2850335429 939054106 +2033399937 184959494 +3864732762 2355677219 +1158850111 1158850095 +516749882 3064850763 +106849537 127467670 +285143460 2952871832 +367277098 2688425485 +226140238 2265323576 +3298813782 3719900263 +1572244132 3627614360 +1460356481 2277403136 +4150848095 3643339678 +733506111 307183934 +1368887669 3868850986 778461965 +1476678357 1674470748 +328715920 1744448675 +1262273103 170086554 2409095805 3683503281 +58400598 572186166 3503445095 +2497569349 3395332202 +2312691524 3085039151 +246911022 1492645999 +2110758995 1624859322 +2671906731 1374023631 1610525236 +4232253788 1063911702 +2839970205 726938295 +901871615 901871599 +335516040 55712029 +54767745 2760825600 +975463037 71764702 +1180561575 1199915684 +3831277879 3172507070 +4226083918 4226083934 +2788491889 376625126 +2942908648 4262915860 +1535416570 196923805 +2583496914 995418757 +1623372898 1336724916 +1251461714 3044105245 +3058834663 3930292150 +4052690032 3025558595 +132960748 1708029591 +3154964923 2766399621 +2208329681 1522105206 +993821222 1715528151 +3118214519 575072553 +3160410171 3703931647 +2080270653 1853860628 4110038050 +2487720875 2380553176 +2993895766 2715270 1447135287 +224931178 2231336411 +3280657288 1084411840 +1604071853 4276099653 3004615186 +2296293788 2201818044 2885499860 3365662300 +3236629703 1827958578 +425693825 1107727793 1920180502 +1375496193 2122211646 50351607 2861629362 +2928750700 2928750716 +1405518009 2591859496 +2990862638 3498552185 +2520328321 3209128830 +3989357580 220377845 +1665310993 3731973619 1110978208 +172525058 2426760181 +1123319581 2212764331 +3315418289 3348308656 +662154290 1517856414 1399067301 4186533837 3983777106 +3238937870 2665416345 +1138147786 2501054715 +387911770 3219570109 +2921207287 274502608 +194399743 1016907902 +399738436 3321650441 +1455840267 2772624706 +70250297 3649913739 +1274728642 1574347125 +157814168 1937496028 +3340646033 93316678 +1350360136 4237215051 +438484427 3880295160 +99362814 1354953929 +2307356398 2307356414 +2823281815 2149597616 +3354196988 371026161 +3251301853 4017386219 +4291053078 3086636209 +3018922401 2541354268 3851114614 3851114592 3851114615 +3928952565 2635369404 +2371863833 3815228905 2797815390 +903832078 903832094 +622124221 4063928776 +981620143 3391939192 +3924662742 2038243621 +2120109125 863113356 +4075162677 2650055933 690594163 1427524660 3901500221 446808522 1238782237 702902934 2173531451 1113003762 591718400 +2320757392 1378277557 +2103365754 3692499542 +1862855557 1342882394 +1587373288 2819198604 +3036378895 771680336 +2541238746 1279463979 +2703104034 1968379374 1557773037 3294625155 2838844066 +2878160550 3042549579 3042549591 +2021674896 2964276072 +235584637 2548480212 +354735474 3137077875 +3706792044 3791980439 +1995898121 3421899900 +2242500579 1298061898 +696652492 1670052820 +2222491946 304234885 +2524260031 2573991592 +2678689200 132779011 +1091765604 3048381197 +3813558091 523909890 523909908 +3947927032 3967138437 +3623624360 2850308733 +1908993665 2689561856 +473346214 2900989926 270013783 +3548440820 3891181593 +1252358942 3922187071 +1370060191 751053150 +1823381520 651780405 +79352215 11527427 152563888 +4218639712 915367475 +3184500372 1641456367 +3838091372 2374535681 +3502375933 2859742014 +1508419423 669903464 +733679583 2552912811 +2073421435 843590463 133813156 +3880187572 1343550217 +2187137853 1486330187 +869845587 869845571 +3192080150 3392845254 +3150081504 1930622899 +1575731416 3991354912 +2992275539 2649502935 +930430427 3731658213 +2260052315 2867714312 +44439231 3212071530 +947116325 2286529098 +1283298077 2799116546 +4053432222 4096413097 +16311337 2966367384 +896065954 3055235605 +2841585951 3168707112 +1778912666 2225957245 +3257489816 2681747236 1058540109 +1186024602 3810236011 +2154879848 2578015403 +495241847 4010457424 +1193199435 2318368888 +1806389287 2779721056 +2647684746 4180319035 +1790568217 463916104 +3107107146 3570210669 +1415649473 3156288998 +2305440233 993602008 1262043880 +2534798707 2534798691 +3395140382 201199115 +2485210964 1352709433 +131419901 85716962 +2334932187 752574171 +3599458674 795502181 +2434063187 3067429818 +896163825 896163809 +993352171 993352187 +1727334708 1203600601 +659536870 3364145943 +652376764 3151620721 +3874501234 4263471475 2121465882 +1780424704 1480294449 +1389741312 1720000275 +3885337435 3949617220 +246827115 2482241652 +4046736668 3512034065 +3123987042 2021191498 +1959456220 491676305 +3421950601 2660068792 +970914176 2583872645 +2359912032 3467389221 +4136274595 1865060240 +271222045 941253396 +1519912124 4141295596 +664740657 2792148417 2424596006 +602027115 3893920884 +2020423581 820939810 +954649273 1280385342 +3204680536 3204680520 +1072311758 2573312109 +1294357730 4039468052 +3971975372 3911277547 +2275156776 2731235325 +1883159512 4090200363 +222547199 796824234 +2943711373 3585845810 3270297083 +162095386 1240675043 +1326107409 1326107393 +2170199948 1112286135 +9575046 4137467525 +1515080502 1598055953 +3460949481 951212889 +562592401 1524167248 +3319778426 4182696989 +2291865585 3924275350 +4270219105 4093217112 +3560569674 2635944101 +1993796694 1784023921 +1364744693 51748028 +4286101862 210516552 +1694182058 2707696013 1694182074 +746163352 627650400 +2519608384 2005315085 +3508962222 3986770671 +371389339 2829307231 1946516740 1541805349 2829307208 1946516754 +3769219624 1992443178 +3861047047 1341239318 3861047063 +4255041733 4255041749 +97144968 2776417803 +4060975300 3294482741 +224262371 3991850314 +1731373466 1354305206 458961508 2765025141 3145987879 2832135601 247528829 +2924351218 1457620723 +1313182202 2131623637 1107182294 830786717 +3348368681 2639328398 +416462599 1779157961 +3483602287 1299686840 +2817959043 748022896 +482513985 2270126678 +252651372 551227159 +3332389712 4265434869 +4026960717 659376676 +335878765 4043872644 +1111292207 1962689774 +78126999 3953769136 2888884995 +3414689168 4146119075 +2229233453 1487891396 +1474823554 3829443509 +1126554646 3399055025 +604988718 3286528943 +1628406212 1028497796 1270586543 +3135715570 61570534 +3482446235 4094045270 +1177768915 1439495482 2518802477 1034286144 +4269371807 942529886 +612792020 1403850671 +2227735686 2377463542 2377463521 2421117591 +134556269 1043353810 +2779295220 3163150095 +114992860 2788469831 +1563683977 1102928824 +4088115718 290383953 +167837405 2626762228 +169861340 3425630791 +4056218511 672662030 +76508053 3267779466 +2143538041 2587447144 +1981499820 2566191575 2326080192 2566191553 +1156330948 1156330964 +2565440621 2565440637 +846659534 1062515033 +35949630 2642986377 +1567792118 292258897 +3520099189 3223699747 +3623686056 2875172221 +1109286402 3817029577 2823131390 +1767169053 3986063778 +4117799396 1146018303 +2269118041 1119708702 +3665379083 2413571188 4158537309 +3276445756 2859312753 +2534390253 2534390269 +3722930895 2300759323 +3768533986 2092424405 +3756255743 385642863 +530439318 1535262769 +672244378 1797716417 +611386468 3253332351 +2584551998 3945830669 +773770555 4159066111 3581744100 +40599043 3526844092 +1281870073 1080123390 +324667148 2193168353 +3395548248 4082738829 +2767749142 3375473319 +1108906134 1108906118 +801604193 2551332534 +1844040092 2736060551 1844040076 +1575559871 2499916478 +1540769492 1540769476 +2824624084 3713942191 +3154204627 3374137658 +3490944406 561897078 617904935 3291420842 +342634097 2538413040 +1196750184 2998817451 +1855024437 931695927 +2430575874 3519540980 +1060405766 4066431776 +3365256790 431661425 +1593516338 3075817907 3075817893 +1252789030 3000339649 +513178505 2950985895 +3338903725 4155895890 +2808558836 3362369684 +1062160564 1573876569 +929237439 4024981416 +1597969350 3058442401 508076218 +2663331850 4043650989 +3161986836 3017436882 +245089 1726160800 +68343060 2107993711 +1190942395 1963558500 +2576308658 649634514 +1780393940 2394617908 +2005033907 3577934540 +3474272675 1784551183 3403274885 3614985553 195912697 3898343079 1336965182 812950141 3226780272 +2324234483 2324234467 +3381373912 3381373896 +4232896004 1851585272 +3430420059 3507039077 +4237498370 3945680696 +4241412492 2831721888 2831721911 +3255290519 155446192 +2631727238 1977301729 +441143354 3868428034 2660191051 441143338 +3278282152 340332415 1116352381 1412128528 1015595476 948484983 +1675640215 3506500784 +1972500836 3186335399 +4134460900 845676260 +1158283970 1891784565 +4116065822 4283608474 +1246069754 3849241245 +2719423477 526451388 +1893900546 119889590 +2768941526 2782262247 +763162240 333896269 +3726207472 2449589461 +3304078019 3375137020 +1208851756 1208851772 +4184746140 1136720720 2452010610 1147792785 3051965068 4261294267 1136720711 +3809994227 1906245018 +1725889862 4066805668 +1406828477 3862160075 +1386422383 2670056925 +334644055 3177185766 +4291005229 3453228996 +1747264835 897165418 +2951145675 3011540884 +1750817722 30500317 +2197673369 3466018760 +1087555622 835785665 +942637768 986374347 +2595116727 1564657008 +4012475595 1230769026 +3531894788 1770782747 +1021733471 1035563934 +1862091411 1269812602 +1473534655 38460094 +2870141563 883132222 +1686064508 3877364067 +3608906535 3344698976 +3068706558 3999574473 +3814393654 508320263 +2055914157 2507175506 +1822112325 2838095565 855228522 522195779 +4000181234 3999995291 +743506978 3850994051 +3139666626 1525077859 +482880299 3993122648 +4164976003 1350931772 +328087769 2716040606 +3139568717 1827171858 +1485810438 3844517604 +424534462 2476367391 +2101684202 501077339 +3035695335 1810412772 +3592820021 1905116471 +151972120 2193955415 +769851980 4279234599 +57886819 1497314909 +3125543048 3450131997 3615297460 3450131979 +1575227538 1611011525 +3364618331 258248530 +904819339 1902006493 +434859123 2307753835 +653792301 112701573 2240266962 +1820522568 439146845 +457464662 1117505649 +277354156 2990256343 +1259786529 3024474440 +956553173 2136065705 +1337524572 2235523591 2414152396 3694994375 2329109657 +3386543461 97523850 +1151384436 2097616793 +1088011017 3470325789 +4142699529 3211594296 +564948854 38131306 +2224932721 2224932705 +2670986955 1776726420 +1936540504 218170253 93886195 135788960 +3473039766 380078689 +4264727040 698078739 +3027045559 2738780793 1077375810 3495028761 +622053637 1663398618 +1355141582 1355141598 +129219545 2163178152 +2676965318 4102120609 +208903936 2583907603 +839375096 3126496891 +3624115195 3383922994 3536233211 +623302687 19618959 +689017227 4289131704 +3614335532 1321503575 +3226214060 1674856663 +67321943 437639064 +2542166106 3800673707 +3033511291 502968493 +2952245930 3591456517 +4193435857 1243973894 +1159198228 3635962233 +3966269162 309539419 +3276612009 460061966 +1905874002 1552958774 643808517 2962681589 +2210592405 1620630892 +61166472 61166488 +3443563019 2590852220 666009416 +700621828 3244831327 +3181345713 856668080 +4149770513 854171095 404604598 1900451280 404604577 +2058290309 2079995069 +1019384855 865053570 +4237717124 1507802564 +993176835 868637610 +3431180145 2052388381 +1497246885 642957452 +1433088742 3451461402 +1539561714 2476427917 1733199077 +2544783829 2036157700 +2442753359 2207492952 +2826597500 251528452 +4020752481 503408700 +1365576641 1682233981 +657579338 4252982125 297878342 2323448485 +3005253799 3485833892 2318417107 +1450676839 2235267126 +765145981 765145965 +2897412821 2999809372 +1525189466 2340292405 +1280326549 3354552137 +3618168700 4208447527 +1278973566 2618957752 +2071559779 1020660048 +2651293203 202176915 1210126464 +2428334139 355970276 +1107906034 3915833558 +1390651489 3714191520 +1894059452 1894059436 +2071255168 135910477 +301285913 1578569054 +2186082680 2536290299 +143143550 3966205001 +2678176188 3698086685 +1412410172 3004169503 +1096634514 2446301997 +3185455419 93206729 3943584766 +1319508349 1283071938 +2072221504 2955352517 +3232083135 742562232 +2102657712 2669480024 +2818325625 4121219061 +1833589759 3495246250 +1281801253 1064775961 +2843213310 2408192459 +4203638608 3191421667 +2216312232 2639204203 +3696099913 399349998 +1181536063 474628158 +762519404 3305723521 +2963132184 544015053 +91288345 2848895048 +1216055458 1066512787 1618490073 3663493248 3697048498 1066512772 708549018 3138143399 +2010615628 4099314856 +85169374 3688061311 +1324512928 3887119845 +3748505725 3005667199 +2218768832 2289528 2502473627 +2433116780 3105458199 +3347794408 138762301 +1269880943 2022417324 +750380410 3549380163 +487566254 1839940335 +2075609993 528720287 +268073361 3092078406 3092078416 +2813299005 911543042 +1608128928 954911355 +242984444 3366341543 +3307770614 3986267141 +2394165575 91379767 +1048228036 522470537 +3706036535 1886473634 +3969712578 1026147445 +620932645 1748509740 +2494142901 1434297545 +805345636 4109465727 +2132433478 1551637559 +4149582927 465526374 +411353758 1366238910 922640063 +2371272560 2371272544 +3187681151 2570988798 +2388908707 2827153945 +84146089 2386485006 +3262007843 916370698 +670606838 3798811217 +2870479800 3968511427 +432989165 2377174546 +2979328705 1316627926 +1657082987 478618494 +1227284701 87292916 +2073964669 386290900 +422676072 1898821780 284595645 +109124775 1726530520 +2131403277 180165220 +492353604 492353620 +2309187702 574452167 +1612027239 2834968886 +114081593 3981510334 3713068440 114081577 +1853861170 2082805469 +3907520183 1547866640 +516995785 1798466350 +3200743012 3086966655 +4063678682 3795233870 +3763791416 3763791400 +4164623403 4027406260 +2633954565 710653644 +2476398031 3036958747 +857053419 1435613976 1718842261 2123580523 +688029498 3371059293 +2641904323 2807109884 2807109866 +155810688 1055144115 +2416217931 36541204 +231681229 2317584036 +542095964 964845255 +3958877765 3152500364 +2792617613 2509053924 +242259890 2802853150 +1430828399 2259464655 +1698009884 1867945233 +2742013618 4211237413 +1965198582 1533273937 +608539197 900990242 +652118313 1498540952 +2956369557 641675779 +2901799891 439276858 +1422168575 1680954538 +842572475 2705187198 +3850471615 166347966 1137316988 2366914433 +557146424 3106959092 +830165135 1948242200 +1459295389 2319545122 4277864546 2585272427 2319545140 +1917443566 1917443582 +3773187589 260061644 +296355763 2175409868 +3759636178 1119294331 +3409427155 3012178774 +14239267 2030659868 +2324970013 934780930 +3031712843 3267854868 +2543094986 161087026 +3509794348 2141079383 +2147868959 31802273 +379629034 2297546573 2297546587 +3181958554 717767019 +553456867 3232228858 +3754100831 2667982216 +1777781327 1547737242 +3883240602 3262487855 +2755890375 1565957462 2755890391 +2348979026 3121474067 +1828323995 2791602725 +3584458610 1986419641 237129277 3991578606 +424361375 1266156619 +1396223498 205126061 +2343377539 1923633767 2343377555 +445327709 638721396 +1431248314 2249314453 +3359409475 2051393660 +2678745187 3158463434 +1673149544 2365345861 +1388740371 1635388154 +3242957071 2987450111 +2576338237 4200601364 +3670485328 2754118804 3707771325 +3280002614 1596778497 +1751505728 2555913669 +610135175 2337034628 +1859576100 2688838591 +10023059 1394523306 +1891281030 3046934910 +73063468 3255941440 +4032364503 3810221379 +1479873423 1787677198 +4208991232 4006351891 +1655414566 696806001 +355996004 1428255598 +2401966327 1473793232 +3783528064 2195903372 +51678362 1935234667 +905246797 963150258 +103664509 103664493 +210882591 3901399262 +3625491286 2226948209 +1195782636 528520833 +1578689863 1748037334 +3731878646 2405327616 +955266398 2360041 +2889797200 1994311669 +4031067952 1828053123 +4165155531 2631241090 +3883966473 2021387822 +161756581 439655114 +3866236243 2041955917 +2752547723 2752547739 +3828415799 3093097403 +3917649227 1324822381 +1079864443 167387455 +161010594 3180668949 +3789965212 964868743 +642458242 356981993 +1714799619 4103715267 +4133267624 2058437827 +1970931346 2165856197 +1916976250 1494135837 +3205953076 4179260505 +773650431 2098148796 +1580154242 3904121245 +3581161985 4009270311 +3939652094 3897734430 +3489761559 2305478448 +2554885761 4195233191 +900992274 2624623429 +3558773410 2417263274 3239995826 +3212232296 3086568582 +1724075928 1568033883 +793177589 1638439082 +3231406066 646672883 +789587695 2442667921 +3144431416 2945993464 +514599203 662540807 +2591005734 2591005750 +278717748 284999500 +1573294186 160782029 +3976198221 685434107 +3659557898 1156113229 +2183298141 961136235 +2596953877 3247681052 +2261290924 3652856768 3388292781 3652856791 +496864355 496864371 +3162107751 452190006 3162107767 +4059517878 3171033116 26638270 3652217103 2863480261 3419395515 2544118675 3080522328 3452228598 2572923377 1326752381 1306267592 2527271224 1123416161 3806336823 3111699273 1670405377 1930482800 641368449 4039341987 +945503492 2810702329 +1104083053 97588100 +2988687489 4014476054 +1927224735 3274892485 +2766297478 2766297494 +1725452014 3565437103 +4096363444 2708479961 +2195829774 1126557654 3197085767 +2940134631 3970955040 +1986925618 2653560345 +4143227195 4263104498 +1234242893 4233666964 +3925253306 3504383856 +216631989 2047583689 +3169808830 720375305 +3100820283 3100820267 +2553141472 1881958579 +1866741601 2304978358 +2627473868 1437598753 +3647876992 3363096197 +3615019722 3845369798 +1015631224 3006004741 +330816209 3681384198 +615213591 3503817254 +1247975438 531454681 +361616978 1156839163 +436021895 1888088704 +891934420 3778158633 +752723761 837714637 +3362801530 6944986 +2909833336 2854301956 2150028525 +173577995 1417004610 +1208409067 1305228002 +3468643377 3626475200 +244345078 2194482634 640438465 +736924935 745445910 +4254900954 395599165 +2700241298 4019990739 +762559983 3185231163 1700422801 +1135750206 2827699833 3852454446 +2940668355 2949930492 +3260594405 3601535084 +2264646572 1692087489 +891607382 4278329969 +1720796089 1720796073 +3190207790 3190207806 +3526010050 2558919370 2602655075 +3488455985 2215539750 +493948157 2525552117 1442280002 +639306666 3553800256 3640315457 +3298195779 1057468208 +1658597158 4249483206 +2680786023 520186216 +3826093325 240454500 +1454569670 1102946209 +3486545367 4230578553 +2662865488 2370562066 +1877394072 4103225831 +2885766395 3238801188 +2884061815 4115151092 +3528393055 13422090 +95150117 311548460 +1461320817 2397595119 +3765742586 1370143389 +2420986543 3636013432 +771805393 2870377867 3967501409 1011398918 3967501430 1108775703 2426039048 +1672964881 3137516993 +3307534184 3521183392 +2813376442 125696643 +219957825 219957841 +1296811616 2724078892 +1793950923 2212015336 +1279475248 627376836 +4137983533 2386582905 +3758656687 1551202168 +3955108575 804528247 +644406512 422381149 +895019881 1677366872 +4130909324 496072864 +2236517451 631691796 +1247859490 1637407518 +543107281 4213005430 +2294137086 1976149214 3200859167 1085722569 2578172002 +2242359212 318344129 +536841693 2677336767 +4235761499 3436594245 +551078068 251139336 +3873812730 2625677247 +2401343724 3413026341 1413303740 4255814350 4070292611 2999824693 3943404724 1847770677 1517982361 2486419726 1883158080 2720551031 3505824130 +3748388069 2142607395 +3011920294 3708370821 +1959562610 1342351973 +349383447 3964903632 +3705840044 1690599873 +3176146265 1753979828 +3659500512 1068052901 +590977360 3282852067 4249881003 101260968 +3548475561 1780073486 +2121491614 495163583 +1972250435 1372049020 +580460865 3088013654 +3129872609 3129872625 +346125162 3827871693 +2543411860 980823801 17560040 +4075922428 1852122535 +3545363984 3120978723 +2890893302 926091345 +1030323805 1010245186 +3161774128 567432555 +3010976552 201576868 4164477840 518523117 1709833027 +3521072117 1468306108 +723168580 3624630907 +3584690931 1303329946 +1310967847 693376352 +1355479242 4186285549 +3869726141 3869726125 +254567648 1733343221 +3266049134 3803302191 +1014871076 1728263999 +2868512120 2677447675 +2916496047 1462880632 +750858788 644527119 +4232651054 1428110191 +4209650965 329578507 4021447840 329578524 2377932744 +1470742471 3342394966 +2689228389 3121780986 +2966612921 1531633054 +2926798200 396934125 +3354184052 767631769 +3864636358 1697212599 +542802267 1232708178 +3350023656 1037149227 +999161278 2122740255 +3507035644 3507035628 +2693695297 22997846 +4245439989 1330782396 +1455857766 2847174055 +3570242279 3570242295 +2096464520 1048345611 +2668008085 3965239452 +3639959601 4124955328 +847678427 1691232722 +3530215123 4150520109 +1047243109 883725450 +4255739697 2193230384 +679312324 743694212 416590179 2173293961 +594647580 3889535495 +206931794 3164866067 +958752523 14759490 +2539706009 3866219230 +1132489990 2796395335 +491779662 1927331033 +3680837115 1529754148 1529754162 +2979206104 3908397402 +884814541 221415937 +1898602464 95743411 +3635484255 2164875700 164207969 566870827 2110142344 180985591 2949369458 2265541404 +4054518563 1499411706 +1436831742 1362406754 +1703975721 2512198789 +1597457535 1660998632 +3762232829 265617291 +30900369 4274706976 +917354927 3262860910 +526193831 4260887322 +1536930163 827492355 +488437384 1553471499 +3426486864 1529504444 3531881461 +2340328488 2340328504 3225631485 +4105450459 313369042 +412669179 3013035812 +3747855017 1392433176 2071695359 3039698446 +1973898611 2892863200 +855020209 855020193 +3470113035 925917323 2775731266 +3619564441 261255580 +3989295195 3858094110 +4027119992 2879969619 +1640298726 3474182679 +777884675 370837254 +2517574670 2433666665 +3518337941 3422061101 +1507812102 1428788964 +4142619290 1316986987 +4035710228 3229128313 +761050940 2767483751 +4282326218 4282326234 +1839301727 4098056584 +3054501918 2838500889 3106942783 3054501902 +1601942307 1924857866 +1900295071 3982312264 +400158788 2590764856 2631893252 3491052297 269543139 2590764847 +2417168081 861729083 +1045636458 868407237 +1466354911 1976861470 +1291692581 3125318806 +3224314652 201354959 +963734476 965521953 +2413763574 1916339281 +30746834 3029287557 +927691769 80187646 +2059365321 72789368 +4000884112 4159480252 +349723967 261802536 349723951 +3668646014 3109523017 +3805663188 3935709881 +371732607 1939235371 2360518231 2343740609 2746403467 1615091688 +1251977719 2875876451 1884852176 +475457084 3637276785 +1353695294 1118544265 +3639177822 3445567298 +1714260599 1452832994 +1629317475 1145890524 +786858314 4200156998 +3023919602 3337302938 2928973797 +690430713 3248229864 +4192323963 3648007346 +3578177378 4253243005 +1250009542 269593249 +3210896829 3171024010 2567405551 2984019401 3459036151 4033857829 +2778737262 690146105 +2917503962 2590490685 +3334078881 324233681 +3323875834 2566251611 +2158552311 2238795605 +1850039839 467568614 +2920080138 139028653 +3009847599 3397018920 +3044088333 2920022628 +3135045997 590184389 +3461841860 1933078191 +1447746791 3201941430 +1167599068 1251759253 +2684510543 851390286 +1836508293 3389203142 +663849620 3726452463 +3511091712 3965647623 +560854732 1813742369 +2660312269 3613564607 3886793252 +3022450290 189357413 +296003286 4120977195 28474172 +728508719 2791000248 +2895371858 1557462868 +2416866247 2378187350 +1382014448 2632605916 +3383022191 3715581112 +2441236028 1277241447 +639987833 2247102056 +890106139 2683473298 +3861529569 2087785990 +819769959 3780655716 +1257891629 1777682695 +4231993363 710075884 +3577269025 3379021024 +245686034 529213779 +2077122652 2077122636 +3833257267 3765057370 +2667835921 2667835905 +1892956026 2859195641 +1763256276 3707001128 +377432736 4005086060 +1472318716 2875462044 +1120749091 4209276679 +3453051850 1806097568 +2857124732 2450406439 +3636879629 1296746340 +1081408755 1098742177 1064145504 +3169727851 3590199138 +971885825 844740758 +3317302676 3621177337 +1654321506 2615803203 +2465957273 3943086697 4210249694 +1198659472 274520936 +4061623195 3052076292 +3445462916 2577401977 +1072822156 904442209 +726218838 2051256177 +277976502 3408833927 +99421747 2267896410 +4231448310 3880263 +1373384619 2292124212 +1008241164 2795589879 2795589857 +1945550453 596056823 +3097630099 975697516 +2709715098 3210995175 +1717771410 3800989823 1717771394 +3875088341 1866052700 +462774385 3710308838 +9231863 2268006255 +3904028889 442858616 +159618486 3502058369 +2401867764 1383740697 +3707475193 3641410536 3707475177 +1356209800 1787741521 +3885354925 3932344249 +1808551648 2459970227 +2170205534 3779163599 +270195437 1195811588 +2705297697 449900260 +434687407 585087724 +618905817 3951596936 +458940258 1913497429 +1677854353 682126103 +1542103692 1046340215 +403339887 1199488174 +1469179660 2775150865 2742852973 101414688 3870210017 2167039324 101414711 +4167359342 1959095865 +663569293 3496040164 +2280146977 329878496 +1007401579 4051072610 +2928352016 2881353652 +1288082511 2461843969 +561590978 561590994 +325336190 80427615 +2714571014 3151088737 +101579982 1443166297 +1709856882 354981403 +551032849 758906294 +2096464521 1065123256 +1202746777 530392098 +695475676 499843399 +201233162 3955325101 +1360433880 1055732339 +2833707677 4285280856 2425511785 +4214923548 1728802307 +609408675 1116322695 +1081577335 794199522 +3180911868 2621259626 +3748477974 1939613921 +3525934968 3451158547 +3539912524 3294418972 3373396343 1930673313 2602792811 +3655626009 1284777679 +2105213913 1638338206 +2207244383 2415664433 1917644305 +3138917681 3085524006 +3567791521 2734388678 +1073613275 3969545179 +1761021950 3299429191 1857229608 1437789148 +3417640639 149452758 +423478677 1363020188 +2811856340 2863508665 +3090038317 499900612 +625434783 2760925020 +1581751279 1505392952 +3241216347 2066856530 +2644424564 1140877388 +4177395595 2195277762 +86621882 3669442251 +2319359845 817844861 +1726891387 2216124580 2496471615 +1234722984 2702737034 +1499529487 2066712396 3705404088 2234488591 2066712411 1587556997 3688626466 +830854618 1689321806 +3546753368 593892763 +2190419062 2695770322 +379486006 3514974727 +4152999981 3671688900 +1483457243 212057810 +3720704398 1690382994 +3425095784 747913372 +185549830 1862800737 +1880639096 3996577531 +2002636751 4280343052 +2204103696 1966083682 +1907519506 233204805 +3311562533 3268584992 1753206892 2750356781 2824106470 2520292368 3275503266 794666303 3877493427 576107690 4159782731 1266372770 +1380117029 2757138490 +3391673685 2752772602 +1593516351 3293926952 978755836 743795969 3293926974 +1955184939 2681935540 +1678319206 3764050561 +1289407611 2003822002 +2901657947 2663774788 +324956247 3567966438 +15915893 1268833363 +2758543123 3910083322 +3595192977 3891487312 +3162740950 1897943761 +564620114 1284370949 +2123014950 3072469565 +624550505 4018439407 +4032714069 3406132145 +2845730523 1639092894 +4031705037 4142807639 423854002 +2874209988 2337533550 3696662959 +3474167083 651416226 +1780807147 4214285931 +4230915270 3278726049 +3424874557 2563354626 +1299926342 2381452679 +291582043 3070172996 +797571906 406227189 +1304784395 2256630654 +3883269716 248303150 +2515888485 3734053137 +528430348 356138844 +3657558747 201635538 +144963200 438111109 +3413742766 1746202415 +1270659561 30620773 588818904 3761628630 1095717811 +1599403163 2914848772 +3966468180 2168128559 +1409217226 3290163582 +317145331 2360571488 +2601763194 2705488451 +19409723 222039533 +4257251562 1611329627 +173052424 2127894320 +2247210826 3458236661 +1741081889 3515736390 +2341505265 1437590647 4201449878 +1565921365 221002064 +1252685965 1465144728 +3397919830 709964657 +3065149485 3354603204 +4015964209 52989232 +4188257973 2982491900 +1093592983 869700272 +3512893953 4172371323 1859513298 766918473 1767088116 4136710882 2614940945 1268111838 2883412904 1212071638 1304515547 983523126 3588608177 3239189990 3098148091 3282886160 1060192760 1876584358 1306939301 1714320426 2350024844 3850261950 +1035286923 2940835266 +301039088 317787979 +3872293384 1595323019 +2866243560 4272829955 +3134821277 3486541929 2383699288 +3626228823 2540952816 +3367693988 2722475071 +1095354368 3341146131 +447720283 1569374290 +1610293964 3830957857 +3787388035 713869237 4004633094 3576908005 3011830843 +361412372 4250809465 +976657993 3975884024 +2210362015 90271838 +3329930257 2217309904 +2104066626 2937589226 +4153668542 4153668526 +1482918816 2375978092 3300183269 +472212910 274001613 +3774195612 3199654545 +3934343306 3726491441 +1032901402 449237411 +835757782 680754759 +3541407371 3541407387 +2664965605 2523253871 +1528795795 1710436631 95665516 3350757997 +1303587564 1024233879 +212315448 603303739 +2987230586 4210065066 +2026273611 1802770178 +3599360507 3599360491 +1442355883 22772532 +2811559768 3514610404 663615373 +1613558177 130048118 +678425589 823642509 +3693344285 2821751266 3418271979 +439436305 439436289 +3020461330 2261871579 +2145415187 1632660986 +981748879 2906948878 +1427342423 1152996592 +3340201934 34434898 937754969 +2549788188 1308802247 1828827740 +1513675658 1629412789 +3592157385 4036679992 +988478137 1587659360 4116309823 834883142 3866257805 2996156001 +1260461711 188983003 +2400001233 2345979271 +3437945099 2094674383 +4113767263 1584666270 +245052495 1297307726 +269538879 3644879873 2659180028 +2088471579 624145687 +3459484403 2384706714 +2132554102 2355282037 2405555409 375441080 27580638 4065907643 1106393670 1954637161 +2835211785 1960159342 +2199855943 2969864406 +1485636923 2701081586 +3454334977 2853975856 +4073694120 996850855 +805246904 3165954269 +1688660487 2042784022 +1155167550 2716242079 +3917002410 856133019 +1630997941 3560854803 +2430121334 2430121318 +2766821885 2415620834 +2872420616 2602274395 +712705676 1806388855 +4204359554 269921162 +304720404 3622888172 +3553008743 1192456109 +406665741 406665757 +731952714 4160681581 +4240487131 3193540292 +66051402 2691367589 +3110976446 2780728329 +1975473313 4247927158 +1670073635 3325590307 +3589111136 3589111152 +3297507846 1851430753 1758902915 +2487537480 2958184029 +3701181274 2732351165 +2073190012 57326887 +1591052808 1591052824 +2053551119 3272407116 +1133361288 3759767051 +3245898995 3567735210 +193897419 4237023380 +3544647227 3553545970 +2018429469 2164796340 +709845458 1828126085 +3904086379 879769496 3183942498 879769487 +70230272 2973962459 +2649174583 2066728611 1783860585 3388214416 2066728628 +2931526696 419927125 +1642558852 4126676601 +3308137413 1901448682 +824630103 3890060661 1227187394 +3219617948 463653703 +2826195373 3692860242 +3719221385 2201110446 +3287536500 3973439375 +3656362706 3089423773 +4118218657 796195211 +3685530950 3881456303 +2233066683 1120080498 +1799350719 2602163580 +2034712532 3140213491 +2797519995 3914282082 2797519979 467089727 +4205830378 2363428941 +591353717 4055280956 +3250738870 3136192657 +536382502 3198674090 +448532538 1347569429 +1945203933 1383348436 +3846492465 3226282966 +788695199 2684162654 +1731537716 2897412815 +131668141 2351402862 +4070439680 4004651269 +408929271 202342569 +1617987865 1042767243 2538736392 +1075895890 3776070969 +3668853292 3508560056 +3445901783 2181084994 +4146280433 4252045424 1593626774 +2925289779 3785109687 3587729956 3785109664 2926379866 314764109 +1871699128 1467512251 +3020320114 3846665623 +1363310756 2409884223 +399209281 3058069334 +3880137675 2537257730 +1860971967 2662438529 +644734178 3265672930 +1123549873 4150491478 493632688 +4193041391 1588320561 +17120416 993947635 +66723694 1819105273 3808674610 1819105262 2965338671 +4247032950 2190634805 +1513826885 835412803 +1897464641 4266742897 1264590678 1264590656 1897464657 +965934219 761499348 +842528558 203183545 +1967630656 3754913747 +1199641924 2044698825 +687766030 2928007694 +793492659 793492643 +1721451137 124367104 +913571766 1855687569 +2390497809 1583155408 +3384267949 521956760 +2105113226 272361275 +3947022609 3947022593 +1437418913 2160368736 +2463644537 2741346152 +2239889309 3366282292 +3743541744 658856779 +3987961341 1785907083 2043670261 2043670242 780320066 +3078312224 2612144181 3970983682 +462035573 3479676476 +1545633751 720297282 +253132509 2640950772 +116769321 501261966 +1332987151 2172842316 +4263708604 3441765607 +1697999494 3642142967 +337694958 2645092015 +827787080 4093670987 +2866489849 3470188418 +1764536250 1264099805 +210041513 1582733336 +2343664299 982962895 +877529542 484008609 +4245515219 790674746 +946991177 610091768 +4090662842 4090662826 +2787954842 848061053 +464254121 1316087822 +3428722686 3057186015 +2375906582 1317897109 +579279262 937088446 4172108735 +1340195656 2520346740 +3048184816 305618251 +482710467 301632944 +2949834330 3153808415 +3858890149 3457147731 +392966963 307534170 +1533273923 558173802 +2183502003 2486133210 +2086875107 3005506122 +856227105 445878609 2015787766 +3418466532 2782715625 +2346626628 2265335233 138301121 31992460 4116947925 2419742275 333450037 1743792735 4004725299 338089408 +2274696033 3501857184 +2265204622 431793305 318180623 +795274122 3515506977 +3138343339 605917236 +3713514508 2599326150 603643895 +2770337853 778067970 +3344302480 656755691 +2171210524 3589242119 +2447854395 1096607486 +2785073745 4189969303 +981209622 659585201 +820554865 4180386570 3968206110 +623251335 32141718 +2428153056 4055084987 3051234483 +1820641244 1820641228 +3819573791 3819573775 +1522850618 501554251 +1733986099 794744989 1733986083 737527456 +2657746471 2279282550 +3510826892 4167807351 +3747399236 1964094776 3486921476 3809221897 1964094767 +1272689328 4074443429 1367649736 450513685 1520710155 1520710172 1350872114 +37976805 1966765690 +2825306021 2825306037 +3395314784 4122870579 +942659761 3544596288 3616903635 +1691572933 2109203468 +3513422088 448777264 +1354949777 3016609862 870804740 +3893411436 3893411452 +4052533979 1635933586 +3132472993 2367362934 +2551245180 3734998567 +426815975 4083682998 +4194161380 1150857978 1503187997 1721419875 1855126773 +833284764 833284748 +115612814 1729688463 3678890521 1729688473 +4279745507 3998741131 +167225834 167225850 +531243447 2412974864 +1241998077 825107426 +3026737802 3026737818 +2158614142 3906091993 467471774 2080141662 400361293 157067359 +2743339406 4141550233 +1990043258 770926421 +1115694010 940131970 898643478 1773682123 +139566273 816794096 +4124001044 632935744 +3721388516 2763147736 306223593 +4078681424 78316771 +2531434158 230192366 4176349487 884984825 +2580212360 2725196811 +3010296731 274306308 969548521 3184782629 +3335929570 2929424893 +948177003 2281724650 +1594427624 1665047180 +3286922895 969457356 +3507081737 3507081753 +3228515543 3323774566 +3521950816 3617583909 +1551379281 3794546822 +1709764289 783276502 +2556098391 775118310 +1681230344 3872224547 +1869160289 1926503814 +3640215012 1823896818 +1239904972 593082145 +985520529 3450821409 165510982 +2150920562 254947422 1150195315 1601623834 1601623821 +176323106 2909160323 2063353642 +3592471884 1091510112 1637258913 1637258935 +1618823931 605381544 +1178489081 2367256552 +1565652530 2874526171 +1500975588 3677647856 +198837330 4197764357 +2692821911 1487410313 +2906188394 446235867 +2389018822 4023799713 +3799608284 1629801297 1038880913 +4260647662 3047066809 +467831515 3231749842 +4102364376 3314313229 +3985004043 3257961784 +2032758912 1469852748 +1673404138 2122986369 +1509628229 220424259 +2406458767 1539416078 +4045618799 159074488 +2512690005 2911334551 +3922967721 631509076 +3518477434 307176789 +3586064031 447403102 +2548130738 3385848101 +1807285766 1479745348 +3791519767 3791519751 +4245410282 3434520193 +2871803463 1264403993 +2713915634 863310275 1078012886 +2836134020 2836134036 +2737365668 2737365684 +510459491 498436432 +3065965827 977837968 +3980562582 3980562566 +855470839 1006369488 +48379317 1058704362 +2887074512 3044552035 +209476545 2026146320 3552112107 209476561 +1649456656 1751048908 1874814620 +3041913172 3103930189 3131094719 +476002527 1022831589 +1971181245 1824899663 3748470196 +80638732 80638748 110682912 +1776373642 934295099 +2044418847 4082135496 +431500451 1307592908 +583508558 583508574 +2660056337 1579823357 +3507255104 3602455890 +3495663960 1683348723 +4216451702 402698193 +2702416506 198979083 +3490818053 2429255642 +43986835 3013076090 +2207179641 3455384414 +724106233 3934562558 +3044101289 3666564607 475201550 1247522328 +2446869228 2205243799 +2911367266 2399103562 +4047511455 1727121217 +1629735183 2963053464 +3831285482 144432749 +2021333156 1304939071 +3660714402 2846573272 +1557676189 3988212354 +4194085562 3765609877 +1940941505 3753381334 +345634580 2187326575 +1522961328 1209328152 2525881877 +263021021 2331053812 2331053803 +4015398204 9438577 +1583391008 1972439497 +3133043621 2060456507 +2918297017 1432119618 +2710654525 693903669 2495490562 +764194623 764194607 +2268868524 180322496 2411662273 +2129154710 1572471335 +1764014143 1767609928 +3313152638 1579613279 +3633597487 812910398 3633597503 +3741667859 3741667843 +1848838765 3881396626 +4136385125 3357217251 1134086054 2478835260 4136385141 +3037102086 1894127076 +2972885232 3803404757 +2689793911 4155997232 +4101291211 2663723906 +2843376569 2228274216 +3882712945 3261046502 +2846498763 3788508308 +839845074 2678363781 2810674558 3810068845 2637992771 +2102171793 3499371600 +2417737281 481067072 +782704145 2499903940 1432307615 +4123892618 3572013628 +1684153854 75615945 +2141561639 415225462 +3769631327 336837512 +1653796072 357232957 +730008283 22173952 +2972603427 2438930995 +2795377230 471763410 +2089618582 603583914 2414875206 2953162103 +1201391693 121393458 +3351986481 3052904495 +4125989046 1403414166 3674695303 +1765107730 442599110 +1042534081 2472442326 +1214083617 203074038 66686545 +402681981 3374829777 +419429551 167430008 +2622768904 2622768920 +2960852919 2293048582 +1010204225 1010204241 +3250205374 3055411487 +3205317234 3973745360 +3460047543 1605019152 +3298528121 4191981438 +773706321 2375239704 +2318551678 187384905 +1782048828 3943879655 +552322265 2671061950 +1267573153 2432004192 +1206422547 1044940438 +2359577951 2885745163 +3291540523 67356596 +2593582935 2996487673 +1592696834 1592696850 +4283887738 1876725789 +4278739048 3794781117 +2458446290 1446639213 +2086441487 3568954776 +1388310966 1448535958 +1519625993 1292254348 3339521937 2821812923 3935273287 +1689026036 2947411017 +356981995 1777501666 +1478680864 3739772261 +1819471230 3561847945 +3065799361 685146086 +4220447916 2919142103 +1835874779 502404050 +4280583415 2642235590 +2037998544 2037998528 +2080021263 981604494 +4006708037 268941238 +2233567521 3838045477 +3278255774 937949887 +1478144884 2019614175 2380524471 97253729 4287052876 +976559855 2426384952 +841966245 2778220986 +3903872660 917750388 +533402591 3954198536 243360924 +774430203 1416316563 +3094501875 3212464439 +2554660347 2947050020 +692279789 1519210251 +2595234521 47687183 +2359064962 3696445365 +3277544639 2750364459 +310211775 3665742014 +2295802917 2411363884 +1789852102 3077780151 +969630883 2628252484 +1060591114 2384228795 +3206913021 3845427010 +3472881663 3690161780 +211685913 3058602262 +4191368839 3464418966 +933419640 4158182149 +1277359083 3322280692 +3847143463 3610508893 3727516768 +3507544358 914652273 +650893365 2943166611 1206213500 +2116202489 2634603486 +655574166 424998961 +3174005887 66735749 +1306212352 1306212368 +2643325204 443712111 +3528939743 2951122749 +1529792688 983952668 +515021844 3804989288 1730917241 +3234047403 3525484655 +980743037 637233250 +3405090764 1284595255 +389820438 2847912615 +3698893393 1659340166 +110894474 4056055867 4056055847 +2749170508 2749170524 +1354811729 1887234704 +2920674298 3594134581 +3577704659 3916421462 +1662981396 40094710 157695797 159664229 3365354312 3630416313 4241389390 2339347546 539572827 3378497072 +4176128919 1886133926 +2163872229 2163872245 +118646681 3191081551 +2298467146 4105805159 +2138483047 3602196302 1966380946 +2115310025 3182434873 +2147441358 896397902 2035304530 +1595117925 281928179 +196424806 3561061505 +2845305343 2647685052 +2544920722 1555340755 +1347186764 3025455031 2554876719 +1748700583 3153493472 +578375591 3585915166 +1313252602 859157917 +1503313272 3615538496 3316834293 2590217599 2827944334 2258125819 3877597838 2794389116 +3378947875 798563356 +1729181625 1661995400 2050949387 1661995422 +2566568608 4123588322 +3599843283 2577889594 +245980681 496961592 +2577636320 2032383661 +620135329 3563458876 +2316435126 2316435110 +3064153616 2466728757 +3354681056 1078243288 2621092676 +1174168859 3354023052 +895777880 1697627803 +2724035048 1679578687 +105137696 105137712 +243123447 3338473680 +2871191852 1650630502 +1569745022 3360980553 +1673774033 3727507984 +3558916666 3144894741 2507285910 +2898129786 1844865291 +110203967 2413415402 +2823112697 3725610231 +4071378724 4071378740 +3215473902 2748836537 +1425444419 52556668 +3305798746 641984113 3443499717 +2336455338 3845790107 +4158907045 2227474396 +3567814210 1048835586 +1783800782 773315929 +2046212742 2238161143 +3794190572 3232601088 +227793313 2744975825 12556406 +1192008954 3537575307 +2009184601 1245330831 +1678536705 2157203840 +1966440267 636286804 +1627174855 1960136278 +3220060718 1376097913 1376097903 +3477837598 1912529961 +3044369305 1471062621 +2710435682 1726164169 +5245062 66939617 +1634446855 1634446871 +3896893010 4160551685 +651606045 4156786411 +1133051517 3450379970 2188503925 +1962686366 1283667286 +2206521896 810893417 +159690131 3560467699 +256743479 1311153817 +2032938322 1264300285 311121946 +1960919817 694734190 +1880321390 3700769849 +252848927 188548622 +1916118521 1916118505 +2989508928 2532538872 808882971 +3742459210 3742459226 +838568274 2604687867 +2594440283 3409107794 +3287659774 2600751134 2043407327 2600751135 +2077493203 978831447 3251130668 +2398092345 2298265898 +2909334254 1322897273 +583039538 3875560627 +4025962635 2419132234 1088573376 2882176369 3038713245 +454204453 3276525100 +2209298704 1557582883 +498752674 3285790122 1851773717 1851773699 +3927650970 584099965 +1798154008 2592800932 3504212685 +2732710996 3180189743 +509896518 504271649 +3962468166 321241919 +531541834 2445483606 704508269 +2487128160 2487128176 +3154130741 1580334483 +2854576793 1910126280 +2697207763 3887995194 +2465470112 4131364339 +1483546803 3872029132 +3667167837 1960169588 3219316651 +2079469964 2079469980 +2592724097 3355019030 +2827077670 1783501783 +4091390833 1458889446 +3264273452 1980406103 +756226153 1578069336 +288467507 1143926348 +548416340 3377739065 +4194362779 711553796 +3091223172 2437015007 +128967556 1368993308 +2438660704 843365683 +2525473070 2409650095 +1813532653 390451730 +4293218940 1213589552 1375787313 +3709051266 2280079267 +3499975269 1385123222 +827315079 665451913 +2307621559 765373686 2307621543 1033815568 +1662981407 437880372 112118730 367846133 2889767096 4248648124 +4153533782 2714635733 +2212533790 2212533774 +707453562 2574844757 +2366805131 2671761090 +701005030 3515670055 +1597316769 2275693837 +1620316858 3791731788 3378112840 1372047647 568215941 1123861314 1071705014 3721258885 1270967496 2765986675 +1956402116 1444404617 +4127230065 3306966803 +370433573 1396735646 1340684237 3876598828 +3103394303 815643774 +3914092551 3308133107 +187075697 4272887270 +2787123352 479416155 +4078414063 10094336 983922834 680879411 479569237 114832976 3999868455 1992891431 3528307248 1076118014 3337357140 1328332620 796004821 1181245254 1320563142 3846387346 +1576766462 2830581724 +856165477 3590270876 +2061335554 438845327 +3029068622 4069003576 +765097511 4045930358 +1529645907 3659486138 +3812760359 3027606457 2992353587 2992353572 3893411424 +478180677 859354332 478180693 +636195243 1557549090 +2048340822 1369903649 +1495474021 2099769232 +698811304 971686269 +856699133 1602035284 +3869714741 1311104618 +3061551115 2154387256 +1407250050 2215475915 2367125155 +663292284 3099192871 +2746018400 3538867499 +3198584390 64386705 +1800999248 1800999232 +391914353 2375051286 +3089150354 1836550341 640443451 +1899224425 2913314152 +2123691459 125755882 +119190608 3973266836 4051836093 +640836406 2103342337 +2627836576 1010348909 +2625424961 4009596774 +934116301 711152160 +364129133 1131526610 +3281863060 2564639102 2766694655 +3506463642 2176232206 +1385716773 775462883 +1423558449 4079739597 +102421654 1014805857 +4021164489 403871598 672313480 4021164505 +3825455278 2684453369 +924667992 1224731635 +3611700946 3044783251 +3334779719 782645440 +1671707180 460115799 +1186636635 3223085832 247059045 +1717089233 4003664390 +2478773973 1792078172 +2167754835 1556841664 +3008852400 2879055528 +1160025697 1160025713 +15036304 4184173035 +2550463188 2661993455 +1375496194 1315590592 +1696536620 2390512699 3197152739 3539616137 1925729251 1773385977 +1765171226 2862165933 +1141905497 2119586846 +616880909 4007974244 +2635346612 4207661391 +3321654750 1304351616 +4237695282 1054710882 2375649495 +3443164048 2736593827 +936327280 936327264 +3271453692 4068736440 +3329698716 161064593 +476823015 2761683616 +4244968521 877797561 +3240400724 3240400708 +773684412 1416322023 +2023644136 3100319980 783996263 +645892877 2814895460 +704846040 4208991259 +3648102342 4266322950 +648893832 1792910621 +3382528778 1822236845 +90147993 2405669246 +4038551876 884651529 +2447093073 3989952134 +511671100 1051656039 +596062404 2983314569 1983407032 +2400361091 843697188 +2476105745 1723415239 +2652497405 2301879614 +2650595142 1990915974 4212357943 1990915975 1990915985 170770234 +1645344666 4087482473 +1798390371 562790858 +2457420045 1205196914 +4274254143 1299498558 +4211825330 3839870515 +2502386537 2338999723 +123639057 3803055220 +213391284 3117240399 +992320836 3473521166 +1213848009 2926696312 +2320717032 1109839178 +3962929704 3925245 +256134769 259211511 +1043649667 3472333927 +813835394 2211115927 2211115911 +754089865 1254016184 +1312339815 2320021280 3624378093 +1070557306 2787712494 +370351589 1524651713 +3621156107 178147979 +1617848462 1540265881 +3986566858 3657672685 +1638166992 2276985896 +3153227086 748818895 +977557013 3197331916 +3325268020 925630937 +3053417344 19059347 +441610245 441610261 1959155674 2923187261 +3807583795 3578462331 +2507646434 2342590198 +263327946 2135977467 +2264722166 1982194001 1982193991 +2935723079 3584393434 3265094451 3601171040 +1059832789 1377391026 +803949916 3412772807 +1040204704 3667264635 +1075992669 3145218475 +3548242837 2638303802 +4068906798 2761684398 4068906814 +4036870796 696483488 1415135841 +2572076263 1040185257 +2182458214 773640599 +17385927 17385943 +3231260812 3171826785 +742927875 1502496508 3097521845 +1457623903 605748872 +3384583379 1727494202 +1434417938 2846801221 +2083770691 3365039228 +587017770 2536238725 +2262738540 2279015249 909168504 4166143559 2563487621 154175263 +3934753205 1229135049 1468569250 1451791644 758440991 +1120355744 1120355760 +748722727 1741859702 +3351332464 3846300227 +4117944453 4174049948 4117944469 +3860966015 3321849320 2249679553 2567793707 2567793724 +45775059 512504876 +3960544453 1945133916 3960544469 +2382530828 2851985159 2382530844 +804969708 1930825212 +3700213994 463489101 +1181944396 857290167 +2430663231 3976634859 2003238913 +1128619798 4231311281 +3026855120 3541562211 +1806887214 3097826169 +1057618258 1057618242 2394127379 +2889497527 3601596678 +3861147773 747089250 +4098065983 3207204330 +3158520994 2968110525 4146065262 4291549973 +4266550909 3530249922 +1344847874 356233227 +4098341177 3320353982 +2616262744 2616262728 +3707701753 3732714216 +519633939 519633923 +1837656264 901575389 +2731492467 3209216282 +1586676007 134615158 +912410240 912410256 +1598075917 3330240840 +2560102196 1801449177 +2449770942 2602882569 +3915794971 1641890286 +3057561955 4017661302 3087397968 +3905452454 417721350 +4159318098 2231587099 2543679762 2543679749 +2375864866 2375864882 +2324038519 1519131107 +2263511969 1335014936 +2666882904 2666882888 +2220715764 3826959711 +1667676030 1132953180 +51713980 51713964 +1969886816 906049843 +3981731267 1591489002 +768809060 1794942040 2270127465 +763966936 2264908571 +2568003992 2568003976 +1864523826 622685861 542458843 +2654064533 2640955292 +2277589392 2946665451 +682017283 501286384 +2460775383 614330691 +915273162 2876894459 +4181112867 2293071492 +3086516820 1555134376 4030016057 +1768289557 8441884 +2807231067 3264447812 +1982483913 3918790541 +3360241124 792712681 +3183157732 3183157748 2710991631 +4112059268 4108609424 +3290486729 2699055150 +922766288 1702320245 +1230587028 193393913 +568162682 3383114507 +1558722906 3149171173 +3981505762 1571561469 +2714598604 2189129015 +3388480657 1677785021 +1345450195 3890633024 +3716120483 1776999319 +3820198798 3951347514 +3435134176 3679600595 +3713561174 2644252795 +3096709163 1917940767 2140072147 +2493000060 1737051697 +2583257571 1184176202 +3019900447 2064229086 +437054384 1523278024 +928011171 2074541110 +2764040832 3659409299 +1862195237 3761127994 +1822939446 1237834518 +837373559 1645536206 +603568143 2971451278 +2933990394 3344316867 1027923662 4091497530 3095286335 1190120898 3063530003 2091886317 756082373 3439862641 +2428507235 4040088323 2758927302 +2848114948 2915778851 3120007690 2612549103 +1757065384 2246318187 +2708706611 2708706595 +2078498378 1357737581 +3580273992 1701711744 +2930910577 1936781552 +4117207016 520301051 +335162306 886235765 2331664861 1598404046 +87402907 3464101650 +1617178228 3642904777 +177332884 2516087273 +3864741451 3970934786 +2439427665 450039629 +3606846399 769633704 +1650282437 2649002778 +3107010614 3815100929 +3818629909 1661882890 +1489150881 13906236 1662118388 +132390430 3588496890 2317052201 +1072736246 3266062295 +3326572035 3264403952 +815239009 3751196064 +811833526 2072994164 +1465357156 2331055961 +3059972349 462911060 +301954928 3029558475 +2844335998 1625068361 3594254413 1625068383 +669658118 3684912503 +1558187872 2495099941 +4167055110 91659873 +878673146 263020994 1817296267 +3052330848 2799822706 +2605299043 3881566737 +3256391788 1037268993 1726350821 2145811174 +521708964 542380952 2546778409 +135097713 1468776982 +633223177 2296358757 +3870912564 1777050063 +2749747918 1488501558 +401836577 3579998710 3757663825 +471668831 1970868427 +1407755160 2939783259 +1446766054 3807180162 +1466307483 816897298 +1506109426 2657415578 +792362350 2392842173 +2462549264 538343477 +3943590556 3943590540 +1354674452 1438786664 808501881 3583340020 1438786687 +2777843003 2349647870 2349647848 +3027191058 1202845326 489274181 +1366468905 1619020686 +3325280996 1357091545 +3041888344 3291718299 +3489438948 3291022107 +4260720128 3378260499 +2727118378 221721613 +3350115774 369629727 3451985609 +4065079282 54959318 +1540084549 2832367978 +1146858492 975188435 +3116565362 1233290840 2372373738 696510078 1083829642 +1157387156 2407859603 +3304257445 3312430796 +3394874337 1814663968 +3797107189 230679210 +3629700920 3420114235 +3981965441 2306818983 +1989059142 3901322295 +3974848781 59361124 +1267720054 1769785041 +3639992582 2433825911 +776049169 3795382480 +2957845085 532505173 +4055451447 3182107536 +3816976840 3998817757 +2151609132 84717655 +1615689765 3203670586 +1953230399 3032429001 +3867362682 1910925210 +551372407 2490685266 +3595339073 2608186688 +32997553 2609640896 +2369149450 1356205082 4282887539 1452260781 2899054470 4282887525 +3746160346 1531564349 +2988304078 856839769 +270664818 3321242138 3616341861 +2486861192 3759381771 +570244753 313097798 +2408559704 1181420595 +1961182033 2584973821 +3255590486 28554551 +1770614815 1113293000 +2702377819 3958261828 +395797465 4233244296 +2672287477 3005479850 +3522588403 1872068218 +1392154923 220026200 3414105762 +2130976562 360514197 +3350973208 3369886138 +2890225234 2200363781 +690688473 1895345301 +4212265524 1903339471 +3673568859 211259730 +2526409903 3475549905 +3691978323 3201088698 +1458411233 1583324662 +305985721 4093391518 +3854409907 3854409891 +3591312637 4139649602 4139649620 +2562110148 782808495 +3446250693 2777973930 +2354697597 116867595 +245571689 1942750542 +1999804041 765655470 2240744697 +2021085049 483531624 +2006039878 2154624289 1409599802 1652950417 +298562092 799636289 +1080319971 1080319987 +506009478 11536353 +1466726119 1466726135 +3566816012 3109102583 +2417964182 1998571569 +1492851735 2230366729 +812360380 812360364 +4123300149 4054851428 +121630529 41093648 +1821216053 399854186 +2557558847 1858019617 +2564462396 3692827505 +740358114 1308319825 618925947 +3730024510 3730024494 +1635460014 4116481402 +772870210 4030929501 +3045330872 1994702509 +4027936178 2746986277 +644637849 362962120 +4243373579 4243373595 +584123005 584122989 +3151277929 416293464 +1128480628 1670633043 +891714466 603448490 1301585923 +309287914 4014846299 +3181846130 1371514 2599540509 +3572516383 2362325045 +3561967470 2799307311 +2114031217 3446881264 +3319740674 3319740690 +409451217 4030021216 +571290488 2111919109 +261048686 3968899119 +696480464 703446371 +2769082469 2477249101 4228915318 +214724795 1342789932 +1237623490 96153803 +1387745401 3816534088 1431151971 4062032880 1672905035 +3920032016 2876933995 3788340277 4075623400 +3396390892 2610385047 +2832771515 2282959204 +3760785748 116315839 +862372159 1774014103 3837477116 +1822976007 337363734 +3259011639 3147310755 44444825 44444806 +1621762549 3567125865 +1106562496 2489312581 +3787560784 3995285437 +1279209372 1795905420 +336897455 2740948619 +1680240999 260343094 +814074088 2943221525 +3020493318 1883725665 +1734563530 2338430957 +3859553914 2668886539 +216720269 216720285 +911203579 2058936100 +1972493400 1822285453 +3450207647 70304843 1531855176 +3611430313 2247852312 +1804745971 1245049498 +3028540699 1184174468 +813090892 2533183415 +1969839729 1048503389 +4028607094 1915039318 +1597342047 3328089008 +432465359 3702972428 +2974361966 2217490479 +1587324240 1083718901 +2503724919 4199859700 +2645357046 759227985 +1983618426 2581128971 +2828673789 1738871874 +3969152121 2740414812 +1055922803 1331213126 +4044307230 212307181 +1194620723 3099145888 +1874913521 1543791434 +449385336 4225364888 +3342727359 2155084128 1703842977 +911825821 732641314 +3266293055 3113073192 +1982528553 3798623771 +1269006995 2774961517 +3097254671 2061356273 +797520564 4158097612 +361062855 2818108502 +798825980 145973159 +1910785170 3696751059 +3841206682 1961463478 +1641571972 2762272623 +1732188864 1213668421 +2669485724 2243944784 +320754305 415454641 +1604263031 1604263015 +1981084038 901575633 +3139436936 176684708 1555126257 +133857348 3545754399 +198020463 3267407633 +2201973251 2682288828 +3758889050 3758889034 +1542205255 4224609494 +701392878 2886472825 +2258260518 554557775 +3880717924 2238949225 +1718431435 2376791023 148941204 +620652751 192871896 +3163632516 1553209545 +3732028520 2902566579 2608094869 +566489955 2323129546 +754458045 4100603060 +955709366 955709350 +1477967026 4071060571 79281182 4071060557 +2201604053 1761750108 +4249776200 175817035 +283388998 3711021601 3711021623 1815841926 +1866523876 120083199 +2474642251 2106705666 +79281206 2791524615 +3514797 2439363076 +116551514 1521300993 2520024294 +2470515510 1595524746 +3443489774 1781225559 +1573650743 3743803801 +3259808940 2328691415 +3260364450 3342899115 +2956002370 2670310389 +4138677313 4138677329 +2593693891 1381001251 1539105447 2593693907 1330258918 +3699369708 928655872 156796289 +3748533313 1507894503 +29609148 2201701361 2201701351 +4000947295 3362859422 +676110351 2161296460 +2221612572 2426430993 3179326672 +3825455274 827692306 2617342875 +3420532295 3505899858 +1108328004 1108328020 +1384061495 3255692962 +316944232 624337067 +904051767 183388816 +3080490983 2350386006 +1241876958 2641345623 +4194635663 620199438 +1009220458 472336347 +3090814979 2624252477 +1428090619 3398019007 +1512596600 3630329093 +1376946220 1596742999 +4153904334 2516228174 2027877455 +3785570094 4042395174 +1704321439 2314349896 +3168196623 1429610382 +592353364 3904490543 +2984016754 1612069717 +3662697047 2566693310 +3575419462 731917988 +1933869475 1444068381 +1832802527 2136678838 +516183939 1413633904 1666621736 +1221138691 2937398298 1910191474 1910191461 185280390 1265410579 3322090939 +4270973227 3936712354 +4225648811 703358242 +1475879878 1101025463 1101025441 +2160791987 1310691028 +1271100363 263145602 +1553327019 1239663251 +1189058273 1929020448 +2231853774 1941551695 +4182538014 2438956073 +1070781612 3063651128 +3840257475 3606627206 +2949825458 2132349786 2060063027 +2871585236 1164449967 +1533710280 2965395421 +241036105 3873006574 +2839597875 2752280922 +915372384 3247328953 +3758045038 3066975737 +3412524904 4140194179 +2933846360 1681155840 +3821422947 4096100042 +1876411938 1227911978 850192259 +2242521227 3761431480 +138099550 1396602111 +3776436937 1067354936 +4206472291 357195722 +367532624 2992435883 +258819617 1778738656 +1852051346 1501856467 3197760058 +4127495188 865746815 1563761519 281538292 +12570403 1358107676 +2828175402 2292996621 +2799814390 2799814374 2875995473 2875995463 +2642244284 2826673649 +661988501 1688533805 2993198730 +3895571878 742454337 742454359 +2017173632 3319638419 +4032880680 2011105347 1741281261 2424364779 1023171216 +1086680859 298706834 +708649321 1355858649 3879442510 +3117718959 3149400812 +176820361 1049919067 2358510597 +2144416944 2991229528 +2527117673 2282780750 +2329628187 3291486373 409070559 +2219001393 1726447398 +1873827125 127279740 +758353445 2972510045 1294517306 +3457657472 4014040979 +3803601983 2960176641 +3679615311 2446653262 +926988289 926988305 +305052285 479171266 +539895299 2879772330 +2558105931 1382830356 +2119387226 924509629 +891637343 146431902 +868983120 3650023651 +974472250 2843371339 +1007285415 715924193 715924214 +2168063704 1180223003 +1700452872 3360545502 +1793950922 2006042993 2529315263 2874429129 1326471714 3487030575 3414111598 734482369 +3950100406 3855381394 +3342586777 2593306729 2593306750 1009654238 +32845262 3807845209 +2872405122 119132323 +1215015250 3038673492 1025004105 3669053040 1400605715 +2303745961 3532035854 +1552656295 1278564867 +2413170903 8472608 +3206760440 3700050788 3700050811 +2006524534 3155247047 +4029667701 1563159308 +1427717783 2378008496 +79668420 1034969218 +2330910214 1993602118 3154609015 +3117535700 1498239151 +3097648405 3994953658 +3050385161 1095568174 +1076527899 2669717704 +82884413 4151363735 +2456043972 936609673 +3559379135 4031616559 3115162814 +2431851373 2612276370 +3389707257 2624031989 +1712775956 2992370867 3389487225 +837133210 1286415338 1945521334 3810454467 123435381 +1945122189 3795912669 978172880 270814436 +1839633059 1077466773 +1252402943 3904467370 +3412681979 837416754 +443076503 704563888 +3362185543 2439404805 2166109266 +2809901623 3736702105 +3760684147 3278293763 +4259902729 3199843640 +2259671198 2765226175 +3194374063 3040477137 +4047552012 322415731 +1925491169 2288053265 2358734134 +1566807503 3536114904 +1265550253 1265550269 +317786356 738647543 +1670814148 2316570527 +181522602 2991291291 +1478281837 575842706 +2119776193 2119776209 +271585328 3570242008 +1106609293 1652533746 +1411144306 3668074853 +1429979915 940837442 +4015407000 3295909875 +873560256 3078690387 +1982519904 3781517192 +3879249048 2519407451 +4009121731 3435300826 +3354307324 3354307308 +2388034265 3945790366 +1023247029 811965352 +1879573559 2476647065 +2767411581 672522196 +1418880047 1366537720 +1833511713 1715028277 +2739161834 3515496773 +564183493 3037792524 +2624509339 2876735327 3715777284 +4278224635 4045937182 +1871170208 3481428859 851704307 3142353176 +1493094364 4112594759 +323962491 4121933587 +3541016325 1184322778 +2512000863 317901441 +1275421604 1350294313 +991729540 882854530 3568463752 1755430703 404404316 1626641593 1769310524 2955997466 511882447 2102104908 1617966322 828224247 2207744039 4096300139 604155418 2996539464 1388198766 3816652589 12640142 1998228811 504699898 293899824 494496879 2120042753 176812025 +736405598 1052892205 +1059172353 1661473152 +3457753063 1485650102 +2850046791 3003771072 +3952321733 2657903130 +999020618 119897211 3137533362 +3329638659 1864914858 +973055197 1040961220 +3348289952 3425474291 +4044099508 704428111 +3866926274 2552939875 +1864955913 108951086 +3182359507 3359227949 1771738176 +1204866032 4256238293 +1217490141 435052514 +1376012651 4006258965 2277479266 647307160 +1001431196 238302032 2467091857 +661218469 2951311276 +2521146320 2555660616 +2796801522 1594700787 +1058347663 3711487748 +2411375455 2447093070 2411375439 +3827998243 1444777744 +407556436 2445772591 +1030599249 78624144 +3931268381 4239731892 +993309644 4294380072 +1693169495 612091907 +2667843836 2948270759 +2945093773 45026585 +2984154736 3678137264 973664270 1829890778 3588035983 +297446839 827025378 2492406214 +2270302389 3140504828 +2715958189 2216948036 +3187903384 3079979099 +1171765097 2592303406 934341615 +3237553195 2395101272 +2486678109 2964179060 +1576006244 2088426599 2957731139 1537362492 2940953533 2088426608 +2296154014 3276862399 +2189101361 2561636400 +1587986253 824778930 +1458739643 1458739627 +2060426074 2932969149 +3585158934 2079137703 +1979304794 1578190626 +3229264518 900074234 +3634784100 1911865961 1911865983 +2473883585 825362234 +135656492 3868156247 +714020486 2235593975 +3924801024 2702028236 1146847749 +4114508525 1625618985 +2279170596 410101436 1088349144 +4085109915 3872981029 +365375439 1571578161 +519562362 3193788910 +2323426485 3074679010 +1207437959 3531117206 +291274877 2238472747 +2851724495 1666619854 +2417319182 439869081 +4203371206 768402871 +2802777088 2789041115 +1254507939 1495244700 +1967584602 4172561597 +794322188 863162347 +4237487633 2890712272 +2061407126 3344347763 3013367888 3350280308 2093260142 1061523737 1434130192 1614813604 1228141383 89939852 +3945366309 84802759 3150996572 +3695996923 3075747554 +290160854 266064103 +2147229332 2425070 +731831329 3423897568 2603406215 +3747855032 1644097467 +2213266411 3823590936 +2840667335 1188789171 +815621905 2563325894 +2230082389 4208041724 +484720429 2823779268 +2057621624 2057621608 +1590706365 4275431828 +890154782 2578851647 +942337986 1160265011 +1236842885 1514019587 1899458986 2916253640 2462846028 +3209723777 2897786880 +792714566 2758289722 +3189578072 2681136525 +805869600 3175458495 +79206152 79206168 +907036423 2173988868 +4128233538 2633068533 +3042733097 2843624600 1606806414 2289307775 +799890574 2615718809 +1563472128 3014042387 +3958248312 903689221 +3645376959 3412547518 +1273946730 4077808845 +1938627408 924974845 +730863336 4118789144 +52274244 732534559 +781613728 2355663739 +3142423421 1478438356 +2981929239 3807483686 +395889157 1799539484 531490840 +2701824527 1880032844 272395298 2460216718 +407725129 2329206520 +503244802 977746741 +823235256 4203799891 +3187041296 450856245 +1997435189 1917429965 2696689258 +551302182 3021868202 +1770686646 3675600519 +2716630156 1934102647 +1460397971 2596113530 +239895792 381066700 +513994597 246696586 +3117046045 79081963 2525644980 2645579522 +2849688924 3211872199 +4029783716 3158062223 +194549560 2033585453 +3918142916 1751964553 +79262613 2951597491 +2520557774 4006617682 +2658858339 246626546 +1086551503 3266475214 +1346642735 2319672046 +2129241582 3083875769 960211634 197427833 +1826337716 1436673676 +3944193137 3873068617 2944534361 2509220891 2345172829 843159277 1799743009 3639283516 2572821041 +1308338380 2401941815 +2958814270 256814091 +2676933480 2512231595 +1726661122 2644453103 +1326667093 1326667077 +2262738529 3500429996 3378893870 3097135346 1210713482 1170043679 2503959144 4228327709 2468409031 3659071224 2827311572 491365889 2031944779 2009613334 4255243066 2451924007 195548623 777784581 972126407 +3001951652 1357201727 +652244152 4239487944 +1421968935 3667699463 +1193337415 1069823446 +1208555519 1699792488 3861403068 +2837818325 1090580017 +310801035 3030798530 +647674519 1553185721 +335184588 1062987553 +4121737113 1431918527 +3061830756 2939902313 +3045120041 3805563032 +1199924931 740871489 2872449190 +915273159 2826561622 +1244130173 3822426963 +1139851574 704653319 1295761546 +301235144 199154635 +1573294184 127226812 +2822735109 554056067 +512925014 1993191025 +3105190684 769624519 4259701846 769624528 +3428583447 3420503078 +1336955259 1665176836 +3942746705 1147977094 +3336239245 2545239524 +2690837883 230033982 +3263804425 1204185656 +3978709447 709246310 +1610577820 3140045447 +3680067031 3680067015 +3293550920 1531065973 +605134502 455162946 +112507613 3258619179 +4283824506 3206246997 +1393013847 203482352 +816282292 1269180751 +3184540515 1115393606 +1845134594 593453621 +2776794164 3228966361 +3896708272 1368193283 +1089219499 3926092760 +2962256822 2842044305 +663631386 1591683837 663631370 +3116635385 1756169214 +1112126125 3501054785 1572516626 +618402410 1886452941 +3434638918 4009422115 +4224932423 3031899606 1011078483 +847475663 2220903729 +1790306379 1217792357 +2232730118 1409313786 +2698284532 580613903 +1137338769 2759225725 +1199767582 2973314879 +1838409151 2011848623 1053993918 4205878686 +2450578408 1460820944 +1565390014 1699715758 +860375726 3265801970 +1734810644 3679531887 +2728310729 2728310745 +1617562070 2632809447 +37291829 1824511769 +1384727936 3580660059 3580660044 1847093381 3940950200 +3507390847 2564977384 +2806493398 973132500 +3025253643 3886022722 +224956344 3093198906 +759146381 3358900978 +384054704 3046108427 2177870128 3046108444 +2125879777 4234288145 2808626539 1510964534 6431309 3883663140 +3999920876 3999920892 +3895941496 3206394176 +1308729972 1083358351 +844519756 2314113719 +1027089429 1046660794 +4123108928 534296261 +1658009763 3202933513 +627177574 68380150 526091687 526091697 +318921861 1103748099 +954277703 3513007296 +2818841309 1534478836 +3372418947 2201681869 +1162508140 2151284503 +3669519175 3669519191 +3130701437 979788642 +3359571412 254383289 +3848189269 1038934086 +1946442386 886739923 +2360944841 2481532698 +18221490 1863108941 +1713654663 3589232306 1378018688 1378018710 +1702622615 1495506096 +129105248 981513275 +455017098 1694616051 +723796597 3614768154 +2647849155 748354224 +2375652613 3989149388 +3996738241 2098954225 +2726199490 2441156243 +2813010733 1129240452 +3057788421 4011973068 +2441236018 1109465253 +3532704564 388471582 +1744750277 1744750293 +3753770655 3800247644 +1451053533 71818996 +1490577872 2897121891 351161513 2897121908 +2959220909 1467576402 +1894810850 2896244675 +393852580 2560263209 +2959832434 724165235 +1027159008 1091348901 +717090139 2751243844 +181516638 1445377497 181516622 +2586653390 2200369753 +934182142 2971555870 +1241484083 2957517146 +1591486672 3649475642 3442916894 375626031 1788298635 3425164717 4108412152 1002959282 +3593771569 2182304045 +960469406 2136119675 +4132244059 373771602 +2080270655 1090463996 2812511489 1887415870 204693062 485798263 +614797941 618401322 +1858186211 1038194250 +2102431228 1104118705 +2447381094 2447381110 +2040469745 2040469729 +4066183112 3217784884 2188216564 1349730251 3763876159 +3637548120 3637548104 +955381357 300346770 +3143819716 792647326 +316944244 825668495 +1334461436 163187614 +3265085448 1703660683 +4124378458 3164606754 +2405906131 3290173271 2457554476 +1400118187 180850228 +1677854359 1848025602 +238878866 2473511738 +2225151196 210610577 +2260265544 1561907037 +2423052934 3780903159 +3767599747 3767599763 +2571802574 1192477824 +3723536354 1138247893 +3988457026 918635898 1217210770 +3248325178 387844373 +2656571160 1553973979 +2935685022 967212362 +3741439988 1153066971 +3522522331 1616534738 +2692270998 2981125490 +3153183269 649818240 43294764 1173894401 +940011330 1974740195 +3271040340 1083583289 +1037264779 2468593931 +953399443 139169644 +3088859754 890353270 +1729087575 128548829 1084266946 +3191113839 2456736699 +3262016369 4267700225 +1113998485 469628554 469628572 +3014761609 3014761625 +3657558727 4161050454 +3596782058 3067264524 2267647326 2270846130 1958544905 1520834242 3644651131 731316295 +2470252138 857583821 +3023319695 1026266904 +1804833777 4182056311 +2380181868 2731790941 4012541881 1692155354 4204226121 3227928005 1538521907 2156240229 2115817711 +323012803 323012819 +177922016 2446224812 +2082260212 1430916121 +3850742017 1382616192 +695925298 4010414886 +4087442895 4087442911 +1520266934 2418218250 398535809 +237125090 3060753710 +4094914454 3499665703 +401507210 1939949333 +1884926484 1884926468 +1641620245 500316700 +234637357 3555499705 +1322159397 2556816071 +971724358 3698843055 +3072514442 3842701555 +807866073 2793168776 +834324822 2668294769 +270390309 4104101213 +2799191490 1752551523 +3759661372 26710375 +4024851862 843179617 684175530 1034244913 +1878924934 802318535 +2849424930 2563207979 +3626708063 2868304286 +1950122628 2134996425 +2340662557 3175711924 2629552916 +492301234 3815246131 +167169990 2405930033 +2290534968 622307539 +2548723937 2548723953 +2660912213 31861194 +682385760 3822830423 1734167084 +2834457523 152691124 +174920916 1035454895 +2602328065 782967190 782967168 +1878392939 3944633116 2873272418 563103253 +2371613162 2371613178 +3521129358 1506775311 +3278158493 881968418 +2607005520 2830475197 +2532856290 1899779803 +1740045343 1678697665 +1460409625 2712297167 +1427033556 3125675183 +1429556136 3100724396 +2181132918 3884936778 +1526754446 3484083087 +1970115704 1400944891 +3532702690 1541692629 +1921312996 3633199076 +3942008036 219687908 +4245332518 2109555159 +4119385301 1533479754 +3552165061 308554252 +1365765405 232393474 +1422792755 3010467916 +4286563235 211085621 +1112766828 3580372225 +2308598523 2568382776 +4269662467 2514664678 +4206887788 1100466350 +3981729022 4276566046 2580440031 +2834814194 4028905701 +2454880393 3772798904 +1805689911 2766307993 +2088402325 2185264172 +2677412123 1413279108 +2985174042 870503677 +551163075 2051976938 +2161735488 374782405 +3040794703 2699985998 +4153885443 3323887036 +1495336066 2629093514 +2988304074 789729261 349431859 789729275 +641006078 593857225 +3845800434 1999205704 +4223999357 1589467659 +1402687260 3112012049 +1121844068 2809314921 +3726392144 4134625013 +2862764742 1669877153 +1755199767 1755199751 +2051130936 299773276 +3026645989 542790947 +3863192542 4002548201 +651307826 740213484 +3472631438 1693495705 +3852565239 3267568560 +3083792887 1371989958 +1876378125 484244082 +3744573324 3878338913 431544391 +3524196904 3583233277 +3957667007 3957666991 +2701654628 3817810784 +2309788450 3844769853 +4161688681 3884900686 +3244452049 3404360147 3397460279 719950299 1084198188 534151352 939354852 2840310246 3372924673 2352635858 4255276948 2001477166 +688029483 3119394978 +2132438209 3617141696 +4196566497 271522454 +1612944462 2785179353 +3006957375 3287509994 +2951618815 4074631550 4074631528 +761080506 598360797 +1828077116 3282303079 +295933557 3082186778 +3768719434 3756231328 +1904674627 4203769468 +1259018666 3430508173 +2198412704 3881411315 +2831059005 1029979885 3773855764 +3550643627 2981254607 3554176052 +2198804557 1923695867 +566489970 2574793829 +1358971112 2389046012 +3890869015 743025968 +788695197 2650607412 +3634750857 2519226030 +2758391172 1449705161 +2106779628 1553963347 +4129945630 2578140866 1622218793 2719061801 +4096906015 2305776094 +1777164837 3496794973 +3329930244 3743791352 3743791343 1999200841 3316734239 1999200863 2371361348 +873479875 3365070394 873479891 +1391760076 1661146913 +1172389201 958080223 +4183671530 2701648814 +1996587879 4243449465 +1171217303 2087530150 +704588528 212899779 +216663035 1331971122 +663774369 3161457862 +886736884 671352079 +4263080776 1242593884 1242593867 1306959649 +2800758543 2181983067 +898495543 2239197840 +3547327634 1798400467 +1876769985 3662062550 +1101857212 525974257 +971465730 1671032974 +3736076072 3071192043 +1342736254 2685244330 +2785407537 2785407521 457028801 +2561084809 3691838285 953118867 +334059925 3102621984 +3814855349 2825089770 4270712397 +3802752831 3211385706 +2042908109 3205153084 +1709493285 1709493301 +799210676 3827871631 2979254105 +1564851251 130499660 +3003999677 2601986196 +4147930019 730239111 +2901114978 2562398787 +1148433505 3182748141 +1498002930 491967289 +4219633049 2271983582 +216925831 3786688128 +3823246972 3695023152 955645233 +2884279079 1330846649 +1015239499 1964405646 3763857561 +324323216 4269156259 +514399619 3681783142 +1367494724 2485410569 +3939008434 1268843813 +2853062097 2239227920 +1137220871 2780464137 200107999 +3115712081 2860472720 +2434561913 3637508696 +2712037486 2712037502 +3661439656 2181256720 +677972632 895200603 +586664008 2846060325 +1738051922 3390126169 2323168462 +3651382634 111803867 +2417188639 3984506312 +2657219643 1448812933 58797522 +496999053 1267871163 +4173381700 3681463049 +3336866563 1640998315 +3705559719 1493742816 +2245010831 900407310 3416372478 +2193967407 194131192 +4235960271 4235960287 +3030022625 808312096 +1204710356 3723738799 +1962010400 953079667 +1082974176 3770412132 4143112991 +1974281151 4270802366 +331285344 1823746605 +435520411 2021534994 +3722557810 4024000283 +2572505465 1191619227 +1767718126 2032365945 +24458869 3229923900 +1291364410 1701892939 +3702915095 2883517904 3017738871 +753673508 1164811940 +1568155175 1568155191 +3163409595 1211112318 +708279794 970217544 +42260651 2139358063 +505784818 1732937715 +2943967185 2943967169 +671471380 355570799 +550237302 403933270 +2347875837 2745924926 +3530257754 1214525606 +2218392237 3829774228 2218392253 +3601791545 3732262921 +3723536377 1524133096 4189292748 3382572225 3467792842 +3364043432 639046624 3595848115 +792599273 3228593883 1575489371 1264595736 3077595288 +1645826792 1756731651 1440580395 516045008 +1113670673 2417895110 +1438611780 1080813087 +1840296434 2670206949 +4150854247 3780036649 +3175683654 1074663479 220432017 +2572491569 2449067558 +1043407012 4217188988 +2974781381 1905156823 3846132506 2865194719 +292184483 1015790914 +2011657302 391914353 +3153572678 753874721 +280809682 2987803006 725400197 +3648703605 3472964388 +4002127875 4002127891 +752687021 2689672814 +2831422331 2158017350 665496229 665496242 +3563703514 151396982 +400298239 2690283196 2220812865 +1153296454 3961628817 +3476614425 2995334654 +2184631982 1986999026 +2493292289 4086189696 +3454799769 3281817054 +2883094987 1356917378 +4097860760 1382515252 2914144666 1015659045 1868582536 524582697 705457633 1015659044 3316807520 425614157 1015659059 1909458988 27575257 +2416394257 2426627510 +2283873516 942481303 +2756672338 4213121541 1694671853 2856695038 +563304023 563304007 +2801469111 2443465405 +4060753063 4278008898 +876271518 3600903593 +2799286478 4278440530 +3044126782 3757601183 +1574817252 2821397993 +500211590 3466809809 +3850471595 4125762850 +2892582864 1926950717 969450595 +2104299843 3048352874 2004612179 +1287364890 4277105379 +3576034090 3032337165 +1621718257 438162816 +1862660640 135501563 +3161017686 4022648433 4022648423 2269588970 +3121648588 3816001875 +2079035531 2664729282 +2848738630 3315139011 +4086872394 3184235518 +177894862 2133291855 2048558414 +2165264684 1461504087 +1531608435 692288538 +1118288073 2406258990 +652606200 1701361328 +3412271014 3540701783 +2450342782 2450342766 +3107315249 3118076038 1731960375 +2362726905 2873729768 +2238779836 3439258343 +484720417 2622447840 2622447862 +3654681593 3840426238 +136532641 1889211232 +1722501184 3751984339 +2257315092 2578741352 +1149852160 3828919827 +77299461 1170797772 +2121886320 2300743241 2300743253 +1169368601 4225011432 +1109706716 4265171382 +3640317517 3755957028 +768375216 3370356757 +1529280416 509071603 +408429516 2311971319 +1627174870 2211800561 +593035530 2937889453 +3134287421 1420855838 +3046815669 870158280 +2373080424 2691211156 318534333 +3621855732 2114495475 +1160248232 9169168 +1283895327 2533834952 2288712395 +4188880212 4127292910 3890899500 +3094113707 4256212020 +1483654986 2154019195 +1830793240 1335446136 +258486404 2130548643 +508720455 47095488 +2036509601 3075747446 +2813298979 475324938 +1281977264 2431587101 +1806306072 2494527195 +860685933 4118908114 +3537342907 3223373957 2757388658 508815464 +16618146 825087253 +1610293957 2333940989 3713514522 +4181559751 585098326 +1703571675 1703571659 +842884134 1312044913 +4135054469 2028669955 2211009882 +4074951024 3406803797 +2095732839 199830070 +2193267051 918520692 +2217068159 2255976958 +4039853036 841562876 +3633460486 3646601340 3628640674 +1089537045 1144214588 +1783248414 3681977897 +3868120212 3868120196 +3081920045 1523204306 +3994017089 3550700764 +523387869 279912386 +3828431696 1779792828 +4194530857 923600270 +565316559 565316575 +535053284 408346623 +4283028619 1815713474 +3999072633 3043578216 +2079170467 2598170605 3696781422 +1957418445 2004980132 +4032960311 2708114320 +3787395451 3670574258 +1904772070 2682757889 +855394759 855394775 +3515104299 4264212404 +3732481080 2013263141 908287560 +2297100901 4008193274 +457657771 2621391906 +84641290 4213440941 +410599580 585151879 +3513536399 1015102990 +2520382180 169904847 +2579546572 1782891956 +465129453 2992693456 +1930044896 4177108901 +4239132095 3683845015 +3368933239 955365161 +3722581224 3646016024 1585523476 853993789 +2653114541 2006691641 +545925936 1770126485 +731987568 1135968932 +2992051076 1125365983 +2319567876 2910068926 +2708494193 2497292006 +4076049690 3522967438 +395689584 655129999 +3676651907 2124816682 1453586926 2124816701 +826716067 2046278800 893812106 3672127005 +738403504 4176658691 +2229183312 4053121843 2518097121 291997635 365945518 1494048024 3035719805 3016416885 1511995150 4107680634 1657406711 1384514638 3314531068 2299852243 2311517078 919074932 514300988 750539930 3684864195 2957726228 108245409 2944723490 +4093249056 1044840988 +1025686888 2438154115 2398874704 2438154133 1528410012 +1641207261 3689327348 +764410986 598366925 +4069518664 2746002037 +100953765 502934956 +3980577845 3039262588 +2656170817 2366358641 +3089048908 621262519 +1807837179 2625024036 +2687087865 2687087849 +3387812381 4270295988 +3431935355 3260828200 +644774194 3296036045 +3971517751 1248598435 3716566416 +32710448 1102715011 +3433652085 3235897613 2745255210 +995251484 2124151569 +1425162922 3787110462 3453111061 3436333455 +1361123474 1226419653 +800742799 3632361792 +2460040999 4208355936 +1848895777 3782451885 2517177924 +557447299 2805686384 +4253717241 3909695604 438656488 +2356231686 474260321 +281326037 2518049841 +3058284151 2569546580 2031423485 +2439303903 775902945 3233281310 2771748059 2219445048 +666287606 2058160711 +2661069761 2661069777 +1415676868 1415676884 +1533084091 2115164264 +390860968 1421752427 +2892855612 3367217246 +1070709918 355200169 +1667507614 1210621210 +332937635 4211188765 +534923379 2486694858 +4267369667 739647228 +1049889688 453918797 +2988200827 3476999109 +4276212040 2146119267 +3859097644 1176386903 +3866001193 1128117902 +2668036798 3484070878 369709343 +458986347 1315103236 381397560 1298325630 906458121 1180882286 381397551 +469810430 902327305 142585676 321487839 156932126 2680764180 2902520992 4250567978 321487817 +4018800624 2729013575 +502726868 4292234671 +3658114675 2769697903 2215109962 +4224461380 2791737631 +2876930357 2120806618 +784959856 4094215883 +1693188957 1015630708 +4232537129 1298312334 +339296500 3630532260 +400348599 1201958662 +3197380998 2302500343 +1372419049 2943186894 +565129961 4023198936 +491778638 2631898575 +632546100 2893476745 +1336654434 2181439869 +3111465813 3721479619 +135354362 2907537035 +1029221520 580363939 +1466742010 684282758 +3247409772 553052183 +2874220358 4139006753 +3880690418 1529963600 1297973393 +1343177658 2247488556 2716372057 789896911 +3586064022 296404529 +3128098584 2600964813 +2329209688 3845028763 +3368018219 4015512911 +47416999 436009193 +2165673316 654352719 +3308054663 3592021721 +3544281141 4280856723 3305350012 2394570714 +1160226803 3228387914 1160226787 2821961079 +2391883324 1322175528 +3101081557 3101081541 +3499478756 1070903529 +2521023842 27305066 +1602681367 4285974410 +557761481 3969784878 +4242987739 906722657 908249184 4122091596 +4076828356 1277687455 +1176155657 68480332 +2667833615 1646781080 +4178406586 285186326 +1555837 430502732 1167494442 3681763233 4145529931 2519329585 2715275665 125700220 3281786571 2859315106 3679459263 3586117322 3280809643 2803284623 3603132760 835811740 95155028 3658277206 4161390227 3811023336 3864512923 1016432709 91839688 2245064689 309869589 708877798 1980587575 1106421627 3564869106 34467294 2412269235 3627064780 1194648940 1995447877 1171449452 +1433395599 236983310 +2348729968 3524420163 +3387192633 195332264 +242119977 32056591 +2251601437 3751967764 550065007 +1664783554 4147653987 +4016246965 4016246949 +14736010 3958900525 +549522970 1763388977 +1990252494 2368977241 +4076020 1446559839 +456122882 1742864972 +393314011 3265966802 +1682894219 4264058123 +1708834169 2029348190 +3866480475 645229650 +1382643796 268987439 +3259831511 3059207782 +846621230 2657691257 +1385329385 665202776 +2296686295 1458742374 +2047153499 3256755411 +2275055845 1566486636 +2914562499 3355300315 +2449026863 4198844142 +3793580938 2646463692 2646463707 2009857393 5567768 590879894 +3634986735 30593582 +3008277543 1809383776 +1234506246 3685441377 3685441399 +1019031728 1305715971 +3956576138 3651014525 3956576154 +4078606351 4103154582 +3126175305 1676804792 +920933689 2725390526 +38897761 123318432 +2820006267 3459483131 +934688093 282460532 +2789325388 91768247 +2606881073 3423135792 +4149770512 4149770496 1883673635 +2197843118 2197843134 +3095048801 2481150023 +1066647719 3164096246 +343268980 2844602521 +123552020 3983225983 +3361895378 1569526157 2336305103 4143768052 555764227 1376922463 1229312689 +1410747881 1410747897 +2950356346 105110095 +710528130 710528146 +4100654325 3111701930 +371571800 3513560905 +1989014149 645187404 +3359070324 2287408733 +1660626812 1298081831 +1299948256 1108646920 +3442242260 3505963951 +1084519037 312099083 +3524094915 2942546813 +3925442491 2729084542 +1651719407 3932744760 992730171 +1738371748 3235608617 +267057784 2263370477 +1461030845 3555804802 +3348668698 2979294374 +3990655901 255615028 +861260333 4245505234 +1970356997 1617875169 2943537696 +1378015447 333136214 +3574255404 447006396 +54528827 3054812648 +1936212800 3978419653 +322827830 2156566279 +2652706911 2652706895 +3262458219 3416324444 +1671820485 2738901516 +2216386502 3172451489 +1979355551 1483947358 +1963929102 2457154484 +1224294483 861946540 +3596312957 3596312941 +1739185470 1583820665 1739185454 +3945291751 3945291767 +1559335150 1044850361 +1333129299 26027200 +3793447090 126271565 +3573672742 3341129329 +935233961 1777513743 1777513752 +1886192528 2363752296 +462227925 872839772 872839754 +3700871234 2204751843 +1988488668 1893036359 +348000876 2245690875 3091247992 128924284 1083507095 1083507072 +3687418715 1497784402 +1843680852 1383327289 +444825815 2483278438 +1262798905 2954055177 3058119102 +3793674060 1117357217 +3681350473 2872219566 +3002398066 698245733 +189826996 371277879 3306907084 +2983098157 352689107 +823652467 3093275405 2222810705 +2859517590 3850935847 +2522095979 3593924885 706077123 57828842 4015117547 3896817560 292592482 +3319929233 812988372 +1473523592 3406222109 +4220401820 2632129937 +3425579386 981099526 +3155976839 2813270678 +2046108123 1522653486 3622063044 2690860424 +3807706500 603590872 1285676050 3524415626 2506755334 437990028 +456437893 1472574896 +3366674406 3741142554 720582774 3804887335 +3240705944 4134112563 +1053402577 2825914374 +459612134 3598301478 103888663 +1772991024 2827550108 2356117909 +3050186376 3146164253 +1123193957 3370097388 +2795727853 995110469 1078126098 +238630582 437330055 +84512201 3849309157 +3325795420 2494493959 +3897468042 1036846395 +1744106326 2437074516 +3574130564 3775165663 +2384005658 3412780797 +3272941260 453922458 3691422644 +1099519316 2133938991 +2495482066 3435769197 +761229810 1327814110 3847687066 3847687053 1598054387 +3568930489 1150400649 2568727870 +3546449199 524224632 59856414 +2729859573 1923492126 1114525407 +1722516837 203322892 +2341855437 2314265252 +1641649720 1430607044 +604397586 3241743926 +1666677705 733470072 +2572628290 2789378787 +351649771 3923582708 +543259535 543259551 +1271115195 687460 +2213176188 109310980 +185296585 737332856 +1830474889 1245483960 +1954640783 3139271687 +3434898055 3549371030 +1360607286 3769859345 +2687452358 2687452374 4033430455 4033430433 +1664727125 2296196572 +914543771 1794420740 139460645 1664161352 1652834670 +3711204016 3919389461 3613276700 +4121752109 3963698386 +3217705165 390306073 +3294666952 3961330379 +3160316470 3203187463 +4129626486 1598403926 +294491345 1281226619 +1083957204 411934535 +1498937205 198447187 +2969222684 3065595409 +564359095 2873679120 3014918179 +3492009335 3260759011 526977616 +1919356633 1556108720 +374534181 1234176570 +1827262486 2316473009 3197218648 3334848498 3197218639 4242119860 4049663061 2759866377 3679267301 979427262 +334407588 78767913 2366563736 +1465140731 1957308978 +3871411088 3521459107 +895935641 3391645424 +808302629 4244169274 +2447188670 3032339423 +3792361997 393373944 3792362013 +3551581932 727864705 +678512342 241635782 +1627364710 2947276592 2813055642 +1923976925 2935943400 +3180853969 1195366150 +3501245981 3918610228 2382218264 +1797994671 1098494109 +3022934220 3022934236 +485142445 846368068 +3972909412 737413225 +3900623418 3900623402 +3977059804 2523711749 +2779612015 1059448753 +2658698683 2878691089 +3329834876 1617407472 2554982628 3974033457 +1414739246 1960095962 +3227900992 616582852 +168155996 590893511 +4043238660 1699683679 +700846856 3797919267 +1059336965 1059336981 +340295919 449413720 +664707309 2315137960 +239810928 4033571651 +3631478502 688255779 +1477741672 274270123 +737930141 3667126324 +1968694302 3613137705 +2917577673 2334983544 +2126557748 2126557732 +1439431961 689925704 +1195942297 3590272616 +3877935381 2317403053 596906287 4087151626 +4000920828 2550991532 1643040433 3689898160 +2422032261 1443954976 +2193155073 3389975936 +4216451692 581022902 +2360504988 418016152 3506921563 +1190048516 3628029499 +815821504 3657343933 +3066371566 2790137273 +2739986144 4165917349 +271540502 2425738673 +2809505210 2809505194 +195794676 1394516495 +1455611581 1371841419 +3439844823 2590128496 +3953282900 644592953 1149428015 +1261324935 3772732032 +3250918560 2987001849 +3916041622 3596765797 +4208125459 4292837207 +2569347819 4206157641 2477728638 +1317657016 3723760334 +1032144633 3519986152 +1193836988 3234085617 +3777980268 2303861116 +4208196722 1303799653 +1485885436 1744267687 +2513406260 2972029875 +272369523 25147930 +3373231146 3795016837 +2634883421 3087202626 +1011023686 212735889 +3392977786 3617267970 +2330304501 4283651469 +3344870517 2082546569 +1026769318 4256192577 +2338811042 1071925170 +760140794 1293398667 +1466177830 1666608677 +3063173580 930923575 +2662022306 1771074307 +2219832625 2061433894 +572944059 716750153 +3123283381 3294460924 +3033877020 3351489031 +916140825 256995400 +1863640732 2008082759 2023552140 +689585306 1190262194 3923757455 +876007080 457628355 +3691712415 74028872 +860101768 1010362891 +1488713223 3068415241 4066723128 +2561990641 1573566593 +1518685852 467320721 +1362388646 2071828311 +448875080 707777008 +3347232160 724913362 +3839054264 4037649595 +4020115115 3772624674 +3470922544 3705434952 3812542091 +4258458919 3681068804 +2963017816 4185692432 +3886060871 3905617622 +1173818404 666626466 2388811209 1206394025 +1338843546 3766835792 +3014932214 3669132625 +1602588403 4081327813 +3781979162 1471689870 2767895438 2073526789 +763410123 4087702152 +3924186168 1838584877 +2538128173 3912595346 +2626254959 3681064622 +2128517599 3530386971 +3804176133 3642120067 +4056831246 3050300697 +3064128172 778753217 +1231038372 4163492388 +2336253175 761196742 +3906657748 1686844591 +683050959 1369115683 +882961507 3563988816 +413333931 1938753570 +1099013276 17010503 +4049596122 2841262088 +3828512096 2607728179 +3210527144 3210527160 +1131837682 629171429 +1873893185 355228480 +2242240475 577581960 +908263262 2534932735 +1829630355 1072908922 +4197947790 1813491481 +1557857820 1221238289 +47806864 207248828 +397489849 2158905941 +2060759443 4023618170 +1022600164 3616210943 +3273157138 615780525 +4025710972 2737082901 +1408876581 1730777980 1883990365 1408876597 +3045465112 714407347 23968224 3659413979 +3413120670 3480453529 +2422172509 121261668 +570913400 998976275 +3005991159 116656522 +1031768456 2980452784 16155484 +468575224 4018003835 +818643937 2975898422 +2144210574 2144210590 +113354425 1070126161 +1296216145 3724732842 +2458739705 1049931742 +3638894148 3031344415 +760876210 3713674778 +1184043261 377732674 +3816109247 1356479265 +680661024 4260323955 +692252168 4233934493 3807607092 +1730361571 1376894113 +1725755476 1104041007 +627285060 467368751 1601758468 533659423 +547193145 3953209096 +3711018064 2233838069 +3350971558 2584136689 +597964104 4283314787 +2535159570 736984582 +898273960 4045725309 +847777524 2150599183 +2076812355 560829820 461525543 +12245083 2373197832 +3768522776 3085719972 3768522760 +2370138633 1075079455 +2458334463 3066192554 1527797611 +4091484156 4091484140 +548778718 1544065897 212813058 2491226830 1619013865 +2339134613 2520977993 +2989362693 3701217852 +2664496654 2433679833 +256750495 1136025408 3058811713 +1928459241 3689084888 +1092846985 1092847001 +1591849590 3926011466 +1128081736 3243394659 +1796467781 4243732803 +4030916474 3008521501 +3169727854 3640532025 +2789441762 2687788568 +1113375126 1113375110 +1497113453 3870016658 2993058245 +2811774156 685080020 +7319695 4262562010 +287457079 803832710 +490653354 3016932749 +1953759789 2141154523 +1058840012 1223323510 128171623 +1726880191 946572668 +249605934 1627375485 +3153232264 3083310867 1963385279 3257129331 1136792259 640352212 2883317144 3141233170 296059513 1378263922 2833863223 1878722741 3766565624 +3769097018 3795721291 2904071627 +269657188 488044989 +589929104 1907965032 +371913322 1335598299 +604844179 1961717011 1219821312 +4199168873 345269874 +3783195092 3471001775 +1787029473 1442753165 +104110240 1691108339 +3968759700 4165352943 +816709909 4241174282 747470807 2593276896 4279004090 665825313 2961424947 3068900380 +1521550739 1520017202 +4209967157 4209967141 +3308294495 3396655240 +340497480 989490525 +1305460218 2013794443 +3095415957 3095415941 +4093873692 2803209784 +1779291897 202763649 +2562172406 1595556433 +574546897 3120603654 +3371482747 3561479090 +1978514071 198746505 +3089150343 1651996566 +2726336909 1567733988 201729252 +554275844 554275860 +1864312804 1736453341 2628003197 558254986 1100629546 1840279443 334891910 583593766 +90271169 962578134 667288305 +1680592523 1005987010 +1630614886 1630614902 +3081638611 3322170198 +668689795 1096863018 +4027740387 3490166090 +2796803293 1243092962 +125329 1127680455 +2720966003 3262018586 +4214165010 2098406995 +292563369 1692067035 120431896 479302936 2428310783 +1715801959 1706508086 1064853348 429648927 412871289 +252505258 1532530587 +3345958236 3345958220 +4210796169 2737252782 +1726168368 666456707 +1258052888 3683081329 3505454436 237467745 2462818591 +4091869608 4091869624 +3664552165 960785165 +2250732224 3412140664 1029544091 +2735916512 2780819643 +3654709541 294919468 +3570051132 923194993 281252849 +996178672 1759610837 +527674859 1847249140 +2930061587 3661303620 2387225908 +1462898015 2731216001 +3213416446 1379960162 3717331285 789293833 +2465202787 3584276825 3174153229 443373159 884392138 3265029899 1628026143 2689572701 3894367508 2835182055 2990817626 3505358721 2141222011 3457116947 1272460252 3821402579 1666459326 834163528 1601701195 3581232495 516998415 211857994 2350386691 2884708273 507522579 1114601840 1739016068 582759905 3905389685 311776238 1253307619 +618972189 824228276 +2656559839 2656559823 +4071497645 3038502212 +4179655407 2635903953 +3895580173 2229685375 +3868429692 1984412209 +1470730081 1626125728 +3713844024 2970046765 3682912708 +2539801887 1858037726 +2917451586 19246325 +2808786708 2240681735 3125726770 +2176302723 3074484266 +3546450882 3546450898 +3062965720 1048482573 +1020626990 2146968556 2681654959 +2490997698 4291679585 +2140056437 2140056421 +691674811 1618989907 2709414002 2427931162 +1684166516 2060430223 +1972295040 2413435013 4183071052 +2292362708 1580746988 +872755711 3811423336 +1760495329 2991659253 1779634449 289920054 +2560165805 3857126724 +818730495 3514097790 +3326886334 1561819114 +2361382008 167475451 +1090276702 2579015988 3135734618 1536443286 3838910033 683956298 2958337623 3156520055 1263085083 784268467 2638204616 3529214856 1934165874 3975581042 +282002177 1994504854 +2182362914 1943325757 +3826119127 3039296357 +3934202252 2989385569 +488819927 488819911 +464032013 3244144312 +1108034505 1313860667 +1946932488 3063962525 +1650006527 442464682 +3003683713 2616179196 +972931494 3819540721 +2302217538 1188028149 +1380380674 2276184885 +1124466979 812800081 +4011775238 1938380926 +2795727866 1296235165 +501431791 1319842481 4145582163 +615740504 511714971 +4110828546 3057683454 +472658223 2291231992 +4222143876 166468478 +621703145 1052388312 +3725331696 2096651733 +2146956006 3040887857 +3356463679 797129022 +947679922 2649263653 +2285553186 3225832610 2009821995 2009822013 2525357973 2355367918 +1845134617 1547389700 979338846 979338824 1113621993 +672038461 3436939380 +2178284891 3141029128 +225698388 2171423279 +3668883331 3289047868 +1188851178 2979959877 +4282968414 1036476137 +3144314887 260987648 +3572669928 569283627 +3839944717 1527598194 +2951947940 2951947956 +4151486535 3497977814 +2265965368 1623617210 +3025563101 3632819369 +2817590985 695053944 +271404761 2960770767 +2690547062 3938418897 +2483546261 633526404 +3016524829 149476936 +3758061533 2083107051 +2792057795 3189416956 +2632570669 2632570685 +3629819573 1270116092 +3549978980 3549978996 +4164409929 1424043429 +550095035 1487339108 +1542557522 256155155 +1186834341 1186834357 +237513352 3510301707 +26016293 2515388460 +39596182 1293974577 +3143557806 4253988594 +655382380 2201308800 3938033409 +2706162578 3990079021 +818640959 256789310 +808252689 3888499152 +1653203327 2651716328 +2488207502 107640719 +2433214808 2809419149 +53483795 53483779 +887539654 887539670 +979984448 348272376 +3664769273 3417474270 +3189030590 2685764968 +3965499760 2729933262 +3521211457 2799528543 +1174164781 3423093654 1797433897 12949050 1692409241 137897230 3765337511 1230486595 3014327637 3182768117 2940836804 1340754254 +15825406 606739742 825097058 606739721 +3361895369 950168948 +536516015 108634734 +57141729 668347398 +482471258 2672338082 +832487650 832487666 +3374083951 1570935483 113470392 +172631180 2615914656 3199699041 +3252381095 2713468851 +2918198872 1061747172 +57541186 2821557731 +4166899000 867608379 867608365 +352618056 352618072 +2471220239 14767230 1715933695 +790494933 20457802 +3955514699 3955514715 +1339173192 4023843915 +2916172384 7044403 +1397128912 2940134631 +2780610621 623026178 +1520966649 2946763006 +3029396920 1361786963 +1375040051 259926432 +2266682599 2520590240 +882052265 1820126734 +2453163651 2980288554 +151905035 1272736340 +831894922 831894938 +382960854 3304725735 +636517129 2035729785 +3232146720 1716908389 +3376718708 1259163535 +3475185790 1697432434 +2112992549 1753229612 +2529870429 3548648745 +3020913037 4047864507 +1827675337 1191006318 1191006328 +3482349536 6847588 +53261079 1708941954 3689878197 +2280671049 1212168184 2870479801 1212168174 +2254385233 1614178661 1852489752 1501145480 2203660969 1517923102 2102995290 2102995277 3647955763 1652941067 +529011962 197376469 +929005991 188991938 3529054710 +2148109006 3198952014 1560642127 +3919634658 2856453066 +3226865060 1711684644 +1686120975 1153578382 +3024549369 3300210430 +3544904766 3707665801 2474469534 3076492322 2208285001 +1712566495 2415882014 +185826731 447665186 +760355420 2294601992 +3453961646 3296375033 +3058669544 3476039910 +1816822593 3125583680 +3712517604 677551294 +3554732104 3540887901 +2371524518 2371524534 +3412681982 727154697 2107692130 887749577 +198268354 1552547939 +3227888110 791652063 +2761183189 4002223219 +2469272285 2392082914 +2332828148 1225797727 +882361376 882361392 +3862688698 2167510658 710979019 +780346883 997512892 +1524304649 371971449 +307179210 3505805216 +597360784 1798337552 +2257962620 1506243889 +510471070 205696451 +3508783424 2069221331 +3800866802 415951258 2506082803 1317752798 617282670 +2016554299 1802015367 +3901351066 2870140535 +528193317 1611716051 +954473162 1494625275 +1501987215 2109600782 +1079099577 2731837493 +1167122474 2903564827 +3289835256 4201051027 +1654368611 2824318032 +1559601327 1706051052 +6051702 1601839937 +3325629909 1182494330 +3177331449 2888815120 +2454403694 2827971310 +3741446823 264115364 +3988048403 278525078 +2422258412 3533252865 +582424225 1194893152 +66703546 4232287453 +327705175 2877014979 380817136 +2423457803 1880467796 +3227568779 1112495544 +3768503203 1023054236 +282310407 2219384854 +1926463046 1215835793 +1785560770 1281264501 +1096076899 4015767052 +1014398786 214147421 +3114497138 3729774452 +1677423908 2295949225 +2496234504 1094375563 +2842273437 1811292308 +4234038221 359748539 +3870202335 64764424 +3333937102 2707994969 +2487775933 1189026210 +1880815199 3648116616 +2246049695 1587504990 +2707434939 2774191815 +1669862385 2687984742 +814845057 2167389041 +3623826910 2618616831 +2871568360 1484879363 +4079851231 2948890888 +2459077279 1538275422 +697408808 697408824 +1904916567 341848294 +3926855220 3926855204 +1445958402 2934205475 +1412699536 503181731 +3962069384 1267829003 +3712887914 3712887930 +3219219769 4058236066 1979915051 +3644875854 1314776793 +939684935 1927089110 +4242938856 2397377139 +1121844072 2876425387 +3138761651 1838436154 +78199232 375777619 +1300489676 3350784429 +1777513728 2379105485 +910773532 2439275271 +4279335439 2541954456 +1033037163 1497311092 +3529353206 527394887 +297408369 3965811712 +1981084057 2079871944 1558315540 +2241521155 3677078436 +1133288468 1133288452 +1922661874 1503740901 +2968012245 1386606172 +457370951 2084692229 +2681506935 312024912 +3740596022 3117255398 1041954962 1176979955 1742941577 1689208989 928087541 966553956 3721755459 3793193023 744102776 4249305899 3047479769 4233949461 697343056 3009350880 +1184721774 2914775545 +1840483710 1527713393 +1923491550 1234114137 1923491534 +2605142112 1372958597 +2289885253 563416218 2007160445 +4000277564 2397876209 +1723071540 3780511183 +3252836858 833357507 +2542946893 3897227058 +1169509776 4268980203 +2122543539 2280693931 2928537654 +3537600626 1636512613 +2867621687 1228084112 +3259504490 1098701773 +3601786242 1969601132 +212991174 3257985953 +3767283123 3618378039 +2127051018 1449272434 2670840507 +754914004 754913988 +3910249522 3910249506 +3026561892 1611452009 +4097233115 1296746692 +1081334747 3260094928 +2640585566 2108245841 4110291402 581151990 1626615398 410727639 +4219617303 740641399 +3410636729 3359247279 +467085739 2125895714 +3382540058 2095218173 +2930783943 3328588608 +3074145400 3943280891 +2670671314 1766963603 +2255435626 2541685414 +129077702 3800595105 +2228630177 3728573136 +246990930 3538237691 +374586101 3730466970 407426771 +2226626775 3289526886 +109890446 4230804975 +2980367513 1064178910 +2047114372 2565294894 +45587830 3171737799 +3005079626 1107825773 +3199225845 613277372 894797197 +3226993280 3886412727 +4211250797 2241436882 +1010309603 1478414535 +3121689989 2828684714 +881312455 2571445111 1225765316 +3337413741 345079259 +1575559853 2197919300 +1366442977 1366442993 +827269651 2995954668 148376727 +1496743446 1023063594 2261286055 +538437780 430121209 +3751994525 3652325483 +2412282574 648407641 +1191462378 3048869723 1860578386 +1951783861 3626556924 +221416263 464055890 +2315116094 2324020041 +3083029384 3496994589 +139943603 1633495584 +3385896013 4199372197 8338738 +1123951816 2397801599 +3347439244 604961463 +1835732471 914815952 +2673894139 3753627954 +3266189664 3625054771 +3386461304 957571309 +3528439297 24122516 +3551952784 851769853 +3297222475 2894054164 +3266786267 3841366493 1634116050 +3818588822 3181608006 +434117079 2462625126 +4183304519 3435723478 +794769937 2749917392 +2727325612 2486275031 +2895823345 2829012582 +2637267639 737199632 +773568698 1336134877 +2109611152 2185688757 +3841908881 238781510 +2540888196 3990319049 +221084467 642855347 +2062673580 2062673596 +3488679098 3431962065 3364851587 3364851605 1023339306 308965597 1071846833 3103072534 +2020780031 2608756328 2020780015 +2440106711 2500405332 +1076533388 2487436448 2400068705 +25159465 668604799 +651349858 3702828293 +1656090588 1080596305 +2366424470 3297939062 +311461631 1720942599 2851378845 +3732219133 795425364 +1980753709 35987096 134802386 +3624615118 3887118415 +3990428452 2428877225 +1236989226 995094797 +2112894871 3626468016 +2737874733 478605535 368704388 +1919384521 3790069102 +3426784292 2913547455 +2607081872 802926005 +1845134612 2355435661 895450735 +3824484125 3718730682 752861157 +388997147 2047577566 +906115513 3196116542 +473955946 3804070107 +591912882 1679806630 +1850148609 1266310694 +4090039954 1468133331 +2645703538 2979239027 +1935246823 2095958710 4149770213 +3731021853 1586869762 +1326626534 4037191729 2870528794 +541061633 3316250518 +1413508618 2876062125 1413508634 +3052740525 2336965194 +3212071547 3757733694 3757733672 +3321091746 1088086293 +3183264145 4159859571 3536618272 1092925254 +3719269326 673156901 +1114808575 2574479720 +4159432152 542823181 +3372068203 3372068219 +3420835309 3888327698 +1867551103 4267712554 +1919587123 1355135308 +2035452233 1173233144 +1713328739 1626835974 +1301402333 4186894836 +704197209 1816805896 +3326899087 3109677592 +1225071405 537511876 +4266795585 252614324 +845335740 163320709 1846732239 982484484 227036141 180098331 2739294568 2198076516 +376064866 2874452803 4182350442 +3915631228 1917802284 3826762023 1113923623 +2693513717 2969719996 +2018840953 1044836044 1757638383 3874128232 19519838 1196023045 +1985857330 2275447731 2663616414 +3780089049 3108338600 +2703235258 1602677963 +184293180 3085966064 +832158316 1013168294 +3287776264 2490848671 +2783593515 1523142580 +1628850890 557701062 +4254756380 1756563871 +2752254339 2505150099 +2406906431 377647400 +3292085178 2685994443 +3595756105 23566418 +651575249 2431372129 +3572932418 2185016565 +1448872119 2581700342 +4205897611 3063338206 +776636221 475194626 +117242692 2030662200 1145015305 +681959695 2959633740 2590899066 +496433265 3397979895 +3201671721 2471380615 +659902487 38605862 +1802381950 689911181 +4163954998 3942588433 3892279434 +2569113679 2737294988 +2881257744 1774136355 +1237702512 2456954179 +3551312825 4058743848 +1964998416 1620372755 1964998400 +3424459812 463577075 1976781984 +1068863494 2682571624 +616531988 3984799609 +1389369565 703434665 +487869836 1391858551 +459147663 2752056344 +1727751029 3611457572 1017495082 2733267981 +2338075993 3186643006 +4193301217 1458149408 +2278985103 1707137038 +461805139 2816386234 +2459001469 3029004149 +2437038978 760235427 +1978677416 1361653867 1361653885 467453968 +190005256 3691891851 +4023016560 3952051267 +1509435405 2930183268 +3604667208 2189898333 +3514396182 3626519719 +4272179214 3936185871 +2457930918 1193732417 +4022628702 3493754601 +1953128115 1953128099 +361575173 3413259139 +4158319188 2174673455 +1078654502 1078654518 +902912304 2931719324 +1562732557 489450047 929143835 +457028222 1612708937 +1995440190 1644801374 2043699615 +422504592 3845262059 +4292572199 1167962207 +3322830023 1588129447 +1442010715 1442010699 +2781376800 861911319 445257068 +2789473555 3490145516 +744447545 320951230 +3684135612 1802083825 +3865967742 1025800799 +1791263106 2505564067 +419587580 1522961319 +147366154 4129084065 +1213523538 1166557981 +2978477736 554257021 +1096423275 1272110452 +3021859297 1813458208 +3313853851 2348741394 +1063156814 264089295 +618546071 2699323046 +3589362078 229059848 +735435672 2577969229 +4132012725 3940210266 +3692996346 1259969493 +1800912546 1578786731 +3297387956 1929984520 427383385 +1910626897 2542448006 +358860441 949971401 +3261540846 4133945775 +2347781516 3611956087 +1186475723 519154068 +1238355623 3642904800 +1248831301 2541444336 363956593 1158444394 1158444413 2459107907 +1280096482 1280096498 +221054790 65172279 +3290061057 1654660323 +2511343758 2268495385 +3009744074 3474882085 2616634822 840114683 +2884542673 1328710423 +1924243099 3629265118 918278363 +3275946541 2406470866 +3098698915 1674865820 +2337966648 2876331504 +2065792413 3285409186 1924709931 +2185116183 519402022 +1260385543 1091309657 +4178111119 2550742801 +2865414061 2318122322 +2281499788 2670223479 +647427497 3259975196 +50554782 1549540777 +2391894669 4226464754 +1466087533 2101055186 +1100161305 1402804830 +2082939544 1824106532 161183067 +3597550654 1383674313 3449122207 1094422878 +3396239756 938864503 938864481 +2702896478 2410626712 +3216051666 2511913363 +3419142598 792584457 2551853758 +2795927436 1666694049 +1808825872 3501220584 +3840025906 2181074355 +97755786 3056131890 +4263916678 3367990562 +591800920 623903097 +3211735870 3624599842 +3308405417 387903512 +649318364 3373283153 +525498336 1521742508 +2415828959 2107991521 +2500327079 1116293366 +348002961 3636724790 943968848 1604423088 4171001431 +3495064676 3495064692 +727272011 2291135508 2120506108 245185400 328108725 2291135490 +2575805926 642905895 +3561005227 3434933556 2171168975 +2203800974 2383871634 +96093570 2252041141 +3437072703 3217794600 +1923576121 3063364798 +1447746799 1088191547 +530663046 1356989665 +1582133219 2004301164 +3930911951 2787467726 +1175232524 3297466401 +2602328076 967520993 +1787964981 2388927178 4179541347 +3774312055 3138325250 +4029291639 1891916532 +671624511 6851818 +837456936 1267587322 3679075158 1028512220 1629609045 +2472404664 3033674683 +409436719 1406978488 +1582590196 1582590180 +2498382284 953297953 +3271219861 4189009852 +887976936 930159543 +1990943610 1238210827 +761300038 3035642401 +1533272950 1413419729 +4190042629 528803370 +2284493902 2284493918 +3795582456 477154669 +944951087 2018712533 +1929772182 2825691175 1241521526 1241521505 2302166442 +3636130921 2538520920 +844028881 4079218880 52693520 844028865 +2739947986 2739947970 +2025889112 544780921 +2216461278 3605239401 +3879257402 765317290 129664003 2845050518 +2001151158 2063518353 +4266115239 4059317984 +2907726524 2441833969 +483378797 3356843396 +678846263 3914851206 +924407418 920855051 +2569347831 209062608 +2684867075 1867549430 2059298877 2076076483 1984992752 2411757034 4014971562 +2507832586 1506989741 +1681039913 3837085336 +2922778005 1791921210 +3026561915 3544421317 224524328 +3060367442 2048196869 +3812280126 1750064488 3427638722 205600391 3305847493 3173745384 2754304924 +2204220353 2480574687 2191647789 4002939105 +3848439014 1521175 +3132485696 745092293 +1094297358 3150052121 +2676288442 1162831421 +3720284963 918456330 +3412271728 2482145244 2635019861 +364482688 3005118853 +936628871 677424416 3276490084 3276490099 881502989 660646810 +1806205260 3326315169 +2857334517 4180834688 4180834704 +4061790745 1859963646 3111505359 +2542002319 328892696 +2403655919 2020481073 +520588482 900803293 +3136545973 2339440717 49350890 +3662435226 1076337533 +246769016 2676931579 +3728774971 447615460 +3396978474 3887367949 +2321171908 2417742720 +713801527 285990973 +2798502867 1760249132 +3863662862 4120555997 +3270675605 201785555 +1393287483 4138962916 +2062587059 1002051034 +1413742443 302716276 +2720871775 3402880273 +779696071 3369774788 +2408829891 3367394300 +3150539528 2786295197 +4152111793 1233374374 +3167604224 939215385 939215365 +1524143354 4243752331 +3981098730 1990888027 +1517751400 3513288619 +25166677 2978299594 +2646043656 650585909 +2580220289 2610951680 +3022755836 2627748273 +249833768 2569849341 +3361895385 1527735450 1913402526 3656135346 930142737 3902204076 +644873813 3612172234 +1757575150 3626159033 +4087847325 1694449969 +4110195007 3903143486 +2117833914 3198516471 +2331233236 2445926073 +2343793707 525150286 +1415338547 6422092 +1831000380 4199133987 +752975070 2230817129 +1496586970 1107559445 +2125969887 279804555 +2354587313 2354587297 +1048869453 1048869469 +1139257948 3883411733 +3595944146 1035253572 +2178793002 2584894477 +2732456491 2389758370 +2828261373 448101771 +826907764 182536857 +1631043379 2220998304 +1406124048 743715 +3498960964 2472846111 336281256 1610688772 275556143 +2556855141 2088512590 1314969580 1551105674 2304513228 2324684707 2762182735 +883042810 1199067270 3578270877 +3644892816 2428908725 +4064601207 1256818217 +1212734424 2729579789 +2596048488 4275318205 +1545134647 841751686 841751696 +256186245 1402477916 +3164075219 1227885747 +2286786110 3491988383 +3387158789 3604245210 +1814727585 2755658694 +1004363547 1484568466 +875886579 1019046034 +501498054 3562141601 3562141623 +112120859 112120843 +2397110349 959674674 +4148047928 3425566138 +841914834 3512477061 +263717293 1806345028 +1238310908 755980711 +1947905719 2097220102 +437681830 856148301 3254176335 2215508432 1733459754 2118885548 822593083 232853413 +166477055 2648966504 +914394633 3579811896 +4117978458 3129092405 3197891755 +3055635934 3055635918 +1581039530 60930189 +95717993 95718009 +1451905699 1080267076 +3990743433 4250313400 +808763469 806009124 +3708676946 726770137 +3421664934 3031484247 +2909353415 3282020416 +4222612787 1761541964 +4203071358 4203071342 +1003292059 3200242436 +2782795299 1072285456 +2974787018 3932290299 +869801176 1966434331 +3251440352 4123532965 +863779872 2346445503 +354839405 4224580050 +1718589043 1935509472 3031029530 +4067537982 2603081337 4135312362 1107591497 1107591518 1878641698 47174190 +3081353223 657240832 +173936279 2511727107 +36973343 2535449054 +2211846965 3205289066 +876393764 1603348393 +2732658950 3262509627 1228201098 1705190874 4014001716 +3153404939 3083434858 3991387458 +563214465 47977227 +2370084889 2080900936 +1797122885 3843644812 +3008549887 3008549871 +1857075132 4231085297 +1567066491 2231200946 +3507201818 1922951413 +3470468119 3120156720 +2882984622 825901039 +299103667 3282815180 +1769552966 3942587537 +44605713 1057894070 +420591341 1675818770 +3602558541 3183315307 3543936526 +4283991485 2642832258 2790368459 +3877225345 1317979136 +3693812537 3504069288 +778583514 3893976637 +2299183383 1016864916 885276488 1016864899 3538810672 +557763848 299722082 2315971354 +3577174028 2988415713 +1104405061 3851235980 +2377188537 21590703 +1647757143 1302961609 3609538772 +1741746472 2832341212 4277141845 +1258052871 1651946089 +2475501191 2475501207 +1041619203 3211042730 +174360208 3963606179 +3804238605 2006007133 +2781685776 301338940 +4143407026 2037097779 +1077660123 4179542980 +3839054267 4087982450 4162168959 4162168936 2351040645 +3899140652 133849943 +1576650462 3484486212 385113773 +383287213 2748382546 +3187222875 431821925 +3524731719 3524731735 +2113174575 433278316 1994358254 +1540593412 1538927395 +4285212773 2058393338 +2902959304 721970891 +1865880103 984716150 +2579502520 3244437677 +250391727 817637104 764663665 +2384100344 2880513915 +3164028174 4027915535 +460544048 1720963971 +1944816493 2445186412 2445186427 2148480792 1115570149 +545001408 3813460819 +620918995 367277114 +708193491 3493524823 1179160620 +767301960 1304606325 +616608818 616608802 +3003205240 1124200187 +3602418085 1265071308 1890592225 +3014388833 3000849991 +554762774 600197297 +2080958477 1325747300 +325907686 4147254823 +3084189036 3875103873 +4026383669 1110065043 +1390017779 3973747296 +1132866408 1854367125 +1080905449 1427323086 +417880327 1019487744 +1385805273 3774432414 +3244316224 2863122131 +2215943110 2993764513 +3983739557 2143886199 1897513402 +662350551 3781722196 +1847204258 4111882773 +260025184 1492119524 +3968227503 108895086 +3924164110 3353995300 +1999692570 365099472 3153428989 3397090982 +887715478 3783634478 +911407299 1201511164 +3387394978 1986051023 2457915954 2457915950 1986051027 2038484995 +2833182015 368015934 2952613116 1639330049 +1158261707 2302249426 +3556841234 3881923574 +2015489405 2489207697 +3594043812 3747140905 +3857998025 2361695071 3367263352 3213398523 1642955054 +3686687735 2131637629 +4276437610 2900856027 +1938453058 869338488 +713677671 1577345846 +2377466064 3830777699 +1863984807 2368395497 +3443064815 3409368891 4290438456 +3291229641 2592871288 2978122556 +2948864748 3407578195 +620403368 3733026411 +925771382 1982728791 +3649984931 504830858 4200625799 +355476049 4005212662 +525067627 2944018292 +3753726737 1208599494 +3003413641 1493398456 +1509445454 1950333657 2639599610 +1915746758 255972870 3215852218 2273718967 +1403248029 1377184049 +1475879889 1285579280 +2510334087 1162046866 1464018649 +3773187596 377504993 +2638043757 2169454090 +3742372916 1048369236 +2990114366 3373114185 +326885199 4211116366 +1557260472 1097870163 +3686113769 3354255822 +1914242251 1751288706 +677079569 2565339334 +515741072 2234056683 +702190684 702190668 +3395103360 279570323 +4053805157 3082464156 +3296375034 3795539926 2308814293 1193580957 +3711514740 3037978255 +2628435361 1103660128 +1250892525 794887064 +2902463706 824234813 +2069480295 2069480311 +991333445 1285710461 1233047706 +1470803632 2981166869 +705281088 2122384590 +136504451 1872506359 +1425547033 3684234334 3684234312 +1708960585 2741085176 +2559099213 1816677412 +1053188012 2118687703 2118687681 +873392189 813144084 +1104297771 3371790498 +2323129555 2876878167 +203662707 1465757430 +2887270198 539722247 +2687598473 3068904622 +800553577 2262152024 +3469105189 2124792157 +2658542194 3858250099 +3286288984 3000928411 +2857295453 1042400425 4195058846 +2155161912 1886380859 +3400971244 1655582319 56562964 +1909566884 1244148168 +250584399 3526665038 +1486916273 901403814 +4177819149 2206877780 +798362463 833873948 +2718604746 361151566 +1805172640 2358462082 +1457225819 1498766257 +2762118910 3025149377 +3244452042 1416619641 1964668829 3683543437 2808430999 2182731266 2244554066 3825377966 1242905807 562522834 3888822457 2940708381 1881090992 1945023696 1802680794 487468100 1124893498 953559091 2338156261 1349363161 3170154841 866620595 4223847957 +1627146538 1627146554 +122467472 230702755 +2221498317 1627187135 +1459295370 2000770363 4141427685 4141427698 +2249879574 3278798070 +2681923302 3606904913 +1742918316 3395666573 +2501371187 3885879130 +3590644355 1823511612 +3748913472 2903048696 +3506933506 3175388938 283516963 +2761419343 2761419359 +1197926744 3204535707 +3016954386 2613002695 2629780317 +3987757036 1849825020 30060404 +1901458996 2656211929 +429453300 1069661465 +3256038119 448285651 +852615285 1969510442 +1289503201 3753620790 +515141481 3205194328 +3706797073 1896067645 +1759131385 1654994050 +454351900 454351884 +2654738373 3717819148 +2512036408 3972881965 +832590648 1466106171 +53008684 625860673 +773620495 294309845 681594822 456341184 613317591 2788872817 3934560400 3361240381 +4080156014 1175893039 2792754642 +93358632 2177968272 2716132027 +3004037565 372865186 2617255060 +3531605075 3057080535 2995179180 +3306271984 849298847 3927087487 +1778573481 2340923918 +692554241 4238229376 +1390255593 1861800782 +3653341230 2289440441 +1889347334 1298427518 +1883551762 4179149118 +1666953877 1971536563 +3136192645 2276405519 1764633588 +1966083704 1966083688 +1451621747 1738786551 +760235613 758064725 2992555106 +3151721356 1311446945 +1386767158 4123292929 +2452956299 3030943444 +2015608742 3326521943 +753716641 3412137414 +3232645222 3092209793 +3991129360 558416764 1721075688 558416747 +2736984625 1339371240 +2768589351 3999290230 +226820117 226820101 +1312637577 451380741 +3009784301 1443528708 +4077632762 3241316939 3458071368 +3213140695 4189014839 +4262508363 4262508379 +336264020 3656322907 2572807470 +3995894281 4178621496 +258598918 1236812129 +3520812370 1833111021 +961922769 319290128 +1559925083 868286750 +3477469049 3290731368 +2913361603 887869606 +498203005 1009500116 +109449621 3658329500 +743914183 2488371030 +3125468130 1993318258 634922179 +2982334957 1002953863 +3342727329 1200514400 +1721194095 1428246971 4013756600 +4153885442 4153885458 3307109429 +4125558622 2024839401 +723274780 3955241228 +7677099 1667807540 +1124651346 1133917046 +3147902577 3147902561 +2345301084 3316933525 +1183715043 4104220508 +3396835484 1610607440 3396835468 +663154129 174612496 +3708399467 330402581 +3320683681 906858870 +2468815723 767854990 1047430933 2590280345 +1045876881 455256609 3014284358 +1160509886 1545906338 +758655151 2355784212 344525472 2626006685 +2710266112 1315549971 +672423640 4027665933 +266590549 1487872220 +3397733551 3397733567 +2580288321 1564626752 +183955740 1589481240 +341216170 2923289741 +3033437114 2507168189 2385759856 1536505475 +1573634899 1867427799 +2871842930 3919100773 +4182664950 1427148746 +233219097 2869265917 +149763742 2876046015 +880793211 1721473854 +690306396 3208379920 564107217 3208379921 477164752 +921293755 1631910504 +3963185225 819836307 1279730047 1867064559 1264229889 +3686729749 45725980 45725962 +1594955749 2364054892 +3832189970 1265322669 +858434102 3257529095 +342372507 3137635332 +4074400200 1469222000 598757308 982432501 +2533164075 3679293364 3679293346 +4117749154 2907488710 +3233944242 595815973 +2615237690 2646880075 +2602267715 1865942378 +3012291858 3074831173 +2875399779 2396411982 +2415471623 2383438733 170285082 +76049172 918589551 +2470100754 3354664433 +3100614472 4052797319 +3543871243 3543871259 +2952267450 107176323 +1483720414 368447359 291136766 +3366599482 503004253 +816085302 3817698977 +3688848298 3399306381 +1691094675 1077604716 +1112460857 2601427880 +4170362004 3806702831 +3395103365 363458380 +990895311 687343206 +484720420 2672780735 +1588223997 53812034 +1074094188 3372169216 2550136705 +3615863422 987908510 +1821351476 437652441 +3783067369 2578582680 +2905257333 628455415 619194124 +2982645265 2846843808 +2433770505 1886869112 +531466257 4012716742 +2704023536 2826323651 +1327995655 2723744790 +3575432923 1464666834 +1770794077 2225722996 +2461054144 2446081867 +1152815999 2859086056 +1540607949 3971132544 +1745792031 3994612958 +3563226835 1230533786 1801763578 2299748412 +214039412 2304694159 +2608377709 737945732 +3553172049 3063180688 +1285155754 3649728618 +1476073017 3108240318 +1869148146 2303183982 +3983945803 470681108 +2063736433 357952496 +2674674283 1652106850 +1696565235 597885836 +1725583653 1524263033 +809903418 946641501 +1342183269 1428476908 +1444386672 914551304 +760564986 3598249125 +1061814272 2308184729 1163531005 +4006817138 1752205925 +3318982283 2322968211 +4008466154 135057997 +3920379047 718958244 +2974781403 3837303781 1223058312 4215240146 +685983603 3502864922 +1931861125 2963849648 +4260849324 2254105324 1787165981 +610233694 2688101119 805216603 +1917890016 1917890032 +4277906667 3447192916 1362179581 +731442748 3720284273 +1404671569 505913734 +3382666201 1055534750 +2550299179 2027499861 +3840069636 3440285456 +3153980390 3602537217 +1029606012 3758462358 +893826558 3696262857 +703211658 2241712429 +1174627016 1292033509 +2409368636 1112381424 222550636 1112381415 +2528348320 3701478373 3701478387 +329062939 329062923 +3181739841 3181739857 +1000535912 1233877163 +1663388101 1449239424 +2091570209 1642852342 +653493225 2811242830 +2181356280 2779034733 +905456606 2333780789 3551334015 +162184091 3500463432 +3055699047 519155254 3597999204 3363402105 +4215921424 1590722923 1590722940 2772687413 +201635524 2943071880 +3042987406 345642649 +3453961644 3262819799 +893584291 2071902602 +3422210617 2361573924 +23170984 600441795 3566544253 +1406980850 939384727 +3720284964 935233983 +346703042 1242185059 +1659783311 3899515084 +1697539758 4127957999 +1604888666 4034987453 +1688761171 1688761155 +592452296 1595549917 +791376782 234887449 +318097531 1139441762 +3336470113 3295935293 +3931941431 3350484850 +2633537795 509140924 +3059207650 3996719829 +2112053609 2515687512 +3864383698 1796717189 +2764875684 304867135 +4081852835 4081852851 +1968611326 1640149769 +2773441508 3603389927 +1812971626 2261509842 +1001130055 185545540 +3540478227 1705779210 3057852524 1202350309 +2766927962 4185388477 +2456340294 3076798120 +1057658190 2343111129 +3239899717 1167155866 +195910539 3974568916 +2883351367 3540613334 +2787964108 2376122423 1626804930 +460223213 2006003308 +2654915916 1759325879 3039848311 +156805658 3499345643 1134699490 +298087001 1363149320 +956225339 4096578034 +2762134117 3235277782 +338996921 3772092762 3546569809 2280590632 3165832812 +1998130363 930024050 +1341786559 2778552232 +1127868438 1149678838 +1555809 2662695374 2320036973 3926354971 1694390158 12006809 3129661851 3339370754 3451524516 1523098371 4134322415 +3672462552 1862569997 +3033069723 3961383022 +1648913991 4278557142 +2588239334 3242158359 +96569519 3198823278 2648862203 2648862188 3513322193 +2364791163 1591696562 +3036290002 3430643834 3430643821 3082406803 226245246 +1572982480 1746440547 +202140340 2878077263 +213992338 1008738238 2241611323 2416086770 +3665216219 1195924654 +947451469 613920690 +1078477056 834556677 +3256049392 949005001 +2826029550 421585327 +1083383709 1150993460 564314498 995383659 +2524027563 1138863875 1923347151 1923347160 3928045269 +2597386725 2885254332 2597386741 +2638967545 3493600459 1471076040 +2079183424 1466038981 +1415466570 443891323 +1346601538 3846691914 +4205072495 4289371832 +438973443 2971582884 +2868718650 1714224554 +916018726 425893313 +93376445 3468974307 985766224 +3787922281 3580896846 +873136566 2747299734 2740171143 +3697092190 205099113 +2133172342 2975000650 2654706129 +3805139564 1979858967 +1756056447 1151850728 +996881429 3992209536 +3504236996 2451603359 +2177221466 1491730229 +2197675315 2197675299 +1222135976 2373528771 +508095619 508095635 +3985420819 125588474 +2890313398 3913615495 +4184387344 4068308348 +3268880042 4177517331 +1737904193 1386239552 +1994358254 4259779937 265502127 3427395096 2559187566 3378948183 1512491413 3544838444 +2306160217 3162803720 +3365153586 4081057701 +1195882034 1742983333 +2704432799 1438665696 1632302152 +1577425158 147842145 +3478823493 3138087036 +3829903383 1943680038 +3885217004 1338472832 736450044 +584554533 2990080349 +2296293769 3289857028 268494226 +3161079661 138533010 +3992638589 459962097 2659404305 +3148898482 682113061 +1513816967 1513816983 +4172253507 3210024042 +69392170 2899883803 +1060094066 372260365 +386164390 1395517090 +3186739135 2957071915 +70659408 3693767724 3267905879 +3623417331 4025167258 +3785109686 3739266705 +1523046797 541840127 1973123300 566196185 +3990478070 2761221335 +4191945015 2269036695 +3326444520 1677169616 +3664737937 2347130266 +1680331762 2628953573 +4188724927 340168905 +1749276000 2194204197 +403120945 4290777408 +2369023289 2189947063 +1828160055 1544224105 +1408250361 1408250345 +741593646 140984828 +598004558 1786291161 +2921773243 3790917234 +1142804185 334274462 +2936723517 3406981140 +4039863124 1681519919 +401692801 109356547 2955725744 +982829107 1798776908 +2590817367 3249113205 2248715714 +2491355124 2491355108 +1180941603 3342761113 3493759663 307314628 +3384400774 3384400790 +1273926442 2995890957 +4270109693 1511649675 +187853295 3637939685 +2677041325 3262603118 +257708655 2639643832 +1588428090 1159471709 +1461668201 943104941 +3026928112 2151504114 +2411805431 860418135 +499752838 1785077729 +3076108672 573729939 +3760668000 800418103 +2474709855 2469494408 +475067057 3263173405 +2629004652 3526154015 3475435210 +1846261516 3944859447 +1814847384 3789192283 +2622271561 1438221048 +1038474926 1038474942 +1151232893 2187539906 +3601181548 3676808206 +2107213361 3920510758 +2256734769 4227632342 +3880402706 736184659 +2531336232 4000106046 +301538130 2636513797 +3222376500 4216645791 +3250672528 2471922613 +3193201743 3990480974 +1873091391 4293518376 +1391991785 2241064920 +3045263927 4098430096 4098430086 +874927079 874927095 +1447239814 1370239735 +1856364763 3051855006 +2787954834 713840069 +969235560 3989601940 +3400154741 2130727484 +1815611743 3140927646 +3541174120 2908858539 +2536375196 3745481552 +1065919259 622229166 592659870 +1835403533 1151352676 +1795456010 2182038445 +3934983086 3874487033 +3865021220 3429370281 +1848276574 3403175423 1368350825 +510295356 416542951 +1782044638 3767173719 1151220937 +3559027630 2688293615 156953512 765355566 765355577 +3843351574 1551145002 4218425569 4218425591 1647202183 3051556529 3362436294 +1936022956 3814885598 +1137003719 1989664086 +3735840843 1946192239 3563597332 +3657558734 4278493785 2143811826 +965606027 629237972 +745462318 545355375 +740257636 3200402745 3648805503 +1635603808 3897392963 1635603824 +818668316 420706768 3975578897 +1675447657 1749386240 +1327333528 2802831178 +1740608949 127446012 +1149971979 4061756244 +3326506720 15540901 +1147030732 1147030748 +1183934889 709944601 3219739928 3219739918 +1014359478 3818429841 +2474086931 943387642 +3206670472 4070758284 +674870177 4090873440 +4203408375 1605465542 +3778339061 2067669436 +2299878255 1000271790 +1330588790 3605749124 +1041393847 1845155856 +1039969413 432248140 +3450464826 3450464810 +2554844819 4061163117 +4168136776 3281907061 +1970933156 2468575551 +575477223 3864623776 +3558052674 1069077853 +2449379211 1589376962 +2459146443 2023086702 2304345986 +203643125 279251388 +1888702277 935091562 +1789611668 2397546805 2142024431 +3746526317 4145301380 +4165370043 483092895 +551830901 1012487996 +1359932208 1795668808 1452498571 +419587557 1137076076 +127330787 2023480821 +3097282129 4023136646 +3136537920 2378138579 +4204627748 1078694169 +1772277317 2420815514 2420815500 +737500888 4215551179 737500872 +2497126567 2045877250 +2253968230 2106631322 +157602337 1941958225 +782063400 2310026237 +338444665 984289662 +732386039 906192719 +3446631705 3446631689 +3861670905 1357773032 +1312305596 136162544 +4251605902 2087592089 +3121834613 3121834597 +1735244012 754535447 +2039929801 830209400 +579790007 502402054 +49187652 3783605257 +1445835275 3035580226 +1747539285 3176622244 +3006664458 672771245 +3820942324 2323404971 +2962983907 3890034268 +1963915679 3851613534 +675218963 18376602 +190242048 3977249592 +2734951143 2254252470 +2184304003 43884314 +3218910990 375886617 +3273384885 3655824874 +2110410460 3374792524 +3655766960 4191506908 2735178837 +1622856651 287008920 +1132245730 525179349 +3149336242 3447318830 +1120375098 981741570 1512676939 +917103933 1249107732 +2344120699 1851434148 +1274991199 1214325349 +3819008562 2301019301 +3886429292 2784949120 648322855 3886429308 379880983 +2272272670 1401168425 +2514283907 282320231 +1262440355 397041034 +4138959890 1855514693 +2571830493 773367796 +1655631459 3160491466 +742286831 2922486929 +2733437393 1275112464 2869874038 1146568215 +1974971308 4230168535 +2228249977 3298888431 +4037129157 1653118460 +3423562873 3041378920 3606520140 +1338630221 3888912690 +2400265908 3959418191 +3110231129 2680554638 +32158605 2370602017 +148369581 2163887929 +4085693694 1528529865 +2543300002 3848712646 +855300989 3580194021 +3146597425 349330717 +3769580967 3952072627 +1247526778 3355931525 +1049345560 1360555955 +963349499 717753535 650643052 1598905380 +543808551 765825398 +1823166885 3065087660 +4214306801 1601900646 +185832566 1235575882 2444503105 2060024705 1674090854 +1512385029 3903233273 +667950179 261926876 +416851463 2951408473 604855552 3238618899 3238618884 +3460727593 3791681934 +3150831657 3457671320 +3261681710 4063371853 4051880440 +2992498479 3764397786 +470604769 155067168 +1808241524 2579030036 +2013365526 6586801 +3619484519 91433760 +3011625024 905730660 +1221076742 761726074 +1678500785 180861623 +3648007334 2912255731 3629091418 +1635413080 3417869965 +230506199 4036829257 +1093441869 2549320356 +3864837973 4177605340 +3547411242 3552399545 3601137390 +3572836298 133014267 +2097717808 77025685 +2637887268 2815626687 +1575559849 2130808856 +2705430424 1916904539 +2813340616 3260345291 3260345309 +3288528749 4255875204 +1366973372 3086722284 +2920603444 3428208543 +1690012216 3887090510 +3170009902 4062911144 397952543 2206606320 3980811781 +2184764174 226547471 +1990041616 3391289635 +2903992521 1155134574 +1755890334 1411982916 +3489533423 4071986476 2580534417 1542450990 +3811160924 2237612561 +213808658 567533139 +1800420468 3756143778 +3432907988 3116695080 4039219641 +2393300318 302921858 +1874243296 2214887853 +275262027 519738370 +3591312623 2293354945 3904762926 2483513658 +2278141102 6211374 +3817936534 2995374703 +683826492 1710802279 +3591327494 1664609 +4014640478 4014640462 +2950237863 1934659762 +1226042879 157263998 +3616476054 4116530294 3616476038 +3720284976 1162662600 838456985 1136565379 +2125976999 577066486 +895549780 1538594617 +237712648 1443134356 4245588463 +3710405104 376202435 564312907 3560357256 +688894972 2679657895 +3203283074 318960821 +1579269271 4201072611 2447658576 +3113749329 2069483654 +3869466539 2498738588 3190790690 +3398397047 4168236503 4124532265 1455931216 3966905059 +1574792341 1217516876 1574792325 +930674551 4202311156 +209371008 624653971 +3268841729 3100001430 2132674142 3100001439 +3896279044 2866439407 +1062425973 623871804 +2798673293 1371935783 +349873665 902599985 3576910742 +3265012668 399261937 +1668322279 1899549878 +863319932 2105956391 +1865293734 2175409370 +1517797721 3280297736 +1846543354 3882533059 +741527419 251436722 +293717655 642490288 +2607258860 1562365953 +1425246022 22934305 +3580431745 3699902630 +1193397415 934282782 3659210207 2796715684 3642432569 +1946389577 3935688430 +2825753882 3385468258 +1011859645 2928437634 +1778494500 77724841 +1366030306 251082965 +3922749222 957505729 +1148011131 855615410 +1700452874 2550480315 +1100548297 482788389 +3851058585 2797894735 +3532041361 4211189850 1838935165 158681300 +1072934101 1308188026 +914773390 3824292347 +2095732847 334050993 203496799 +1466316682 535391789 +1766491559 1733322230 +1697837158 3039850647 +370225025 1041090582 +974949816 854792379 +2600172687 2296714520 +3985484853 721819516 +3315357534 3285439744 +1773564924 1714984369 +1712285273 3639798927 +2988774124 2637553660 +4131169522 69781460 +1237988500 3176187120 +1335349779 2022194304 2287574253 +3251267003 2163530879 3432916324 +4228928862 733373183 733373161 +614416094 2226124671 +718175894 959539477 +3658420601 3199762814 +995304999 2330267488 +748702541 2973469874 +1425547015 1536952339 3650679078 3382237206 1425547031 +1031436225 2294973654 +4239170442 1303960109 +1394768458 692486779 +1094762378 1122862651 +1873499751 834208800 +164414479 1953993095 +1678245668 2627118527 +660362030 609677679 +749343642 3921468267 3921468285 +2977066548 3789289096 2334358489 +681338204 1244893133 +2055780377 2466345193 +1441586392 467642395 +3794339857 3922619830 +309878971 309878955 +2093509933 3950637215 1358418747 2911746355 2625887684 1050034136 +2292226677 560272410 +3082126312 3082126328 +2766696520 4082612028 +2261799924 770976015 +3581826676 2817308873 +1413793753 1971950093 +3855607713 250265542 +524918133 3051544362 615625299 +3125611096 2672248987 +3836711592 903489040 +1091844389 1091844405 +1531267142 68214641 1835534470 1531267158 +2629716032 4287347923 +2209142976 1292939324 +1231458183 528821380 +2745659531 731261652 +3847755730 3685580677 +2069743149 2911491873 +1873065140 1873065124 +1142347600 2146759395 +627698992 364929667 +600214178 1673273710 +2130671228 1953748776 +2781097239 181599024 +4138658798 201855354 +3934161979 1513203432 +2623471454 2274099433 +1411941219 2332102660 +2020780025 2508090600 +546872066 1379664931 +1201077605 397469164 +908240570 4069291741 +2573931226 1569631531 +2456059519 4080214504 +3227893343 1059762078 1059762056 +3123684316 4110349127 +1409918286 2570009049 +3138343349 288911610 1982218515 +500236804 2942686453 +737500880 54804835 +1233645657 184419134 +2097905157 3726074330 +1722215725 3318177234 +1385987320 1370328587 +711000823 711000807 +1164364661 1148981087 +2299323940 3813558975 +1759427114 3580254866 742322526 +4039589507 2359781418 2359781436 2810779248 1991291325 +3926747650 1964892469 +1755709333 1381062556 +425415897 3482794942 +2508134605 605293220 +4121263888 3280406051 +1546594654 2084445951 +2126611936 1789247397 +2913360835 534934506 +302285191 3826771862 +3978382419 3854097898 +4115452324 3421373737 +463453230 2859809903 +3527892850 2019246191 +685393129 685393145 +1240233919 224116165 +1296146632 3977923043 +2605076509 2360352162 +1074653940 3387481615 +3510194209 2117673952 +673878349 2281880612 +4036387601 3451777990 +800465305 1508423272 +2244628788 3514684623 +614193542 660041185 +4223305252 2226530319 +2712500789 3105317244 +1607285986 2987841493 878399102 +3582498130 3555501513 +701607283 1139868173 269403473 2207184630 +1297698909 546931316 +332704588 695378972 +926219447 3415704725 60347682 +2821613683 3355722603 +2787896040 2132986667 +1916140787 166382733 +1691436343 1891137104 +2824703890 277816606 +819891621 660841356 +71495772 2691370956 +1553894101 2727644508 +4171340116 3829385456 +296084519 4012255584 +3727684382 3816536127 +1412522106 3165820398 +3616034392 233708019 +2983381190 891135930 +3090514043 1394758952 +154708112 338778787 +2850554698 3366995007 2648333538 456506545 746286910 1028559446 +1556920354 944102787 +307571827 2388128054 +211248146 462759230 3830614099 +178634380 2632047264 +112124372 1308730153 +3857911985 1513304347 +2614176714 340258555 +1766977947 1728009988 +946996363 1910057636 +3147261496 538094458 +4219953690 2053549 1283169250 4219953674 +4020984449 3496712026 +302861525 4222708201 +2940089775 2381218414 +2085973688 1920814011 +249155662 2934106841 +1880206114 1880206130 +3522204949 2461708316 +3226186608 657160515 +169444176 908703477 +3038921445 166678124 +2025706205 1796392661 +3746090429 1016848532 +1293298810 3555197981 +1160392114 2902323179 +2559793369 830315204 150265246 +424622151 515217344 +1885906001 1373376228 +3328340154 2914999711 1142179726 389846572 408500831 23792633 2702262232 3167788759 3473503259 4177689120 3446542048 3203052786 856873355 523715741 1984719182 3062470644 23225607 +3253763055 1016273198 +2465202790 716983078 +2476163322 3897133014 +1993334386 2067475827 +943804009 3344531706 +1840318853 674251197 850525274 1840318869 +383203911 4056647768 2043154773 2830184156 2577201689 416772727 1904153228 1386418657 609837085 1176278857 2763168793 3940139377 3297826850 1351129344 1648174654 1039631902 1134080753 672824358 4018276799 3137906946 3475858474 1814450393 1278394116 3437103635 766551853 4213297102 3340898145 1128360020 2809858365 1179119369 912591824 191872543 554626131 2528341980 1390762154 2444632533 134484206 4197872663 674156309 3180811832 +3450433539 1860592624 +3666080990 3666080974 +2213962589 434006900 +3414117609 1420794457 +3394855855 968354926 +1927536275 1236163863 1927536259 +3653234682 1517985145 4216984236 950368046 1517985134 317199391 +3149160222 545999131 +947733526 53620391 +2618439239 4155208150 +2132901808 4203549895 +2701634144 733367896 +160904687 2158398609 +573004026 3186692491 +2152174767 2679050104 +3442600813 1922407556 +3792444272 1225732419 +2636121026 459663989 +2155713152 2155713168 +1423055181 1423055197 +1338040994 782550275 +2610309075 3227562284 70707287 743570477 +360378196 2125600853 +818304780 3560638440 +203324125 4043008482 +3495635166 3716240767 +1979427524 2133709449 +2558791732 2826385892 +3577813178 1870261469 +2998080113 3236300774 +2504183465 2703971335 +3092946361 1255627807 +2121235834 293246531 3338308458 +1103870995 2797146604 +2758580034 673413451 +1200593914 2702346891 +3310679358 3804106889 +3842275400 2233863996 3048713589 2341639327 3104328688 3456719179 4068810948 3048713571 +3748564877 3748564893 +1581615713 408466596 1345980109 +499228066 2043356675 +1794671411 3923387063 +2849665331 1701721230 +1507359385 147390152 +3310531776 1630702163 1200597659 3627251832 +3201919871 4014225662 +3007952775 1202789018 3289115008 +3589315409 351770514 3120066073 449085584 +1610532910 1276452975 +1975248607 902590750 +2936233445 2936233461 +2533818354 817645979 +4188039910 2495393277 1870169882 +2211588653 569293166 1619992987 916895378 2966971588 +3308502672 1831457021 +4240671328 3792673753 1911558777 +762654218 2574743981 +3450490955 2977780866 +2356862663 3966546752 +3997955928 3997955912 +2258943234 4149578293 +3863411527 3367866582 +3316251515 3861712274 +1638801415 3871582553 +3832603637 3028212179 +1797420346 3558511856 +3453459863 823590083 +3930071316 3606319737 +568080863 1604713099 +1299430912 4248056611 +1879780420 2778115849 +115697914 3575923101 +3105190685 2042902196 1373765890 2934263787 2042902178 +272775328 943662067 +4097053690 1003835586 1744532107 +2027182196 2804386505 +734333869 2486264132 +2157519827 2373224278 1811321139 +2129176481 1897264029 +1772834032 1219108291 1269931656 +2798419207 2598949398 +2464920764 2464920748 +891230464 2683591443 +3781286760 2348962874 1065522581 +3940212187 3795149192 +2457921676 606824942 +4172725304 1836498251 +2755412475 2245778980 +394012360 4162579312 3472310243 +638721382 1417955201 +3597086213 2305651148 +1165758530 1994187193 +3510323091 4082216058 +46415067 904645828 +1233740266 2906989403 +4134850197 2397123740 +2721015778 849381589 +3204233144 1607808685 +711576882 4136502693 +4090736274 1748750291 +3436218643 2135410938 +3259308184 1648332339 +223642302 3121205535 2211442270 3121205513 +3288732829 3196796564 +3041964716 436815041 3180805056 +596407903 596407887 +1742780760 3867199217 2239841707 +1237543248 418798012 +416590720 2529819283 +3960156853 261512129 545370445 340012051 1697384013 1697384026 1252053738 2901105642 +2239468572 4051505863 +3222293939 212488396 +722101224 2841331243 +1640150799 3812739636 +797621223 3194342582 +1535619134 3391149837 +3519571219 2089399435 +2653176889 2653176873 +626175582 1704683882 522747369 522747391 +502833674 946279867 +2197750007 2626133443 +4053839896 2012558797 +623022109 487908866 +1886797721 2737184200 +2482831212 1665537815 +1638572306 1256366010 3516632915 +1715700424 3432245504 +1349275817 1132657176 +1616743811 910542122 +561333712 690099125 2073880163 +2473307813 2473307829 +898925781 1742863302 +1231681251 1055159760 +1549566352 1607453675 +3181880939 4192926333 +3062048965 3888354044 +3648030783 2334554942 +3680888053 1449618876 +1997212365 3997461871 18349580 3574807466 3774162471 1223364470 1223364449 3558029844 +3187857995 4099826681 +3287361939 128217708 +737821633 4227377366 +460278528 808653061 +2068036629 547427594 +3647171709 3028535490 +4268576348 3792853703 +4207926742 1649280778 +3221862776 3343841261 +2914733768 3622742004 1172112605 +3927339517 2119528788 +2135803107 1248653660 +1006414214 4106149345 +486577616 2011944565 +4250362026 2117834447 +1595321677 4256354354 +2600245510 1517972090 +601312963 1689148622 2199416228 4161399681 2035969732 1408601198 765018957 114625894 2888679341 2256415992 2143118938 +939139937 2143662527 +3386833619 2634340900 +2232851710 1343453193 2157519817 +912228355 1160967152 689463869 2606138538 +1688153171 3113404076 +301297816 301297800 +532097948 3357795830 +2114544791 901608285 +845844337 1576186881 3468676838 +1248721820 198620974 423401764 +2393943893 2981127149 4112777930 +2826992494 2640380978 +3940162215 316479831 2549477267 +7459995 1311879172 +2141736130 4078955210 3086013795 +3543161728 187115540 +471849484 806494752 +3814151446 4168806833 +3438462014 3760909705 +2146816519 1996071168 +3457710823 1468627360 +243578085 3027972364 +3325775607 2202191966 +2146289342 3178442810 +3063525974 3388194161 +3857263651 286292764 +2179701244 237513365 3143149745 1211179542 2179164071 +542702009 401775518 +780661377 4132832222 3238183199 +1872069448 4032670301 3228774516 +1838233535 983220641 +2244892631 2244892615 +82192533 2970160885 147541237 1789630934 1461716313 3889729869 3809082188 2544946520 23309559 3020664371 3106207834 1495404286 3585952434 3232850027 881421045 2228701044 6545776 1765353134 3889654754 2100748081 42677979 1746744886 2925431935 1643562684 980665700 +3298369903 3960447406 +2331501500 3467377511 +3131455169 3530702951 +383203933 193360567 901167413 3244360289 1559881220 +2377294356 2931693583 +2239670478 2239670494 +1480127149 2393245266 +3748662243 3613725392 +4075332680 3422922119 3852811402 +3342454061 2740000268 3259874003 +1231287997 1163750292 +2766184130 1335487349 +2599383113 804111096 +3580353696 2231223661 +441273880 2142367685 +2809257973 190420365 2370014890 +2958845018 1986787871 213600279 4218550699 906429686 +1307874059 3271785044 1383698991 +1121222549 3323940396 +2011747101 2934609316 +2017799756 3993514103 +2246071316 3559152505 +3555444443 1999243972 +2600720944 923826563 +3320468090 165664285 2455629062 1876697185 +2946372245 181878940 +1531343424 1742167519 +1300132003 550495632 +2217660591 486864378 +278562862 2058056531 +4123728117 4123728101 +2926614854 1998333879 +1077605916 953249287 +1509938416 2646357461 +2883304967 13120725 +1379567445 3340962524 +4141337073 2259871344 +1849414996 3694187321 3655107240 +2787749454 4190482895 +2046212750 691419150 +3011200329 3737932147 +4075430011 3145200959 +3071419771 1279525438 +2196974974 3994567418 +1929137599 3257820094 +919035946 1708941842 3026554686 +2837885139 451435578 +3958873707 2340655125 +1370239630 30694714 +2838094934 2733798254 +3843527396 3284867901 1508948990 1566152395 1095716237 963429978 2634002432 2073566754 1550972864 2175765476 1709657337 3463077746 1018583369 886356869 +3904671743 1190432188 +3306496496 51854011 1478794812 3512585166 1060858737 1964426523 2607628356 2538810958 +3871875151 2617957454 +3351692687 1136820337 +2440043792 3019215723 +3558333501 512734228 +2780725426 2632226867 +1853977479 2093538710 +2384503139 543035082 +391277381 3883325821 3692584487 3883325820 4223589786 +2770232116 584461017 +1893358567 1893358583 +1426958266 1140612223 +2824878286 1737447010 +164477014 1155897557 +2633692957 1007878836 +44540081 2209826646 +1240544830 2763547529 +2271744309 2271744293 +1694433530 2246202763 +33899198 343077855 +1222795174 254963618 +2679236900 1885061903 +2250020390 2250020406 +2847731367 2847731383 +3976419014 3795950007 +3770759731 53386828 +2596815485 2596815469 +131902656 543421011 +956531074 1116004259 +658913381 2589240287 4168561985 +4146905372 1553631185 +3724430053 1548740218 +4207364667 45734642 +2576433544 3990796451 1202333963 +4260567266 2813340629 +104814343 2491324077 +3906919281 3038718838 +1330044648 3029395243 +3648560542 1641150910 4141883327 +3396251295 1262281800 +1602087019 3191136372 +3850024542 2653754857 2547632636 +1091224393 3107454184 +290096481 2572154784 +3660331987 1565334614 +1563166984 2053999651 +1964332228 345272457 +1908993668 2739894751 +3414904869 2437884474 +3629000117 939875306 +2663084700 2042123601 +2559042896 44381629 +25112098 2100666261 +98835183 890660398 +790375144 290949949 +2398824977 644036816 +436656833 3117047232 +1492412798 1249953950 +1849339418 2690650859 +1991317411 2076718474 +3264363374 3123940911 +1962350817 33303094 +654195910 674868129 +3714072412 3666066897 +2163187087 2285176849 2088481488 +2857547750 104300311 +1575598188 1391291175 1575598204 1122849303 +7573876 2594171849 +1763016759 3262091190 +1645232714 2845334139 +2976470948 3973379881 +3025955492 2440814655 +2366536759 1154321030 +2247385922 565723363 +4034751031 2330728886 2875849021 +1559274726 1142246530 +1550916855 1550916839 +2179701243 2162386482 +602451465 1383182446 +4275085455 4275085471 +3164724326 1489892481 +2770610019 3002956314 +2226664051 2977793014 +1423736132 3675861535 +1817211333 3753935850 +435239532 1119811585 +3409514199 3251788902 +2792316322 445683389 445683371 2739955221 1220211310 +2814134946 638569405 +1852325681 3191949760 +780830665 1669586 +1504209404 315172897 +437385727 156011624 +1882358193 1350707622 +1566523614 3673365878 +1848404404 1702355091 +3082281359 4094140876 +4158962217 1712393880 +1104297773 3405345746 +2323129557 3491887946 3491887964 +4212531217 1501385678 1350387126 1423211215 +2922566035 584976384 +368345625 1081820322 +962623430 417107127 +2389653033 2000656274 +3686729734 4089028961 +56466068 590799788 +1407084293 3931806506 +1144399066 1786313909 +386628027 34644338 34644324 1989001349 +1483710690 431637443 +2657987091 2063810613 2715033423 1294593794 4146435370 +4033391072 4033391088 +845544150 747233009 +197633292 2495811420 +3927164912 2688901903 +1333741570 660495139 +3560141232 3170629635 +175790917 175790933 +604837690 2141951322 +3589315404 365197495 +3365713035 3365713051 +196369944 2230329308 +1296250189 3989628964 +1036022612 1720537256 +2615765567 2943500606 +2654455982 3218139631 +1142121764 1317549993 +4266494597 2351457235 +3522585484 3522585500 +3304862837 3304862821 +3411562498 3802096614 +3346618000 2483242147 +856538873 1470341608 +465528045 528236149 +1393140657 1079545956 1764536240 +2719423475 492896154 +937816882 678205796 +3778158536 3701929137 +1561096559 1637448465 +1150022048 2286771955 +1774456696 4154743277 +286046147 2584037372 +2858597455 2288939096 +684487893 249293660 +860571007 2057882561 +889694622 420479935 +647069623 1291358260 +3875054021 1583786266 +1077689813 1379115549 584504954 +1107780155 2295686477 183258717 1927439545 748659428 +1122306527 764316190 +1141187477 2836857756 +3203303132 1836993607 +801984553 549149861 +2597248929 1420429920 +989317895 3782317060 +2088669843 2386607482 +2175262507 1368066904 +3073609242 2150150909 +2749359867 4192164204 +3440395621 899497466 +1459102240 144554099 +3003413635 1392732714 +859674031 3337143803 +274295826 3545359034 3469025363 +4228690783 3933130780 +868256727 2422976329 4182493524 1327244134 +1415512136 3584435184 +1964883791 3210668977 +1242197310 3429496991 +3392273299 3752790138 +255960411 1599557202 +3548604731 1507581757 +2743042382 2948107727 +3164307170 3402153411 4244814314 +3164260933 2511286752 3916155425 +82057573 403962348 +1861365210 2193294713 +2140930521 3147229342 +3151647127 1336832176 +1989191501 4072103474 +3380610419 2810745882 +4222672939 4006477140 3738035204 1480799741 1480799725 +2847125359 367741526 +3602150837 1605618963 +1121772818 1404869459 +4038110759 214170660 +3042976955 1096405604 +2541055109 4074362188 4074362202 +1156254317 1992129614 +331120181 1186639228 +1458444164 3806627951 +4033127025 3748378608 +678359757 3285270565 +796300063 3601439176 +4087103530 291035002 1833884390 +1556516563 3750942266 +2483296709 3346305292 +646118164 3023126639 +2112762937 2112762921 +3427590720 3101381659 +598785258 252945338 +1672173361 398082608 +3731355415 4124902605 +3969826157 3940823684 +1542333779 182763948 +2467580483 3421562730 +34586106 3992062658 +2855410319 2078265102 +1887154393 3954664862 2880762210 +497464805 2456835948 +2565079390 1508336489 +902197386 828582189 +3384466650 1797892925 +1117660886 3036095207 +1170019253 1359312561 145050108 +2125279760 1854416348 +2753968922 2184120829 +356774065 2069285638 3578431927 1140070230 +664479845 3191903980 +4150290326 46338353 +473215082 3347241683 +4057352422 870696394 +2334891358 1940437759 +3042360261 1839552739 +2105627853 2877673400 +3366034950 3698049911 +365747896 159554477 +2322484791 559746896 581247120 +2662122356 1039642511 +1123311065 1123311049 +4255819427 4137964170 +1008561095 1766894166 +3613291141 2393786202 +757475579 236094258 +2124338011 2936453188 +2764963963 179229992 +1540395253 2119446972 +3078594769 3078594753 +880097540 2559099231 +2965376147 4075371264 +1275474871 2946393123 2946393140 1953857001 1690528016 +3599527786 689136589 +572335621 3815257137 +2600274539 1884511138 +468384545 1819921476 +1857359136 2609491364 +1145476401 2887572528 +4058532786 3971865421 +3717163044 2301561212 +3327368882 3629180507 +1424120010 1783743995 2260075893 +1054908055 2459543462 +1170292516 4080428457 +472192352 2804255803 +1006390710 607016327 +2975565284 1025543640 +2114877743 2680734968 +2225464340 870584169 +2576864196 381238968 2382519689 +1168324911 3230716539 3472033016 +1714966124 1714966140 +1245386100 1618347895 4133292428 +79298881 1272320999 +3544722100 3460498244 +2560327150 710800050 +2655563889 3049797322 +3135971763 2723742649 2229670467 +3250976466 3701705861 +3190975250 2295888314 2069794131 +3983489708 1592591297 +986613095 3658859876 +2011531596 3895165793 +922249587 4228775948 +1426349282 3084793795 +4205237633 674174701 +3395565327 1752544090 +1386121194 4186961229 +840464967 2950559059 596147648 +655274364 4162938407 3449020199 2363884588 +3071025005 2501212292 +2971041989 2971042005 +1678021948 2939612529 +4147678121 3607354136 +256166822 2941032023 +167784349 1531638836 +1918884167 1407388352 +3120527838 2871842921 +3131033537 2324133078 +795054573 2260645892 +3401698734 3709257967 +2253387254 2253387238 +3716269663 306923400 +3071918645 1921825148 +2875551029 1443824858 +3032229465 751773660 1159992917 +1618408355 2240815645 +2928795763 4105298422 +1369631835 1369631819 +1899152681 1542217614 +1698424760 886120252 +2501525612 810540929 2394740736 +33096996 2131524968 +1978414552 2061026061 +864726032 1365612724 +115548483 1216911143 445471868 +4124654222 2465672601 +2600012449 1031281360 +3833024739 2329171274 +1024217815 1949722708 4050020454 264502345 +2844653110 544904967 +2022010829 2265907122 +437252817 2135651881 884454403 +176123987 3948657069 +3563189725 2148737474 +2951065648 378821525 +507379760 3415886723 +2156406845 2471974914 +469964229 3722134796 +1886129293 2266481124 +3270340989 2833585897 +3177303035 468982820 +2702774883 4252496348 +1742073595 1892103460 +1722098929 3213090059 +3941072024 1664263003 +3297507845 2485275159 1834653132 +1395452252 1975017900 +2876198837 2503637500 +1880253843 1197823219 +902144795 902144779 +1389011886 2809796143 +508438580 3909700047 +1656886633 3766989912 +1639557252 1531201503 +2787165737 1731384729 2787165753 +4258517972 1752594096 +2927452671 2927452655 +2904288245 2012508860 +3042876750 1315027150 3522273743 +3447373584 2285553187 +4219471838 3364643455 +1136595247 3941360671 13465349 +1193663137 2711038816 +2509769355 2256047996 +164249767 902554943 +3229314259 4011994868 +3231530213 478600314 1665996210 2616121819 478600315 4183227416 +2644643319 2644643303 +127411589 2038632524 +3174689255 3375052470 +688861195 2917704020 +850207684 2324647305 +4112319910 2192565313 +2434869810 303701453 +1646814129 915730352 +3483016723 3815167980 +945368648 328303340 3704426185 328303344 +3729898939 1684534398 +799030455 3990954639 +2767253909 675429744 +3694697602 3694697618 +2579220450 3835406536 +2566719308 4056577031 575831201 211392540 575831223 2265583429 +1703604732 3585798055 +3373707972 1388014217 +482614078 2260132489 +2561696077 636791169 +2483876227 2472554812 +4217481274 4105950027 +3614717239 1659880838 +1303189101 2568713866 1112501767 2551936244 1779053825 +2108469196 2732113463 +2594237993 2594238009 +3458607582 854909064 +222300546 1573844899 +2085653621 854235743 +276905078 2101189706 +3070291827 1969555702 +3171976431 2416002104 +3419535100 130708356 +567005265 2228809616 +2086567536 1465844783 +914492847 2109442670 +690371679 2737961679 +3933654325 1942185884 2849107859 1005544653 1005544666 1308953194 +1277534152 907250800 +3087759080 2718707517 +991119388 458916871 +2396718812 4235208522 +10065692 3292155335 +1663651038 4161012073 +1338044848 1522213576 +458069758 4179931593 +2830191719 4128982560 +54383223 345374946 +1996470873 1533271337 +3068482540 3607305345 +649495736 2840784315 +3479533234 2611394619 +2925110036 2155099315 +1817644410 118109963 +788157625 2903727912 +2943940403 567391926 +4048809340 1662966311 +2346352202 1928646253 +4123280512 1677186437 +3342506775 1908539830 3394206728 1075874452 256112483 3395858822 2214500397 2549425496 2933474119 1142984912 +2096697443 521456586 +3552749679 3396282033 +3227840541 4226153908 +4174648716 3314692550 +2739366998 2744677174 1601145703 +3553893900 2196458743 +4036722836 493268667 +2153084167 226966038 1754023769 +2634294152 3045322507 +2626685100 2193834688 1905099201 +89346325 89346309 1730710220 +147979423 2173742686 +2455279635 1953981932 +2879978080 694188332 2600609061 +1777345739 2416569236 +1082328012 841204192 1514076705 +1327563996 3751006609 +396319791 1336487276 +3631879053 1428997874 +2860210414 1311571641 +2640239638 3528750759 +2701736467 3147555990 +688030884 1123477327 688030900 +1144505972 1212207380 +231246799 1433430781 109049370 +1888713585 2838188774 +3273042250 1722580859 +172353560 3816266629 +2566173997 3980319673 +3746328973 3650210616 +2181458256 1558755 +992231508 3087017396 +712080048 2539862556 481079342 4064167368 2539862539 2158240533 1099622639 +804212597 3669621740 804212581 +2334233269 549331430 2564504219 449442128 531850000 421244132 2746172199 3568632019 3314910990 724615168 3122985846 1870734848 2676205787 1876479490 191598292 2302736433 3069880338 3941616474 776604469 1490137260 1991537812 3799709514 1337605512 465853917 810148535 3541988595 2668618644 358636984 4146165570 2740062114 4220958529 1822551771 296628927 4125205479 694134248 4089553138 +2299415477 1988177386 1988177404 1935360273 +1525198410 1716149869 3530784326 2182265765 3501550445 623742282 +3552199717 2636746058 +1041279171 2000268028 +88245408 2701460100 +3777638360 3777638344 +2129650416 2165892526 +3455094465 2227308647 4071668160 +3500014838 1588934481 +450168450 3699219083 +3990106960 1100687534 +4042522795 4212985122 2193344728 2866833463 3852760323 2866833451 1067915477 2450909523 +565842856 3219976573 +335699474 3136365741 +1189770572 4011239095 +1568147976 570021897 3558077731 +803631511 4274311334 +3810244649 2913134734 +847383560 4263692084 2327376029 +3380160278 3517024778 +3525443169 746812064 +208761162 3767883629 +2728446481 3082574039 +1082777006 1191704815 +680522021 4288191788 +3239411622 2597843521 +3782517960 233762275 +1095312073 3856563749 +395279289 2067918216 2429086987 +4137258534 1505412545 +250214844 911483623 936523236 2078995151 +117690714 1694666923 +825166981 4276744640 +3051852289 1552603008 +212465362 3247410323 +477698010 2896202795 +1358457990 1012165250 +3636156418 634128413 +1398230465 4084164310 +4284123201 1015316054 +626417318 3755210215 +2637801041 3535851920 3535851910 +2205519553 3082914790 +4203143052 2347918263 4019377760 3417354972 +780280183 2916789840 +1679355600 1665134947 +2004296707 2536831194 +3558618511 2003324942 +21447441 21447425 +674961248 3037056051 +4158644228 963487305 +3781761590 242500369 +4628019 2512467360 2720729676 +271221303 3896111875 +2803825088 3586337093 +610115857 1565211844 +1919064910 1597668313 +2038734546 2025406071 +1774745231 4026817799 +3932949071 365144422 +1917794595 1258234375 1787101219 +3555384601 1273273833 +366065988 2636555785 +2566719326 346719874 +3453865616 2754358453 713713464 +499186405 3150640762 +462870475 139150575 964015252 +4144356968 2595049851 +2067258705 2067258689 +428891463 2285375570 +2356453899 647698260 +3057524281 482972606 +3998574016 3221503327 3288613772 4033817925 +772005754 772005738 +3147261865 4166528792 +1545808955 2773388293 2771293680 1180606692 2868332264 +2916802649 1871931952 3824247988 2298578767 +699670208 1720477779 +1485650693 3474427690 +463328838 3212333089 +3310379033 303912911 +3665583415 684113296 684113286 +1784323698 2981748146 +2293654903 1769635846 +1311049597 2169162196 +3530127684 2148132383 +3968858705 5018445 +1678496824 728387549 +2350975289 3278108425 3506537662 +1082335781 2975374154 +717214745 1694163806 +2468552072 675773725 +1958745588 3458679903 +846008230 128950871 +2964264547 2258648522 +3596469587 2082832832 +291892890 4252408957 +3392779597 2782423090 +1006106533 207280300 +3356892811 2245137620 +2320901899 3832371761 3272035467 3500111444 3204924975 +2859039218 626052838 +395781566 3773852169 +85564104 3478038731 +1383426269 4250816308 +1503332905 1874819973 +354465684 3201881070 +3269424332 3915969125 3984590550 +1782546398 3484894718 +1087847850 3151658005 +4242002682 1157929407 +2969874628 1851933833 +3471021283 3886734639 +880220062 462325628 +2905611358 1903069694 670856831 +4172885895 2829634692 +2908485132 4002393884 1356441921 3820734578 1339664288 4089730295 +1907860820 1478050607 +879048484 2673200553 +3184591240 2760141413 +3242621767 3954451737 +2592393687 369737072 +3538164264 3538164280 +1821112507 2606272114 +819573410 3594813555 +3284822235 312676562 +3443322093 3782129104 +4223249923 1213001386 4223249939 +3329726985 2001173560 +3399937783 4224331472 +333721856 1345921811 +1454500629 2400522780 +2642615088 782355272 +1407181736 2977128829 +3653694036 2076010431 +3305061108 430928223 +1086340089 731303097 +23148005 23148021 +1239721210 2824522179 +1241483069 3124880660 +4212241449 3950015374 +2402189488 80807880 +2038943490 1657469253 2038943506 +443712112 3867033351 +3793472637 346224757 2760387012 3327770527 4052557884 +1174896841 114277486 +1008615062 3630641014 966559271 +4257122841 2347984200 +1191927986 3974123029 +1757418896 1986130339 +3772261279 366893643 +1306409632 257515321 +3803534103 4201762096 +3884151624 3152968267 +1974971304 4163058027 +1716812663 2382257222 +508867533 2354514866 +628273362 2195804338 +557637413 2010335020 +3022892749 1923374130 +3419255185 1708033872 +2033888922 2033888906 +953696576 1665877215 +2447420030 2447420014 +3840761189 3081201821 +2938972145 566196599 3038109798 +1669775057 1774013719 +3619940498 3619940482 +1015938861 2156442578 +4102862759 2693077993 +2760210947 1689431911 +1227505312 3447756275 +3940693838 270340047 +2750223066 3052182197 +779714390 2135127143 +3658875907 1559690556 +2336976055 4273742854 +757999090 3228688785 +962748500 2699658664 2849875001 +1433614493 1433614477 +2293969097 2224607534 +122795282 2999845570 +3493381809 1281088854 +1980399600 3263653589 270983516 +930024047 2999807150 +2223217021 405446603 2654489838 +9884538 1735321879 +3125272533 1508639137 80760518 +1033044681 3077399150 +3388699884 3641464146 2629003287 +1832224945 2621845168 +2875816291 3165036389 2913107994 769780083 +2645982445 548731443 +2488267549 2530981538 +3376451437 1034012804 +101678395 3592641067 2642313192 +4200449140 2510045849 +4065224545 4065224561 +1722501194 3919760493 +3429884163 3609147324 +4134602056 1005277259 +552467894 2359715217 +2588422031 1113825228 +1216371609 1076339127 +1958427112 53696515 +1333620183 3469206857 561544020 4185123184 +579883064 3906707155 +2263212886 1917665847 647969926 1917665825 3131645930 1917665846 2984566887 300547506 +1492657497 1738722056 +3508264085 3285991068 +3426230560 2623284595 +421000886 2899506327 +3054078744 3054078728 +1683085050 3872746397 +1147085660 4257524177 +4218099991 3768090406 +832590650 1499661405 1916051606 +1681731778 2387853667 +1250091010 4214037133 +2314204250 1208286199 1505672337 3544348958 3763798932 +2683589138 3751621203 +1451533189 3952716441 +2326134865 2488434566 +1153417840 1153417824 +3592637805 3289051566 +3657333669 546787530 +1720138203 2009013640 +3996282349 3865250834 +226177534 1515623689 +1658954593 3324658065 171192758 3324658054 +3127669320 3196139363 +4239907770 3130292626 +4191902648 206660269 +1781562494 1415788258 +2016775995 3081757160 2884275461 +2999078948 2346985663 +3671788318 3671788302 +3725066935 1033651718 +2074767316 2169375408 +1375496204 3023678467 3910888618 2062478262 646839793 378794561 3498056794 +139675704 1043841355 3838790652 +537790356 4195734751 537790340 +1104737976 2852186451 +787174722 787174738 +3234489363 3740780286 +1384970928 1455611714 631945757 4009584879 1757608884 3972842952 631945756 669790254 631945739 2750325525 +717240301 3159874117 +845556587 3252050292 2255742377 3252050274 +430269950 3698190622 +2901588683 219942292 +107337269 304386707 1196438890 +2275176892 927402727 +1460113204 381710697 +3909261326 396562830 3709165071 1333676565 281573738 281573757 1284329433 113797538 1534374536 1267551811 3449230687 782941594 +2843327593 866359634 +1321863059 2090806784 +1350224071 2627282898 +1491600239 1681745838 +2473569357 1921275314 +675682457 675682441 +942345143 583233798 +2010264513 1650669809 +3151721350 1081531361 +4106433572 1934300329 +2884404808 3981927243 +2718734994 1459156269 +3702764937 4159096504 +2191849316 229732991 +2099129983 3042524730 +218656541 2437337444 218656525 +2903018005 930651309 2037473034 +2282310604 495408353 +4194257852 1222916327 +1341036285 3247937284 1341036269 +3885718538 3885718554 +2019210518 4278954534 +2512415434 3982756901 +3776533288 2195580907 +463247105 2021766806 +2014244447 1585528734 +3117276434 2433942341 20666446 +2313829716 2130143788 +309129260 1031679591 309129276 +3714256639 2180029310 +2368149813 1770827388 +3140115010 3853260277 +2106713385 1236894591 +197131776 197131792 +2071379630 463961717 +2206440303 1999482808 +682381774 4037556935 +1633935139 1454218483 +3055617332 3925553359 +3254529539 297604678 +1483217093 4041145868 +275107155 591542700 +3279770321 3619182804 +3796462958 4129309466 +1926011920 3357125929 +193221121 1309915448 +2317511525 2317511541 +3796802318 1337857807 +2407960940 660019351 +2029583536 536201475 +1922365076 2346664889 +1674438951 1985432485 +2624322193 3472585286 +2711945445 1539336300 +4124881256 2872055999 +2329748213 2401109930 4131786893 +4205872753 3395033900 351585937 350462959 +3652969081 2515505758 +2850559961 3024172734 +2658836195 2195776757 +1887727948 1810410337 +3040590162 2667887621 +2038200909 2348058404 +374248776 1813876812 +4035108186 2944156486 +3583925989 760177260 +2945284420 1296931371 +3297134528 526578515 +1911566675 2954732986 +3779074531 4026071573 +1615181739 952115764 +3944589249 2308820209 1983342004 3769570518 +1365897772 1261782871 1439185751 1261782848 +4227247190 4216408935 +3692825476 1355496644 +4232376436 1757799135 +130531554 829734117 130531570 +3074370013 1433331426 +445911750 445911766 +415238064 3737980683 +796209463 3967580550 +271703674 271703658 +2496259638 267463093 +3537448698 3936096543 +874280498 986583205 +3231530221 2455824197 612821266 612821252 +2208185618 2284166061 +2731179681 2880236211 +2928842100 2928842084 +365802107 3452958628 +4111105283 3263351740 +541412672 219716563 +1853406166 3188699633 +425152519 2785091844 +388264912 2915348088 +2209941134 3930411417 +335453918 4139989839 +3414007184 3871279541 +2804072493 1219790546 1244676846 +1352929987 1522703972 +245639988 1693750612 1230273416 1230273439 1081082585 +2551614452 1675205673 +80118521 130082437 +4033586866 2751214745 +345963574 986920449 +178615875 91827068 +1426846269 2362537993 +1268187582 3166158358 +32793227 2923998639 2662801620 +4106739427 967040860 +2952860271 2627161787 +941130682 144137693 1363715733 1363715714 144137675 +996469242 1624839893 +1562262266 2425804701 +2410844497 2410844481 1998235968 +340802545 395281823 3232697284 +1689350319 3067649080 +4043487248 332548367 2169660579 2337436796 2169660596 3469565735 4209096336 315770729 +3131196032 1782468187 +2877138368 3066817861 +3198359026 3198359010 +2502130768 383562229 +1354125031 3744361188 +3096278774 2476936897 +1116541790 2798896489 +721044019 4137119366 +1891169279 488739242 +2253290981 1385181050 +1371584582 1371584598 +2185234347 2680695129 1681958862 +1642569428 4087285679 +3763419740 2078203601 +320935201 1798294644 2083514151 2451229820 +2791330167 1621114448 1816270836 +1813733925 1411088428 +3640425204 2306182671 +4123427073 894938624 +1498555528 1177146293 +3141869637 3141869653 +4059274593 1132511158 +2805317576 1728119011 +1933043524 2768310303 +3812198320 1670420995 +2084770583 3828443660 +4124897156 2446006812 +3110586827 2841815700 +603517130 1793265147 +4024477736 3096973379 +3127647198 1445977727 +2944352174 4008051723 +4119830542 2669213199 +1018806382 107605305 +1161352058 2900814365 +1736008417 2175458110 3306596415 +2776605755 3270478052 +1696120371 1492347482 +461258051 3749647143 2327474300 +3558820827 3359926738 +1057016594 1077914963 +248208953 2200261544 +3136117870 2980610351 +53760078 2018911183 1050304206 +1254965720 557771816 3861579674 +4083067476 122626882 +3100879410 1800445403 +3133266430 2488933218 +2038423863 2068810128 +4279462610 1569794181 +2336560355 3926901703 549445980 +3248425563 677203268 +370433578 3960486925 +3251497358 1482512501 2770774681 4192754102 +680821008 3728098280 +2028953976 822310528 +247398210 3649053003 +3328545471 283509416 +2181566542 1116181785 1390405882 801498382 714558782 +2888796784 2128014915 +980178558 4054022826 4255354270 4278977684 920016193 274341079 3785580906 1988896835 +895658718 3897752425 +623289243 382962962 +1200712530 4226544133 +4143840358 936662167 +2081849724 115879719 +2417140610 2942519403 +1489644670 609544591 +3558442149 2301349818 +3325511292 2231629095 +2639873378 3805091758 +3231477171 3913330906 +1432697472 3998947205 +3363667350 1300104801 +4256867270 852480183 +383047132 669949284 +1989784240 1989784224 +2094097980 3114528871 +1606128771 927648298 +2962096424 395039211 +465824243 2825472410 +187036841 2877024270 +1711787102 190022197 +3273531410 980188229 +1836939288 1836939272 +3624451018 3753877229 +2938101881 3086923084 +2587847410 3285539557 +569741367 2895251088 2895251078 +2928927081 1003214926 +845949096 138674283 +4182172532 3734507417 +1666475345 3381144801 2933620358 +558320681 563774445 +2281634128 637825016 +551612396 2920919191 +2086189351 3869997174 +2024625203 1453185952 +175582048 3650701363 +3062741620 3575415961 +1185040032 3514117605 +2133404604 899847404 53642087 2200924699 3922712817 +2591058195 1333823233 2506821825 2539840325 3767677527 2722297638 2739075260 3767677504 838166764 2809562177 +2937074541 2937074557 +2225141804 2225141820 +4209547979 3341528450 +186653950 2173543391 +2180352892 3458681127 +1937180437 1012654508 +794785039 2722449038 +1462998409 3476317880 +1642301710 18761085 +1089607842 732624930 +157671905 2503009297 2892141878 +1337445830 1890262384 +2424848534 1551856713 +2766433605 3633841036 +1102818145 3681470902 +3859283354 3096721771 +486841076 2208551263 +2340404087 286530640 +1448242740 398687183 +2585910599 3850361625 +798475111 1390975798 +1278474242 1132809358 +2357673540 221207300 +2355598344 252577931 +2384556251 2721426568 +3467289764 2378068656 +3833043059 3824918097 +1554909942 3690676551 +3012216333 2960508516 +4043487233 1198132015 3201300272 1749526934 3183532039 3981976604 1749526912 225173031 3201300262 2898312532 +2808604252 3834618567 +1016355368 2240408811 +1283285713 979537670 +1234172741 313036186 +478600315 4200142715 +2897099610 809987755 +3066919816 1299805981 +1476299292 2712889873 +3616721014 3524366801 +68827586 2352438341 2893266962 +2904288247 2046064070 +4186240576 206546643 +123188305 3759201158 +3206237829 1560058700 +1079348741 767941763 +245763698 2171125093 +2909441422 2361185945 +3616737392 2735602408 859037148 3430303829 +2526520359 3209339959 532345292 +1602126625 1688438598 +1127479983 2043912558 +1866595625 1306625944 +3778925766 1515582369 +325107890 860837939 +2983606899 2459880439 1732117260 +2041381557 2036639772 +1679086922 3909487175 +3030563175 3274300726 +1220576047 3054404334 +3965842939 422984242 +1629863975 912798399 459038244 +1360607294 3904080287 4053902686 +1175676993 2114732263 +3775331951 2902624440 318585275 +2514027980 1525463863 861836279 +2245568662 3811879338 +1029265603 1453767402 +2091218943 2826503082 +2025507384 1175213613 +1915110682 1909765877 +4230962119 3314383446 +3587227482 4053613227 4053613245 +699177806 493540346 +1172585986 139304227 +972848371 4025494634 +1347690603 1347690619 +1853519628 872191324 +734406058 2465024653 +4029867293 1025420468 +2386484994 1494510953 +3733537213 1008337058 84719819 +3310605811 761548330 +1215312539 2745149956 +3282899487 3240337057 +766205538 1178056486 +3842350939 1155901029 +3747756588 186374328 +2881362258 3628290315 +3105656359 3366570751 +899783868 577952880 694795249 +2550392599 1760081556 +2980649903 1547080824 +3604068796 1728102768 +1338500594 3837600145 +3046213969 4022595830 +1005777502 1613681230 +339471889 962659376 +3814172990 2434268766 553610377 +2443690670 4179064825 +791288875 1625443006 +4176452350 958375454 +2409565680 1975590731 +3502798063 3844145553 1140160336 2593133624 2295321659 2593133614 2295321644 +2384423125 315123571 +3722328716 639941875 +2866137433 1200355080 +269635948 3101043991 +2900210747 3158904574 +570662657 2360561280 +3142522233 2638236732 1909365877 +825603445 2339055372 +2240714184 2607597283 +2780771325 187489506 +3978851149 3978851165 +4138641241 2918281502 +483675493 2411713089 +3954346089 1796080089 +1212666307 1945236836 +1102289367 1153117552 +498533983 639567774 +1814035314 776857702 +562106533 3660082634 +487869833 769822558 +385957601 377635075 +1190519361 4128451648 +3135401629 3050317954 +2337828647 4018939187 2201418336 +1177265354 1085565421 +968198617 2982674568 +1332245161 2859237390 +3923973822 4001156383 +489635847 489635863 +3820760195 70914602 +1923142001 3827938544 +3407771806 1719154232 3611663991 642000013 +747388286 2663697737 3543646690 +2739576446 2132743561 +2052967836 2829954691 +923397332 2023739833 +2509365875 3886512908 +2614577803 3202995640 +4089767690 321281670 +2527867195 1813086189 +1475224024 1138706203 +905016427 1444562018 +1274109332 553013241 +2541016490 2970788357 +51454365 51454349 +719503010 619845909 +3498882186 3615503661 +3007014212 1786800649 +496801644 496801660 +2210005061 2210005077 +1732845623 1732845607 +1645826814 2901155358 1809688031 +3380132406 1594696465 +2324145604 2931441905 +1064674565 3945973452 +2341512863 1404456030 +3706300099 4294782964 +461039421 2179672939 +1193064810 1547166157 +1309967518 1339668670 +2246811687 4176289142 4176289120 +1436319358 385306167 2859327436 2435996621 3053714438 385306144 +891926274 1716977418 2997557283 +1654640595 2235350371 1118953089 2369571316 +1376946212 1462522047 +3029503362 3300180917 +4053040197 2445254810 +773087361 185854742 +3734858773 2261853468 +2905159787 48484468 +379819188 1468208975 +1580294652 1136476081 +3847446282 205429933 +2140021716 4016542215 +3608517386 852711026 +2066023470 2197097115 +554564136 3974169898 +2573902777 1004518440 +3733892137 3085052824 +641398913 2949985024 +3087190332 3834513192 1149443303 +3156232466 953354053 +3361975272 1558683197 +4191844750 3773651599 +997253441 3551697238 +3694489442 818110077 +3560537184 3220686709 2888094402 +3413179648 1121863443 +3506909334 1161143953 +3510194232 2503559227 +1866439061 3055469980 +834656787 1589871744 +2026794314 3545199430 3226735282 3226735269 1995836283 +514371041 3201209933 +944455412 2457082393 +3458250958 879509529 1266871385 +183156175 1399525629 2304407578 +2893353146 1081113493 +791540832 514592582 2396785462 +4263723751 4169290166 +3679729010 1793473306 3079676531 +1306657196 4260188617 785818304 1187553729 +2946221423 3778530734 +4054549020 277988260 +2653445854 3616364393 +4144293763 3948767088 +335445132 3699543840 +3405351748 3405351764 +3962541874 4153266001 +1457223654 2709372695 +1877623777 2083591686 +1968863305 107698926 151004345 +1013275757 2156953490 +3628213609 3642811480 +2364186331 2958561988 +1209858556 2174584743 +2962361578 3756676187 +2823523537 3220090118 +1357364727 1406143440 +762821073 2396507271 +2539361782 992809543 +822906775 3452308144 +3073283904 3353732411 +860606169 22889896 2193861059 +2000082423 1482911843 2723337168 +3245704258 3456054243 +1902587351 4023925588 1550657904 +1150847600 1150847584 +3090548099 3436098928 +4246640720 208455442 +1727525709 4142177855 +2218655429 2790695896 1831216428 3413466519 4217459361 2924916850 2152256879 1638399406 1638399417 2908139244 +3106656380 4227412775 +538726209 3448816448 +1975804973 1453621381 +3503605558 4109736465 +2344781525 2914305914 +1471351246 3705171801 +1428117996 2542689107 +1476783755 1316056313 1882397102 +555456829 1534212866 +3581611396 4010872156 +374909576 3046405149 +2425414317 2425414333 +3788126357 2232561452 2097856121 731284659 2232561466 2232561453 106369674 +1916753204 229843151 +211658807 321900166 +203358023 1540086998 +1239020539 235295045 +1172583117 3543922875 +3600216571 472965823 519368969 2734603077 472965822 3399413284 +1174134620 2273353159 +855246168 784869605 2316853356 +3073757038 3618998831 +569741357 2727474884 +2650607392 3579760499 +3674988457 2091980568 +1299230082 434837898 +2804261537 2888987334 +3598715739 110223442 +1234029897 2090132703 +3276582160 2176086069 +1617981757 462393097 +121419575 3024267285 2057655202 +2227735684 2343908297 1065879492 +3561222047 3320985438 +3258416364 1857613308 +1893133013 582601580 +1643932833 1049578704 +399334032 3642959166 +828553738 3362446779 +3732444674 970204469 +298514093 2686950766 +2262539273 1421255214 +2086839345 4749606 +2648179863 1858981102 +61102183 61102199 +1543829725 36705855 +43876843 150177012 +1838575517 550614050 3491665886 +2042784012 2488402277 4264727066 837078899 781966790 +1383455297 1214046703 +930370837 4032439033 +396887210 3883882381 +862334203 3839414066 +897266669 3781573851 +2049982044 1027172103 +3575424037 2702599738 +57376677 121237676 +3148888194 2956532893 +2604445342 4270252713 +2330655792 3756720021 +2890553354 1124636603 +1619668737 4203216512 +3284321795 3284321811 +3686563953 1522414054 +2422534896 1055551445 +3568734820 1063809919 980266575 2678022244 +415173476 496062297 +1766479271 2868870042 +3357862354 2043370694 +595285016 4079313357 +4231154591 2720861000 +1395226324 3192262575 +3025266996 2099469161 +1306140043 171350841 +1279377789 836069803 +887338678 887338662 +2547841344 1356619717 +2289574328 2367493307 +3286001447 4057783603 +14145366 2848455783 +3769097022 3778668909 +430625457 417967280 +194114982 3183504730 3795510502 3703944279 3795510513 +39610665 3981881486 +3404707272 2508382359 +1793950935 1460228008 2008427041 73034752 1384309814 1662492035 2180089362 3504368578 +836377478 2208247249 +716460275 752578188 +309473471 3804066039 +3391485397 247594588 +2755957255 2666651926 +3789348684 3789348700 +900426500 2161735497 +2157116217 2690742952 +1973461371 1405935167 +2963329863 1412208832 +2068081504 1174131259 +2291551942 851869399 3399352758 3399352737 +2729215217 110446448 +1608624325 3943035587 +2314226293 1551720787 83117082 +1298552300 3979182332 +1606415802 1966068683 +3858890148 3106031935 +2270208954 3314399359 +1173670192 3482317659 +3689303030 562664529 +3092529572 1493365998 229085881 +1417167848 3780306493 +1243024317 668264139 2139478709 +1932335255 2304905 +2317457046 638968517 +2265989926 3486530007 723688660 3050612311 2148805920 +3711018074 1228177118 2401614269 +932397759 2772402492 +3723536379 1557688370 +621115550 1027427103 +4284321828 608823487 +2325509737 2639161166 +3793537974 2840899473 +3813140644 2745470617 890010312 2745470607 2164417828 1848851007 +2954558036 811632408 2147790761 +592351072 1330419244 4104893477 +1007757218 72533861 674263229 +1689248302 2933984879 +3947112149 3244691827 +2050728871 316841952 +392784507 1441963954 +2866780373 3539834716 +195138456 3881523277 +2019292211 2881580122 +3869329445 467063454 +2630091567 2974264443 4153475832 +339668573 3099218289 +3542041867 1356308323 +550384773 698133850 +275421303 1322124102 +1568220544 2780170387 +4117931308 2407138369 +92563090 92563074 +3762028417 2138257408 +2056851814 2881277594 +29361620 2504600761 +304966172 3112045073 +2731389095 4039972576 +1371962782 1501020073 +2379854066 1068600563 +1913280832 2473680552 +3382327039 1556386686 +1611012732 2778444071 +3341041816 181859877 +3745013304 2088066244 2646364717 +136502673 700049324 1090915652 +972684392 972684408 +1087733173 1087733157 +1674321909 257314474 +1226771305 2229204568 +885401563 3908746120 +3716314773 221224237 1231072394 +2553272601 2891104840 +982265931 1974470146 +2381295667 2381295651 +1296141092 3257797055 +4083548063 3364972360 +4237977232 923759797 +3484382414 3207913561 +1690424756 1667950688 490545933 3606119692 1768616416 507323539 +3113228115 1892988844 +3850177819 69209509 3619635912 +3371416741 4068550996 +3493635742 377727657 +910003836 387875879 +2718758659 493410748 +3364618329 224693256 +477656412 765509585 +3494273474 2697716853 +1060241499 3602288466 3602288453 2958664486 +3716744200 4066818873 +2590988862 1445566281 +1915858430 2477156413 +129114674 1332466853 +1384689221 2460374122 +1690661331 1976708908 +1456143945 3935194350 +59364104 2583115147 +3016640087 1689828070 +4289374680 1370054427 +611262703 3313537932 +2442551214 3719864057 +777206424 2231713115 +2215524651 1893148245 +3478454350 2966387417 +3106400042 2748376845 +1845372606 2832939616 +439773182 665210784 +611253930 347799261 611253946 +2806828300 800966492 +845975527 1206290614 +49847334 3546140631 +1775545741 650982628 +3319491565 1874289499 1701504516 3259514008 1701504530 +1471715828 1471715812 +4276516155 2143980530 +1999964336 1484565763 +304220038 115560632 252235481 3249888484 1180359758 3565239016 294770679 294770657 474170249 +3556643907 4227458428 +4152499501 4152499517 +2173281316 263021759 +3244726915 4152704060 +2909582761 1954222361 2871130382 +2557664106 1724868571 +3664649255 39211382 +3184241381 918827530 +963599786 2510580229 1090505520 +156282931 3708117082 +2918887606 2544119441 +457564257 2790868614 +2847555875 2893567645 +3843600326 1809626295 +3619997957 2949149388 +1224530041 1594410622 +2292615252 1915264047 +4010704607 852605214 +3983346098 1957053242 +345769707 2813702425 +3558317380 623677952 +1160433035 1160433051 +3164207706 1080368061 +2040143206 3550234519 +3569908524 1725697359 1470228007 4253085218 597288513 +2554824397 1718953083 +1465865296 3675372003 +889054234 201035075 +1531680894 1587155384 +1883250519 200365542 +4245332519 1878473544 +1925263391 3550439683 +329783533 2460825145 +2739974424 805750989 +1300293000 2313770269 928054452 +2747737107 3850226156 +1846364156 1824037296 +3361109801 2300417432 +321985259 1624116494 +3248315473 465064848 +3505120978 3505120962 +1690334883 1039843978 +538383818 4060848344 +4073264845 4287554738 +4069287386 1163063413 +1623371732 3928939513 +2835273128 2972342123 +2642714819 1481961325 +250450719 315364828 2623527492 +2465041055 3941677128 +1754412915 2996175467 +4282134597 281017498 +2849687619 2791915882 +318986097 1195202280 +3566477249 3566477265 +2285389585 2174214086 +2188175291 208718706 +2899967519 975899358 +3954300696 1979613920 +1025018776 1841805604 3315843149 +3001642966 1441843562 +668052053 68101066 +971722401 1799225030 513924871 +3314057370 2413982315 +3826803715 1789949927 +2872057049 1438476680 +4238263632 3991962579 4238263616 +2418951377 3261585526 +2412900118 876059186 +1367396679 4179600452 +1806345043 3500088236 +1677653206 1079733479 +3252381104 3697349653 +3357005569 4270290560 +2349843777 3184756032 +2757607958 2861448178 +1405444831 2931461070 1405444815 +567558532 525320824 +2791097913 487328680 +3428091210 432269989 4077769581 +193033579 971254680 +1071659340 3657052855 +2529947404 77923206 +3698948368 2075323368 +3457423429 2136524833 +2082260213 1447693756 +3981929394 2342809149 +2334341336 1631144037 +599131614 361446505 +1256354046 3765952457 +3012315728 4124638197 +596499723 55769172 +1769929677 1769929693 +2551378792 3453299892 +1693285246 3570872112 2808872040 1583628395 +2057411723 2540269250 +66434094 1774888057 +1038796403 1038796387 +2448143147 3775597730 +564942450 1951143269 +1318238598 922357239 +4283866882 2303862539 +3612015211 1443378786 +2069849094 1026192737 +2144600971 599504568 +1723876681 162337262 +1121404166 1054976097 +1385753787 3250367076 +3007692394 79533990 +2850307662 795963090 +844976594 451399059 +241020349 1517846658 +1259941585 161788688 1173626135 +3167170093 1594710661 +2827497908 40255055 +3811313745 3591203210 +239382630 537460145 +2858452915 3908411098 +3991164065 1539875079 +3650540399 4151236536 +681317006 2075211161 +2230277887 2230277871 +1273514495 2108456040 +1000453288 2274321533 +248021805 1923514322 +557421389 2691306674 +4145667701 4145667685 1656297708 +2913682506 1532903858 2929492091 +372964098 372964114 +3316283758 3316283774 +2549152970 484699699 +3070046335 2408798206 +1744514890 2098350406 2988680357 +1299193365 2256294074 +1929293875 630001741 2144638880 971989082 +1191649043 423534358 +1512266825 782911224 +3515974260 1544576153 +3811862623 176180638 +3605699477 1216925830 +2967230841 3823163752 +1835551489 1009652352 +2773763066 1034355357 4289447596 4123158742 2114482307 355471781 2565406933 +3062324309 3062324293 +96995676 1978055623 +1123698480 2684227733 1911822987 +3994807803 3505889828 +1221732615 1557012996 478121055 +1947359483 3017937714 +3778589777 2807685357 +1519957881 392745832 +3951741727 3934110152 +287157725 3468210932 +1880478734 2153566735 +3423905759 4046919819 595870728 +3671581233 578734647 3000570672 2981700822 +3912864532 2023465582 +4025962650 2206422948 +2882183788 1432098771 +1808227079 4046693394 +1728159100 1728159084 +2241252725 2123408938 +2418854916 3142394436 2829160687 +750066835 2779668069 +1693589283 1030453264 +803917360 2661455235 +1623479424 3574662533 3843104419 1623479440 +322169236 3468211193 +2969081734 2969081750 +1543249149 1543249133 +2414485603 4036033482 +1064570605 3501424402 +657969900 2833320343 +2334153318 3883924873 +3756873109 396212618 +1144201345 3715902230 +880417590 4135120151 +1656319791 2565474040 +980763273 2409086392 +2456444674 3939388310 +2738132774 298447063 1481131106 +1146784589 657257979 3884534322 2938096818 +2601151119 1575867498 +2723117106 3038394021 +3437932220 1366364657 +2266657011 2711604890 +1896763151 143029390 +3035506886 2185414586 +2162992898 2162992914 +961340668 806123697 +370428607 2163321512 +1283514847 3807374170 +2130808842 4185243565 +3085767552 2609384872 +1726341239 1927306054 +2400750230 3242744673 +365317403 3780496805 +180279093 527222908 +2547034986 3693984117 +791140134 1639428289 +3452751937 1304586608 +1659704235 1983254386 +3486078588 3136510764 +3917719356 3594535793 +3462213834 2153291207 1540700614 1745699365 +4198251478 3000113313 4198251462 +1860846153 1933437893 +1927575209 1927575225 2259078168 +2855985444 514878399 +1064557093 1774457674 140535866 +2997544225 1678160630 +850400007 3510557273 +1213040508 441825284 +259569560 3828466995 +1291633704 1508428523 +3039020841 1347585415 +1531909746 973505563 +4245607472 2388133763 +3040850124 1569186848 1475917537 +798946712 1005028140 +606406258 1481188723 +1414980194 650534979 +2351066523 3264272200 +2545557441 2545557457 +2490349013 2161851996 +2372062841 2782812162 +876842594 2824414275 +1788891236 2547555416 +2814437928 1018207485 +2469957420 3993592407 +1743799451 977010692 +351157591 1242206182 +29681296 3250796779 +2760639232 141080837 +3440340507 3930739858 +49391850 1335355876 +686520448 3937317267 +1625373705 2341569080 +601732179 3372408506 +3726936431 3726936447 +3073422624 2175607141 +3176035406 1350637273 +1974496922 2119222710 +953500490 3250122098 +2448987168 3931188837 +2047017456 45878485 +1686625084 2111709031 +3159023360 1776094483 +2009364776 4227665113 +1405231053 2811760562 +3067808915 1375484694 +864902720 3311808524 +62493600 3753365055 +2306207657 229132046 +860833643 818769268 +3254309860 1052086249 +2599931388 4028187559 +3280594392 3686409088 +4208068449 966892960 +1295472438 114001131 2640461282 600552074 3266218241 3290319377 +2841421876 3504130521 +3424551952 1678370083 +254800213 2404808186 +1114545791 1489723090 +370069226 1904368965 +2055877624 2055877608 +2847744000 132031544 +1205053433 3977578095 +1677186796 1260868993 +2376354915 1554268106 +716480397 3224935141 +3671905367 3768730864 +3618296137 1482597817 3404166638 +329832747 500031138 +2535303580 2142371975 +251417348 3077276169 +4260177221 22129548 +3070976984 4277021979 +836000348 3444195025 +1447145570 3435585825 +719081936 3417746066 +2782172626 4241225854 3752319379 3752319365 +1620479737 100864510 +2019855060 1514572729 +1212130495 2066766014 +2347781506 3444179893 +2007775400 2331201143 +653060445 2750635380 +1725871886 3618751069 +1740930445 3880887524 +777166942 2517406765 +598354220 1356779592 +4064216588 1698071777 +1515184168 539011372 +4163622132 2701147151 +1970658759 2945196118 +113689307 2333625992 +2617052170 3682088326 +1779710584 1779710568 +2670302720 1250594253 +1899021540 331739903 +1983066978 3555855970 +71276142 505007919 +3627816220 2190818065 +3618455606 3149665553 +1686645439 3400959612 +2230917833 2230917849 +777337238 2250876711 +3400846220 2795269473 +4032023975 4209819104 +2146758495 3449082526 +2860226432 3392808632 +2305284435 2709200314 +1200492677 698614106 +1583682261 1583682245 +3035883414 2358476897 +582137077 678621850 +2549941684 4149213775 +2342674478 4271728751 +691683127 498172806 +3586118492 128039372 +2501086003 3770949978 +2307228110 1261131609 +38865949 3264614818 +3957563402 1632956333 +1305492609 4291772182 +246071648 1993239091 +2405658952 25908317 +831834093 4129745490 +2925675616 681825083 +1369105683 3906537366 +2442715731 2259437754 +974610957 2144295538 +3849816643 527542320 +2950219177 309174542 +681592059 4014774066 3267562565 4014774052 +3047422524 2348846239 +2143847599 3685277393 3618168686 4141337068 +2981279690 206095648 +4050870295 3097544760 1605934601 +1288598405 1845484122 2210708394 2210708413 +2683144704 3845235163 +626823279 4039086097 +2723117105 3021616432 +4273268425 3217510008 +220756503 1744117288 +2691450274 745643551 98292126 +3569441513 3579976920 +2804425944 2357513066 +3226036598 697369809 910853462 +468446980 4167648073 +3750008766 2123690658 +3859821221 3498031532 3859821237 +1887520356 2139213695 +3468124546 3970858933 +4168157330 2884664787 +2204736857 1875804860 +1222877008 240372469 +2490334923 2395302965 +973770097 3483150566 +555422887 3298919158 +494896337 588672624 +3048252082 779133128 1700761753 +1181748128 2187480293 +3985164991 2908170920 +2511743528 3551991082 +1969101653 4243988912 +2323268437 686165226 1400372931 +1920680413 4272639426 +856596348 3691319335 +3662939224 172152475 +2026453810 1455959987 +1687707679 898378460 +2487481408 2680534540 2801369285 +4114756694 1832412007 +2423644887 421689411 1083447408 +4062706489 3482401032 +2470830599 3724726550 +635146804 69450377 +2307556554 1326385645 +4188712810 3854381310 3719717205 4108783454 +654726078 482839866 +3235486961 3505274241 +3510796297 2657925071 +1772942096 249911659 +2865359857 2377704823 +2487261811 3568509722 +304328552 4130152637 +173449941 813983091 +3591297753 3572486902 1863657220 1822965097 2083859315 2577666246 2985319076 28334669 1479912283 4158579248 307076766 3874314575 4174540670 1901093610 4235982182 2730110373 775748488 551550432 3634013914 781673289 3574413391 2104252441 2141997349 2954665188 59238257 104437483 3213826038 1421198337 1425421976 4136683491 3027925640 84482906 3680540865 3629224848 4224566177 1412852598 467941520 1120574101 1608781830 1871629738 216404002 3764435768 2174339658 1985354 1210136558 17147072 1427999010 3549548996 623009579 2861391899 87423915 3676708387 1113944545 1382840831 2986960940 3809972883 101798824 4293117911 3974930732 1831475873 922801033 1574100594 3289764168 1388570882 +388853489 1837475184 +1860513319 3116869472 +2822020799 2813993160 +3403166355 1922428143 2361334564 392726439 1564878741 1581027355 1272813358 2427345455 2551272869 4216770602 3150946609 2327701862 213206323 939179924 +3973136502 1130920401 +3345305508 56755915 +385095297 2738842902 +978082554 3224582045 +1699069931 282634795 2866983118 +957631275 99767476 +416341896 2563760907 +2437278887 2437278903 +3884036365 2116663154 +604016154 3805315126 +844596856 971724999 +1974392480 3795574245 +2432498355 2443322935 4047415244 +2362479650 3075566062 +3824455232 435941075 +3283174942 772890921 +2726922124 1786798455 +3839054247 3752430048 3752430070 4158917540 2853966649 +1035771336 4159463901 +153310270 2694684062 2885771183 2694684041 +2219244125 2562465899 +910314248 4244151521 1918639516 1918639499 +2581314022 451257623 3541412890 1502945423 1854071601 +1792923723 2252045844 +409483000 1678674043 +12947631 1563386577 +3295833243 3676370962 +657197911 170267843 22403568 2551220681 170267860 237378320 +662558754 1293630851 +2542629230 2111366798 +2853908630 1685746038 +510025901 2284466267 +1713455712 643530021 +1663651008 3657683525 1001307387 2992242808 +1227022841 1542544841 451525374 +492043417 2964803243 +2022154601 914567528 2022154617 +4045816567 2520476368 +4255430637 927828484 +1575408390 323580231 +1501911865 3891939887 +755878903 3820492230 +835127351 1216345930 +3706506883 1271470122 +1531882099 1531882083 +1990784346 500727798 +465688219 2384324265 +2775655543 3894175558 +3334747932 48414983 +1354665082 2711037526 631304298 +1304341579 2921937410 2849802390 2921937429 +2969223044 484833086 +1634007351 2297713040 1634007335 +4274827916 958656161 2492508000 +3190720681 205595160 +3435766742 929884657 +1300645533 2808162594 +849117470 3395240511 +3907901051 255405253 3552156456 +2094637403 622273823 +243735504 2930821244 +3617700956 3483075783 +4218816064 4218816080 +1974952412 732892487 +1280399747 2802837820 +3345623692 2015427191 +954824967 1734457270 +1373393734 601298743 +3790824141 3632476210 +2084952193 3170817885 +1633424130 203021445 +2359528575 3832949758 +2720093880 4068180909 1701857604 +4242357102 1570716392 3808911865 +1158442913 1158442929 +3209716209 1468469469 478817904 +4209878524 1854375 959264112 +2033180681 3479023150 +3756285093 427677612 +2833656714 1817610797 +2839882302 4043040607 +1455168293 4212034377 +2652037586 2652037570 +1887910938 1055104235 +1844850621 3576929954 +3383926484 1479542703 +210433001 783726515 +1410349049 1317543166 +1161844328 1816659371 +2606634811 3491664370 +3441555335 1937287574 +1746466069 3983883827 4098478108 2469557408 4098478090 2587000762 2587000749 +1189153638 2441629862 4198822295 +405619528 1463872075 +3793216591 3532047025 983328846 2620932748 +2528333002 2528333018 +2716442333 3309400789 3217364450 +2180790782 60046178 +1627059316 2102757064 521065113 +3020721 4186917808 +3285426959 3285426975 +2807734639 2807734655 +2023589076 3019381177 143687208 +2660675851 2990060628 +724670591 2115178472 +884901111 4276834502 +1282155832 2173172691 +3430596096 3223471849 +3228264486 3228264502 +1245933507 2929516469 +2889895690 859597997 +3594770598 4073590081 1939271258 2438922225 +88859022 3832812185 +1227449894 838142321 +1654262581 3387937498 +1470780668 2194762412 +74194039 1563473462 74194023 +36610783 1315595528 +3366089832 1069367229 +167125120 779430291 +648051793 910196923 +1710516507 512489612 +231290201 213842718 +3827259003 2555716516 +309321919 3307130046 +254848024 27191771 +278742912 278742928 +1432551888 987486819 +2716541191 3961847318 +962187455 1238342780 +3898617025 343622475 +2508754504 2918710091 +1811043060 3799553551 +1100288430 1816886258 +2372208933 3138217260 +780187735 2342662374 +142924543 1747238760 +1348267553 81488454 81488465 2739592694 +4154689785 2442421365 +1951177499 798501764 +3227674453 1683959514 3948977794 +3163170444 1025540769 +1208001982 1539083999 +2697300978 379303323 +393660485 889013388 +2106734783 1815041192 +2803183249 2539146832 2181247466 +1954601018 2860235254 2231015318 +2697915320 2697915304 +2826974190 802275257 +2978636431 198780696 +2220302143 2682339537 +828256886 759787463 +1622446731 3343036616 2772976892 +2284420374 1867508145 +179089341 2329454210 +505988973 728385524 +2089470384 3195764757 +2713931447 1567943184 +1072079991 253028166 +3745479254 3745479238 +798355068 975037479 +298520135 2997135684 +399685940 3032059097 +1523390546 1121798405 +286650570 2945060333 +3513061551 3513061567 +1882630781 4054153077 +349418117 349418133 +2602216308 2667308953 +562125707 3217346232 +2794525825 3343443888 +3979808607 3165031452 +1489120415 1487683166 3743812444 +999438572 3006241665 +2227954604 678259648 4000863425 +524205767 3124039108 +1022252807 4063428608 +2612025876 2406118783 2480728633 2559373166 +1370287852 2134646167 +2194659463 1949424768 +1430969153 2245470016 2245470038 +3783360483 3789312586 +202178069 2035344906 +3277272675 3846872540 +1853861152 1243564539 318605683 171409376 1481343586 +2042902184 1474431595 +868587292 3108392400 2618089745 +4264299680 3210207219 +1174064322 3956299125 +3868408811 3838268130 +99820934 3821277665 +1982505751 471776550 +2180686969 378595944 +99820941 3938720996 +641792152 3494336324 +377869333 3189762986 2309807363 +2287298632 3599594721 +781052202 1936067867 +3429813359 1097585326 +311485503 392792960 2995686913 +4054101489 1463669350 +3843566230 425786231 +3271907559 3899323296 3539904186 2153612516 +1594955620 653278031 +3428987833 3428987817 +1219647095 541598946 +4061706589 2045496674 +1470305584 632969859 +413893000 266311802 +2212049990 3572320801 +1804195979 584192952 +2286160250 2086666818 4246399755 +1167456673 739768438 +2190082378 1187758166 +2037577357 2312501025 +1831268288 3082411419 +3737041824 1178688755 +1792818099 491946456 743071985 2826632615 3359035756 2798632047 1278467852 1994232247 908928272 2826135121 723767232 927308517 677301761 2945494112 2309998537 109543294 3888033452 714644391 1879034121 2927471742 505415065 1775363519 1500376991 2677239785 3064033879 4065310673 +3210779559 3960801248 4164862265 +3564088938 3587150029 +4192873326 3382330350 3651296815 3382330361 2428192562 +1184889748 2533201344 +2811097848 3161816173 +3176218884 183064927 +2780585484 2780585500 +1085154344 3794486928 3254250563 4196592381 +3839073792 3753405572 +2567562343 1368559158 +880427995 1556100443 1569979986 913634681 2291711790 3422791481 2308489396 1656766143 +1590007865 3935361384 +2509665559 1571878019 3685664009 1571878036 +1852700159 3592044670 +1107033222 1705936631 +3465147610 3086568629 +448654802 3942474127 +817520891 1454762759 +4076270343 2176881686 +777704801 1509812128 +3956559207 2788546870 +2481370869 1673249932 +2401129957 3442103562 +2255282887 1684602710 +1994672856 23187981 +2844207713 3128066119 +1276867583 3459750526 +356695466 571511437 +2709346955 3277162708 +2799853065 2799853081 +2943387455 1831135294 +2220157339 3970678546 +2520541960 2300345757 +324811659 87145436 +3968180951 761223280 +3002668085 4078620540 +2592255636 695076561 +1159505731 4013717399 1966348627 3759353576 2934545462 2560820250 2323810841 1043075748 2385714882 3809384854 2239913314 1114023856 3936752219 +2394674727 1354937470 +2969549697 596913174 +1837703212 3210667750 +1437047782 3168430849 +2687681830 1441553111 +4117824450 2862603503 4117824466 +178549554 4074854309 +3727134714 835398851 +909055076 2954697065 +1202176511 3424019582 +2026000488 2179240893 +4283640803 831223030 +3760249514 2172205806 +749385659 4223607330 +363450125 659616100 +1894425974 4144243030 +2078080820 820362969 +61509107 3095229836 +113759474 2660514021 +3937999836 1508589712 +2841954896 4188699637 +1085323689 1179167254 2134131975 +1169632739 2724019274 +787277876 49377471 787277860 2872836232 +1175836887 3405410615 +3704422493 4088894059 +3824437995 3824438011 +1123831934 770447314 1976488980 882419988 1684132895 2727260509 3540181030 +463392413 402604340 +1889909640 1889909656 +4167463036 2235765553 +2056626549 1854745404 +1648850535 494887968 +1509628244 4199079727 +1214431613 2759506119 1886820290 +1055905804 529603319 2456637472 +1623916798 1569886153 +3517879014 4224794647 2171069478 +1754320546 1039485205 +2234051951 1859010732 +1713937998 397812185 +1666513320 113574763 +2879984181 1741366931 4168069581 4168069594 1881647466 +1630612270 741672948 2113479901 +299857227 1841669378 +1812156312 360324388 2704690253 +1889166817 4171434001 4105137863 4171433990 604922166 +13799284 13799268 +2242537634 3808827837 222476053 +1338737880 1338737864 +775477875 914350874 +2082699916 4158253665 +4272714493 605891415 +801337323 2136271375 464072436 +2535985191 454126966 4235144740 +112669034 4234332621 +1845134615 2553246985 945783600 945783590 3998975107 +1911315850 2459573477 +3449239932 554663463 +2189077161 3976454143 +2930569461 4013904316 +1494879129 1494879113 +1333532640 5871027 +673620312 186680224 +2868211969 559998102 +503180261 465197434 +4032223992 1354413165 +175991025 175991009 +2016837754 1230479958 +1213563969 3994861560 +3641197423 386017201 +3071901987 2017896976 +1365228533 246735530 +319675615 3721573150 +375014175 1326950856 +443320737 970762358 +2264132294 4233515185 +893832535 896876518 +1610293954 3663181667 +2637419398 3290149059 4271242209 +4105966434 4291037254 +201455486 1696111433 +2883279475 4249838362 +163216318 1620456762 +2646880064 2614518227 +3980991736 2182650477 +1495829713 1495829697 +3746642374 1390277281 2066466683 +923090833 429142305 923090817 +929005987 3461944202 +2606177838 818416791 +2103461607 2206110108 +3958515869 188084020 +965468480 2335697676 +3804336608 3870866627 3804336624 +4114593913 2354013822 +2560102182 1566562519 +4114918065 328140727 +3171741483 4154366808 +2579112680 3892638507 2775537737 4046078242 +4160752021 4245624220 +1739566589 915334484 +561957599 2576964872 +2092414649 2598379678 2598379657 3024774143 2092414633 +2963272501 2963272485 +2487706751 1965733436 137552065 3949147112 1965733419 +2058163918 3967477327 +1018836588 2195544218 +2215604999 3948024832 +1608264303 1603370272 3217903679 2642719346 3269033470 +2235549743 2448259451 2235549759 +2760011134 2760011118 +3209291068 1565777265 +2025751293 3750380533 +4104316145 225339248 +3136172624 2499359715 2499359733 +1434721650 284842597 +3321420680 763830192 +1343413026 799995523 +824944571 223145598 4062526085 +1758609838 3553135602 +2426294721 2426294737 +1529515183 855340920 +1638666683 2095049074 +1860688228 4210767999 +2834033491 3801028544 3801028567 2971976365 1046705068 +951311920 1931920771 +2403681336 4198643073 2589697205 +330414877 499748532 +367187334 4195754465 +2162923606 2162923590 +228037790 1916487849 +3702525670 1327985687 +1639089114 3014720694 2785382443 861047178 2244080547 +2554072670 624343166 76193279 +477404334 1356543790 2039653871 +1988468961 1968980534 +3838160329 846725957 +401635753 1485800711 +3347287506 3347287490 +1330721761 3184831264 +3594323694 806480047 +1431796529 3777341194 +2995417742 796699101 +2626809206 1185401197 937719626 +1530586919 450160979 +3062746430 2671384713 +778301500 1129524849 +4012148600 1244343420 4001448429 +4173742784 1612387411 2409687195 +1921831200 2125139437 +3520416921 3955725512 +1392303423 1733654358 +309028769 2685674080 +3404631278 1669847727 +3175188409 1459668661 +1397437169 274805094 +2661577399 2056010548 +3683611429 3620887676 +4241690921 2215745678 +3321047263 2093569822 +3647303875 1423846500 +1372547036 2776661841 +2737507205 1076827069 1640178266 +4091114183 2790240086 +487040485 2550802298 +2071183261 4097221684 +3754167217 4070467504 +1325238795 1679839060 +1512006435 40439829 +1349894167 2222664574 3227345958 +3048337679 371096196 +4111135021 3979979218 +2452707551 45016862 45016840 +117762936 117762920 +1970567098 2690152907 +329956481 1992736534 +673364306 2003762166 3868092295 4189496390 +2944290188 2346353079 +947679913 2498265112 +1552080748 235255575 +3997180435 2476281069 +736528720 2719819511 +1446169240 3113324595 +526985867 4253939924 +1794757690 823110421 +4236225784 1962756731 +1907549122 1907549138 +1677308704 2182413157 +1503165173 626620 3104647322 +3156140003 2339576029 +1850149987 4242046940 +429041641 719213518 +244363783 624586585 +1496052837 3308370682 +1712910819 1329157620 1582063325 1548183760 +1152095178 258071858 +1158666632 1072918795 +3694378236 2708635815 +2647787720 967037661 +4077958886 1132639925 1137749634 +2748277049 1070993161 410389694 +1396132126 503847465 +618550234 3825074219 +766291741 2927729922 64465588 +708847395 2784861212 +1498898316 814442871 +3185355943 2305018614 +3719891846 2420974583 +2050461021 2111915349 +184186823 1381887684 +280068360 2807809059 +1687224181 1730243049 +2290779967 823322686 +3816975670 3787342500 2562423220 +1475099380 1558236687 +160281608 303196317 +3567580507 447626834 +765116173 3617243506 +1053083419 3938807698 +66154788 3845819151 +899531134 3847723337 +2545312334 2891456153 +2405548171 197303159 +1501973246 3966242271 +1118450475 485395636 +4218565341 2982547956 +3408122780 1701191313 +3988958415 1492070957 +2028933100 1280708737 +3104922226 3360776563 +3571380543 1509279272 1076084816 +3785345973 3817713130 +1491216795 2265415442 +3428722667 2738411234 +3752280310 172704583 +722874384 4137221351 +3280573056 3980271180 +1825514794 1947697435 +1410592427 1044408015 107001652 +411180603 222069420 +3785477139 1152664044 +510299052 2377768897 +2106470642 2564230387 +3465311447 1521076665 +1512104666 1512104650 +2841818051 3268762689 3752635814 +1063893878 1232214727 +1242879533 2784445060 +4201663205 3398029834 +1302095594 3842356549 +3471021280 1907863855 714277559 3358871369 823549475 1710457409 2844039823 2737988345 1850727991 2704868648 3689489493 3838052830 2697009920 382529443 753424073 3251146859 3044770678 638086546 4219118135 1975920285 1885504114 3531789807 2140374518 1356646419 1873763428 +407891020 1682103511 +3040400086 510912231 +4097154457 157751262 +3029502143 28132542 +2144431049 3939828782 +3795941199 2081345870 +1874443588 3133316311 +943718182 2998839489 +1077222458 1302032203 +58474155 664184628 +2259853996 3073774785 +3833351794 2443796114 2051177499 +3769856189 104426065 2546812834 1615166923 2004515220 +3423922670 854344121 +2105856185 3781413513 +3872398507 77406516 +177513152 1744581715 +973555314 3294279708 +234849551 2352466418 +2776092676 743322863 +3839457693 3747246626 +2230316128 3575051632 559978937 2015491339 3041841456 +2871063551 1678538561 +2969808294 1321884737 +2893124825 1338855838 +731120782 671296399 +2253264795 2105379596 +1589350310 3343065665 +2046920749 1030315716 +2204437590 762492594 +2388092436 2281006210 3450234827 +3270393561 3054301064 +2079922789 2384760044 +3031402378 1252677362 +2187846684 3968459473 +321034949 3833177100 +3883098277 4288750508 +3015666349 1890790162 +582955146 1022978363 +3329649985 2909666646 +1564673537 3514987392 +2861325171 3992188442 +225447888 4150846581 +575478347 3345775285 +86077957 413564378 +1788257476 3772184495 3621185945 2401591455 +186865510 4003632513 +4011376542 32875945 +3846398460 3843243953 +48502360 3842976923 +3018051178 2929862866 2577264859 +3744573328 3945449379 +2905908867 753016874 +3091293043 1795888977 2666353677 +3184156501 2702808045 2702808058 188358387 +1641278969 4187987688 +3722008825 908529640 +1375854505 4004477794 +3037761209 3255872830 +1856801752 295707931 +487869835 1375080898 +4292049969 3941368112 +2241925718 2995772775 3813867910 +1372705199 322530769 +2992823260 1231490416 +278611686 175152129 +3884386614 2945679377 +2855262331 1683081636 +1502926271 3293346728 +1326974047 11340060 +799240119 1907621922 +3302249474 2729873441 +3902326984 2095690211 4035187421 3435487600 +2385422689 880059296 +953916405 1584054739 +3017737986 1725222666 3017738002 +2431447695 1365815153 +2986210407 2096754933 +3368219404 2443194586 +2205590845 818290452 +1712910844 3041193895 +2146280942 83279122 2934692542 +4141432555 703385871 703385880 +1537234508 1018084636 4017854583 +4028733865 1173266099 +2486769795 2803859558 +1459895227 3064596338 +2791825193 511987086 +461920020 3885185640 +1167663007 2279316018 +4128794766 1908707218 4134311833 2079495705 +1450132525 3033161853 +1941541306 3877660637 +3555877956 3935557385 +2163594373 1847952573 +2253072284 72309393 +212462884 4102669104 +3011556422 3342816391 +2354949541 2354949557 +632045306 396158389 1210524546 +3225786200 93142939 +1171754969 4255649867 +3588839510 341184369 +3430037808 131073667 +3137953971 422971665 2236873782 +3196335836 3196335820 +1352631292 3877422513 +2460785956 2082230125 +2373108925 1213119394 1756083586 1213119413 +4163335499 4163335515 +3843949500 1782571245 +3577575845 779714250 +3135321815 801476781 962540091 +277431057 1097113760 +2160256881 600987376 +1554108233 2461586361 733571336 2714944335 1743952170 1554108249 +1069922284 1346406551 +318712615 318712631 +4205381790 2523833410 +1185409392 2857663299 +2406835171 3100393052 +2562804241 3786768288 +4281191339 2033060814 +613020408 2099870829 +630218059 4126809013 +2834595010 3135268213 +3419800282 3152444733 +628488729 1137017577 297317726 +3029327517 2773686402 +2609100327 3507422393 3206693924 4149722998 +2285656272 1191169891 +1630010788 1630010804 +372511060 3116719918 +273247518 3247883817 +3652386682 4251818065 +4022809168 3331601397 +2056034237 2824003202 +1624739335 2712615155 +3463658112 2137331603 +2159711152 1438023171 2159711136 +3300031354 3828034390 +1925014922 1366354586 +1817796462 2410381740 +1885809204 1305809544 1305809567 2070039124 +2271715916 1987167328 +2781358175 3356740875 +1067393535 632169208 +3747855035 1138477957 1694430322 1633335656 +2317426052 64848580 +3844078576 3742289152 +1825488262 3480508897 +4118752775 2921803539 2117432576 +1407106911 1407106895 +2437435118 2569150744 +123937444 1158645801 +2030350836 1986274073 +2093346638 4174797529 +325971378 4215096223 +2145354841 2782746654 +3203528190 3805484779 +2091845945 2156627112 +815946271 2928926430 +2804329905 3538120112 +986804813 986804829 +227243965 260931220 +4150786974 380705193 +882340053 4119510899 3716848041 948748666 627958072 4136288521 +1429235245 1211160786 +347366397 3317066996 +734029282 3921485102 +566626809 1206699464 +3568743689 2740037376 +2068204048 138414204 +3793125059 2892598506 +2746575211 1367031704 +914004210 3036595429 +2533561305 2463645342 +1586926063 3590830894 +3207008004 4001145673 +2167384662 3580225394 +411489840 3426954627 +3088146814 593841634 +2730348437 3318597532 +3728419204 3728419220 +2148157450 3500023635 +1125950487 4291086296 3903578679 1560580538 2243406408 3451994441 678093571 +219199156 1801446242 2230525406 2035595627 +2094237156 2204577035 +4049256534 3817175172 +3562104273 3562104257 +861409612 1861569376 530791073 +1309997814 1309997798 +1906270798 3899719581 +1363322272 2347416300 +3605225684 3605225668 +2822937424 819625717 +2159912302 3373395604 +4098360678 4083187607 +4017553641 4017553657 +1531641766 1561358935 3622043366 +4149235012 1704181764 +1175954052 3677672927 +3455561790 2062184841 +2031317211 1956292818 +3590827005 3943939906 +2388769722 3722085835 +802170689 2242759488 +3615678944 3440602285 +1796077918 3841953513 +579433943 1047561565 +2098390531 3888125610 +3085146229 1760246737 +2246092554 2246092570 +442378176 1111003987 +3764766972 1010525361 2189394608 +2850124335 2632368120 +4244723574 3206328007 +3480705580 910488979 +1039661791 1818225950 +3868093997 4282820824 +3826587474 4050100205 +367277088 2520649331 +3917724352 1784616291 3917724368 +1483328487 361495734 +715190947 1173041476 +4060406899 1890820364 +1995990061 1934630811 +565217223 3487940160 +3927034743 2960535142 3291559127 +3783327420 3653635696 4293289452 3653635687 3121676785 +2099115473 3341416464 +3135502942 982418537 2464358889 3510417282 +3989753209 1372884820 917051991 +2394692474 1440344972 +2394784897 249747366 +3570475349 3478332909 1513584842 +890797829 2593125580 +2886890355 1518087392 +3921029695 1431785980 +1055588615 2279138093 1334915902 4012379220 207337794 382771710 378526589 2127263969 2257502236 +334109112 985019957 +1829460763 3286264722 +1940431212 2121669911 +4244071705 2635341043 2273199923 2705350135 +785238772 268992863 +3763225261 3358783058 +69872181 3010396733 4208101850 +830098888 2319944858 +4170818582 1876774577 +434255251 2013204466 +3020320109 3541975698 +72496600 2775237389 +3772571068 3081834225 +3511788104 3143755636 3414325085 +105133053 62512372 +2199005817 3097696840 +571345623 2744836180 +1456935516 277997265 +2269355182 1053747460 +3450487572 3607599215 +3811398743 4149986534 +3858270910 3292686594 +798740274 608644005 +287377393 3892281456 +4098967258 4098967242 +2043121040 2498260328 +2759315873 2308898934 +4007373334 432849073 +507036481 3562757952 +551484633 4071039912 +203024638 2070220508 +2441627588 3716741535 +1981274883 3935159740 +679262326 749097305 +4045876330 178973403 +1049828462 4019568953 +446262374 1166386305 +2281797267 2907548012 +3222725720 2263192005 +2662259816 1703094636 +1873124505 2847943017 1521845470 +649398831 223112891 +2874008943 2720528556 +1840777776 3946893384 4004976011 3937865551 2249373891 3576505840 3904375171 +3276976549 539862700 +1128629890 327744292 2939074125 +3631464704 267571000 250793378 3191395091 2020880603 +375403541 1316093194 +3243843212 3947566689 +4227641559 2244633200 +3039731252 1818430415 +2279153442 4241228419 +248055357 2615266967 +33018947 33018963 +2672668259 709461450 1535973469 1841150288 +598398894 4242839067 +3347725112 2136669063 +215373521 2084994414 +2412832828 2715653745 +3327210378 4185102135 +4276612548 3510189064 +259173175 2290321296 +436960869 1696069868 +844930252 332059936 +2066363858 1873037234 916071035 +1666196896 4146805477 +2977770984 1343177789 +2694561118 2145086602 +1206991452 3754789148 2440610577 303764432 1206991436 2440610576 2440610567 +1988308116 612314351 +2725175629 2725450404 +2855006499 103586314 3560348167 +3097397775 2414853723 +2929070448 1178432341 +562846630 562846646 +3096919014 1767847206 +4259720506 4259720490 +1489852645 3815191884 +2680878134 2680878118 +4214435170 3549458755 +3116483553 1292327712 +77426754 2245507061 +2091073238 831703479 +367277094 2621315009 +2173537723 2098219707 +847660412 90137137 +2104021101 3640662916 +3587350464 3624209804 1519483717 +3259644959 4191986910 +1139761383 4163554532 +3239009058 3239009074 489459621 +20725928 2581186685 +720237513 3260599353 1570162030 +2451447242 2299635910 +3490601639 764982496 +3104788116 3877155577 +2820652941 917341408 +3503024742 3475228583 +991326112 2756819187 +4150221261 58818341 260149785 +1140495329 3640778682 +2528279136 2599855411 +1889443222 1522955508 +1131477883 2782651058 +2754590963 1780491916 +1702293658 1702293642 +675417504 4294669043 +3765139212 1428973559 +1417344182 3012508295 +3165305743 2571012258 +3176641200 3238939395 +3733737727 2034971499 +867486457 2734916112 +3434564045 819740257 +2180179598 526447001 +2860278056 2311909885 +1951169275 1626346431 +1785529247 506954310 917387850 3613529121 +2649191456 3654135044 3009138277 2111285656 +3203776559 1803796667 +4161604047 1267101902 +2629271856 3795117212 3839909525 +1338234329 460657285 1783211144 +2600138703 3483779596 +1763834715 1763834699 +4096873818 3282656445 +4073933553 866056560 +189444455 437727516 +3724221931 3288278818 +774503750 3344927034 +2252075219 393946442 3590347072 +702271083 1834790031 1342567016 1342567028 +3964295086 3964295102 +2358612181 2358612165 +2655343056 2081142315 +2169574259 3798712774 +2649072613 1971388794 +2468159911 2047760677 1095392178 +2909484927 3476414778 +3475300928 1460677317 +2017648671 2272963275 1883689160 2205852815 +620233435 225214162 +989328932 2622035983 4166548137 4166548159 +3589954238 2535250185 +4176314647 2954682516 +1443973247 1443973231 +1095806632 1349989476 3670358815 +2898343648 4014340932 2720418221 +3612038139 3868537892 +1174147823 449957422 +3414211757 4094807301 +1207973863 1468595172 +4174028292 2868297801 +3378873258 3033416845 +363094671 376864625 +609011583 3733868843 2749238504 +3989332934 410325153 +1724350167 2143818488 +1440048315 3656225389 +1042028885 1042028869 +847403865 3694513438 +829764699 297524232 2361740645 914451282 +4116793636 1055598878 354439193 938155534 +2992623126 3253617324 +3022623734 1836908243 +3256765356 1102127063 +4254242226 633949595 +945217613 4257421604 +3784258674 345952795 +3643491212 1796953463 +704846037 4158658396 +3730364193 651864311 +3079444381 2045648754 3240425877 2404559906 +2066911483 3952753444 +3923347238 3923347254 +2295183043 517387516 +2510201369 2713267528 +1147489329 1729962797 +1540382949 1846052972 +1064817199 3148714875 +2104951915 811728214 3982226548 +3444580107 1075895874 +151244397 2650666372 +2145334820 1083184648 +3668107466 4167556589 +676569566 1880181250 +3992016597 1743499612 +201844036 879618569 +3255511941 4183569322 +4103491077 228381132 +1266352279 1157866680 +1463998330 3627627805 +3678526069 3106295425 1644714598 +229556213 2132291260 +992363676 3107848583 +524881745 3114811174 2432900240 +4088505675 4088505691 +858808967 472586902 +3024923290 2706394083 +989328947 123245132 +209137285 4279725738 +267934505 3544191148 +2597514948 4023731097 +1409918274 2368677621 3765311426 3914854283 +3203283090 4238010046 587402693 +89278559 3213356446 +1892123494 4027832705 +1368024646 3825814586 +646375237 3475161667 3948810650 +3919436539 118518696 +3037824105 1939042638 +3388797127 3389755332 +2325832520 2215594589 +3587579085 1077353817 +3664391646 3005625449 +1811935023 853903086 +408966473 2446743717 +73555246 349745017 +1559914381 3945857778 +1299206953 282257816 +3385470665 1917298286 +3461907051 1079332468 +3709326838 42324561 +109253878 911867719 +3704809701 2231672954 +4097421445 4224770380 +3384310402 258529973 +3329443106 3883764266 +4084329759 4084329743 1532512200 1264070286 +3883067275 3564341119 +3490928646 686685777 +900992279 1413762179 2708511536 +1374655766 304591281 +3237361936 3550204963 645868520 +451566842 1492147595 +826684808 428229899 +3476861815 3012461648 +2457858507 1785307778 +2216789905 2166390564 1079288810 1948158370 525072521 27530041 1110937845 +693423108 2315882745 1175402472 +3523462772 2986846431 +289788605 176912821 +1514554242 4205567604 +530392539 2674038738 +3787758527 3629834091 +3077687186 1511860933 +979318164 2965208319 +3687103078 1555132033 1436599495 2186352550 2159169946 2186352561 +2962636817 290088352 +2775538023 3809786227 3578379552 +1027374286 876116038 +2894013088 1625652077 +377665005 3423809085 +2487708782 908426048 +1589667713 1337461166 +3193275422 1397064745 +4294475659 382378238 +3892579367 1700733302 +1607376442 2560263445 3124074902 +148870708 737768409 +3454101005 651404923 +3944193127 989635663 1903207774 3127096284 1663113627 3070156225 +3214831163 3781658354 3120126184 1167122949 +273578373 814304332 +3834906164 4132416096 +2185169050 2738522749 +4201394897 156499718 +1833733277 3940436075 +886394640 2520842600 +690538398 1494692799 +3200244879 2582353114 +971484375 1796364432 +4184873362 2538474554 +1472589965 3113856484 +2777542621 876653525 +859196852 1222914260 1383879257 4131163283 850764319 +555802186 1891495533 +1036728859 1036728843 +4141586856 1135797099 +210819766 2114473105 +1417420035 38968372 2787747305 39955370 +3644863327 1594941086 +2863439453 180178036 +884422073 884422057 +3432356940 3095150364 +2225219068 3255814354 124911272 +2638731467 1662666653 +3968759170 510796171 +1943462443 339822168 +3691370252 1764853751 +1873520911 3661308558 +1696074133 395765818 +1705508771 2859953546 +1762099264 749871643 +3141067006 3096063967 991832162 +2979139189 4260151850 +91087003 1565590088 +769424614 404266497 +3764751910 224368964 +4261771381 1469882428 +971562118 3252990202 +2072453596 1371163985 +356348387 427668981 +570439441 58111158 +292190244 657746447 2392531113 657746456 +1511478444 2126138071 +528958532 3857741577 +2785382439 2176970102 +1494091728 1494091712 +4256193160 4256193176 +1829731686 1829731702 +1959509231 4000865324 +383052003 1528149959 +3908637074 3908637058 +2620400739 1120487388 +2637088582 3064181559 +2311258115 3774416042 +1743352948 142758543 +1372059827 1892450778 +3710096656 935447403 788768803 3340574696 858431509 +1141004008 4155428641 4155428669 +3151333037 1579352644 +4084055818 1069792429 +3353571488 356423742 +3259478672 2082379881 +3846420614 2831323857 +2425257220 2488192351 +2326383697 2121447431 +4250436255 326958469 1280226981 +3785171144 984175564 +457985992 3638689280 +3715831818 2999375789 +955141785 1030038818 +2534009621 2920879108 +3941684241 3941029574 +742576845 2050087090 +2062920300 4240132119 +364026508 2943632735 +3154083052 3609987944 3744573335 +3946253365 3895551123 2091399018 2798599130 2798599117 +1350770803 1350770787 +2596733554 424204645 +4069651665 3086996559 +3834808651 497950996 +2419352046 4034275769 +1858689208 3924852460 519481787 +2917413935 1893057900 +1022252249 2654473813 +3571001848 4093800069 +2089830703 1634493036 +3642224256 1085043589 +3300508648 2557437483 +2449775921 2946532397 +3585777781 3922368547 +1033914981 1750408428 +283039895 2305023920 +2997596814 352069346 +3962644781 1227050386 +3427838539 3992720386 +3441036037 649956187 +3930263494 2375144638 +1144315529 1104057582 +958942454 163115466 +2995930382 709014799 +2808989809 1466897664 +3300333777 2101088528 +893971082 1808348973 +3900516407 872828550 +1636131705 4261123966 +2253502515 2779052122 +1194806689 3171890294 +3672590713 320383351 +3868873197 4058970116 +3724349547 2893332120 +1189809545 2221047461 3161618681 323780438 1455885544 458270596 3574827253 4215734961 1444533096 1178282888 61661820 3196455593 1227209848 1533025405 1043593246 267488384 1160336319 3242528779 973208432 2364010761 2458694157 3755546549 1092954963 2025828964 3997187915 3664281951 +3870602511 1031341710 +115612813 1712910820 +2878551709 3049191732 +1163921014 2888444881 +3808585383 796430373 3543509170 +1533032595 1803095916 +3670830341 3324292794 +2816486653 1122423380 +149168061 3156080276 3156080258 +1966760628 1055482201 +2175317826 1587051765 +1927677770 706574701 +1415277291 3068743650 +1456354854 1456354870 +2737186184 2560113845 +3382918006 3791035079 +3140719699 87195322 +3295410334 3556270271 +2490905753 1379585224 +3479562153 2142465880 +3907070817 2063975188 +1113689495 933953795 +4163012657 3478938918 +2074708389 1357098682 +220619186 1701563187 +2383146351 197576120 +2311897955 1347917013 +491581045 491581029 +896244265 374883030 +3121942690 3978878531 3003833425 2351266575 +595018293 3202441676 +2078956366 193129938 +1326006084 2945357833 +1224148547 2815656998 +2706924297 1803873657 119793454 +3793594047 3793594031 +3806853379 908918698 +3479619382 1969258285 +293844591 22556846 +389123306 1828770893 +1027764875 1424833966 +604770757 3858047978 +692773486 3844110500 +3857030897 3648599406 +1072809597 2294018932 +1333652013 4039439608 +3879953617 1913257779 3759650064 +2709305578 3608893266 +1014216312 2720546555 +350499458 1698398901 +493854636 3543113123 +3440646539 1638151636 +4093641547 1728392962 +13681064 3035158228 +987780678 4113027127 +1617367301 3342846682 3611288604 1617367317 +3108998802 1245540293 +3976949529 2825348720 +1938042009 1913795784 +60854294 3418542769 +1775838146 1775838162 +810194637 1568090663 +2462396519 1936405046 +2266493099 1437588770 +2707126383 1912510136 +2824374957 4148676623 +3716882170 3154232221 +1935403635 72611220 +3646056871 3206554793 +819351857 308400166 +3636771207 757627239 +1124227650 3199473123 +2227368016 1323322851 +1988984206 570045198 +1478121580 494481921 1724495744 +1529551920 3034406787 +1825267350 1825267334 +432464968 3639474548 3692649821 +2604278531 445501168 +238036292 1425990990 +1956991407 1329567352 +848490877 441591746 +1329267666 3685397326 1846720669 2347172751 +572945520 4033130354 3915687026 +1254874928 4008728724 +251171796 251171780 +2296076952 156212571 +3810451233 2862170358 +1191899747 960205258 +892552724 3197451052 +3209049728 1253049566 +1820570671 39101934 +1653306303 3766957480 +2369826506 651372525 +2003355369 261530712 +1714211393 1714211409 +3664376834 3664376850 +3542804935 864945238 +139770863 3106861882 +1238904027 441359570 +3976397461 2965180572 +2986221873 2986221857 +2314204235 358033334 3636982991 960983660 436343433 2980515211 +3199998752 3605632664 +744721720 414666555 +1805962793 2641398414 +2402351695 139314292 471762350 3031344637 3692563204 3227926459 3384431329 2486312705 +2695127264 1079411643 +2794988869 2256710540 +2945267646 613047159 1157358988 613047136 800077709 +3116841823 2965411868 +1180856888 83480123 +3310814827 1536599183 +1838801292 4085159448 +1544815192 3756623872 +2025050133 403738890 +2910239417 718860853 +2591298536 809785580 +1365364600 2499385837 +869963738 2065501227 2145499490 +2353374483 3835878636 +2877623671 2179675124 +393095260 287465745 +612201371 209517842 +1364632854 560325041 +1408272534 1408272518 +958473801 1221334116 1254699967 +2644814795 2667526383 2644814811 +1662981383 2018758196 3657661532 2279861017 3625755318 708493426 3890741105 +3778128547 3778128563 +1068441370 1521350123 +3448691182 1884214894 3448691198 +3139571966 2493562825 +1254602266 3529747197 +2203269445 16983948 +1984336267 3155631572 +1815380726 350943058 +551437238 2336455676 +1260387305 744067022 +4266654577 3370701542 +990780606 3040296735 1693998537 +2755361822 2812568383 +4047562503 3492524054 +1425898223 3121120814 +523237884 344360881 344360871 +2011958829 437672242 +1602799351 1263607222 1602799335 +2925289788 833778928 3909861740 833778919 3077378407 +560943522 2288646452 +2869944938 3019992269 +3379011993 1253696959 +2195618321 356133072 +4107046770 1755922517 +21916897 4017448502 +2462866192 666065461 +3268382954 2697478823 2529239131 +3513947814 1511452134 1566779223 +647801105 3514016061 +3411270445 1107429330 +2181170766 4017211865 +2129809665 3631580310 +2892617128 675596048 +876891307 4068782370 +2180980236 3876390432 +1571497812 2382999887 +1401677606 2872893633 +2563787366 2930714535 +1458399630 1706896006 +2195920244 2017640804 1195708383 +2122077853 3132905780 +484720426 2773446427 +3526776403 521337536 +3498588324 3670660388 +2888242546 1938211429 +1722501193 3902982894 +810300423 250996480 +1522218260 1522218244 +3834662383 2503071034 +3794118328 3108336571 +3637786896 1586047976 +3973738391 1927129776 +586902000 29869251 +1385333661 1385333645 +61517841 3255588257 61517825 3602066118 +4201712547 4201712563 +2249644541 318318932 +527166451 1776578458 +3056166568 876032725 +3025830360 3262801691 +4155408111 4109093638 +4103355278 2472132751 +2485048264 4102513629 +3994629728 3999063845 +1024534522 469888669 +3387836900 1673846021 3323875816 1228972772 3323875839 +362292629 3313134214 +1274220167 1274220183 +1642409447 46613152 +2419319082 732656923 4182640102 3655948677 +778357845 1571662300 +3343318128 1090816264 +1729170061 3436420082 +2731633559 1431328451 +744093279 815716254 +2029576745 1642093700 +351261980 294419224 +520031639 3276046595 1652712624 +2707007779 1806109636 +1006388595 2763068423 +3843527393 3277147646 1934105187 1692450696 1577655341 3631375144 3258992755 3827334165 2941771318 3563849580 2364831641 +2938385543 3616768197 +1446319619 3096553148 +3123635114 3251659931 +1899656418 3413226206 +2412921562 1107246397 +336321017 689632998 4085359770 1873734101 2142175989 2275943138 +131487437 1927365668 +3009784289 1242197302 1242197280 2340923228 1242197303 +69511487 3543099626 +1393140669 1697425732 1393140653 +4069340989 1069068834 +3045231763 1334004602 +3932550986 220630699 204661062 +826684822 663116590 663116593 +1988570964 3718802623 +3823908893 3713859256 +214007007 4086797064 +2356128078 1640465881 +787625768 256693245 +620919006 551830889 1029265627 1029265611 +1189652647 203078323 1195474656 +4181201959 2051520886 +3751636387 121736513 3457657479 2815661980 2815661962 2905693504 3457657488 1081724340 1227087901 +1651337275 758846706 +3525458792 870548669 +17512887 2663556925 +1170916944 775303157 +1936030278 1936030294 +857274224 857274208 +3615620737 3942713149 +2309803654 2390923002 +3056701281 822392224 +759978108 208887335 +612225214 806329119 +1918481740 1329096375 +2360223647 354967390 +4152152190 1318682634 +1030043462 2079016483 +1649003255 2972353222 +1311438039 3835653744 +1033361775 1695238574 +1461496094 1075722793 +2564605735 3398271584 +1230600573 2106084875 +2816569116 1675749649 +197325898 3454439533 +923026979 3199887626 +1766248287 266335622 +1922060920 3509703419 +1894218707 14784557 +2517988038 302674117 +1998744794 1697733437 +2036444188 503566621 +944729484 822702945 +1715664798 2573979071 +2572893679 1389249836 +776935670 1799520449 +39376425 3671663256 +3620173138 16625683 +337834085 2029702819 +211950852 1062849017 +1824871650 480550851 +4238897846 3593326742 +1813307867 4225704102 +1296065264 3379493980 2354823125 +2058694078 3912696329 +733558493 2979093986 +648475457 648475473 +875363553 2184630669 +1525245767 626368261 3782428953 3632343620 3632343634 1684903126 +4251699001 1436017950 +333721871 1597586062 1597586072 +3986029284 35945956 3067906767 3067906776 19168350 +4165654980 2715078559 +414095754 1692120123 +1189873192 2467143235 +404584439 4162052724 +3033982918 3475338257 +1107951121 112915664 +710896953 782433054 3979931816 +3354758030 1435152527 +3259644880 2866554979 +2653517059 4265817002 +2764570446 2102323918 2102323929 1444805074 3033982937 305898446 2102323919 +2623310611 950988538 +3769164669 2901049809 +2887799584 383966053 +2670249870 1592757529 +3177981158 389944855 +3136304305 3911375200 3136304289 +363669516 731253473 +3461127148 2174083136 +1050339654 3554490679 +4148050165 737388988 +2901030302 3534907305 1842958761 +376756222 4037678458 +4232908436 951399896 +2300585569 2086967868 +3464597592 1844853389 +211321433 756363806 +3135254219 824367678 +3814362110 3851051209 +3033868670 697323871 +735416167 1748025142 +3438307177 124963406 +917635769 3543812392 +4153610441 2548280018 +2554482410 2554482426 +4218971844 2726938249 +3670428368 908576117 +334288337 785684496 +3223825834 678847117 +247019169 139589501 +2549276198 1498658241 +2386149358 3538494383 +50640796 1550650008 +495928233 830964494 +2082242642 3000893715 +1259697563 3452445444 +3912373419 3302394164 +3578772950 3268993206 2726811623 +4045576379 2820572861 1728110740 522961518 1417047672 +3064992213 1814827612 +950878738 1254031941 +3542735468 3894470859 +1794956275 1594769292 +598234389 2613108652 +3807870869 3768440732 +455045865 1322211157 +3909632922 1912761195 +346904908 346904924 +2073963090 3959201555 +250607174 3384848439 3512034950 +13768955 1170035492 +1002081050 547944939 +3841986776 1461355547 +2029816213 3578863481 1145520344 625961018 +1425547023 3516458126 +1852253970 3730997573 3730997587 +1622426013 3636677154 +3023710043 311161924 +1751654881 3563046179 530392080 +3477797818 218777035 +3189809027 3495631658 +1319074454 1319074438 +783656849 418826566 +1779813401 424692574 +392705354 587981677 +1840750360 3490673371 +1679095025 3308610468 +3666327719 2247641764 +4066667614 4061566953 +168055109 164360076 +4294928221 1544533858 +4210516466 119152503 3438618046 +370907269 571140266 +2689391756 3841929335 +4142936012 2693422437 +2732148598 1350803051 +601268172 2143731168 920489505 +969006630 305182167 +2251304825 3067788158 +1339947915 1165163458 +2446646104 210104051 +2729391559 3771836480 +203172637 760733364 +3075061267 3657501075 2401681536 +4065623412 3696803371 +2755137138 4131306853 +4054194655 1199225352 +704695831 2853296559 +309889792 2176006127 +240543659 2049534814 228873671 444352348 1266707359 +2123218424 824315259 +1163860868 2468818041 2468818031 2468818040 1805708484 +625724962 2416556955 +612593052 384142471 +238522971 4131414988 +1551318112 4021553971 +1282846762 2295812621 +2923409421 4018209288 +116015099 3720525874 +1466975915 2348497310 916746445 453094835 1427146027 335651490 +750285254 3248926856 1507650575 2588497328 4234118101 3531220011 3547997617 39816490 1630733090 4234118082 3933882865 341604071 3865786637 2004705506 +2767480355 3485255946 +2920636868 3483953033 +899977796 3658290410 2256725018 +180040853 150843111 1308131176 +2329849011 1800893195 74265813 4229816087 +3362259021 3367532836 +1752771590 3652842065 +48606739 3595532416 +317863420 67778480 3477797809 +1971680615 1746391337 +860067291 4217920997 +592367007 1352666401 +1048313082 143857434 +3030987485 2025962795 3931973332 +508720459 114205954 3410878063 +3109161538 2706667993 664233294 +2706710200 2969525165 +1391948082 2836019227 +3646762776 1169236685 +3117414863 1365655768 +2637871654 2842888641 +4228264556 470990336 700538903 3161072001 3161072023 4163934844 +3639773986 2815493763 +4187798663 2025638038 +2371310431 3749199496 +2922793768 2004379963 1735938045 +1661445933 2057421345 +3405945993 505179064 +948049264 1690812245 1690812227 +2579151643 469011346 +1537770479 960999729 4110249783 +2584369810 273454035 +1298958821 3336377196 2698987299 2282072330 +2015205787 2979581700 +1015653047 3597462306 +1149857466 3084311105 +1805273536 602020179 +4092831260 613318151 +1990897122 3886219517 +1385631622 2311942113 3848749511 +2622932216 1292841731 3630498181 +1553807980 1680632193 +3698350113 635091936 +536302617 1801020232 +1377448729 1480486984 +1700993820 1843401970 2067518988 734622151 1515481147 3070471441 734622160 +328743011 3054783748 +2136238727 4175671958 +2514391137 1314736288 +2510189774 1450303567 +3248083090 41941802 +1443527235 1403679875 +1081082568 560029162 +1208926068 1295110187 +435885733 2336531884 +4024634170 3697978461 +2417556146 2303895077 1386096158 1612423757 +4006213101 3572376594 +3654813245 2390324334 +596370580 596370564 +1631855136 1044494437 +1357929264 2589953173 +1321553108 3676929932 +1754577340 503038311 +1173362500 1559535625 +2815299719 2959344790 +2789705635 2386580615 1704625564 2789705651 +3179467697 4293733386 +3506311067 2599588100 3506311051 2599588114 +2140533369 3224762187 +3806742824 1485122027 +2938591297 4226805312 +2889062415 433963453 2629729370 +3792650571 688113922 +3772029792 83853869 +4015865322 3116922701 2244366623 +3119121711 3664128238 +837796750 712038543 +735436721 2997822384 +3620382228 1449894271 +1572244129 660355936 +3673485546 2680859548 +3786237862 6977485 +4245285331 698029868 2871360064 2871360087 4125217325 +3293035186 3432015390 +2126717036 1096007553 +3004524944 2058694069 +3523323944 939368531 +1134839330 2635133757 +266196871 2168080768 4005672083 +364465908 649546265 +3593232921 1088318792 +2753124407 1138585495 +4111397456 3716606785 +3306786290 168069019 +2108360600 2108360584 +1233492553 106029294 +3029228825 1427934814 +3200097287 2971089338 +565494013 210488916 +1185804684 1185804700 +2783013872 299690691 +1197045329 2731884944 2731794764 2731884935 +2668799896 2392093082 269701201 1430671208 1896159279 373182599 2348610508 1870159583 2066759597 2028007052 3733507075 1346926748 +837416749 3226475483 2417740690 +298903387 1725707346 +3027267328 218021125 +1848556000 780076204 1401854885 +1354451630 3302395887 +732765842 1354176813 +1234444475 2402256484 +802457841 3260090774 +4090778836 1361825343 +3474272691 2541927977 2962571523 3192755874 1229721280 1204595215 2856657435 1783527941 3346294286 1448928186 3872064558 4245380260 2314301826 4017253223 2521242126 2381463005 3753123076 1884695159 1942502638 2090130567 1350272359 3901737094 3759865641 1715375634 3274269504 2860270967 1775476942 2400345517 2053653809 1033914675 2993780927 3768024235 649446190 3158416497 3130715426 2484730307 2041196332 1890379839 643308922 3370281731 2819293004 741329291 1214409404 3286751743 2694303650 220854497 1030884422 3933042575 1472305240 654552850 3807460177 236896382 29176203 2673275606 45499597 2411926792 3842305048 1879587676 684078510 3555734711 4040166292 2933378459 1453527977 1069404921 1005516555 1315425929 2782348573 1071585167 2298121590 +1100155145 1131886904 +1597683386 2741872331 +3122174509 662827419 +634898686 2722528717 384056899 +2698591303 2096751574 +1024632944 2637079079 +395815551 632510742 +1442060201 4165025550 +975617996 1459613239 +694601871 3150821646 +1896921808 3581060372 +101913839 812054843 +1988256464 1764863804 +1888474123 1888474139 +1018448200 1833127408 +1302992153 1539257950 +1567579643 2146066245 +2380710609 860139270 +1243823812 2038156937 +30180018 2710465114 2263989811 +1791477964 3833665847 +1801875902 1143854413 4021626858 +1851855806 2161251337 +130970561 184563926 +942718063 866658220 +3031159366 1566047440 +1790026291 1133369760 +1416836877 4267682148 +567251498 567251514 +3362101966 1173533273 +1569650867 4212228570 +28709919 28709903 914554571 +2654018806 4249917265 +3609695881 2395223540 2618032636 +502548514 194268588 +3828223037 3034042912 +3815664538 2698208125 +1270470911 881891688 +4082566171 754677394 +3504969951 1114105498 +2007411192 3734867211 +2954795253 891996604 +2760825152 322920964 +1596467263 3492052988 +755790836 3734669583 +327548032 3662256219 +1927223791 3291861806 +3947918152 3081075293 +2048237251 2467106982 +1193580943 2809896049 +3133543337 2932929304 +3886499207 3886499223 +2867923837 2524255682 +3252353896 2478425259 +202507508 4162144442 +3450686620 1821697616 +3537620200 2216207507 +3859366390 378721873 +3481161919 2533026798 +4248308148 4248308132 +1091431573 4260064924 +3218658571 3950014709 1418503224 1418503215 223830100 +1320135698 4035698771 +3040819048 2827881903 +1141476382 688355865 956797737 1141476366 +1410001066 4146873229 +320294476 1504723383 +2253038779 3220032927 +3583239415 3438986877 +620378326 199719153 +2164670016 1557397203 +227973957 2836819354 +3220060723 1459986010 +3100340652 2989053122 +1603916609 3561399398 +792860839 202165984 +430103501 677381028 +869699187 3804604214 +634164441 2503960496 +2026465385 1889211648 +177443856 943153771 +837764918 3517782535 +1763129401 348339720 +2143634070 3112686119 +572710698 2516289413 +3401972582 1674069855 +1896674623 3467549512 +3580004445 2015740599 2170659311 1907799907 1268270048 3036048831 1083069959 551822105 +216146627 1205286055 216146643 +226214871 282413926 +2268034802 3250077427 +1263942273 3455275704 +895260749 1304674610 +4158338243 4044623594 +793172347 244173180 +3680288782 1627543055 1627543065 +1743522224 2519375569 1217609756 2519375559 +346959830 1681214951 +2425457553 639546694 +140833478 648505521 +2705775734 3187889792 +2055734151 1570309533 +3332882504 34845021 +262802955 948372782 +164564161 3976927277 +4947002 551135455 +4121962933 2035394538 +3036226574 4063478297 +1336122251 3918388180 +1881898799 3276312390 +1447239726 4188776550 +1672917291 3333634974 +1107921140 3909261327 +3246913353 4060760056 +4048343451 1264852773 +441422133 2688652924 +1138339666 3430858420 +2112948442 477163325 +3969483445 715703036 +179483817 2152883736 +2203067073 4277159469 4142938522 +176069728 3847236389 +1235803152 690795717 2362305768 +592616278 4043999345 +37500537 255978615 +3060600800 229637555 +4112725172 1221647828 2590766927 +3666677005 2335324475 +2071370080 3149099571 +3040313679 568198792 +3653110189 2615697938 1932081988 +945194899 4248920786 +3983800642 261186293 +3726065165 2419367282 +3791779705 1108906856 2326802270 3879522543 +3729501773 1416229632 +3490335434 1244904429 +2391718707 2233930836 +1346102459 881727877 +2482099336 1840353803 +2999860738 1233914690 1697144331 +4027381562 241768205 +2892582848 196296076 701008709 +3455020435 3270082170 +4106977845 2438855018 +94055609 2353489704 +3388450913 2526301830 +3838701758 3996252959 +3342211115 3307735988 +1340847435 453928200 +4093249063 966242166 +1299809325 1630445714 +2766455115 3743172866 1367806155 +1287523158 623630449 +3066463041 4219510614 +4186723015 1888408743 +1842064538 1258236514 +3997674383 3715741064 +1396959967 4075470088 +2568235176 2730229867 +2169278227 2176564194 +952156650 1097941851 +4109953829 3212805753 3196028131 +3163702176 2510539812 +2690038689 159997558 +2180285038 3653519848 +2834663510 1350934375 +3518213779 2698754090 3518213763 +2118770481 4283062822 +873617654 4007791441 +1927089105 3348528357 +1233320202 3274574509 +3189891259 1978097102 2809417576 2653089157 173327972 +1807839500 2911172087 +929942211 2570001584 +802836456 1017891371 +2986807313 2994112100 +868378063 1241924814 +1383416910 479889113 +2815369512 3239162197 +56742296 959541029 +1552703490 3830992925 +1235653966 1235653982 +1892664348 3004282887 +3071466647 3383837094 +3119395002 1811330251 +1919150486 1919150470 +2536002497 3044792512 +1620933387 3095566251 1680568898 585675357 159146852 +1907816315 1782110149 +188170563 1794943334 +488382251 4265939106 +4260834184 2606896176 +1369394424 3176107656 +1470451465 37448504 +2738569154 184315606 +953390842 1863756701 +3118166136 208801005 +1320317111 1666546711 +3143376797 2399519778 +2308234645 807387837 3695006593 751948074 +2272555580 3601559025 +2074893161 756255950 +2652674510 3037077337 +3740596013 3416599380 2173105613 1022087155 1581139454 1743460197 3070102417 239164226 1184606269 3040444201 +727272009 2257580280 +2605670255 3975363512 +491943106 3939356031 +3631714654 3758977897 +2748559396 2748559412 +1106707940 3151906281 2817002968 2000926436 726518920 +3968731342 1628426329 +4045104208 3726567907 +2701554252 1203049569 +3036958544 1170791157 +3139175288 85554683 +171990874 207385724 4186700597 +1835320038 463392769 +1449066412 925290689 +712569039 2875397582 +2674148058 3302309163 +343749598 521709161 +991729549 2622446945 3719561740 825873540 986587074 4256223242 2064163093 1845382086 561904871 3032239326 448536622 305798735 1852198389 3802423503 1487173703 536165364 1219045397 1951385530 1887529879 3804447105 3687499627 810776071 546564872 +1531626375 2665906308 +360351166 2380302857 +2807360985 1135766664 1393565455 +1358638443 3865608034 +3359367269 2604809964 +2331485375 2195216552 +3369083375 245721912 +3601929003 599862452 +542487377 938035344 +1069068362 2579334267 +2092753881 911912584 +3996103469 2286811769 +1148934557 1798181410 +1742959412 2694384107 +1022347019 4168504898 +1890404384 2160626277 +4197894330 4197894314 +1566937707 1910865524 +1200492680 748946973 748946955 +785711901 3595822772 +2387250040 3690627203 +1707532323 1527961365 +1923179774 1913781215 +3953759060 1853854676 +425681305 1490286185 2317788126 +2946091063 1015512937 +2974625008 209567171 +1680188933 3079869404 1015982196 +3775272228 1620264873 +2377019203 1644313085 286758192 1285105258 +682967535 72796984 +3553735942 609493831 +1253549624 3422151876 3608848941 +3150065332 2672749343 +3838715652 2535333155 +3757400100 3757400116 +2578169973 267055955 1583347754 3138628122 +383693545 3918767310 +3028426526 1188494399 +3778943340 846061719 +1597471320 2277451251 +3155770583 4072326758 +4013221563 1262958706 +3216519232 1326076443 +49770136 2900106572 +3616147107 337609395 4048056981 2071722298 +2534420639 1836878408 1686179361 +1645531687 2378617718 2378617696 +4013683540 4016049465 +359436317 3605454242 +2932585056 2326383923 +3048814894 429156281 +3435413638 3740373729 +961922768 302512483 +1166878189 1781707794 +537056203 3579728693 2855865447 3532216892 +3472100969 858959694 +445946402 4193166211 +3264298974 682068607 +2802901652 1276080617 +224980089 1842558283 +3032708690 1613928173 +4108435862 4108435846 +3640306231 3640306215 +2987728694 2369790471 +1967942793 3122909934 +1296537342 2779951583 3075342878 +1326218555 2879988722 +852555068 1208695748 +1778568153 3144083102 +680164975 680164991 +416615083 1327846767 +3511942850 3511942866 +1982423216 3005429013 359436316 1982423200 3005428995 +698074547 3432701133 1837197600 859322586 +29459045 4164166470 1103100023 681592044 +2951015263 451970667 1831207042 1147045534 +2813041186 354657173 +2536002520 3430677787 +2699078339 1477246128 +3828487041 3151279126 +3837350857 3636389240 +297023426 2469083598 1577143773 2696136309 +769210488 2767447291 +3193904081 2159593990 +3238467430 2601547617 +3675296188 2534763239 3600927984 3350681969 +2420469621 2072146188 +2165636887 1448840852 +2123095369 2133678574 +4290894984 783039845 1774466385 +2724236136 2199995984 1329531292 668517781 +3736160053 3323140202 +1404391273 4110917849 +3093769287 2868442948 +3060220285 2710312916 +3696340536 3696340520 +1874485432 2590392763 +2011663798 2005144967 +3419732107 2934059960 +2162640211 1058152890 +720650760 3199659299 +1776727514 2419082795 +1867870437 1867870453 +2044976299 2127513455 +829095738 91211869 +527327653 3138954973 532919994 +2949450604 734591745 3999474304 +990393601 4008407190 +1240106773 1899144714 +1340580846 3081179055 +4202311043 3512050997 +1748910572 4032153728 4123753729 4123753751 +4256619234 1222283733 +1668512939 840803544 +1076563280 1405482211 +1338407543 208849222 +3734567191 2177900326 +2230223024 1434890251 +1666158060 1111255703 +859636033 3926456662 +3978932204 2294782720 +3231426428 2970134577 +1709066030 2330594681 +3740739736 2534729549 +174688343 2247121364 +364873773 364873789 +3839517508 2278179871 +845987399 2195052868 +590392425 3466553678 +2138466176 660926085 +166338244 1603169951 +3715444262 2992247142 3312952791 +93417080 1005643515 +4090592381 1480169826 +244010030 244010046 +3917313636 1353265743 +3045847111 931095242 306921430 +3160735803 754924264 +3366599458 100341379 +1591620304 1591620288 +317725894 317725910 +1200375926 1291713601 +28322372 3964832031 28322388 +711926521 3321105896 +1088425184 11814053 +3855180251 2163312031 2533690308 +2687116806 676977505 +463960262 1319313313 +2388500026 3611395331 +1267056844 2640081052 +1550111649 3963742229 +2339960295 1986730678 +1069594477 2504992210 +3787721728 673249832 +2666278546 3275008301 +3280980250 1309774666 654564067 +3077640505 4294843560 +3781131949 739555224 +3153890381 2997153895 +3436594974 2471621673 +1733781106 2510374673 +2309475063 2854519494 2854519504 +2613381630 3671665506 2542808351 +4341459 994633274 +402629999 913403310 +580750989 185034738 +3641859776 2011899973 +729425099 1011346324 +186761345 3211566100 +1913494808 2741914829 +3298487437 3379258367 216162802 979382244 +3005193069 3890391506 2716798811 +3303765795 641949319 +631259213 2183658747 +3759444250 3663752162 +3199660178 3199660162 +591322998 3006524247 +3397190546 1422696133 +3578101629 742188873 607967934 +2808522608 2227572367 +1291608099 179363993 +3388420724 1680108687 +4207280933 3937858362 +4143641589 4143641573 639289741 +1640465859 3222776634 +1423467406 514111641 +3158001795 2061840496 +2277772825 4106809131 1084969423 +3788781631 3222571838 +723025407 3599652961 +1575866509 1784630756 +1614776434 495381854 +2806672847 2860101208 +755168668 332949030 +851869399 3858039797 1317696578 +1935385676 2922040939 +3190781971 2008679916 +4226614852 1790702905 +1467581664 2488020133 +205878952 3019454026 +2186660477 3795144400 +2443293049 3129631102 +2619684709 796119690 +2659315694 2813200210 +2957106320 128857781 +3013056985 2426876062 +3629563130 2324397469 +2996219951 1696768364 +2780745433 3294601096 +1298016520 1097154515 +952821452 862540577 +1515545434 2457405724 1060617601 +1197346687 217372970 +750414987 4101562050 +4020393398 4069322129 +1009167599 3122401595 +1989203827 1811624183 419637772 +2631433414 2932632481 +2885471991 3053047504 1212191075 +2365170659 3489463882 +3340685712 1274307968 +2609697921 1605535510 +4241632690 2690616653 +4095677238 2196454929 +3704129494 672452970 +249833773 2653737412 +2069607732 1700675791 +3736862875 1022686226 +788701091 2753645980 +3470516805 3911529114 +1233161622 1264509745 +2131986656 3955259571 +508631899 3523451656 +3037307956 3600620681 +1957860170 253621949 1957860186 +2077356873 880933870 +2444827780 3932677065 +871310413 876329711 +4124353076 585845385 +4079044630 4009873317 +942359211 1560918387 3231759648 +3959319641 3666120712 +813322505 1770891848 813322521 +3707381571 483790128 +600640226 1036526019 +3534210323 1726926317 +992077988 3126934057 +3380974450 1609681165 +729738627 4224705852 +1366825402 4248258582 4195385309 2089618 1928932501 1192519707 +2662461614 2651499310 +4011303610 224348273 2153387654 +421560396 3660183479 +1573294176 4287973171 4287973157 +2320837735 722789942 +2050491347 594678115 +2375797919 7628646 +3891668521 3614913934 +778009856 4135872689 +1096084484 3702491721 +3029297388 2959811991 +3373606991 1887196037 1461730745 +2213538496 1363305485 1108216601 +4185839361 3282859648 +3539973999 2542650296 +3732358016 3049210515 +2877377264 3968399299 +2004757346 3488189689 2107525973 +2137217542 2405873505 +3815878173 466891797 687151010 +3011967679 1551678120 +3883549999 2491082990 +3861561283 407625706 +3289844785 3779604784 +1241258847 3431142989 +3384086365 174643249 2483836208 3842453364 157865643 3964639042 +1917548992 2899355987 +4269956591 4269956607 +2031759162 2031759146 +493034796 1862724673 +1958992339 2739922732 1120463447 +2700780749 932277924 +3589483436 2043527105 +4204260251 181241182 +4048081183 4104205278 +3924261155 1162495894 +588037719 3088729768 133824157 +1536831883 3199991234 +4032409373 2049878690 +358232658 2958971390 +4225879203 2513360962 661988490 3300612265 +2766807901 4187335540 +486008258 1547612259 +1909246848 1909246864 +2143541369 2588788328 +2851747539 3558826285 +1665945958 3840149169 +390046284 3844898209 +3961577054 364776959 +3751636392 3877245057 2899550076 2899550059 +3559027642 2889625035 +959187937 3780555574 +567148826 567148810 +303432180 1822757657 +1249721556 388415919 +127007485 3889044546 +3253809058 4037934101 +2194469824 2829301587 +1706971697 1536910128 +233788432 4290860323 +931701974 61088459 3800720857 +2873047832 1716039271 +441391469 3615819410 +1458343897 182465131 +435126986 3324306469 +3222634013 2127923106 +1346893618 2471109555 +2652005295 2247289976 +2560170512 2560170496 +163242335 2955987102 +2896035720 1195827357 +3050119023 2699590584 +22777706 146428371 +1826946829 2995963506 +1621848291 4041441232 283293020 +404460821 141275146 +3701947265 1133569191 +3320750506 1084784283 +3714146857 319476110 +804932112 2533529397 +829315665 2599397878 +153908102 3260368326 4143569911 +2831265321 2807086980 +142675970 1697395509 +3191484760 3449531789 +2564410612 2195557119 2564410596 2463999001 +4132992899 1346642748 +2668682812 2743982193 +2012229144 3877146587 +1896364034 4059048757 +3299690824 3299690840 3838467147 3838467165 +3353470323 194779850 3353470307 +1790283095 1233151700 1233151682 3940155086 1998701429 3978728669 +358166578 3446070963 1051161655 2461573713 +3377704661 1800286060 +544788209 254657894 +3861297283 2683783671 +1361723701 3369203916 +670996112 2244412597 +1495021857 1527721297 1752035062 +3270393557 2987190620 3270393541 2987190602 +356818373 1074027802 +3615702010 2313199261 +1236835662 1537188313 +2813060788 391316436 +2241827782 3591250106 +3219763897 3588512062 +3042552652 3358107809 +1955249436 2520708772 +2539935909 347141597 4160195514 +1604121489 353594704 +1827667154 797884794 1338703507 +121041658 1569238486 1434484637 608749525 +560838674 2981676115 +2665952083 2029374394 +2589245983 309171912 +4068303632 3143817491 4068303616 +1402425741 607477988 +1997630745 2305736264 +312744526 3059057129 312744542 +727468840 1783255037 +496157334 3759756151 +405915849 3747550328 2759463775 3480089404 3083778421 279783726 +2853955397 422753642 3160033388 422753661 250417562 2328478275 +3758445161 3758445177 +59408291 2833779856 +1600007695 809664912 +3798180290 3798180306 +2986086922 2986086938 +2147978402 2788011911 769811221 +3204979228 3586202129 +1777027019 2288125076 +3017475428 2244574335 +566766419 3949287383 2166109114 +367286867 3096874442 +1341072590 2742480975 +696641301 1925891612 +924202731 2734191586 +2615164551 1322513284 +3339926754 3393896741 +2189119084 3922369943 +2992422076 412471799 +1370326900 137116559 +3590448241 1442487792 +3672517203 3047160561 +587565416 2291200899 +2431835747 2673763076 +130993663 597588154 +2247133932 3199862780 +4118096059 577707634 +496533173 2035445615 +1181513223 2211034884 +3806767886 1059014415 +2732681023 2815789096 818910292 1562728188 4156419841 2815789118 +1789611664 2074913955 +853498133 2878990964 +781920756 1380125456 +4255280061 61840002 +3472585303 2202883010 +2848797746 2148084403 +1178723657 3688749486 +2691271636 2761252136 +3185455420 1016312441 252758819 1483079939 549945713 185648368 +824236021 3595390348 +3069771026 469132115 +1911384551 3808520917 +222866739 476620634 +420427561 2616448408 +2995710529 1744493968 2995710545 +1774697723 1374823848 +2109306777 2621635689 2214020574 +107533254 4119694272 +169009310 2042075305 +1235888746 1625343181 +1512581546 2863142419 +4161050441 3090819054 +226526983 1213501462 +1580850187 2311233677 +1893167185 3716526049 4096118662 +2015767940 1768001144 +3193960469 3670063789 3323169034 +4291454302 3110524958 +2189068985 535322920 +1559496835 3609814588 +603324023 322934086 2635599092 +3057615890 4160546899 +1506579813 568214217 +1755603333 1069909068 +1131488136 3004886813 +898495541 2205642602 2205642620 +4208335410 4208335394 +1365662756 1210256575 +1006848666 1022848874 1022848886 +3362607597 1897396228 +2907966740 886890601 +2940773833 3093101432 +1493627416 770638475 1493627400 +2836606965 916678029 +2425534180 2048763599 +2040585322 3795516109 4258850501 +1668769373 4059440226 +2204709567 3268595306 +4242206173 3919868660 3919868642 +301712674 1268536610 4017752637 +2828241150 1581295561 +1612619923 507218698 +1032167625 2723945582 +1985547254 2602904534 1143854151 +2742909988 2190109865 +3206889227 1298670731 +384449734 1679331157 +4134536245 659988330 +763207410 2395027173 +957930812 3237483884 +3347346073 2451697534 +2012761475 1591870780 +2142634158 4166335278 3112374767 +4205164646 1638221222 4175513751 +847626158 3465581103 +1873810580 3610178537 +3847508378 2646373757 +4089634015 2800539019 +2773896353 985588888 1932274897 1932274886 2593409287 3889865078 +1640493471 3697662027 2361482568 620514456 +1667511064 2394713819 +2481646562 126384621 3167835338 +3210951115 338950786 +3262934454 3756045703 +619307683 3207579292 +1804158446 924390841 +909083488 2899038245 +4162636853 1335392759 +668503540 3697310815 +3450314493 3151972418 +834529935 3707256600 +418430364 3740957831 +3775515445 3775515429 +1097761158 2264262135 +2066959768 2311267917 +2191647764 736066063 +554168083 310205178 +2327250132 840735151 +320692104 2671600395 +1459282976 66383800 +2620182205 2542367618 +2606125993 837137166 +2258348048 1955836136 4144599331 1820294443 420451947 +2237374291 1111216058 +1397827687 2411895328 +3032390403 652879857 +2084849019 1313399898 +1362091919 290115547 +3328340129 1375522549 728914815 125723915 3062551626 4292776553 2850355715 1470913635 2146328817 +1559260545 1056816221 +3748938191 2466486478 +49208937 117972824 +3279597377 4213302080 +3076055236 622446558 +2157954969 344405470 +3641720109 3784330706 +3691973117 162481879 +3186749743 230408578 +29611896 1061958125 +1154437505 1553824227 +1879545574 1106414593 +1913637174 3302604817 +823094609 2353600144 +1212644072 481557175 +1997604028 3769926759 3913951212 +2027265802 2027265818 +3463647300 3877361544 +1172285050 2031292939 +723724823 749285780 +2157064917 992347484 +3222256792 1417990693 +1193060970 1989976971 907044907 1003588666 +3596131664 2983698512 +2325938779 3763758399 +4112090648 2631489708 1385133989 +2040003200 1119272991 +3202244215 3202244199 +4171014881 1285557520 +214653707 790647380 +2750883057 252651366 +3545813940 1758807129 +891152995 18348490 +1723962471 3483015219 +1704593975 1383752944 +3657353411 4011199210 +3496006922 3226607717 +2217196959 887653451 2844754248 +1809782038 3861787057 +1805691046 334069057 +2120896487 3898329270 +1078683028 3400591353 +4243875727 1009964507 +3099923932 3124848977 +958638289 3290611974 +3828461424 1239178460 2855742805 +3766247695 1348660571 +1610983716 4262576892 3115522411 3157623577 1290355647 2771598862 2905819812 851188265 1631412296 3157623567 2889042206 +307328520 3728526987 1975074695 3728527004 +495498198 1412635111 +1564051205 3331296460 +1810927701 992449800 +4130320087 4130320071 +1295472426 3088987917 +3246329599 3712001212 +4105806609 1362867152 +571759437 571759453 +2628624539 2339622386 +2265984038 4289985286 +3039962491 3102802098 +1933178697 2855353262 2906671096 +1333842823 3338380194 +1878294518 870674510 +2442229031 1325100128 1325100150 +2355977283 1395146090 +3058395809 1946254022 +3364817967 610435476 +300319805 300319789 +2477697538 1823255069 +3584987537 4030356339 +80899390 3577870473 +651462733 2948239794 +4222875049 3846945048 +5039179 3289080322 +338972802 338972818 +3276978234 3040346973 +885487777 3070420320 +3902649828 340088297 +542566964 950719112 483569625 +3941219213 1519228658 +1399277046 3611438616 1900472914 +2672070755 468667356 +3602356216 3602356200 +1460977591 2778497513 +2233919026 3460063397 +3947859763 3947859747 +2875848096 2009967347 +2120649685 3496878154 +826793629 3151318635 +2312970601 1880856664 +2197105491 2124050762 +2072671151 703863918 +1558689990 113762209 +51092711 2991062966 +3843868440 3293407949 +123057229 3639268658 +4143057747 240269270 +1725707620 264913950 +202428374 3564580337 +3172725582 1644560079 +1303893957 2325915232 1640321953 +3017632518 3475233494 165529927 +1686913083 2210995428 445431756 1503165160 2366859269 1503165183 +1634208634 3105412181 +3345207736 824233920 +476399596 2674931863 +225335713 3040575952 +1908492602 1272885910 1296451147 4037060610 +317881374 4055458601 +1189809560 669307278 3982683139 2586017389 2961530322 1082170450 1245633225 3533277710 801855016 1089009779 +3931001462 1330368455 +2212985333 2590309546 +3592471874 1469482723 1469482741 +703571355 1398699118 +2330848652 1082979191 +3718081175 1976486822 +2610791176 521967139 +1547253226 1006410834 144701727 295700280 403693389 981052561 3813078084 4142619948 +617707113 3634347776 +47565183 1941185340 +802634252 1540382967 +2499202726 646401879 +1923884305 3848753824 +1335912105 1367733247 567833 567822 42048526 +4230306066 2821531245 +1771717605 584638828 +581419766 950287063 +4146723245 4267666459 4253929989 4253930002 +1165669718 762012727 3071197830 +2003568858 3641831229 +1484912875 1683198869 +1340167954 3518763333 +13663798 3487416212 +313958798 58741391 +621980260 1034124500 +3451855872 3823479820 +2874778451 287054757 +2570935170 399144842 +3606976773 1996579532 +1028202920 848889486 +472384739 892012615 +1830959871 3420643198 +1086310373 3538398572 +1638658375 1745863762 +3020257525 3167573645 1503488426 +234067915 3245864084 +105202007 906353648 +3270264945 1257638384 +804932097 1367142482 3136218964 3339297831 2985220390 2281865088 +3496987707 581232382 +1924162072 1924162056 +1876007687 1702696435 +2800614499 732188636 +2190886233 2134914062 3952028446 3697492367 +224931183 4114579643 2315224504 +3998402102 3470072601 +1427717762 2025678517 +3487447005 399634676 +1869807053 3887579941 +311161924 1985054473 +1952944585 3653695071 +428886056 1713477355 +97983265 4155147440 +1522605319 3842028054 +637155929 2166512937 568973854 +2434889983 1096949436 +601575692 2695622967 +1863640726 1944518183 +2074428491 4029317634 +1392380739 1392380755 +2281710156 2056772363 +1983054865 592406214 +53896450 2171747214 +2319782274 750423971 +2507414579 1802886484 +3185972770 322230165 +137682779 2246102548 +2694151318 1632837681 +2031407635 181220916 +4150009621 2303059260 +2958674184 3853601844 +460441736 894174400 +432316166 2525386359 +518138154 3355888923 +1998271701 1423190870 +498752695 3001581801 3758961972 +1916976228 1125028223 +537755613 294999266 1563605954 +2840316172 2387443169 +1643849202 811383781 +159374383 591896056 +60975506 986524911 +2133404578 653399210 +3877104689 4222144816 +4194340538 1222684381 2933286958 2933286969 4212406638 2674409567 +2571836065 3435180301 +3292142052 2011596366 +2398943107 2398943123 +3799511264 300502944 724171979 1004964038 355825352 1850886359 300502966 1657811123 300502945 851219373 2346481988 +3095945869 193534823 2413175606 +639522249 3401649016 +2798741339 4138054738 +2251408394 1247255483 +1138967150 1287754543 +1600179461 1495810407 2473750844 +2398092323 1131527942 2836095055 3785701120 +2435812383 2911857813 +2404857376 3326751852 +2414146978 373026493 +800336222 3575086210 1990008553 4126736565 3092761449 +3249633377 1095597443 +2821451269 2189230198 +2893233755 1757144669 +3051467450 657649045 +3817893530 3777412213 +3309124644 662600906 +1898856029 3144277589 2295082082 +630307593 3413691423 739273674 2868512110 761884472 +206805227 1385806324 +3720284988 1337896807 948549179 3520316760 +1675467083 2430102098 1675467099 +1571743390 408226473 216001193 +2394597841 2168727063 2504521254 2161726480 3844035460 +26169160 1126161507 +2520300742 2520300758 +3879189006 179954713 +3750353921 3875886486 +3207982397 3429784497 +840576464 1194455595 +2393441592 3423811387 +3156859192 1843458875 +1572965845 1572965829 +1426318661 438430618 +582751487 2903838078 +1210199850 3083878171 +1865788853 3330307050 +4276421963 2374456596 +3932458226 3430442453 +392296436 3275314457 +1606372147 2595367584 +280559987 3325904908 511208183 +4159620110 1524539929 +2291551953 3583906576 +3841204566 1579509382 1269870647 +1576140642 1874493790 +3040883152 604924533 +1491013312 2804168787 +2542964751 1373776218 +794785054 280882626 +1252636104 1399971082 +3104056802 3104056818 +2255125391 681607694 +110678522 1169374933 +738317304 2980106924 +2625535133 4162726708 +3678452975 367619128 +516373070 3248539855 +2315273260 1785418071 +2688071998 2001443977 +59490398 4076852201 +1905657461 1143745066 +1954597500 592060465 +1658597183 1065112730 1552023704 2121465568 2109833753 1675968257 +2086299223 2655390201 +754309850 1993880705 +2592699380 979470617 +1477258250 2797360059 +539788457 2345465870 +4045002856 308250047 +630094905 1481477559 +1199523192 89807867 +918161201 1473860144 +1420137907 1638381878 4043870225 703255716 +1277152699 3247211646 +1875673812 3539071929 +2465202805 3841545342 +3962335419 2230679140 +536921686 3632423794 +3126420428 649599543 +618546062 2548324505 +2406350545 2603098886 +318921877 3191927610 808784051 +397261709 3548266226 +655279600 1816238275 +3716084611 836327210 +716388793 4045659710 +1707740010 3491962767 +2146125165 3428731547 +1148008346 2787813558 1374586749 1702833525 +2845206296 2667692196 264522445 +534648106 1419464987 +2748002101 232476778 +4069037288 3036834091 +3936224744 1052986411 +1024033024 368448275 +736981752 1085459840 +390826564 4025133343 +3104938924 213963539 +1005186438 3526381521 +2304777933 3404835963 +2926645001 2120479858 2767891246 3835394414 3835394425 +1103341004 3332212636 +4145546599 456869235 4145546615 1641054496 +1920814012 670278503 670278512 296219884 4148050161 +1726150976 2539456610 +3619767875 4228821019 +1422223339 1573033698 +1985146662 1985146678 +2731667473 2731667457 +1059118190 4229866442 +2382228573 3820688994 +2655308653 2657358529 +3345657189 4013399539 +2620204294 3776006241 +2810770607 1805201262 +2945006282 3554761765 +1669795860 1824537692 +3124335323 779539062 +3950436264 4003976148 +3866230012 3245424807 +2837950562 2876942933 +174306939 3589817252 +1427206524 1718986289 +4289355805 2887782028 +3587420758 3363647346 +1815765535 2129163998 +1969105637 1390064156 1480558025 2594653777 1390064157 1363392666 2275121789 1390064138 3996938787 2319868423 2822604410 +1753804052 4031561832 +2884372655 105967084 +1389912177 3684684272 +3546885819 2308214898 +186971709 3358564866 +1271953351 539790934 +2660465189 46429817 +3665548366 3784525785 +3488983773 3488983757 750510244 +510904580 4098191711 +74130586 2393546347 +2025304173 2025304189 +112530095 545914890 +3801363918 2500478297 +2167838800 3102852597 +2614609218 319117149 +977656810 2784571725 +2458481951 460310492 +4273413786 3554995298 +3611945061 3167585081 3050141753 1339714442 3033364131 +3267023298 1310209141 +1079087060 342190783 +1374456624 1153557582 +2407615936 2407615952 +4228946292 1109496217 +3894439070 151714985 +2974781376 3762244421 +3189390907 3189390891 +1055743553 1353408576 +333402412 333402428 +2697915321 3736933416 +336688139 2725883202 +1606140048 2233228904 2749801213 +1767659470 2169780057 2858301785 712337234 +423451261 990821396 +288339661 3676095652 +509818453 724469706 +2837496633 2837496617 +2955951767 2955951751 +1509886021 4051305612 +3937070454 422684993 +2187963706 2490366943 2507144549 +1267221513 1652420383 +3190582339 4258421379 3838980919 4241643773 4183185968 2733534570 +336331745 1877613375 +3332914769 777399798 +2515249865 4020160581 +3053417361 3326729644 3539698977 +2997374042 1830694965 +568773687 568773671 +3395990075 3774255858 +4164594336 1984570500 441721112 +1919232264 490706827 +2682232392 2532056671 +3335874913 1660216246 +2096285783 1701888771 +1053326860 3785256161 +1954134857 415276984 +2198552727 43215892 +712499883 2243547956 +2398499961 2257885800 1508848734 +2646112921 2705314467 +2194757791 1963968033 +2178447542 499517073 +900299739 1422784978 +550912657 1112197702 +2530995507 2021737506 +771056366 3920037742 1196080303 +1848971124 1848971108 +1989738586 215715261 +3533831792 4110643507 3533831776 +4211383286 947330402 507610193 1166229845 +1431622479 1431622495 +1334461419 4041858584 +2884838231 1030315256 +2809093577 1565565816 +3476333187 3423541863 +2842533742 509231922 +3403188600 3403704315 +450011759 464223660 +2836487159 2836487143 +755621124 3934711135 +1217124500 1217124484 +269797526 3870802983 +45219111 45219127 +1196588732 48071160 +376018268 2755010513 +4266837835 2807020290 +3724113665 1890997888 +2444579046 1181637121 +4244119844 1587293097 +1631102214 304859233 +1711516059 3331048837 4002050911 2555320168 1727883451 3689668210 851705604 +2046466029 2046466045 +1172491853 1054066495 3320924068 +125794504 2455317452 +3012312853 3133623818 +1083363342 4161720725 +389037347 3018872666 389037363 +3250345335 1920633424 +2629088387 3804513213 2397164673 +2205200430 409294969 +1699371405 1210393275 +2686417903 1652405206 +2423732676 4132997508 +2995733696 346139947 +873672853 4214220602 +812658084 3835156799 +1833135717 143801952 +1540239103 2224290686 +2236775921 3283912321 +3858541595 667086482 +2448283364 3049113304 2640922857 +3946747809 1745454179 1764814800 +2572515413 3062656458 +1318564512 2979564411 +2340079743 290037758 +3705590374 415577729 +3237448741 3937508908 2946241866 850112483 +949199285 3311898614 3311898602 2886176090 2681843987 +3067756021 3465513130 +420990349 3181797490 +506784911 4037916582 +1801707215 3711418328 +1842550529 1842550545 +1873161857 2203357606 +1367678698 1049602651 +4192712186 1640200331 +496569062 1371741233 1021749521 2457374434 +3088772270 159447835 +220767961 680526408 +3672164775 4210441017 1050297252 920482294 +2315834820 266896287 +3043018085 1158095936 +1096714618 155091523 +2496953119 3961151905 1769853406 +4068741156 3924125865 +2389474169 222843720 1296804910 2092793071 +211532303 3894797710 +2027182184 2655464363 +85216014 217196313 +815219486 2619254847 54713129 +388593775 2839888827 3846739640 3846739630 +2130900223 3341793239 +2597843520 32660179 +2740262403 569484970 728332784 +252993043 3647712185 +2648879657 939756019 +3100061854 727333054 +1109850004 3075980793 +2672818458 3840222187 +3814205226 904560137 +591207207 2687614560 +2855400821 1638229820 +243472887 1192449122 1164826197 562803369 3479297990 1192449140 +3615558272 958511871 +1533669489 2766896384 +3791711978 712919936 80316318 658537897 +573424312 573424296 +1878722596 4179591259 +3873812732 2006293681 +1171561674 309367902 +3843235137 3726052672 +3626491552 716347245 +181666192 1839237030 +4166702088 56414005 +4091130367 4112217258 +556033981 3914288788 +1044651838 1867535931 +2538275252 3742608975 +1840663530 2683928909 +127384483 3626003066 +6188845 3249079250 +3084610897 3211597446 +2374893865 3609069721 +749594426 2411921483 +1374228422 855933825 4266868860 3085161633 +1416448961 4050937703 +4066128387 2317531818 +665364712 1451353396 +3555766874 4259890091 +1615272209 2699851216 +459239277 2218551428 +371389313 1510298624 +1114756651 4155001261 +2354415603 3718579098 +2967092892 59805575 +1703499641 2029591651 +8064509 2082293474 +334235892 855819068 1503632987 52333748 1351751705 93320600 +3467509619 3467509603 +1309287584 3856485741 +2603345223 3705735008 +2642871772 2642871756 +4021811710 1553894089 +3273160174 226600377 +519251734 342882037 +3738745395 795606605 +3486436148 2303816654 +2326247320 3497575731 +3249709540 860774760 +1724267547 489261512 +3461676723 2194469850 +3923163121 1092397431 +3917110466 2515040989 +3389116811 2346507714 +168947985 425721505 3946741190 +3970652552 431878429 +3414560177 352816560 +826792282 3151055862 +2226252462 2450812921 +457221084 4225540662 +2552319052 681347425 +974305427 4269313914 +788695182 2398943129 +1407798638 2252661807 +633984934 582908503 +551830902 1029265617 1029265607 +2913664371 3163257316 +1081428989 1081428973 1137589288 +2456938071 3763182310 1452439960 170584020 +3010413435 1791053864 +1168158186 2247214925 +3588182588 3935204455 +377093109 1460118179 +383203925 1397007558 +3999751754 142413269 +1773996419 3519134593 4246165862 +485929033 1205508341 +1553617375 1553617359 +280384505 1208365310 +3998098139 3722537165 3256257891 3967849181 3850688718 +480441622 522660847 1039569300 +1595404593 3210718908 +2041917599 926648926 +2519983816 3654615028 +1611047968 1611047984 +3209986486 3209986470 +2229267063 2944522467 2742950224 +1241300834 1623023865 1627379118 +2780621803 3546768116 +1182799017 2761983512 +175368535 1047274178 +3631088674 3610280341 +3688848296 3365751147 +2793000133 3602733594 +2582258261 1810562455 2467204844 +3766003842 3757130933 +3025955497 186182322 2776945531 +3297532601 2940167326 +1002192892 464277927 +814177718 781857687 +3500282674 2703505331 +2381233231 1937771185 +221818860 3158110344 +698249275 955132671 3211439332 +2046216399 3464371662 +2760222057 259450574 +1038365969 537260238 2134870479 +4004626948 3319032905 +626207860 904854159 127513364 +1940353811 3083051369 +2951160949 1574855740 +2554925496 4029169679 +4267833543 993698134 +3041911506 1052905605 +139954984 139955000 +489625510 1526439761 +1148673173 3119140072 +788154503 2063608982 +1050365702 946359623 +673627442 2424836306 3513870555 +599001117 2877945579 +547863717 219019180 +4223690473 954335448 +1235754099 1722075404 +3859528864 3296325605 +3276863962 1338234611 +1093024413 741229876 +1778672010 1778672026 +671209078 1894030289 +428238213 3012677708 +2183118735 1727696398 +3222446065 3116271278 1313982575 +4007355193 1012740776 +866546047 962136892 +4225879211 16112853 3917247704 796209442 +3045198570 2780245595 +2890596468 2665640649 +3457508952 2453464021 +3812713334 2938376001 +673249927 3001705088 +1564373676 1805319104 +361970527 1439069854 +1983695166 1983695150 +1483299380 3397907450 2618724883 +3874336930 707596063 +2211240269 1720739890 +493364545 2347935062 +4175850435 2512102396 +3720284967 985566838 +2870036939 3113792704 893839789 +581787483 581787467 +4165360991 902102152 +202428363 413807998 3658465193 1152077055 +1965480298 3592962509 +1726426761 2263761336 +2847378467 706629923 +695227282 3453193925 +1291672019 97806138 +1325399596 3883414359 +4227245413 172383724 +4144929305 918431600 +2729275615 2506806291 538511889 919046498 2567542582 186181866 186181878 +3654692696 2988049105 20886177 +4092299766 4056559185 +2141628555 3116588412 +2294976438 3422401942 216021895 +1601169242 2536059581 +2787147718 1260987575 +1052396652 726027777 +1487778859 4101072984 +188036609 2308023601 +3005684215 4253933520 +3691383026 497090777 +1520242913 3060809076 67668317 +236779402 3248074285 +777840332 1555029239 +2253055742 1709810121 +1530195802 3998534315 +3778497735 1359863126 +4291491086 2585994170 +3751636415 3285435304 +3131202994 3131202978 +3164579063 1694916016 +2950894092 4269113863 2950894108 +301721085 1284181332 +22533063 1420464793 +1704652354 664479837 +933198241 1968494143 2829163386 +1478493383 2171045184 +506229241 1803382216 +3672632471 840528294 +3974001965 3282680431 +4122897278 789920738 +1733389077 3123417610 +2453482089 253653966 +1730194932 1282529049 +236572611 2854168998 +377685939 591732442 +1938465793 3829411222 +3406466493 1587355778 +3879115196 4079001969 +1882294849 3741099072 +2791603050 1512982491 2330326694 1512982471 3520798162 3520798149 +233028470 1034562962 +3905891724 1489396128 +413163923 1467587194 +1240993200 561875971 +1218237057 3487523094 +1309214426 3047927477 2989869373 +2275564030 2973872794 +4248383694 3722705490 +970228872 2441912861 +1944706327 2418477862 +1713139134 1833398258 1713139118 +1393753038 834253474 +40745350 1488653793 +3611236483 1532204604 +1008076034 2561270307 +540465202 1927969741 +240668240 3842197475 +18882630 3789610449 +1878258246 2198234145 +1454133991 1454134007 +3873639594 560787341 +3791367762 3791367746 653364986 653364973 +2600544925 2681607476 +859974280 410536355 +1071001284 1071001300 +3498261986 2963511567 +3149249231 1310004174 +95957040 2883446980 +2897125774 1692947097 +3220070031 1207102744 3007240984 +214344284 2024904401 +229389455 2783753528 3874808585 +1258052869 1807061499 +1993191052 3574496096 2972473308 +2683366655 432059050 878264717 +2458923971 2080472042 +3959533633 3349706304 +1800573505 4016704267 +903051235 2665855562 +712261341 375198421 +483895050 1903948973 +100329656 570186171 +74216773 74216789 +3911226353 4014531686 +1285491321 1177221704 +540389926 3594006309 +2821894995 449858490 +1283247324 1148616273 +3267804589 3267804605 +3518889223 3717206005 +3650633734 2427242871 +3650889421 1573983396 +2556037687 1212556655 +2186990775 3959217158 +2541697792 2845674402 +1378204568 851398447 +1566182739 1566182723 +505450398 3648213312 +1364871918 1419390831 +3848881530 3812464646 +3709151666 2282005053 +2228809165 3826468883 +1873806544 2719454051 +3805351371 3659052674 +907771521 2923963648 +135106877 526811979 4030831650 3931874050 +2950831268 3607810168 +3920639532 1855041302 +1264561585 593925642 +49770130 1707264947 2570622893 2614099956 371346270 630104595 3854085085 1754189256 700683219 3336886662 2657758358 2086202697 1837735975 2243838051 781127591 983301787 1932370369 2147182230 2993483778 1785042642 2844619652 1955237551 1347972998 1588363568 3323318843 853533379 245709648 +1848127616 3913570693 +3571404961 1179046086 3571404977 +3919346157 2149772370 +3134340366 653663503 +2708024908 4123799648 1687413153 +3241302761 3241302777 +959287804 4273786791 +1704359722 366843661 +3444224528 2510205035 +2463523187 809809923 +3621136689 4146255910 +3384370527 4145533450 +784222450 809685726 +942008273 3375816177 +716503641 716503625 +3768425225 2702905144 +2345532501 1782856138 325515514 +3894610206 3894610190 +3422848982 18994673 +1241301680 1130651080 +4119425599 3453792164 3328104744 +2503838355 2195793274 +2649876588 265347607 +244378558 244378542 +3863870887 868634102 +1102995542 3568412519 +3947769104 1172285416 +664622295 3366206019 +2005718717 3661959056 +2339500761 1566657416 2653555134 1680569445 +268628086 268628070 +1226661927 2183986739 +2451288040 4093623811 +3032711924 3339151820 +511126730 3214639597 +3752824428 2371695617 +4281397368 3612787279 +1864312827 3200684793 14716670 3664023627 3895719147 3502760880 1228391231 3097034131 2347179409 3075523740 996289180 4114022292 +3494743597 720026258 +1281716121 2251507019 +435330561 2899399533 +400956738 2972927337 +3088795618 3035769034 +2762863749 3268930906 +3139165957 2447381722 +3326458389 3092369257 +2441041429 87702054 +1427285841 3701633058 +1676309361 3138632422 +2305612548 1516029791 +984814691 3404273610 +702877159 3667190432 +2271685633 961253741 +2194683792 2110224309 +1998750703 2052436280 +49454087 283856147 +2760186291 2760186275 +4049675631 3360044817 1793977784 2829995586 210581676 +3185648700 3185648684 +2582458396 1818410001 +3740805735 1739243574 +218026981 1512542572 +3319926202 2333136686 +1421910323 2654847820 +1133458079 4184649822 +715256078 2743143698 +3620184612 1030661135 3989257470 +3802063298 927270859 +2681816266 2681816282 +43377485 2909201572 +2611086669 1292785700 +1774958307 1051927274 +156012623 466273168 4068944977 +3289712495 1442802961 +4047834478 1035215919 +4088819599 925998616 +4101389411 958468060 +2407510676 2047221489 +3045791365 2881313615 +12214494 57048425 +3885547694 601226041 +3444568544 3957440728 +1850057600 396386963 +2728730173 1190042114 258200139 +1454841037 1329747634 +4238370605 1883821073 126111836 +2096249534 1867675913 +3367991177 3367991193 +4085933420 3470633239 +1349395292 1706972167 1706972176 4183927249 +2033041887 2718446081 +333629296 1699343576 +3424806671 1764244632 +1123119597 1326864388 +2599161753 2057080264 +3174880258 3905011491 +3107719806 394560607 +1641620226 935484926 +3549812307 3549812291 +3330955888 4224474691 +2540825011 458417370 +3071383455 1018621532 +2219646791 2355641558 +4005431945 1579849144 +4074951011 1037363745 244782150 +3026474134 2414946343 +3849635214 3849635230 +566528905 2976360632 +2592821617 869680662 +1604509522 3747974675 +840180477 3534951490 1757114487 3971678418 +681255050 1143956690 +1524133114 4239625629 +2129695770 4005111019 +4064079262 2943794075 +585013168 326943944 +70260728 2411051899 +4291036459 3308431275 +3757365221 1936711034 +2131712419 1380544580 +3983824849 2670083600 761301999 +1022884160 979197907 +1153343014 4007199078 1578300887 +2800819584 2700353883 +857612552 2154692509 +2633273538 3620720349 +990768294 1573467110 2632681793 1573467121 1053215322 +2122091457 3742367936 +1413753238 2817692257 1028486951 +185296576 586334277 +1122218973 601231298 +2435546718 3849842175 +176177073 954483622 +2019289062 1429068986 +474478573 4270168644 +328864710 2710380727 +1669486736 80411371 +3561546689 4022241494 +155625391 155625407 +1460227061 300736909 +3276568747 476181812 +2436188535 734777315 +2426216742 3445305047 +1759575094 1759575078 +2362239142 3778449383 +780420991 2186400042 3107753192 +1169305451 578856290 +2595458811 2208961842 +4066772775 2313293694 +253945991 1525943424 +1415597867 4271677620 +2661680336 2661680320 +93625286 2398173367 +3311562550 1462682102 4053777464 2550237335 375865255 1680757480 3485484972 4109590987 4161553222 +567236860 896079015 +802079874 1878418393 +3715564224 1650021445 +3468554613 3468554597 +231471964 476822380 +3125818827 390377117 +254093429 1283371068 +2498288514 3968961973 +614356412 1631647473 +2141920124 1985758257 +4125298193 4125298177 +1087211249 1568487318 +3014396460 1203838784 +3065192944 914707293 820132724 190915144 3035366792 914707275 2348707011 +1682437603 3225949276 +26149199 2061835408 +1483109724 2236268487 +2842784366 731325222 +1828600393 533212388 +1966327013 1088085002 +861631009 1915194950 +1305550020 475811024 +1777548222 263722206 +4151563759 3612648312 +2065413526 3118896454 1729298039 1729298038 1729298017 1307605162 +3673994329 1272636733 +2261323654 2261323670 +2102340499 3600914540 +155965826 610756515 +359769684 367580729 +2175317842 4219657015 +1258168573 2515596008 185462338 +3176417676 2544879457 +2716119237 2684503578 +2328057585 3013361271 +2931593755 769261700 +3612648312 3129882111 1916622308 +3121270335 503491902 +642244879 4006612721 +3308007074 109930755 +3050196157 369963825 +2714360271 2746465327 +2115155265 3012515430 +2341697495 1598462864 +4000124965 2058381882 +1130851434 2244979410 +643872106 2102979793 +3230572256 8657573 +1329442199 1427653798 +158512856 3080050203 +989301608 1001419965 +1131242833 2647207137 1983282822 +3572786443 472491129 +3640137999 1126178651 +3407024315 3407024299 +569921363 3437551546 +238874050 2295331369 +722833177 3958391880 +3435979014 2717847939 +333733927 2208558592 +1383243833 57817534 +1949053904 2979369059 +1106772256 4184458596 +3356547446 1753634001 +2977997109 369877916 +3230699844 1737797151 +929134547 24092972 +969427936 3595530661 +3975176409 3137589263 +413672785 565362320 +1241614126 2926038383 +3320441719 4196897577 588661236 +677405200 2808340604 2679791413 +3740615761 3413567895 +3295140353 813445014 +919629528 572423707 +2698591299 2029641066 +2715978015 4137540574 +3382042307 2783184561 435006698 +1353762565 189353164 +1368739451 1368739435 +699315808 3546386811 +100102963 2146843561 1716269064 2568727020 +3026014533 1262811308 2366758105 1317744490 2232537155 1080057540 870772620 1317744508 3876411528 +544664085 808615690 +216783117 1682354020 +252234382 406982659 757683070 851630653 1573479082 1712849157 12657684 +3359682461 4001980976 +1221884715 1594392537 +2559698712 1169083099 +1980029812 587528212 +106819556 3923813375 +895048170 3853028173 +2969173358 126481455 +1324439470 4092397295 +3162544327 1146498402 2941997833 +2417422933 421487244 2417422917 +3956999589 2714757853 4006208186 +1083959807 2404285761 1987344316 3027328126 +1093360954 2131774798 1826757725 3919078299 2947206645 3510878786 +3532973500 1013294823 +3853455817 2681870905 1536753518 +920385011 1329868165 +641454703 2670478520 +1783869641 717180024 +2522363394 1760499210 2933720355 +1649051744 458534707 +4052034455 3415672496 +1012391114 1653185990 +4265723271 4265723287 +4065812723 3656420166 +794785028 2537895263 2537895241 1794302456 +640441019 1172593022 +3512174414 3512174430 +3250007986 2302762843 +2418154999 3702860752 +2907728322 599406806 +2325107170 212002517 212002499 1315782958 2809218282 +626386311 3190093855 262894212 +2881015093 2297105002 +632713160 4255723747 +900673136 1994088696 4073069129 +2892377895 3573774687 +3575999704 820550756 +2907111825 3023103914 +3485053911 3629521766 +1597316790 4263953029 2151650363 1799320320 3633297537 +740286 740270 +98588435 3517498164 +1642558992 794745660 +810924195 3119622282 +3668123221 1057352442 +1316484653 2895435522 +3855466124 2420759201 +3007582931 120169018 +196849586 712348979 +507610187 507610203 +2277196041 3032965422 +2048232749 3447156404 +4291692558 1587447960 +3570129415 65550592 +3723398424 1699042981 +351092662 1876254877 +3102283759 715768465 +1544023409 1544023393 +605135754 1371828781 3766031514 1013913606 4081046259 +906797694 4237440350 781891999 +2713352753 3381549872 +484246383 2787591852 +2393932839 1924055588 +861054727 3525111809 +4076052130 2264866223 2330783956 +469075621 3107317411 2827154874 766477539 2827154860 3678592614 +3095090097 2790800296 +2119056245 1244109116 +1503414765 4261961743 +3978911472 1612077131 +349393668 1383837508 +321755090 46530437 +669004554 3488635053 +1652372077 2014732690 +725105331 3162793932 +2778211250 483226458 +321870918 2039366177 +1139919427 3649309284 +3208045852 527084295 +733547555 1727237653 +1493043378 3387404339 +2995658215 4239987382 +1134803068 4139477809 2584329776 +918118019 4212668006 +1679844566 1962851559 +1951695242 2021187827 +3978297069 1251915227 2826336594 +2135390402 4267767499 +3391032146 3826028869 +1172647622 3452477857 +712325793 2005617504 +632295762 2787853317 +2762604857 1889529022 +4059948223 54679078 +259674293 311233770 +2363404238 3781908508 3504263406 172925408 29405743 +1042510400 1764920935 +1706918986 1935097965 +3579264577 159004892 +1888810205 394098658 +855881396 3405751523 47750480 +2055394342 1623136858 +1180610959 1443988494 +989610956 1372415600 3707410250 1883858 1008294138 2066580289 805386509 4288556593 532591317 3638841065 621305457 14913837 1198887142 2465027613 1813642344 4135356236 4029175027 2202902847 1443050125 3203556779 3557334794 2874493109 1439058338 2250522309 2370873510 3930657418 2920028951 2591931991 3989237947 3731825865 +1060366187 1550380440 +2873741625 3727973566 +3334953936 3151333475 +815147193 895621950 +983094291 591799065 1323695011 +2766390485 1737415498 1737415510 +1636231780 4057055228 +982717973 1677985978 2723146035 +2390652194 2755423284 +2644123240 3364098179 +2502775972 3358972569 +691648663 3832749510 +218503975 2812067446 +1838021520 4231979245 +1499662390 3974491399 4109640214 3974491409 +3121103920 4014138840 +3073427158 1142496707 +2284146795 3183319156 +2091153567 120534858 +1991025360 2713996661 +3358997258 3000392201 +225767528 2404454672 +1055500062 668079145 +249063264 3467302211 249063280 +2415042339 497022983 3186656284 +783592417 46513670 1735037750 +4269229965 583377650 +520303168 667034651 +788695184 2432498339 +3941930072 936314523 +3063603365 449815468 +4293165388 569326455 +2224713775 3994982904 +859199417 4269760779 260712840 +547736632 2634054715 +2833407954 2925320069 +969456094 3366195199 +554762760 365310612 +4137466974 4137466958 +2148737474 3972389615 +601831124 601831108 +3904175468 3201922932 +904306717 4144893346 +179981481 2353442318 +3851599625 1862449966 +1346213940 2230753753 +190502701 218151876 +3324287802 631266379 +4240020428 2753800737 +3797172572 594321927 +1569566260 2047425487 +611763952 1459301333 +3137104551 3137104567 +2612598762 711565694 +3900153265 2773302694 +2128322467 1455181212 +416631633 1757778064 +3944983632 2032681443 2032681461 +1399108173 2491723556 +361341509 3864158753 +3166487702 944255091 +3925414254 3239473209 +2624093429 763147708 +2214242219 2214242235 +1350759468 609056557 +2600547774 3236403721 +3307843744 10554355 +118959224 2709192941 +3356099162 2237552762 +992105052 3188604411 4049782220 +1118802042 1118802026 +2619684732 2678905699 +2009089380 3886890089 +3087280859 2307880658 +1716440968 2018614192 +1068274423 866867910 +1276901042 2181388851 +819493257 2059870610 +2816085203 2816085187 +2951837608 492840311 +3691113954 956922581 +998853610 2736947547 3005389469 998853626 +2157350503 3896725631 +3641634442 2430105479 +1491988604 2056360743 +2150923969 2476968406 +13126223 3431376455 +3304032966 1827557137 +3170009891 3773079871 4079887710 +1700430875 2826827410 +564779864 2363682533 +149740664 405251347 2229211387 1598764544 +1192773431 1192773415 +1953505698 2118711979 +4165528922 885892285 +482228955 443983570 +2708008574 2519691337 +3791779685 2206107536 773354476 2210975488 +2791016414 3222725225 +3999369506 1553952317 +3167907642 3418300663 +1311036504 3374882570 +1786726607 1725598491 +2535180631 935195632 935195622 +2745262398 17069641 +4245629106 3204481115 +1980725605 2172197374 1265350168 3153914582 +688029484 3136172631 +2523965686 3378117447 +1676763357 838564852 2430862549 +3271205617 3784212838 +3803578951 730174934 +529847832 3477931995 +3107516116 4075067550 +3471021282 1493892014 2981532528 1739719156 1889563852 1859387271 937807425 2894658782 2985218813 3012835350 1653185388 +3818144864 3458585403 +2193266396 1562686352 2814082129 +4125974661 4125974677 +2372779907 2372779923 +1006388579 237090094 593988277 4099412694 4036281987 2079029179 1415477664 2829448282 4103129227 1841453629 +1945122196 388257775 1580625609 +4125213499 1298552306 +2908666884 3535696062 +3288946551 795971042 +940966727 3297054099 237317248 +3700977407 3530097834 +345558408 4102786333 +38302498 3121430165 +1170148983 1120126278 +151577665 3499935679 +3885346949 1888405238 +1098468502 2271995669 +1673911043 2735458559 +4264943817 4157660280 +1903653889 2685115776 +2488686228 1443245753 +3175972884 352362361 +2405081409 3901170289 +3231827962 950914699 +195297415 3660371072 +3994603438 2131685113 +2561680600 894042139 +2302366446 3424673405 2176214170 +2234957768 2234957784 +3627933083 73652996 +1813075037 2085080674 +2373142418 2068154116 1061707038 3726960673 747104813 645783110 +2599055622 3843026017 +3693548579 1223030023 3028595484 +1595862791 3300018198 +3920428177 3396515382 +910607929 4101350191 +992232305 2333485808 +600707000 4273513838 +1784606318 3092983701 +4228196395 4228196411 4145960178 +837608451 931722145 +3756113146 4204372419 1121560042 +849455282 2299986011 +1158693562 1922632395 +2115305009 2886477616 +9845734 3766704966 +198342704 3428004739 +1542377980 2956567221 1542377964 +2248588291 4288280764 +747702784 2134974924 747702800 +2535183379 3131117207 4090419692 +1375840547 1000161820 +89030446 89030462 +23991679 23991663 +153058849 1477840066 +2189289825 3442893759 3416196542 +2757118751 3537387988 +838081250 2235978179 +712186026 2100286349 +2533614985 1143101102 +518795601 4275151504 +2813097712 2303406173 40299656 +1244151254 3952574514 +3746133778 2460381523 +2041344285 2809532596 +4059993150 834887071 +3829696598 3829696582 +3748427479 874154479 1088170129 +2210044029 2922255733 3686665410 3686665428 +2704483467 1803173816 +1591486679 3034130051 4166168172 403867962 3377548852 4006548584 2587070067 1786934405 113353970 3686432143 3844995269 2247096783 718083258 773958205 2849793343 1481744622 4204695553 1607251979 617146312 3882259388 4207011803 1387141104 736087971 485545533 3409478684 1300125261 252888418 3590134742 976213492 429651501 4158779256 +114487237 1800548861 +1055588623 380572864 2026008490 3101780954 2253479479 +1486250760 4226840117 +2505490228 3407556511 +760596258 475590430 +2851875027 2324123991 1794393132 +642774382 3185531951 +3172456331 1066773176 +2690164997 1888621260 +21290008 392591835 +3230926488 1419148844 705375269 +729827234 2449772714 485540867 +2712117750 1893987921 +589192242 13082573 +2331113125 1608992172 +3739778037 3707445948 +298921789 51523535 1724475956 +115612809 1645800366 1645800376 +2924955122 1700994021 +3218076557 2170316516 +969028315 3350597330 +3699499788 3801207607 +945409882 3780832053 +678128904 3574960180 3574960163 2837226397 +1406695062 3329764786 +441901855 2512882142 +1386921007 4147349473 36936006 606016707 1304926086 +3203283092 3091896780 620957945 373334132 +2655308670 2756466505 +2249434919 2344296600 +1277976279 101930068 +2415105175 863168934 +3349808040 4171481451 +1438947250 1219241246 +951622056 4070171517 +3138013975 2285122854 +2379166535 2379166551 +3588182586 3901649245 +2696005414 500990167 +1261805879 3678494871 +39886789 2119131626 +3861706089 1496757976 +4261700118 4142295217 +2800243335 2800243351 +1445954525 3473825749 2311886050 +1859522066 1034179770 +327259165 3522963874 +3518889188 1614372056 303373033 +3527169394 1727693427 +1874102847 1874102831 +3464049842 3134059557 +995199994 995199978 +597623022 1986344625 +727495705 1542423368 +1789092223 1789092207 +2659493520 449983669 2659493504 +1847164344 169928891 +1378064294 3400590170 +3825953165 2331453682 +1551470520 1948847836 +474351013 658170540 +3927995956 3306820559 +1291351612 1730289777 +341893410 914516117 +993493606 2657240705 +3485112270 3502045529 +1065797583 2384368155 +1213136499 928675274 1213136483 +842560807 903900284 +198591797 3612275324 +2767406254 1492458991 +2945181378 456934243 +2428077752 506557916 +3050362532 3686917161 +2469826451 1441986070 +3781534948 3070399231 +1797820505 165362696 +1964899387 217485484 2570326244 284595967 2486141625 +927321541 3353537804 +2125105992 2927182411 +2513859376 2513859360 +2272143439 2171171928 +3583148512 3071894743 +3201738170 367446669 3201738154 +1168730074 4060711798 2209250347 1991079842 +446624790 260465357 +2231120132 1560357193 +3517481429 2303642047 +2405809181 1548913861 +1079413071 1754001307 2537170776 +2908211967 1070878059 +1084287616 1438899333 3525869975 +3384745420 1675356215 1412328417 +3376989581 3038263118 +3847823807 3073970817 +2532149543 2532149559 +672404264 1067067371 +3709280677 2959734444 +1321629916 3731898951 +2651811483 1833639442 +864203062 1287452679 3497684149 +2149115466 763999141 +1073663392 3074646552 230727276 1579004645 230727291 +895922985 895923001 +1208239983 2544511675 3451679672 +108764708 593035279 +2518403016 364609483 +3592773195 93274895 +2512751307 3435180014 3435180024 +1148233999 1239709004 +620269550 325482045 +1047068194 2809162557 +3760392471 3995553574 +2362210463 1155654216 +105085011 2438149841 +1139224351 1139224335 +7894605 4223442068 +2075985478 277930017 +3184658941 2632103369 +4269813516 2618752800 +209137294 765348249 +3778128548 623878207 +1866286821 41327212 +1319832881 668189066 +723021645 611792420 +2146428046 4107149280 3396702327 187121299 +506036222 1976317503 +226576494 2961507641 +1470578978 2467915846 3707711414 +3014186459 1383948562 +350499460 1731954143 +1249482684 4184464625 +1751396265 4273407758 +1129420930 1129420946 2071139491 +2706151234 2684582218 +3622087650 3204093123 +2176367770 3889927193 3672603212 1116492287 3889927182 4250749454 1133269893 +3195759719 2173708665 +1502572716 3278673724 +2870472746 2427399005 2929295506 2870472762 +1799139583 1799139567 +1729620517 1729620533 +2016862230 1415758503 +3127783822 1553423301 +1787553072 3929655939 1103948774 3446856150 +3905307766 3860710855 +1939320409 1355249182 +2840820138 1248545776 +621225083 625383720 1881999045 +2786638286 2384777100 +3499096356 1990538175 +1709031669 1360445884 +3357083526 4159044049 +2587780712 1749600799 54619984 1110808707 2676762836 +2442550496 263468211 +1747081856 3594006909 204971289 +1142157330 2587133702 +2469343318 155785063 152034674 155785073 +4246190258 3003434516 2408767440 190693763 2947103453 3710606272 125849293 +3304477590 2781189425 +3496260287 3448070846 2347993459 +573489108 1094693183 +2943362940 4025038533 1898002444 3305350976 +1443687964 2455426567 +2535028496 3977670179 +2702946439 986392150 +1433142718 1433142702 +1839770277 1166320058 +654490574 1580940121 927835471 +2005711140 5581389 +2409270455 3343614982 +861720731 4032878011 +2986810993 2989812710 +2467493194 2467493210 +906159439 926586338 +1267070610 3217318643 +2717113815 2717113799 +1725353924 3089705647 1725353940 +1853861165 637371035 536714692 +4184933360 2632528597 +1848209867 910041748 +2578260115 2122991468 +3580569743 426096090 +1367897911 2369196980 +1900774038 3261076321 +1217688688 306260427 +3537522244 3571517828 3966402397 1414765084 +4196813865 4081706119 +3979264151 1982000130 +383123105 383123121 +1170672581 3146165704 +3514299623 1136099570 2346712293 +1180372397 1851164484 +350582853 1813318423 1496872616 363695929 609086959 2451225452 2468003058 363695918 +1553275833 3308335413 +2353609757 837382658 1520186091 +3281965085 268541364 +2591230047 2182491528 +3001600056 844419207 710198256 3698536493 +3537574404 4075418697 +1443528707 3159748004 +2429689127 484618089 566486134 +2947796218 1935815107 1720997354 +888855220 451299663 +1282783658 2120267861 1453962065 225939795 2516176284 2902061504 +3922749218 890395285 +573505205 2231039740 +3588182582 3834538769 +3494521746 1992464069 +3299334955 3208512692 +3067950601 1554198052 +1756304730 3425194095 +2144020516 3703346108 +553478796 4073683348 +1721116096 1913848716 3052239804 1351969063 3360834092 551143655 552507108 2766461299 770616188 3304625016 1046310227 1913848717 121786394 1913848731 +492284374 117464049 +3904533753 1537027221 +1576336774 1576336790 1856707063 +958994609 1647361335 +2497406577 3749017317 +3309668246 4060544682 1682841697 +1053033372 1787932305 +2329849021 3851585435 1573353979 1739608396 3768143396 454347557 2833421033 +3653547850 447515003 +2220106213 906022691 896621420 2608005386 2608005405 +2706044357 2706044373 +723021646 628570063 184961650 628570073 +3010455524 1563036671 +55274127 1423233740 +562140750 218078425 +3654009857 3654009873 +816289598 1834134303 +3466833689 3466833673 +3847113356 3847113372 +2040693818 4095726790 +2162080829 2190098228 +980698848 2868226008 +191259703 690995856 +586584541 3878133474 +2304328030 2607108999 2508318463 406684802 1518248830 1518248809 +3933717446 3275879874 +3689981121 4241710016 +1018648574 2459927775 +1379928486 4247329009 +3724663505 2947309174 +1933090806 1478742087 123789270 +172353556 1074550639 +3798412700 1777577400 +3917429997 2152524036 +1061441502 433100287 +3358510541 3358510557 +2119791462 1288743319 +3152547338 3152547354 +420486311 459086582 +3312732426 353233802 +1440805288 2645767297 3642518379 +2871498087 2151503204 +1015412561 3486288407 334536812 +2821159384 2384776987 +3184435921 765419784 +1928769408 2052474515 +3978780418 460388862 +955219846 654688247 +3147491487 3147491471 +2904552001 3393870912 +1554798268 1126071144 +900592729 209561385 3654789150 +869228457 947099406 +1337890647 2633597140 +4076245199 1227224536 +2638826103 291518790 +637308267 4090563051 +1325567592 834273411 3536771784 202138491 596220542 3372625341 834273428 +2403746733 2403746749 +1978677419 3781374691 +1216575619 2851518012 +2902964710 888777754 +1302296862 1342941737 +1130553765 4284557021 3114874554 +1614412973 3163360516 2854833435 +4099806049 4099806065 +2985357824 3089582541 +3149760025 2757368136 +2272470916 3192337631 +419342015 400588478 +3649877863 4260120420 +667207509 1046363117 4022717130 +2572583303 477339052 3928876950 2319759833 641953412 +2772899313 2675891862 +2927674348 2696178817 +1514151383 1345881384 +1100315047 3667293092 +3695174712 2376559503 +3563226833 1611748468 1022692200 1710247783 1809155787 +726466789 2128028707 +3547522818 3756107811 +4138607812 405004447 +964765081 1537036715 638933608 +3925953312 2148090739 +3373778243 1313332006 +4010690482 91938106 +2247707575 2658283782 +3406012809 3406012825 +1032180943 2829976017 +515704850 1972614213 +341215453 3778638818 +654602486 1644024657 +2155632792 2336805839 +221723053 2062535492 +1317237504 2565736723 +2332435041 1000873654 +91782704 3433997699 287970545 +2127895846 2023299185 +1381715951 2495534392 +2838928080 821409123 +4125630293 1902727882 +1145985884 1334061576 +1825573919 1952036572 +3875778461 1204646974 +1461460848 1461460832 +1599461382 2620685895 +3004631905 3387075203 +2312432191 1655275386 +708220879 1123089112 +1998473992 1836403248 2360352157 +195958010 56211907 +3786954235 3786954219 +2611980067 1216623962 2611980083 +2943290825 4107449202 +351025155 284838461 4144160276 +3042388920 3042388904 +47708159 879381099 +255227759 2715722038 +4098899966 2892321545 +3186505458 4026564325 +1564220985 4272133054 +4108647551 1614679612 +347747468 757119095 +3351328052 2837889231 +646670966 2648108631 +3750129521 1369534182 +2482300114 1432356806 3006663581 +63882480 63882464 +4259409993 4075012846 +1168649203 2596089740 +1256326234 1003280829 +1343099607 2507024450 +3206697625 2080900808 +1852124317 888481899 +4218037369 1092053608 +1410297181 2974361972 +737081008 737080992 +409396744 409396760 +1113234054 1113234070 +1440805282 3541852693 +3097849288 1953223115 +4274831286 2646828417 +3050338813 3485497593 +400832320 2188325132 3695376851 +2596275313 222756326 3435245824 4042494711 1424597779 +3113079152 4175056604 +2977845546 2977845562 2480522523 +1811321868 19599073 +1872713083 2802627112 +2160053905 1056058960 +3329426851 3355399898 +1996978086 113334871 +1300231029 1970028842 +3258742091 271361282 +123985600 3801998476 3869108968 1647814725 +3236250071 3356913492 +291374014 352314377 +1411378916 1380258047 +820812721 1403009600 +1057730931 2993182732 +1988283404 1308320801 +1632731381 1735693410 +1525167055 1294241479 +3660716672 4242519955 4242519941 +2006731143 573732484 +3629759115 541108436 +879694255 3943378385 +1648554373 554460545 4000722277 2262139756 +3275575983 143206766 +2289574330 2401048541 +3644544972 3295360567 +4218717385 4277263991 2292465362 +2489152451 106443623 +2242770860 484238273 +824374394 163162074 +3432839603 3458012364 +3788562784 3788562800 +2359605511 1850689024 +4149634994 252001587 +909562306 565802381 +3723994344 1423481131 1423481149 +2684306864 4148788491 +1567505550 1831766553 +315470630 3440025190 3218146519 +1829775404 3698277697 +981928906 3058292383 +1205358342 528770657 +4083136395 2863525826 +411589407 3181867464 +2139708876 2436802615 +501514567 3017988736 +2689333628 3550068263 +1135703556 2489108575 +4001316332 3848205697 4172380006 +1300621671 260922239 2550289550 3187005336 1892576553 +3958409867 4138342612 +2111831293 614154827 +680870005 3000842020 3309167948 +112695183 570660376 +3016586119 1773564782 +788315482 1373508797 +3268693501 993560290 +2803002245 2264875596 +3051151864 2101336241 +1204573290 1890116306 +1964613825 614524826 +852481702 120218165 +4045170748 3940112251 +1516928120 2467742126 +2732647110 772079009 +1644008208 1378779701 +3166164474 258332829 +3690108764 2598651335 +3279911688 3245718320 +3537235992 4274582989 3814388132 +334074485 3891345025 4236431974 3450965546 4169321485 3319626067 2921106218 4169321498 1089409805 +3005661336 2650877773 +3907895530 3907895546 +3755335620 565133727 +2911913938 2869658747 +1109708034 1559648914 +3712003818 919820877 +3310107526 486650871 +3540007369 3540007385 +232317878 2188277649 +3496155351 3808434790 +2659269928 158805315 4169690010 +3131957238 3585577041 +880888377 869834760 +3344491895 1505127181 1110364970 +1833893099 1865400619 +3567932273 3582072832 +2711395124 2374515135 2711395108 +3340525378 3014259939 +4247840085 771694231 2315422188 +2054382535 2326139478 +80525273 1732602526 +2905094002 3445911006 +3679058551 3395777110 3385381475 +2207665095 2268249800 4208966297 +4192551272 3420845757 +137445355 3498548962 +1305411877 196940380 +4047091659 2296140930 +2690951073 1561564892 +1468097115 1346055346 +3676624458 3676624474 +623327516 2562647825 +2060919545 668600009 1504447998 +2369281030 1761911366 +1606819433 2291304398 769777496 42862911 +1270491230 273900158 2483915753 2483915775 +3569769285 3160689021 960605594 +1577541410 3025134318 +2402319261 369458562 369458581 106076194 4072820075 +2717327819 2634915576 3272225410 +913652799 4186822440 4186822462 +3706095755 3960960990 +155344127 2457363816 2457363838 +2622894135 3284273047 1591871417 +3027090656 3904918707 +2281749426 3408361779 +2165241383 3362008279 +661408879 2122076846 +4042249029 2391381388 +1519040161 3924952564 +3681048527 1547761109 541239384 474128923 876755672 +1657712067 1314621930 +3035750306 2059602947 +2424432151 1552408399 +4040982867 2115999148 +1359003034 1359003018 +3538131767 2807172411 2942843783 4164982802 2435625515 +3217816952 4094338873 +3569908540 865730417 +257824371 2753386252 +2436289627 3664147916 4098902866 +1448842197 3341400138 +3136172630 2600025457 +3460076139 341474932 +3310146679 1259132457 +1935329329 3370722598 +1690638345 2873415224 +2472051163 3478416324 +3376144887 3225728966 +1512883213 2176785569 +3858367695 507840283 +3652231559 1843790963 +1076048658 803902606 +661701190 1552012343 +1474283979 541764244 +3301839923 57265228 +149315484 1413843527 +2955672208 3845877941 +2793806920 1830716765 +3197266982 1927577446 +3654378571 2347511938 +2466053583 2337716251 +788154519 2332050864 +655710902 4150853330 +1733429358 2647959268 +775486011 4273072868 +30144781 3776515940 +3302597465 1000088840 +3863745201 985754790 +2788345082 2972005334 +1138241513 3545412942 +988308602 2363583664 +2998344328 3728655389 +676200004 3066512649 +1342219210 3137459949 +4168117363 2348464410 +2288817913 3681458889 3153177086 +3337495105 25234278 1244577511 1776282688 +1057704584 1727260783 +2288671645 1550727220 +3670830338 1909430819 +2719803120 2678570120 +4095139269 4154118140 +2847427674 2267034045 +672967889 4129557776 +945274544 1646341891 +717414116 4209905359 +4047584897 4047584913 +2359161802 2452052256 +3175059696 2080347046 +3006930952 746613899 +1365623849 2206925721 1278463118 +4287733429 3156735095 +4196078939 329424466 +1651759720 3541757667 +108159762 2227644934 2537894317 +2891568444 334434083 +227419992 2932338573 +1988396731 2400571342 +4186822435 4249463836 +2376769109 1022978430 1008297137 +1937686568 1937686584 +1308044409 394587230 +148009845 1212917740 +1394915416 4138090266 +1466509678 4102664498 2747036142 2747036153 143407151 +1096696655 912520526 +2652978195 4167609190 +1077270436 119643099 +1062014445 2739733844 1062014461 +1210886926 2891007769 +1063893876 3962738708 +4039776853 1663529930 +3573376552 3605917701 +2721342239 2004355550 +3247220468 2758464025 +13664591 2537262926 +2495080208 763412003 +495352181 2113112845 4021367594 +1804496983 2822428902 +3880038849 3525563094 +3794091148 881246012 +2534150025 2534150041 +2791820195 2556793226 +426096755 426096739 +956472795 2585690066 +1362241439 1895063390 +2998309026 1963916314 +776119976 2062309995 +1784719962 3492555709 +2587491913 306924792 +1395281508 3011363836 +2217309903 2587777307 3695577048 +1091173514 3783676914 3971517755 3971517741 +3691424344 3061721229 +2361742507 2361742523 +2417081067 3068739572 +1224378720 1113997875 +4194157129 119379365 +963466655 102615368 +3658442450 406772890 406772869 +2069188180 2068467247 +1157961720 2667887469 +125551710 3682406935 3682406912 3485840749 +286438851 286438867 +1748813640 1605219915 +2137463233 3416523715 +3672070675 3672070659 +2328765033 3951045464 +3456634059 564929410 +2410627424 2410627440 +2483086351 208077720 +2838712873 3661326986 +2215808207 4006060487 +2366325056 1219999685 +1625134218 114349371 +1740134663 1312040470 +2702424287 4193192783 +2933537514 730512973 +257918138 3982356701 +494744201 958467769 +2072560016 138982837 +1807066591 474694095 +4072834757 2290948769 +330045838 2246851225 +3578665407 1036750187 493206145 1036750204 2297595816 +2504578544 1219768909 2668102504 1235466244 +4052592871 687924156 +1822078971 4069498916 +802158640 1952691093 +2107456924 1518861457 +72870236 620530183 +472148206 995176121 +809540489 3870167455 +487275044 3702294207 +1330842218 1330842234 +2948284567 986099120 +155171781 3676954109 1414829850 +2748466216 4162892586 +2857932805 779571148 +3372408480 260339187 +468330298 731627595 +1414372198 1414372214 +1215608170 2049370053 +2039175997 3481186635 +2475535676 1227006183 +428978709 428978693 +2847930867 557774887 +1566497337 894535592 +2493107025 2803556836 +3154083060 3878794255 +383198426 3467576125 +3722880522 3016677733 +2965261049 3166269150 734775151 881853950 +3850754702 2307585426 2785023802 +420471039 1757068202 +3791972807 2495349846 +1778575580 3197407815 +2450435787 1776841711 3088918932 +1513638186 2672296338 815475995 +1556880720 3980511506 +3508429625 1809199806 +2233567549 3760352751 142812262 2593840231 1266805324 4195098977 +3603770205 2180727659 +3964268657 1768260070 +4202916197 3252611564 +2509776378 2021902493 +2984823329 846606838 +3749129711 3080539950 3348981886 1151579451 3749129727 +2106843956 3821972175 +2675966459 293805604 +1351299679 706759560 +2045279808 2045279824 +884901104 475983452 4159391189 +3182661875 2494377616 +1446587488 469818149 469818163 +4069253619 2252836321 +746346024 559836756 +3301054703 2894938168 +2388487262 2064750591 +4004546147 3359134023 +3011391928 1202209979 2061769796 1202209965 +3105541528 4247889499 +3411805871 1179393004 4022727889 +2128600872 3602471542 3888352319 1019776807 3513882668 3513882683 1002999185 3798748157 4237410360 +2784438027 3457173038 +148940546 2189005198 +627943441 604013104 4238316240 +1667120272 4250490531 +490107782 2193087479 +3522981747 56848922 +4204172564 2851514495 +1298552298 3904814162 3256434523 3256434509 +1864043208 1070253044 2945579229 +482888615 2659358116 4132378592 +2639225475 653792316 +2874414355 1454225280 +3297225731 2496311861 +1463344802 2796584874 4035344643 +1937626072 2803137819 +417713296 3084750588 3250652853 +2696285371 3113618034 +3242753651 3331551169 +652563177 2682537204 2086932569 +1537427230 1611199551 +3239779682 713137250 3823352957 3823352939 +1982902638 2903935282 +697997743 697997759 +1954021910 1130585846 1860913319 +4275404183 2744676611 3239359664 +4204067510 881652544 +273713773 466217348 +374429511 1762419904 +1289763880 754889469 +2847544344 1206755789 +3798178615 3459338345 +3650710208 1283656787 +3353957180 3151345383 +3066394534 1591433793 +3823180378 1268166178 +1075701671 2517871584 +4222563472 293696482 2282305259 +3263952618 743813709 +121983833 3408016648 +3893754561 1225119729 +3611827685 3162304217 +3319743848 2706359376 +1742940754 1927739496 +4148105253 265894236 +1204958526 2691744969 +3277039855 1806889006 +1612828601 1846831740 +3727786236 3287157927 +2777966260 1553837391 +782704156 2842896375 2366924295 2990651148 672967879 +3084427974 805846433 +2162676339 2918109600 +1674022923 775067126 +209107480 3068589005 +481864261 1449963644 +321728303 2623427153 +2474639868 3916096423 +4180278047 3206725084 +3786682539 3786682555 +1180457530 1180457514 +3454799748 2929487049 +1365109878 1365109862 +3278922520 3278922504 +1120545747 4148362533 +1552485776 1002461621 +3510260269 2345622724 +811932483 1849369767 +1411837060 4249244639 +3847891849 3134007790 +2188228215 2188228199 +3407578798 1783956473 +1604579340 4290455607 +2728479377 2498257488 +1042728493 336204308 1042728509 +3272815342 3976133042 +3193524722 2560360435 +2104646357 1104853882 +3688193838 3688193854 +2673116448 4060975468 +285730645 611396298 +2076624793 3352874089 +387588182 1329712227 +4096482233 4092639925 +1718655161 2138741247 1466487454 1718655145 +267228492 267228508 +4039915529 444347960 +2855843278 3309712217 +3463696506 1957430777 +1051674758 3095438033 +114723764 2008935503 +552800824 111514859 552800808 +3325323439 1304921140 +3099818807 206813108 +149168062 3172857887 +2971262837 268722444 1085981994 +3398753213 2773871234 +3388896032 462371699 +3038921441 99567648 +894379308 1686450752 395805761 +3716645868 2824121495 +3313669696 4192667896 +4288896399 4247537688 +4077918139 1365171839 +3207048217 3207048201 +43471950 1647949519 +3816642681 2538751614 +2137463251 1649256236 +1810847917 2426356385 +1284132697 3602573598 +1597546285 1597546301 +3091184526 3091184542 +1786288877 2296111876 +2959639282 2525366741 2959639266 +1370282187 1578715028 +1234659282 1329046650 +2418385667 3997146556 +2797910404 196086473 +1974418633 199012472 443137336 +3608116684 1499662391 +1132753722 2206295133 +4205929747 3091340524 +298681842 4169784307 +3346213983 3346213967 +648632116 278152911 +1522768469 921433052 +4107943886 1100116313 +2233177233 459989072 +1001021580 2245526808 1547080858 888951539 +4163954999 2740459022 3336640399 +2922297480 2922297496 +2669123568 81562354 +1472283019 2956602836 +2841401675 2616258485 3881865474 +3219473453 1122652868 +4010848842 2705894011 1617190834 +2646472572 3456931879 +2787369397 3601975057 +3371125990 898036546 +788347706 4262546686 +1167872443 1240287903 +3566254181 846869505 3605644595 +2372670615 941910438 +410058338 1866289462 +3940328747 2930513903 +2665933061 3268144445 713085658 616095148 3268144426 +3259893962 3356803166 +853526117 1677291655 2068140268 +3220060712 1275432189 +3826827702 2756535818 +2729567817 1728939256 +636394593 396373174 +2525829979 1800075877 +1275697322 1562071949 +2757819638 912556490 +2385321956 3037279231 +5245077 318603914 +1203803077 3106447130 +450852795 147422052 +2756672347 69152836 +1084140805 3200933594 +246107487 1990904968 +44659668 895190312 +2402068996 1733272671 3430755396 3413977790 336218377 3948912367 +2856510024 1330263883 +869927624 1748957405 +3513900261 2604579948 +1243740617 1636514770 +1845134608 828340259 +27262912 1323277139 +3296623558 2381078228 +503159463 3711595744 +3725247119 3725247135 +1290536989 2762163345 +3559722862 4155623417 +507282479 992908667 3359905272 +4181871409 807120016 +1535996509 2738762325 +3402356879 3454396686 +3194338106 4096113757 +1896363425 2653864973 +2275778427 79302306 +1440684970 4228208659 +942433377 1674406545 +249460590 1711632367 +3987580318 3327899561 +3676142974 2145915223 +2698725658 1395921899 +4167330584 661218483 63692512 504665819 +3080326041 2692760008 +2979160236 896413399 +3764642547 809387162 +3624124067 1168428219 +2157479294 3994690889 +425312560 407576213 +1594662626 3534286046 +4029732199 2212491552 +2406513579 2031267362 +3058643922 3501101971 +1902586817 2930569457 +2580040830 2488298057 +227597405 3087722082 +3582862282 3376213214 +3704088315 3450176475 +2294172441 1552955464 +1885328928 999958045 +161260879 1889024856 +1882101994 2203760717 +4037538906 17438754 4037538890 +2714273452 1258681723 +3737447597 1560319067 +3776399253 3970281372 +2194652079 2617537646 +510985147 4010120692 1610030813 +383533526 3535512551 +2687001086 1816085790 496124639 +304827669 3383269292 +84002847 13502686 +3306496499 1965364215 2637146138 2884808814 1728935385 +1495131801 3809608414 +1784967509 4242470394 +869863176 138478132 +2478485942 476383987 61846163 +4001333940 381331519 4001333924 +1645945296 1645945280 +375348106 375348122 +3921187265 2928505536 +1200259443 302630938 +4075204071 1210303158 +4192093582 3873930905 +1095542277 1419276842 +3294105306 4036976939 +3175300335 2591808556 +861588214 3454894407 +2785121973 3739421274 +1033929311 3736385308 +3325637427 3325637411 +3907240123 1502111332 +817250448 3148161789 +1471801853 380328258 +3800113984 3800114000 +3224420027 1203519602 +2740149497 1785843934 +2449275978 457255021 +1730822564 299556784 +2181485962 985802797 +2408201125 2610685107 +41732711 1366466592 +3238613152 2175396844 +1402862051 2226151516 +1949009483 3335356413 2937070921 730097684 +2524423836 1881877179 +1992308995 4086939552 +4062595006 1109795247 +2481468587 2173364514 +1482673560 3067127373 3067127387 +1920321305 1214803016 +1762433476 1610249400 +1281459814 2743505559 +3949297205 3949297189 +3159166328 3846976507 +2000859329 2130460631 +2049013714 1256050605 1910366911 3018363697 983433704 2540900435 744496176 254686645 3024804998 +3792031966 2830442321 2526755367 2804026748 +1277367036 2019894971 +516461836 2177016289 +485002474 3105872587 +114341553 225752493 +271908438 3647758705 +1765087012 3966215043 +2055614452 3455990164 +2342464275 3465590186 2342464259 +2623020714 2501219077 +3511550468 2177707081 +3518953544 2007030091 +1978359968 1099504613 +1573005016 1889740315 +3661761794 1649296650 2549774883 +2666878245 1149078678 +4102574565 3617123180 +885847832 1148089260 3640840357 2555437792 +3449123645 2058440226 2058440245 3745802498 +2996093569 3451338586 +759343693 387615246 +3890935296 383861253 +2944978059 1856776111 3747217108 +688029476 1710518789 4005926758 3001951679 +3209944440 2356784413 3123412858 +1257861612 2305961216 4071511681 +2884469410 1908164569 +1898405444 9218738 1694065929 26874747 +3624889297 558324339 +2979109601 1765199926 +3600112004 2012387951 +2047165021 1934063732 +670791274 1524328653 +2874376933 275499530 +3576069870 2040123577 +2261412545 4054191574 +544474340 4205032191 +4264638028 1937275297 +2394540566 3296272561 +229592339 2650166522 +2680678291 447843450 +171087067 3902821572 +3978034129 336423440 +578948721 3283925990 +2510993089 1812996420 +3839810261 533888348 +2998344344 3285801516 1509318693 1442208231 +3174497478 848302353 +1561724320 2096535148 699063013 +3900575649 2675087990 +2114523625 1363620302 +1360457116 1125649543 +902011733 4159538890 +3020528316 1526733292 2250639975 656315879 +1957855031 2914655759 +2718911908 3256301865 +3087777997 21872164 828527295 +919378401 2550291462 +3468756687 2299028159 +2813340617 3277122936 +3937705155 196471601 +3651003107 1988897628 +985882791 680601334 +1153281935 1026622287 +2272850177 1048008753 1147364502 +1190527106 927124661 +1021590701 2390316980 +1347915272 2178193053 +51782437 1064699929 +2960399863 3184208848 +1141783461 3345474732 +1058328505 113442878 +3241378154 2327754918 2744808042 +543965533 1735058804 +4155414817 148573920 +857844802 4102582093 +699438174 286639100 +2813799206 335337073 +4814228 3567418862 +1236270121 688518286 +1818881398 549507271 +755689314 1244282709 +740165863 740165879 +3791619750 841546737 +189783120 2230296105 +2367528389 3936312602 +4184909878 3797470481 +888291049 1113131224 +1738256744 2302106499 4185585663 2803813348 +1358391091 1358391075 +834529933 1013158995 2864930784 +275846869 1777194861 +3188384455 4062379840 +2373997240 729654611 +641727379 3384346746 +1402326206 1389448991 +1268303131 478038418 +3042595711 3042595695 +127964736 1509435404 1509435419 1103922899 1387333880 +744767009 47042038 +2867159124 1528210489 +1892162870 3238394897 +165945664 3971525299 2057424608 +4249412593 3962787450 926583633 2118185079 +3225466767 1378050431 +1260602021 2642603996 3984714170 +95902985 145192248 +214093283 4188675146 +700959113 1317159598 +4021272713 3941156601 3668711342 +82877080 1210263907 +1224434306 1706824355 +1905546305 226533974 +878305231 947606232 +1799865188 1957904611 2050475222 +1899327431 3669227866 1051415347 +3197876475 170144548 +3154841577 1084053077 +539575818 3320605073 +3866480451 210459133 242566762 +183991048 3829691910 1470689556 +1027561782 3683272842 +3366653540 1229432703 +2796320506 1535069085 +1564172881 1767126660 +421950416 421950400 +2759458771 3205347628 +784570102 454438615 2481366343 +406431138 3983757985 2772588998 +3805256320 818374221 +3031593227 2145907796 +1086810852 3723314431 +3375233241 2355019166 +3799264957 2791781813 971346818 +2152817835 2578566351 2514387980 2871097652 +1911576300 1433937644 170015231 1644914443 2964563652 +1276967724 4255082049 +1857503805 1857503789 +2807251841 932144519 +2598172002 735463747 +2419500400 1980133205 +2148860255 3722778082 +1179875490 2583538090 +490218686 3709911365 +4105547637 4105547621 +4032807085 331108434 +2250973580 3253063521 +1350790907 3485609467 +758750813 2394180706 +3766747415 3766747399 +1770235930 777015779 +1641853251 1365970026 +3741694952 364287776 +1153503260 1475107857 +3073059560 454418427 2937598328 +3502798065 3704935830 2626688880 3205892215 +4172372624 2684800252 254906549 +240846361 74225222 +4077019100 845161616 1757210449 +4023239601 837488550 +1506086315 3406695761 3106627408 917247900 +560686757 1091737004 +2590228445 575891877 +858752158 835568831 +3005331075 1607744403 3130424244 2165461024 +837176673 4002140064 +1323476984 2213747844 +490112857 1440157954 +3393830860 3795770848 1041821217 +2654536975 3166974098 +4198136933 1326568186 1930370973 +2240408817 593431937 2240408801 +1745899051 4239068596 +881419090 105339411 +3614971021 3075206075 +1541996818 1541996802 +3503575837 3678328500 +775821692 1922497028 664110887 1203904039 +3440250690 253887715 +1232586719 2257560584 +1382248843 3069957294 1618594421 +1053910897 1000572648 1420154598 474256375 655445014 +587583288 1512387899 +4131181414 130075031 4250046198 3413989543 +1455489586 3285611685 +2580283471 2580283487 +3201804673 4001355264 +2961427803 1535048622 +1048034753 1788939384 +1913045619 2539033568 +2239197257 1662115001 1678099182 +425950282 1100785773 +3808239108 1484144713 +1753051173 2725743148 +788257966 3738466094 2759615983 +3238891509 504677786 +1098457529 3400537662 +2381793322 2789644827 +2506305082 1696712011 +681592053 4113777875 +3412204123 2255453522 +3067452818 1682377925 +3931561415 3286222034 +2506873451 1306914716 1602561451 +1679545749 751909276 +781158814 3925189558 +3357688686 3357688702 +3191845939 2974329946 +1740783809 1740783825 +1657140528 1657140512 +1840449508 888725464 2497014761 +114916984 1080170235 +475242100 195195033 +2513539745 2181490369 +3939545263 1434854264 +1783461044 2800852436 +1241250983 514767584 +61650532 753082239 +697165443 2965299722 +3838147522 3838147538 +1237014330 2577854411 +2752658392 280239051 +1245720230 2299096926 +3797346645 2748403914 +3543617140 4094722191 +3095846675 2404461292 +2173594986 2539872210 1563835867 +1602565370 3299200490 735435203 +3880371024 3880371008 +3262801690 1085296107 +2562701361 3184257729 2798581030 +600729781 317641980 +463084946 303431102 +1274251583 3479244350 +3433615496 1231218352 +714376288 1041996598 +2629263397 3021164960 +3626272239 813619000 +608642343 1122863545 +2634552438 4210864985 +816034411 4239515234 +2313858031 1672644652 +3688848314 4039589525 144547350 3667748317 +1129115942 3620149091 +2682918947 3766746908 +4030283005 656081492 +4161366219 2541419061 +1959517689 3909974254 +2669234721 2513416694 +2190449037 886688289 +554789432 1181365805 +2055156140 2184917463 +2447381089 3324471243 +1916476779 1041190754 +457786924 769047383 +2917758849 1200037888 +2306144387 3861067324 2238603367 +1743401403 1353468274 +2810241131 3299151502 +1512724832 1353364019 +3658013038 2850965561 +1295529139 1821435142 783194270 1848727252 3477443081 1115354586 1115354573 +2346552944 2647079491 +262018562 2547819829 +2773518414 185937322 +1722950439 253688114 +4051332561 4105887759 +3055887271 1955016114 +67933304 3620583661 +2357201769 1439087822 +965955784 2942368956 +2269106895 1044518171 3094928344 +3722219216 572899704 +1634917906 2043909701 +2186623176 3115034783 +981280166 3103933505 +951409707 3450163288 +634250585 3693087496 +3779555989 1897068844 +2806821234 3833020436 +682166396 2033767086 +533098150 2875207511 +3234351273 608854542 608854546 +4258801338 1416763158 +2786567380 1261992367 +2877184272 2758029181 +3272154112 2400484767 +3818367174 230600609 +3923683371 3923683387 +3975607459 2881690762 +3791779680 689466419 +3432368987 1791959122 +2914432354 2914432370 +1503116548 2909977444 +1737130667 2852893474 +4123075032 789043556 +233293063 3940231702 +1859382062 375084762 +848649553 4062307974 +32924592 8628886 +1555540677 3122779148 +2590125243 3280759396 +4013860002 1100819221 +290612512 1689596275 +917321704 3732964884 4205773373 +1280082807 2205342518 1280082791 +3790076857 1496400936 +3711471540 4094310479 +4258620448 3019481273 +1170730270 960271679 1499394622 +976093164 2743750396 +3996195076 4215955785 +3811848498 3811848482 +3577906911 1330483100 3440317153 2528792840 +219032021 191408326 +1007352050 3053939341 +2631884652 2398066304 +4184221364 3282289620 +3313774703 3626679212 +52950055 518347126 3112644281 +1847564432 2623841896 2489620946 +1738097843 2434096938 2801827895 1336676813 2801827872 2734717396 3376883148 1492634499 1841285295 +1073823017 3941812110 +1520975475 702172940 +302739513 2701240766 +3224788414 1228516554 +3720499312 2296684611 +3826334308 1797188457 +2045643207 2403445661 +223835931 2521730745 450411720 464551826 17664238 2772114341 +4276607007 1710831838 +4231644427 435236948 +2837907548 2964734215 +4084408612 1330363160 1648176041 +2928050831 811671124 63855447 3194680408 4230469516 2209060472 362286534 +4289725273 3675604232 +805823279 3412763374 +1301717207 4213125734 +2422668913 3273821158 +745106506 871725165 +469704062 2426105183 +1835874762 1542124325 +2164987535 2557107916 +1274728451 2664789162 +536186113 536186129 +943443328 1196166054 +4089730291 2970729100 +1193405132 3328483127 +1859543048 2495691572 1859543064 +549355233 1431517589 2510295273 2510295285 +3181170041 4141315454 +1266974664 2845124555 +733002531 3183030432 +2841401667 3747644522 +364655241 3225652654 +968789213 3287793652 +869727932 3964380008 +1306210824 4132566832 +1892600052 2307282959 +3561005233 3535599280 +2307282973 2608641460 +4096538407 4096538423 +3483194479 1135340216 +4147554534 285991425 +2635293122 66639833 4014790916 +3107952101 2216228730 +3011628420 2822121500 3913360391 +3852582963 2963378252 +1165180533 1106402918 +924154335 2513361416 +1614848737 316579258 3228215711 683068686 1315720749 90099131 +308731014 2112694007 861165254 2112693985 308731030 +2552640126 2398833843 35748959 +2778752663 1384218534 +1686634081 1958976205 +4251069289 4251069305 2781207769 +1272125431 1414445520 +2646915763 263317466 +3884493544 3627600814 +539450525 4102145666 +2505179936 3589854355 +145903688 4172570973 +1652150118 1936619674 +125843460 934403088 +3444935422 268055299 +78967510 1054492391 +1216000877 2774996827 +1733420821 3663331723 +333182320 2282689227 +2639739599 2136052686 +3758961975 3291809776 1326334274 +1252794802 1056508723 426759293 +1034523333 1963525793 +1068782092 1068782108 2032622112 1423780065 +2539919861 3028397011 1498898317 1498898330 1200938154 +679798094 1466253518 +384428530 262711907 +1632313058 2068535805 +3815283435 3903578100 +3763456938 185153472 +402331150 3460544527 2234386501 +3071890574 588590535 +244954823 984683417 +444519505 111688582 +374107995 404002405 +2103437995 150891316 +156212415 1356351594 +4154596308 4154596292 +3578565165 4102692050 +966636591 125362213 +758252326 240086630 2719277530 240086641 1270543575 +2794563267 1768029309 +494208501 1052781452 +631934751 1409822125 +272533929 997373208 +2136151243 986299293 +3000848655 2827310847 +3938318448 1714441692 4178450517 +287501237 2935557628 +1656449435 134692612 +4070294972 2805483245 +3270998646 1637205969 +3076320227 1718275985 +1537908259 1888940298 +3746617794 1313262709 +399163590 1217621701 +3657248473 43040648 +3463352498 3870435405 +3120978739 184652122 +1926749623 3833020488 264250137 +2883786064 673928692 +3398466524 2348916470 +516711012 1953714276 2726297167 +989841940 86811736 +2087191932 3215980080 155145009 +397862149 2166315395 +309033141 2416229466 +4161564886 1435257761 +1596449697 1596449713 +2409483529 510248238 +733071027 3338785312 +138181507 138181523 +1924132839 1911990454 +1284588301 2511113586 +2707365464 3593038323 +4242169296 1726325308 3686903413 +857253080 1204518925 +2556665671 3193053764 +4148317246 3405957937 2069759382 +17007256 814126427 +1037311956 686693039 +3474629658 3243616166 +3658442448 373217635 +1697382228 2554523951 +1080703150 1425027886 +2442550525 2717298165 750019138 +120477018 2817547435 +3854548347 668420274 +3887324851 256746452 +4144476222 521826697 +329033484 3952801783 +1598921944 1648643172 3744327693 +2425368751 1488279035 +324559338 1579295579 +3353705181 4056077611 2336254434 197328387 +241761445 1673542109 1413855162 +743440078 2414747215 +3376590084 3982797935 +4288465793 3839122454 +1567883837 1265409611 +591800922 3782519723 1128402462 +4025212704 3186885272 +2164056451 2434203946 +3047571148 2331719648 3233078049 +2392431382 2392431366 +2736740985 1130065022 +2875897156 486234633 +1701100620 1436905079 +2504592217 3344788508 +2820022009 2820021993 +2217309902 443481167 +4238570168 1833801645 3190146387 3998743232 +3829410690 3742489214 +971346999 971346983 +674070 4278161455 +1267603155 919465814 +2119419103 762732417 +1976403512 1179519866 +1269532651 168228578 +1178915759 3880846289 997863660 +3548708104 1362206755 +2280671042 1094724835 +868864763 2855904837 +3007283050 2140651986 2532676571 +685559861 2291909500 +49600043 49600059 +1527894160 3976942261 +3110231110 1865033338 2798020129 +2066354578 4041111998 +2574091194 3879425558 +4099519836 87588807 +2352207629 3264973170 3533415092 2352207645 +3271708325 1244046988 733404106 +794961899 2189743842 +332808753 130973322 +334538083 3335805660 +174920924 174920908 +3033289917 1521051010 +589062332 3726474999 +3497276593 3622761136 +3845462729 4016497339 +498517447 2377734217 +497579928 4148659492 1211384909 +106701567 34281342 +1906415298 2740999011 2476950730 +2957444345 2026689534 +1686013313 3022793238 +74434894 1241114073 +3591297736 2195117087 466093240 123746506 2044175719 1216696085 3095347783 1531239080 263718925 977475046 1800874801 3968328769 3748961707 2029776922 2696698981 43988889 830154268 2876277834 16173134 3271342361 373644236 1727585931 382086506 2838688568 2775712969 2681070390 439107796 1293104257 3692419733 2316341186 1973136357 3545693329 +222562896 3614597821 +2010423852 2178764811 +1038886258 3971936869 +3042273640 1544803203 +3713530564 897565343 +617338132 2935454479 3662538879 14708335 2107308532 +3738565449 82075359 +4044310993 4044310977 +2987348777 1998580120 +3022800042 1269831579 +505776547 505776563 +3374389151 1041772382 +440836703 2888925774 +4284248462 134470084 +3396237507 3396237523 +2120982973 4235687864 +3830771544 345383652 3384067981 +2812092091 2539085924 +550474317 4000689061 +3965728442 3581290205 +212044744 3963727092 2910129117 +4039859847 2535837334 +585177306 3260686141 +504181739 3942534680 +4147611462 1792665413 +2291348640 2679887845 +2942199082 3980492165 +2772849059 3769801946 +3136172618 2369642418 2398693997 +1100059476 2351623481 +355757835 1821036098 372808382 119193402 1821036116 119193389 3373394653 +1527897867 1747066452 +1558679941 740341353 3523178393 688610504 1381894588 3314160716 3388957443 1711887079 3405735065 1847961964 1381894570 +1845134610 861895493 3594868412 3594868395 1696434753 2622746879 +704153025 3543830208 +2270285409 2270285425 +4070727735 748516998 +12196187 2146822738 +2734507473 2297846523 +2579560297 1657186517 +1280487601 3609994918 +3913565459 1232649445 +2577454357 2984500787 +2677236698 252063805 +4121918980 4121918996 +4256701545 2682238424 +751695501 356196324 +517826747 3274643326 +1587621155 448400906 +1084187252 1756981368 +2185424596 3814586287 +2749458651 3604484306 4196557960 3861786341 +1612597109 3299507516 +889455047 809897113 +1762959665 2625224762 +2691609875 1778851309 +34766258 34766242 +2829145093 2063025100 2063025114 +320578995 320578979 +2782172610 3483877493 1209261002 3483877475 +1231137770 334403014 +308886081 308886097 +3634193080 3082971067 4094244164 3082971053 +1231807009 3050633696 +687618588 3016026892 +1199846134 2333882695 +3019059139 181678058 +67457605 2573238938 +477308815 1481066008 +3355205691 3520436991 223050994 +1418701957 757094553 +2353085827 2435004457 +2453041101 4172414884 +2976347161 1474048975 +3403195209 2617838574 +2090654792 1928250699 +1346946538 172081972 +1902857453 169534135 +2101038671 1935427160 +2832771498 1997739661 +4178709037 1147536580 2749743515 +2286269521 1146599831 +3530893602 1886371989 +3148019940 1166921471 +2231087911 2134574688 +191170243 3358500307 +2366916458 4162107194 +3950463939 1875657724 +1176099820 1186280599 +3417341512 4007054173 +125907723 2976330286 +3457657496 2956026399 121736516 +495315206 2144195681 +9936051 2712382938 2712382924 +4063099415 1432400432 +203178316 1551551137 +3840209694 1198530318 +1378335506 3432406158 +3890014398 3200410377 +4071608395 1438967298 1438967316 1707409234 418787695 4071608411 +2948357990 3246769319 +3303899056 3303899040 +1028100776 531357281 +633813536 2846498541 +112420541 1231731586 +2469343307 4266198548 +1953430449 1189946787 +3747437391 1230886319 +4291661364 3998062164 2994476703 +1216258128 1912494263 2855283455 2116495890 1999052562 +3457107315 54823437 +706780883 4035633604 1706538839 1706538816 2853689645 +159066898 2502900155 +3241770556 1770109031 +4063029373 2216088331 +2357045328 3702984036 +2196716053 865627914 +4060587927 745756811 3411376546 3226822777 3411376574 3054133294 +1561886168 3954480499 +2039181248 377547589 +1094448269 641497074 +712265147 712265131 +4014531090 2076379615 +1094730318 2156946905 1983027922 2156946894 +3092037456 114896249 3781828663 1020924946 +2261959056 3452351925 +2065161302 1635150194 +2204969486 4074320921 +185443025 2829982381 +3603463770 2006902717 +3230274356 1297889999 +657962095 733022894 +1665296820 4119619161 +3027171011 2657241676 +247768092 1536055313 +3666899885 213507076 +1283932220 3035242097 +3778143068 3716737479 +2421483683 2421483699 +350487209 2327804933 +3096317383 2959899722 +2088982658 2227459235 +2989790655 1204272040 +3719630483 2533749114 +2329940895 2071972427 +2558081829 735583034 +273982556 4091937544 +3734567185 2077234630 +1338407537 108183536 +2650216724 3220994671 +1133027357 1485927938 +2505423645 3625084907 +1221892898 1885720618 3366991491 +3108095897 2638990441 999110110 +4284090013 3622653988 +650940616 3691506379 +930406507 3086829666 +1947561562 398243755 +2200735474 1898252019 +2128622413 3050124744 +175831690 1441432037 +3761934124 674194007 +1265819202 898406493 +754110455 3107807686 +3118448144 2872587043 +4123212825 4216822622 +3992473823 2820762012 +3181763919 3676005208 +3747399235 1309620534 3792444266 +937597554 708136872 +4234407732 2908999239 +3828970388 1335084144 1335084140 +3106876115 426189655 1480616492 +1972355822 4283423929 +1376093738 1219638290 +2691392659 2552255254 +3824622608 3993054499 +1627912811 714028660 +1787184104 1787184120 +2734165212 1752972871 3796837056 +2707014731 1263534594 +4283009776 3502618569 +1728097634 4252651502 +969430864 1180791541 +2139668475 620348123 2330874590 +1136949290 3628673549 +1879383275 1124894178 +3517404651 4117512418 +225452063 1182961864 +1346128184 1346128168 3861459523 +217221157 2261537338 1839559005 +2450304986 3287864381 1853334390 4021557242 2623608916 2860640438 2880831413 +2942126438 2892055344 +1636752256 2592492911 +371847175 4171546884 +607208988 361848344 +975037479 3341554752 +2278823153 287285275 3201924061 +1198801265 3260973587 382572088 29406720 4291210715 +697644893 3538298740 3423375019 1649409858 +1373169947 2782757285 +294264091 294264075 +3078265953 923020470 +3006498758 2271417350 3760110775 +3334323334 116426000 +2084882409 3897363801 2303112142 +720856371 2549687271 +1387819360 951027346 +2457064099 1418884893 794072714 +3928045943 648738134 198275325 +534344826 2393972310 3014059349 2639420445 +4018890787 997519114 +3818687866 714483267 +4085474918 3185193601 +2201191988 2492813239 +1788257483 2519034754 2519034772 +3065947556 2893940604 +3541859172 3117825663 +1756672526 3799272473 +444975721 444975737 +4119456105 4045041742 +3422883401 1962245358 +1056408073 681686062 +3009513375 25722718 +3641410557 2301182752 +3713844020 2115530013 +1178992106 2318317403 +1771739751 2774601760 +2938518702 1731298809 +1237627094 4137836785 +3588839517 3250928043 458627700 +3546132043 918804149 +2706023529 1367396696 +1589012255 941905374 +4245486466 3715100085 +1563468569 3432038494 1709102057 +3156660813 2115833650 +3561151100 92450865 +236783276 3820060872 +2590574339 728080282 +3622811416 3519254693 +956507380 956507364 +2857334515 236470426 +3983380063 3035153761 578232222 3381043996 +1434566236 4148079313 +1486216544 3555425843 +803447025 636607306 +1591486675 4019422596 185447807 3337995990 4033925719 +1602907361 1206478390 +3441584315 2821381732 +3899510899 1474241818 +2976427334 2976427350 +3689981130 97741293 +2099509005 1318485604 +864940318 1181913654 +3111858109 3119261332 +4098613807 440936888 +1607324371 2751652396 +3715204708 3479421519 +2813271549 4121703746 +3190092556 1142121248 +4221464968 2780281388 2780281392 +2986988257 134563488 +3073921837 2837975878 +2992414896 2010182933 +3790285994 1175601871 +2751131597 550372658 +1716109592 1716109576 +3006498756 3726555551 +3755298646 2999706737 +345538591 3034139338 +2162372689 916787078 +895119665 778055718 +2491373606 3207801321 2441101131 1808166946 4169750121 3933717441 739770114 2457878737 +3770860865 329024832 1449607970 +176028881 1523208310 +855136772 2194325721 +1340187752 674615211 +2373462427 1328119570 +3633452265 3606506190 +767606589 1131220226 +1254965702 1813274129 1813274119 2266925751 1813274118 +3655520358 3655520374 +2601839589 700054819 116349292 +2441949985 1284093766 +2330981827 1227700005 3922273439 1537593820 829991925 +517564394 3481609345 +1570896065 947720026 +852756511 852756495 +1628326803 185012736 +4229515883 4054617835 +2479839018 1966680340 +1415754953 2690816110 +3151867873 2667306784 +2299999915 2055933748 +2498008200 3956658717 +517424867 3599496263 +1326059575 2286479255 +1178251512 2254739067 +3947600574 359668892 +92232272 2414229752 +3447554989 3418733698 +13004189 3579743787 +3127008720 2169239574 1956277119 3393870213 2318681959 1105273349 3396959005 1917730747 2796680598 3759011755 3846316656 3693233860 1715108248 177548490 2584881787 +883644401 2571602295 3669717104 +540862184 2178239747 +915273181 3195669218 3195669236 +1006240661 3815405702 +1386734844 418709159 +3270393544 2769081547 +1030392395 808483704 1030392411 +886414459 2806338994 +4073915515 1990555944 +2085013082 2571254325 +2383314582 865885098 +3875418685 3744011796 +904243686 3076310155 4072354370 3093087761 +2363145993 3311057710 +1714212288 1797087912 +1869188943 2989267281 +4261025266 2980730621 2888233044 +797263175 3165831292 +2998700265 2998700281 +1209087762 2233053523 +3762443507 3666779553 +4119993418 4119993434 +1668322277 1865994618 +571062392 3721781523 +2759529507 2290034589 +3124880658 1203477331 +2374590909 2374590893 +1585774098 2598323006 +1470476562 2197956683 4101779373 915922590 1244991538 +1556898768 604379179 +273720608 3472093541 +2634428991 1874925886 +2243946277 2535942218 +2201320713 2509800581 +1362422730 2689543917 +3377112748 2357485783 +1611120952 1681206061 +1333601920 312612247 3576158361 +3119114840 2756646387 +3075189858 3995098709 +3933652735 402342760 +800123321 265694800 +2389413345 340810038 +3651192407 4011342576 +1855283202 388375331 +2301450562 1537674058 +1658234705 3907609744 +1365441423 2916221454 +547437274 936355115 +1581308014 4279694898 +1506082159 3222992312 +4287882397 4073775924 +1265728271 827234124 +3140149058 3866981603 +3245577331 4226986252 +617825740 2793596628 +2564532521 3402320782 +3868307916 2836733921 +3370779675 4213608904 +119198572 1587161728 +1308987408 739229309 +3854776663 156451824 2652107459 2652107476 2005205961 +1024918176 3409519097 +2225453870 4276463983 +1863008115 1102373402 +828072368 1658505237 +211259720 446280779 211259736 +3721972553 2236089336 +3646544888 544556923 +2883679594 233565981 2883679610 +593723159 3433107760 +3481396681 1920777080 +2181459320 673076205 +342927793 180334621 +3734489789 3390574232 1679931945 +2732457996 2732458012 +1779251300 303285336 1456457065 +883835426 876695339 +2618756950 239936615 +203634563 2143134909 735786369 +3760895563 3724183416 3269658114 2221748299 +2979376073 848585787 +2704066737 1786769062 +739112142 670589007 +3714473846 4264052433 +3957990230 3080036465 +26013788 3437125841 1393715463 +1592549966 3156132047 +2127468060 3140898321 +2297979998 4245028841 +466100729 3037559528 +2817196534 1799295447 2873693542 +2400773870 842238137 +3766252838 4130091121 +293289807 3557075288 +3358662767 2488667832 +4004645838 3748471634 +2433549533 880715746 +3525967294 2518315551 +2388436456 2388436472 +4214826419 2545371905 +3598927702 3817031222 111758439 +2077870391 785891737 +1470010896 702764578 +3702748859 696510564 +3195709303 1377148998 +295707349 1777451885 +2503327192 1614009700 +1087005922 3768373205 +1591278550 630485489 1744366086 +1487518720 2469590021 +1561304185 4170404478 +2927452144 2673739459 +3274009876 2944221289 +1346445759 2370426218 +1951884192 3432705060 +3582815315 2158069413 +1791034407 1744442217 +4050199510 870300914 +2837214281 2160791288 +2372370377 1659775352 +44692197 378101356 +1036254613 3498586506 +1876545478 353481914 +1301006298 3976961067 +1311366971 2444814909 2461592515 +3953527765 3417603686 +1459660972 3049046428 2927446910 +3976354921 970789388 932066501 +2943253179 3857396836 +1894587467 3651736633 +1709981453 1711715702 1853779538 3674048861 1554478169 3187157081 3473673422 +2122326124 936951680 +4183705103 4130069068 +4039893464 2196397656 +4120721310 1149144489 +3318687502 964812172 +3745665559 3644894680 1038641195 +3689981133 148074148 +610231218 1702492713 4096389413 2433135437 1420421406 +2873207516 3025465448 +1902250976 22896344 1566093733 +1570802917 1697978048 +2647483775 14006628 +2357610966 224803825 +3579036745 708891475 +160590776 3380581037 +2049365002 1428147117 +307897896 199889140 +2080461146 2417168573 +1496293472 3434516269 +3606940737 3294070118 30461159 +3770992556 204855488 2177258433 +446009765 2121549498 +1848367731 3792233242 +3761765173 1947681484 +3814509738 3814509754 +314864617 3533871438 +3627396232 2644057596 3494681525 +4087547123 2971584387 +2810069348 264302719 +595547801 2763092862 +126380572 3181941669 +3611338239 3653587070 +1503630835 154733978 +778161587 3069628634 +2732206870 1936839591 +1480022715 174545278 +1457022626 1487507715 +3931614480 4161105973 +3001951653 1373979308 +2770928674 1872369974 +3335900785 1939078128 +1804924936 1628921612 +1629052075 2258781389 +572963962 1023063069 +1913275216 3936974121 485084845 +1412598043 2794313106 +3273530056 4033095883 +3722335303 770208295 +305419464 2285593968 +4035150088 2289943604 +3890405167 958748408 +1026115888 2038121394 2184549197 24414494 +320366457 977541378 +3132429970 3073102139 +3241716590 4056728558 +1119309881 1119309865 +1358303287 2858124934 +3929569081 3929569065 +1520486167 3256445232 +635639712 1149120741 +435037432 1060856196 3387175533 +215845422 215845438 +710896955 2556991237 +3054312038 1203795879 +3104788124 4011376519 +772155623 1521640374 +717673619 3925910394 +4034157726 623758527 +2140912424 4183874389 +1840527803 451203198 +2333686301 364280738 +1902391399 3874941042 +1606220624 109027043 +1787552160 3465822923 +1492413788 1690838983 +4290642661 4290642677 +798591950 1664519001 3250561874 +2517027171 1052240582 +2033378496 1819379832 2334005829 1164139163 1164139148 +1086743254 3461191409 +3038135421 2400047298 +1908169339 2256695204 +1239231220 992648719 +2046136598 2013857249 +445706436 4005045176 2519401609 +2867334928 863753596 458208821 +3115180720 4105004266 +1360083703 2501890768 +2597096903 1996697686 +2662638510 2220731129 +2310813198 2836450490 +605344731 2333050853 +374133310 2519712049 1492055958 +3200412179 1594686444 +599489069 1601329688 +42471876 42471892 +3474617762 2829528579 +4092698470 2229067909 +1022207529 2549785253 +1332300440 2596302157 +3092931313 659145062 +867961187 3556951765 +2818588215 2942431376 +3651311579 1978994116 +1493972404 2013383177 +3178339824 702259413 +4265681498 2592674731 +3633438450 3751933669 +960873072 2563839555 +759936262 1412298849 +238543267 1694958380 +1530274298 2419555458 +1497071162 2997335389 +3808122935 2292965008 +1418015942 3551663038 +4061296847 3792973272 +3199225842 4070877998 562944485 562944499 3199225826 +2690629889 339912742 +1414330868 2838330137 +797954740 2204670015 +1704279926 1609754321 +3639393202 2867841869 +2968521638 803362369 +2113022087 1706093971 3409300608 +98688108 287644550 2204783585 2928541207 +3613105923 2975967984 750786499 +1654226437 1017209292 +4254506753 891047574 +3984908846 3984908862 +2080570650 487337698 487337717 1387556843 421791030 +1659738922 3859497741 +404885753 4137727998 +3892315263 3070694398 +1400341788 2166786823 +4127495198 1731537705 +1201898588 577330375 +3474411141 2259721036 +3285604058 2130804386 610973995 +745353713 1870158465 745353697 +1417469607 1510011780 +2781649686 33562615 +3266726751 3824723592 +1986735727 3699497489 +1970652958 1970652942 +2227227742 2733272487 532964168 113523708 +1375902024 1645694027 +4095619315 1049038490 +563342994 3414321466 +3885163221 1631262026 +1086743243 3276637570 +3589054699 2927710708 +1341271565 3879632484 +2131513459 1935844634 +3447373596 2486884625 3447373580 +2718526710 181831495 +1393835866 585087659 +1448893800 1657087753 2237428536 2536888655 1533479604 +2649287499 3769263892 +1438410633 2157378744 +3780503553 3141286272 +3233737403 3798671833 +2865735979 3173049688 +68207441 3076749446 +537201737 2071910574 +3045999470 592976878 +2282154409 2282154425 +584822702 2379583225 +1031508641 1031508657 +1370630254 255001277 +1783498694 138812602 +3915243785 2412878712 +668080844 1722338972 2324361760 4035588321 +3081298423 1021469360 +1689925724 3978737873 +3320441723 171815588 +4015398326 2124110346 +2698340598 636762961 +460241712 2701110923 +2905159803 316926372 +1669726451 2666757786 +2447272441 2585842423 +3026597991 1676331574 +1399602610 1237202514 2972720475 +3203844320 3316853676 +3586890915 1140732235 +254817871 937786968 +3109595835 1630611839 2174010468 +2072103218 431367582 2105627853 2672802213 +1990728202 1990728218 +357721883 2880982916 +3282451782 1152546081 +2257996690 1889072837 +244537771 2633377826 +2848957935 1088567096 +949170282 949170298 +3459201611 3747136514 +1581687360 2838588115 +2978030138 2823348546 +1151393955 4062012214 +1079107961 3118854526 +4148495778 3819429397 +2654005263 368922510 +1069223377 611762182 +2876546160 1485980739 +2960295719 3947545206 +1162961380 52238847 +2997780510 1723051839 +1141863554 2790549685 +3116412548 2530400202 +3387295020 2711591100 +1572017319 669614825 2939288255 1174126670 +2509365861 3651626234 3651626220 +752458629 1721425312 +1666326231 1666326215 +1609777140 4293766415 +742431173 1857163532 +1854754852 1854754868 +2177508553 3020088632 +3078532842 3329055309 +899922908 1287699281 +2435567948 3556407991 +2788178335 1022014814 +1058840022 542917891 2044756127 2625623779 1107425253 3285530271 3619425031 4274102970 1838566152 2951854588 +970298326 1907992225 3778525671 1380668778 +1782584789 2155108648 +3258893842 3410480314 +1945547052 250980673 +1799875045 2249943424 1799875061 +3337790259 313605204 +2478451441 2131859824 +2348751691 2912417538 +2274217568 1505276330 188966655 1570121144 256077115 +3421706853 2937318813 1957858554 +902267052 902267068 +3510442558 2704297865 +3202934259 328534242 +4257133827 3565269223 1983312828 +4095125992 665679915 +1063783435 1417687855 +2121711421 4249975330 +2641182176 1644898491 +2219298626 3189929558 +4143258898 4207985512 +4251342023 2937550144 +2184324174 1122969286 +1130124606 2231011913 +823687330 3951421187 +4152906021 3499605292 +1155804198 1508371298 +378643296 4269115577 3880005668 3880005683 +2740108656 1449726984 +3083726527 3116100220 +3875521079 3684613254 1630911849 +4160168797 77792615 +1968756434 2363108499 +2166658172 822641964 +2097052886 260064764 +3035387344 2685081205 +1048537926 2828394295 +1038539371 27039896 +2979366430 2892112169 +1716064464 3642728744 +485992035 4242206172 +3765529833 2403252825 +2887266368 705950931 +176195727 3588890828 +3809306794 404472731 2394221842 +3338583168 3271736723 +2732834312 1954817693 +2097478470 349671201 +1743328075 3739836180 +2086314869 934236476 +3082727108 86843039 2367082628 +1959051344 565886453 +3331620565 3423250864 +3010138118 2005547383 2852931450 +2462978106 1415809867 +1910117424 3983617931 +2898290578 3658197950 +1002599032 3879611141 +3475798744 1097168537 1775050913 913922675 +626533446 264313406 +4000920825 1640915944 +3458948803 1291984935 +1721163233 1618954528 +1767336344 1822112347 +1354718206 1872956894 457035999 +3921733571 1453350057 +831274244 63180127 +4195685759 2665631548 +3415313535 484753035 193606082 +989328938 4267213851 +818471134 2138554114 +1116261260 1230531959 +938380490 3867654973 938380506 +2673557701 2712073754 +2159541602 4261125226 61071683 +3044528368 2763533204 +1096108199 2151767798 +1797941780 3351575919 +1512161276 55582756 +1691969161 437933714 +2113659880 2113659896 +3234784519 2360510998 +285962296 218212411 +1658041782 1229393287 +904482206 2084908969 +3670878081 1152452775 +2654896706 1583812085 +941130676 43471961 2021707300 43471951 +535783889 384013318 +1233231509 1275896988 +4185024886 840664406 622593223 +1489691148 3546405111 +232295305 1348635128 +169593387 169593403 +4002826265 2945679198 +100105564 66600455 +3720284986 2485068748 2770938879 98139383 1304341597 3205530887 +1270829373 3266956088 +2822903048 3892779933 +2587404367 1192273562 +1093436180 2903660665 +526919226 2868129117 +443441080 2236807763 +3304617565 1881298018 +602654900 873478222 +2551075069 1534181858 +2344636204 733782593 +3234682651 2655002514 +4236336589 1285990820 +2749458655 3671594782 2318156188 2040613089 1508227616 +3376829324 1706394977 +945440288 3592184947 +2206986523 2206986507 +241445051 241445035 +3471879838 3471879822 +1215886265 3479677992 +1258550159 2788715022 +755114193 3290764384 +2530271438 224692818 +3854366091 863406530 +1747869218 587083669 +2084579815 2147612320 +3536029685 3201238698 +4043383350 4043383334 +3217455342 3547356857 +1402639443 205619127 +434387576 977799931 2892575492 +1327225805 1440416676 +1931276233 4287461742 +1416398319 3587626808 +3484158200 3822198381 +2844344097 1115425079 +570205754 1028377877 +3391607649 3391607665 +2436361017 3557247678 +3196037862 3196037878 +2763359496 2723235888 +317568077 422761778 +839135948 4196259484 780536055 +506487161 4280906088 +1998960155 2875042962 +3817235819 2542905204 +1101443700 3625858296 +318921875 2050755351 +4283963433 4294408088 +2183217724 2729229799 +1284657856 1425245117 +1860518898 3207551966 319933202 793652635 2229925363 +3630646234 3699820938 3647255459 +1675465736 1037043869 2651536669 3950874403 3950874420 529182000 +2516766207 1313864636 +1642795131 1642795115 +518557698 1892777239 686819214 502905306 1938735800 +271764130 569703701 +1567727860 232808463 +1057575510 3116091703 +467942810 2186082685 +3496864305 772481997 +2511837937 2701715814 +1849892399 1849892415 +1290790159 749049486 +922505506 2972956803 +1304341570 615570254 2770938851 +3769239435 3781909176 +3046497515 2224398094 +239358676 302338327 +585743475 1133714935 +874232260 1183834589 +4022630872 1246482189 +4264564139 3501333565 +3585573404 2984711815 +2795744903 3668688534 +191373923 191373939 +3098673239 540909805 +3966093117 1631102210 +909848208 909848192 +3556569912 4013089069 +4260177238 1035686966 307349095 +4294164715 3619205602 +966933795 3714465290 +3793751191 2203260930 +2828093319 4240093874 1273202542 +1418530570 1371674246 +333721861 1429809868 +2675047720 678528509 +2608142955 2883724817 2809451100 +1143908735 3564425960 1541931819 +2532173451 3112686008 1658392949 595717314 1314657629 +1410592443 464864857 344274638 +1902586828 1365897783 +140781740 47096279 +2074950475 4239677204 +4056070923 2693558850 +2945668130 2459937262 +3583181050 3199631238 +4010522255 3731907342 +3081353246 3816179864 529979433 +2921773223 3455364832 +39925046 39925030 +3001654923 818189506 +2008273416 2327611352 +2341688240 1760345603 +2204103698 3792517189 +1654326076 1980110705 +1785409290 2440366693 +595111451 1890470856 2853930234 3295361189 4059698308 +797920494 3432389295 +3262215744 1486694099 +598733800 3929051800 +416253885 3474885508 447159846 3900792343 +2142141135 871002109 +3098434272 2591624883 +3228341997 3228342013 +2192055016 2527222589 +1863655249 792743056 +3792548186 4191591714 +4032233324 3304331031 +538100329 3867675470 +479275832 814156091 +3375698168 3375698152 +1142710686 3601705897 +815867316 1101945433 +740601691 3636464722 +4262382236 4208422225 +56008286 3686516863 +2490981364 2936783119 +4192323965 3681562580 +1727855782 3326196033 +2650715394 2650715410 +4119989395 2040461206 +1363225255 3456141826 +2628921882 3469896400 +1872546355 2635148995 +467034916 4135457193 2977287448 +1307422447 2620023342 +2131102326 1820489681 +2260565177 3578484520 3310042648 +2297755240 2819470682 +4011348337 329991702 +276860202 1532224914 610154779 +2155963795 3736266362 +1823586569 616974638 +2421894149 1149651930 +1731869570 44805557 +1621802745 634036734 +2444891712 2817590995 +1515203904 603135336 1815559123 +298984000 3155758328 +2270575482 2260705547 +1684332612 2471020615 2471020624 1987426019 4185365212 1970648413 +1092555838 3253525919 +1871933861 342787844 809440669 15914408 +1753993555 2059431383 3877275066 +2385455216 2385455200 +293119893 368037770 +3220060716 1342542679 +2939563390 3269639305 +1900046000 4167149333 +1959189086 1465672830 856277503 +1271953344 422347603 +1781265284 2804963551 +530267962 1817423116 3129609669 +2428451285 2292722737 +1368544928 157179372 +4212449212 2460440423 +62921877 2087517834 +3255858776 3622456475 +1808928365 950849236 1808928381 +1650901899 348706882 +2842756135 3823733088 +4017082715 1208390220 +3782402989 3646552603 +4190524869 4164486426 +1327853217 324345542 +1558261382 2928933073 +2069970129 1624913687 3003166472 +2579236988 2130795313 +4065204603 304289320 +3403280260 3910411759 3403280276 +1501363126 2512404369 +2779148156 1090617393 +3565142041 2652596040 +3272017501 1628374114 +2760890227 2760890211 +2261286790 2171196169 +4254247460 1261799694 +3283574531 480940458 +2006669239 9114886 +51274245 2628162678 +112665460 2213203401 +464757048 2398214085 +2176274949 3396749849 3998285354 +4244562364 3835046256 4244562348 +952241134 1199097775 +3196219742 1163425513 +2656231168 1014304005 +1705964333 1063833554 2751408005 +1923642083 233866491 +559719512 3705058971 +804241513 3748390222 +4005362596 1203198361 +586823052 2615298913 +1061293305 2381999080 +4270445566 2969090271 +1002011866 927470754 1002011850 +1301925182 1730025631 +1957514185 3410130015 +1775107629 1106820473 +1024405476 48784383 +2163515147 202792532 1530297902 1530297903 2022710110 3301483129 1758633717 2135019480 784251881 1530297912 +1044911263 1044911247 +2932474958 2407852459 +2009745710 4097046457 +481363856 3132024739 +90708209 1944011632 +2542552283 1846586066 336504539 1825596612 +2852904851 1135670394 +1069965621 2588608124 +1597421931 2191859156 1311105917 +1824727674 3486586966 +2997075444 734267161 +2516386438 2739599585 +611409774 3430496815 +2067268357 2067268373 +729631602 2586851430 +848090707 3616371828 +637345121 42771947 +1761063755 1066706123 +2619868541 4092547595 1342219220 3003239010 +1461272994 3200406019 +2571712710 340025249 +812756608 3539324067 812756624 1841928780 +2262844778 2262844794 +2019819568 3043773315 +403110667 3382065711 3724358228 +1674963111 3502063350 +4284695014 4013997313 +2189569664 4075762579 +3373230016 1128289107 +4023239571 334159980 +228397819 1766121778 +2193633893 2193633909 +3222066444 1613980151 +1795173848 1570484880 +3844073511 3627709814 +3339973816 476724653 +4018908774 2128841367 +3045641850 1568067394 +1025438544 1025438528 +189193808 277870563 +3463514010 1915714915 +3740643050 3871496795 +3641898307 640121853 +240914433 2616013206 +1335061524 2988496745 +3669321189 814704506 3955221789 +2509978357 632154252 +826790836 3452016649 4039267896 1555591892 +3800430646 3471162641 +3118939562 663702021 663702034 3045564262 1359352475 +1027683672 3345342368 +999495593 3505210137 1905147662 +1880920714 3804241158 933353957 117092141 +130838754 685093845 +2511972219 776119972 +3089222573 3980855033 +2786030556 105207953 +4209383644 1103838232 +3787772990 1214030153 +1296052552 996810352 1155698348 987922160 1033620961 +3787395445 3569908540 +3157441192 3957053053 +4008052203 3439637626 935218214 3602671634 88527645 197190506 4189534646 3958295887 3842744053 3104950873 3120748150 92648145 3590522263 3335419584 73720999 3880147641 2337270324 3736955095 528634097 326532365 286429763 2326102394 852064874 1664571515 2227170961 350544197 1751685661 2373637105 2966227739 3981797015 2502842481 2766913948 528723932 3529807902 3992438610 2374583139 +506850685 199547860 +2262738543 1331096209 92840814 3285326016 923814926 2591646657 3709231148 3138947555 2964294674 3123067354 840068142 2380590047 2129371417 4268827649 1321770100 175542997 268348427 4166428419 79927146 300307484 +730259248 3042007189 +4017715578 682291779 +734582573 439008196 +3347418401 2118820166 +1195440149 1078364426 +1693660122 3302662187 +1999924465 3491738125 +4058630960 4058630944 +4058555555 2502375824 +4163058036 326332825 +3615206292 3417250297 +888225815 1858593830 +3067181615 3112401772 +4102574576 3801676995 +2697744969 1789233400 +2796433271 2796433255 +3828670348 1347445687 +363093028 949673977 +1485601131 843102485 +2287014390 2376025681 +3849636978 2833110885 +3520738267 624601932 3881543863 +3665883254 1861913031 +3819279758 3953815183 +3969039736 3808445435 +3168187013 3405449050 +4129829723 179073800 +3543666217 2856209048 +672423618 3658558325 +674980488 3715898397 +2716365521 2985082640 +18749303 2691976675 962523216 +473033607 3918906752 +1130870739 1130870723 +1587053929 1379350079 +439297608 2151236436 +2078702448 3414933000 +946712824 3433928301 +1287044968 2180782485 886850972 1757315664 +4224721634 1252452821 +2521677450 4243325190 644019003 +2830708721 2830708705 +1059702660 4073002185 +398752734 1398448617 1213136489 1519331330 +1497797860 1847354089 +107070674 3723024019 +3758417582 3729625390 1438065647 +4019200546 1067855677 +1624443000 780644627 +3232374034 794061899 +1846179542 1081006642 +3041665371 3731485225 1809125662 +2079343144 3462543939 1837371536 2338018545 1127752939 +1190660361 3245750574 3245750584 +3406125622 3406125606 +1065131601 2366389767 1110260102 +2600603708 1077907047 +1009979439 4083317230 +2911897185 2595883680 +1725498324 243107587 +3727197799 779405177 +3856878714 3856878698 +1875066534 2522586967 +3709124038 1191924057 633305936 +2411864927 2589854739 +398233075 1356035468 +3561720809 3476396268 +2689273824 908721587 +553861229 1696492420 +190545368 3104250651 +2118004419 1812321405 3159367846 +2241824447 421600958 +2275176488 2679446209 +558986416 2108326856 2321859613 +1271124510 2192540222 1665385791 +2736978081 2042295036 +504319197 521528996 +3438938837 3932285805 2191461706 +470827171 3260058455 +2028153646 2073885049 +1940649548 1672788385 +3026893153 3152039373 3084928902 +695623713 1166465537 2274021606 +2932033210 4039011673 +1462102710 1641244532 +1609960425 4183080910 +48686133 3329834876 +1213389888 443594963 +3349825231 595583158 +1624872069 4219784524 +2764872600 102297677 +823766435 2118815450 +3434708869 3439574604 +2831884152 3317198578 406788551 +347762618 3990627438 +2886734528 2639103045 +3147023894 2068259771 +3361488944 3452781016 +2121059579 4632356 +3574561444 190713897 +569531576 1175750848 +3858890169 3458361896 +3183232542 3183232526 +1860295092 2227834399 +2923122865 2771023681 4167042726 +4064217172 3950669224 +3402402581 3612804524 1539131095 +1479755503 3350768184 +3411391728 132896195 +4142552452 4142552468 920952543 853931640 +1237162998 192709710 +3622016888 1397191149 +1731686265 4114905982 +3058872253 978164049 +2323392402 3407998342 +1393812441 1746408459 3907489090 +1697975124 1439672488 2793461049 +3047832026 3573092925 1863817653 1904592 18682230 +2285441376 3520485939 +930338388 2673501743 +1847590519 273814320 +192132997 192133013 +1253832838 1951524090 +1936745255 337589626 +4125891452 2662286375 +3575272780 3295954615 +1203550094 2081748111 +1393102540 2689363029 1850365108 2706140651 3595634914 1392727896 +4185170159 2623922220 +923115413 922923443 +1459553629 1541302975 +2803934771 1264951884 +50413569 3153576320 +97501295 1573442040 +1340367270 1787148375 +3497706445 4265753522 +40139460 2284667529 +1034503921 41594214 +518990648 2944960576 +831861838 1076863890 +2255446294 677257893 1193237554 +880097567 3012094942 +2832684070 958831834 +2377524414 3552302857 +577743621 1649899745 986331340 +1132039021 2773908612 +3543329982 3543329966 +3046279459 4172145180 +215885048 1135305093 +3319751566 2116913433 +4294174723 1816844861 2090966000 4025892010 +4214144692 920478651 1480416146 622808427 3786296426 2860884077 3860607048 288594769 3775863034 3095997565 1385769727 3662125588 1140125406 +1614111253 3285005498 +1341395912 4179195125 +3297731581 1790601026 +259872573 3447050805 2672841986 +2240589007 192154072 +1050118235 3817580370 +4128845402 3282302909 +4225861153 3199058502 +1757516623 322374028 +394569403 394569387 +2101245180 3616983724 1901465265 460923056 +761229803 3779443727 1480611042 +3944407534 4240042158 1083981490 +3108651960 1743297189 +1495284683 2269989112 +325220005 1178026972 +4228144882 592451630 2900457189 +1392576052 512535136 +1653621161 3368516888 +4277706503 1751275542 +4127081860 739301003 681586222 +2765083261 4029176514 +1136868445 3120538776 156763755 +3815173510 2164779511 +944831576 4286398093 +3029988282 4055864962 140160459 +2146029615 2350037496 +3328545469 249954178 +1841930713 2407972309 761617606 +3742707871 3445328456 +1001658002 700635001 +761741 761757 +4192323961 1357542756 3614452072 2626766412 +212002503 2876328790 +1740384357 2989725434 +2571656222 2242569887 +1899973456 2527301365 +2677653157 3825671596 +187091319 84878928 +823887558 341125559 +920038306 4126158851 +3861717241 1376446462 +855694373 1868205626 +1432271047 723312960 +53476238 2458452111 +3944193122 57927031 3981723934 2484102455 236484901 655363389 +2211061407 918311848 +2066805000 4127944605 +3648864860 3157227217 +1430826202 3621762947 +1328817054 1293160873 +3314328286 4182544679 +3829565251 3829565267 +3718852780 2639765207 +123600928 2531087597 +193984659 3332657004 +3311175020 480643351 +2195395843 31593386 +1692651020 3734854881 +714038563 2071683509 3061179911 631786030 581934592 4206409662 581934620 +2908039534 1502114287 615362866 +3286882439 4280472887 +863632932 755700415 +912400038 1115045697 +1318601452 2779863447 +4222462830 2915681263 +277723794 2703012826 +3713278963 1584699276 +2817658956 2920261537 +3680119164 143820696 +2534783905 3012998096 +3914223832 3914223816 508118029 +1102506185 3179755077 1005614200 +166187175 1119006671 +2885904466 1855930614 +2375060384 3474164844 2055982309 +3853442618 3759457538 3427259723 +3801367699 845666858 4121178903 4121178880 3801367683 +462825572 3512833407 +145493517 3017416292 +4086117788 4086117772 +3316092901 85401354 +394783697 1304647520 +1704270996 2109471993 +3368457123 3013241226 +2764920953 918549604 +2206347363 1760701404 +2263195106 1031244501 +1622648559 4022292447 +4031086450 3101538706 +2990434534 2783920913 +3278679012 2282919913 +4159009353 2268260590 +1547521165 3246359012 +1249557606 2013741795 2771817601 1249557622 +135810308 3259055433 +765286428 3937514513 +2807189204 2762073396 +2292150357 3095992819 +1086743247 3343748046 +2104207049 312820261 +3247383626 1808647968 1304039494 3767871457 4267057261 3700760997 +4249970572 1171532727 +946950272 1516353925 +2759129701 555273629 +2062832373 3702046874 +3596266712 1220417549 +3432535651 3849101638 +4133260167 1521460630 +687488789 3324646448 2532396572 +3882938130 3882938114 +3780409697 419107744 +988478115 2799047473 222074889 4144662856 3612897379 3613120836 2369867116 9359020 1968707047 1929662958 2805411611 3993260382 1202550980 +1969919998 3570222281 +3191518710 2810106214 2184485357 4122469847 998814922 +458565596 3540887095 +1853161310 1076756735 +3239738104 2640750483 +1722596895 2159196380 +881254301 1297220642 +1539610232 4000898797 +3355518056 1090259954 +1239682801 3834314624 +308215060 4287129209 +1001657996 2773539316 4026120543 3640235307 +2439864940 1529999383 +2502382881 2502382897 +2748439004 3210343751 +699766635 333274466 +605864016 692239861 +485978502 2510515589 +355932886 355932870 +2291551936 3383612556 2913965688 3383612571 +3844874663 1803090422 +2282943807 1960317502 +1963663743 3213212392 +2833689666 622930933 +2675680676 1062976075 +1566169554 255757733 +1266060336 4221480853 +2611456223 1837756971 687638504 +2423688631 9915938 271581077 +365094199 3382330519 +566469115 2640646847 569900580 +2108432183 217392006 +3389278178 3871156437 +4272932956 4272932940 +133608668 1700705863 +4207391349 761124076 3302878221 1029565994 4207391333 +3511959652 1476791385 914053732 3953220991 +969235572 1706068633 1706068623 +672427176 3223784555 +3909732936 2298105717 +1657556611 178231356 +206359385 206359369 +2166554940 2249912679 +597879697 2154519210 2160969904 2721561910 +1594239137 1594239153 +4093120987 2878253358 674590777 3533724763 1077863886 3941136350 706926247 2895030964 2009918632 2512261486 3934526418 4041802041 2009918655 +3347282008 2180404211 +3869146032 3869146016 +3140060504 3146732242 +2331476713 2556406619 +1925775895 3379448368 3111006486 1925775879 +1274856083 555061869 837176684 4186693888 +3630874676 3288152755 1656172128 3569979980 +851964680 4173567389 3677541063 4171334192 954500643 +3748853509 1306038119 384412476 +3903579014 2632760826 +1150831520 314657900 +2591017544 1642927420 1710976861 3889188725 +3868501702 3254946231 +2463842553 673662974 +2534655178 2652817901 +3408750006 3431168918 +624701639 1690356054 +394742220 3589876791 +328547084 3756782568 +1075617644 4260411256 +2815842423 2909619014 +17092521 1133700888 +171481778 3374024243 +2228142777 3397159208 +2635793084 822106409 +4250436230 1051483238 1193701001 +1120081883 1120081867 +202845251 1310661168 +52614563 3160360838 +789288345 2822537182 +3793826287 3913390894 +3052462516 3821295135 +1543276225 3567383235 3377284080 +598465799 780988950 1205925380 4114679897 +2011105355 4279897629 +2353166829 3316311240 +650884 650900 +3831981499 1237656946 +1714990320 1664925320 +1664534752 1758969304 2750622636 2750622651 255735973 +973617116 1616023163 3434462343 +1155196766 3264887017 +30259195 2080643240 +2795002726 2815943063 +373684979 4087061394 53087386 +3553749916 259384967 +637389937 1065932262 +3400686344 516246941 +1555235380 567048143 +4273583817 3693322674 +4048597984 1450503954 +3643588898 57936003 +2645246689 362432544 +398145189 3541956826 11994547 +675416310 1442061127 +499418425 358463678 +2295278684 2295278668 +1472719762 2927074741 +121664416 175506675 +3712964027 348947771 +3127014652 1694378161 2904166064 +1549969138 518637709 +517040329 442878265 517040345 +3545823302 1200629201 +1806325286 2737151425 +2657155646 386232542 +2035461511 4171026547 +2887329469 2828532628 2572406731 +3140741964 4273694903 +3171243723 1516740994 +2951618813 4041076308 +2103528254 2653516425 +1058840001 2899745762 3168025585 1116909536 829152592 2030416995 2892501262 2400941206 4083582009 +1200412476 248439075 +2772240893 1530733841 +1912245084 3379126727 +2483449842 4162992613 2430679451 +3782567407 1196339486 +163436796 2403209895 +591945393 3716203447 +2271297609 1729639160 +4235785074 4027999062 976981885 1779209745 +1081558857 3301259256 +2428385670 4033736698 +1246088982 4252035339 792584480 31784881 2659085717 +74902616 1662571792 +1239727359 4093079301 +4283510636 3434997399 +1399899007 3649290465 +4290819968 2085194930 +3052965554 2639746637 +3216906038 238979591 +2119583738 3688058507 2119583722 +3279597405 388108130 +1418319526 3137136471 +2573848328 2307975563 +3587681175 964894374 +971031952 2899771811 2899771829 971031936 +2080390381 559933700 +397873712 2234622339 +2810461995 3761205437 +300433991 300434007 +2922098271 2378399646 +2547698326 1802804086 2741824039 +1412877331 1412877315 +826461528 3827909005 +3693735546 268593675 2610093142 +2031361696 2031361712 +2431528658 4176721029 +2759063760 2995826531 +2778259323 894028845 +3983378685 3228477012 +2340515185 230639846 +2283496984 1528936411 +3497052194 2828672289 +1106772268 90822743 +755621129 1434556126 2272313887 +2195279025 470733654 +222721034 1648775446 +2993107694 3332045234 +1927537796 1623243743 +2143531113 2670158706 +3305915225 2337146142 +1877315481 118597616 +1733781091 4246530502 +2024667668 46445656 1370559849 +2512944609 2879269152 +3750942255 589769720 +3912027522 2475131811 +1053963831 2205969058 +1174164768 1754763995 3754206987 2627161148 1045678167 2807926941 239022464 2279855138 2232284290 +1928807689 71413048 +3223427038 1390547583 +807939094 2259196151 +1037075319 3326014534 3875412777 +712175409 65964582 +1439185741 1439185757 +2379087743 893279247 3125359860 +1799243394 2150161034 2150161053 +503488478 471968361 +1987599484 1025638013 +370950018 1339947914 1350039971 +3577435456 1342356416 +1233288786 1833997822 +1079032550 586952002 +3512118670 426981017 +1626339267 1556285436 +68246228 2581846889 771647796 453985343 +1842792885 528378131 +1616942387 3943358298 1310557344 3797559117 +3662023601 1296328624 +2574793830 4266071169 +785629012 190198063 +1184493806 2362525049 1616028594 +687309815 1956953542 +2405923486 2417794729 +2701923803 2701923787 +1898674691 2348842480 +1746664091 52276319 1746664075 +336038912 3810977296 521965918 989374794 2793017297 3905973663 595320129 1007973617 +3386406495 3386406479 +514272882 3006143859 2224577562 +3136172609 2247695447 2247695424 +525498363 1593237243 +3584210699 1653075150 +2689561886 27483433 4144885186 2064997929 +3120671381 3029002931 +263991154 643617340 +1966866574 3355176473 +4014669684 1804349907 +71970217 2424391950 +949070904 3420568386 +2381647876 881135172 3089986799 +1163806377 3697884184 +1062813505 4202599254 +3733071958 1799854643 +1575559850 2147586445 +634112598 3587147111 +4232272061 3674517908 +1727856355 2181217744 +1981278840 1604721389 +32959077 32959093 +2162386476 2393768892 +1041088904 933734667 +1884803257 133089950 2470286142 +3653646817 2795830289 +738017673 2553098233 3366857390 +3523795370 675995526 +1609094247 1652973088 +1601658128 695128956 +2044934157 3987815524 +4136550186 4136550202 +1717648224 2333112371 +1948017379 2880416586 +569741369 2928806312 2380617246 +109552001 4119662525 3097146970 +2603463366 926174448 250637751 2603463382 2841847237 +4107056975 451988890 +261199988 4130537103 726059743 1432835860 +2573633216 1013325893 +1505518785 147542512 +3932623252 232054835 +2800430901 4181414012 +3886104275 2881050454 +3336506541 2682297618 +2606902214 1152145425 +3272966849 4070875121 +3186413579 114000212 +4083111109 2300270681 587833084 3826414092 606422695 587833066 2283493059 +796257099 1316665657 +1632906953 1080360761 8758894 +1116529015 1944560937 3609798644 986115664 3609798627 +2605431468 607575233 +2766259158 1701267953 +175536639 267316331 +21972135 3066630889 +986592409 731696350 +2457336252 2457336236 +871713575 4062531168 +2132225772 4252949911 +4119321833 1843446478 +2149442030 2634721721 +3176994322 730447429 +1671102708 3238166543 +794332398 1986386607 +1461760697 3782826302 +2906978638 2075489487 +3429219412 405239865 +2705667740 2079651719 +974956659 3994889484 +1239025350 2821925638 137931191 +1829937411 3250822657 3075700650 +485268399 1406513574 +4245551912 1606228821 +2074082848 2969205951 +2506999313 2945211297 1288621254 +865181023 2369436830 +3412164197 2407135482 +1626458039 2965772340 1402823942 1173740009 +626892327 4183816032 +2557247744 3155365688 +4228991055 3844753036 +1115863302 3116975223 +2673101723 567338312 +3238246767 1205660088 +2519883085 3192447026 +4161708987 3296610943 +3430018022 3176553239 +2499916460 1034699991 +3985929729 28689280 +974820333 1691803154 +15906848 3803646116 +3798114181 2211872003 +1161131895 2110439639 +3753629404 280181841 +3092408516 3988450463 +2412090423 2332578457 +130066555 2814961801 735228613 2487598398 2940811684 2487598376 +2301147316 2669331289 +490858961 3754103824 +435520401 1853758800 946843652 +2516386436 2986404728 2706044383 +4161050449 3225040016 1811757719 564178678 +3466837358 2420948381 +4163411482 959789027 +2231058140 864285767 +3900523792 221493283 +3928337540 3660609799 3887243036 +3265085462 2352336097 1938547377 +1018612756 2814591855 +1132229737 2136460761 2783658318 +3978499465 2142839801 3610961582 +1224883889 2257286099 +1092417211 1294164542 +3141151913 1704218126 1007396247 563869339 4134985753 971121751 105735532 1208008935 1193829194 1208008944 1426396529 4067875250 +1534585263 3892715206 +2030536096 168040059 3581495832 651647731 +729935891 2044365440 2649385075 2425155052 2632607469 1943699712 1626936083 +2415489025 2796245376 +52186647 4049808688 +1854669819 1581860008 +449070395 3606351419 +3214096132 2562693961 +2349808818 771525669 +3176871034 1940236782 +2031563732 2581547915 +3533531393 2395753622 +2396150388 1227121817 +2943419533 3152685540 3433043512 +3136032246 1409645770 +528029673 528029689 +2866924879 4212312202 1349923672 +1137076080 559207747 +2336449690 2522929078 +2140170735 3210134328 +2473319633 2702913654 +2017029516 3462886263 +1071950671 1051329307 +910604182 122880295 +3503526415 3423530382 +3048137685 3612387402 +2182780953 1500076252 4270037509 23755568 394510677 +3648504226 3500776125 2965934024 +719042900 3420765999 +1012856067 209433514 +1178078845 3519486889 +3289020263 3289020279 +1557960933 340045932 +1939451131 1164809663 4125839140 +3094843195 1681768999 +3127008733 2748880056 3062682001 1520009130 4004268771 2735942149 1501978247 257828886 1235499463 2780047515 1356038786 1739799671 4000637508 1038526788 747975498 3365990383 3483565547 1330342406 2954541694 220575539 +1559562194 666587027 +1375999041 1567351360 +1823206233 1805876510 1805876488 +521085239 466700678 +630698701 2231894053 4207835314 +2736330909 1568784180 +998228729 2736778728 +2625874125 2869683748 +3282955812 785244841 +2588509920 2588509936 +3018490225 2871641318 +3928551903 2104803848 +1183715064 161583227 +2423379671 297897026 +186371950 3340666863 2817676082 +174612506 2085570813 +2516449739 3409319567 +1715669613 1591520103 +4187228049 4187228033 +3727186158 2810445487 +1162523560 1636943829 +3231964514 4059013038 +3735199544 1677985235 +2536255055 1233970766 +2606984652 1770379319 +1556516574 3935496041 +3879698496 2712281612 1224139973 +474128927 1219413238 +1491027975 2703384921 +3690908668 1310399911 4002552701 1310399920 +837956892 3158940423 +459710590 2693703241 +2326446365 1741553826 +1829408997 2359433338 +1028210408 4258620675 +2215222520 3542227579 +1527335064 3768004613 +2205717635 21060720 +3304879783 3304879799 +3665039505 1974867014 +2111928232 3522125163 +3320902835 1297167813 +4202674320 3876555445 +2143388156 721500855 2358592086 670363568 122184625 +1504285333 3566344506 1374937779 +4125417999 2702428725 +1777900236 3697255247 +2395385777 1948614327 +1164167643 387367876 +3254238410 587084269 +3204432821 2476045392 +3319491569 1768615014 +2497713953 406150332 2497713969 +2073591188 1301021951 +4102988040 75988875 +1434458917 1160582407 +252417916 4241450540 725579825 1172976944 +525032270 3152932306 +3652179709 1284356066 +530201027 2194206204 +3692799731 1921503372 +3492716250 830932661 +3618849483 2498833995 +2990065095 941092036 +2416446334 3099773599 +482174179 556126556 +3822285811 870474080 +905597833 2182185144 1871548921 2182185134 +3742878759 1500930400 +1210725810 2336937306 +2548016699 1343401714 +2409921041 820783302 +4105356173 2827326497 +2666899479 2666899463 +3786832967 1112018878 +1147010722 70716850 +869420026 2383256203 +2904773775 109712290 +173828575 4276138469 +20084820 913533999 +1516705105 1516705089 +2703025485 1424860092 +1070365032 2536601538 +1450471766 1867410033 +730447428 3453388063 +672341940 3390761049 3390761039 +4198104649 843795694 +3470921384 2818841300 +3850471591 4058652406 +726955745 385295414 +3984148800 1869843302 +2240811227 383077534 +2257089966 1993425135 +609692333 1886448402 +721840022 1360335153 +1566236955 1566236939 +2241367387 2854651474 +2921580036 642824265 +3391529020 291059308 +2736631749 2709187489 3581996640 +4102149974 1046871143 +1743938014 3788109801 +2564107922 697847749 +2884898637 4264826418 +3765682220 2184676673 2184676695 +3722103104 2137706451 +1071569053 684654388 +4227596303 3165919128 +1507529019 2933661668 +4150464058 2867815773 +131150475 566101054 +2703701783 3350968624 +3302558773 380516202 +2508450437 3819581274 +3513471370 636760293 905010221 241111558 +602901283 3038251036 +2381928967 4294804256 +1738099408 103208765 +4133740257 3224886304 +3110322763 2807031567 2557726633 +2230983942 1893769986 +424177726 231000604 +520501407 520501391 +4159438791 4172926085 +2864848688 4288092309 +2398275454 2251295583 +2310598423 3791191683 3844104496 +1455317674 281449964 +616273215 306967080 +1203380750 4160986127 +3783128620 2728492134 +1618872125 2933593419 +2163094037 200857354 +4032153901 2215358930 +536313306 748363307 +843615247 926186382 +1745633775 2899324864 3260350657 +2198026503 1158858240 +1627844493 1627844509 +4286124074 1435791899 +3076284806 745375201 +1212585865 1371579833 +326715639 3750255048 +943538467 4184893968 +4198718610 2387192396 +1792182982 4017124769 +1478655453 2605458146 +319658487 4117323718 +3673002290 3590033843 +2858271603 2761600524 +2750883063 353317062 +2841481490 2957729605 +2819245513 3025285484 2001581029 +1007591011 3993195996 +2158805992 2158806008 +675447632 2964633333 +4116641399 4116641383 +1285382323 1321155034 +4214694410 1826351589 +1383897177 1073264398 857986056 +1037265700 3726717415 +3891178999 966684624 +688029488 238006798 3203283075 2426870941 +26710368 1311927944 +2678292057 2808079902 +765480144 2583341355 648164648 +3472201241 3852159304 +4092649112 2620287309 +2181566529 4287608724 +4188080837 3179541516 +2757924927 2757924911 104180542 +3946573283 844594268 +3449736774 4143888417 +775327929 2412481161 +348902078 2061287689 +3174642342 3974425063 +1947682707 3035119766 +3720245957 3620645900 +3260590043 3406904222 3458900965 1243666857 3432005074 +2046053516 2274656375 +326061898 3795439981 +519957873 985450727 985450736 609090924 +2731385520 4189526787 +2695606300 2007923980 +2498544947 2746904396 +4230436372 1529631550 +3822989692 940759600 565141297 +2235014820 2235014836 +4252969997 3577822066 +82532947 2519061828 4187441069 293548218 926523072 +2922982105 3180658581 +1086219766 3787096647 +2112176658 296265915 +2147800856 330150052 +2769322058 1174921470 +524970944 2841622939 +1125740186 387171766 1515699317 +3892699671 1480780336 +3121836203 3623924380 +882309364 2876792649 +158757692 561473383 +3852606572 3929194007 +3862505677 1702716965 +319627306 665428507 +461259433 4039307278 +2199802251 4089077186 +781414115 890736458 +3959922655 509152392 1164218443 +446961693 2331052399 2584063508 1057924843 +270397100 186562775 +55781995 150080074 2800469620 3912542785 2800469602 +1425071109 3156892634 279877693 +100180434 1522213093 2817936626 +3203283095 671290790 +1180662139 1129069732 +20454642 3713372389 +2196368086 3397866913 +232022139 3893114175 1079239076 +4177296136 2638237219 +918200818 432861171 +2573803988 1417691321 1840565972 3202736959 2812939901 +3324979198 4198233311 2211507465 +3490290991 2921492718 +2821968538 768786549 +3259052560 1849735730 2344171192 2895193019 +159574401 2048235008 +620918978 2373897302 82057589 +3333835973 301858499 870668010 2516245004 +1818130295 263589968 +1978439186 3262221574 +2552626959 2463138958 +3959676223 3373615678 +1709299094 1570119265 1583077546 +3075519964 1879984465 +1234962398 3269255595 +1529996355 3532281194 +2848091681 1578327542 +208384518 3087984721 +89340 3907572336 +2155526252 2905625111 +1737278213 1777985856 3434501930 +3940957061 4248122656 +3232450560 2849837951 +1737063072 743577351 +1646132753 2908476818 +283074847 2250097569 +2172713738 3893047469 +1514418937 308035048 +896875194 3649418645 3784012509 +2493981425 3538566683 2987801053 +4164135231 2200743253 +3193808168 1008033754 +27455531 3196064692 +1875417569 3653909792 +436960875 1796735586 +3871491667 2530522298 +2533509046 1855382403 +2447212876 4222788551 2447212892 +2632797655 3499192406 2632797639 +1379514821 903835930 +1715552594 3045644781 +4058103012 2858179327 +2876233336 1494130413 +1646852639 2776743646 +3567082578 95966483 +2501890536 2836885547 +2669996653 4095543698 +1263423339 4148626804 +1575002067 2610665772 +2922150137 2362854601 688025598 +487094651 794246322 +754458024 1922477931 275723556 139194060 2475165776 51423167 376389307 408915896 1360766198 1461037329 376389292 1477814951 +1601829093 839045242 +2321495719 3249589139 3107400249 3241332730 +3562289994 1183632710 2325304685 2858520741 +1812251152 2072985724 +2171778859 627183701 +19059334 1339123937 +1456957793 370860982 +136611562 3145753165 +1683205288 2545470571 +4049793393 3632720989 +809547772 4058096039 +1001768368 1001768352 +606115187 2558271223 1380664332 +2899030974 2197694114 +762576271 461839820 2074732657 461839834 800325181 +2031097667 1983216934 +2667973618 554712427 +1812474067 603509155 +1205487008 3164314355 +272714855 4257957408 +3959992281 1789710984 +3776189284 3063580287 +2413888948 3094271044 859568729 +3383483305 1085296482 +4159433676 342110775 342110753 +21310039 1457628902 +3006096487 3006096503 +3901256674 4040060117 +4032868908 2486729559 +2219195863 436560222 +2483610420 1040034521 +2429828257 657841916 +2492323192 1889405187 +3490386976 2708516453 +1767109631 3458800254 +3740904408 3707532132 3674834189 +2724231301 584956250 +2311610626 3899700789 +1798313362 3039062074 1320285395 +1860488009 1003031101 +1152345196 1881081547 +328309118 1440352393 1440352414 3990768535 3911038434 1278517599 +1993745634 2653736957 +3710451525 1820973452 +4205074751 3484974625 +3235439420 548914919 +390495400 840697023 3821167800 1610550262 1274428541 2267088807 2250311185 1124371884 1124371899 +2852405204 2024831673 +3503406625 4293179984 2702903687 +4115804963 2528602289 +722065866 90739506 2323765499 +415759368 3988302897 +2541278871 1946941850 +3649266730 2480320013 +591984223 1075071772 +406945913 2820488808 +2418156703 576686625 +2902369103 2749044046 +1854568056 2079882989 +3165510839 485274915 3165811728 +4055113069 2219014919 1027255318 3951710852 +3489533425 1576006256 +815397554 815397538 +1206886138 3384223922 3384223918 +589231575 549257584 +553836841 797819525 +1296065277 2911839220 2572932180 +34173176 212176260 752670317 3246405504 +675685957 2771859267 +3589434074 519734010 907990997 +1231441815 588204720 +2247077324 2064119386 3434709555 +1164744584 1164744600 +2737570219 2303107133 +3213581742 194811597 +2942478623 2942478607 +1269870647 1579509392 3504375703 +22957334 1030969777 +2081378833 1562259654 +1743310674 3850264069 +1985762740 123398735 +1717024858 1981232555 +3047389148 4225957008 3428167505 +896621427 4208117860 +3681153959 248156128 +2604473101 2604473117 +3966666342 1384139338 +3091929608 641333899 +3322559282 4095422373 +662928572 4026358769 +1763647117 126394607 1239148517 1829763426 2182420526 504181495 1738124339 888588639 3496312932 3957820128 3494749325 483226785 75526765 +1190169290 2577843620 3003273677 +3665532252 1284251601 +1749864731 324973806 1273834898 +2051469873 2930721584 +3104113044 3605101551 +3279432354 2027565190 1479220490 484715802 3588142765 +858980836 1997177192 2102131199 +2913534932 890308271 +2980299893 2980299877 +751777530 2217970589 +2113106106 3830987 +1334550286 2167206031 +3583198085 127798205 3151186522 +2157884299 2157884315 +916917091 3518422608 +4200656946 3115686220 +2066144927 1531383115 2100327496 +2860116857 3605901182 +962695981 2174398404 +3480946327 818391120 +4242960913 3240141580 +3762344110 1482984239 +449091051 242745588 +3299891556 3299891572 1052134744 94156905 +1737743416 1170451515 +3171357986 524148873 +334350195 3528522252 +250823556 805018299 +2936502308 2898403497 +295642465 512219040 3319305104 +3861197680 3861197664 +2015156514 929681539 +2890543360 952836869 +1639143157 3260146620 +1383375250 3427336900 1392104493 +96753730 96753746 +1369367677 4196511956 +589266640 445948277 +727272016 3467223740 +3525500889 1033630241 3148688341 3310978283 716818844 494807543 494807520 +4114859424 3115326195 +3966283878 1758266370 +3778347533 2473736819 +1694504883 2988789466 +833180609 4002339008 +3443148276 2466761849 +4288882704 1344476796 +1798793217 3375937920 +210209886 392296425 +531443993 531443977 +1167934165 1804612938 1536171020 1167934149 +2773999140 3001529592 +137635506 2618878501 +1033082580 3277221817 +3333783212 3982274876 +1018286068 2444234715 2416551392 2242903288 +4278937783 4278937767 +4233069948 2905547303 +2310324520 4018934251 +2177857842 1869700735 2034140365 4063864269 1736538845 3480719673 1686680990 2342242725 2089343844 +3617686557 2420308404 +166426162 3484094643 +249606935 2193222950 61894818 1063407230 +4268955056 1059791875 +124096912 887367075 +3823632115 3107346586 +289867179 3721260066 +3469413317 3849170428 +328345888 4011244915 +125495479 2105301008 +3613559656 68371266 123189855 48847357 4198648381 3742488391 3822908474 664176275 3684620564 1485060762 3065269360 1657852693 1104610297 711250335 2816445055 1133378700 1221658807 3034699301 1124332519 2727573045 2200889013 3429361407 2164623601 3099878916 547099110 3665061979 2951320127 3643604690 1044934363 1848509607 3658233154 995924915 480762285 1618882677 3002622478 2361007932 2308263938 3067689807 1219729317 2201335177 2892980220 132852781 2240133901 1616477863 1292231623 2193585066 3663322478 1908919713 769816200 3680772532 2410891706 3459940889 1776281061 1839060369 2460518865 20765720 2740855475 606763477 1300604863 2886160087 2563864313 1406275728 3340586736 2379007959 +1371962766 1232578201 +2676396385 389798202 +3699640946 3699640930 2514252147 +4048490444 1211180571 +2565417036 51015585 +991553803 348773460 +211111850 696822802 +2740430687 678749194 3120757677 +2919416342 72845489 +809633742 1296476219 3320990041 809633758 +693084844 3025999041 +3074718120 3074718136 +710896943 3812155640 +2959913480 3273409163 +1709780823 1066736419 476906762 3306522086 +1006106557 609943170 609943188 +1978874170 3890419293 +3666700250 808548277 +471541190 2615890219 79460023 +2247736033 3374395446 +2876711279 1535746488 +572897853 4267978260 +3453961633 3078265952 +4185046160 3691773692 +2771664751 2151668654 +798083269 2810121740 +1829628614 2602807057 +931769397 2730104675 +3635058053 3158785623 +4211962541 3852394267 +3927415517 930209999 1215884219 3623608641 2748288740 2388697641 2960528974 1755917085 3427398917 3706171913 1140881748 1496860822 2738347748 1577485708 65905624 602787759 1808657407 1302154058 949733697 2366991981 +1317447850 1207665563 +287657530 84456707 84456706 1806379414 84456725 934946123 +1047698065 3748221510 +1607731552 2989465645 +2436080622 2436080638 +1763493433 2974550974 +1313175901 1639466799 4061073748 +3839874835 1600099052 +1007954258 3515842499 3854371866 +3279597394 2062891666 203554322 203554309 4053839899 +1205070776 3399226043 +461458876 1087329852 461458860 +3252381098 3596683917 +4060454613 3554216284 +1805418068 3143294521 +1883402603 1213055136 2099480472 821584149 +328458647 1758208166 +4256999524 3556578687 +4292988332 2088158657 2952351424 3019461907 +794785027 2521117610 794785043 +3744495039 710608375 +3254748783 3561005230 +1706649227 1735102287 +1720005162 2376988685 +1173882748 2708719655 +1239141390 1239141406 +1974971305 4179835672 +3110231113 2175959009 3719615061 3824691135 3081749728 175520926 +987143606 2912646038 1440368007 +336761107 2889507045 2889507066 +2694067333 1637225447 +4158177424 3124175541 +2234643665 2124702982 +641083012 420013944 2873008607 +3805011105 2817282400 +1696611969 2047155034 +572477557 930489171 +352160915 2653178732 +4177181355 1772984021 1981944536 2645809954 +3389116824 2564616795 +2262322381 1766925947 +1510733500 2094361063 +2728873552 2931565992 1566590965 +695053925 2632099798 2628356346 +3486133217 205728880 3486133233 +2267784662 1427676010 +1974661853 1021109954 +3518953543 1990252502 +998973867 1728446498 +2024120691 1606232076 +1286463696 4215920556 +660201004 2702596532 +2215003137 3556533030 +1198125569 1533100811 +2384100083 2796522650 +94808658 1076556089 +2688111926 2688111910 +3618776864 242517195 +1693368525 2967044772 +2873697245 2166584546 +3736287049 3709863928 +867282093 229823556 +3988376877 1347850642 +484720418 2639225493 2639225475 653792298 +2882612706 225280234 1548434115 +2346001607 1292127641 +3798465874 3149121555 +3937150506 2533364763 3506640277 +2080254299 3467268812 3773379553 +3955974131 1997155702 +141165338 1491263997 +811367026 1181159314 +2797156665 2929005758 2460985097 +1994610280 2413888939 +2146453604 1641370703 2815013476 3410097535 +435792217 1023776542 +588146190 581341081 +3789308953 2797548382 +1106772257 4201236192 +370433594 2503386828 2065225223 4228928861 +2037952280 2037952264 +4265582653 2066300930 +1795978098 4137270373 +807988683 2607699604 +3870113314 2985208619 +3267203368 3094053355 +2041932723 1268288218 +4221234389 3923956572 +2388545261 488982852 +1953099967 1923923068 4025260749 29752510 1541584769 1923923050 +2048300760 674472888 433509988 2924653703 160396813 1343606172 1226162829 2633892256 +113176315 3844712382 +3236134647 1784301325 +2014206474 144162221 +1317203712 2552118547 +2874029646 2391898574 4196367567 +1978358085 3866986380 +1644004718 1718496751 +2177435570 24583461 +4226428591 2137238737 1084718446 +3591297757 428026116 3650240273 2885102033 1100739669 3944536013 1385044066 946735430 2281144153 4245306137 747071673 2104606906 22740399 803397131 3751276102 236196677 1384591380 3200079490 4117769289 4132619353 2879165091 1787959029 3197804390 3413249862 366610458 3307668831 2899135969 3045159927 2886699202 216864419 2075671716 +2830243600 1944793580 +1743878494 3826816991 +3107282266 3909219517 +169492526 4143748375 +3915234680 3915234664 +3400240206 1273230523 +1990836256 3979965043 +341452269 4102154595 +3067222215 3531056727 +3056260200 762077117 +3431524810 3314026747 +2763480243 4020688010 2763480227 +621013306 2133337675 1999915010 +1459295386 2269212267 +2330185974 4119035476 +4276566659 2831118960 +4167918221 4167918237 +1232631461 1232631477 +3785580927 7830332 +3115245587 1632288236 +3026351740 2234497836 +268293596 3737097617 +3099216958 4288366643 530205194 3178571640 10176969 3387067821 3387067834 +2919980371 3586707110 2548466238 1323559354 1323559341 +3195680243 3445812620 +2891145230 4196746363 +2590745033 875013727 3184601657 3765415790 +600733112 600733096 +3656707938 150501507 +1172302647 914311046 +243825370 3134809405 3112363670 2698781717 +595711253 1791942601 +630632563 2671232268 +2367302764 2352213527 +1830815189 2845040236 +3436671027 2253213773 +3122808275 3606309690 +3614802660 301796607 +3250960059 3309217892 +1448495184 4252618923 +99617784 99617768 +3671653426 3671653410 +1111116603 2093247986 +407971025 4151687264 +3231275183 3764820856 +1678836959 1707780872 +2955774822 921227441 2955774838 +2668799901 2183327154 1689364756 2375999388 1359043982 3806716736 +113541893 2891595994 +1048598621 3238730356 +2215026937 3480184830 +2870382570 1638261461 +1068074844 2480936391 +2653178722 1428335427 +2778206982 3026580065 +2618583378 102878213 +1181337215 1468234238 +4245495428 3707004792 3752266185 +1888945395 1160960608 +2392575213 1816369412 +911577001 4043102469 +307349099 1371239346 3991889048 1102797428 3991889039 307349115 2958064837 1102797410 +4233792864 2727120421 +1920813989 3334556259 3149570250 3762164908 +350215071 2070330206 +467263478 2928148788 2315526081 +452859777 2164461076 3956759101 +1493942845 2619465291 +760706925 3450929284 +2457850654 3174651945 +1494613844 1494613828 +3687305024 2100855519 +3927508961 863282292 1414302776 2752439495 1791457798 3155102349 2769217117 +2587299267 2376701872 +4231027432 3894352701 +2636458275 2545518323 2545518319 772726773 2222965258 912150290 2826336581 1677056312 +478600301 1431109508 +1856219374 430108335 +3632414217 3020800120 +674956325 207734727 2045216300 +916925082 2737311869 +3709620099 2526096170 1954524349 +2019273342 450167199 +2859930524 4118011537 +1168472851 1168472835 +171514106 2493236101 1983171148 +3965768727 862838822 +1325256963 1552943036 +2560816647 1334398230 +3150593028 1939112185 +296506796 2118835649 +878407339 384775970 +1709177471 3734459902 +3845513145 7616779 +3762505305 3762984917 +65024832 3659214274 +4233187635 1728238426 +1400372162 669078115 +550060601 3587391400 +1960515322 4007996317 +2704011321 4046137790 +1526510524 3031657708 +4066723361 2982417675 +1964031014 1868050391 +3707701748 3648826137 +4275446237 4275446221 +3409570706 1965633069 +599375256 1509239344 +3304078027 3509357954 +1506266559 3186194049 344515518 4219363708 +3471284097 2469569200 +2867901217 3413249200 +680080174 1107685817 +2142747488 2142747504 +4121619807 454274206 +3120230849 1908483542 +3402457505 1150595196 +3350455661 3474895843 2616789550 3474895859 +4006564664 3089224583 +3227674432 1172053258 +2173134789 2905103130 +3846607430 959668881 +1017973713 1432984070 2067625846 +2754930064 3208171516 2754930048 +17073824 975171045 +2637873439 2489316298 1561118445 +636001031 392510275 4050048119 4245897439 2204151197 1066709844 2772141982 1754626450 3544923941 1951549173 3845845750 3517867962 3356153033 1712742862 1053504120 4212029295 2091035168 110366691 1403158337 165716218 4193348091 2087308815 1809127409 3191556468 2183392536 2760598150 1597233259 1113677932 1025137970 3580059987 1865905955 3354501148 1103935979 3625121201 1928149113 1358391678 1583568305 47351734 3703447964 1752377259 1497209634 2592769738 3899099063 2961095066 320468056 4070202413 1420795554 3219995107 1633926427 868391042 474820273 +4233602350 1811482489 +957451698 2292322099 +3353665033 3058272302 +1341067427 222397830 +1709390753 95870560 +3089591521 2496718608 +340129754 3290770493 +397716443 745179588 +2543849240 3371680461 +3043889270 2280195158 +22606449 2416289776 +1672179424 3336538803 +3780382015 3913772284 +2925705603 2925705619 +1191937269 3424800188 +359150140 4010218609 +1372537520 1372537504 +1166280095 232053086 +890797826 2542792739 +3990577059 324504988 +3632640301 1114570332 958212556 3329632007 +1347349032 3468122188 +618090571 1947134739 592813357 1483390075 702477812 2039307425 1658271118 2776466006 830221147 3873010510 1507052702 2333164131 2011093544 2665789047 1025302576 2876350580 2339930686 32077945 3351736027 2531893267 2178427550 389037701 1481826112 1508600329 111492646 +2398943128 2956575821 +2912035339 3191814456 +2407416845 4039450724 +3843527423 3431154587 +498752693 2170548476 +4021916702 2133076777 +158247616 1984139405 3109850596 2570505285 +347263385 3839479089 +4236518342 1241796769 +695917112 2563913939 +2168095741 1813890900 +941803649 3585787741 +469604229 2503312986 +2854055962 2259900899 +2597820889 2590453896 +1623890647 3750530988 +1946756558 2019984217 +1527055931 1527055915 +3089729646 1466025273 +619221432 3525141677 +3378718462 3378718446 +979446020 3941830985 +2138824613 3393233287 +522246929 297327558 2885810358 52712407 2885810337 +2038004674 4231910005 +3209968517 3063525978 +1897868062 3924471665 +254028425 1592718776 +2367788484 1694595792 +607330544 3967605187 +1825221622 213370570 369085377 +1414332814 1651463950 1127838351 +2218626085 1714275021 2802428083 +2886493331 388584214 +2345294500 2163198756 +4292693013 858140098 3578928425 +3327815504 2422029027 +2640507994 482781629 +3426698416 3167123611 2668567128 +4086482495 2649119662 +143091296 403883309 +4017497612 4017497628 +2043813283 1757718428 +973507501 88990034 +4266163896 2568388288 +4099110618 982749343 +3298754790 149972641 +2809093965 3780314660 +1291952756 2912074895 +4222196312 2214459547 1439581668 2214459533 +1103922889 1844987784 1103922905 +895838238 748873535 +2517450605 2749028498 +3713801099 2348650158 +582115137 3754685248 +958694288 2222660515 +839269284 3078902989 +2213567835 2213567819 +1736808773 1011894170 +1984751236 3205423583 +2210255868 2363098545 2363098535 +2882838337 2882838353 +2509127418 1760371586 +3437950561 4141996704 +38603276 2873544929 +4106333302 3394928577 +3283345155 3913103165 516356639 2289416915 689168374 388501930 806611696 +717720083 2362094720 +1663490660 2363258980 +522478726 2353676001 +2005458145 3522111819 +3061019310 2556230959 +2187416324 1127591775 +1849851108 1990892287 +960045284 960045300 +2503472309 2618702076 +2967653129 2967653145 +244353359 1015555918 +1231109057 3854284647 +1480094401 2715592150 +3341545213 2267625556 +3518114229 3497502698 +1469865736 1736233507 +2603095685 3306910540 +3899423307 542894958 +3500812742 1782547985 +4240041110 1856165937 +717155204 3465330889 +3684166685 3441996194 +2327161434 3053136811 +2630767291 243470696 +2876394535 1144172666 +4016538346 3388151387 +19048024 1479289767 +1670385241 348558878 +2579267297 3837508662 +3915103054 2842155993 +16728594 2748645957 +1487070502 1647127236 2564578089 1934632642 3464091877 +1127356865 2296285910 +4098691671 325934594 +1976284962 2444315285 +1933570386 3386837499 +1927344798 594424386 +1517648995 3309123408 +3915001085 541025419 +970470894 1529721209 1373871674 1512943587 592581962 +1488407527 2408348854 +3667420483 1838097975 +1847992390 43032710 +2575009251 1386855523 +2260444124 2613381255 +3395230687 3395230671 +1423448621 2183986585 +614093224 1190038379 +872973925 1315672300 +3164336175 2177491308 410720750 381934929 +2351047451 4276056061 +4277694004 2501213145 +444935525 2886449290 +2432973293 916926491 +108415823 2067303758 +2196441094 503161207 +1973993404 302921584 +3069136927 199608887 +2685293014 3431650289 +2278727531 1110602718 1012914965 959604120 56443596 2762843105 999355746 +3895186423 1946070470 +843562078 2230159359 1089279593 +808445196 3882193399 +1638004797 1976685463 +1809208467 1432822636 +4292102903 1421503860 +3063413938 591580211 +730720701 1298592916 +3392912705 2385747558 +1750222138 3713937091 +2963542182 2963542198 +130893950 3324583497 +1693285224 1545108244 924668212 760666465 4058006976 +3822757258 993171501 +3087964941 2465972836 +2859866314 1557424690 568919547 +4054180291 723674620 +1251189257 949539364 +1648762224 3017159688 +1010473653 2235665130 +3882275411 1839947338 +2299324495 3802064538 +197931803 3101831077 +1444087001 1492165000 +3222184107 34008372 +3791447091 3022961451 +4116215265 457281846 457281824 +4251967670 241561239 +2341403886 3037409657 +3949930803 1906325686 +3734858766 1160512921 2144410127 3073316370 1009514347 2144410137 +3355270831 2195459441 +828137701 4292532234 +1300590657 2987180503 +2068759043 536570538 +3631993133 3624406683 +1412874974 571457790 1882506111 +136330018 3971815043 +2366176345 1579499528 1579499550 +2002606152 3689987866 +3186505470 4227895753 +2632716756 1309083188 +1839818951 1034063749 +544377848 373928268 3533676677 1936246787 1879191722 +3202502424 3040295852 +2386258664 3206701904 +217851777 3799391492 4198611181 +1609982263 1205537158 +1691972561 2471580176 +2605599497 2235572024 +1973010583 3087674800 +232037800 1840525172 +228025764 425007695 228025780 +569741372 3505243487 3046149041 764800410 2979139175 +2285405748 2767930319 +3403936392 4079178164 +3372000445 582440340 +3540091321 3831445032 +434387574 944244679 944244689 +2647509602 3438647363 +102544809 2963999410 +1475978695 1475978711 +4073432355 1502934556 561999367 +3713936433 470854579 +3828106753 1619472090 +975197932 1048478505 +1054920045 1759732370 +1323474517 2210349020 +2862924083 3863398948 3608611661 2567671968 +1709434797 314946884 +271672552 271672568 +2947351778 488571329 +773500904 2607465381 +1744514901 90931932 90931914 +729235765 2713429610 2713429628 +3645373068 2047262560 +22772584 2332247229 +2079343167 1513638206 +275306111 1409919486 +2733914239 91549694 +2178301494 2427332477 +855364044 3385783429 +3763680272 908129589 +963604987 4193008453 +1349894161 217577661 +3623271379 4133198912 +1192870997 3387836057 +3177341568 521674397 115353138 40508 2012809120 1082090977 1436686699 1238664797 1473424974 3170188252 1136588606 2930852157 221353654 662208363 213587511 1418888452 1185219699 2845998688 +2843755262 3538515423 +710826908 882107975 +3530551104 3530551120 +3330986422 2296263334 +4161783896 3638059661 +488514043 3513744932 +2419370342 1759947678 +1813818297 3928118334 +3447716983 3447716967 +3438537284 926382393 +3612162016 3465475507 +3825734271 2008358398 +498752676 266216088 +1327514503 721850329 +3048889585 90197872 +1219055829 3097600378 3097600365 2523357043 +164574907 1623852830 +986056676 1774087167 +3083388100 2001254286 +32560746 1118150566 +1433490979 2758449436 +1284768599 3825287664 3724201172 +1081109283 2482546716 +1171899108 1675853788 371041709 770296957 2107195143 536400037 2215014246 2348624377 3167389253 3945973408 4118883340 893717661 +1939623091 2987179468 +902025091 331097482 1798997110 +505981013 3472948682 +574635414 2166420263 +235686734 3465156302 +2785929685 1021778524 +647195656 3319812073 +3995346519 971528934 +647536572 3039893361 1768263916 2907170544 +3102810508 2945961847 +419755013 1741431770 +1137426963 3435299834 +297202014 1090385641 +2406811681 4131113974 +3713798396 835914407 +2767709192 2016419120 +683174810 3953299214 4276564750 1274368619 4276564761 +1360375732 4012989171 +2636424320 946634843 +2645945843 946181530 +2306305431 54212149 2355355906 +3961452611 4156608892 +522547690 930689526 +2402163471 1955895438 +624116073 4172281944 +1421924124 2274533639 +3978305815 4092012410 +2987649909 2391511690 +1420703996 4115483978 2643818723 +3747855024 1509876483 +1575879188 3905181484 +1834032248 1416225155 +429947973 2627969164 +1844194047 164081534 +1587215609 2635231454 1474948463 +1642670326 403405649 +633374219 2031289172 +4155061972 456163369 +2201187147 2201187163 +2154318136 3791540800 +397526270 1255742431 +3037175582 419396649 +3843583934 3032639689 2414688540 +3170009899 317814422 484408461 +2171148891 3831575070 2734810409 655077221 3831575048 326401362 +1245135806 3189210426 +138692928 3402594808 +1387028728 492611181 +414069622 1346044625 +3660357003 2675368111 4282122708 +2042968302 2675482287 +3789245736 3023730173 +1763626023 2725994870 +102604558 2929812239 +3507439410 4271243995 +4184817971 391188511 391188483 +3110231105 1635166973 2854547613 1367054896 1103343099 509388959 +1239109323 4157299765 +1215590435 1249423622 +713359675 710995940 2593760255 +2448104723 2448104707 +3793177597 3886849876 +1482363720 1600084573 2149269620 +3242307965 3077203906 +3217578546 1099746778 442891443 442891429 +3355377396 3396033039 +1709169536 3748039315 +630240549 1204627756 +3329930265 3329930249 2351530824 +1055068853 7792218 +1884455521 3518740625 +240208557 3334796640 3678931730 176629531 922259026 193407137 +3314920914 3701514629 +678106112 2693823507 +3426784288 2846436979 +2213735368 2137598923 +3160176451 3364863594 +2554910951 604832996 +1059905166 27416985 +552593378 3264099118 3637286739 799787773 +4192087716 4240665663 +1707236221 245726996 2116740751 914948831 2622165108 +2073491401 1470632312 +2161461257 1692457582 +3203283089 570625104 +2410357743 426348856 +799313915 2395679967 +3200941239 3069513432 +2034619154 2756487742 +189752220 1698704967 +3491871577 550520382 +1118214653 3913574722 +2871063541 632342925 +996831739 1106272936 +4242438283 2637677268 +715455647 3233394248 +2701072353 1385338678 +3921329597 2918756500 +3496260283 3380960370 +2098995049 2404577497 1816497000 2098995065 +3175212826 146722283 +3769929413 3298907737 +389917731 3105225482 +1637238796 2705705071 101798676 2437263169 +3789924616 2546998773 2760447883 +593085178 3542851030 2689462173 3853522901 +470994480 995719580 1637520789 +3799066396 2460587652 +318087571 1806523002 +630577502 2969313177 +989135905 3411594723 1197640583 4038426592 3820515398 3820515408 +1476049182 2663832002 +1374200527 1272625014 +843609383 843609399 +3426729915 1130025842 +496452487 471813504 +942166183 2639251935 +2546465624 1834213792 2591952627 +519038172 2409973319 +3854207806 3802739337 +2151855354 3901708739 +1877788631 872965442 +834656775 3170588558 1476671766 +2536338989 3240617515 +882553481 177899758 +85417566 1640599017 +1183715049 4204886222 +2328358576 1484209080 4282289289 +1587266597 339068474 +4233141497 449908958 +1582861650 3613816837 +2560353051 930941434 +1587226343 3577626038 +1665392059 4275441010 +1535731447 1211842985 +3497008767 2675966462 2675966440 +2919585480 1310453749 +394763680 1207823995 3485363122 +2857475825 259863920 +3213371939 1605802397 2790937866 +362752951 3230781721 +1402426147 510578635 +1603630821 1603630837 +2906476406 763631313 +1123191310 1064349913 +1925600430 2039684338 +1833081275 1371201486 +3488978861 3488978877 +1395863877 1050054540 +352904954 4088460266 +3218815308 3855661491 +692968664 692968648 +3992944539 1691433288 +1627912831 1904267969 +4232110878 2719316777 941983807 +2040530969 1185365140 +2341587997 2756481058 3548664235 +2035274971 4226068639 2869678821 3380425262 4226068616 3551270084 +71375529 1534916632 +388849351 388849367 +3279597379 4246857322 1972959741 +937674917 2694110138 +632864400 4057201845 +2499358393 2968148126 +1803134053 2508049146 +3179334867 169252182 +2311384140 754973601 +897853176 923359355 +3244726919 145153882 4219814528 531039130 1844095869 +1123360034 2312952991 2829851375 1047695531 2312952963 +210819765 4293157907 3188584026 +1315079160 4131149971 +1446587507 788592922 +963771760 3732010819 3732010837 +2269606960 2601358808 +521427263 2443048790 +4233661587 1983365229 +3267723814 3270238679 +2491365776 1576784232 +1223421020 660935889 3575629072 +2822695897 3020768904 +2329663726 2249621177 +458528666 2687149931 +2601468296 2701404445 +4100278607 2323030959 +3754874956 2661187489 +4204673689 1627715432 1667834372 2428999829 1949638951 584153259 1560604962 +3042568481 2643066592 +2029354034 2624750245 +3488350350 3733249939 +2210721346 2969768437 +3320986387 3320986371 +2370719552 1784875291 +654013661 987297762 +580468168 985049200 +3438026080 4155653683 +3155480052 146814745 +2161807034 2450435787 +4277459894 292937617 +950463550 3666377033 +3081084024 2444579067 +4203139191 1183985378 +230003516 857470695 +871721832 861410475 +4161080425 3639773528 +452887436 1231664879 892123796 +158496597 875682506 +2761829979 143311145 3366872606 +913176209 1075521094 +2824913568 1014750047 +554130345 3724879630 3724879641 2811579150 +171348246 702965159 +83325349 3114695129 1268956583 2661002345 45548317 3577510265 61951291 1706442795 3977193554 1850525214 177359885 3075380333 2819090932 1394523897 3134122399 2868480182 2543381010 2832815256 1886798132 1898933542 8592542 2247151485 219631775 449274567 3995551984 1429121323 4288949141 3978494222 3919583688 3518267244 2949422179 4135225601 2228286406 801769216 526518208 1423906311 19608431 2667504051 223559866 3310540705 2460169280 1495659523 2536900609 3713106730 3554950963 786666413 680663831 2027142302 510835438 1295795328 2109468444 4062588419 397877308 3740520833 2532399275 1196326255 1580522272 687414203 1123615363 2069627818 1204407044 2911014756 3497465958 13747222 26419790 3302074346 1016744407 329305980 196967128 1953165458 3757650165 4160747403 2808958140 3707898811 1179886468 853456725 2919436845 133444576 3524766597 4100389542 693406643 1193642752 3429531232 1635303373 437058095 1423499562 3773184651 90479762 205556367 3800959233 3720386387 1157421200 3020797077 465719129 2178456385 3579331259 3764199263 4207744582 103617008 634883178 1036759946 2061625136 3395590862 3830301829 1207679206 2700563698 461722322 3414790412 2009928252 2813483054 2035333169 3499135769 244538900 2315926762 3246071783 1518705032 +2803032740 2701727897 +586823053 4249307250 2632076530 2038339259 +3862182945 652341144 +1501610968 3182710020 +1924086287 2564318606 +473744394 473744410 +824026278 4155126081 +1722932012 1275365816 +622702067 2056169357 +2293580713 350834446 +246441491 850440172 +724260186 1596383522 1329028267 +1157867611 3799085087 +343526114 2405950973 +830914081 3961633350 +543436664 1974909421 +791055905 1521597920 +4200775866 3704466307 +3759969649 1040138470 +781386557 961633845 2389580034 2389580052 +2951160443 1675315122 +73555323 2900032040 +3408715581 2135202338 1092377931 +675682449 4149783632 +2731746845 1868890018 +765624064 603072348 +991993361 2430006198 +3469685620 3469685604 +1391973058 1579206517 +2626619003 2981514046 +3509716626 3821033413 +3686616613 2255142481 +1021200284 1143311802 2087355759 +2280970133 978544186 +2429865196 2511040919 +407162901 1230213404 +3195542951 2115415542 +1764868242 2701051284 +754819363 2102752925 +3080577856 1301069267 +2867524400 3356889928 +4293356985 2454829623 +1586926050 4229629379 3372721859 3372721877 +3359655581 3359655565 +4044570865 1917795174 +1849359363 287702106 +1923817516 2942543191 +3509433232 1601261035 +653444737 3509484822 +3811861019 1195048562 +2222395958 3178343175 +709805260 118266630 +2291796344 2189223917 +1688606040 3379796379 +2582608392 513478448 +3991638879 3906535070 +446018196 2795462260 +2264001681 1066224115 +1724623654 1268284137 4171132097 +1838343592 3581703952 3003271636 3003271619 641697661 +1968088290 3126382306 2362281923 1788432363 1788432362 2255917614 +3128569786 1213800907 +3324848741 1578745082 +3149477016 479054669 +197510706 3126263973 +3352313847 2211754438 +1147204304 1956527477 +603502952 143384253 +910092648 4088151060 1993949344 +3860453505 2345225126 +500365315 4129057962 +2501371777 899772416 +883991746 3021167989 +3149068180 713821928 247184889 +2474834302 3039740233 +2668801713 459866288 +3923257695 2019140715 2118721694 +2651811473 1665863247 +1710261975 1352942694 +479790552 3705942811 +3756525036 1715557015 +977317671 3679348019 +2683857938 1894093060 +2527738379 40372213 +3574692168 2994859083 +150044763 1865224004 +236165397 1747436474 +254404403 2479105719 301397324 +352937734 600649313 +533057536 1112688297 +889299516 2262587936 +1275285972 1024782548 2100940985 +3876492347 4143143154 +1051112993 2474110717 +1962469903 853046670 +4164772451 1364479604 3164787805 +723751617 488265133 864051722 +923954538 3759256490 +1627620102 1710072145 3196535415 +3900749471 1378504737 +3170626345 3113437864 3170626361 +2289017569 2830985248 3626700049 +541324721 2429223501 +3631118632 1230813957 +3023850484 2934673689 +2706345496 138194893 +744589544 1825840620 +4183699281 404327911 +3823479842 3834509699 +2704430399 603034986 +1086719333 1555725818 +2219497972 903158543 +2963547142 2725679638 +2510598275 1012593777 +3079029046 509126673 +1480263461 166477612 +2580016125 2580016109 +3809327824 2407819560 +3135222916 2989042655 +3464780564 777740409 +2343482992 1409888835 +2298693345 2528926151 +2255127141 171552710 +3338206520 3029455964 +115612801 3945213873 3048051426 3795728853 1522126759 1511579392 3945213862 +2581704413 457590242 +754148469 1097984903 3766980678 +213370464 2645173563 +165798570 949473677 +260116636 605168465 +447403075 1038886268 +3313421684 986939788 +2605691747 3337863172 +1506183733 2290848124 +1545567811 1217643388 +2014907973 2292036714 +2203604979 3188450678 +2063746245 1771192858 +4078588628 2255512505 +3963076304 2881577340 +1067140286 3622684126 3748476703 +4189336012 4080771063 +386366409 164093304 +2016605800 917856924 +1426039605 660105628 +251996893 2183297524 +920555871 920555855 +689585281 546617440 +715194783 3473762379 +123245124 2286484718 1922064687 +1529269668 3950547400 +945051541 1103486876 +1575122466 2224332782 +129921385 1971459781 +2522511739 16152104 +122374632 1669683261 +2775339785 1921431342 +3151968481 2286452160 +1478149974 26782133 1101450354 +2821451278 3734198159 +2463652901 1335430700 +2189382167 2758706185 +3696997948 543154279 +1754132273 3362753062 +86366421 1290717286 +1425740156 1128039975 +2618436425 3483794629 +2208066416 2671583555 +4213078641 2985993888 4213078625 +117399046 167838583 +1657264523 194737602 +1241795221 1241795205 +3247126289 2661369815 +3563830487 1016743536 +2145023324 473953808 2699476945 +943066119 2215964416 +2191123580 2191123564 +2048280922 2647455010 2333440171 +1331132792 2795869897 +3775021948 2995797031 +705288265 3483664452 1988066031 1988066040 +1014229175 3782694918 +3647773205 1526107914 +344925838 3948523919 +3237096949 1109758860 +4092942366 618362921 +2274238760 2355671363 +1976621067 2193889620 +2138918516 641892495 +2262738544 3123827441 4819731 4203519690 289506241 4003690820 1425885616 1946536132 2999108634 4152044935 2720749065 2529626015 1286018571 1908618751 2973309127 2194509603 471813723 713459962 819495823 +2484141625 1337996200 +3165717938 3165386547 +1600533610 2548335309 +1347186765 2994261145 3042232612 +3775045128 3775045144 +43669787 872039826 +2843461104 2969081692 3185088725 +1593328447 2949759726 3218201640 1593328431 +745956747 487190283 2304891330 +3542532988 475431 +1129944705 2265443584 +1755298641 74702992 +4197112601 3933661256 +1669902293 4018509946 559477153 4282725491 2030660025 4085620422 +501351165 1119743736 +475065349 3132432865 +1976990060 3969983767 +2799286475 1941825428 +3588137281 4000831808 +323853973 4163937418 +412725564 4126278001 +2019292214 1867297162 562359830 2931912967 +4191608966 4191608982 +3472540110 2730432345 +591970368 703947276 3414598853 +410527763 546148966 +1803330145 2519965344 +3720496739 2077543900 +3607468970 668208283 +2455888250 3927307037 +3239620606 4158459103 +3669521714 4041597146 +3436062164 4282156863 +1900716053 1836712220 +4131032954 405789963 +634537314 2904708194 2034243502 +688029485 3152950212 +4210767872 3470240418 +3736585586 223072869 +1801713309 2875013428 +4280526546 3420001794 +1311399623 3551736640 +3842619944 3058699499 +802732516 826466776 908894697 +1384157435 2194217384 +55111017 2496511054 +1818681751 1022697638 +3092842580 4266573236 2284330041 2418306472 +3714060136 222884432 +2368208997 504978058 4016194442 3618012835 2599984876 +830507379 830507363 +1125273537 1456704726 +1511605859 952749514 +2932791282 3691697337 +924174487 186682356 +906535321 2828428232 +2178248760 562198364 +772070527 3205557820 +3135199972 2645877884 +1717622203 3849352562 +2119345562 3695960758 1459964770 1115748203 1981460843 1459964789 2987353064 1215515683 3679183120 +193044875 1732084920 +1644934243 3901370192 +3396152644 3396152660 +3800138104 165597165 +3142549532 3756057859 +3623937396 2104047001 +3730118258 3022096222 3548152859 +2309758156 2247185697 +620894478 427756157 1337493658 +3957511691 874584948 +1761089658 3096348683 +598480869 216636794 +1658047797 1237716061 2064217424 3960759500 +76591917 1209567888 +2610060367 912740430 +436119624 3510765536 1680563233 +3945506685 2454257263 +1686828772 963634904 +3100037248 622124324 +2096787531 726446137 3585243667 4144643747 2714882414 3478564021 595058176 2714882415 2714882424 +1856064795 1122787716 +2026914022 936764443 1998864945 4179764608 1763588378 3373548277 1826965983 366356993 +1481483340 1312400311 +4125213472 3268827917 3564203700 +1621854830 986651698 +1021258521 117534251 1390661839 1631886312 +17942733 2080316082 927556823 3835102770 +4266837825 2639244096 +4100255734 3337958482 +2753107664 595519843 +232467412 4000316712 4000316713 4014056500 2202765208 +3801468962 1510450486 +821314573 495394930 +3048774488 3463425779 +3106332488 633767409 +864083210 500954797 +332825850 2169481667 +2808361745 2478597072 +3696997922 106936213 +2557118089 2623838968 +2144865416 3013999523 +4191122904 1425034596 429294349 +326675151 1978983374 +2973414716 996887911 +3975005105 1227463690 +479530945 3922326096 +4284674703 2546194200 +872506866 3493034981 +1972039454 666266687 +1321468994 93437816 +3858890173 3525472404 +23215751 148642009 +441645268 98065747 +224441420 1799089351 224441436 +3622111171 1364148656 3072926118 113248689 2693478378 +1826537591 3651730256 +2705728963 2705728979 +727380772 727380788 +180393693 3391978996 +2202208656 2202208640 +442961247 1875769953 +1340479771 3795420562 +1547927157 3301933931 +784286563 4195816668 +3767553746 1428952211 +1321055301 966969484 +2582895470 3370282553 +252969161 2239577208 +3618315591 1685429017 +2630176429 2037725536 2102416155 2777247354 2596646674 2006637124 2119193761 +1677184570 1457135717 +2024779900 2022888241 2258480 +1883839505 3558289094 +1726923770 64914077 +3108315402 2983396027 +315787217 565529898 +2523830330 853661590 +3616939823 653042257 +148630897 1664534768 218879479 +125555527 1074230852 +367142928 938864722 2085454251 4253182580 4253182568 +2005856036 2898209277 +1179066558 1610124063 +3552144831 199738280 +3959747912 3959747928 +3622468735 230395398 709517511 1696726014 +3631809318 3967808727 +2842197240 374962579 +1453137060 4250146367 +1582318011 861370738 +2026064089 1468153045 +2283881814 2724210279 +3618679309 2551951994 +879593522 3058964744 +1578300864 3621313875 +2441991828 3058223865 +212193726 309566153 +2991399969 3029602637 +3880764584 3398603883 +29459071 1117810174 3402581334 2038761583 +990507787 2147349039 4222196290 +1259764468 1259764452 +302949994 3487788055 +1214866392 3588762907 +3788083052 3696019223 +2406553089 3490030464 +546312808 3130030634 2645369987 +4107811800 31816999 +1755750067 3515052371 +1119017601 2156787968 +726113825 117283398 +418545583 4106158200 +2566719309 592608804 3453790810 592608819 +288668170 536927675 +1256920037 3064513157 +2739894721 2015424230 +634781312 2181982811 +1484506811 98162802 +3994110507 4030185908 +2116114410 140938834 2021483867 +2876545755 2673206920 +926380314 3436692213 +3304505524 1454686877 +2401968197 2165994819 +1644175791 1389283930 +3209738240 1426260485 +2136746683 1134602600 +2651395291 2739655890 +611655660 1348550785 +1654212882 1654212866 +3503731317 922414634 +4025919634 3764631230 +408161274 1179572893 +925576810 1252559058 1123684571 +2982948985 1567641214 +3275897487 4030869262 1227888602 1471985569 +168022002 3053476339 +2030227340 1008801718 3259866731 1261462133 2937883525 +3499609603 4151767527 +1532150862 136034265 +2347875823 1015938872 +3950108799 591685630 +3090489105 2780421302 +899977808 3613878096 +3046249271 200556432 +1809260125 3312303682 +1368138277 2224668730 +4066584809 2065262286 2065262290 +2243999122 543020243 +4218548116 1590447831 1041219756 +3601168559 3757480726 +2176546505 1393657657 +4123949066 4261869499 +2395829597 711967074 +2457220812 456240352 1545093921 +2575277556 931531849 +2598846797 655084580 +2717651768 936526116 +3655640360 2496451907 +1673129115 2561636356 +237237114 2538692588 +3423045439 1859774526 +2722468741 603569396 +932785124 2011049456 +1578689879 3889068866 +2801670543 4270103003 1895971864 +1597384773 1710317162 3707212895 1525534019 658597018 1710317181 +4016936037 3333878688 +146868430 2514541657 +922218596 3964628351 +2800836214 1140306897 +1158071449 3416887678 +3522963571 49523980 +1899295634 3361435333 +451723147 3987834845 +3412681973 736751018 736751036 3410043533 +1423647213 4192925403 +3046623418 4066239861 2549152962 +1698130180 245798826 +3967856936 2894446932 1989599741 +2643540536 2680133843 +1865109925 1576475926 2788263596 +2263893423 457028206 +349698046 3187362745 349698030 +2482234190 4033201618 +4019262694 3108189734 123987479 +3163286908 1279711783 +836300460 612350167 +2900376382 2680182684 +4178298450 4178298434 1602827013 +1137963377 1451295223 933565680 +3488323510 3469945100 +3896946808 524799213 +2769755559 3337276039 +3510362398 2135122495 +969803695 636692795 3985148728 +785538597 2393307604 +2346507732 1761602165 +2482582093 1936515835 +641934046 633152937 +1407162571 1657473589 1276931576 3233878217 1276931567 3368099195 3556607892 +2987393818 1765073387 +3411425534 3858270699 +336503861 336503845 +2934021716 4121295371 3285842477 +224278154 2505038637 +4160752033 151988320 +4008052194 3920492162 2646154289 160910605 2363007603 3702964789 2063109572 +315501818 2492517771 +1487641692 77526279 +469379734 2698054193 +1681039927 4071971984 +733712953 3926924572 +3615069856 1155993453 +2218592691 3695773750 4244106513 +1012801000 4029223997 +4245091703 3371461200 +3329930267 2385086098 +873155749 2462689210 +366259809 3201204896 +4225417444 3815620815 +1697655783 3345662969 310120420 +4183960291 3986362845 +640908987 3725623396 +1360923579 1833727858 +1494221735 4120710564 +394058882 626024587 1216871106 +3893185204 15505753 +4275322303 3877450686 +2466573321 2328999904 +2311541770 4006169517 +1413606386 2512809459 +839509221 2861782124 +1107797298 604573093 +3728942779 264287614 +3498423416 2093497619 +393957091 3659345738 +2352349053 906047938 +3159770200 3794523500 +3351612186 3899498294 2516187627 4182888298 59010293 +2830187121 12677092 +48732749 3751274276 3879493561 +1592891839 3215410724 +1820434505 3364664799 +1819051041 482077178 +2619730831 703445978 +1165559519 1015402760 +2593986099 2554983002 141061558 +517142286 303343085 +1883140053 2269776970 +204638639 3801005678 +1562508555 2810271810 +904491364 345056591 +171266277 792019393 +1711759007 1016722504 +2481650423 3521712848 +2323849992 3381343796 342893981 +2133138858 3930593692 +2545920513 3820527488 +3174472074 1727247405 +717160048 3131738691 +2071022713 1804293842 861762869 102723847 4194501834 3428541032 769394178 +3494017738 1465772527 +1294482911 1673240220 +318449059 2220638108 +4020948733 3819798024 +4204430646 2152228630 3074405383 +1793728381 3415183810 +2637728440 939679661 +2070189983 1354886730 +3531248126 2098018 +3080238862 2616969369 +4146826116 2643239135 +3923417036 4011652641 +2433080442 3325694987 +1102361007 510899832 +3139059772 3327336049 +3515534913 1572575078 +2798859259 2395096841 315363653 3227251902 +4139744386 4050714787 +530201051 1854545310 +3276204158 1625119914 +920836526 354200815 920836542 +834499549 1621479380 +1862118501 508977914 +218909135 3252947687 +2429323250 2457628068 +2494259000 1103553851 +2870042409 1968754072 +9853819 1739719332 +377509377 2180982453 +1498461083 2106410365 +2820236290 2722099342 +234887940 237668160 +1234267747 218593607 +924619042 4206807078 3374704189 +1463305337 3331574376 413647945 +2072165598 1288655209 +1408102878 4254318719 +206219637 3234823864 +438471198 1113550143 1113550121 +2247115807 2369826524 4164631774 2462663841 +1140631349 1002125436 +2459758268 199603692 2929426023 2299253233 +3643418620 3646747057 +2828973782 1218949894 +3741195357 1728489076 +1385486556 3696321095 +479317636 1715509103 +280444686 3039010250 +3924581039 3994206584 +408387521 4242526840 3731732420 827568797 +2866557645 1430751745 +3944193121 2119828440 2860268123 2393196088 2898789659 4076822053 417494215 +1426189383 419886016 636598099 +4041620705 4041620721 +623599960 3269387507 +1099165710 817030681 +239796740 2215914591 +3180349472 2317453939 +279626893 3386075634 +1997716248 2323416781 +26710394 4221174557 +425752572 2292426041 +1701034099 251354380 +3692372404 1327666719 +3413730314 3844479457 +233653460 3351658047 +3955517486 4136677038 1412431983 +152258590 1497575356 771513077 +1267566958 1573869615 +1309935543 2693276934 1309935527 +3893567449 790307486 3317137065 +1409538156 9385856 +374772867 2907425340 +2421834323 2434164908 +1800313121 2474151249 +336257552 2636242741 +585799871 3058594984 +1518390300 1518390284 +4260934747 2662030344 +3079405120 2165690381 +2070719905 2928932305 +141855908 1897648783 +1419753913 4033961534 +2481622024 3204400948 3795480733 +708073792 2959638469 +268651039 1273636060 +571861085 91396162 +486605116 791060844 +83325360 2527155640 2641157124 3344674811 3767323508 1121434327 1969512804 4085879840 3602395215 +858210114 3368588533 +430546805 3674604842 +3856522468 3225598719 3617272475 +1340174385 1548772054 +3741694956 34002071 +2580792564 475991055 +4184746139 599689823 1470158779 85025982 +2759205885 2459258082 +309073445 623303724 +682089926 3326221985 +2480421826 4037997003 +3436164827 1174198994 +338243065 3050528510 +2437262877 3450935220 +773477044 1198534991 +516498606 614776313 +1802956720 3328325387 +2538551436 985522493 1862744152 +1380246202 1014033099 +3795721291 1568391920 1084031220 3263913327 1568391916 1925614100 +3642232550 3587175097 +3254341850 897206059 +2770648249 812881545 3815328704 2356737217 2356737216 3213305916 2356737239 232277953 +2615137026 2288024349 +1960758554 831700006 +3788421493 3994405658 +236687252 4225917100 +3482399618 85856157 +2087349107 1317479962 +1570447330 3301038050 446022379 +3673485543 1795212867 3337925473 762720924 667095069 92469628 3924982797 1158726111 3758818892 761783032 +2137324146 4260774245 +1595870923 168552962 3412532772 2236860312 1768443272 1316661092 1662697900 3414246378 4016864522 2466845519 2733097194 496922893 3250057833 1716374621 2589137528 1702243857 +2013997594 55658966 +2332855230 2730490911 +1280903791 2670423214 +2358276381 1684148404 +2289967846 2267673639 +1591415001 735806878 +1136601211 1136601195 +4042740276 522798628 +2998369354 2698553453 +2466600379 1216433256 +1379255312 1186399298 +3692580053 1936942231 +3800750220 747824225 +1629576405 3162841948 +3342877970 3157048147 2372592570 +2048647398 1797658906 +3824099791 2691840206 +4234469800 3895806736 +1516233621 1516233605 +2676198314 1490844006 +362574467 2286437418 +2633876489 1751805727 882095736 +3129819363 2405246282 +923713082 1707459343 +222141541 4170660161 +2206613577 1178938553 1431778030 +3594554004 3684312825 +2196782947 2201209052 +2180834079 808707548 396941729 +2951900842 1397655974 1710342398 1474916870 3982201130 +2612667910 738843489 +2629096545 648515747 2233686672 2729528903 +659017786 2334392518 +28504068 549826116 +1786607880 4159071497 +2391989467 2391989451 +2371835847 2759709952 +71135215 1500038971 1432928479 +2214628301 3950184334 2323522706 +3787541017 2085070174 +1880934351 4154757658 +43175360 3441026373 +88346730 1922120389 +2665071542 3335460763 +1711116219 2041570604 +3830237201 3484406515 +3223024195 371273739 +2924939325 2952919051 504985922 +4124741512 2400187147 +202275206 3018177479 3018177489 3018177478 2914037754 4188445270 2160676343 +4230215858 3920220237 +2758037229 26954052 +1611200193 1070019558 +1018212936 1018212952 +4118382827 3686358169 2431593230 914409241 +648710237 3939544111 4205328468 +2737219429 987333612 +904994294 904994278 +790510174 790510158 +2018334474 1807746235 +2309207780 3155601103 +1053188007 2034799584 885534888 3443575204 2333814073 3443575219 +303412827 3543011666 +614173428 2497429017 +2881840708 3067621916 +412429635 4124459114 +2011886952 550265868 3368182480 +3446717167 1467369006 +1399209117 2953553556 +1979355530 1131617325 +1853861174 286579986 +656026784 775176165 +3139714129 3943363462 +4185695895 3197501981 +138890762 306174381 +1387467022 1038342415 2091823758 +1351267999 1797408374 +1751326670 571150681 3865853774 +2823684203 1573562484 +2953147054 3331557369 +354173928 184355553 +3883766585 2746139304 +4013884288 540181125 +3732968801 2775263158 +1138768499 3772713782 +871185877 2474137180 +3442885723 1414328825 +253669883 3360828978 +2966540006 1078506497 +3750445295 3672803621 4109021722 2809552637 2984362584 2967584962 3291866412 2381354030 3291866427 3459642607 +488561007 1183861166 +1451030733 244593705 +2904186732 3968087831 +45148629 293608028 +1782606480 3546792099 +1353308007 1995640462 +3895155789 3376565554 +2099419517 1287061703 2354085493 2354085474 2054660034 +563439835 3107197124 +3851061325 4248216719 +3221931071 2415062824 +2114010399 2062759902 +3868942306 3868942322 +4249740772 2778785257 +923837743 3727952110 +994567340 3788422592 994567356 +3737609816 4093196960 +3975392691 1092587831 +2595231280 3006459285 3006459267 +2555236062 591113470 2692523903 +1228839952 1569697077 +2977845551 2564410616 +2957724976 18811941 +2600274550 1918334929 +4004877477 2887391159 +2586595275 516521199 2126617748 +1887291330 3623974517 +1353848916 1353848900 +3743329160 3691712432 2908959412 2908959395 3309831965 +3364177359 2026693848 +2768077308 2509895022 +2594452576 2594452592 +407887724 2981934856 +3015383750 3045795255 +549964467 1300502490 +2844631772 2844631756 +1127752948 374401263 644874388 +889132968 361905533 +1810692925 862459445 588218626 +3120066052 475726585 +1859928592 1029483399 503740297 +2725285324 2200909857 +3011441817 702221534 +1728106024 2772505744 +1577482887 2702872452 +2353779124 24166348 457040947 91276808 2405113433 +173195159 3611531942 64549497 +2246049668 1134509279 +277595898 277595882 +1201222571 1630295604 +2557318268 2557318252 +2784206364 1518462481 +1640621844 81183865 +2701738732 1201663996 1838438807 +208736604 820252880 3294491153 +3652178500 4089970953 +362411518 1763601601 +2886195720 3068079920 909133091 +1416334972 1632718119 +857242583 857242567 1183511408 +518968682 469366221 +3942796126 194493801 +3906826062 515547309 +3443343068 228822860 2160827271 +3135581149 4050563115 +3382327035 1489276210 +3316266629 2951992154 +1649270237 2643739362 +4236943843 1899812956 +2253261734 131853030 +575858247 1333821897 +1802474015 4054034063 +4034289449 171647109 +2990465861 3724527002 +3395134183 4009962842 +2314994665 351180187 1393338712 +3281863068 2358134928 2358134919 +1180580125 3813927092 +213192923 3691612357 +1180168856 887024149 +1874997671 2325605284 +4152871147 2512472564 +706165832 2324948299 +3702748856 536009304 1117738608 646177709 1205142588 +3466140979 1846081356 +1460118179 2751792796 3488180103 +342225381 96255177 +2714001476 3304316719 +1959971945 1356319064 +2133077878 2616637127 +1356508398 251026237 +561881263 3514320378 +2555813718 3408027190 643617895 +1476363482 1070685365 +1885177094 2850262244 +2930169863 3664767236 +1133481701 1073607290 +12651448 3890573997 +2539808081 2699394704 +4055392893 37948116 +2163205635 1637809906 2932491198 1159130050 3074239349 +3960742411 2930874205 +3716053969 2132601360 +1136585341 1296263435 +837929989 141625404 +1231871363 3394323193 +1701558187 1467759934 +3514208559 2117067807 +439511413 2992374588 +2265374585 147966824 +1339145437 1339145421 +1426430753 4174591200 +1480212916 1480212900 +1058984099 1767327120 +2137023475 208483460 +3299824967 3875749568 1981537063 +2692452688 4068851957 +358250035 1607781814 +600702101 4064583306 +3343017958 1485586727 +1938456132 654624031 +406788551 4065694793 +556894395 250623870 36133705 +1317307533 664578532 +2072606931 1281963052 +1458847509 4152315402 +3651637949 2368976554 3858476688 2425451857 +2693919676 2177020145 +1003709524 2177298479 +4062894294 259217649 +3222185537 2551167040 +186865521 4188186342 4188186352 +2732439281 1409744240 +11626536 2578894932 11626552 +3168252418 3666528910 +1348305526 4180959185 +1937916558 1678689689 +1770526802 1933461765 +3435901462 3365313821 +367159951 3938702028 +388257777 1597403248 1597403238 +1232431702 3011617079 +2453329376 312389541 +2179596570 2640296957 +3907408532 915668719 +332555029 1135386028 +2628198144 3767325044 +328978178 3762741283 +1805653065 3053448942 +1620734298 1830842539 +3807527960 1533096411 +3752708199 1704345700 135287337 1704345715 3752708215 +487583984 121385999 +292688493 3530258642 +979088414 4233923391 +3648828068 129471268 +1517947642 3691162649 1376542766 +1183276179 4056479779 +3228035971 297427133 3185045889 1721220906 +3248800141 1297040625 +281788660 3052949792 +681316590 681316606 +1320304025 2073491422 +654715239 3585289526 +1391063953 3348947085 +3581103778 3581103794 +4204354310 2102606151 +1520952949 1419459025 +2190721813 2190721797 +466932009 4177871751 +1952080613 2331879946 256487020 +1408916196 1271392984 +1083247712 2496375351 +307051755 191659925 1734509337 +1980178530 2950512814 3820977506 2552166251 +3222166678 3969630247 +4285058170 607197642 +1488731560 1481969515 +1200243389 1537675156 +3041506059 1845811778 +2155916166 2417710586 1183858119 3393416522 2400932964 3498968055 1497522929 1183858129 +3726026126 1139347625 +4261945493 720469171 +1958835747 1958835763 +1016350897 4216480211 1574448960 +1300845299 1300845283 +2363493017 2363493001 +4167011274 3362328315 +1253713596 1594554855 2403825264 +344298241 1330014870 +1091541734 3670548194 +397734538 3347332358 3794368563 3330554720 1390492133 +225181944 3501366675 +3103651729 3368859984 +2543867608 2305340941 +1050418220 3503063383 +2684162628 526631199 +102964670 3144087354 +1456991837 1483698677 736300610 +1820669936 1820669920 +1920814011 133247615 133247592 4131272548 +3728708195 1302084935 +4058664359 4058664375 +1925705127 1471880694 +4041021583 3138234648 +2398139997 2527579032 +2664150810 2114222306 +1676598916 1676598932 +3894118775 1802971914 3473157699 +2881813549 2484665028 +415616036 593517737 +441901852 2462549265 +619271275 2253382772 619271291 +1049153786 2494092739 +3521403954 201170907 +1662514646 3568828401 +1055679931 3374589284 1920394373 132570216 +547377198 2321430639 +2203312964 127823902 +2648442506 190729019 +672412967 903667964 589319592 1811319431 +880105500 2964960263 +3118464845 3902727730 +3815903634 2660346053 +164295629 4053252405 +987053842 987053826 +2433292521 1431628991 +3000917661 823062836 +3777365188 853115017 +2234357708 1100025185 98397190 +1285124424 3717026891 +27144384 4087187099 +2968965489 93041894 +2750012188 623111431 2291020231 2230720012 +1902586837 1516896348 +3953732256 2605586931 +3922258450 1863768210 +3241647192 3758323327 +2995563533 544397426 +2879688103 3674930656 +2505282776 3935522843 +897005876 1588530383 +2285705232 2284642595 +3218159968 1448956453 +2344307031 3503746622 +1395753122 3235836349 +3749198319 3412643421 3704201530 +1090441042 2891932249 3531155598 3941870286 +3079706700 2852558292 +578014854 3623327943 +1492657491 1638056378 +2890766247 2791756935 +2212695954 812745427 +3990487665 254711784 +2813992380 2650391920 3321679601 +3146256122 3571039664 +737235533 737235549 +3412681976 787083899 +1985961923 455327722 +2056616764 116678508 +1725421452 2136480672 2136480695 4107360988 +3741997914 2001587883 +1314191527 2294240805 1437043378 +3844282734 483590450 +3639686597 1219994892 +2783322381 3795695716 +1191474116 1015471800 2416065929 +2934309623 2934309607 +3315108089 3351829705 3315108073 +567956104 280184307 +611508123 1977850184 +3073565254 2436903569 +3134783536 3134783520 +4169614608 1434778475 +3983516940 3535852023 +1450992192 274128695 +125114881 3728781533 +706461890 706461906 +4008214347 1660969730 +2550907956 311219801 +123245120 123245136 3765326819 +2622523811 3049827228 +494756179 3210753466 +2626501270 1107594102 +2756158450 2395411955 +2673669409 3552860983 +3318356771 2150152220 +1651447989 1539398732 3177466807 1096453651 +3336398924 1519071159 +1075299949 1382899090 +2339167993 109761448 +2498266353 1527334758 +1739090483 1629433434 +4132235574 3996350602 +1686923378 3029269650 +339833995 1846179522 +1410480693 2377228643 +1150702701 1705437074 +1389824932 210195241 +1594736894 2695286751 +1038065567 101205832 +4055415041 3505417822 2261466271 +932867148 3558374305 +653234487 1793375668 +335383295 4043777410 +29990282 288181289 +1614229495 1843429830 +2812847144 890160784 +1130554920 2190440439 +1685927306 2131287558 3139127341 3337794789 +1867222079 340820971 +199629160 591003307 +3263952626 2720976094 878034661 +1325163334 2030212626 1318890401 1330569756 2402556061 4215084132 3576125357 1273888972 2291327329 894858177 3935388915 +1373355009 3268151847 +1118072629 500895868 +3254313978 279881489 +1436788148 494844424 2224937561 +454874574 3676178756 217339421 357814906 +672943087 327911729 +511798115 3037213526 4230979434 +2050728882 1054667610 2250088363 501395763 +1689298912 1645757861 +3589315410 465863173 +1630251273 12261678 +1107474814 1749680457 +1055963478 1794359921 +2973963381 2973963365 +2726669191 1600980374 +1532739759 1532739775 +1074653673 3202824664 +769093569 850981735 +3044200117 2500000785 +1163925913 751791742 +1821590112 1272020275 +2266629986 268017493 +4252592558 4252592574 +2486081963 4032555042 +1466487436 314047130 946671265 2159555604 1355539420 946671264 946671287 1957562208 1013781747 637760097 +1280054898 580259400 2949355246 +32081782 2023767751 +485339175 703323258 +162673473 397588139 +2551742868 43252729 +47577080 1859476333 +3389491314 3389491298 +2555781321 2709864761 2592421436 +4225928805 3936757996 +1895642560 2660998469 +3884026194 3270192133 3270192147 +2626284485 624198567 4286025212 +463067557 463067573 +3802230854 170114622 +2288721238 379530855 +837591674 293848587 +661679018 3502188563 +3318607864 1529922427 +1406572095 672898539 969835816 +4025988246 1492207665 +2843214176 2071556444 +199760338 2422252947 567256190 3676612218 3676612205 +1935661792 2145750693 +3565595574 505339781 3179100114 +1808344052 2235020692 2374632009 +2928764486 434919057 +2359263629 3961057508 +4262936830 2273229833 +3957364219 1795248665 +3119676767 2467020885 +18333455 2620636247 +2595381021 2075577621 +2903260528 3661936469 +2228130096 1093570197 +197377877 3659936476 +595625650 2966956574 1179389517 +1650198358 1650198342 +998728386 2115760331 +2477478469 335779964 +288623386 787315197 +1942322582 3967555410 +447489730 3204514659 +280782318 3459902130 +3044964053 1076510150 +2297903773 3180319874 +3912579194 2563237899 +2913013482 1049262669 +1133271318 1810906535 +2716645866 3785933981 1736818770 2716645882 +2430849479 3718462528 +263826056 2021378467 +3340786332 3340786316 +1693139304 1180169899 +4249212050 1189978579 +690423843 3950104348 +2363550618 2667585245 +4216551864 632202323 3939436480 +3921608893 3031312788 +4160353721 394121790 +1514997620 51204553 +335127253 1997242492 +116401648 3691755715 +303169288 3184839036 4055303728 +2104797 261030644 +2553385346 3257255182 +4126097235 2057351098 +3925381746 3293481317 +1924546936 1924546920 +3446331838 489997833 +1144593608 770199261 +1808953663 1566170775 +332859209 2223011832 2223011815 2223011822 +2317416474 653664739 +4137583946 3138286449 +617810493 892935700 +1307640230 3607703970 +2218605193 957632750 +1809272782 2448597327 +405721610 464823739 +2039374121 2433050766 +1113943597 3581594560 +3691978314 2038625744 2889264037 +3937267376 1051780327 2903515734 3020959061 533643011 +435520384 1568539283 +663791944 1146988272 2428140619 +3947315960 1635391567 4235378048 1496214651 405421668 3507793811 +628072555 1888753358 2141021416 +2742463401 4241505038 +571529577 621329475 +1907947486 3828232831 +512551109 512551125 +2966252493 543208356 +3402023133 2493565265 +1220992137 437070776 +1074653944 3454592123 +3932822575 3830574444 +3175203102 209912383 +2408517827 3241632508 +2062133028 548899715 748205220 2714901951 1811136560 1724166415 +1993487618 831007224 +3722990551 733739878 +2323171136 2323171152 +2291351464 2815243645 2815243627 +3191735471 2088219923 +2707696004 2112227012 2494388937 3588614767 +742485392 989821347 +4084244170 71956461 +4220169508 4054591247 525242303 +131978989 3376681284 +642245012 2904819967 +4238730049 4196712256 +752080823 3697007919 +1829107547 2509325502 +741140405 759251802 +258484402 4076343333 +169250974 1919455690 +2385041503 692886942 +3629362951 4274657284 +3851235990 4081492529 +2205249510 3516081943 +1904048877 2508751620 +2620588844 273546817 +1225711266 2758310147 +2133922558 943777225 +4235562427 4235562411 +973700181 2985212362 3838736621 +3782554717 1216441972 +1797242214 2187299607 +1734901276 198031560 +1507667314 1268269606 +1046800869 500970348 +3513669045 4286800205 +4228929512 3060776577 +3008714264 3008714248 +4091307744 3287675557 +2518052581 383161866 +1534928476 1644389073 +4015177605 1145273932 +3513185400 2980805893 +3770832667 3242714098 2435497275 +3077914349 3130134276 +2685434804 2918366297 +456221080 4248016480 133398323 +2584245410 2493185673 +2098303680 1671224306 +70567210 2733563269 +974870097 1730603686 3389579664 +3690479236 2560919417 +1687223364 2487033631 +3695900436 3695900420 +4070131743 2994426588 +3742942507 1593729698 +2230124623 2417458254 +3126680272 1794568620 +813874330 2243213941 +2046131676 2757980816 3648332113 +893536630 3957549898 1297720529 +624381878 1276279697 +1427482730 1039699062 +2969173928 1099789693 +3193813895 881735062 +818233274 2120444438 +563094845 3378008117 317366018 +3347489078 1324337169 +1176209389 1733460035 +639425357 1282226724 +3609958695 4281098020 +61373535 3080464235 +2677676892 4226285264 +202322037 1894336572 3913062938 +734006418 1901316563 +942909482 2740042267 +3586981515 226015220 481604829 +2464992211 149433408 149433430 1534970737 2405435437 499440954 +1814489001 1933479643 3467481880 +3229488209 737913165 +126300319 2044505931 2044505948 2354974241 2026998344 +484720442 3041888331 3041888349 +3187322878 262343881 +628433277 1261967455 +1392797137 4104645534 1665044403 4001117914 4001117901 4087867912 +3057311242 3903556013 +20780695 2318045094 +808999095 2679351312 2010222883 808999079 +2749379593 2749379609 +1530547809 4257833632 +2018169583 2018169599 +3716209512 433677483 +2780281287 2805560406 +2219113702 513416705 +3252875013 878790375 +2685827706 2103627275 1835185357 2685827690 +1941681062 4226142961 +2635339402 2786000357 +3717912284 2315050376 +1049210228 3871083929 +3053676631 3730653424 +2809841101 1933926834 +2265275084 3910103264 1500376865 +2775216883 2011760371 +3522833045 567347356 2077780659 3322966330 +3274743474 3841322137 +2385320820 930971532 998082015 +958450637 958450653 +610524162 3409765325 +3077240474 604016530 1661904698 4053300831 +1702700341 4177629820 +3929273853 2899066178 +2609622130 1323333477 +2570416790 3970029482 +3297097030 2759613751 +2222654274 3483771107 +838325609 3727464142 +2813289405 3055157908 +1467097350 2930375777 4009837178 1821929297 +4124012402 1737257082 +784157373 146522050 1358735243 +1134134456 581692845 +3585182248 1911102705 +1891006606 979838479 +3847743501 375540836 +3816565904 2986345064 961212139 +230454283 2863312212 +3720284966 1427073356 968789185 1023449479 +1587990 1009058737 +1120118634 2214628301 3587694183 +2933321483 1197100628 +555492733 2622424020 +3660850614 2915580823 +3950686322 299822438 +1114380172 3047578529 +1660962991 1142894075 2289199992 +1428022240 3725441445 +755139937 1006106528 +3498486539 2341110721 +3201041779 4220701092 +2929258849 1002699702 +1827248293 414927802 +2707650196 485739124 +2612581097 217318616 +584595806 2305545984 2661667949 +2313311858 2169378163 +2032758919 1672317031 +143929535 3473110913 +4108937359 3252283040 3389394419 1712324055 +2176302726 3124817121 +3896138717 2162974478 +1045816323 3192350790 +1745120268 3405125367 +1358303276 3973453941 2673571159 +3691861178 3729547157 +2320156622 2176354649 +3480672190 2735411423 +549976639 3654218024 +4146390916 2467853535 +2986168539 3760491679 214321348 +3608290398 4069467214 +393196831 1378278488 +1982620518 3976785762 +1588971909 1588971925 +3959854209 257672960 +2925673161 1302497912 +1277621671 904132110 +1538058769 1647605968 +88052683 236300418 +1303252874 3540153915 +2523671735 4167336495 1637694871 3189474595 2202690576 3189474612 2935705324 1131442409 +4166114338 182290837 +961666098 2800164827 +4017219275 3142472066 +1423116030 2251555273 +4245208122 2394967883 +641284402 1578437043 +1669484738 1747263861 +2089008332 3479319863 +4254821224 1639884180 +1007255408 4076051779 +1335464031 109539023 2914928020 3472430936 +4056144169 3226393486 +9812711 3535092150 +549175940 96317883 +3758814851 876744746 +1535486157 2557418497 +2807581305 3908910184 +2616970106 2838664277 123818269 429235030 +3068342890 1795830529 +2690257691 2295075730 +910604188 223546001 +890543960 3883325339 +2828779537 1565100592 +612146448 2150318133 +2557470909 3039519124 +3617293524 3580471485 +1936437577 4219999736 +1468307946 2228380614 +3041133581 2741225087 3018707812 +2678520419 2678520435 +3689251130 1682599517 +1640998735 1222926680 +1231493391 2757256524 +2760586880 2267466649 3690646009 +2022897319 807450788 +4085642143 877177436 +2724284982 3576156935 +2433930475 151475983 1269116404 +3005018569 4272618030 +2568681794 4036127310 +368628168 1857181467 1588739549 +1851608284 4187838855 +787205669 459994567 +299015810 2693767109 +292720441 1404036802 +1608656201 973124078 +1019855126 3348821425 +1530526275 51700154 +1516864568 2350588987 +1560602021 3233598154 +596327613 4149131295 +2342228150 2078592654 +3318607868 1597032871 +4291528926 2338878838 +5362516 2432900419 1814247092 2216909950 3570380089 3502860688 3597449081 1797469486 3570380079 +2526342882 598845931 +2213161219 2213161235 +685353092 1169848208 +1331257847 3769972688 +3698612016 992297109 +3184309274 1750728542 +869946935 3619010694 +1588656483 1024790877 +1582807775 1662725384 +1172437766 3078281494 +391818204 2679933777 +1300418614 988661009 +4202551293 4202551277 +2530582971 3039328382 +3484873381 1264054422 +2243560307 4141051418 +918974087 3927810948 +3613443160 301105124 1700075149 +838560242 293587417 2697447397 1480149396 1669030077 +1423088855 1586292336 +3767571397 1217961740 +530611503 1675212411 4171567352 +4038207692 3027646753 +135628681 4018000645 +2469226364 1093101040 +2741142949 2070112988 +1966425225 198894510 +1171971023 3330803406 +3954462993 3954462977 +34070611 2882049239 +1765482127 3776156529 +3934234880 2023606948 1541822669 +615928994 1829190403 +715068999 1601180096 +362804478 147762143 +1452321762 666801365 +1957459055 444287662 +1600179477 4086962093 979556362 +3060901707 2146065172 +3767851811 2908026890 +2347034283 3830914850 +288865798 2309827861 158849698 +3899170455 3702197495 +3881704222 1462022198 +3958659407 3958659423 +1316560407 1480673289 +802727170 2277178254 +3056908825 3993040200 +2638933607 1730603335 +3924186173 1922472962 +161609346 2257885378 1491864203 +4121503881 1112199086 +1250197040 2123539843 +269493997 3221676356 +3900860216 2635923381 +3923687372 3297285623 +3647605800 1777410795 +2583376118 1550717777 +2607708297 937934776 +1818442085 3705352611 87251450 +2260013534 3976929407 +2108012166 1373525217 +1202222159 489625678 +1656344217 58735304 +1147084291 2996001946 +1845791633 3257382224 3879897431 3934412086 +4152684976 1447589909 +2331395790 1420516494 +4177628498 1332836371 +438471172 3606609656 +2049687933 3487668180 +140472088 1178329819 +392262536 511378025 +1425710144 109312211 +3437995647 368515582 +1703244581 2615530570 +1196683317 4216373197 2116232042 +2162815362 1917267893 +1962558948 167511529 +1993334384 2176420440 +1284136151 1422927472 +2866899429 1337297162 +998704230 998704246 +264635444 264635428 +3776418661 3172796410 2931003037 +991931932 991931916 +1719617134 682808588 +3662613218 4149323998 +1474750137 2859714117 +3008094631 3008094647 +68246221 877785252 251521074 2446475387 +2586201693 902641535 +3774770202 1024638001 +1579944329 3360883374 +687170257 1263177478 +1826279928 1417185659 +2810960430 4012406393 +1760337372 590664309 2902430343 +420798354 232518355 +2995651673 1586544376 2995651657 3491365343 738473769 738473790 +2484391639 4089551974 +2053615536 3594570760 +2361269602 4048044355 +1023542562 741217411 +2425683326 31853705 +1681206761 2113471872 +2982596166 2982596182 +1431733022 1289661409 +296254944 3403180219 +774587622 4283848221 3423024782 +3284364251 1935424352 +1482296546 2825406178 +2153276586 3039197069 +1177588600 3961762835 +189053737 3954461746 +3432239219 2142315802 +148387790 3244296018 +3592002619 1162932466 +1603745560 2467019469 +2233567546 3325826615 +3769097002 312402834 +245414194 956533157 +4063582453 3718502496 +4046116220 4046116204 +697165466 73532523 +920867065 1186842132 +4243703049 369098462 127515167 +100921783 792036112 +1428427207 3469212736 3469212758 +4244400679 1750801248 +807184371 3367023990 +3827113350 3667699286 2484010951 +337372996 1865432633 +1090323278 1090323294 +1053315616 4116269171 +1717897135 3758823544 628588191 +3430798500 2383789609 +667674320 1242977064 +529312784 3884385944 +2518734016 1734003340 363784773 +1523158735 492318988 +3522204930 2142933557 +2173882150 1111882029 285260145 +909368855 1789304368 +1337896829 1337896813 +2142381145 1584347144 +2563403560 2930572267 +1640978938 1968183567 +2238974744 766342861 +2700705854 2844028062 653208927 3446050850 2797920671 +3637945591 1357230288 +281834860 2797504504 +3752773103 253859630 +826462947 1865546570 +3927151637 420401971 +2278556837 1903644588 +1470280162 1470280178 +3503222668 3995139745 +3433357736 3482270589 997893588 +2506706702 1388809257 2506706718 +4096898971 88344850 +1636063608 4216903675 +5651284 659314879 +1483478593 867252967 +1114093705 2898530348 2691338789 1955462905 2674561183 1955462894 306675630 +2165768165 473224570 +403926761 403926777 +2589622022 41285217 +1949722690 866525173 +972486976 2143969221 +2940254128 2940254112 +3812036582 2511210241 +3538110710 4056668999 +3212964234 3430662831 +362163729 1370424246 +806947405 74135355 +366183207 2465697670 366183223 +4229679360 1009744076 +275309447 2206310532 +3718898953 82263929 4218653998 +3394346921 662591256 +3735756048 2850041300 2133365629 +3648770749 183281220 3648770733 +1200412469 4172403847 3619080316 +1912245077 3587416045 203096819 3261683402 3261683420 +2040585333 3980069948 +3318244224 3665076869 +1625041910 2088500371 3119408475 1761111284 1813929231 2898133192 1941790337 259167940 +1782340324 553850089 +2857118919 86191059 +3388313151 747564350 +3986488398 3611078617 +4132826591 3982020235 2823124488 4132826575 +1145791225 2074922494 +1389972621 4039879990 282831207 +382651070 2777229577 +2040527619 2044208572 +3808248745 1819365134 +958821544 1089209772 +3380613170 1721335475 +2987190595 2371040362 +1360718246 1398657089 +1375936350 1324786523 +4256177814 4064290343 +2153139601 3151781719 4202160049 2196296076 2564561743 3900632886 2564561744 +2278345615 404724699 +2149152157 3770156930 +2358807498 1841534258 505679611 +3940841571 682197980 +3483332299 633811960 +1807841535 2693888360 +3560350443 1055053071 +1386582633 2208660312 +3594245311 4281329854 +658534703 4185009393 +3209438673 3213083405 283319082 +2951900863 1358438994 2176355558 833603114 3099203775 1723104322 4012311259 131673156 3179294846 4288783954 2551278857 3679837115 2824694798 3239015383 919680063 347980458 1853024492 2367627179 +218967968 3344617595 +4153885450 3441330349 +786560234 2285432054 +3516458129 717546621 3505631444 +2330158531 2330158547 +3062392126 2528600223 +3642236475 4227307236 +1894705418 3524844205 +2171052352 4129478611 +1826396883 575119594 1826396867 +4141472210 3989595757 +2751643724 3936227781 1583159475 +1404436575 646092190 +2219296871 2751494688 +4202410944 2632335771 +2459419237 703005932 +1672439086 454838127 +3653435572 4122545439 1195745748 2180651865 4122545416 +3629827578 2430970013 +420710164 4194195776 +619410181 4167862058 +154227973 1011028558 +3607354117 1979658045 +1134066351 3013084510 1247783327 +2722264433 3751731430 +3247116088 3857249595 +2387639078 2387639094 +3119310840 3119310824 +1654926016 2352287884 141511749 +3743783723 2640107996 3550754914 1932739746 2251742293 229975896 +121834852 121834868 +1109778403 1109778419 +1306121745 1306121729 +991729551 4280625050 2253622881 +3580246027 3307327810 1549411499 4209654109 2822539055 1538805108 +1279063027 4143187866 +711741715 711741699 +3452038033 854508413 2866658772 +2883191068 3315914459 +2101593013 3870103036 +2260473510 3222775617 +3901829800 3297951339 +1290541500 697442663 +3521154888 2894171741 3975355491 +1385619006 1379604636 +2120757189 3271766810 +3429184824 4216506171 1585582911 3994767482 +386339224 3626021453 +1589261172 262982733 1992408140 1056664503 319292218 279760339 1056664480 +3779602076 1083492241 +672341932 3256540104 +1378600304 1768487241 +1255666572 827313466 +1480853312 857172421 +618090575 2613073719 723840343 423451235 1861031371 1362643017 3052561321 3211302640 4258021915 1743163857 2575485530 2070924925 1852142010 2405126832 3871939059 4068793090 26147560 3760169178 2234979863 1731763518 3747297720 2605860482 3349724163 3933553874 3477046003 4086428674 1876705307 906178038 721507212 3661519338 3014730561 2833456091 2557222379 1867797762 2004458990 2948145936 1365083147 302895846 2408622975 2782301894 3399754450 2274093318 4014299203 1833353583 3502310913 1911054925 4205327155 +1652205676 1930895895 +3802521844 4263873963 +748352131 3136013354 +3408075253 3408075237 +3314864366 3652852771 3332189095 +795057623 163720020 +2835125567 1151267390 +1055472064 4021173736 2592801858 +351235255 2884117520 +945865034 3152678726 3076556453 173033325 +2677545552 2356243445 +1927362198 1854467623 +4210516472 2489073387 1667872791 3459960517 121747252 2804169605 +3021947963 3359140068 +121515687 233009398 +3285740057 1722746184 +2214199973 2386556731 +2668494964 517829320 3607803545 +3117289233 2422323152 +2116180096 3494073420 269570437 +3012718876 3414691591 +3613142252 2903438068 4061837207 +789828986 2520321821 +4215977582 1920026361 +565707818 1051627021 +2901881630 2667334462 +4053751565 2901471577 +1502934552 494888923 +1720657199 2278334060 +4090364315 880315231 1749845764 +4202099534 2537620441 +3371059294 2904288233 2904288255 +1657833402 1212525021 +3689111382 2096043111 +930830032 930830016 +2852962460 2852962444 +1473088545 4183308368 +2695033123 2500167475 +2682107547 1158051346 +3699472386 3699472402 567274293 +2121977560 362924071 +3574615811 1806459306 +459746615 1832216078 +757705314 2056730709 +3943822906 2893570032 +2586366770 2491498173 +4041943831 1496634662 +2753247115 1538788015 +831997403 2131495326 +1191006311 667259424 +2703132463 2773471340 +3859899287 3294611110 +1226302630 3063738711 +1746065563 1630190174 +1767336322 1453004707 +107025113 3822103447 +1308993504 3001501113 +3556603705 3971907119 +2484095359 3853689660 +943608195 2732334327 +1100772204 2325000084 2425665815 160098864 2585737989 2754209996 1745146067 1973655839 +2545148067 1008767261 +2562007576 2099555277 +983736954 3355821597 +2593245767 2592173504 +1465063905 719757387 +2003450890 123042804 +503084182 3310710186 +3128648756 3538535150 +1170768168 605688131 +1972497146 2217822329 866844718 +371483432 2799478579 +2826275389 1167118345 +1861655115 1861655131 +3836168019 1681904576 +212302713 3053877308 4051391305 3850059893 1688690558 +2521326781 4130167714 +2773213846 3430265393 +1162861750 1478847661 1063013015 3914551050 1430875046 1063012993 3535303313 +1199168537 2648013640 +2978153454 1597976495 +760428813 1728237412 983676920 +2007481127 1045057828 +1685912110 1685912126 +4126742489 270568072 +2116915163 2092529106 +2825994716 948885127 +3015129975 678172720 +48637293 3275563969 3819989540 2910747081 3477497985 260349263 1061868012 4191800631 2845708390 4207652935 3081641516 3339265982 2653602539 1019281130 163236590 474148047 3381407530 572515059 456949740 2496766791 2001524254 594700450 +2220527900 1989308167 +652778674 3397927812 +3878497923 1864382506 +1298081840 4241245077 +718756290 2196141037 +2153084168 4161169978 571434419 +128167159 561880948 +3524512042 1666154885 +1175390170 598301757 +2890870340 2225460511 +1329285350 2689843735 +2053182888 1322588011 +4001100200 1558726544 3199647960 2257626857 1596394188 +4178756740 4178756756 +4122846516 3287642325 227217615 +2429675362 2108297788 +1458064762 237495874 237495893 1236399883 130396502 2585120293 +237957875 737114231 3554467469 737114208 1189639308 +3596564324 3689165417 +1866715525 1353992636 +2500244234 2743851181 +3085795372 3068183873 +361452396 3888032407 +2713168263 455073664 +3781513778 75523237 +1171087627 1136455603 +2231166917 522246924 2231166933 522246938 +2396836731 531233611 3770590459 +2910341456 1683712227 +3269028840 3580484117 +121129441 1050430774 +3183254072 3183254056 +1854609833 3986298136 +1549018624 2124062873 +1499386853 2504495475 2504495468 +3774330855 243681627 +842424773 2020600058 +2086393572 2828224745 +3558226335 3567523554 +1040840654 3133855566 2008095065 2008095055 +1353963934 3755641978 +3563874741 2000786778 +2256869185 2256869201 +2696119005 3616997876 +1216158391 1216158375 +33123738 3602087491 3047655805 +2958609163 2798101076 +2586328891 3898313188 +2569409761 2303971078 +1058840006 3178721283 +4032941740 1458812887 +1833672410 3893039421 +574669622 569593351 +3507824670 1112418089 +163081242 1733438717 +3064378183 2517595885 +2593317500 2418407473 +2950768026 843390189 826598919 +1393333428 2451446650 +534029351 1119775072 +4006939626 3240923593 +727677021 2756344436 +4038133440 2756920927 +3571213674 3666745285 +2329554734 3279439215 +1690930839 1078687654 +2775393682 4241630419 +3122584564 4069802255 +1385751656 1856999357 +2480936345 1656881118 589300815 1432734334 1656881096 +4012776859 278430146 +1865267695 4093358894 +3687116850 688266931 +1437052658 1577722734 +2873434156 3385959767 +1179728354 2480807637 +1236149952 3173449811 +4067885486 1979418167 +2780572234 825660013 +3348453061 4111964172 +3169727848 3539866301 +2041479670 2674823617 +813828303 2753968908 2753968923 733208014 +321949939 678702725 +427093203 3859861562 +780420964 2182015832 2654757481 +1772537585 1116417382 +2915891907 4238242587 +3728504074 1571210913 +2030571936 666091237 +186142716 1933961656 +3913886464 1043247365 +4128246635 2379985304 +787526941 32316578 +85540231 868603721 +926686343 926686359 +519012190 285573353 +1894894064 3326622557 +1225816287 3625570716 +1022420463 222309676 +2692607377 140338821 +2665424665 2304440318 +1860075684 289364488 +2400361097 3276359086 +2297811828 796982751 +3056320845 333532196 +3717789570 1506648501 +1803205314 1803205330 +4130468388 3030396607 +2401343737 4089622275 1762611756 58462299 3461820954 1066126663 3437524718 3996653256 4222051884 4050608027 1466177350 1203500894 3647878385 492334203 4055672803 3439638123 3010174666 +279944595 279944579 +3369738506 962724525 +3365647514 941706049 +852627475 1602267247 +3775195175 921945636 1876863673 1639544182 +2916939145 3341845748 +674393697 2825110198 +3091929609 658111544 +3591297728 1561235163 2678874550 1545471976 218856251 1871051198 1665095890 1095496847 2404016397 135941817 1785850272 169766004 3016330764 3695168966 +210819763 2047411767 +1727442173 324162132 +3953435749 1588168605 1496238842 +2266952217 4032220442 3683148923 3359849193 1975000527 3359849214 +2145899117 2684668744 +1313886516 3238795243 +2109378316 4172230625 +2789350872 2450848525 +1482360131 1514752106 2640124720 2640124711 1482360147 +3852152476 3972450864 +3996759769 3722106782 +146233591 1250372468 +633961539 1919019568 +1166595179 1166595195 +2821038839 3523708258 +1506385979 2473016548 +2002509110 2002509094 +86871461 3417701036 +457985679 2283776792 +356992807 356992823 +346118506 3572824273 +1729409573 3805386196 +4119315962 2126293131 +81298664 2295937323 +4002727372 713038676 +286916001 2342676067 +3885629443 3610342374 2832823041 +3130537163 2291866516 +3395037092 2398643599 +3988141476 362029967 +3701478372 872370153 3286944729 +202524983 935936390 +2616374059 2853178530 +2275986096 3623976844 +3491705086 1468511811 2669289417 +497716057 1802859844 +2264053719 1574427536 +2749153467 3598880133 +3316546640 426714301 +3318387928 904417307 +2616576253 2616576237 +3417083110 4123814879 +4083586348 4143555318 +242744418 3938563246 2671850346 2671850365 +2656716165 2656716181 +749839241 3835981998 +4136559113 1432683630 +3589226168 2141174715 +2409908514 1775747081 +845556596 3403048847 +4183880016 236170753 +2734182677 2716312586 +4289023280 2704835221 +3337697182 1974281150 2055779061 3418000831 1974281129 577857858 +2128517596 181040079 3572772554 2935003365 3446948895 3248543927 2910942182 2320004056 4029195383 690352071 753686481 19716295 3192259511 2075949987 2883325182 9993348 1557034743 2408508404 3384712105 294878569 +3588179697 2001008512 +596265864 596265880 +3151869738 1586372485 +3075447132 4134779399 3310064332 3998116807 +1928728409 3253647934 +1544836577 2248569274 +2266831852 2383868427 +1245224924 1377854609 +3724420122 1269116386 2433930475 +563361741 1090293029 +2609818149 110483500 +1427409823 3731404983 +3537365356 1000617683 +3100381536 1228888627 +341944951 2361350480 +1657609109 501377923 +966395908 2806101572 +4109453183 382962920 +1141864632 3696953773 +283490792 2174986283 +2686567760 897717675 +3172117373 4154439547 +1479086151 262447040 +4212308574 2625331689 +2794299243 3107273314 +2567419645 3827634260 +323341290 1088422235 +3842527840 3446377215 +1163861489 2494761576 +3278901473 2322240032 +3676743196 433552903 +3458361907 3006082636 +2245236912 2245236896 +1351698259 725210071 +2864862009 149488296 3301921054 3301921033 149488318 641659439 +2195815585 3153578812 +522342944 522342960 +2601003860 1641821497 +3451163135 3527529576 +2258768461 2258768477 +2043639809 2461306972 +4206180844 2538221185 +3649682450 2245202003 +2452590667 1195184185 3856396654 +3120527808 2368514387 +2366699377 3667117047 +3840025916 3589789927 2748413459 2185768300 2348850535 +3584949491 2647560800 +3220015164 1592620657 +1607933738 1607933754 +688044986 805936770 1229817291 +2646096032 3909166053 +2646351719 3055906601 +3227345279 46236040 +1741159077 1419520870 1785029591 +1692152402 1414157999 2891194622 +28957902 28957918 +3217211319 3217211303 +650020934 1527653280 3121302549 +2968249734 156914145 +509227738 2717781309 +214843583 3887066302 +2409363353 38721451 +2055196569 2139952254 +2436367535 1244618606 +1895247017 2465980430 +3463057595 4242079109 +1417732053 1697725792 +957338783 1928050248 +465863197 3545813922 2682434632 +2257794943 1489001704 +2593630829 3384887698 3386257652 3364145671 3403035274 2953447681 1926467329 +1814808227 3957961354 +2081203422 712864510 635931007 +3158297769 1342537742 +3487908067 686105948 +3566065661 1450210 +2985426219 2856145692 +2981936298 2326159621 +3122461685 3122461669 +4189631228 1023769776 +1861251025 126454148 +75961158 787680977 +1503008003 3818393840 +4284808241 3707988023 +942359217 488242352 2036699063 1978186070 +703463367 3463285528 655408384 2247071741 3366561366 +1731406757 445494458 +3572207372 986853367 2320061189 2044813089 2162256417 +137364233 1280152696 +2691757576 3299131701 +3165441839 856303342 +1165817560 1165817544 +2153757465 1973398526 +2594217816 3269121947 +3435513275 374752612 +577853732 248502948 +1405386101 1397849916 +1696908203 1696908219 +3009946177 663425453 +2909357282 3736563669 +139835287 4097228937 +590844551 2484581593 +2132888112 3143783837 +2289027640 1264843452 +3500257198 3500257214 +1678235110 2549243697 +2092788966 1144155649 +993621641 3296041400 +4260844810 3596279469 +393981676 1122321589 +3134105061 2384634601 +2511544198 788176865 +3630074842 1993746475 +3578624723 2616744492 +3033712840 2144480283 1876038347 3836981748 3033712856 +1730761492 2047723631 2182669300 2628949631 +707897369 3581243343 +490427261 1931004002 +1199279628 544672020 +3564384378 4239786325 2440704598 4239786306 3974647819 +3273664380 251217200 2812160049 +4137119379 3278049644 +865893905 1348105414 +1235473281 452936941 +3376095428 2350158985 +2791754821 953389196 +2483737215 1522455594 +3412039318 3178892839 +390208076 3910100385 +4103598385 1916809015 +2488192702 961896414 3908020934 3985531488 3985531511 906982687 +3429882638 3793082137 +150035360 529727364 +2105380291 1336289788 +920789241 1593436158 2171090121 +2053025601 1019153895 +427282468 1000122537 +2256394809 1359982601 4045309886 +3111570057 2333302835 4063158757 +727246129 1844497446 +2626396335 516813688 +3687582614 3227663893 4020747036 +3213316615 2673918693 4014433010 2455809638 +1098080886 1220591178 +2928403758 4097427311 +363115636 2252870297 +4219833188 1818055524 3120287567 +2702346113 489624230 +2457942951 1215358966 +349197949 349197933 +849838984 3614689955 338319280 +1060817244 2896644976 3851090897 +3574546020 4240720027 +3873374244 2500671657 +591949321 2483370040 +2135895145 2135895161 +3339335892 3662968184 1760449064 2637038029 1760449087 3585490564 3339335876 +3943865189 2021250716 +3134615834 2400109301 +684282084 418010879 +3613676919 2314373702 +3687655691 3821738040 +2775995472 3478568124 +760602378 3907420393 +1212476307 1467930732 +676038141 432963317 1810099522 +1514654876 4247600967 +832952990 3323406015 +2309282011 984306846 +1219458245 756944001 +361798228 1185083961 +128857477 2621325402 +2485415468 1633251159 +3676839704 1293758360 16619866 +3242672835 3385563795 +126766041 3187762846 +2051683264 1120892755 +2553534830 2553534846 396321097 +2586066419 256457590 +3658423952 3658423936 +3749213777 463618438 107816417 +2514487103 782985278 +6612737 2681710230 +941489638 1295436369 +3874389986 1802719445 +668499022 130789081 +4004203659 1118404290 +2112510437 12581149 +1348838309 704035018 +1145308228 1145308244 +1843611682 4225549629 1940399598 +2440291804 1422662289 +606683205 2548946243 +955787218 2158407557 +961321074 2777938789 +813045869 3068687250 +4233370868 120859051 +3112749541 123071676 3112749557 +883297305 4200926024 +3439765844 360484655 +1307501954 3831501213 +875169454 3425207279 3275637490 1388818745 1388818734 +3103801879 1678038025 +2813447372 3370476833 +3671763304 3996692139 +4070200936 872946207 +1347402759 812577064 +1690729542 3933577790 +3440910367 4227502280 +2904645134 2904645150 +3827761488 306164139 +1747459009 1747459025 +2859286144 3351974840 599856932 2023205453 +3832565623 3144867625 +1912490524 2404297223 +3633173874 1431211449 164163054 +4033859635 3003433050 +272020466 2874888612 +2749458624 4192173723 +3102857195 3102857211 +2373598734 3312431129 +3974455041 3994324608 +2765327267 470077834 +2877906650 517638070 3913270965 +2959131855 3021559564 +1636713204 2602139965 +3853263807 1973200575 1894504442 +1127103988 1214622792 3050014489 +2766508828 2976290055 +2100393455 2100393471 +3282909309 2259676354 +4197878859 3704704376 +2371421389 1344442020 +1432458491 1814784654 +3078759052 1391386295 +3035871668 2410501721 +7116529 3747266890 +772813865 2894208152 +2452551486 2056451597 +2544724775 3976179296 +1231676805 380915802 +4093050515 2546367766 +3153505526 3914273226 +304853072 2341566653 3938881013 4144683944 +2851464430 1534491964 +736666773 165907644 +1760495353 2030253584 2416843555 +1379995847 1006515091 2616919295 +2611213981 672359671 +3074507523 2126282172 +901289963 2090280674 +468326643 468326627 +1158314512 1372425360 +2190905072 314509404 2198012885 +527742005 3391695398 +3333099682 1632317205 +2493489567 2521525598 +1241281714 4203523163 +2298075277 776988132 +2285311427 1961516709 +2180686962 261152613 +3229006808 3538531611 +1652030781 2506090548 +1820057313 1820057329 +3994343922 3167950821 +3400132778 585461011 +2869747267 2869747283 +35618716 1806878604 970441608 99854919 +2949712699 18132466 +3034771241 561343660 1113559973 +4196070711 4017096080 +1818587827 1454608332 +188251119 2565544248 +2167815170 1784706869 +646177703 1218404342 +2732399613 3976266978 +285343476 3122944537 +1526137751 364453518 +1824101310 3861091337 +4073092043 4184361108 +2554055576 593405024 1042382925 +1701006287 632996141 +2159635661 3725322322 +3532248706 1415077389 2420177934 13036189 4043091619 +1475447067 2352666002 +3783756751 3783756767 +2813134895 4221519490 +3256189241 3235540136 735297271 +2333663627 2200636866 +3287734988 1234857783 +1226373628 240224177 +2658735380 3340548596 +296470600 426527051 +4120184456 563693579 +1468565604 804173183 +3470783878 814711265 +3422016772 53625327 +1855013546 3098276237 +4092074834 115098605 +4219321731 1777423676 +2918392716 1640035703 +2955296873 3294090693 +3337163528 686355869 +3876844810 3463102125 +2244357290 1090015131 +2993576525 817375012 +1838111823 1838111839 +3501554350 1001398255 +2547828855 2547828839 +4158675603 542456064 +3186103522 3596148682 +1722636363 3991010818 +3439045924 3306976334 +3965626909 1355640043 2904526850 +1870186715 2807450962 +3200715286 1767170215 +1031270801 1423001424 +2518231464 2925421328 +2520306660 4053739144 +2729697817 976022878 +577027833 496542206 +3976371814 3680213926 2166315671 +2885683383 2064496656 +3164450979 421602694 +2949149394 3601922600 +3722159904 3722159920 +3379184018 3262693108 +2400902037 3324986803 +2996397060 1332062788 729313865 +1767645783 3291594154 +3369524162 1365157054 3963351669 +302051572 1390796502 +2723113572 3875830655 +3139286779 2328300850 +374031874 3644892682 +1606101059 4230283687 +905376543 1298429386 2670030061 +1729796660 2195767257 +3964113636 3635166441 +648642160 1288833603 +4252398999 2173341237 3117295874 +2177869465 1627443036 969032553 2696052559 4074980062 2712830165 969032574 +2402232836 1799300191 +3981284059 1813917380 +1011851516 1011851500 +3088263066 1613191037 +1216782140 1743563623 +4222318537 2692572405 +3883448033 1141367862 +1099785164 3114462480 +3895938841 2819720286 +1086961459 814441804 +2911896655 2756850402 +2329977110 2450693170 +2086660379 3858494866 +3318478236 1676415047 +3949451426 3306752427 +3691781256 1956678563 +1616982792 1967113780 +4164631748 4164631764 2302716063 +1084458619 3429043039 +3996304473 3996304457 +186543377 2693012333 +2778290248 2609033119 2539232408 +1760803337 4289829998 +2665242927 3859954284 +3910402772 3196089263 +1008241166 2230801294 2829145103 +3732467159 1599693256 +30460315 1991073540 +4242733182 2538417737 +832548947 1902285484 +157072649 1180197407 +4181050626 2851388683 +797057777 3135045991 3135046000 +1315777719 3162806295 2961474851 43881621 2961474850 2133550381 470504912 +2940994536 3702138429 +1154755638 564344358 3112429079 3048020362 +1070528512 3339961896 +1862279824 1101452541 +2465470128 104838933 +3128870108 377983367 +3661849614 2786492943 +2552657352 3107852400 +260811576 2967374139 +1187387971 2900055932 +3281241550 782016850 +149012223 4200573822 +3426784305 3131656486 +2589626876 1319865557 +633062914 4119573115 123250318 1754838307 3412403722 3412403741 4000731790 106472696 +3041922683 3892759460 3870462783 +2845322095 3422195519 2761360392 1770807204 +223484882 3393309573 +132545539 1926576298 132545555 +141324126 2177463903 +4233765019 3132572232 +340930444 2304825719 +1773133806 1119243385 +2857942515 3117529975 481494412 +2388900228 4116183663 +588494765 588494781 +1251470832 1563136195 +4103375127 1945945269 +2826610788 2007463456 2007463484 +1558573726 1155878947 +134446222 1169549469 +3101457703 3101457719 +732102670 3214480921 +1526359014 2618992675 +2083559703 2953951363 +1554070977 4195504870 +1886275270 3281611169 +2408878796 2123557755 1922452756 3373363493 3373363506 2324292530 4247721214 3538097975 679312340 +3980526192 1237404018 +3010026196 1121581999 +999161272 2022074541 +4235820332 1589362470 +2053232939 3942028622 +1555827 272028881 +4204403210 2325151163 +4176560997 2497494684 +98851317 3168676215 1248960396 +1999200862 1452682366 +1197936908 1189592436 +99293559 3639191861 3357087312 1333665763 +1840068351 2601810283 +2229328738 1214777368 +1963184851 134537786 +2831135578 1439528305 +4154073028 2342519177 +422615666 3162853588 4201694333 +592608805 3153482327 +2684709141 4253314076 +3778128559 1276400874 2919345229 808431982 +2002994457 835022543 +3092818223 3092818239 +3348766371 3667802780 +2338145919 2176066231 +4166345588 2287144415 1651216281 3484733460 +538849138 25473139 +2579112672 3758417587 +3303155514 704888925 +920311707 4118898962 2126008671 +453738473 2082102222 +581051056 3882362968 3815252508 893164309 +1762440627 302123212 +2889941355 262646398 +2290618390 1084562657 +1253598417 2150775394 1678665189 1481570422 +784565422 1271520761 +1274830477 334164377 2885409400 2624744240 526220724 153481544 2805997458 3510053811 992030472 1371476247 684615150 284167187 2739318062 2596428971 3135071056 539284425 147736350 1627484202 911878549 737206448 4216815470 2292982259 1945216490 63486542 1169113226 4155623445 +3286222124 169267799 +3922336993 3928716832 +884250049 2331080980 +1427717770 2159899437 +4209166004 2801716569 +3254748777 3460339544 +1844379285 310601005 2755314826 +316135062 1069993511 +1173882742 2608053969 +2141251044 3460949503 +2729615751 2788444032 +2012981399 928471945 +1066723277 3832080306 +3207806750 3478468414 3207806734 +26561108 3523478063 +1412466560 1412466576 +3665921320 568630763 +182923359 463344924 +132390416 2082165539 +2110325098 258122792 1207557675 1835874765 +4138349153 2599046840 +656467894 1322042257 +1444004776 636944747 +3231331799 3449193283 163758448 +1295667035 3989498948 +3501081584 3501868363 +4183730123 1526867092 +1799278390 165687825 +505572910 2654171759 +3809311813 3006963866 +1539912054 1341970735 +503678396 4273047271 +2911251622 530281446 3493349719 +295467064 4048633901 +2741777282 3310687651 +306188910 143171118 +4166688142 1616663321 +1462707754 3285888193 +43882633 43882649 +147235138 313514723 +17708321 718790372 +1953387098 1379051061 2745934781 78757622 +4195463443 852143412 +805507903 2750210795 3554102312 +3310643900 3841284720 1608779249 2606434796 956087453 +2007492490 3880877618 +1511854289 2898360592 +3075168609 2635956315 +3222680458 1035920101 +2979017861 4083164163 +2754605936 3883678019 +3365751158 1167762631 +3479022273 1335399764 1666006525 +2459645526 2699120331 +1847623338 120022427 +411933572 720097481 +2073217240 1611803661 +3160216696 4270274797 +1291608100 1348328026 2653433969 +401694882 2756825533 +2493951848 1785077949 +2436538092 2336763265 +2823562146 2447120405 +3038091860 1505198060 +236058461 217759572 +3040202311 619543591 2327034326 +483733772 2481508663 +1074395879 3065379254 1074395895 +2496953118 20492226 3171865385 1753075753 +700710880 2676739507 +572567527 572567543 +3800866295 2589764550 +280924165 1627174860 +2102081588 1902737881 +30682556 2634284792 +2142091766 4101750343 +3432171946 1685284109 1824804184 +2549602066 3360277946 +74239104 1209329741 3320426788 +3957986662 3347034007 +1952482661 2565996012 +928200502 1308617233 +448470401 2509206038 +3176142610 2818311610 +208958196 3044239689 +3022933174 2362318602 +2946516777 242628991 +3448887142 43390359 +1756475536 1337514387 1756475520 +3149450851 2355320081 3834100854 3850878476 291432903 +2006940808 2006940824 +245964069 2597133596 +4067376742 724733455 422132646 4143119770 186595991 422132657 3361654687 3306181579 +49770134 2627615426 1003078667 2800512381 1815968350 3348842969 3101647569 3635356908 2590573015 3341332294 2956487978 554469692 434239020 559459291 404929920 474094904 687672451 401796860 1103571919 2125592244 3313742858 916782162 2407431317 1345109807 1004531983 3793860666 466239072 251197430 2602398675 1471702210 2872955201 +3654558519 536047504 3694698403 3694698420 725690473 +2365377075 1970356663 619859532 +3964539685 2579534043 +3417898472 2620896317 +478464224 3305650341 +2245261394 32237819 +449050060 4001099809 +1624311353 3626286110 +2681623715 3981741341 +761465176 1082850208 3404182939 +3425670974 2901087903 +2603617820 1755723271 +415150705 938408877 +3362101958 1039312289 +897082031 130406394 913505949 +1773852341 3069469348 +2152921477 2275331155 +1149565282 1062507861 +2123155840 3506095765 +359066307 1946390762 +3589315419 616861778 +2958801701 3311901498 +3871702803 2562077056 +3871875736 3596123193 +3707213308 3586202535 +3683481053 2091944683 +2261551255 3405448614 +1113622001 1861409392 +905748470 1371856854 4071608391 258448691 603341514 4071608401 +3608201363 577486693 +498603208 3371687412 2429073117 +2014721772 1243675159 927111198 +2028037613 4292856633 +2323441327 2979997038 +3673058955 1079516690 3673058971 +1316171146 156282925 +3215600926 2307446078 +3947410899 3894355520 +339594 3623472992 +1097945345 2736175142 +1628666328 2846412571 +177692915 2770190344 2123037258 2770190356 961119542 1395693175 1803344849 2673809549 3693364203 1395693152 2672664204 1422188952 166666843 1395693174 +1362085834 2590191909 +1998712113 3898096222 3166484059 794144285 +4112818255 4112818271 +3090106179 3169268314 +1942349858 1653370243 +4055948994 2764562366 +72437339 2507074405 654203218 +4131383235 959381936 +2257079633 428979846 +3021616426 3021616442 4285123986 2940317979 +1336670485 2159614986 +3670574253 4258452741 +387614181 1136707450 +3601258855 2245540196 +1796127267 1796127283 +1235605805 2782892153 +2753611679 231838538 +219485928 2150829867 +1870131413 1537294700 +4276494108 1404039486 1661914359 3116495408 1227345376 3814568544 2108796073 220012791 3851242774 3666198343 3897905621 1236362128 726049702 1001803986 450481738 1340533848 2341187793 +3870463152 3870463136 +1923253216 3292585659 +398643362 162426627 +3794874549 3362761962 1913213879 4127168019 1909273676 +2523072647 1155951744 +2115815432 175252588 2404312203 758240485 +736471444 2928276473 2928276463 +496613373 2516362068 +3143373321 4210058296 +3312041512 3983956203 +2520727649 3868350624 +1073499043 137332914 2839822113 3245095267 1076125997 1932245723 1496792434 868793114 2114262813 2463477302 +3814923534 50773263 +1861126500 92424319 +401571980 973560929 3130420384 +1662772349 2179510484 +1368838681 1368838665 3022920425 +4044858823 1388764214 496495297 3733611168 432794466 +4021623388 3055058631 +2596719434 4042392955 +158082252 4141190104 +4209383643 601408013 1008054324 3518582874 3790253391 1777145726 381591761 496630441 614670162 4204730285 3627160969 2893507221 1776322096 854163100 384427799 3025461540 1618985457 2903127173 2818929935 3776836823 1234029997 837237066 973863896 1792655449 +3751959600 4075204943 +1259293078 4001542753 +3684678403 514402023 +2933863690 1398832827 +3326082837 3875117498 +3652595806 399385577 +4202600859 4031500050 +2598374184 4138831869 +3613317961 1397961720 +207553989 2688759786 +2840631847 2967645046 +3962518817 374228493 +3329065238 3717887457 1952593329 +2528818776 2683112589 1328202227 3643910816 +2420320236 95934615 +3893882329 917204104 +2161341761 135249077 +2227229234 4238983446 2159250218 1806045405 1097625475 764077242 +1474532794 356824029 +2077204299 853000962 +4005453122 397201141 +2600437398 3005070770 3485519678 +4040271096 1651877566 +4047188416 2461472632 2150584659 259846043 +3781664518 3693041249 +173936272 3524318099 3792759989 173936256 +3486020441 1905104136 3486020425 +1442836639 15190600 +2760160802 2760160818 +4260177223 55684822 +1358534416 270666640 498542095 4120392628 +2423215084 241822460 1262558359 +3030184455 878658798 +32710456 1236935995 +428899959 3044480326 +4152128824 2877622493 2071623968 +4247116372 153502644 +1254683740 4271377680 374910161 +4123412896 2779413100 +3745727224 1080159127 +1926817930 2752466694 3286048741 +677751688 537724683 +2365750701 2856580612 2955495759 3776583707 217860191 2856580626 2856580613 1619778228 2817251154 +4036580812 4036580828 +761229792 1296057253 +2413821850 127878701 2598581602 +2179356871 1151189334 +3396853136 2906358378 +3262528649 3916045458 +1308385749 1877774768 3654433743 2297622154 +3787356443 2044241298 +409584293 326986156 +1290314903 403271682 2839222694 +2276551802 2883629623 510365503 +3213382783 3213382767 +1368004475 3613587108 +3022734298 3337158518 +3734353593 514762024 +525581778 584307077 +1466881332 3615072473 +3466505611 3469423042 +2310047953 2447859984 +2298634375 901641344 +4137776830 4264422665 +1347081077 3670729020 +4013707937 2820104373 +3841261731 2882600906 1368180985 1613554483 3548526340 3999096681 1023794766 800541301 +2457530103 2391158470 +989328933 3242954994 4183325740 +920975275 920975291 +706871995 1203126655 243944548 +3761185015 1341666164 +3439033295 2128864974 +1056016555 3241813300 1653117135 3241813282 +3695024537 3189048270 +3424736646 3732513271 813299665 813299654 +4245628781 3420131474 +2817375134 472336297 +2441604168 1626928477 +179294662 2563193505 +535709575 1074794949 +977532046 1250361881 +2034325609 1256074574 +1778384769 1593784342 +1466105713 1404257378 +555474838 3844618359 +3005070783 1948111211 3068586289 3067196328 +2036119843 804745738 +1061296736 3966671163 +1487356507 2637785339 +2660825477 1107848536 +3935514620 539661228 +1944053806 2541387887 +941358924 2685592737 +1323077005 2989675748 +2332141060 3877043902 +2642209929 1957190584 +4193937738 3088979701 +3061779793 2600597136 +866385221 2418520972 +733399744 2428578885 +1258078466 233035299 +1931861124 3721952686 2477151599 +2659736121 777924617 2659736105 +1199316936 1348863947 +1216758118 2438525847 +1438112358 2756261798 2756261809 4199330202 1449971351 +70139560 1020043883 +3166850791 3894045426 216151478 +1000770725 2351916986 +2962245898 2755794054 +2887711775 1314488088 +918329880 1122407373 4151565248 712942560 4046056791 502967219 +3329901213 259448116 +147646247 294648710 +3414903069 2302941346 +1116969365 1666893212 +4095567357 126132337 +922073874 3306441133 +3759655942 3255407174 +823687350 4286973585 3338421910 4286973575 +133332450 1030823938 +770213474 976080253 +969076749 4208976996 +1864523823 2890781051 +2660314434 3700396896 +706517400 2937943844 706517384 +2744768935 2405296953 +1387582339 3047749434 +2691500810 814887312 +2132371007 1409021246 +430999056 443196523 +2422118954 1861005339 +3775640703 3775640687 +2576535043 3306835644 +1141506363 1455419378 +2394892279 2456498526 +241587088 3085626859 +2045607459 333287708 +2645684969 673277144 +451165199 1682606990 1279896325 2035925083 486029516 1682607000 +2716549348 3377932009 +1451239614 3921683231 +277380597 4225648828 +468361577 536494798 1524197951 536494808 +4278137590 1148607074 +934996834 490769237 +1560577694 4143331721 +2735544688 4250853837 +1593516343 3159705990 +2417737287 3506946422 3845712477 1637674023 +1651862171 1262744101 +3369086861 2717412361 659162301 2146312404 +2496000985 211738270 +64665452 1809781918 542024235 +2536556793 3451591881 4207697918 +2304826573 276534948 +1947374062 3859102618 +2818573414 3724995735 +3295003829 3778324732 1877338189 +3735118314 1645028173 +3722760109 1596696146 4231195995 +2236973148 552963044 +2994765554 619361849 +2305108750 1480771353 +419587583 1573294206 +3383077380 1942660169 +3626394111 1131168894 +3850375923 1702205559 1000199308 +1405214049 3787852688 +1907947482 3761122347 474528630 +4012369159 2083479641 +908243750 908243766 +2214837664 1910735603 +3167871427 23487978 +1399192153 2726894103 +3858048803 2843328528 +2448826547 2037742028 +1528995920 121235644 +3843349978 3843349962 +1271984721 2867688848 +572596307 1587795136 +235174696 957210603 +2469076784 3705804931 +3623404559 4144605149 +1951808182 3653135505 +333721870 1580808473 +2854847515 4200265362 +844847256 1776270160 +2062583352 3231926829 +3664483240 3248759626 +3981449891 3973226384 +2009880975 632355864 +29073786 878654219 2094881346 +3423303175 1715052787 +909376154 3472042082 3990061163 +3888161337 222257086 +2557960701 15679828 +46630055 123401892 +1831328978 2814418579 +3599741836 3498224672 +3289199398 3334964439 +1024607046 1774184225 +231800490 586558054 +2308552887 1065476872 +2458710278 3386869169 297254726 230144261 1385247280 2458710294 +1900655487 3590689022 +1394725651 2996610455 +3045025270 2911732305 +2652664255 928729572 +2160026489 3285809993 642357118 373915224 2160026473 +2835537681 545597382 +1776495989 631279402 +1937408341 517576906 +1225893676 852109889 +3701602504 452633309 +83325345 3272441962 +1917325091 1917325107 +2563656807 4089595446 2859977081 3671352420 +1360908108 1570519415 +1202844101 2719979788 +1864312826 4234909067 +1576738706 2220012243 619156414 +3064837046 3878046730 +2864414948 2864414964 958169304 2838226665 +2170180475 473000626 +3356673788 4118786215 +3711048064 3051234451 +1401992360 885810283 +1015141239 1015141223 +2240544477 2279047467 +2079035522 2513730741 97862287 +2155812536 3345221956 1098669 +1642419860 410717259 +951384552 753231933 +2954467491 3548597639 +1957899872 370278707 +3310581798 3165729366 +1639619671 4199240773 +3569033152 113708232 1765599770 335956548 335956563 1619531635 1250424000 1431882430 2500111039 +2375055104 3664467205 +3399683129 934034878 +2107228408 2970273389 +2940544643 2579316336 1826332732 +2654004745 3764589495 1354801682 +2458837350 485282689 +914655913 2074494990 +1974735203 1607556972 +1798755710 1941978670 3021595375 +100149371 3769088434 +3160544672 1135704600 +2952043833 1840489666 +2670854775 314171728 +4112386302 3695716297 +3831197244 4253075943 +1277495633 793619078 +1716038745 1567051784 +279311381 1245658396 +982401119 1690543388 770904363 +4131723529 4131723545 +118640331 3973187988 +2626514697 1578272799 +4139332581 1250734444 +3218180410 1663868786 224492570 717937151 +3303068494 1005364166 +1448818032 1637162819 +3151540071 3151540087 +3155971979 3155971995 +207039061 3798636531 +1363221561 211403272 +1652889256 571656108 +3646806746 978978442 +201635520 2875961427 2875961413 +809066724 809066740 +2421752049 2244634423 +2710723092 2904323432 1835257209 +302285201 3994548038 +103585184 3730648983 +1553894092 4056167380 +1889586783 2888097694 +1501943125 3157847792 +3266205591 259252902 2725781022 +510581563 595795428 +2629167821 1075644024 1995294136 +998965603 517156554 +905052827 4217504678 +107485831 2003120019 2632041088 +1381488923 752734629 +2163038853 3996923040 +123279124 2772391033 +3793666009 3479700104 +363074106 2381201390 1544463289 +2265510039 3951074306 +2628429192 3923467628 +3405584059 56534106 +3688848313 3650970664 +1166268313 4156544412 +381018200 1985112865 +547206813 4115036459 +3776730588 1000024391 +3866673274 1753243824 +4186426391 3888531504 +227599081 1230711407 +3605499370 642751533 +1467528691 3894309728 +3558288661 4118542364 +2447164313 931654088 82427527 152348748 +2781729084 2660852977 +238922252 2310523664 +86164444 4055520071 +4048232407 2957188966 +2161432805 3021041786 4050915357 +3365207201 667049168 +1861978920 1892494147 +3040929050 1596493485 3040929034 +3742122204 2041015687 +358943679 1829862817 +2176469509 1027769804 +3605414888 880600637 +3572088117 1626659434 +3299891575 412931654 +3299424425 1063531032 +1854366730 2342246974 72912798 2890684213 +4044651041 1879589059 +541374327 1127010384 +2170441433 2170441417 +91910388 2965974941 +576122788 3000713023 +3402208029 3036884776 +2363918297 3978471281 +694250182 3931837879 +3529671578 1229450037 713474239 2281623815 2980267086 2768184258 3165238162 +4141229056 2467998739 +1402473142 1314446471 +3721331739 3997319720 789901821 1206089348 +4174420515 3695830212 +524842483 524842467 +2268007123 1209664320 +2426067885 1355272530 +1836712221 1456226069 +3808058991 2609879468 +3210505768 1719757035 +726467480 3258755163 +3545967112 3229821597 +387145027 1625895728 +1713714070 1653617959 +3299110417 1829194237 +3472216350 3942134335 +1923228006 211058330 +4087484501 3709842908 +568642684 3610109745 +2962361580 3790231425 +3232604622 3232604638 +2054757959 201783876 +1101972597 1101972581 +1801659515 2282909106 +2459669580 3222542676 +4271076338 4271076322 +746739821 2117153668 +2673482314 618095213 +4280721616 2043619171 +2517119050 1503523104 +2740375553 581530006 +2080021261 4218565323 948049252 902814728 +1083071868 471673393 +1821431034 3791603101 +840971 1910547503 523460692 +2424823595 728435535 2967752884 +3425382509 3573365636 +1792203257 585966312 +3834130404 2791531497 +3323779152 1841815208 +2480588288 2014789083 +3143786343 4077864567 2986589736 2422619269 3727785954 2410004033 136958943 3506813772 191245919 +3185292866 585099765 +1882823514 2202739190 +804932125 3526635541 3526635522 2957331691 +2448091837 1909426050 +3505777110 2011596244 +2401254039 3871095718 +2056247047 2223407108 +1779269897 920127652 +2182317838 3535641359 +469625020 3434438631 +3503079874 2228611037 +3343872102 672002199 +78067456 315335165 +1977736461 2676947812 +1243424074 2370669221 +354148853 803517610 +3617913362 2943399423 3053136823 2327161413 +1411430928 3794138856 +2080681638 2080681654 +1261009082 2207980822 206114013 +560171015 2528060182 +4157787938 4093087314 +170632112 1799886343 2998054428 +501832006 2042854714 +1936540511 335613598 +32894047 1965234568 +953106109 725599106 +3669018874 2638056917 +2680467220 1981910841 +1391078772 3733585428 731768799 +2050310698 2346133531 +1933753856 1933753872 +3701302049 3106103837 +3351692691 1465742189 181738496 283707002 +4028837096 4016025899 +1156254330 2369727535 3618544186 4029141222 196463053 386426645 644732859 591441244 224795783 2055589514 3785255022 4232764042 +2541055122 2534086458 4292471251 +2575496721 3123272912 +388931869 2607259810 +2847186079 2079718218 +2939279915 3066101327 +1602334892 3770378689 +753350845 753350829 +3435022876 3201276684 +2499455346 4170759795 +1593176593 2505992118 +2864925875 2442423123 +3631126404 3631126420 974685385 +3846082123 746192898 403578734 +1892554643 661593196 +536241124 887046143 +2071540298 2758816245 3576234462 +2411533148 447182511 +3987163562 3329830718 +1033294989 2171640306 +3373257184 3930184891 +951632165 1260180060 +1744375696 1024688053 +3457449994 1950715821 +1442177384 4175588754 +649452512 414455594 2216685695 +2080021277 3337578773 3337578754 1216491188 +3069657807 3594398680 350157338 3594398670 467600652 1175122481 +1160319774 4255717417 +4291444672 1801608019 +3148530475 2563849378 +3987345333 1396936216 +1069965623 2622163334 +4205962656 1175223027 +150193092 1942924984 3686608265 +1539309849 2017567032 +3183902679 1640377161 +2308129082 3167720717 2308129066 +626353632 2775539635 +2555594180 2400637855 +3366548115 1975475564 +1069965620 2571830479 +3203916620 3963277495 +2970802936 3098457197 671483780 +1415814449 1415814433 +2260419221 2915684508 +3611925141 2111723658 +2628121545 382782520 +1796319375 466376984 +387088358 941577985 +767039240 13386123 +82192522 898903064 210048299 1337940198 1875465579 2999224969 3960104942 530619932 3569240047 373851403 2704147566 1620256328 2505532889 +2502951809 1113517734 +2178432711 1378520516 +1856950264 2438990976 +161515132 202762024 3380925019 2534876498 202762047 +199234684 1118014724 +2260030448 4285735637 +2069631215 552511544 +3457591473 514559664 +1081930245 2678039670 +586823066 2850185579 3663682402 1829139601 2850185597 3663682421 2735936182 +2865329391 1714997552 +3407647279 3552138065 +4016889502 1073385418 +3064157896 585756643 +3154083056 3811683779 +2802321136 75053583 +1610293967 3881290712 120972571 +1383405871 2869813329 +3196262510 1449096505 +748395895 1422672884 +3685285279 829146187 1778860360 +688861120 495671876 +1749459209 1749459225 +1024524073 1021589145 1254206862 +1964167763 1950478231 +3120051935 330481547 2696831262 +1192505413 1607640682 +3153198558 1388615004 +1775085819 381011619 796935547 4275564968 +4148372553 2276597486 +1973581844 1120077689 +758900452 424442111 +2019759532 804986327 +1661989990 1305469361 +194307619 1563501705 578094420 2869232691 +1930398232 1930398216 +131291244 3182703127 +1042783484 3562807463 +3158627268 609836447 +725287025 2128720358 +941277107 666063607 +2712335727 670271674 +1538476710 20874049 +1323731664 82609507 +1842703597 1842703613 +1251181707 4047087316 +625484259 2475513948 +2735785658 118104469 +4133221931 3973726205 1227107160 3576426639 1094490903 3500253760 3659951270 608817860 2543753837 +428513740 196893396 +2426522482 548619365 +343026068 1935638094 +3560676505 1732651390 +246611785 167910007 1731758732 3235698361 1283736804 +1132603085 3025923808 +3733342472 1432680331 +713240560 1214069939 +729098980 1299350783 +3136172621 3136172637 2449026852 +4004654872 3665830605 3300313252 +843340804 1615992579 2106865328 2084780189 1006115868 2207531015 845207843 2101557795 2207531024 1682117335 1406436618 +2728277424 2765743823 +3160782857 2290010734 2205870879 2636166712 +3274293612 2049296513 +2385763858 3987117637 +3922446496 1483837804 +4167665490 4167665474 +3396343040 3684395832 2926645011 +3687289823 418229654 +491142117 177234620 +1104297781 3539566698 +2323129565 3626108916 +881821946 3086262667 +2593475953 3389581542 +1969073268 1434648287 913734287 3526177556 +510681480 3361408788 +2588228108 3875168503 +2262738557 3319895349 1478035974 +103752058 909226763 +65879731 3782849484 +765393716 88437455 +1709780829 3407187828 +700025042 2165465747 +1555524593 294528150 +3961762719 1530119006 +3634919349 2241875565 3673933593 1536582419 2241875569 4002370381 4002370394 3325325802 +4007743853 655511493 2041786002 +3421846849 1410297152 +3022282002 2590555067 +3695506255 260769112 +1227925278 1435964457 4225031998 1435964479 +3303948803 101837482 +2207063308 589609463 +4248018574 2527291370 +4134147434 1392489947 +743795969 3892196400 +1769115726 1297689295 +20763096 715323024 +4244882794 3069167067 +1424945006 572713529 +2236865441 2214772320 2214772342 +1751848404 882072751 +1607276416 1118723092 +1976661304 2965079853 +2313922205 3136768290 3136768308 +1830920336 1542439605 +876241045 404920122 +289865525 2931279996 +3737719491 2854396029 +4245398893 3327486596 +1458242294 951681298 +1583705291 201875951 1688880020 +3140794023 1526434038 +307113885 1846866978 +586823063 2799852720 586823047 2799852710 +2590943600 201516765 +1116906373 1373071962 +516073030 2993405985 +1483287299 814659004 749213415 +68315441 2583402534 +3458299267 3465793213 +2285633456 2631255836 +1751115469 469259442 +3052609227 3757728751 +457185841 2485469779 925375680 +858388401 883095104 +1347222362 3274682045 +1400320029 2174795188 +1979973313 2303330774 +329327828 2538413608 +1370038622 3678367193 1370038606 +3462572635 4008654070 +3061921867 2557189634 +257035477 4079629148 359579002 +273776311 1732934150 +2433536548 2066665129 +2391433422 3078608250 +1797202366 1738920839 2606877420 837535668 2971432797 +2030143117 174510052 +3018068134 1053159845 +2286562095 2388531896 +2364209012 7630752 +3214834885 1375799018 +2616271618 2124028981 +1970728022 1077283687 +2751174651 537935922 +3492192556 3845317393 +4199576940 2024331543 +1958054240 2066066931 +2237026374 2009339929 +1737381119 3437255338 +1368033364 2970917945 +2360279231 1889553532 1889553514 3059239629 +1233064358 2144559345 +1247041914 2093538059 +3507513989 545852074 +1001666977 4039670573 +3915456549 2296748602 +2440184517 3470557625 +323484597 631753911 +2983403865 2636731115 +2286138009 1158885246 +3914359039 2536457899 1216917864 +2049622500 4276657813 894384639 4159620120 +3568236305 3568236289 +511126731 3231417218 +3194460810 574102422 +2052619384 3111892864 +697689329 1744267110 1744267120 +3603327030 2188806226 +41426029 335454761 +304328489 3849216050 +3699003279 3671715847 +2353526133 1246193450 +684722683 981448242 +1362710356 825745711 +302285200 3977770403 4055354364 3977770421 +489776184 482388715 +2453603332 2453603348 +3862488483 244416412 +668544224 2866920899 +3897130799 3669178094 +882651556 3154149263 +2724765601 1270041206 +1964014598 935195138 +3867315196 4104030124 1060732336 1060732327 +1047636841 2887862757 +830605926 1438015127 1438015105 +3053417346 52614581 +3418305976 1903607891 +2907670923 1597343188 +432307961 2035534040 2303975912 432307945 +2876079078 3893345297 +3015448701 1099302487 +1862504390 3280362502 2291881143 +1770883215 148250071 71246028 1884243638 3579224433 3100506382 +269148235 3526510961 +2378530620 1776765799 +1655497747 1764428282 +2483071337 1711976526 +3777376513 1715050040 386308134 +2221498312 4218265845 +3960048577 1409745110 +1646032104 1523321131 +575807132 2558320967 +603139990 190789290 +4074942898 4074942882 +1748302316 4150619799 2623769852 +101100022 2191981015 2212187494 +1613318169 2046590792 +4085636654 1126569135 +1436130161 1341562880 +1271670878 2959313919 2959313897 +2996921309 286274786 3196272597 +3788528261 4294868812 +2121108105 2406553006 +236913096 1776925268 +1443293704 801688275 +4098478080 2419224595 +163733531 2943901349 +29364590 794521657 +1267806580 2847244125 1771100559 +1963906104 2119701563 +4050982121 72346328 +4260231051 1486670098 581487279 1218228180 4260231067 +3276303421 2818728962 +2030143132 426174343 +1668029394 4074920432 1246991572 +3777028304 650235475 3777028288 +157886480 3767144757 +871418455 453936880 +1987009238 597837238 +3624752986 3905372026 +585668172 3456768121 +4231614611 2704922490 +1716477059 4138296423 +509923518 2528418591 +2643101252 3277157688 3110270147 1197361405 1197361386 1078001388 1197361404 4168966170 1158765833 +1973883144 850644439 +3444292299 4181134740 +1862301215 128223900 566754853 3274465061 688914248 128223883 672136626 1603395733 +1382547371 1689745972 +4242529699 3077171100 +1979355528 1410546257 1098062091 +1417150345 2179417262 +1234855013 2247444381 +3450127181 123695652 +3256126713 2136599550 +3991956628 1750456492 3945010903 +735455305 560500191 865817785 1260481262 +224336992 3691037008 +3710350643 4218378630 +1567191974 2566674266 +3977977262 4021270777 +2987957198 2532580174 +4011376543 3809729643 4105591976 +1335238368 693279411 +2023944751 1933265697 +3118939564 1392907735 +1026226698 800095960 +267091995 716876420 +2143568893 519505730 +2790116087 194187772 2136731817 110608563 +3848383909 3041562454 +2937026999 1281137414 3625910249 1170741812 +1152798197 536656042 +1727627489 2390956817 +873639728 694798467 +1268554222 4119220665 +836394655 3588656459 2819066930 3849472543 1877379105 2887163166 2936510258 3051467429 2555677407 432206920 3588656476 59693337 3136488357 2756023102 206330583 3615935113 423345663 +755139947 1173882722 1173882741 +2142581406 2822680255 2578257598 +2316448566 1901341711 +1605395091 900410746 +3073596261 95014758 +3122700234 4226445810 +1501815039 592363631 +2361464982 704230449 +1132603084 1671451292 300094241 1232542944 +1738770803 2574922464 +3734461064 2847362657 +1831333399 651443165 +568576633 384737775 +1317924245 3482938413 1047331210 +3670634176 1107949176 +2278742126 981154041 +4227869969 3309760976 +1580957471 1990794718 +2876608729 3035748286 +2407302145 1643946801 3971916327 3791900032 +2187326096 3440040099 +1475919633 2375337926 +1455796127 3154427518 +3086032881 3642571226 193421491 2174044272 +3222634001 2349257654 2865304791 2349257633 1926591686 +55508716 2759974454 +740796913 267324335 +2553653552 3430504085 +315381733 2091801978 +1202009224 3151717300 +1432409487 4134547470 +561279055 4182559822 +1742590156 1311748407 +3133490275 3380087389 +3712401905 1239656339 3344198273 3857553271 1197690470 509020610 3344198294 +2486061637 2611769893 +1309252572 1309252556 3038796625 +531399938 1682954306 +2476905750 2129703345 +664740843 1144634895 1250265844 +2062303390 535410879 +2538733805 1340951364 +1205766241 17182342 +868361914 2877982673 +2544601483 1843154094 +3846959906 412073603 +1700782603 2700138306 +3185412408 3669098451 +2619077037 3841755666 +1407162573 3814035344 3113443101 3590163108 +1123179545 1719514344 +782193466 782193450 +499272206 499272222 +2610611203 2610611219 +1975836279 2175921378 3689559366 +283148138 4217934797 +1904049147 418609305 1149067540 3428674713 1132289934 3762739423 +3562946403 3009267932 +2162324467 3305726304 +1117982080 1722695827 +1387488094 682268009 +417679830 1008290866 +3474789404 650553351 +1305903751 2067578144 +3037308947 3969106753 +1116352364 2300503703 952285564 730375959 +1164331335 2265275072 2265275094 +2642628340 3920972304 +633600438 3738054550 3738054529 3919498762 +1530539634 244784485 +487321356 824851566 +2612667926 1007285425 1691143960 216636795 +1412217461 4150887996 +254441601 1625010966 +2810737207 2085703017 +2658597 18424413 +3540674397 2951677099 +2051029535 540568334 +3008213690 2424237442 +759303687 1174148380 +1122635920 3866628771 +1754360169 1034009668 +3012130291 645739383 +3521072110 1350862777 +2737316790 2385524625 +2022238835 2580085728 +834532568 638087181 +2796284520 2483600515 +1177039200 3511007795 +4266314312 983781236 2545708893 +1218655970 2312974826 +4209013406 988436137 +1966638416 3623476451 +2012523864 967248551 +1900982079 2648563774 +1067445019 702042312 +382098842 1949025141 +1287748963 1558419972 +847980344 3373186363 +2004757370 2473325653 +2571454967 614011522 463012980 1058238406 +357794716 779628177 779628173 +1925831944 401396604 +844481895 2751840544 +1032716484 2861249695 +2119081590 196035137 +1005774738 3781325237 4049767123 1005774722 +3924186156 3773659456 1637253441 +150757410 3197607229 +57109908 916386867 3444189120 899609261 3444189143 3454411692 +1746774833 3883642167 +2337923177 2952029492 +2988209347 120858054 +1297443406 192305369 +2778268685 3168886898 +635801748 1013094639 +851796521 364480152 +1250752952 189015109 +2129441111 591801027 630926320 +863225685 1864711162 1413663434 +1935725032 2408493059 2207161632 +121237675 1291086037 3653974232 188079394 +3899361548 3980967415 +760353671 3630324139 +1183934884 3135851839 3135851817 +2012111021 2012111037 +3470564532 635065812 3918661919 +2014993829 3061934778 +115477761 3488338993 3604641942 +4120325769 905861832 4120325785 +1601908026 3498519554 2296918603 +1561698007 865344844 +1879721794 2720935157 +1604931257 1351019816 +1981594494 2235872363 2628168674 1394539145 1832593225 +2719700123 834508360 +3872086826 2082505499 +874812070 874812086 551985418 +808431985 1235375732 1276400879 1276400880 +934633937 2206792720 +3955427581 554116674 +1393869986 104141524 +1223071070 3195341252 3917353261 +2915232485 1412556983 +1678588602 1678588586 +936630921 1803617720 +3266791781 1487663483 2513780216 +1006590473 885548840 +831442430 831442414 +2388877028 175005951 +3930885957 461736332 +3088010515 942124951 3541456108 +2349783104 3131390491 +2915274014 2832672297 +2162570727 3317208514 +267397980 1930707409 +3177341571 654806928 2941584654 3823957034 3839656143 3345967112 3076847388 3434058588 2541396038 +545993043 3202217194 +383064040 2207994656 +3592268162 3592268178 +288150835 328993941 2623779267 +1756884019 210293836 +689887409 1821318832 +1715689217 1887925031 +2458715156 1290809193 +43495754 3058235059 +1971687813 3073116604 374559463 +3015865345 4229733760 +3112910158 2230276765 +2744044069 791708509 2663921722 +2273920905 3860569262 +1923083858 2923455998 +738401288 1357193373 +1601855757 1520879474 +442549680 1708241607 2689006859 +1988397767 83317469 1404644086 1829620903 +910762291 910762275 +2354065804 1849556833 4060199132 +1613866215 2881532132 1428592566 +1068595493 1121656953 +3032076775 1736797878 +2352937577 862283029 +2817089749 694382428 1352264732 1480896609 +789040540 3261573200 374055308 3261573191 +1952439415 4239341460 +1504197079 3824517241 +2027869022 1675330943 3581233794 400805130 2778449581 1675330921 +4006003679 2339631585 +1645842211 3187173382 +4208387060 1202569823 529062136 1202569800 2635317476 4208387044 1202569801 +729935883 3237957677 3104366014 31222995 1449879005 2290934082 198999181 +1424053482 3642273406 +3693499481 3914778632 +4134538037 1297693816 +3921657514 2732139917 +932498687 3807510081 +1793262495 2668901391 +2850747790 182488718 182488729 3814893951 +425072469 931576522 +3769942555 788599973 +1618171772 2599941415 +301459910 301459926 +728085621 4001151073 2247750918 +1848291055 1546740270 3328487058 2828831131 +2999308700 157874321 +1159505738 3965099112 +615112654 1883520850 1458634585 +216007383 4092172354 +1671665992 579488843 +820439785 3833842904 +3934617249 3508950880 +3783300874 1825354341 +1276809972 2361014434 +366189886 2585823391 +2601694777 1467276200 +371801046 3102290407 +2411718714 3554008834 +3026219804 3019620522 +1132090508 3761778678 +544611437 2263793540 +3920263597 2220723026 +2314904461 1037583694 +3112298524 1907397111 595616775 4095575751 3617121548 +3379971546 3327287178 +4138455684 1221868409 +2858136533 2482650221 2858136517 +2174584752 3137116693 +3848825809 4100045328 +538369390 4059993145 3964235058 +2794782314 2150725158 1557190445 2268168512 3669972026 170842323 +3989824045 91770768 +3051662520 3590444604 +2618578186 3622936691 +2371029002 2209720237 2209720251 +2639500352 3935461587 +3448282115 140991763 +3195108203 221421966 +2922769148 1745977265 +2259238502 2297641905 +3099347016 409323851 +1765842920 555705781 +4005831498 683904379 +2975950350 3097122326 +2931568933 904249949 904249930 2561083107 927030586 +848162686 326107977 +3382495801 2597476264 +4066791682 2568062517 +3000716146 1573536013 +37336233 3960842265 701982222 +482984574 2103079608 1452739541 3074210018 862771593 3483184201 +1424508347 3572874344 +4225879215 863319918 +822259100 3775760465 +4028200947 3944207244 +967611535 1152584923 +2124424680 1042000939 +1956642867 1254064205 3403698266 2870896544 +889642956 685606300 +1644202881 3031873190 +3094997302 2649366535 +984868836 1822416974 1295387625 1939860318 +1135493479 4065391904 +1825392772 1825392788 +1651595107 3353872976 +1182427878 1039367206 1338096586 1182427894 1039367217 +4074109643 299486621 +204560835 764068775 3399583382 2454117937 764068784 +3391924522 3391924538 +711463022 1985949945 +3886167036 457532839 +1190660365 3312861028 +2721595491 1717296733 +1380154210 1715358333 +2761886758 2761886774 +2278275787 2724126219 4066148388 2824791960 2824791951 2459652777 2790755138 4049370782 111877417 +2863451975 4111092928 +2552864307 266089911 +1559710088 3779641629 +3687948081 2520361430 +1675820443 623634271 3646241540 +1711304076 1711304092 +4007508450 3909852885 +167531185 1112032010 +2388752735 2188513438 +1574065372 4290861752 +2087629829 3880084428 +102318026 1941931069 102318042 +3575655463 426218006 +1931971264 2916577420 121596997 +2934012434 1592994387 +3622305883 1027116882 +3816336709 1543029658 1543029644 +4257315859 709005353 2207342580 +1025018768 3181622197 3181622179 1035199979 1623660715 2738673512 +3640681970 2311360188 916521342 +1273679224 4204884987 +1858884496 4222061475 +2388582731 2212375160 +3537002498 3811386165 +1063541799 4059894134 +3081324043 712590164 +730947023 1691790552 +3015219020 932588727 +2779014569 706500952 +3040662198 13185175 3552017830 1740726538 +4257050486 3879106247 +1880429606 1165876442 +2782577890 4184076245 +3898638116 2442622256 +52954062 3321757017 +1158669251 2063829994 +2085790313 521513816 +4149110494 3352052559 778825577 +320373874 1980801562 +2228256449 2238581268 +557204870 557204886 +3261821160 4146249003 +2425677975 2425677959 +1931861149 1206142613 3784985396 1306808298 1970846193 +64982603 1645682542 +317464783 1092227867 1092227866 2517373437 +2308363173 1879271644 +2249738886 2249738902 +2244849024 583540869 +1926263022 2821440879 +2858753511 3204839870 +2924146600 2924146616 +1428967882 3737436397 +89103772 2130442320 4166327441 +132858113 2409818178 +374791380 3028649993 4273840559 +2304943088 4064091016 3711898725 +1633980031 3492081724 +2415118392 500684485 3217496076 +4217217381 426054138 +10399170 3150678115 +1873530346 2093792525 3044353883 107805313 1719302442 +989138090 2381850901 +262792011 150051556 +3819332089 29339136 1475099390 4225724801 2648492028 3903691339 29339159 +1155332174 3051021017 +1744514905 2677947239 +2938617270 1277268865 +1478543951 259692698 +1881650774 3833858407 +2376764964 662553257 +594863332 3911933762 310661645 2216362507 3725656680 169294596 2567706807 +1464841980 1853689511 +439051898 2891076125 +489088359 2383750515 1262166304 +1094539943 1094539959 +2115177146 838460107 +2155470535 146091460 628429476 +2068573599 3079082312 +3441315753 2411161351 +642741014 1695689639 +2440751549 3246257300 +1054347688 605060116 +266479288 3970275667 +3510702368 3172552172 3172552187 2305684837 1071622296 +3180388343 334026837 +3524202129 1051979344 4148171242 +1895103499 3702048066 +1983472262 2223590598 2723551479 +1963443447 3319597967 3808130932 +1625770418 1041826611 3494669730 +3731992299 402021346 +183939197 3210204372 +3558380826 3092743906 4239570941 +3057706665 2435521560 +51045996 3817260920 +3092937466 3400241090 +2360739144 3801555575 3398062155 2913180400 884769379 +1684876193 3996425735 3101404768 2010358726 +1595743110 35270097 +3445780344 3388307963 +798698382 2135265423 3917648142 +2525485957 2363403164 2525485973 +471893202 422647443 +3298086842 3298086826 +2136809327 1258993594 +3712401890 1080735512 3125824994 2268017899 436742037 946026179 +2597276573 692637077 +894662369 3546555424 +1262317927 1275892083 3636036896 +1974406222 2425380569 +3713188830 1196054143 +727154719 1505669342 +3079025840 3896213934 +3246252051 4002413184 +1764562107 1204234629 2379522920 +3005466402 592607893 +3162662499 4161614150 3267662113 +3714094129 2953398566 +3726606562 2375541717 +3435279458 3082319427 +3505317323 3004415618 +3394065494 3451634535 +96233184 2054628805 +3410682405 736231482 +1752807897 193961268 4216838044 +3713507244 485514177 1331720384 +3524043177 2290801944 +3297950627 368927114 +1364559687 2988067411 1352922304 +2534327712 2703245726 +1685332441 4285874843 +2521117630 3124003614 1032244447 +4072845439 2415190588 +607063308 580652320 +4198309841 366852484 +984868835 1278609994 95711453 1427263184 +1728899638 141880212 +1107921144 1107921128 3976371835 +3126621214 2106247999 2106247977 3766350889 +3459682476 1118524609 +1997188095 1177706551 +4216783150 3316050426 4292952889 +1701994865 1701994849 +1376016160 1020602227 +1376405750 4291303680 +3691113955 973700170 +3607786731 1886785012 +2616453400 2566385883 +1187170788 1218695657 +259558176 2059600755 +4183580879 3282326284 4183580895 +327312833 2575022822 +4206127854 2550420655 +585948432 745502735 +2124843256 4075458829 +950678870 116954337 +2565003012 2971171657 +3119588115 3382327034 3382327020 +1915183448 201211277 +1227947706 2525060886 +625276201 625276217 +1571741613 659168580 +2707738490 2343738653 +144698497 348212992 +368992598 4117969521 +2702129810 1867289901 +2720460708 352071170 +1493583695 1944207697 +2357384030 1115769474 2518646573 +2883100350 1140974879 +2746296272 2145496163 +3627478903 3581605958 +3167045520 776126569 3129976756 +3070736750 2170022315 +3223737766 658920361 +3095767346 2892585381 +698743033 3931488623 2658361035 413912264 413912265 2303127550 +1903992843 2989486420 +2296211990 1574696646 4002750889 2437253492 3297445623 +332991040 2393586659 332991056 +463482301 975700116 +3458508928 1532372059 +1136517446 1908984199 2786410390 +2740261941 2331018189 1408159594 +277177222 2853906518 137344465 2281417697 2118996194 1579499002 +4020196349 1733950709 +3174669576 2156347427 +968949676 2530376663 +1742651918 1609845657 +1033491487 2642975426 327984670 4150085269 2282720980 1782760996 2895134714 3583748364 1652745233 +1952249529 3881329960 +3177306901 906748444 +512196071 512196087 +346340437 3562305994 +1120475444 1226880149 +2103862648 3761355771 +341848311 174920912 +1406596792 3621345039 +3816872590 2099071467 2250070041 2983726489 1930687890 +4167298698 2672860285 +2719503622 2719503638 +2343047129 470949545 +3890591895 1834918915 2778830256 +1736428920 1714451451 +3236089419 4027236354 +479288900 1020749065 +1430939199 2226728320 2445012476 2445012459 2199844136 3234702337 +752015714 3342683716 1016907226 +906099017 4119335715 +1157105112 1785803547 +1595352630 3882952455 +3004394945 2828388032 +419046595 348643068 617084986 419046611 +2241760415 189360988 2055864865 +1637318670 2944308751 +3671905358 3617732303 3617732313 +822533802 1480741637 +1284600621 1206232965 +3927535660 2987103553 +3157637944 2157295931 +451165209 792906703 +3614455645 253951810 3694497451 3224643656 3895828885 2191992692 +1969450716 190139271 +1695360763 246701348 +114514790 616096129 +899457677 4069778404 +725238353 1572234640 +2922420400 3867172099 +4173071856 2147309763 +619298706 2918748883 +1713668991 1249575166 +1405156519 3904463081 +3051478679 3918620592 +3936922760 4018641437 +2732991056 2791193277 660619688 +3698416281 3464645200 +2620854191 2620854207 +3450697947 2188704475 958850770 +4060286772 4060286756 +231970550 3122046286 +3092611607 1167837734 +1470565958 1470565974 +3382686139 3139577989 +3398768908 4105596385 +2300271958 739503719 +594633779 4269849690 +3599296945 1508390998 +630818408 399882389 +2656741041 4189350064 +4056114877 3436633964 +1399518131 160766481 +3608306950 2549418103 +1016733012 470737710 +2295253241 1451646952 +3274973 2681363650 +2295080444 449687011 +4252163205 591252650 +1748778477 64322564 +3478454343 2935233561 +1825934588 1050858156 +3482652708 725317540 +2292527802 2080508604 1160437021 969086923 3377573035 795612521 1999552564 478062669 1455885218 1058713148 3012158367 1216221228 3833969855 624171817 6237921 2418092453 3790338976 2660463944 4092365270 2955799945 1444553818 3205082843 3662218047 3200013286 2871567029 3452206220 3706359399 128428119 2825345239 2665606161 4076292691 4106661114 3785661679 3712624871 3957295424 3129877949 3182866203 3716368862 29139200 776888727 531561594 2438038270 1569416965 1470488005 4141195162 1443679376 2259990101 2786836933 3853639592 464107131 3621673615 684377201 1456671684 2395554153 1840997636 169873917 3772363708 2336226241 +216048342 216048326 +638177795 3832912572 +2689324539 1382144562 +2148908914 1309398299 1309398298 339501171 +2593037233 4286519216 +2006147607 1409509926 +1014549785 1261100638 +3490537464 2529442944 +3237216838 102732833 +1522654004 321655503 4267810153 +4030528370 2717897843 +2988981127 4233475478 +1053342058 1073471949 +999161262 1854298361 +1869878917 4173296460 +448344426 1802732415 +1558536281 1672540990 +3017572002 3323681027 +2401644515 509100931 2917518252 1305474858 2157633754 795171673 2275077097 2040217567 1305474877 4198617220 +2766678189 70764205 1355661892 4107779800 99881381 +3892638508 1808453207 +1897863999 1391977534 +164210674 1453535629 +3454978756 3821071622 +372966830 2901012719 +2303318451 2303318435 +1988671206 2134371351 +1138359645 757717346 +32769457 3290756518 +1344466262 3313445510 +2014405016 3755179813 +1064829913 3270381214 +1738133612 2101478004 +293451330 1257189451 +2842395033 1295844318 +2526630327 2655105571 3395003152 +1570483770 2280517622 +2386487419 1754135870 +1886365183 4274147432 1944359851 +2545309200 3825826595 +646331927 3042692021 2815714690 2815714691 3159604784 +1702330033 1545361248 1702330017 +1993376272 440188725 +3140047238 671831521 +4168136780 1701978017 +1732662475 3214703657 1242996510 +3460339534 4256051161 523580587 +75037964 4131867467 +651423653 3298967724 +1881669015 636761264 +3102617362 2868092478 +2661638212 39226143 +3951199593 3951199609 +1557074785 2063303072 +3633013933 2423225426 +784258769 3645358269 +2926379840 3583778259 +1949654256 1997375051 +1487596005 2047751027 +2084906587 1239888741 3193576968 4225458514 +3279305793 4095793750 +3549413724 3549413708 +434717461 3744766474 +4082566163 4082566147 +411519834 2031798069 1142796790 4143685309 +1783993675 2983589948 +2978787772 1014745831 +3360313604 1307711812 3357482489 +3503178861 565557138 +1555261549 2134097618 +1161320175 3870349870 +1066424757 1066424741 +2034157825 3738594432 +19734340 503855135 +89080473 4106606280 +529884861 2477518129 +3402775757 368424612 +3945266578 439532214 +485338653 3209327497 +1149443021 899682597 2808398770 +1795931892 2577489309 +3409050916 61964223 +2627927131 4019405650 +3096823791 462741292 +2268864703 2728889534 +2819934923 1673215362 +522692951 3852853972 +292245004 2011946231 2011946209 +1290958426 2075152317 +142580020 2497588431 +2305107185 2215483511 +704266404 3102982697 +2545940851 1446359045 +666850873 2718141470 +2458620140 2645894017 +1224731257 1675500648 +3336070254 1482746478 +3210002097 3815256240 +1207437957 3497561932 +1996587898 3512858909 +3305690708 1256454936 678161321 +1844331646 3847891849 +1773215268 2245161641 +2684399245 1846724580 +543142839 1867768867 1592533996 4246343235 1059978729 1076756367 2540260878 1934879344 3613189871 2913462544 1867768884 +380822895 715075000 +1366651258 3051463453 +3476087992 3791130043 +1184821898 3057110829 +4102374541 2060118500 +3429400950 2789553241 +2935504302 409444080 +4093936870 152909313 1878795814 152909335 +4075162674 1460520695 +1114203848 1408027851 +880707943 758081892 +703105752 3507655195 +2822020783 3415621733 +4257710549 3364010611 +4282726134 3224379090 +2105634784 1311222444 1311222459 +2218905899 1810007815 3187914438 1587300002 +862471612 2837825255 +2110407853 2993298500 +543289007 2838150510 +3711048072 3185455389 3185455371 +2840676283 384617774 +2132377862 2132377878 +3018077630 3997211145 +3681848763 863706468 +2936392728 2652916187 +403616010 3111738469 +911410392 1555079181 +1394403135 9230058 9230076 +1704745760 1666341380 +3342591453 2290302545 +592762997 328253500 +62007969 2863020742 +3758623777 3450542070 +3797573430 2319704593 +428580240 3335063989 +1433320970 4060269303 +59223803 2308470066 +3207814934 4119760627 4217600038 1346875067 3410994418 1363652673 4002317302 6334693 6334706 +3901367317 645319964 +2932827137 1784338403 +1081752305 4045081494 +4284061522 1275672090 +625684773 4237083229 3663617338 +611792446 1782240094 611792430 2779407263 +3567905313 3900412406 +337343940 1441444025 +4139152039 137788640 +2579546568 1721132076 481559775 +3414143465 3414143481 +3084274087 1600305977 3729507236 223736288 3729507251 +2032036853 2682516138 +1046266883 1328847207 +737500870 4181995959 +825177901 3288533892 +593274748 401227346 3115522111 385414085 402191707 3115522088 3635106468 +200787543 288569197 772618982 1926483472 +447697108 2501192255 +1317204232 2686545803 2980230179 201583664 +822788785 2841644983 +1495016110 1539001359 +2717199970 1459094613 +3381760239 1059530798 +1218541342 1786414018 3868099783 +433293695 654406398 654406377 2318019330 +3734858771 3765906842 20473472 3734858755 3342894653 +3563443948 1213289879 +4043160090 46804554 267760611 267760629 +1835476358 3210744289 3225818007 3210744310 +826839052 3621316700 +3633856167 2736163036 +2885202650 3199566966 +3412821233 725763942 +2355335938 46165027 +3614835811 1531248464 1199589981 2445862858 +3805226422 3256376721 +239464005 2415841091 1137022058 3172341388 +2353739808 991832198 2524564214 +2262386045 974766741 +4079047210 3883161613 +2346715384 3100051489 +3349178882 1132912949 3349178898 +1737924637 790498722 +2733563991 3574278374 +657503326 262926313 +3442446130 1512278733 +4153221658 3442257643 3898039266 544988214 3898039285 +2490349012 59763133 2964159518 3460084813 2145074351 4129327369 +908242828 3298449761 +1112995500 3683833766 +3242665395 4127217868 +3950833156 3950833172 +2822656336 2822656320 +1950036418 2829993208 +2855167740 3809222321 +3704734500 3476746941 1750086491 2034283132 +3265933768 971791819 +3583658446 1416524022 1940481199 2165566344 3672454836 1104482088 2479199563 1276146461 1265525461 +2714843054 1323256684 +88515927 2771797990 +3659582377 3251899404 178297624 +3879814113 3971865376 +121579841 2842554688 +2379377708 2681396346 +1676923862 785807847 +4216454815 1091818568 +3185947068 2895563505 +3708794559 911368632 +1442161728 528934412 +757005797 998194460 +1472167032 2591092987 +2047460535 3018062057 +1836136409 574286472 +303463302 593834070 35818951 +3420791960 2996599347 +4081568953 309667486 +2969664812 1083075036 +780160099 2532851658 +1729216403 1337155544 196714420 +2973645032 1081339668 3975386429 3975386411 +998122041 3767525310 +394384549 3889754912 +3292222830 3337125358 1466399791 +999563291 3845032576 +31830223 3318689223 2285859596 2453635791 2285859611 3940741061 1156333506 753670648 2259313237 736893026 +3445692877 484154788 +1766167581 3582470580 +4105259339 2436551288 4208040651 4254524810 899000227 +4203036897 743758598 +3537936579 3125073846 +4162324233 2504468092 +3224714005 3207016305 +2669426142 1219908989 +463444185 1430101406 +314548872 2115928500 195877917 +3560665795 3560665811 +3763208265 1674212071 +786166670 1281242331 +3355778117 621510796 +2832721154 917757194 2832721170 +4024222574 1988795374 109553199 +2949833832 1593305457 +3347579732 1864187183 +811370003 1878268977 3472756886 +614818978 614818994 +3780926006 4200727313 +2046580949 3711948618 +772375029 1844942012 +3380550535 1708644313 1951307908 1951307923 3122156928 +3455978200 518722075 +3456694840 2418140731 +2817734086 795210307 +293085219 267200564 3621508630 3738951952 2736428810 772123549 +1687518913 408324566 +1200712518 3880805265 4025212705 +1782705505 4186087751 +2932690196 2932690180 +3613458420 28503311 +3696466260 731537199 +484355708 484355692 +1309790843 1628329906 +1786740057 4289876744 +2872956907 2103109346 +3111610450 4082424058 1224292627 +971354173 2976159819 1637117954 2236403202 +1008905185 3974346682 +72472990 1792644009 +2316484174 1603333452 +2624501780 1380647807 +2839856945 2823131686 +600084129 4016867190 +2471076231 500725242 +3179484872 492625117 +1845480564 2645482137 +1399589462 2084277076 +1526522284 3334870324 +2627133836 226824055 +4112455373 3744367807 4046980132 +4125213495 1231441798 +2731463658 899127629 +367606989 3407312507 104700466 104700453 +3317636657 2094827312 +3728468266 38800667 +1114585971 135960076 +2337914013 967185753 +3885757882 1417925579 +95110942 4200628009 +2224607904 2224607920 +1147045533 1831207060 +3886995985 3376498896 +1273978355 1273978339 +1855552034 1033585557 +444804399 2998134395 +514095576 3277877536 +1827587228 400523665 +3110231289 2310472147 +2253867073 3160850006 +375468827 1868836739 +1967329120 3666030238 1036605794 2507554104 1942662187 3099332180 +3056555740 2827336785 +2238442569 1373959928 +3129410576 1181766268 2995479861 +89251073 2507846951 +2285902392 3035186733 +3202274359 85643330 84431630 +2285118090 4094844717 3916104672 2011951137 +3050093581 2285338171 +2978153453 1581198852 1581198866 +980763269 2341975884 2341975898 433431229 +2660134389 2402752700 +1780597151 3979966992 2988690760 391344369 3741952977 +2367012954 3941007889 +1693660103 2983887446 +690302837 1355297050 +3450122331 2461109078 3175934722 +3852150885 3628111610 +2022173879 1557789799 2975230685 1758572777 3599549808 940050925 798674755 843388824 1962517510 4090117374 4215292879 3159196874 889013556 +2834457513 1048159663 183644459 1997032708 +2224844025 3141503998 +1195200943 2104083202 158457580 +597830882 3248368723 +2679298474 277653133 +418372432 730146477 798745156 +1593516325 2857708844 +4131550716 4269045681 4269045671 +2966385057 763255249 +595194299 4060514450 +3379242666 3182288283 +1447062257 3093846384 +3838668574 1298525247 +3973556314 830342571 +2182662166 3808623281 +375512316 4170596202 160848441 647008835 +3230255409 1239922736 +4105815188 3564139759 4089881716 +4104143827 3947545900 +1422644729 2424664520 2129014446 2515828847 +1360259773 1599768468 +3076965664 2119703487 +2985174031 4110018651 +1792255920 588885771 +3867970719 2386648648 1245970977 954690396 +1247433899 3073591586 +3879647092 2075839375 +213726832 2003614684 2003614667 2111615573 +299446994 3924621182 1660020589 3941269637 +1498107650 1787713290 2475515939 +2237011448 3082238611 +1149435811 2100850076 +2891005846 833938183 +426260605 426260589 +2079035538 2782172613 +567774051 567774067 +2798436818 1716854149 +3866797514 2635267323 +426641345 3375772886 +1676968043 3303417954 +4286008214 2183103585 3201039665 3802622634 +2498841313 325645585 325645574 440632775 +522246940 481881351 +1677785246 193421481 +26102163 100520570 +672217510 672217526 +885034323 1579055546 +2003930730 2003930746 +2181878787 3174154428 +2248790042 460495083 +1183016617 2849676312 +3881636082 3881636066 1243824794 +3182538281 4029808024 +3978030081 2414758705 +2896790805 3822878748 +2339254813 911512716 +1878907167 1805437896 +2038870192 4278723843 +319916172 2426008680 +906111298 906111314 +1123378009 950070087 3053852135 1672488930 +62118869 2285018673 +1514929002 2409416653 +2246781458 3811785285 +583878439 4029088352 +2224844017 3007283046 3007283056 +2674872289 3711614752 +497953171 3149319489 +113349790 2826258601 +1182594529 3619098912 +78244391 2090178596 2090178611 2122029920 +1561185087 3149329448 +4028357257 3483627758 +1170120633 2215997480 +877690930 2360987301 +1007249535 3248904747 30375912 +1371962757 1081579596 +343433163 2879132491 1907515138 +3580004438 3426544841 +2066081711 2343286894 +2197760516 1001333833 +3836881856 3836881872 +474955404 2724682423 +2273434633 2284949113 +2067125564 819772780 3224045799 1958679408 3224045809 3224045808 834579825 +513827039 3568302475 360218376 +1409835747 4201998490 3847663347 +1681204883 2421482752 +2822378568 460189021 +1484712652 3800793312 +1824871863 3004594974 +3194674156 2922919063 +2070641629 582492203 +2076694284 3885467639 +492808345 2898728297 3600181470 +4013015217 1012029104 +1070228305 3164231824 +1623659401 285757944 +4108706611 2853697210 4108706595 +1782162838 3200225761 2595907605 1782162822 2663018102 +614750768 2808893033 3736729993 +202987341 563706034 +958704551 1624313230 958704567 +81520447 3991131900 3844933694 +1445765045 1564436970 +1885120540 4259095559 +2513428728 3460245101 +2778834000 225815011 +774350193 1004715511 +2178566153 720228214 1939826215 +2864207999 1707526698 +2371521882 3750528171 +2795899464 1150324596 2674011997 +4123872716 3190913057 +1404076159 1037715432 +1574588097 594774723 +4278493763 3075174250 +356546256 1148914044 +1099316991 756241578 +115262957 162007720 +4102409384 2527145085 +1759084911 2103886254 +583659310 3094749875 +3692994650 3728108989 +383637809 367096790 +3505317316 2886972319 +4165748443 1252880041 +2251562832 99418044 2483899125 +98688118 195367786 3096317393 1233629345 +2040696231 997959588 +2035162375 4244091392 +1722885258 1413639284 +1106897912 3564009339 +627008837 627008853 439118732 +3141902307 4156712300 +3734304283 2139057284 +3657522031 2669866936 +2145222946 212346411 397677986 +122598578 1405676635 +2746830980 2909333871 +3328231726 2722676338 +1793939268 2543869983 +2617850628 1894848504 1894848495 2793924447 2793924425 +4008489058 4274942126 +3086410302 104757535 +4168136770 1782440484 1534201827 2452680513 1217357 4279407031 2164838627 2452680534 1395306150 +4211092186 358635298 +2791773649 3309787142 +1202885836 2854239521 +1098373604 4088136169 +3773647114 529136301 3162565514 1479910959 +973277861 3365663105 3432773578 +2681360725 3977644252 +3958470930 2132907845 +1679853277 2083802612 +2110373514 2392257339 +3328167700 3888330740 1557331055 2569237119 +3259011640 61222459 +1278403115 521800116 +2401948816 4019159918 738054319 +3246330210 4245183829 +3199465367 3427713712 +1077231591 4208171168 +2673403181 3353216536 2519998283 2673403197 +3439239189 3386245386 +1655954093 3737650281 +4180159869 1056115211 +1043328182 3710385524 +2078095819 3359767170 +2896760641 706625649 253952854 +2978903816 2336579979 +989610967 2283238147 +2981972060 687401159 +2981010822 1002209233 +3337598668 4150051617 +3285546536 3387531052 +478671013 3485090512 +3450697551 2771752773 +239937503 123967644 +2609984268 4052966369 +2939820498 3527342988 309393468 2605311191 955507851 2859902341 3323566017 4022774969 784459560 +2211668886 465945905 2657776298 3746913377 +166642074 929351541 +77754512 3545572660 +3242428412 3900234151 +2810317382 3745006230 4155911201 +2295477574 4205205762 +2365502431 3556059166 +2140170732 4253934849 +4134870248 3797713195 +3436437761 1921725568 +475457075 3486278234 +3845575379 513477463 2823676460 +3120527818 2536290541 +3505172275 395824460 +3803031897 811702046 +1559053289 4250678808 +917273475 4253056890 +1447658986 2824309286 +2925118930 1230137747 +3259052553 557021435 2074596472 +647074742 1831569297 +2031749273 3532918723 +956797745 1872936385 4159485478 +1583084363 3586129666 +806442260 1651996782 +621656861 1906151092 +3210809737 3469646510 +3053959506 4078965229 +1977868921 2992083550 +279497899 3837407549 +2342242723 3930478855 2564546102 1229153927 1162043460 1359663385 2581323724 1695592657 +411791644 2354100167 +2272766859 3429043138 +3970784226 1994892483 +4044087383 3434227942 +2626217739 3600646063 +3887401247 3774700488 +193033568 2362171203 193033584 +960375743 3235308650 +3650458670 1001189356 +4241013380 1631544184 +3710800802 3522013205 +2328838029 1260660754 +587402719 587402703 +372965799 2783156726 +3164307176 3502819133 +3041283584 3835471231 +3359134438 380272662 +263629649 263629633 +3139505439 3020400606 +4200806916 775181407 +3135193770 3614830989 +633929571 3731491018 +4030552880 1620479125 +2348779455 574796222 +3159853660 3654209223 +1096935903 1666919068 +4291010369 144920688 +1020294589 1898403663 1041650868 +1791872726 4160527089 +3073254279 1793646739 2595696601 3835817344 1793646724 +2629144638 1823424546 649182559 +3413914592 881174949 +252685753 1856928318 +1785344790 2603510695 +2500941544 2454441771 +2807886726 3241788870 223573297 2807886742 +2883786415 1165800814 +2737658030 339235641 +3186063511 2321733030 +3596782062 3073893642 1447096195 3596434208 4129632985 3929391610 3064145384 3927403883 787103093 773351948 799419717 4245603756 2450657017 3961732869 3521558775 708525246 3083607307 3381859344 4045263493 197411833 791932863 2829435801 +3129940543 2082867269 +2989227464 1128301021 1128301003 +1315329904 3676022101 2245341704 3676022083 +2371695038 23722697 +2128517588 1028146659 3122579332 2044284446 +817525110 1115082049 +284374749 284374733 +1403516748 2404819319 +3834822013 3937486248 +3672034623 3418167870 +430704146 2077068869 +4097875547 4097875531 +698704499 39451418 +1030591941 2021836044 +1817540900 2928522175 +1438480170 591566605 +2942478471 2672774294 +1812971618 3723007850 +4157424299 3542092914 4157424315 +1584692987 1584692971 +4061771067 1501055986 +3389547715 3459686122 +2677236688 1571100715 +1677265989 2785955980 +2792510906 1053929584 +4141923283 475367779 +2075719799 1858702676 2345842605 4012619786 1741907453 1758036935 3157946966 4029397392 1858702659 +266553434 1526189904 +1261782849 2782866240 +2283900398 1357681670 2943324455 1723937112 1259935080 3339837805 2709355725 516357983 3611235301 1700001773 1343040558 +3238476934 3379503665 +2671083761 3355527710 +2267285206 2478228209 +4043652982 385890267 2248683346 2248683333 4193222930 2819498539 2349349082 3012701439 32476604 1599161589 +995058890 670804461 +1867160009 1064624696 +3273716682 4141860603 2638626098 +54698099 2497877274 +567400130 4283765621 +2903552027 1425743326 2773484649 +4279925774 3185603185 886915668 +3376481414 2044640966 1465523959 3376481430 +1777006198 3091536458 3770636886 3770636865 853670855 +463030705 592380336 +3912349516 1698925751 +2216914384 3552960099 +614694413 614694429 +112849384 1208777619 +3900946749 3151928783 1146919700 +2346960016 3348000437 +89838500 2003104152 301673257 +1192113442 1567226429 +3081103872 439311891 +2572334986 349805640 3024927590 3879136813 +956989749 2918427539 +2315710467 1273746620 +30630835 2462446298 +27392133 3986723225 +3026856330 2367644722 2367644717 +1993702151 1947829913 420523008 +3432331778 283791651 +1542174088 1007600925 +912928381 3584991678 +2364305907 3409404300 +2948295015 453445190 2078755187 2948295031 +1276032114 757469029 +338043522 2383510722 4263122571 +1867733614 2922863417 +3218528035 4109037575 573877276 +1124698767 979216932 386211598 1427108556 236009329 +3694890771 3301063404 +2774022546 4173540411 +3961034658 1287042051 +3701462758 899632129 +1712560325 1977187866 +2661731280 2425542755 +3061459310 2957981743 +269490796 3042547713 +4115001917 1511806466 +2786876477 3957723240 2786876461 +4052328734 1668770089 1504223785 +1453598484 2020181103 +3408071557 1294672474 +349405586 1526003923 +612609612 3343606199 +1082368268 1054133281 +1691438294 2340156647 +3876523415 864491061 1909752066 +227421682 2518296461 +3561361612 4132204833 +4172333901 757908645 3410194994 +4023265655 710504213 3342913091 3342913108 854002442 1263259810 +2685012695 2010249097 1744232532 +764275924 2322321839 +3338424545 540234272 +1362146221 2465471493 2091571538 +2571812556 480926519 +2200608657 3836252470 +2292090214 2005663617 +2160496638 3063196895 +3697684769 366958326 +3855918464 1304463493 +2412965512 4044193821 +1774323943 3985627365 +1172351516 1592653700 4103906504 +2887329454 2576868345 +2782172635 3903317970 4007878117 72472968 +1813289363 3077423738 +1975855911 2355293792 +1581914537 1156648626 560362671 +2648792923 3838385234 +4210204980 2310989803 +3524006836 3300907039 +1498260145 4002274725 +2180480830 3600633481 +4123210152 3502688170 +2882415877 2056314572 +2438121295 340771150 349615713 4003171868 +234436076 3947881111 +1495794205 139605227 +1806727739 4279780606 +15141859 1320662620 1194595015 +1788120951 2227047207 +2510116226 145595317 +3014388854 1302674887 +1740567877 1740567893 +1524468498 1732897604 2554894765 +2784631269 911791189 +1259189276 1116899345 +1880593915 3876925204 +2572048337 2572048321 +1745873689 2512433317 +1487338854 353145510 4108380055 +2979139185 1454099638 4193041383 +277976488 2644423716 3408529168 +3268150724 1089847480 +377180138 1434273349 +1238905277 4233514132 +3763208278 4124256055 4124256054 3329269482 1892321127 4124256033 845593478 608676655 3312491860 +3985329676 4266384631 +3736079692 1607434285 +3641831207 3641831223 +2445158812 3958941959 +3395252714 2118144859 +2097726418 3644813950 2798404499 646865018 +3409832905 3145346414 +1132478228 1457736815 +1203380758 239793 2496047117 2898427638 2167915050 +478382040 3138312461 +2466246875 1139288260 +414024859 1465744210 +171745726 3681721887 +324618498 2031552398 +1200602160 1200602144 +3237156209 4023233025 +449130383 3010059800 +3560700013 723957900 3335971257 +1864515124 3503179349 +98350395 1970359268 796176133 +333817731 1594632039 +3275897476 3846315465 +2741707439 1339463675 +1678471279 3525573562 +1042942504 70122731 +1070957650 3206493173 558257402 1070957634 +3731190171 3031553796 +820554848 276508935 +3074741542 2807794391 +1274934469 1707627034 +3435566282 647772653 +1581494616 2547266464 +136017272 267180909 +3450078208 4025456948 +241652259 1899315187 +3997584086 1766191722 2569713078 4003974887 2569713057 +1606910636 1930605783 +769961856 1439444664 +1209421130 2946024181 +3193654372 230244713 60946520 +2668984648 2668984664 +4270373968 4270373952 +1344174675 2163320749 +3414528551 3414528567 +1984835947 2820131709 +3554202922 484011397 +3055699071 921818110 921818088 1039302849 +130873870 1437443087 +1750391415 3029592400 +3167361606 2015845438 +625938238 4185194143 +3567361486 270134617 2288741209 734451161 3271730312 3954370898 +319539050 1703603149 +624592862 2032394879 +1405801876 2763233484 2085500921 +795249548 732426145 +4172803971 210635562 +3796645922 1610374531 +3703607968 589746661 +2141740927 1963873534 +1392280120 3682663985 +1690416612 2163299817 +728515062 1366021703 1942114753 +687087708 1692671948 +1938085030 3336315753 +3227514571 2719056276 +775520607 596027550 +2066104471 890044081 +895520994 3909358549 +3411350278 110929 +1102240981 1100063562 +3340354521 3340354505 +2867271815 2429262998 +2668176871 1114024630 +3218438277 336054442 +3720116910 2033591185 +873639730 176925389 176925402 244035865 553355166 728353715 +3626411486 1470225385 +131089690 1117787457 3566121126 +1918884179 1608719788 1608719802 +2757878455 2098718224 +1082032465 3626341008 +4216103815 3899352768 +618751549 1272181268 +1662310550 2412835889 +23597442 3100872629 +444727787 1453405845 2779317474 +2826797985 2826798001 +2457240164 1720131160 195735652 4103029609 4103029631 1720131151 +639618569 2155158085 +2086548980 2302829640 3159289625 +1785946297 3506031983 +1555132061 2287018292 +4063884533 996946586 +978932746 3835644845 +2972183369 718758904 +3459236683 1274838676 4237886217 +3442063202 278166958 +1391423688 3062143459 +1305130121 4279907256 +739276519 1156263328 +3426309473 1442721430 +3328853079 1943369172 2957612272 +3781245807 990941112 +1800817091 2920362928 +3653796608 3970679500 3601217797 3601217811 +1792818111 715769654 866078374 3696739246 1476638475 3645180796 2490288484 3021695230 1008597741 865486860 3451337724 975693449 1910761882 +3130109000 3130109016 +3901351715 3243822727 +433890701 4135522546 +3038780480 3049212664 1636595909 +3117292062 509434266 +2241425773 4011933697 +2541983327 3810899848 +3495708822 1251821921 2158266794 2537964593 +3449347676 450277956 3003265781 3228972559 2214240543 1955845003 3003265762 2583816514 61213383 +1828026380 1694234227 +4204817532 1884867884 109758247 +884628141 578738337 +2059534943 3899799324 +733138833 1534902598 +3694479581 2229384180 +1511605862 1003082391 3048637350 +4196563620 1356755087 +2549823114 4028307350 +73683472 4193070901 +129540831 1614633806 +3664637217 3176792390 3770273415 3176792401 4228664054 +1144311675 3459656109 +1990091706 2196866709 +761229808 1173487205 1564499139 2706514763 3579278728 +1764849343 1474162366 827997590 4178114945 +1279896333 620250468 +2667736968 3637875467 +1365551478 1930791754 +71900613 71900629 +3820084821 3321954268 +3653214304 682194725 +1032414689 3494607472 1032414705 +2024821165 2861601618 +3521182502 2334874839 +3665408624 2765330396 +3143398823 2281322885 2576168438 841590440 2571882419 1465856936 2571882404 2576168416 3228933945 +854011801 89361039 +71489976 2744976467 +2860639198 2526693865 2526693886 1215936127 +987327403 1329888820 +3693728853 2114097388 +3224949403 879987218 +3884057514 464241805 +3031047087 3226803153 1465170156 +821059117 929317060 +3477838134 2315399185 +2417585911 3473518288 +3631229705 487673739 +2528959663 1959171841 +134166746 2823865974 +2975801802 1320359126 +880545574 1835424369 +1880820706 524424071 2975966765 +566702839 3555431778 +3197013769 57355054 +2475018494 3409679528 453897653 1136065438 1136065410 +2720775520 468743227 2866486835 +2784782499 1688903056 +61489666 61489682 +3968216568 1329225069 +2288649758 1935508327 3476645692 +4063288204 516081139 2444325874 169801798 3471416673 +2232446533 3185415834 +720190614 695623729 1817795959 +4001100205 1851558404 3911437380 113409775 +2346987573 1832379242 +2114926678 2114926662 +3265481370 3265481354 +3256142988 314441847 +3835181046 1174812609 +3935136320 422873148 2090746579 4062387212 3729728760 2090746565 4062387227 +3380125072 3101690275 +2249890201 2588798590 +600801113 600801097 +2759009670 1732514295 +388835545 2444177342 +3273136755 1607073191 +3202925957 225374284 +2281053385 818951123 +4141802108 484346161 +1787492246 623448161 +1025018760 3047401245 +2115725106 63908121 +4209770803 2043973265 4207202486 2914437965 881189722 4207202464 +1827194108 2287001255 +4289434712 4289434696 +2985174026 3995523553 602061755 955090802 955090789 1826766214 +1404943137 591494982 +1429196587 746308617 2967380926 +2345294522 4240659222 +454915302 2131012418 +2186803163 192622020 +1716252470 1065980423 +1971835945 768801944 +696800936 2760352468 161507965 +3576827118 2345294521 +1181604322 2041056491 1854690786 +3883615121 3702687188 3286489981 +1527402996 456253535 +734688067 1283275047 850621052 +2820814952 716880515 +1307132403 3070222198 +136006688 3807958643 2998501627 +469075646 1379927264 3246595337 +1276668554 1416607547 +447521225 3334647672 +1289668974 3673286530 +876675300 643065599 +566789894 1654932817 +2559323920 883824181 +1049791763 3549385866 1604981785 1685904547 2478052592 +2498105638 2351759041 2107571162 2178231398 2351759063 2178231409 +2978736634 2535590614 +574967934 1897772617 +1055375808 3335913811 +1888574512 1463893001 +2930385919 3471718058 +3240619479 224857655 3906693478 +1113170227 2488899462 2667643781 +467885705 3781235960 +1687543669 3438200124 +2796562998 2639426311 +3740760353 546549472 +2499966078 282944095 +3088951066 366072630 +1784344514 2853361854 +179180408 1208526331 +2090542681 2168282632 +848710808 909312044 2387993125 +3209991841 2178021127 3542687584 3753674438 +1302913247 2163831415 2549716651 +3327266945 3112713562 +437517612 964136001 +2873624783 1902501336 +3165788510 1784540927 +98994688 1240153605 +234789084 3821707857 +1800697399 1466477219 +1928149020 3309393616 124736529 +193803963 997627263 3930925156 +1294025124 257578281 +1814473165 232607140 +322407241 3869830910 +1790225459 1695673765 +907575427 1397827687 3802466237 2878492220 1397827696 2261462676 2878492202 +364681021 1960973588 +2532914975 904282353 3015334364 2532914959 +1215998298 1930991805 +1580541062 3551035127 +1594202769 1662485537 651317830 1662485558 3121540695 +3283077901 448570724 +2790391784 2790391800 +211243687 1463516607 +2712027800 280679771 +1676104175 874904369 +2936266946 3090185376 3442515399 1921977441 +372931593 118571566 +2569526559 2316179361 3047500647 952178654 621198566 536375260 +1616118643 1650451530 +3324523750 41899569 +558827759 1852516734 558827775 +201748763 927750565 +1678769516 4046188823 +871609937 3155574038 1066121731 2309918403 3917112801 28853767 430440838 +1581195351 3026184432 +80482777 1715476616 +2743990913 1605541236 +3462416551 1088316536 +1121582005 4062658026 +3362101953 838057012 +3910937613 1252408165 +3615913915 61766500 +4034751029 59295945 +1659862140 327492135 +4151359157 997170940 +2007681689 923928220 +645210895 2573611150 +4125752304 257399491 +3417471730 2616691443 +1805563237 1805563253 3487010284 +2689689250 35950869 +3890017203 3794356023 3016991436 +4080366771 2418456012 +3787245336 1949133531 +404335868 3966455975 +1796931557 1400756515 +466212122 3636099069 +2380805907 564373888 +424414878 1891304127 +301805381 790747715 +1990348757 994588781 2525211722 +1362256101 3075377274 +3547091623 3547091639 +581672704 809526131 +269237536 2695124600 1462351252 +309564826 2867313525 +2747143170 3325656885 +4092435084 1110644407 +592847115 2878735444 +1904301526 2845851378 4181923557 +2708673425 3106393414 +27028169 3478176007 +1579786635 1109801410 +2089074320 2499280035 +455956028 2137866948 +2155115126 2155115110 +1860956093 3816780169 +1701663092 2324671432 +2009332273 87601453 +615146427 3945847972 +2130302203 317586856 +3873812709 1620408428 2236393501 2169283009 +4014489846 4105268682 2659444929 2763932497 +3318334662 974395665 +2705287177 3755001390 +2554672854 2331333361 +2578792241 2184791597 +1060267568 1293771573 3764637191 +609213086 556531390 455354946 +468272691 590971468 +2357738649 3547817182 +4263723768 1457962368 +3506796027 2798940895 +1250093756 135759345 +1721163248 1518694237 +1014985764 1621349545 +3186505445 3808455276 +90472335 1327525836 +2779580485 2779580501 +2966002259 534896343 2690511020 +1967578162 3498877605 +2096240314 1796851421 1687417218 +2319670827 2319670843 +2993241485 1756095716 +881415274 2714751866 +4037615457 4128513425 +3929127134 2319844713 +2317045708 889101879 +2050728888 720100932 720100947 2909817662 1246040011 602061499 +1137951425 2762884605 +102947420 81641159 +3826991767 1998077443 3826991751 +3817653385 3214500782 +1378522767 1515574234 +3168196615 1563831334 3168196631 +4061903807 1364655979 3769142718 +1413506747 1413506731 +327487507 3447213562 +3599661699 1356378736 +3778128555 3272245967 741321506 741321524 +102372243 3928758807 772591724 +1611447657 2634951768 +4128430485 3046520877 4104947082 +2634528806 1495720919 +1456163344 750415043 +2211097317 1561003642 +3290545103 1042381565 2316789041 2985600538 +2401343714 1359767397 2576352166 3183071855 238440188 2728256282 3980632658 733807624 1449231515 2708431092 2015818400 1225610907 941218906 1442230678 854767499 1420656431 725531988 1642198577 794997420 1065653173 4145971563 +835326536 2452084596 2837104477 +1357584196 1428873582 +2497777758 3159147497 +3457534224 2085323829 +3643091333 1518361690 +1777513752 503955108 3776124109 +654129577 161596696 +3636877961 1525117413 +3389929637 3110284218 +3371664626 1438963341 +2579112687 4010081838 +2374315724 2494081825 +629422407 1445341910 +2565938755 110273386 +96569518 3182045689 +1728534410 3922634482 +3285368726 2297043063 +2133980812 2970933491 +232147016 273926475 +2528697256 1344049353 2124258302 +1464877852 2405016849 +482964278 3203663127 +11203054 4212840889 +1397256707 504068796 +3154083054 3778128569 +3894236294 3294336290 +3015176809 1402116942 +3776730587 983246802 +2105851941 2105851957 3170531884 +2047439158 1390229521 +2046180622 4283358532 +729098 4115029700 +3371197 234518914 +4286451881 2438251007 +1711565016 3631609971 2056812064 1894845467 +3739759529 2424918808 +406246817 3692932707 2760793552 +4083111106 1653847864 +1207483624 2942497939 +3512928074 3512928090 +3088613573 3088613589 +4168547879 1597688868 +3978148646 4257991130 +1924657978 3372253334 +3434536001 1913339111 +2843845685 1876399066 +1907860807 2033808153 4171536467 +3520563945 2020411470 +4266553447 4266553463 3582666852 +503012568 179513371 +1675175473 3410758639 1303167812 +287042282 3639791175 865734595 +90091357 2384614690 +4027500699 2185612306 +1912245083 3252849439 3362349138 3651848805 3252849416 +1870741163 1633732984 2404278217 +774173010 2479622637 +738953992 1579933085 +1982688128 2306882195 +2354148212 2126949280 +2564183899 262801983 +473078063 3575591532 1175609425 +309310512 903391107 +508720461 147761188 +4021352488 2073470699 +498752689 2103437990 +3490539721 1476507205 3484544652 +1255409196 4156929857 +4279072560 2989662357 +2693276950 60274337 3495339634 2697232571 4187465458 3568683037 3914927168 3686518514 3686518501 3787184250 3427951025 3427951015 2714010177 +913780659 939584205 +3892509808 738512611 +1862203217 2891923080 +3903504349 567019746 +1062425956 338652287 +1076087663 1076087679 +2900357880 2520665082 +2456485248 179372379 +850515201 2498527331 +1610420698 1979855285 +3054666667 1243956770 +1062824373 2527283475 1148622157 1148622170 1858168828 +801589754 1789348424 817460381 +805447161 2355218152 +246527705 4207073160 +508620321 1676548487 +2466913613 3320586276 +2359064985 3931295358 4082330568 +2706833248 3861022267 +1099369960 261809213 3453307924 +542566970 1285692345 584235357 1549439948 995207082 3074940310 481931541 481931523 2199381998 +4175159007 2206456545 +4085369464 2603234716 +3656497136 3884953695 126127829 2796344079 2300833284 2031111472 +283389003 3794909698 +172190822 1427903333 +2838960360 1237071165 +3191743680 2350343261 +961253846 1881855158 3732324202 1881855137 133600231 +2154689795 2043700075 806925244 354658621 1927475440 1927475431 +1857156993 1857157009 +4103210797 786516932 508289179 2661964690 +2858403944 2175269607 +3146856188 1100582567 +389817422 3786221273 +3335212278 3892979537 +774291896 1594029229 +713384689 3774529904 +2908355335 43472615 +2433135451 2827769938 +340083796 1024102457 +3770036918 1304291367 +2093954962 161307195 +2769465629 4285988823 1960902104 1771597153 1752076048 3393428932 +1345861990 3196220625 1345862006 +3654517540 2198862399 2139614488 2139614479 670050468 200765865 +1170491336 1816578292 2617049053 +3333896730 3966793451 +966271027 1037099085 4095969207 4095969184 3715805260 +3215735370 102744699 +65414909 2413841500 2388301609 1195553415 1153851401 +3497331052 2487080215 +1389556146 3625452590 336755493 +303459327 4123246061 2264375475 1122070337 1122070358 871115082 2149105888 3093742945 4119095931 1998107335 852495608 +801181754 3566369330 +1848291069 1781626964 +3053725841 428596304 +1344974868 1199973108 +1804979500 2295462977 +275214182 953441687 +3655362600 335401045 +3848513709 2994510772 +2192979287 2920658979 +1817022945 1889584829 +1395047632 3950940911 +2032309052 3983394663 +3799670656 111433363 +4034167804 3924443377 2204878247 +434776676 1067504783 434776692 +2572334984 4067696308 3845581597 4067696291 2511246256 +334050986 35720589 +2846428929 371367552 +364996263 2844567730 +658809430 623612064 966053510 1340352609 +1429308360 711121631 +396552484 1500840895 +3257538858 3527777549 +3659089284 3707383363 +896875185 3633013936 +23390602 3151733805 +1513406369 2718542454 +3208149769 2816394606 +2830118231 3830931440 3830931430 +1899116121 2332790280 +4266223025 4270527920 +3145376446 3759026441 +129310922 3410586016 +3055510215 3677041417 +2416552517 1017491562 +3454496383 2071062969 +986742473 1597478510 +2051082225 1700757606 +3746273273 3595287741 2986881189 3311403998 +2690195156 2449772299 +2333767478 224110707 +3977178935 1703056262 +2879573184 433685147 4064296187 3799154808 +770014662 770014678 +1015213416 1894721983 +3391658702 199995993 +3546410318 287871439 +538759582 727579583 +2324638673 3930504606 3446496461 3913726984 +2053439995 1151979120 1474151943 2673177256 2441322761 361589573 3564383847 2818711090 2673177278 3564383867 +2660014788 1532469897 +436896185 747856798 +798267145 4025074478 +1266624909 3440325874 +347831880 3707162940 +925433025 2525356992 +3001927229 3914273300 +2181878943 1496495710 +3862910141 850552212 +1615127007 2188025645 681763466 +3835257228 467879219 +3587933475 2138032806 +2715619750 1963116631 +3221448775 3064304467 +1006106558 626720777 +1366503908 1533582052 +1765114473 138169176 +1675869159 1019355123 +304278862 3673919951 +2846683215 1048563197 +964826895 3873496389 2529840270 +1580265504 741150419 +3225396594 2271100585 +2790474698 1728646437 +686999995 686999979 +2760985464 1479691212 3575497762 696200211 2751385003 696200196 2365499767 696200197 2887039744 2293878253 +4178705243 3401573265 +2938602700 2938602716 +757989949 1550681620 +1909604197 1497111197 +3858620969 933955214 +3940778885 2215136188 +1916079321 2356811531 1855171938 +2853690381 3284233061 3499059314 +308358359 401068628 +2237586635 3210056596 +3328793865 1625126190 +1839667802 4161698731 +2657088218 722160930 +1132165024 3740024868 +3856595238 67253953 +2275454874 469004157 +149416572 2165711153 +2488162464 391480293 +3449497011 1581013210 +1846408101 3841363116 +2208902847 1395206762 4258777803 1462317256 +528272196 244695599 2058791428 3581148169 +4265925445 4100914568 +2744582194 4010444948 2900919741 +2643243456 3296448857 4279022405 2481614732 3296448837 +3507292638 29941737 +902279756 2003621024 +639252436 2318625797 1406623161 2279613955 3371905624 3926645453 1988889590 1065012082 2342117555 2432705038 1988052592 2636615260 509869673 1135138073 737332417 3127179131 156340521 2258517679 4136434020 626718073 2619491837 3516703796 1206386423 3192599464 2511552789 1753827753 168542102 4000144845 2889202988 577666712 2757234432 165132345 2983918046 4027707043 3723007373 503666974 951358670 2285337587 1647560495 2279506145 1382557719 1873786383 1159692180 1905533494 1431378342 716659043 1192211490 3977573585 3630785757 2115861685 409041403 4278561868 189057982 2047912405 405369081 3916582120 829272318 2919128782 518586105 431896756 395034990 1065003174 2043127710 2994676607 3497589008 4000715569 1103119383 2916437608 1414560881 523033770 3152773451 1770783368 175582215 1447127170 987228075 1341297217 39401294 2046362470 3256156342 1037688051 323993009 2114684978 2701614716 1531499850 3694903826 3628213897 917157261 4109630949 160578903 2527577440 3069011055 376619490 2428496437 2568001619 537772752 2844187679 1933784750 29878993 3659063068 421306549 3893440027 4217386420 397900155 2567688626 768896231 2154619520 3232853641 2319117277 +2340809946 1065485474 2633618501 413368950 1065485493 2111036203 +4137929682 4176783482 366599059 +4186390182 1978113857 +309578188 2554394592 1506756684 309578204 2554394615 +3784376474 2029428323 +3674218153 1781548046 +4249854819 2422922958 660485341 +3546449476 135879945 +2482831208 1598427307 +273266267 4278849874 +2488416100 3782029929 +769980879 3753111599 +3174918197 480971644 +88582946 2973196330 +1072225850 684994478 +3446856533 1414297158 1347186669 +789103586 2293630698 3987384110 2293630717 +1382812659 2028517728 +4192628043 3093351349 +894104001 2784662230 +2845825839 900074222 +912089033 1576913272 +2500763805 1124521762 +3076284829 1201853333 1131260450 +1866006448 3902456015 +4256805173 2689726076 2689726059 1645269224 +183022492 4158853563 4118079858 +3157988891 1739277989 2382033864 +3064833594 1908549762 +3427862259 2525884556 +1832382401 2953735382 +3475408995 429073232 +1737778211 3834842956 3818065334 2045604945 1104026512 +2985827009 3935444416 +8958347 2337939821 +578426716 578426700 +2740200490 1198845453 +2899303117 3627380900 +3323507766 249803025 +3748938189 2432931250 4205094706 4205094693 2303782267 +1832657564 1832657548 +2778946940 3318463444 +3739051625 1065891655 +1051958827 4066533976 +3133553348 289130093 +2323535176 1289764957 +3685494596 336488457 +2358381033 3916503282 +2206372926 2360369502 +1647778092 3367805015 +355795649 594761174 +2511289714 350075507 +3883513069 1512837592 +502499986 3093504979 +586892332 1032606039 +3287373197 2214404633 +2908679488 575243768 +2139819370 944282527 +1258956135 2281234720 +2106327835 1058939532 3194545028 +242188283 3028711460 +3385072625 2427976816 +553986482 2904597299 +3149342915 2383588007 1414874170 1146432252 3149342931 +3674136438 892978887 +3105705667 1507007974 +3260140615 1101866966 +819846956 4121589436 +2877230857 2877230873 +3232781105 4284054977 +418123597 1068953778 +3321954243 1989320700 +3908197113 3048470658 +522816004 2012712735 1020755705 3225215464 204655684 308560991 1020755695 +1422408099 439532444 +2207839584 2311734835 +2104425650 666356773 +2261794680 3807016002 +3019026170 4262896715 +1504306023 3369816947 +3125831933 1234519636 +1276659364 1849111615 +1378281828 3774306044 +1828419849 1828419865 +2230316141 3648148546 2940636891 2036199420 763851262 3735776126 2325187336 +3475594552 1459655403 1073770167 2577973004 3184784339 1680978144 3985321536 1444790075 +618627692 2010796055 +3195852508 4065391495 +3854035506 3531975845 +274601994 3458193325 +2567517781 1048610762 1048610780 +256129402 1381216834 2187754251 +1351929209 1396667752 +850077643 2389681282 +3376548498 3276006714 1693885395 +3735281828 536519209 +3091452269 555266651 +693260423 2829798060 2476000384 +1720829009 4090522007 +610253283 3711722419 2996793542 2996793543 2996793552 4143876001 2273156854 632397916 1256257245 +1949200873 3726469864 1949200889 +2887814904 4014018683 +4052229183 2017752872 +1038525792 3524679219 +3921145969 1569686000 787053846 1973008119 +1858092795 1403200818 1173310021 +2440507980 1252273591 +1522233750 1796460327 +1928124361 3017257336 +1744130302 2771288031 +2830118220 3646377633 +1547927166 1181532562 2578260567 +2323185805 2306596347 +1818203980 3866832033 +3192694174 816363433 +3343134271 3202017183 +3211359325 2952932980 +204394976 2616165845 +1481443300 1017726403 2783339144 3525500889 +1953185815 1540744240 +1701760265 3189071384 +1245146937 239343294 +2709543581 1728967829 3658392866 +1479428185 702276616 +3372179870 1609938754 134654889 1635802537 +3648076811 3648076827 +3897446197 617203322 289912538 2212169107 3896946812 +1118114869 46171098 +2613466520 3046416561 +320776588 2772756343 +301235159 3170449730 3193250549 2768926766 3170449731 2591227721 450818928 2608005359 3170449748 +4145421578 2499586149 +1976945721 4119748732 +2184984120 1019828781 +1323266504 195294252 +2720046345 1113011512 +960107204 3664480927 +1064904602 1064904586 +921131100 448205072 3392149713 +433736049 597794022 +2701925277 1398414741 2701925261 +2359064964 3730000607 +1947013814 1947013798 +3195417141 152111484 +150475893 2181271379 +1435022217 791847096 +963260993 2737642591 +2127804135 2127804151 +3539456214 4062036209 +651475114 3403592589 +1584275716 2875062623 +3304026478 1532392238 505412079 2671298866 +3378280243 3669261867 +425276335 1150652652 1150652666 1030300625 2523683960 1150652667 4050860445 +2626315260 1775986097 +3411805859 3302912668 +2409659124 228691481 +1575430332 2397380593 +4095237075 3211145516 358124837 +1270555337 3936549127 +875576365 4273235867 +825079929 3824772734 +944576632 425559277 +3936374393 3277549400 3936374377 +24291279 377367246 +3060475960 2291021509 +3958685154 3801802030 +3646541089 1230891766 +2931809000 268809339 2931809016 +4158456302 787096265 4158456318 +3031047090 3529258583 432642341 3411815245 691392798 +2723029484 386817281 +977208179 607284748 +194502826 548416321 +1581079620 2660777737 +2908340395 2404011316 +1097040153 4169654761 +469880126 469880110 +3420808838 2852057286 +1516887034 3153868962 +3936738503 1423062425 +514270131 4095554266 +2075637002 3677911777 3425828539 3425828525 3243423878 766771301 +3959582570 4057293787 +4114559860 1336201591 +1659430059 1604319522 +1539587490 401409539 +1348285308 4273474599 +3352578778 1831982379 +223936448 3273300805 +417967274 4057655517 3789213595 417967290 +2288583535 743466936 +293548193 741969270 +799377218 1133767907 +1908993669 168600067 2756672332 +2325348086 3214332021 +340860951 313885734 +182947344 981771043 +1464606160 1020456547 +72149644 1360345697 90891936 +2173651005 831436802 +4236222896 3418831133 +2045036760 3139972109 +906964687 3907432408 +1494150401 863967382 +3813536582 431355703 +2871329987 776371946 1061717629 3573147312 +26694336 1362582883 1094140997 26694352 +368409944 3916714395 +1420563287 2715972070 +1028524176 299334307 +3543546737 3044293066 +3499307200 397786707 +152387878 2785151962 1920306881 +293761141 4059330715 +355999262 2237098281 +3173423698 3173423682 +3530357410 3817770243 +2067683855 681314303 +3226680821 2010934566 1086142419 +1029221514 1952767177 +519647119 150773708 +2580316747 1743854594 +2418278526 1722598985 +1889347352 1600424653 1600424667 +190588128 3255700645 +1511467170 1461770685 +3394055071 2897125980 +3261588393 527232792 2424070875 +1723176425 2564488664 1857915737 3291759722 1857915726 3628370879 +3602305044 1827898100 3310148479 3310148456 365531001 +551093808 3852778883 +271979946 790895245 +1773524688 960571765 +442286454 4216053101 4127493319 +637145405 637145389 +980763276 635895456 2459419255 2459419233 +3571838854 2927698374 2885160929 2885160951 +223788047 243927960 2068856923 +3524281072 2677628885 +3810264739 3287182215 673084060 +3434445200 3517865379 +567216060 4108922097 +4219769744 3822267900 4219769728 +2534366269 2816343115 +3488341030 1984663489 +3225482870 1174755926 474217415 +578274989 1848174354 +1822527924 3059244623 +2338905862 2888424581 +1977821125 4240933379 3729420998 +2810578767 1494392204 +2674653429 3958958524 +2384403762 3975869875 +3909261329 3759497936 +709253295 2205924859 1002281848 +4176967772 4799952 1234335943 +1772488528 2690482915 +294019899 4247274830 +4289982730 4289982746 +2576879830 1762719411 2690810097 +2722618285 942666866 3293539822 780370962 287744539 605999428 1023988319 780370948 2054666152 2688412217 +650187464 650187480 +2442041960 2340229547 +3614452084 2576433551 +1431392643 3610829159 3523432764 +2992447007 1506416842 +2186639420 1754023527 97706983 3625614956 97706992 1754023537 +3896946790 3896946806 +100757650 3026239865 +1437424771 1659413034 +1530635658 2624496869 +907730992 1548675971 +1020882477 4148719826 +2924701874 814272338 3240672645 2055127117 2055127130 1533977042 3701891102 +2743538587 144956690 +979786423 2787167760 +552641913 1406434686 +3680972358 3941292101 +1504602952 1972560459 +1458948640 82653285 +1807105837 2853194273 +308814325 3242722665 +3045997849 3890884190 +862601327 649946487 +2292391248 2520608702 +107460604 289841585 +1104553327 320662958 +2968598134 600173244 +3371017052 3371017036 +4242426439 1492053462 +4131327637 977532042 +2586171282 999447251 +3745626598 3745626614 +431055712 517835323 +1509984699 223456910 +3717883366 230563415 +4155403856 1395819944 +2321701921 4191619062 +3217403192 2349908947 +1965170395 3305502841 +3310935001 2212632200 +622691516 695727079 1425312127 2120213604 +1082138457 954278945 +1724411619 1070837191 1070837200 2961608540 2886062554 649816243 +1840732821 1966922634 +2730473106 868708653 +1418603368 2211337387 +3678491812 1856719365 +3329635636 410747732 +1193947937 2074429668 +3111774907 3052176498 +1864409178 1640887246 +3738138233 1968939851 662652488 +744939705 2666775336 +2274592442 658314955 +3430354512 3430354496 +2395167944 2240483019 +2280167499 2031379637 +1933238590 1106895722 1180762061 2847067137 +3343748049 2417170950 +3347206709 1193765244 +328014793 3041158239 2255021069 1420833838 2418195822 1420833849 +223123099 644196447 2324764164 +237867716 364776073 +98688111 2978874030 2863799752 2867266059 +642449131 856640500 +2336896125 3268452564 +2464661620 3067344537 +2053254013 629831115 +1102103458 189003779 +3071983261 3692695842 +2330891300 582735865 +816418354 3437942949 +833994614 2803649921 146131798 833994598 +3195899678 1734670076 +2866127471 1833881086 2866127487 +3236838310 3396311782 1560798785 +3885444843 1117070581 +541958221 3889523122 +2004743548 2538172967 +4220711412 1400604331 +1577603440 2079339523 3791898032 +1209513008 2907744131 +1188761048 1658243853 +1711018708 1607574447 +2151396951 889195248 +2599781645 2599781661 +3553680073 27941215 +3054941301 1675390803 +105336069 3879616204 +2569103258 2845185899 +3053488591 1373171928 1147649841 156531030 2961384460 1164427463 +2106168256 410191551 +3767428231 120078486 +2897229375 409298238 +4239330438 2240069882 +1966985957 943369145 +4227012032 1605057875 +2865510523 1518135730 +1296489414 1821112481 +3114602824 2262447179 +1853748321 1363653814 +297524254 146506537 +656667438 3415724409 +183902175 544484382 +430844350 724284959 +846100747 2494910833 +2003510567 435473203 615218272 +2871330013 1212590068 4007543595 2839169218 +3806693441 469475559 +3955934620 3426030727 +3552460534 2314540759 +3903128612 3444043056 1472005223 1269540844 +1652516391 2923263027 898486112 +551102024 4141812579 4258743115 1241597424 +4213882138 2118627307 +2176385532 842932145 +3548781820 1254749873 688718508 +1102194959 1690434456 +3420866583 310606896 +1162361603 1141386045 +138288667 4085857897 1024015326 +3448399220 81638799 +318626455 368181641 2090802086 +3484760730 2487959659 +1401645130 1953822565 3463785586 +568890564 686114985 +479311270 2673931351 1017160934 +306722545 548366208 +2051474709 3408125168 +507125229 2189237266 2096312389 +4141456719 3885146958 +4058103013 2874956908 +1283811572 1034189111 +4057878933 1442475402 +3634193083 3133303908 +2536706057 241319480 +2014794263 599144998 +3666650279 2993107702 +1629251034 2179179939 +578241705 2415240485 +16036522 2614509750 +6534261 301274154 +1045459861 2913334172 +4004170558 342157837 4108186271 2735015625 409268318 +746013383 3334348608 +2048297872 2977798803 +3636168678 2088395057 +375689896 729033696 +833799108 2219969832 +1658862451 436049434 +1990547945 3686361852 +2020207637 3474837178 +2175800629 515763404 +3711018061 2183505202 +1623197952 2967382069 +3009447637 629031913 +850255083 865166105 3617283989 1131257614 +4117651185 3395669910 +910569102 4269492623 4269492633 +2242123255 2242123239 +4189694701 3847442059 1735787858 1735787845 4189694717 +202409449 202409465 +1014992058 4140468427 +4006214159 4143228312 +2608716448 3327939309 +688029499 3387836914 +2519430251 3513271394 +3604139734 3604139718 +2002109459 4009994732 +4206472315 3694440460 4031799615 759858596 278060741 4031799592 759858610 +1750734827 1750734843 +1504508246 2169274983 +737624503 1251741517 +2856399619 1058038605 3256049392 +1023862964 3319812943 +912667045 1474314236 1205872300 912667061 +3870369032 1828181491 2273478726 +3128589299 2177965978 +3209003144 3369242549 +3473590634 1949486394 1530731475 +2038973519 2692974680 +1875205968 1919167079 +1100891574 1100891558 +3778240280 2735240252 +2266836473 2616149464 2266836457 2815592905 +1069965626 2781648227 1069965610 511718135 2672496221 +3619835461 3651911020 +1738746202 2144999595 +2415082404 1072096041 +1685478077 3813726100 +3857832038 1639426199 +3819613845 4205892764 777950522 2431825368 2933593779 +3630927569 2186400528 +2270331813 1281407566 505253722 1012965632 1339986561 +3077608569 3563835375 +2286440094 668189353 +946761787 282766564 +2647384909 4275201683 +694066653 955436040 +2487914467 2487914483 +1327052050 2528021317 +4151739672 2811462861 3259464928 1852116396 2587496115 2858616153 +704266416 3304314133 +743569531 1074407844 +2087630861 2914711091 +2097491906 2435460707 +3887804543 1994482218 +541287858 541287842 +2083075643 3258278120 +3340125620 3706040765 +4163113767 3812256036 +237534667 237534683 +3457028328 1210359083 +1425269716 1329820991 2414847663 +3017414045 3176138274 +2336860480 324989723 +3520461817 1105384720 +1231866495 1231866479 +1308572595 2076900044 +759574362 2843114998 3155053365 3155053346 2675739307 +359660347 4199054834 +2435788080 144771012 +2391690165 520171004 +2054000073 1052498447 +3822239998 325463547 +1489583599 1122780460 +140067613 1099212450 +2443934299 2884738372 +3203283102 3236727998 788734143 +866991534 2286030941 +1849423907 2875694858 +3001691778 2721776266 +3975131635 3791900534 2995647606 +3443974232 3467377636 2123573901 +3880687628 3080734754 3826563499 +1085873101 2959524772 +3057671638 4056580257 1489543174 3176380391 3973219178 +2418684203 493577908 +620945080 2512454453 +2858179301 610480060 2449236509 2449236490 342038124 2858179317 +214282919 3258465504 +4148372558 2360485593 +2335118694 2166271895 +1495874845 2028680354 2028680372 4232305410 3874455019 +4258487651 4139516618 18229454 4139516637 +3029570700 3455629788 +1037875707 1568196146 +2824273597 3186819988 +1095981195 4034989372 2840033141 +454111658 1175531149 +2626769326 4041436669 +929519020 3819691464 +450314377 1186227472 901456414 2814099622 1079817033 2072006633 1792064161 1634862870 4227250110 +1850200702 3552668041 +1389072189 2473753858 +616234612 1180602511 +2626980754 3281309229 +1321163671 2656077136 +3204162324 3122772089 +2642162298 1686337035 +714403067 57741106 +1912655824 2852021309 +2401000638 1899064333 +2637227116 4129865852 2478908311 +3932106367 1926640116 +811876248 3318750285 +3680772251 4187968530 +1114100665 3505257100 +288172657 2946647830 411022583 2065289190 +2211879349 1249551561 +345926923 1946680376 +1415465644 370226480 2761593815 3161748796 626607109 2087685335 +4287834436 956183556 +2616782857 2447498808 +1559687064 4038798427 +1790578115 2170853286 +1160583196 842282695 +2089362958 434563087 +745638016 1991893395 +4120425511 3328416096 +1614999055 2556215694 +111717384 2206650525 +637952503 2170145871 4015824974 +2645058152 1386219164 583398549 +1999866274 1998852123 603444440 +1798734660 259144248 181445641 259144239 3586626052 +2104653137 3425611408 +115111420 2291405846 +1317860435 1728146959 2797278698 1652784973 +2685615427 1251246778 +3082737061 1935686346 +3304960185 2293736514 +1734350943 457596318 +2117621293 3124890984 3752831172 4287026553 +2344429196 2344429212 +533128954 1940363 +1084724024 3696499155 +1463321239 513244675 3841299376 +2056626551 1888300614 +3093359886 1318399247 +3347052597 2570061772 +2330526850 785520821 +4172917058 153090638 2589186890 3460657891 2589186909 +1048081002 701509217 +1852240248 2715373871 +2034684563 2462430167 +4130296758 934943126 1115735943 +2444891740 3287364295 +1123831921 3116166947 2914342017 1050313005 +2095328890 355805725 +542909349 3123072945 +2674654440 3074947241 +1109956656 1921281819 +1316239834 2460343453 +3942227439 1028470617 +2439548507 426755615 1117264196 +141960669 788372212 +1285802078 64252905 +4106339308 956787841 +699905074 3727731365 +876842617 3210299496 +2609631277 3724370568 +1064946574 2059104409 +4265590538 1213840571 +996887930 65730333 +2329358116 3511788104 +303547837 2014940579 +3095097756 3782953924 106158215 +1407828080 3619039988 4134884829 2298081347 +1342542666 1120329069 +2528331804 2179051323 +2847855325 1893334959 342225396 4269524692 731989785 620207403 4269524674 178310769 +2080153424 2125384419 +3802865033 3541394661 +2857334507 2350500111 +3664831001 4172541278 +949609968 4220760335 +4180344274 279810451 +657659246 4026940911 +3717636033 3346904310 +3778639279 3778639295 +633333875 3529712532 +2681049096 3473137283 +3859933357 1620367634 3798954267 +140232340 2892953065 +241571078 2964527201 +614587559 2816020147 614587575 +1556804933 3129523014 1556804949 3953881962 3444052211 +1340658794 3918220244 +3751344814 3751344830 +4192323964 3664784935 +1311260184 559529947 846066464 132949875 +3282763210 3492644091 +1119025514 1774100955 +2827952193 2588919360 +1663927832 12810148 950671309 +2079831697 3086247494 +114102286 3970120823 600842380 3168684441 +2754922851 3793290954 +1736691073 151046310 +1617367303 3376401942 1567966297 3480308228 +1690238098 715626949 +1959391280 166009749 +2388853374 2749164617 +1166562930 3455905907 +2671300148 3396108991 2985907848 2671300132 +2325375067 2325375051 +948828387 3934178652 2174568391 +2053442810 2459269137 +143397825 325064934 +3550869657 415313400 +797985297 4045707462 +1602866885 602211495 2996414716 +356122431 1186942855 4215953525 3785792962 +515926806 4211469322 +2878492216 1330717243 +2247115784 755482403 1276394800 4091302531 755482420 3778746525 +2104832769 3730991664 +1267664116 1267664100 3592729343 +625313469 1769151380 +3081480868 3342704681 +3169676698 63146347 +3315418288 2929529884 3331531011 +4628026 2774374806 2580710677 +3439942071 2092448518 +3645767087 47070735 526275025 +2252595546 2263895349 +3546134386 622400790 +4267834101 4267834085 +2049622510 2866133817 1062160825 +1273243722 3257625709 +3329417092 3939884233 +2835248078 338277198 +1813979964 3881844901 1488542645 1390502282 4105612675 3510006484 2923751504 488391510 2837761912 3438436905 2894626692 900468130 1687349030 968982656 2253276977 2383916460 4012919441 2433290489 566923336 431739422 1422032525 819590344 1434644359 2849781672 3532662010 2056124279 270591304 2245909752 260823709 3786266441 877246947 3968739268 2875854735 1947011770 2287267691 227217021 4052357113 2980029642 2633859123 1780100754 1122977292 1469065847 3385790351 2725878211 2137650020 759972435 2303723376 1214911939 2804163855 1187190158 2561899606 771404764 1552018420 3432970208 4063015731 3194379618 2676798763 2918462731 2211574686 36130852 1663926694 4288790459 3540875741 1212644824 1811512557 4034309750 3655837929 1972966684 245913776 1972770757 404424145 2329297862 1251679287 1730288973 1036790921 1130293946 4070350516 1509062302 1115894038 3739370532 4177172700 4223727222 2076929624 1233651458 3400217483 3372686399 2936449668 1370894068 4017178325 14282280 3054023796 667601770 359807519 2929428995 3143595576 1458675654 156861478 2680033765 3136391427 3679928894 3204484548 1419884358 141597659 3079797439 2951178703 2467030538 1731008882 2984325922 1575502542 26228957 606633131 1187775534 4182387274 1612154820 797096025 1824770627 3715431872 689069262 888987963 899505868 424785483 2872659597 2116114048 2509292951 687958231 3790525307 332575401 2168186744 3961605989 1215764031 3746574442 3053058657 2790825109 2512895348 3226141704 2270287515 1740699149 883480137 205793278 2575298734 3955690944 1808873727 222869673 608617581 1301585956 272377455 848510803 9788990 2269677893 838829603 706093111 3490840522 2850421287 2857129389 2864043974 2280998694 1630985556 2456231048 276648166 3149782646 1410693715 939273789 1727390246 4150775989 1701311302 1250611033 3298029741 2857570881 1213676658 2362645379 611389574 4064600657 3130946899 2952392922 2140163143 3788824441 2603078098 2006781221 3708987759 569488866 3773658725 2849493150 2829515149 2869075159 1106405450 1362176938 3053598794 1904967620 4118409161 102115898 2196709074 1125100186 120420880 1097751531 2235413574 561546982 763041407 1507572720 3456137468 253583895 1998946453 2060089276 1425646196 500558291 3611454626 3184713330 2263488033 3747330668 990763698 3701263542 180214739 2833281679 2788525638 4043908187 4147559258 1132033053 2842967001 3083539818 888563663 4168991847 1115458709 377988807 2595346771 4125377760 3294336906 2499240788 2930747256 3161295024 2598779592 1931075452 3414954388 3357219621 806777321 1908119651 3174205916 1840077282 138055159 2090093390 169139532 4177342886 2106180380 4259987641 +1737785238 2495922145 +2587886733 3095857138 +2772060378 1985200309 +1251114643 1365747309 +807027954 2874837221 +774343617 1765867734 +223667809 2585319996 +2165726789 2067162764 +2812669142 3224622321 +2771383565 2771383581 +701802389 1858326428 +2420410543 4274653905 3403885422 3684527596 303138358 2509646496 4291431527 +2518423893 2518423877 +3953170252 4281648774 1175749857 +2184071899 2405373576 +438581979 4154361503 34121412 +64024148 1877851500 +2634504518 1530671906 +1198295953 2787794230 +3219382599 2506175571 +223837173 1943963280 +2592154608 3606586716 692818645 +2999579786 4117957605 +4294677735 3758843830 +736451950 2282886182 +2162803334 2963318405 +3394586474 3997133787 +196017706 1698315923 +2746682991 1404947160 +1829965158 452859777 +2883818860 1011194748 1613217536 +3091847624 3829519837 816032500 +674569765 2272329110 +2557291336 2532776035 +3633900820 213726841 +1834532955 2109132626 +1897269274 531546347 +4087016859 400821010 +2645027408 1697201263 1764311740 2136333301 +4042620973 2300645241 +1951169271 191206086 +1126970593 1897328390 2468615111 +4076515841 2190919068 +3147916376 3071342221 +3631609977 2512723732 2512723715 +678606069 2710756778 +2941400664 1449888909 +4002344619 1922048574 1872329071 +2808704349 2808704333 +278348693 3005178762 +3781561806 2712124239 +2478673117 1885650932 +4231445801 468395150 +4045576882 1266255411 +1900448181 66632614 +198824833 2066038448 +903526808 743992279 1532532531 +1749860910 3043070589 +1636382257 3154136870 2418320739 +2127952153 3285656136 +4118725551 630066286 +1966488101 2841479226 +3825171985 4231230672 +3320726424 773089357 +289654392 3276906245 +3624308070 3204616337 +3093057894 1752434342 2673091479 +53457657 4246126078 +1296845927 2920456896 2924727901 3368648004 2068709293 3368648019 +3013698903 504530928 +2895827196 3015113895 +122872034 1769472963 +2554310014 3737664670 708713823 +2986108524 2622831617 +1638268722 3931159461 +3487153479 2059728598 +85561369 2202118716 +1174859806 1525415721 +2795587882 2045127963 5833106 +1344466982 3924804676 +4135605602 2976827310 1998042218 1998042237 1845913923 +1882767024 3358270770 +1905421247 2290064830 +2142190998 2791687798 2531128103 +4262378281 439394712 +1143185760 1967454267 +1606316547 3150805674 +3813287493 314195610 355503229 +3107847060 83999436 +1382153825 1382153841 +3567580503 380516326 +528110095 3385649243 +515798269 1657940546 +71879258 412519357 +3996466736 3034147211 +988988933 365554391 +1224004880 575234063 +1751588257 4216562807 3788087580 4216562784 +873388641 1684135920 873388657 +3788605402 3798112181 +2520833579 3005070754 2882642511 +713337863 4124757782 +1914725714 4211048453 +2835248073 2626928499 1411206201 3515893102 1411206190 2328518432 3456183391 +863072269 1932951653 4060553074 +1351158133 3890554559 +3932356091 4107653677 +2895276890 75431613 +1741519853 1434064388 +1546797295 303839288 +3609268059 67841092 +349481009 2344776298 +890415433 3571858872 +285322866 213310490 933600627 +3308455813 547157657 +2292301505 3617540566 +934085723 2270295771 243279154 3787471832 3619695624 1167015269 6150980 1183792891 3619695647 +1985363409 449007632 +1150768141 3510215538 +1166159178 1166159194 +1762619489 3164952198 +1135910297 777263048 +1864112853 3355259487 +2429430830 1375234908 +4064241609 584081784 +749771028 1845557881 +1643532025 801001982 +3987984706 384389878 +3254748786 3611338085 861951838 1304720410 1304720397 +2022778258 1585325253 +1766491552 1615878885 +2307598909 2542897806 892550097 +1073499064 865818753 3791402188 3592847929 1066877258 2382949743 2558597404 3744202264 +2202924487 2059003990 +1200597121 673596160 +3601217801 11264584 4037789998 208515961 3601217817 +2579151633 301235143 +3384410895 3384410911 +1915345060 1541409343 +4137707043 1635830044 +358485718 2102532534 2031180519 +3513407611 3640616217 +1937267025 3448571655 +604818260 1867636404 +4028891660 347027703 +1771007959 1808747860 +307652921 2555150363 +3866614061 1417043235 +1414969427 1414969411 +637116793 1090072936 +996442257 979283787 +587007803 1787880123 4166105022 +695831765 3713846697 +4102732359 1002944900 1029914070 +2174174971 4230266148 +2724620710 1295536193 +2617950299 634013726 +278329020 2449000048 278329004 +2106705593 1702614312 1702614335 1457957940 +2703084554 2884121531 1502179186 +1202551388 840408785 +3112077574 137475169 +4039863119 1076928923 +331409358 3870091599 +2515756981 682345306 +2562448891 1641277234 +2552562327 1956118036 +1151443665 3681767184 +2828149591 1958843247 +1378431502 1691995161 +1334570675 3964191692 +506048672 463539173 +1195359610 3569186713 1950561423 2135115208 +1484065374 279839114 +1333613664 2186007333 +3821533403 1858912466 +3112087207 2842489056 +3008336614 1719842597 2629256626 +935561676 953622344 953622356 +4053197800 1254369531 4173491153 1426220152 4190268775 1254369516 +720701589 316365672 +4193369162 3247138925 +202405044 4162617656 +939445490 404529381 +515413362 3465757299 +3085024809 2508754329 2707315342 +2777716857 463472232 +2614122239 2614122223 +3776231999 2460037416 +1488136601 202560555 +865519219 2773497846 860362833 +2508382719 1544143998 +746429794 1807663445 +2043081428 863629620 +1777629273 618230792 +2922519041 701092723 970911638 3251879191 3875264019 +1312719892 210845428 2694521432 3753750377 +1182847209 2302066254 +381724217 172338088 +1731466282 2202811958 +4275404160 1247775869 +3913692284 967097136 4106380182 3045367591 3972395502 4039547431 4123157804 4156990769 +3495490453 2433184668 +1946207402 1194694555 +1905222281 1905222297 +2947489472 1539802968 1353541708 +2037426694 4099827066 +1559151148 2010884929 +2676644194 2294986069 +3786220081 2612027018 +2650223204 3526315599 +946836410 312358549 1309017622 +324266544 2894818994 +2128245704 2045002699 +3117076598 4031130065 +3240896626 2323884901 +1571674256 3251725928 +3261229666 177673560 +411293826 411293842 +4104459846 2581563025 +1485202218 2240682779 +2568424512 2568424528 +4026076769 3627830343 657017766 2747475078 +2677525013 1032627913 +1405948664 152497328 +1304436993 1718875286 +1325188953 2968375560 +412162771 3131508826 +2226229941 1646414867 +4274453269 3795217274 +2113025961 3981287175 +3305657755 3340681988 +209811189 2496539244 +1654607829 2551003244 +1105372621 2227896740 +3242132769 1049418065 +1696536638 2648808353 2280710498 +3754785204 74880591 +1601023063 2631775433 +1995829102 919971833 +1731988384 596004069 +3199324889 183430046 +2788658182 2794410577 +2596450090 3396976397 +2341546848 361187372 +679384114 679384098 +3179065455 3125395128 +648882881 2585252036 +2714237238 2540775562 +1223496799 741806494 +3004233543 716522710 +2397757512 1136595275 +2982773274 4197961451 +3975802987 2020964477 +2375478235 2375478219 +905530523 2457049106 +1059507676 1175851335 +845844333 2801853160 +2721302718 2721302702 +4287042478 774112815 +2743961319 358968569 +1272301489 1968161472 +4225126166 4225126150 +3136685864 2035106795 +2072619653 2072619669 +2994146810 3949658269 +1151702842 2649641009 +3591297738 3596100867 2166192992 897839471 2143610372 397437034 2132784505 3868981474 1184871398 910403856 3007101099 2193966068 3323482983 4181701868 3332094691 3063100576 3241581698 +551830911 2814181592 1180264169 +1577142464 1102208667 +1297298501 4277880972 +1162756627 297544855 758252524 +1232285371 394995410 +4134708922 2960946909 +4153885447 772394003 3390997504 +2402873666 61099778 2362991435 3097742069 +3279584139 1154513858 +3555412274 197581593 +2017462931 3245631744 3559107181 3245631767 3754993004 3575884787 +1841917804 1075472151 +1715703335 781336045 +3025152011 3845065026 +118683946 1289633051 484061586 +1004587194 1313152611 +3139963878 2248850177 +1853861157 2240211977 3902827195 +1313054964 1313054948 +761225761 3190095440 +2304825719 3494390172 3628720116 979979561 3628720099 3128317520 +904854165 378472368 904854149 +2062761762 2026865211 +1330044641 3292296946 1896524038 2144461255 2911951904 +2640270058 2802812507 +3388751136 403978604 +3258735329 2362606854 +2574943062 4057776241 +1653884928 795695109 +1760238723 3255510128 +3638515425 2042880262 +2456763491 3894153180 +861110700 1633952448 2020942273 +2774787278 708915289 +3624752973 4162127897 +778324755 974116660 +241722971 1090188539 4200502693 3854921309 3982393638 1891812118 2683370802 3982393658 1073410917 3706041303 4216282632 3792621798 156836164 4216282655 +2864288200 2317385181 +2511360129 630110976 +3058866007 1527004646 +1483499392 1580503551 +1782673482 3859669517 +1978869849 3221147267 3215452245 173194716 +3808736479 1464472517 +4235758599 4235758615 +1478338772 2326840761 +2094153185 2769532615 +72912281 1885792200 +3580252293 2808112886 2232474268 2741002429 3580252309 +1631065063 4064760992 105527283 +1156254304 2928401416 978654398 2490900344 1688089790 4230399526 674862699 3075495375 2121676555 1818196146 1162302323 1803686768 +1671681229 2816999090 +476541266 4262627821 +1276702257 4231984944 +569060421 2411854147 +1867116904 909088055 +1484070309 3430138588 2296920908 +508036457 341869656 +566538535 395939257 +1883250397 2679894741 2448463330 2881226153 1138703326 +3400330009 1013650005 +2528064840 2110840907 +3294784924 4167209319 4146415020 632002909 1805638134 844098239 1228648709 +3361434002 4192678085 +1962512168 303341456 +1694182071 2916655544 4142848745 2546840372 2925805062 +3043873724 878632032 +3878794248 540978996 730860848 4215171229 +1564899642 1663129603 +2220834511 821026776 +1574649116 3693163281 +4233839857 1462512605 +1660596817 418915223 +3689965572 1064549983 +468274742 642129681 +1566399292 905355121 +3472666107 3536183853 +4008701230 2404803152 1370644345 3077618051 +2022373725 533106036 +888970843 3333218284 2156878693 3299690820 3299690834 +2031465588 2681095903 +3497706432 4047644485 +1663751967 1582628904 +2328167686 2049370231 +186392481 1746026445 +2515182600 1250843562 +178338971 1456629778 +3782781490 586411173 +1446283727 769074188 +528874162 634430029 +3617196805 1820285132 +1388345212 3237746737 +4146107763 2068530188 +4256649314 2588061129 +4070400473 1113987855 2145423550 3334539400 +2826001051 2826001035 +708436466 1797173221 +2847962693 2044155425 4009530848 +4203652418 3603381673 +2150707442 3087513406 +3153545909 2605357820 +1314364318 2387878253 +2247856652 3767718196 +1464988961 3727273640 +2267122755 2110508093 +3548210419 3781552794 +1548386056 1440002408 +2124771745 4285653088 3651346439 1570333283 2521061830 +1121029812 3823347033 +1909098748 1773550043 1082712868 3145568703 1756772421 3145568680 +4173958011 3989635097 +2853441623 345356518 +4223589782 3816215335 1856720198 990799479 +2504314275 3548252816 +1422295627 3212778498 +4184114058 4184114074 +2126903090 3282314163 +1019464768 395832500 +2512395357 1614596680 443328116 352006704 951887275 2432872729 4211731522 968664881 +2835023879 98015506 +2407302165 4127452444 +522973246 3539934559 +4039219935 3754347806 +1624210590 77671593 +448220848 437205261 +1653769338 2795932683 +1652558807 3868369766 +106537787 145505008 +2896263598 1882361081 +4084611545 821388047 471666824 +3636682699 1464993899 +2807987763 1061950903 +3675938490 2760056541 +3615920692 1632025247 +4128839970 2340589717 +3591966278 1332836385 +2110276334 4118147658 +944965623 3958224277 3289090983 2713029072 1489797154 1623716450 3166867541 1623716451 1160566774 1867646602 1623716468 3357559597 2564844713 +1169188950 179584881 +2613525366 2963446471 +1139790340 1139790356 +3593820220 1912202865 +2627301945 2627301929 +1527102199 1090867920 +3784016614 4104065054 +2401936078 2401936094 +534951410 602172403 +2492251564 2240714199 +264182792 242039609 3274915193 3520667805 4056830167 265528418 4123940660 2127118950 +252654899 1694308742 3891314522 +2928291467 1317487810 +2592109715 3409412986 +1900896514 1590670883 +1336649169 3473842550 +1600544927 1264653482 2265428819 425399414 +2504130547 1451433363 3924159372 832005302 +149168048 2937971203 +4245723537 4062297926 +4101151549 4101151533 544650805 +1114555455 3546214206 +2315664982 3689977121 +508169266 4157219216 +3768723150 3768723166 +757213087 2881773384 +479655622 3349576119 +3580773018 1948954722 2526206059 +1199474758 844448314 3526395425 2226260380 425937041 92740818 1295303231 2159171246 827670692 3071126747 +374031893 3537228649 2246398875 183087960 3745618882 1529198377 994486740 1529198398 2725227936 491113575 3728841276 3570783883 619306047 +2723113591 4194605392 +1418939433 913363045 +492713971 1999947126 +3542753018 1699660701 +2539914551 2306094470 +1854659277 1798684795 473720882 3542708388 +813835411 4024406906 432859411 180062289 150278912 1508836228 1672431725 +2650607395 3630093322 +1280805102 1912905081 +4056053752 975715100 +2798043106 2798043122 +2509365865 3718736718 3718736728 2509365881 +1007650768 695828008 4256685099 +1690909051 1690909035 1295490610 +714269940 4181617689 +1207234476 4069870529 2901789756 +351481078 1578546369 +3648448723 2587572074 +1831579588 792951936 2059608056 959140731 2259953751 2680533407 +3013830612 1188791808 +266616974 1806444889 +1843420068 150583695 +2418527113 2007328942 +262498760 262498776 1768261067 3352410868 +2219230192 728134339 +554404201 3104402137 +2513908024 432175917 +1764382723 2426965180 +3782520214 3082860150 2158838567 3082860129 3149970610 3082860151 1332289706 +312699208 2671688779 +3574561454 626931977 358490105 3574561470 +120627552 2978875941 2811885612 +1716196082 4197372645 +4044652362 3443810669 +1642238445 78362642 +26536643 3229117479 +3832791973 3741440202 +2782569864 2670892317 +2655637042 1396575627 +1650377513 2093643072 +1034044301 2473613028 +1660626797 1046417554 +987917427 628144396 +3806014312 1248093589 +223393426 2282710981 +1469202758 557629729 +1657513158 1284793249 +1750032313 3992170558 +1485460508 168415953 3461608481 168415952 1519683852 168415943 +4243914791 1205706291 1554988384 128830976 +2273689122 2039107477 +3126095429 2548668058 +1890360158 3182990569 +77305241 3981265534 1150190671 3656155080 +3651468585 3350890392 +3154083048 3677462827 +372282810 2826679243 +4015103979 864459278 719619097 1165953378 4165516139 3471736981 2826878690 864459288 +889025896 889025912 +3720284972 2856724507 1069454935 3178957048 +2447389857 3291693319 +2874895825 2448285712 +1529304152 1205701655 +1124986798 1022381817 +981224753 1118667824 +3928471015 3446551033 +392139495 2993963452 +341297193 791681166 +2250823379 2143727447 88747564 +3237872697 148940200 +3496167512 1682629275 +2926872076 2909734113 3178176007 2926872092 3871649312 +163822651 2585874674 +3515955923 1564949866 +2510869327 915427288 +2490150367 472747676 +3211108044 2281217931 418970429 +3875261315 560029482 +3784482095 2473121388 +1416510526 663278985 +3441295879 124935327 +62556361 3284816735 +4125213494 2353373981 4163953745 1214664209 2952884602 +3351053510 2628199958 +2813570248 2813570264 +2982352856 2921236753 +1355020042 780002477 +3511114326 3377673585 +393305269 1686635653 907493466 1686635673 +179752441 179752425 +3149184984 186053018 +2236947349 1534415661 435019402 2402765370 2402765357 +3528929792 3549948472 +1679034347 2056986207 +3350735442 1984821758 +3593533374 3977642015 +649294918 847252030 +1077822892 4120116796 +3196252045 1442279758 +2709445650 1221976092 4086872478 +3499153771 772956407 +309923385 1301373864 3537893644 +256314155 3959003819 +3155631572 3965973689 +2341648917 3416681824 65720481 +1105177967 2929905881 +1115320218 1086173053 +4021404142 1466949298 +485788957 2985960628 +139312594 419228269 +3280956612 286110222 +3910951531 1655631458 +1529988195 1390353185 +500172180 1396202132 +465532528 465532512 +3141151904 2030131808 3709945139 +3287453222 1142263598 2574615401 615356231 4270421233 3428407699 3721048241 714324716 81515916 +1982512003 2286235434 2562758811 +2167384656 2919832547 +2379227581 2035465039 +438096980 3528425908 +2441871651 1102438131 +4257041626 1258289963 +1594738091 2887244763 4249961923 3471159509 3816945822 3983719611 2798876428 4294487558 2485961716 723776042 3221580958 2213161424 1869474301 2277719474 3660271303 +625854819 477365962 +1678966602 1938169406 +2997061928 1601235453 +3303153338 2851495627 +2482483297 1340778656 +1310231052 4238430433 2465354272 +3410955444 3410955428 +1202912690 2428854053 +793061480 3521026987 +1466336711 1163635908 +418247952 1318635555 +3408702819 978645706 +3701478388 1856573638 2298484471 538078220 +681660503 1290893542 +478464228 3492075492 +618001993 1171436792 +4177827798 1273645729 953392646 1273645751 +992600500 3605941839 +3576565386 353915955 529756000 +115970948 115970964 +237888713 1382851886 +3452300448 2973530756 1430681368 2392031219 +1129639740 984914791 +568608521 1666962232 2542629230 931909663 2542629241 1666962222 +222553126 1021228902 +1432712118 1432712102 +3420593314 2745626027 +4154012999 221175510 +1709605044 1598591851 +143863085 2897223108 +788695172 2231166943 +714631171 714631187 +844396224 321519602 +2753787173 2641977804 1719526087 2611521116 +1872689771 574895714 1700903064 3403645973 1700903055 +1714781602 3931358009 1846785725 3223736942 2285159957 +4214371059 1661351066 +462070825 1913520000 +2522766427 294347588 3798811679 +512875915 1209490609 1904092939 +3586064030 1773187759 430625449 1239559967 3288737748 +1658279588 410614526 +4277868672 3846672787 +293838218 2619563237 2619563251 +228638033 189681661 +1049889693 2558234005 537806882 1049889677 +100726925 3535736167 3990011784 3539152601 8865252 +8414498 3961468035 +1533337692 4110670087 +1620495924 3448198792 +2589319800 1832092397 +3159826605 3159826621 +3079412760 160446925 +1237947760 774812080 +288027314 2202652190 +301689021 1094031246 +2557403902 3701747230 +11484276 2279352975 +2996289085 442505086 +106076206 570789999 2774943801 +3134388662 158105890 +201617915 3858722340 +3055033142 3723679239 +3947713288 1924773259 +2529178083 3199150188 +3170240714 3417168435 +970731491 4171194972 +3066114754 1106400190 +2073133468 571410577 +2837843194 1088843165 +151389659 259733453 +928031762 636635205 +2881081082 1333842827 2999780290 +3758494610 2549454394 999345861 +3929206750 1946625026 +546810203 2090850568 +3121795612 2366758850 +1171803104 1858215640 +577605316 1603816155 +4013333594 3975684523 +1305375747 2130747580 +2549025975 39886078 +2097497912 4149150699 2097497896 +3099631949 608037924 +1878033237 2359213770 +3881616808 3742050155 +3463919603 74827104 +4193979523 3119813734 +2427295995 3158823716 +984283796 4012406511 +3369574604 4151451959 +2329209676 2232333664 3643697313 +3219768777 2209738286 +3636537307 3636537291 +558405429 1178549964 1636817719 +3399255104 1052296731 +3804437123 2082651196 +989408482 3091310531 +3624449887 1127258605 68990154 +2950383700 2802888127 +901127650 3432896833 960781478 +893539912 4049753584 +224635068 3487735793 +2418541873 536882224 +653933541 1089227116 +2488743453 684265193 +1560619604 1727160255 +468547709 583795592 +1077098936 3366182075 +2325107183 430111534 +3953991607 3095981318 +1840750347 1697742383 3272564308 +384868569 4123866504 +216650520 3479918679 +1990943100 1990943084 +2670674741 2670674725 +87620836 481696511 +3937398869 3354875338 +3632172124 725021905 +258249294 1591342937 +3888710223 2519306380 1231326385 812556878 +852541316 1659595292 +1376701239 1682565008 +3305348280 2592533468 +1264663496 67491260 1844370677 937955952 1844370659 1913723851 +3836022426 2312502397 +2631580594 2656401701 +3826893631 1238206891 +3745416412 1265313351 +4096389434 2550578781 2644348930 +2787879795 2646371521 +793270573 981859730 +765480150 2841179377 +3368866067 762126572 +145740813 3117076580 +2786600656 2786600640 +2895830734 2244787801 +3893481211 1325978930 +1165703248 2382381245 +2852664663 4135014100 +4206360677 1270853013 +3392365046 3098440150 1155741255 +2052051468 2716786803 +1759275899 697743422 +2559955689 1188130956 245197893 +2290035446 3593511239 +2679243933 2825956994 +418658741 4252424170 +124845574 3168789345 +2833792305 3083630528 +3149385166 1348008783 +4227968287 3584264129 +4194008611 2850525450 +3528908293 599753171 +1639210905 271404971 2159813736 +3220060715 1325765026 +2426471178 389452422 +935336626 1969882661 +477707782 3663025233 +1541049531 1410042468 +3705610444 2134941985 +311151133 383889428 +2072646671 1127597263 2078843188 +3129661558 512934353 +902111585 106138528 +1075033562 3104261675 +341624709 169361817 +2203558684 3740648721 +1537681650 2199688546 2249035705 +4165943063 4223684912 +2330605134 4239621327 +1447955102 2061153961 +1359932205 3346806738 3666599826 3666599813 +2289423457 847074486 +3225509786 1089044349 +4142232910 564154574 4181174735 +2794375601 3821502886 +2011507910 262371844 1013112342 652329223 +2385780350 467963725 +2994331577 2165109129 2994331561 2933600318 +1799157174 717721331 +2902123468 452237879 +3757450086 4135172481 +492923699 1935393100 +866691689 3146007384 +2799390897 3804921245 +298077679 3875974958 +2750883070 184238089 470760393 2355631202 +628956089 3170018344 +330910276 2050814023 166449884 +2404599841 3239742432 +3471769384 1244524327 +2047710305 436869777 +2780427426 2317256107 +3867232361 1297791858 +3645532255 3645532239 +4203759979 1271844575 +113202797 204803483 +271679530 2817311259 +1677769295 829644315 2327056088 +3495755823 828852728 +377600900 4063899871 +883422554 506828413 +803700441 1114419102 +1180952280 1180952264 +263912599 1515954608 +3172352224 2046743323 +1051167774 482004009 +525272521 308681582 +1626147616 2479282171 +3785349967 2108046680 +513232406 513232390 +229449353 277287335 +533811433 138100313 +4278107382 1627617105 3445182945 2413543882 4285842646 4285842625 1627617095 +2256433134 2819580634 395089329 4228964487 2802463667 +1807612593 29769572 +4113674148 2122482910 3650597216 10793508 3650597244 +3664466929 753421462 +1660865191 2053084851 +1190660364 3296083447 +114248485 3713223482 +3959513650 3089994917 +780486311 3448625721 +2232659360 1107850775 +4012363862 3517773681 +2526004727 1983766627 4216628176 1983766644 +3658715877 3777694063 925085204 +194239454 398663273 3878224382 +3581651058 2208967539 +3756876812 2267266081 +3888129472 2474339653 +1128228385 4258121206 +3193576960 2816293388 +700920698 1050020107 +1627846886 47062916 +2150450412 3024205825 +3345701908 2651996460 +409322319 3161373082 +1764771173 4227677690 +2170205526 4157306481 4157306471 1134657039 1975035370 2085315617 +1034142638 3016242745 +1142398696 931414044 +1693285216 4031829170 284736639 1250079201 2064750798 3380453572 247773724 1723310093 2322565666 2359682094 3019507071 1037472613 1679181017 1600603112 3549842162 2200557509 3260134394 3857142198 1801144329 1634362044 1771690577 3990337315 390266631 1590861702 1165014044 3220545981 65281618 997557674 3684080712 396768832 2944813986 273621613 491562657 4124192716 35177306 1709153310 1275099160 674502522 3144610640 4215057941 310568980 3879721314 2487217769 +2684191306 638851693 +918161197 1406749636 +3613559663 4182504648 +806511207 3585303869 +2171173147 2373983274 +4019826917 3743459338 +532667592 3272117981 +2419885421 876782532 149409183 2084964996 3708132699 +237511647 1188282448 689648785 +2750212646 2702060913 +2132323037 21323458 +204984752 3957266435 +4257964618 3268841394 3509303931 +1603923534 122679769 +3915510410 3915510426 +2855085254 2870010785 +3483267474 3212906332 +805918768 4248572811 +304361044 3807702585 2157118376 +4226827350 1820756714 +1369282458 2685834161 +1024254340 2672231113 +987765477 2479511148 +877434223 2457741484 +394471826 394471810 +833029914 1139813885 +3634171778 4273843982 +513682401 513682417 +3374392654 771457241 +1210482025 3543588415 +1060203248 1791711171 +3591077703 2434437407 3370975812 +193961260 3995494999 +312327785 404540368 +2091116623 1281492093 +3800559328 3562521019 +4022111459 1050386165 +2024216510 2903138335 +1896263686 4085717367 +3468274175 1833344104 +1487672526 387623290 +4242841082 367308939 33680085 +694212300 4017234721 +863340774 3892740638 +3604484300 35811617 +3793154203 1681800690 +818630467 319669884 +2821540473 944520318 +1803663793 3505580205 +2542952368 1265410581 1265410563 996968691 3506644764 2542952352 +3647775895 3708230064 +3112822597 2047706676 +2207823989 2272615377 +854104465 2311649523 +2325842683 927844658 +3462358359 1380107946 +3808397292 232817617 +1425985386 924877773 +3713543110 4257275330 4257275349 4273656363 22470370 4290433969 +1011105934 3418283322 +1282783677 4081531061 1631314123 4081531042 2904441679 4081531060 441672834 +1838590339 2275015024 120379690 +3461475916 385491383 +2037545594 2838941195 +1123248823 3140434198 2831735303 +1168903135 3402301247 +3478779493 793481379 3508283805 3508283786 2422016509 3483295994 1912617754 +3122809517 2969275986 2210539291 +59219899 1233154916 +4099107712 525482643 +1693945332 3853809433 +1216874198 1773719990 +3812182477 2084892466 2150575524 2560771451 +251030961 1055829424 +1930383324 4246386503 +2833958249 1385481304 +126954402 2340925443 +144593568 144593584 +2580354873 1457229502 +2732937260 2600285505 +724493398 1355903857 +1876322864 2348652822 +1688690559 2815254917 2686888234 +3670601199 3670601215 +3238766887 207308896 +4213936074 798186235 +3821205066 1427864068 +3509752733 4020133940 +3495906209 2802060896 +3604853999 201255701 +738943645 4075568418 +2055154975 4113827806 +3281155080 3884755083 3281155096 +3832984283 1910207874 815906463 3832984267 +1774544601 2761855503 +3892455052 3536996167 +841403006 2093222209 +3483473380 729619928 3210671593 +4118780351 920586174 +812993123 2879658453 +3885242886 1610369297 +3942971361 3654432566 +67196965 67196981 +476702309 476702325 +1710579264 34484236 3242417861 +2671023999 3419496939 +3540531123 3908021978 +880775969 3319045344 +3461282195 1498604154 +3263788042 2898351987 +3353021470 3151237929 +489793863 2073574482 +1749437835 2980843988 +2199253076 2945012793 +3058557153 232684294 +1362702824 1796083715 +3849133498 3838168029 +3680023739 128221796 +4224895199 1272067848 +3760224228 3894948488 725340121 +1208256229 2672649763 +2391117949 2137676460 +354449892 3828388777 +3722838866 2074602664 +4161051088 1006674531 3005054121 1006674548 2882017744 3021831759 +2067997306 1168088372 +3279597400 412214003 304220059 234822843 412213988 304220045 +2590180019 474705440 +2893597877 3246665818 +3321434119 1317534041 +1862100332 619096321 +1382730056 581189658 +3771494735 819355470 +1283161798 1283161814 +1881682911 1850320926 +1736847067 3543909060 +2560872812 3051531543 +982876991 2019400766 +466443608 2861254639 +1286664827 3077707291 +972618499 3653527280 168848189 1173562794 +4036303556 2126062239 +3815475217 54991232 3815475201 +941130675 26694362 +2654896705 2205758874 483297530 3373780467 +2543307340 4025710007 +3283460580 4209891817 +1431846479 3694391982 1082207372 2833913422 1901011121 +2448692519 4033337785 +887949530 371490997 +794616449 272142623 +1376363061 1512724842 1512724860 +2466187936 125680115 +708323991 225119152 4251644566 708323975 +2046803411 3137433152 +1819560996 1819561012 +1240174254 198286319 +2706572242 3350135699 3951206509 3951206522 +2459278052 2776814825 +4030004532 1466603737 +3843557796 3401320825 +2979757461 751219082 +3894861234 657391411 +1047267987 25192726 +2587627892 1083144592 +3124066058 4264153141 +4086039866 2674670173 +2592936344 1299095829 2300585568 3826430555 +295575336 2845100693 +4095950944 1767481436 2460827736 463849801 3179172540 3472612856 3011401523 3034787643 +702125786 3810504144 2019694311 2869699125 2635708654 1447901549 2256959328 2962954754 +143858128 1334944355 +537626569 992395630 +1275597459 4266633908 +3727840623 3331336216 +465978377 3256687143 +2945318798 3934866585 2848771218 3307439385 +1350682766 3703811986 +3277502252 2943220421 +3290715761 972772118 +4240290864 245540757 2668482460 +1051759300 384144825 +2928864569 2081034287 +3172873032 3172873048 +4095663377 1570111951 +950562400 2741964077 +1209443101 1205927650 +240309158 2837574374 +3976526623 1037521352 569753035 3229198326 1037521374 452309706 +2363389511 1026183492 +3075700538 3529814109 +2580766292 1205638771 3149161623 1188861165 626781164 3149161600 +3706509660 618277841 +2456239076 1112985365 +3614717243 4018010111 1458549410 1726991332 3614717227 +4005071353 3898820062 +2428787058 1461243493 1461243507 +4249534185 396529343 +2844892558 1173050137 +3042259070 3120558818 319354761 1249825390 319354782 +1879766985 709103982 +1222448652 927451435 3221861608 +35275591 2522343616 +3282092666 1880237597 +2254595189 1981349715 +3562141602 3741897749 +3088082253 1012209633 +3051556528 2216338249 2903082324 +4287155810 2791105621 +4060628126 944994494 2701395135 +2131989587 1590853292 +1655404284 2382361476 +522866067 2727878252 +4165697155 1641556010 +2598932448 3266562733 3524397784 3155852723 3036964828 1044086564 3399265154 3266562747 1044086584 +952684776 347883267 +2591570817 46916775 +1980425595 2882191934 3560390473 +518319965 2517852113 +3853332870 363132385 +2270306555 21621540 +1314159998 1034060258 +779624095 538594652 +3699251934 3900977753 3699251918 +3283419643 284302884 +4253029566 1709643209 +2379992243 67321292 +3129872626 2678369509 1128022682 1128022669 519727838 +3982192486 217079169 +347486692 2560878952 +3548475574 2296943890 +4122613134 3481858284 3149171481 +797829844 2959649711 +3008231035 2604956511 +3240134188 842217303 +3866670447 1057332657 +307140021 1530605225 +2512381637 2182629388 +4228880423 4086072694 +2006534979 2604908115 +80899388 30761200 3544315249 +1789650177 2688409390 1868977529 +3668267795 4069270912 +3100898342 464082881 +1191575421 547877519 +1278480664 234285261 +803779579 959280318 3230582537 +3566768372 1261686168 +2665095710 795063611 +3900121418 1032415085 +3967565288 3910008179 +2732139746 1037373397 +3210299491 1306780496 +2201754235 312324018 +1674308585 3773939525 +1238816988 423060049 3987624545 53462407 53462416 1364307276 647057297 1347529654 +3085416576 1375188045 +1895582348 1764317815 3152546780 +41567655 2281192698 +391432700 4076923824 +1568440117 1140004243 +2052652517 2353610013 2132258682 +89346565 3110852780 +2923026703 1253717664 569985813 3847135929 3847135918 3735836639 191472878 4064881560 +1327880739 3147195676 +1326772762 2612382774 +4031283529 2334361070 +3241630907 3844536946 +4031934717 1185079778 +2180686952 93376427 +4050438548 3711596925 +1770034409 3020570815 +2831151297 654307585 +3944839817 3006435577 +676391161 4156015733 +3321984550 3899087717 +918679603 2272961088 +3405446065 491100736 4036739767 1418842835 +3855244798 633839881 +2132082626 3490618978 2938179083 3490618997 +3832875743 724025057 +1427377713 529684262 +3169531525 3195976950 +1214167328 220032371 +4039719615 4039719599 +3799515765 4159430204 +3122656003 2746988647 +568608526 1750850329 +815346481 2989200934 +3503964095 2257738174 +1706671426 1701113571 +229287146 229287162 +447924763 4228213925 578037892 +3874816973 2120282970 +4213938586 1888160014 +1421696872 3458019499 +278955608 1938625011 +2693273221 4044311015 1426414083 +3730364197 718974764 +305599065 4122069240 305599049 +861499229 2873134590 +3106861301 1986494890 2045071798 2487460070 +3947319338 4171008742 1439162501 2336436763 +665154755 745983740 +1936184675 822982726 +2446855824 656338101 +3870613213 1495184066 +4048145220 455801865 +2076905830 2076905846 +126221590 868045303 +2588828316 2238004113 2238004103 +1568061212 1038237959 +1540910731 548799682 548799701 3179263190 +3620087553 2918147734 +547414009 1063022191 +908796647 753398198 +1839667785 3876479214 +2958163646 2542012813 2958163630 +1869031612 288442480 459612145 +933284123 933284107 +3537309237 4136653583 1719134544 3898869649 +3530501884 1090975405 +1311598561 4068116278 3974289937 +3071191836 1479660176 +2627019568 3075495581 +154942333 2114449524 2392663051 +2866901969 3521729040 +89943855 2676164344 323221612 +2858124955 3373590034 +1254863112 1459188788 1254863128 +3314507126 259278666 +1418585581 140571666 +2800320251 2895301602 2800320235 4282300351 +3504506527 760614706 +2783202984 1785748181 +2272084671 4026536616 +4007858485 1148458620 +3236579325 2916045634 +3199225844 596499727 +306921419 2541055124 31059182 3624925881 2541055106 +1370805235 1829945718 +3891822509 3891822525 +5039193 3322812200 +2117932592 3928616323 +3738487735 3738487719 +3846224994 3809997693 +1301787955 1490173786 +1231058358 1231058342 +3478321851 446739570 +3240299760 2976563533 +897697984 2566542456 +105491911 2442597572 +2466576475 706432558 +2167748251 632537780 +3684609433 4268065264 +2799512618 4082356124 1137359273 2490096542 2902763413 1137359294 +873155763 2697575884 +171220716 4241894807 +3395298124 3780612279 +3779786096 2962625227 +2331299288 817069743 +637565868 637565884 +2693888998 1367569713 +2402257392 454818635 +364069054 165419917 +80568840 2538689181 +2050967442 60664517 +3883605284 1773359991 +1927626463 3185703176 +3057224819 259364227 +3992619416 963025485 +2310880788 851426548 +2186308406 1519961607 +2301481784 4282262617 1387620031 2069602510 4282262606 +4056346894 2855106831 +2325107172 245557759 +2306430408 2306430424 +3766350911 691158529 2772926270 +2293134684 2258812871 +1809567842 876296798 +4035912864 4033498491 1364633573 +655655664 3545590235 +2912604813 3619255268 +2262821804 4269801431 +681759089 4273710693 +138749469 3988810772 +1817755966 2012927582 +45758061 3089345938 +1842823005 1917463415 +509343200 509343216 +2786352011 839898379 +2918409074 1210420325 1700337246 102504717 +847007217 1459803777 +3444867757 2244848514 2510329576 +1388761694 1367940201 +2445728190 973653513 +597025951 2750867038 +3980907257 4132191435 737294024 +3444731618 3816086031 +1375504866 4069330645 +290795383 3222911056 +1245512870 3222859748 +3634755198 1880879964 +16430575 2370636945 +3840498004 2941755193 +1269599156 3567250521 281088008 +4211535352 334005291 4096774788 4211535336 +435549736 103973099 +1654856964 1254534495 +2858872668 2621691024 +1335818396 2280019537 +1471456980 3544281151 3848445871 +1289072850 3834484090 +1778127374 3855641615 +2131871146 2131871162 +188623025 3594850134 717287863 1675234992 +1386683049 2623057919 3616570894 3322869774 3616570905 4083004936 2620036247 2980772844 4272943703 1124085587 306148069 3549460402 2790834095 2829687744 3194776869 +2994787016 4124691427 +1069752288 2834881211 +712818576 1918996387 +2470682521 2566743166 +1242958776 603808831 1596546816 261858714 3522114319 4204671925 2383422857 3680916051 1155718663 2632091154 353788920 1254936834 1782139585 3645463933 1060367248 4045783043 1480967581 3087906820 2140722479 223888625 1325906621 +1981049743 1898271246 +2264026086 2715616451 +815366345 2693069663 +2542794082 952128619 +2043993471 3167304317 4259011976 +3522051822 1745686703 2073117550 +175003874 727859685 +3527137146 2635471258 +494538650 1341521228 +3983461925 3933111340 +2029050858 1294610765 +4255269751 1720942293 2275564020 3178247238 +1730275397 2133007997 2133007978 2673910938 71241027 +966251299 2726589873 3439419402 +130325933 3884201810 +3052657885 1273278434 +1286172089 2100962444 +3487662330 4241115094 3588818389 +3763090576 2887537291 +285235013 143221132 +4239440092 1455839718 +3674438684 990593292 +2645487334 4023659873 +901599018 1685798886 +3566150682 2266902005 3075855595 +244899617 463945952 +3546585848 2819471733 +3200410388 1610741881 +773585834 1074605211 +2269228614 245665192 +1950513095 3416428096 +1212674475 1889512559 +4034249303 3764448998 +189041334 1927699591 +2565140754 870618818 +1489134973 923124692 +3935963990 2793396337 +306662733 1167259748 +3659141871 1175178798 +3115712095 3095359368 +2974317184 991643213 +2657155625 4061521962 2433985541 +3734535414 1611446087 +251826182 1841036450 +4228074651 1412536324 +1579273793 1882697814 +545814810 1356243947 +1484407789 2101288242 +2159711154 1173420318 1471578405 +2459216858 2584381501 427983098 +549581755 1280487282 +1633600933 3979420346 +3396134069 2151527026 +2550096201 2813179310 +2481614733 2388257383 +1154219059 1893094477 +3464265875 3632056500 +633600442 3585262289 763502557 1178660789 3073340278 +1325659280 4080664245 +1738623284 2804567007 +3858824060 708327719 +3962929726 373032841 +2907670942 1063874370 2305869225 1916117929 +3855133216 4188081915 +1009027121 3733087536 +1567557379 3202831088 +3941927469 2508727419 1806885282 3005891129 2645818585 4113578581 4047451923 254885220 927403231 3436108235 2830956121 +3195954579 3195954563 +471913963 1533368930 +1630226670 1971542090 +3768065292 2608183777 +1290627134 3129562462 689145890 1471879583 +3220296923 78779602 +3600307735 2930785666 +2820206972 457451047 +1565148200 65620733 +2323805271 1127300556 3429389640 +3642894504 2026242155 +2967567687 3120051926 3120051905 +3576184158 3965229823 +2951204296 2974339380 +853161883 4196594831 52626107 +851432553 1291542862 +1626691192 3004494848 835038995 +3549511404 4188409239 +1241374653 949176597 507170466 +2555350146 1194995875 1194995893 +2714879754 3342619821 +104110253 4102321934 4171017022 1909217348 3531854479 +2885989473 2885989489 +3236870530 2723546525 +592552027 4101992274 +1233268792 758621754 3872423635 +4048096209 3879303030 +2091013448 2072789085 +4001336254 3949257929 +4060700525 2771127762 +156565117 768384706 +738311729 2797363392 +121143600 1762979287 1123182961 +4175903651 1996677514 +2594258433 1825872768 +2016627843 3381055012 1664516799 +3608994907 3406587711 +879653583 2122711601 +1506016909 3700013028 +813828299 666097538 984734261 +852753520 1941333077 +2970318105 3456718408 +2582818827 2582818843 +587690806 4050128636 +932190447 1725382702 484055098 +2544214455 3153007539 +2811050074 3480943650 +52783947 1500357415 +3964292081 439099163 3463780852 3079408349 +2951374551 3305104496 +3954010050 3287963235 +3068388448 1220576037 +749284113 1598999494 +864630424 2105264464 +49770128 1337636927 127459282 1107481690 437194742 3704027841 4098195664 561232515 1130208885 1754002283 2239269447 3913102212 155260150 442087293 2830080912 3119893032 2144068610 3553302463 1490671209 3559599307 4136467205 3573759725 2747432629 2513471392 300967925 407385483 1014603040 85091316 1876835193 451935979 666976701 1959156227 2770683614 2313598715 921659151 3242722580 2142157640 731737506 3497687178 1249463336 2022056949 2108852938 1113160740 2584710302 3053084811 3497438237 257873377 1979340521 4004159279 716750925 800162352 3330026089 548937012 613842499 3498905414 2491952886 3101726264 +1794847750 3906943558 3906943569 2456998778 1869800823 +1616703740 1162537717 +2163690819 2662959308 +2699664525 1988517860 1302774715 +3966110894 2319591225 +3796809487 3382636853 +2696687214 1983715129 +533814183 1702049645 +679423769 3644269662 +3750886782 4188736671 2806308446 1892814175 +2214607545 1968986136 2214607529 +2901671229 3347202138 1044115070 +1761031729 399279048 3485178280 493377949 644376525 1130063780 +3278609733 895882307 +1843611699 2282155959 +1314090853 3138964106 +4179101845 3050668700 +3149112897 3167664192 +2260616782 388499929 +3327108196 751841852 +1854583701 2572727196 +1665394999 2062033286 +4282044222 2371785822 127155871 +4130900123 75491912 1059159835 +3329065691 503123592 +830901974 241146078 +2077273021 2793298571 +2515485243 4097195955 610682586 3458747624 192609797 +1938996287 788420414 +4013981521 4085804166 +1996052348 3018716465 +558239118 4014429839 1011696398 2898844414 1898938751 994918809 4014429849 +827798272 2890221829 +2921671036 3673888560 2692763185 3673888551 +417741778 74460051 +2454546652 2454546636 +4170560811 487838040 +1024217809 2187045143 3949354768 +4070237151 3369383944 +1550776274 3829511277 +3824672291 3824672307 +1374320290 1374320306 +903423731 3084406924 4119252087 +3014205145 3217233321 3556604431 2889584520 +3148688103 3148688119 +2544414493 1054711042 +2190799372 2625177825 +2731096237 3353653102 +1834027059 1234167884 +1032789230 3595209401 +3796673723 1718006632 1718006655 901142917 4188492388 +919933268 2775205689 +4145375910 2629231447 +2683227395 1974175984 +546792052 3260021903 +367406 919816559 +700227257 3094562953 1827527998 +2838793325 3116568687 +615124857 817257320 +3331799232 2073153179 +864910237 553733483 +3182904169 3182904185 +585477267 585477251 +2143969234 4254390163 +383052865 842000960 +3274094904 3828790028 1184280517 +2809720771 1717661674 +490343375 2711986703 +734697704 766997755 738802575 212056394 4073531186 2124021351 800894829 3622745387 700927747 228834000 363054954 +1266198300 3941536017 +747226367 269488037 1818159938 3997737147 +1034862140 1444247655 +456401255 974165280 +1239268946 3550384963 +4233603841 1057108630 +3495889204 2294647176 966491353 +3434152123 4121175652 +279854203 2179143675 3319094809 2279809352 2533632281 2676195988 2279809375 2659418382 +3211233798 587098045 +2382538862 758614265 +707959470 3476922098 +324115445 1584956092 +462532949 3035508657 +1125731004 2102755313 +2636473692 3185479633 +1367318405 3752956435 3504873036 +3676041969 1396650084 1537602573 +713526746 3445902891 +3677561662 1333820063 +1768208409 1664971006 +3468994040 2006009211 +316944249 909556584 +2112334655 1924305982 +3224713998 2714498841 +3167991974 3880496449 +3670362339 1200733514 +1082938793 1173018894 +3450487574 1308231670 1308231649 1269067050 +3877796117 1258558679 +4151721989 2485569484 +2855589154 321619075 +476474148 3644500415 +1838494456 806873018 +1270958504 3913741181 +3813073604 3735841787 +3201725987 2609456903 +1624802518 1255742695 +2071834323 1048790871 970602028 +1038858843 3575012690 +2803610426 3174703637 +2633617287 486770556 +4043487249 1025596008 2311934254 2594481992 519544225 1939154820 2017968838 4090955325 4241953901 +1804670205 1382287956 +3038893026 2711462381 104893642 +2261191871 4290636673 +460078297 73648542 +966771987 630777728 +3462220903 4168836211 +3419350716 4120791912 +2624557817 1017404926 +2196894508 1323421249 +2545527436 2004624628 3498419873 +4272243436 1707479250 +2606379847 3590240470 +2244577762 2118389461 +278675418 523767733 +2762685030 3252393894 +2815867926 1292506791 +1426090201 2639144975 +2465936330 1615494450 +3250706284 1881546519 +894230181 2365750700 +2163374127 4163940938 3222407940 1444391291 749941240 1295365457 1444391276 +267006147 267006163 +1478401812 3157545823 3425987695 3425987705 1478401796 +4210972674 543460149 +884952285 953278184 +1498456126 3622584713 +3467817130 223091611 +374277796 374277812 3530001743 +1049408228 4022207183 +866631205 1980781612 +1186384322 331324533 2040737757 2040737739 318898126 +1588465915 812816831 117750564 +3371059279 2652623950 +1459217238 1360931309 +1360607285 3753081724 +1268542837 2084589347 +2398070075 3833522152 1044454386 +4051263005 3873137666 +2320006328 3467634490 +3944542518 1418704903 +2134452807 2382204374 +2262615456 3985316595 +1127451008 933915980 +1414000989 172029282 +2360117432 731593147 +1474561464 334823611 +3445333261 1412971364 +676848864 2111809467 +2809893967 1219552376 2698974789 3178572245 1202774754 2217741979 +2547462683 583262340 +4084664120 2086690093 +3397775853 4279580473 +4024406888 83168427 +1218215534 1218215550 +1081425531 93864799 +3999152060 4289490791 +3526930609 3889616726 +1422508932 1800935470 +1273017227 1087366840 4256867266 1498554485 +529649889 2475414048 +3843487278 3843487294 +2118307670 249698617 422339694 +960025864 1482427404 +4292963573 2488035994 +74090105 1823584382 +654261695 3681545158 +3797318970 3623882786 3063931989 3740340403 649742850 642448389 852512455 3994123232 2109398278 2743759247 3592488425 1333012193 1776356070 2365267190 532486910 3673507157 831327297 657644615 946514920 3391179659 821284953 552843017 343884487 1443336779 230377427 1822244627 1071318882 3292966618 3448543423 2147456378 1976759725 4288010149 503463892 2206728327 571886314 3868804462 872750655 744648924 2572872602 4188529559 1586495806 3562777152 750858101 1804176840 2836173334 +762687350 2731490113 +252726245 2611444076 +410095275 633575202 +2100852488 199503408 +1060833426 468614611 +3633557667 2619506973 +1077408359 2877556218 +956136513 4161444438 +1681590448 3733657012 1958377501 +3125540166 1706766650 4019649937 2341674273 +184093719 1607207658 +515975445 2853719998 +1697531516 3008736044 +372345937 1090511760 +607395923 3948628787 +3740596017 490553773 3330537327 3124013224 2053956965 73963758 3776974658 3118064312 776640198 4154737350 1820949111 3499002201 3251255731 2015384383 4023738167 2289936909 2751240025 4024251524 3711561837 1449843427 533940428 1174778781 263744680 3159991905 4048314144 3467765685 3914117913 1734433858 3041226569 2990566986 1752208743 4150613967 322523813 2586151738 2926805702 3717031628 14809086 1709900031 3583405682 958364870 2980485735 3220123366 2859039649 1024566160 3776485549 953444155 3724761475 2631919931 3537439659 2478959192 794057842 +3576552273 3895476368 +3558913107 1358922356 +3339192745 4205262094 +1870939224 3615597053 +2651904652 1619528311 +4101601991 2721859414 +3755044259 4189034378 +3778908379 1860896978 +585479212 463118657 +113890921 415008590 +438520924 2173777105 +3679977076 407019743 +3204654943 284621448 +3787395428 4045579815 3284689023 +1850199962 889966461 +3656199070 2925242793 +1555776278 281713575 +3073609219 2801947477 1764265642 1628794993 3238165565 1066210134 1217208710 1188606448 +2477904521 2756590389 +2059233728 4103464859 +910958608 832622187 +990507788 4238973921 +3830240581 2851322764 +593453620 3811022809 +2453157655 1119393350 2726140279 +785218870 3816561671 +3067296184 2256788667 +3852584937 1722659800 +3381058053 1145648602 +2212861159 4042137842 +2633088349 1837963618 +541986156 1189028119 +2949494150 1168851962 +4080994769 707880304 +1517263044 646536836 2072279823 1946295018 2367359919 565017737 +3345392646 3969135969 +3307693252 553885855 +149763739 2825713170 +2936036920 1754517499 +3704032373 4279112073 +3803122982 2342728765 4287738561 811373411 1415569315 934596570 693930097 +530939279 1619306520 +2184697558 2079662497 +2976573824 3970781826 +4002931179 3872107535 2216207604 +2069041369 2069041353 +447275695 631920620 631920635 2799491448 +2085973678 2980952818 1753037807 1814387001 1753037817 +125241302 2721725110 +2750883041 4133397267 4279176758 +3139953426 2982835525 +2166727597 3637152773 4215318866 4215318852 +4078414067 3869096363 84222467 3482549763 1563872756 1809984513 2065740732 706859871 3900108696 1974928101 384957443 1861926527 501503281 1352091566 +2661481942 2201046745 +1148292459 2539255954 +487544617 3894818200 +939591479 1620990864 2773097847 4107527760 1620990860 +3598736279 1129111554 +4031904744 1032240080 +2183769773 2493381202 +1724113859 2304740348 2446312678 1030315431 +1175554853 2764809729 +4059345184 70440293 +786295897 786295881 +1571949271 2370320652 +3393798426 2337373163 1011225314 +3921900549 3890051249 2440577269 2140485841 2440577257 +3404303415 3490366359 +1167415060 2652378223 +2669856964 4088159794 2205794811 +692195176 446477724 4215269781 4215269763 1316942416 1376258230 4215269780 1526612157 984944615 +3163189752 1644057837 3320932731 134805139 2130608768 +3067887010 2125792789 +2982161333 2836406545 912684466 +1588571015 2508916118 +297975677 1922265556 538711138 3888808258 3025260555 +3742768882 3699569682 2292221150 +2817907757 3892236267 +2975622653 829721940 +452912543 507738462 +1016787607 968398238 +3791779701 181800936 2433021701 2026610736 1041796412 +3627945186 1538154725 +2365188420 829044233 +872430764 4197942072 +1381909989 1053018966 +1905896979 102987927 3891070956 +3577764869 3109084122 +1368891660 29886176 +2052149943 1157969424 +2589427482 3950823669 +3060687469 1544046802 2032688219 +2419516170 275212475 +1268198245 1534650012 +1172566296 1356286047 +2979024414 2779140113 2754279734 +2699668621 2653745138 +1923003634 1641470195 +1236286691 3815758154 +2835008398 55603484 1403129616 +2677975529 4259231986 +3970822637 92087365 2194921490 +3627349767 3732971539 1650515968 +3842112531 3842112515 +3406386818 2953996957 2216393742 565391029 +3401579089 2768216959 +902870172 380391052 +3558916645 3036026512 191828332 3318639953 345088044 +848497009 2897264129 +1697770972 697921863 +1457077657 1358690270 +1119970048 376363283 +877690915 2109323018 +3218406889 3846944216 +45259272 1193835165 +3248307837 1200185044 +3840257496 764455693 +2822200925 740920418 +1775938505 3508552761 +2873025457 2411248311 1169146454 +244648326 4256615367 +3976526620 987188497 987188487 +458414494 3639381869 2708247465 +3174050259 2781992762 +2257851225 2894418724 +462287886 1853305369 +342600009 191717096 +1503418989 2116180370 +2518465648 1635168715 +1733522761 3937528249 4049707502 +2470095700 4117525755 +2247530929 2486432166 +644442019 451814812 +2313591335 1918488160 +1637816750 1192872754 +379383309 1142450736 1504523951 2499417044 +527467450 1019854654 +179180388 872973951 +805511774 4065695048 494674855 3646254588 +3910352699 1524847305 142414334 +1728652068 1734503119 1728652084 +1672730179 314177473 +468069 1883130618 +3635346796 2272850199 +4189417983 2665252026 +2447463874 1740243043 3560915074 2899221451 2690450382 +4196638491 3036861349 +1871900172 2957819127 +4245170638 4190082904 +1263459852 2569506039 4198680119 4097557084 +3058299121 3882240879 +692575681 3173127894 2460611313 +3600444076 2165697751 +457806895 601114094 +2875412709 2135987235 991119370 2992134252 +682070135 1992846150 +1012890099 4249680268 +1757193731 3824768682 +3238074882 3602641187 +3063931351 3063931335 +3418444001 2723303968 +3710635530 1879619989 +1311276214 3216790161 +2383460814 4137469082 +1447720351 1983326558 +3820197334 1236590577 +2907629893 406402970 +2125972733 2382316840 +172289603 1837306741 +4208372890 2045884011 +4058103009 996060930 2331651668 123477663 3042690340 2807846432 +1021831434 3943946925 +1262262443 1391599832 +3588784084 1424310324 +352861788 2012883655 +3182045668 1994387967 193581528 1994387945 +220158024 4032297291 +2368677616 1405444189 +3676915761 1773664961 855418150 +3875961644 1404270656 3677611585 2671661517 3768855228 1404270679 2082129316 +806790116 2687228879 +1872057396 3692269017 +278786470 3466815575 +4164868777 1945253912 +2034507150 1949992591 +320381502 266870623 +1823480146 3689902586 1798822931 +1272493941 3676884284 +3227674439 3017397204 2231946391 3201692568 750818987 568737592 3139461384 3757592176 2174680781 2829834904 3908984092 2779882193 +3744917042 2506907827 +1595705718 507520365 1844241874 1234447178 941794625 804021457 +403339889 1233043440 +3119588119 3449437478 +3753620430 41684313 +4101108199 3059732150 +2000739883 4107379288 +4173297162 2674315693 +1581931230 1581931214 +2389721997 3350877924 +3904269211 1112542107 +4124972108 1486484385 +1479097208 1948687057 1088986619 1088986604 +153020659 1319679642 1536645140 826504131 1128245103 623636621 +4208991241 4157350456 +3373672851 551776890 344702829 839720960 +3999214532 2355910319 +3102729860 3102729876 +4146403471 2657462542 +1078053252 2878356169 +2399088439 1387746182 +2330564323 779949520 +2336984387 2330943594 +3472462465 724607966 1407295775 +2963880297 3144091835 2204459090 2204459086 +4181660496 2924177141 +1166400708 901417119 2946189956 +4253314076 336440016 863383569 +3068377160 3068377176 +4224497720 2605056045 +354430113 3802546528 +3550161207 867571106 +3342814540 4104564407 +3492306206 3492306190 +4150774195 404163895 +714439741 100129457 +3527540852 2151374357 1910945423 +637435659 3668049492 +951098528 951098544 +2307435284 2519027823 +1682109556 702385451 +3796042548 1953172812 +3053737248 664285691 +1009496255 452584426 +962158662 578456122 1192616081 1192616070 2377289271 +132579328 1580781912 1488914395 +1977460244 2683072889 +625559540 4232103496 +2239127837 911925428 +2838287707 2895371858 +383203920 3735199305 936656772 +2779709434 3430741661 +901311188 415291463 +1158447081 2611829720 +2346155191 4207983395 +2077590242 431381994 3541895619 +2496427288 3008924214 4074338407 +2417620606 3844250618 +3785520636 784317361 +541363980 2743507864 +2598879907 2136590109 3054929799 2111268508 3054929808 +3610841551 2648115416 +258535346 2628329306 4096873779 +383047106 3003940963 +2507832578 1372768821 +661945736 2757860619 +4258850515 1869831738 +4216066496 2437461474 +3715771327 3715771311 +2171748248 2171748232 +84274005 1028749002 +2857600526 796657689 +44834206 44834190 +1860803639 3502303878 +3522635601 985512106 +671128948 1828183439 +2870131316 2099365297 3757835773 3112805451 3363294302 2237076274 4184687355 149275026 2029288817 578651915 1433403592 575145528 +2494347907 901837415 2397674556 +3360676995 1641930276 +2564666396 3206654220 +1106772275 208266074 +116212051 981325242 +3523499172 3523499188 +3517100651 3466080408 +4134471461 2218494026 +1376363044 1227505343 3447756281 +2458385081 1437861001 1695527230 +2926039215 2556818924 +1918358624 1615024933 +4249495464 2124438467 +3841166527 3393687089 +761229797 1379945324 +3081930238 621803050 738782943 1014432746 738782921 +4111613415 4111613431 +812361124 3378451343 3378451352 3852583972 3715481897 +3889044539 611741938 +2489497770 1097380763 +3791779695 4288106426 3308349677 3307096966 1295472416 941130670 903099556 4160784077 +2903335930 1024925909 +1058150092 1058150108 +448734200 317038445 +3158767243 2628739512 +628433272 1868804077 +3392940210 246681637 +789891966 2612811615 +1750880647 1959116435 +1122269192 1437136011 +27006333 3208403572 +1991698146 3287119299 +2468724859 527303090 +894117358 3544983852 +1110975340 901773952 1110975356 2858402583 +1139292502 3242100769 +3644918739 3563429178 +579316838 2367051369 +1701806201 3085393992 +3063480643 3489856340 3336664870 988713153 2396061693 +615495302 521781447 +1023098383 243446158 +1797051252 308338585 2273312200 +490982599 3636157782 +2465704526 3780569129 +3206259307 3459098927 +804374753 804374769 +1573407804 3729785457 1760810993 +1521234762 2638579045 +3703380106 1064909116 +27170392 3836128411 +3883828274 2940733402 2940733389 1971449502 +3414106548 220335705 +3092797034 2635073755 +158124024 158124008 +2623802738 2743151205 +2569207264 2314671737 +3558896380 3406657499 +1277391311 2865506520 +2926138111 2967945281 901679292 2395842430 +688072332 1690403488 469085793 +2152817926 512971601 512971590 102893687 +1421834146 191452163 +2652771240 2438525309 +812797906 4245648616 +641154176 2834578821 +1023022479 2499214360 +2962067458 3054103431 +1543948823 4121961008 +272891273 323323077 1657292178 +1110351427 2383469616 +3283760332 3928038711 +1415392200 228871413 +2370264637 2757319188 +1721074155 1750828258 +3855413241 3130901758 +3405240232 740851069 +3695248873 3991280045 +2627214665 3131581627 3421163960 +2183613654 2137556897 +3179534801 1367604157 +1397055495 3842012937 64194783 +2250709159 3599486688 +368877220 1085127743 +269613678 3125623609 +3533032321 47143958 +3159984988 3159984972 +3607367701 2422558986 +668717232 3774644252 1862894869 +1807826903 2016903024 +3987570326 1890086774 +143159634 3234489349 +2183254166 2183254150 +796085620 646114703 +2091699656 201847243 +2576310442 1044570214 +809281048 125401037 +4061255677 54141172 142729231 +3905504117 3923063082 +1952917614 1952917630 +3274719258 1593108733 +3138793920 1139822917 +4159064032 3997422707 2449151520 +3628939652 3628939668 93424329 +3405980588 1106323415 +2005582889 3250058572 +86134585 1323106000 +3035506900 2800371119 +2390579057 3226511078 +2322164031 685910250 +56234827 2446090004 +3690767688 2528653387 2700354147 1839040451 154434288 +3424552465 4215290568 1310492875 +4839877 960614682 +2747710271 2839332015 430546798 +3280329341 1219949250 1985722635 973088610 +3999557688 2148536365 +3285171465 1225168184 593287033 1326015007 4150768053 593287022 3874562765 4061183667 1279650528 +3734970326 1249844721 +3326848446 4199732937 +3843798279 3248362278 2979920384 3843798295 +4224013992 4289161853 +4036373859 527004380 +452683300 2646723263 +4044501710 3604844626 +663164391 547846816 +1184557386 3431495754 2487938725 +359063900 217367495 +3692799717 1311090330 +3796559517 3796559501 +200763648 3598338835 +3462107095 1254649154 +2768689714 4224285875 +3610892603 3822488153 185661426 +1132935646 2428932095 736106601 +2383460804 70826448 +772416976 3905858109 +2030826337 4006617504 +2143751586 2791166884 +1340422329 3766378421 +114846158 962898892 +765480136 1776735715 2606292701 1776735732 3745844592 +2136473830 1569286679 +2959651042 2959651058 +2232942375 2232942391 +2219626534 738167234 4012341916 1793829835 3019503145 +1377151835 2468134994 +1548874304 703660132 +1328400363 2417080052 +1136219249 2334359808 +3981140032 3633509784 +783090063 156857358 +232936868 775143171 +1519167226 1826772245 +4027733324 3463094229 +2285087483 1683368237 +922375443 2818156186 922375427 +2144529237 2382919370 +623640678 1627966886 +117442958 2467236505 +2741571817 2732234309 +2748662070 1593279254 515221511 +1690016249 2483301173 +140017770 2370971341 +3413120661 3597896842 +3828945658 224913347 +147547954 147547938 +3955705547 1594805231 4122243476 +2749152250 4001098397 +3574561459 442378202 442378188 +3786273947 1696675423 3755479044 357720101 1696675400 +4061903778 84878506 3282591747 1844739182 84878525 +1858564425 1858564441 +3796345027 4190245628 +2616250235 4145454770 +2810960433 4062739248 1538907329 3543481735 2810960417 1538907350 +1835834297 4210631720 +1283486295 3308519152 1624921027 +1721980870 1495477409 +3643850739 3669896090 +1855723519 515491432 +1260538639 2590630853 +1488983132 270328904 +3360076766 792055642 +1757506655 314093835 1199413640 +3455446919 3455446935 +31719385 4143659605 76567073 227565660 2602781653 194010426 1345407456 1200961752 3538666114 3538666120 +1604023977 716950552 +242186643 1283220076 +3246052664 3832425427 +3123097301 3756341596 +2720780259 771244618 +3152075161 813895083 +1230214687 2375373512 +654866596 4252674291 +3901164872 1541773034 +1405517992 2306639979 +3124126146 2392312472 3681062441 +3502644199 2421919250 +1363635922 2435624450 +1773843099 199698948 +3755417349 1688589530 +764621818 571256601 +3746250295 317764276 +794111052 2728617139 +3858540613 1180425853 1371333786 +1530914004 2039822777 +2196782955 2335429986 +2968520495 3101380344 +3120701535 2752152843 +3533891727 4140664069 3887717936 +1887761838 3478044911 +388259795 3896238144 +893557195 1165650785 +413720436 2343102920 413720420 +410184951 1258217314 +3950296394 3950296410 +71780291 2134243306 +1602681359 1887151512 +1631215304 3605214429 +3739955265 2365049190 +3006815407 212296186 +1122699084 2262129413 2496876451 234045400 2795534217 3080131659 1601342207 2609525864 1859433716 +3116526301 3914147115 1986338498 1986338517 1242446306 +178501276 1538815896 +4064132853 1344324571 2738754278 +1170490289 2230751152 +2125599248 188923624 +467942805 2102194570 3273666848 2102194588 +3475077612 556600572 1158623360 3786241281 +3317058363 2029546980 +3661713832 1040487875 +981767389 4223031266 +2778583299 3127904170 +3580218866 3779277797 +2045784357 438132012 +633863114 1137794797 +3501092254 3449961282 546738111 +2196491951 3359006072 +1583751569 1404795735 +1948956773 2577296789 318707992 1145063148 +890722981 370198492 +2993934127 2993934143 4120533115 +3635484253 990148180 +1459295381 2185324170 2185324188 +1608021201 2998920464 +1334787061 863724202 +194423041 1059851392 +2467759181 3661350194 +2887813438 892865673 +2823124491 4190936953 2949950766 +4079817343 1324621310 +2902835345 3208845857 4044235846 +512045710 2094362649 3605118354 +1026348452 2161433102 1971045273 4025381980 3614009301 2329209288 4053029161 1971045272 1971045263 3603616804 +2752122484 1693135071 +1142462120 3669305981 1142462136 +325748558 3736272857 +3567096536 2349738523 +2481596095 2560294590 +1623675482 3016139709 +4243500941 3316198130 +11625404 3544187111 +2527187646 3737043209 +3014685773 2715087456 265836936 476470706 3242159321 +2561714345 992459790 +945136661 3285273884 +1222002394 3454104214 +384314942 2696973150 1300286367 +1083959803 3865746111 +113438467 2816360892 +1528203340 419093893 1858738785 3374810784 2756010374 +3616341887 3522573566 +2656390804 431048026 +498705763 775903946 2646340979 3252904986 +2007344292 1693216680 +2196126527 1332692008 +1021772599 2758330473 +4121942490 1202953515 2091057871 2678471074 1974896065 3950304722 1202953532 +206603318 2418572001 245545094 +2806769650 1022423397 +279626892 2244825271 2244825248 525584860 3369298017 +4003209884 2965407047 +3552512209 649781510 +1248352917 837353593 +2011753047 447276774 +1496758573 2936145563 3339410834 +1947364296 3349532865 +2136710899 1882929306 +2087235334 828681553 +720545835 3338582946 +2716091632 1583001181 +2298384303 976164817 +2130724772 2130724788 +1645130293 2053003302 +435243604 435243588 +3369570748 609638759 +1058840002 2170406350 +1872607689 347766331 1053622840 +3695996915 3209968538 +1148874869 1103038506 834596588 1148874853 +1776501225 2579546584 +2823965141 3465165386 +1864532857 1817507710 +3475057886 2703015294 2109189927 3185246536 2287091338 3578164268 8005832 2703015266 3955557777 3883532668 3775944231 +4254416692 1438494601 +2320679886 2387230041 673909586 1306428249 +620957939 3678127735 919842458 +3306775099 2041539838 +167023968 339807291 +3304020396 2420392409 +4208889034 116653619 +219497657 2693124107 2196463240 +1869537065 2492026254 +1838409125 617775788 +1970357004 3981216737 +2582631461 2039150124 +413532842 2002137485 +3565841323 1088912930 1768667678 +1724623672 4014001502 3708233186 3175349483 +798567457 2525683883 +1389912183 2124824308 500357673 3785349958 +3748353317 3907223553 +4238445439 827234558 +135180463 1579164526 +2804477051 2691450290 +3882714306 325582197 +324564995 2960187316 +670935651 308529425 +2153427932 3939050321 +1178085812 1047111247 1047111256 844810581 +3000722791 4133527840 +1606191079 2630480032 +2545538081 1536278609 4203278326 +2228245464 2720566182 2115459955 933711648 2293233039 1993811316 3958635803 +756577315 3636086685 1134974224 +250513494 3615530855 +1225336815 380059451 3899252024 +1869408528 2020795427 +3127462439 1556963513 4224972851 4224972836 2596256630 +2330845338 1118278842 +4236566998 1858903637 +3252059429 1284958455 +709771396 3135199599 +2238506345 1936532558 +1389405315 3782408746 +417348922 614120469 +3663769567 439771292 +3582145191 4117812137 +1934643145 1349359992 +157929503 4036141256 +4199546646 569282481 +1115839766 1795207671 +3417059197 487506388 +2259162139 362260114 +2659847900 689028406 +3979448158 2108049674 4284653951 2871418498 2269395710 4284653929 508588336 3271864553 +511838243 1562682269 699584266 3229354256 +1764829334 1604463018 749545846 778232871 +3511808757 4058726099 659513485 659513498 +3249473895 856942962 1301007670 +217284898 2236893333 +202284594 755173541 +3532730877 2006036802 +695073280 1614778843 1614778828 941657605 4112286264 +348554874 985357409 1131888902 +142825281 2814532416 +2550714989 3269673348 +143507113 2773598745 539173902 +2672407676 1023876903 +886874451 1325059030 +3250223411 3668183223 +3924907106 2833765973 +3276235423 2005217628 +4229615052 2130743123 +2072102944 3402253720 +1932730991 1480588716 +4036460936 435091619 +4221502112 3317193595 +1291608124 343982512 768511226 752696980 995266737 3031704673 2449509659 1866741584 795257378 4226466731 1025603455 3996513818 +2726952024 2386895360 2627437591 926432923 551365792 2055895027 +3346707887 3039560302 3039560312 2065709521 2890392315 +636851832 966516475 +1726168376 800677677 +481824974 974985305 +2752435264 2203590853 +2261997276 3823337538 +980153116 334476561 +1419423879 3516970386 3516970387 4125506014 3516970372 3014357791 1310424793 +3282921302 1610198129 +2857969508 2388197993 +1153816945 3027586278 +2035083513 2584613231 203937724 847527134 3977428968 2601390837 +2481407940 450022096 +1921709097 1921709113 +1149022327 1196018512 +2037206215 2919453514 3994017089 3994017110 +3280244421 3280244437 +2229503513 3026972392 +4223760619 1016158690 +3127711265 2595870198 2290864721 +2713787798 956404519 +3024202533 164154461 3898633018 +1546612205 195693572 +2346427330 2346427346 +862750664 3151609821 +3007638663 3162527894 +1911751273 2434848063 +250383942 2216340549 +2558792242 205211099 2388174230 +1882117813 1320943338 +1069159780 3511445848 +1567226345 4141115854 +2705471351 1379749958 +401738307 883959847 4110821244 +4236354649 2177177231 +1475879895 1386244976 1386244966 +1244149675 1750049314 1315452373 1767659480 +2916427884 3695137077 3711914699 4234111736 2210444948 +1474240061 2436667906 +2329393746 35179004 +4275062929 4275062913 +1827542180 1098866376 2714016409 2373273892 +2600096856 1900991004 +553607734 184093719 671587089 +1454242798 1962647570 +1664843657 3215574200 +2032345027 1967849468 +2586595292 2812820678 3089811573 1502431132 1616482364 832312114 591394749 832312101 2504668772 4121972629 1216127210 4222638331 2733873859 +2226648372 3115734431 +697920652 3418372257 3418372256 1018626524 3418372279 142991457 1620649312 3280213803 +32196933 1248089996 +3977292785 1252613706 +3536486568 2513179559 +3911260445 190902763 +3802658521 2808715144 +4153885444 3340664671 +306914686 873992047 1589456035 3868389250 +12063921 1054643884 3536360112 3536360103 +1563842916 2846641487 +3776693584 2931268835 +4246734324 9168416 +1950656872 1950656888 +1837904556 531875031 +3335088235 1510957172 +458268569 2565553630 +41498759 1809054848 +911263577 2379493928 +1698609079 3541590676 +1121034371 3003100714 +3095410432 1909888275 1847288120 969709275 +523457593 523457577 +1630920525 3005038757 1422820914 +129133154 2145220693 +779707100 85368913 +2211073541 3492962422 +1063044446 487240447 +3327429148 3327429132 +3459549960 4072273363 +1598617947 1524664900 +2217380487 2516062870 +3380263129 87096712 +2729795401 2729795417 +1323261214 1201641023 +993723557 3806875578 +448811674 3074853390 +3598677589 4289152970 +2449191938 1165844622 +1649895612 2342117351 +2955774350 3853486735 +768590246 3289241665 +3494067925 2933647708 +3346707893 2180388090 143166739 3140226026 2421604685 2421604698 +992695103 3790544047 +1711543407 124529336 +1315484244 3885311912 3268459065 +861895506 827269637 3819047743 2043407305 3287659774 +551753320 763119037 +304286197 2416430988 +3573584562 31911461 3704926235 1135681315 831060557 3000239114 29339166 +2973186140 1441642695 +1862956280 2080146592 3312853627 +515483491 3846835037 +308482690 1945510581 +2415325429 2112840440 +1570012775 3514724217 3083009078 1743971940 2707893118 678182655 +835912190 4122534635 +2946078397 734546818 +1094484766 394926910 3494012991 +112744125 1362135938 1366007221 +1184924945 1886538596 +1853569543 2884278046 +1777651956 3227840527 +2434451490 2434451506 3768599850 +443291608 641988860 +3370355566 3749456862 +321027977 2823734456 +506792810 4034049244 +3296375033 1397729647 +1763291289 208732382 +2667385013 4251012348 +2216353145 2439900436 +2485659864 1251979815 +2622622867 2821311354 +1239993474 603312285 +4215305739 2440680276 +1854246627 1784099399 +156390433 2686337105 3449450464 +2072964754 1567980558 +3972794944 1618208975 +309555205 767904829 2911703683 767904810 280582106 +3200749134 2720335065 +1722344917 4252483180 +3940556508 3940556492 +3518427055 3522908270 +4030008581 3432099833 +1957060710 1957060726 +2289624268 2723163447 +1348337513 1511510232 +829884379 3110165956 +4121836967 1749749238 +3835632852 925335111 +3725942665 614818990 1465742076 +2888747977 1558275128 +3682856313 162452840 +1759495487 2269504764 +660852138 2353420818 2887565979 +1775158014 699860941 +2503553292 4115855098 +185040561 1591039296 +2543280191 1718777852 +3927437564 889331372 +3619863347 3666653530 +4227895775 3665695371 2481299976 3665695388 +1596588507 2513642910 +974548506 2337231613 +2950790076 1961579376 +3055414541 3092800613 3189517156 +2990810959 4031373656 +3679667738 3679667722 +3311493381 3175856858 +3679127099 1914359524 +548002201 3280940670 2403889621 1678455388 +3635788338 1477713061 +4137466971 2478605124 +3234151140 3511879657 1790721508 1518056703 1505610447 1773943902 +992969356 51466528 +3543958555 2739140242 +2860256799 2152348382 +3789425808 546162339 +4083157140 2560754092 +1248958203 3871772563 735096114 +2294036201 692744408 +1034819343 672025742 +2432680572 3198101809 +3830498011 1176682180 +3820986696 3467306077 +2510079447 1556836710 +698032656 2402721571 2134279699 698032640 2818351228 +1362733627 415693540 +1894768487 815574816 +3071404619 2576800632 +1373747752 3829265862 646579330 2375838711 +115512025 2582541839 +1553237496 3050235245 +2736618015 3432487015 +3759792160 925413540 +3724316226 3084390734 3954855426 1306904651 +1850957341 4547605 +3682317811 1992256922 +4153214370 3519708861 +1319340504 1500807539 2742157069 2336891168 +1080945629 3687323665 1136595254 +1428167673 4203481320 +4001756579 1851504669 +904180683 2896956621 +1240123971 2102518525 1030722394 +2275707188 3477537612 2563387575 +2059498538 1753865741 +3973859466 1757819195 +743816892 1854459504 1996171479 743816876 +4171471585 4117830541 +3421436951 2175220822 4014985671 3029893642 3046671248 4115651412 266117117 1444197805 4115651395 +2261344452 389944248 4077081737 389944239 2611934852 +2583496917 1772624237 +3125468128 1527916681 +600833123 3278524362 +2265938160 2371576277 +416246792 377950347 +4077065469 3611174389 2329545282 +1844624212 2977749160 1763501369 +4288533624 831249530 +3558583431 1192844361 +471072838 2478751886 2114413125 4194146313 3221706197 3641146660 2038197793 3402235816 2044823266 +3225482863 2835051025 356774062 838070700 +2074267882 2337202253 2821402437 +1915268270 1678235119 1678235129 1946677001 1915268286 +1179546856 2954441629 3859728687 2360637472 3105440190 +1746516854 482867819 +3918036535 42993047 +2452520679 103925174 +2035925082 1649003965 1697563683 1697563701 3885299958 +969793137 577799540 1532240221 1880435696 +3568598068 4229917887 3568598052 +275262016 335184581 335184595 275262032 +4207813305 1238056501 +3447622008 2119801349 +3923187758 528659436 1967951214 3770105041 1947917999 +3932532420 1394055772 +2648504895 3252547902 +227886853 1715177977 +4272287344 126890973 +160113537 2265506826 +323690965 877019722 +1989035755 2365170658 +1177588588 3933737751 +4029554476 1419455335 4029554492 +2598015102 1141995081 +3633376994 1477295326 2074104169 +1613172170 662353147 +3830000297 137242648 +2768912423 4129488224 +4076285903 2294888972 +3682863328 1893333171 +1311260166 2946834727 257532769 +4192323946 2072418417 4271867617 4145639774 1517030799 4172293318 3362787789 +1208115740 2009100817 +2399999251 3683558563 +742369890 742369906 +751913651 751913635 +210188409 4266776670 836626024 4005157871 +3247607383 1201659368 +2347318185 230933930 3911772942 426379033 426379022 1170955007 +1691108325 2458837370 2458837371 3354843928 2458837356 +3674994272 869587251 +4140201178 1416229693 +2409965928 1749652373 4105539664 3235074972 +2213115832 2213115816 +456236506 2404469070 +3793804146 2361025989 340820114 +1241275252 2471620038 +4147760183 2229917272 2943676596 3006573417 1727822470 +1385527925 1984939580 +326801099 3149569007 1962631572 +2880583128 2054498164 +3251178547 3251178531 +2065104302 3934083130 2742294422 854118165 +2663715959 1732196166 +4263692075 1002408098 +1928923642 64632533 +3910908755 3910908739 1235739564 +1149702063 3043973241 2645334375 1689516388 2645916982 +1757386528 94037875 +3275911201 2448542324 +690735784 1272592067 +3509716617 4248398495 179567854 3670034872 +4125751829 1800375482 +2435511857 1112827630 3080818479 +1474433093 2648677516 +2243868491 227276195 2514853342 +4271082069 1270742889 +3952539483 967271492 +3823669445 3728993369 +2504536521 3383123822 +1011432999 239916918 3807841316 +2353393079 2299868944 +3263193592 672807291 +2694555228 1496835173 +4022507735 710221396 +3169959781 3583003642 +2269515396 2001263071 +3814035334 1706094561 +154846036 3319275688 2284947124 3682696505 2268169518 +2028837630 792990069 +83168447 3040988877 1058224234 +2992890580 2537421471 2992890564 +979777527 3857324486 +3303064301 3671251730 +1496606183 1429586425 +3126649969 1188663574 +4042503137 816065343 +2393786892 2824769761 +1530575380 459744264 +3322334193 3604776064 +3918434244 1869369759 +2965659253 3122704956 +4194299261 3647490571 +812421513 3029410719 +1879245190 1275167686 3669714423 +466372436 3827897880 +3812280120 2192190241 +2261071110 2261071126 +4084034191 3723750398 +47978579 3548007084 +654281677 826872740 +3548834231 3026316048 103090723 3548834215 +3176542029 2058191329 +3207151170 3207151186 +3668617644 2536333562 +166205595 3793877599 861846532 +1028141271 1336205926 +1528179814 1863113137 +2737841162 2701100901 +3468850295 3478047138 +1278488931 951546951 +1281774658 3930526542 2266407907 +2228166097 3809210384 +1122086629 1122086645 +962197025 980660817 +3197425218 2393591883 +4157722167 787930989 1235142986 +3817487999 2980078078 +1290168780 3669527607 1904515040 3669527585 +2912417566 1681523753 +4176141241 2328539489 +1909439701 2318205811 3235638636 +486626775 618758732 +3389402975 1723634312 636351953 3023237217 1723634334 1121627164 +2662335013 657998713 +1963339827 1807605836 3890747319 1383302278 4232024141 3890747296 +2348400658 1814649925 +2434348359 2135471730 +956635874 956635890 +2955672205 3795545074 +1748599865 1267410344 +899037193 1902398925 1066572768 138681275 3191318386 3191318373 3023542193 1083350406 4090192307 1686358960 +1655359339 4167041817 +1480132275 2495974362 +1601012442 325385515 +1779133432 3891984251 +3076141175 877316649 +3155690355 2362273306 +3077112746 1683014797 2617155942 2250604549 +676075352 3351822235 +3776418176 1975149752 +362893689 955331201 2523948646 +3152950233 2969280158 2969280136 +1521730023 1355148333 +1059761209 2366375215 1093247627 268816904 +2070938886 2999782146 2059949109 +124232105 1361280270 +2310802931 270975211 +457307037 46691691 +1123846473 3163299310 +3961497307 3241530015 +1745015046 3262057569 +1872366914 4051885813 +180217509 2381452716 +2309195672 1148089435 +1581786368 1804746501 +2288563539 3908170291 3890234970 +3854990653 4101449492 +2809847327 2903663671 +524364799 524364783 +3365653989 3761581813 190775080 483429661 315653442 3695457059 483429642 3712234681 2990874490 +4126237585 1698771536 +229214588 4259540519 +2382922170 753130359 2382922154 +4009798735 4009798751 +4146415805 714434615 3379491465 +4134850205 2531344692 +476625523 735937306 +3196134157 4064947556 4064947579 +3543271874 969235573 +3080942358 743320487 +76923215 2260684622 +3734193791 3690883115 3772250600 +3772546841 104075240 +1138374400 1169594075 +441627343 1060076494 +3456887131 660062206 +3652643051 3802522517 +3737899020 3336078071 +3392897685 1861470625 1254516832 1825409338 +1200824675 2753479475 1896342608 +843203791 3981595086 +1048688638 2648673055 2783445470 +3800591407 3418508782 +4232578041 509493502 +1795087406 734320598 +1553500005 3001000605 689775610 +3623717683 924983628 +560305121 1944570656 +963268008 173555581 +501536898 2436945077 +3948027200 1713276699 1713276684 2990803909 +1001064067 2084970086 +3164940746 3254831355 +1562197702 125117201 2154841680 2003843108 +2313922195 2968992122 19883287 19883264 2968992108 +775196919 2392896341 +2503662254 2846251273 2577809391 2503662270 +844028874 4230217467 +2050755348 2156228719 +2861796629 2605127690 +1885762777 208098658 +4243972460 3850059211 +3373254805 416858780 +1320996136 456586749 +1132499166 560205183 +2221470099 2275694445 +4193419274 2657220707 +2806323681 1097621928 2877872185 209393880 +447630375 660726134 +3686729735 4105806614 +2259513686 1493789287 +1212747905 2416434219 +3834585118 474351298 2906554430 +846458370 368938506 +4258599393 2003510560 +70581527 70581511 +283315621 980318892 +2726167179 1559973295 1465778388 +127675921 1915028406 +97741305 4046005705 617599742 3081297007 4046005726 +2683418707 2443324608 +2842626479 1758215790 +3988835226 3578716515 +2094008345 509690089 2491203422 +3485272359 764766304 +2718660370 705458515 +2994931064 2084674541 2084674555 +1904415566 4003817661 1039964506 +230262319 3389930478 +1196171146 3335890477 +1503818953 1244108429 +3567082576 62411253 3492349116 +1446265484 1078248055 +1300603397 551648372 +1531296019 4042390423 3967138319 4170130943 3250739450 4170130915 382814701 4042390400 +990015729 3587689328 +1636695182 3216263705 +4283434747 3858431282 +1466741984 1552481800 +1891465432 2348646951 +3143557822 3026120969 3070322862 3959024546 276141001 +83325348 3436326153 417876065 1638009763 2127924691 3748028406 752344327 2311324326 4056791234 3509396343 3558486172 2089930773 1644588507 504022921 3815698880 2604569703 838591969 1402910826 1641221738 3124610590 2676919829 572108930 2112121563 821188878 1686029211 976846910 1320126519 780341834 2023965496 3304024075 3605781433 2893388057 1494115887 3365499009 108679453 4293832439 2532729469 +290143803 1953691378 +2304640320 2130854867 +1739495276 1739495292 +4214886352 4214886336 +3716523931 1185153897 +4005876386 2748420313 195402642 3887326917 2178389251 +1771632054 490250762 +797549813 1773298899 +3940336123 2883415999 2883415971 +2616474066 1400309125 3248938363 4150117997 2411529342 +1290608379 1290608363 +3542368972 773138231 +1720712138 3634868934 2678097189 2678097202 1051287291 +3220060706 1174766485 +515318391 3511370054 +4096981887 3946965224 +552307777 2197128561 2264239021 +2534131269 210312844 +4136182581 2557520589 1323461738 +3822821054 2436278669 1154787828 +3606654804 3192226095 +3567316461 2790689810 +4116897535 1753402831 +368920626 3484985011 +2848803999 3979320926 +4028552925 2932177122 417164923 3716955627 +4276666768 1641417707 +887352901 2278561434 +3096201688 896221555 +3910889051 1362016594 +2678737019 3557824946 +2821406744 2876817843 +2794474380 3240553825 +1442076635 3888933768 +3884409394 2948014295 +1561573338 1600671217 +538328777 1275385454 +56105056 2746113843 +911963050 1006048411 +82057583 840180478 82057599 571738542 +167140619 3117709378 +3660441096 2118196893 +1991983512 1991983496 +3576914457 3101912392 +91968641 3688705517 572917504 +519132252 15166727 +4228383561 161295342 275523513 +1573926356 2494895935 +1032041867 3437430784 +2874956922 1013290013 +1171048073 497859822 +3303139030 4283806134 3315491559 +79557702 3386807431 +2070752508 458481712 +2970695840 1578902515 +1399255109 2416721050 1564698237 +542010188 877263578 +3280404243 3766717178 +1329028271 1663493998 +1027087253 4099107722 693258797 +3255786683 1760832360 +2506453315 1728434173 +926243443 3689081847 +1284132663 3032134553 +1863458213 3772300417 +2063368761 2642763502 +4073494726 2974092550 +1188132357 2923649622 +3915458700 4025668727 4239332828 +487207404 487207420 +1719115539 1632594668 +1039661782 1667227377 +1853861169 603825190 +2731884945 3870701392 1993933622 3551124311 +1071180176 4122619444 +1371962783 1517797726 +2607569068 1805183045 3074991610 1818044262 2617923603 +642933693 280167060 +948160438 2504833181 2764480308 +3627130544 102551317 +1028812219 261104744 +3981443882 3981443898 +3379982908 1635112049 +1643849187 559719498 3772169424 3772169415 4200124301 1643849203 +1769391504 240907174 +74628284 3164543975 +2663215794 2520485427 +1925509067 3002494095 +2670504431 2454690942 2670504447 +2774610097 150972070 +100783634 1297933380 2884197549 +504236323 1930977820 +3611669400 4168981600 2377984819 +835612997 3945877354 +3007651477 3457582394 +2963889885 4154480098 +1023062826 682101531 +1374289749 3209272648 +500286367 658055098 1489410032 1317075548 1258299169 +3864701142 1950064711 +1542296121 2308057118 +2352807603 1996813260 +2541504609 1446637190 +1653455974 1653455990 +3169386652 3169386636 +663116579 1535211530 +2869049927 2072100297 +1824274743 1666060688 +2436284630 2404590135 +3096258394 1340220361 +1518763568 2981668245 +3466335014 1706173633 +1502488396 228610423 2961045532 1187503287 +3337935692 2138388663 +4263705464 1726838411 +2514186074 1114655403 +1128301012 2995544249 +1186506130 3870074067 +325061111 1999613894 +3594093566 125449993 +105170291 1363334156 +281766264 3895920635 +2521396874 530946861 +832304852 175393543 +2211964326 853443649 +1301126215 2588404516 1461295322 2588404531 1015678541 1478072928 +2203074694 3766697754 +29459055 849368238 1312020846 1318383262 2287329967 +3618435721 239193528 +1915737403 3408858885 +3632128329 388605432 +1332638228 265440639 3171285236 +1579546641 1187349200 +1339456548 1131023887 +2200432813 618651716 2138818843 1584275730 +2093714727 2607756406 +42981835 3547585154 +127027273 990147769 127027289 +593741654 286346110 +1104931602 1348336045 +2904299467 1312388244 1312388226 +3589184237 3549197636 301883954 1243388447 507144667 3549197637 3549197650 3013468946 +1307579932 3348302037 +3265354425 3889980574 +734479270 2427420225 +1863700159 3807822895 +2237754238 2989173407 +1366171918 1023951502 +592300150 2791013441 +660781618 3551384369 151772566 +3051234477 1546457012 1663392455 1529171513 1810987886 3670927169 1563234634 +281724444 2335563281 +1814602556 1814602540 +3468323161 3363034888 +2674733624 820383291 +3647622659 1163447996 +3314822925 3314822941 +258373963 1430802357 +343006522 4254425681 +622109124 595240863 622109140 +1743233763 1956997962 3510737004 +3675673192 3675673208 +3803654998 2572231525 1802752114 +1371972646 637499238 3786696663 +2075637023 3778158558 894806540 1540403505 +2226926466 2226926482 +1218554143 3895196197 3892238002 4101889557 14091682 +561182866 972901829 +2186818045 769044820 +3626658203 3854843652 +3198584123 1529068530 +2593837422 2593837438 +4256415284 2515823567 2515823577 +426755514 4116719289 +2831215946 1726044194 +596815873 15405462 +1281457620 1281457604 +232629546 3555900819 +361533156 327031491 +3880373840 2335688363 1764739061 +2163322083 508173255 2163322099 +2730805959 46872406 +3948388247 300956326 +291892895 41329758 683973963 41329736 1224720361 1654610694 1356618292 3833182647 +2756780600 1955023196 +2976405510 1296208225 +2533272128 4113116702 +2868243349 3055672202 +4141308922 2399521419 +2959310764 1487010765 +3758607090 3758607074 +2381988282 2607518869 +1606910639 4210510033 3003726509 1467611116 571002704 +4131186785 4131186801 +183991060 284476651 1885775494 2708082502 1763941694 587552273 2692162870 3986102101 705365317 906403141 2611838258 3296909314 1931210187 +1201528832 1201528848 +2141182974 4167323423 +2003355373 1135974137 2745206702 +696399455 3069941640 +1396951038 296998089 +3733337944 3206327027 +3565592934 3337544099 +1745797652 738284927 +619312090 4132102205 +1113554604 2689728354 +3367444275 1514178109 156731988 226210185 1801461408 726015322 4063401293 +4040265309 2458238050 +836335618 508947222 +4158474066 4158474050 +175762343 619575264 +3792828971 48476907 +819132638 3122513257 +3104788099 1152886375 +1644887713 4165916534 +1277674942 2694597129 +2227768844 2227768860 +942158566 3213526055 +2098907403 4230642772 +1695800580 847346649 +3400039664 3400039648 +3760922301 989820875 +1797441019 3904729778 2730338866 +2942908641 61114912 1306307519 4211450148 +1523301644 4206533089 +3227288644 363083551 +2673211312 3196852916 1117119688 +1422222691 1353860641 +1217136937 1567779726 2837401742 +2129242295 2161416198 +4237884586 1322631053 +123432668 437078919 +3795524133 1208625196 2717733706 3837022282 3250604515 +52607369 980074725 +522478722 802629770 802629789 2286565539 2798818830 +3166278426 2105800502 +661373501 322811188 +3781257754 3864659691 +211759864 1183195013 +747559239 1179440917 +1207906885 1419822679 +3225689129 2729253784 +1881713028 335731401 +727288719 3227147227 +4010421724 688271687 +3826475483 4088174 +1411837086 2296007870 1660313791 +211771706 2159522465 +836979145 1372399480 +3687433784 799605957 +2804437886 2790536162 2725998409 +1450997447 1010140626 +3924631079 817906679 +2228908622 1910632665 +1528357039 4003825147 388608888 +2022173865 1842820763 3943775240 1727630872 +3187946785 1100980960 +2969359473 251817456 +322537910 1824972178 +96687412 1788375776 +4278107381 1610839484 +4222282386 3222225861 +2115501453 180758770 +480765804 2566872705 +2724571479 1175708372 +2376480991 2376480975 +32796204 2870616896 +604341878 3869855250 1424444635 +3057732204 1690845479 2014771584 3057732220 +3222191487 3593752318 1372922208 +1396270629 677104684 +2718516347 2409024946 +285334456 3951644300 +1979904923 3145977160 310777125 +1939987983 382767502 +4222876516 2638754983 +4040275402 3827379451 +4150260790 4150260774 +1703604706 1056448408 3097082971 2944951535 939005076 +2241916773 3962667939 1491225226 1491225245 3243826170 +126788680 126788696 +805511753 1768147935 1295113913 3723426030 1295113902 +4153221644 3560221216 201698908 3207370977 3560221239 +3050758070 193919834 1710247078 3050758054 3291121047 3291121046 3291121025 +2733153833 2637232792 +788695181 2382165476 +2895808700 1795403427 +4237595847 340554629 +1943016757 2240897642 +528770683 404400936 404400959 528770667 +3501782390 153774286 +3971295485 2653914690 +2040581319 2736311250 +2482771000 768857147 +4059412459 3503326964 +78148933 78148949 +3478703445 3184213212 2431693293 3184213194 +3596782059 3149158628 +1992309685 365254214 +2095351546 4289206949 +3178640076 219281185 +2357208326 719214806 3846181703 +2056222033 1087745680 +2167717756 3792269351 +2488162605 2247884178 +3834345043 445334714 +2186639419 3034839159 2755995030 1737245938 +4268248331 1323637399 1284824111 2301708372 1590203352 2666505566 2765463853 2903558588 1284824120 1616943349 3159792761 2436977385 1284824110 +1902710260 1902710244 +4160195510 280031111 +1490455856 163594901 +1379144268 3019427255 +1181481849 1209258824 1425858408 +2524562213 3191514186 +922526090 431115309 +4192323950 3429898297 +2897228713 2187416334 +260865128 3794261949 +1721860646 3057639873 +2604833086 1936298861 +3900737444 2790623017 +2356964553 1057234783 +2593536897 2307663619 2684085936 +3105081355 1696852308 +2777812372 2407450560 +1897221737 3203217369 1837789006 +3325590619 2777689874 +1560753716 2790937551 +2483187183 1895183381 +2009768724 2009768708 4009518696 +2184949853 306295593 +3056937813 4263459249 +2538657612 3402293061 2538657628 +470892344 2191758064 +19537214 3495056021 4289827401 323750047 124489506 +3838756400 346173852 +3768372669 1406656642 +82844380 1308612487 +3375661633 4272491584 +3636271664 1638939011 +3050509619 4200965965 3943957687 1850367820 3943957664 +2245608325 1347320039 +639925420 639925436 +1278768036 2698906431 +3115316496 1610532899 +2259649144 2118804205 +1556664874 975362075 +577354459 577354443 +2278669313 1235262246 +1252778070 3801229169 3801229159 +1368648578 307673848 3185849417 535534206 +3301499986 1691923707 3156535090 +2811315705 3266389736 +3436124163 1828900010 +4290586116 2596460639 2596460617 +3580004419 1915988853 +2055172380 4070510343 +3135109039 3664570488 +2684491925 3243726460 +2429631953 3395571718 +3586553723 40769188 +2506760071 3171918208 +380903793 867407382 +2016849973 2547089357 1930912618 +3320440995 943724405 +4291978589 355832180 355832162 +2075688496 2075688480 +1739663181 2296438322 +752215751 2789504466 +634919016 4214123453 655596180 +2606364389 1939843692 +2226955283 477498501 +3709684196 4179317247 +399879502 3546272217 +4098916372 2931400559 +1901417431 1079180134 +2705945769 3034579173 1574704136 +629628872 3692808156 +4040394029 1241163204 +2798744838 280617809 +4294788221 3916810385 359316560 +828356009 1629884686 852433151 +1834653136 4120499811 +3192701330 617920723 +3773583277 929643806 1487615529 +1929125291 2917315636 +1662981404 3055236854 3708970193 3544586206 3871260815 2127739302 224534589 2268880607 1845917143 4035930024 731547299 2411712836 2837464587 787020949 105907047 3573959084 2013979176 864239509 1318593218 1672327280 98653379 586485144 59988887 2674046509 4148436961 1460862235 495513108 2634032036 920241888 2142303716 3583966710 2521576849 1641566774 3562006921 2379990377 1628168288 900801324 3271021844 2368983175 2182760346 3121064309 3321385868 2759626074 756026784 +1972012675 1130125953 3153174118 +1800768772 1196048758 4222418261 2176582787 +1852129873 442983824 +2076769840 3069392013 224929155 +533648300 3574388660 +4205361756 3818735031 4205361740 1371292432 +583672255 830133628 +3856775146 283389990 2591906517 68021829 68021842 3428091227 +2116049060 734690959 +3546204970 2919715730 +2514509704 1453195351 +1993334369 1822112839 +1483761644 1483761660 +65711044 3567503507 +3977040312 1688457152 1319353427 +1398100348 1398100332 +165088058 872495637 +189692707 4018919452 +3968685719 4057146573 4008332272 1569566051 1151031645 3991554666 +3256682653 3256682637 +115311323 2900033234 +1681565504 139807173 +2281407206 3512095793 +3387532309 4023209219 +2516468788 2007014387 +2093750151 4232644992 +2283111786 3443272069 2749433298 +4017276279 328411715 +530082334 3673099561 3209695178 1656534210 +2399340373 3244719085 1992592074 +1481594501 3496415609 +3769224104 1397463421 +589332100 1990641528 4260964981 2374102468 454602128 3492227529 +2144243364 3593112608 +2957742492 2795183908 +3601053252 2408195375 +3228901436 878820977 +1115726695 2884548579 +2217309905 3997391457 +1199760874 991284306 2098196315 +4260340440 2554157595 +634547184 634547168 +362823275 1984053876 +1196184531 271054117 +2652107458 2607228789 +1093269048 3440286267 +628433279 1986247400 +965492010 3250866459 587142546 +4124603030 713982817 +3299680539 3079347602 +1323197066 2242385510 2453678579 771885466 2453678565 2987728685 1912071996 2314734854 +1248280775 683722591 +3810379538 2402891195 3727500862 1264851060 1843012189 2402891181 3472577694 2753119030 2581619013 +4166255816 3024324299 +2025678514 4278447706 3290999347 2386485016 84146089 +4042622799 2597199244 +3552749677 3639655768 569707800 +1587756153 1945645694 +542376168 3426577725 +1356663448 3824659803 +2452053196 3002483447 +1914231566 1914231582 +1332942982 2314269393 +2918392726 1807811889 +3805415424 2839504178 +4241898316 3818377862 +2911869022 2911869006 +4069309591 2245276358 +827526041 2546509164 +2870131320 2295080855 22962936 2218044784 626698629 3715243790 +3673578038 4084515841 +1233998819 2893745749 +2868042736 206584533 +2345785076 1080652715 419504844 684312375 +1013163378 2195550821 3932318814 55806265 1973103373 +3148086065 2485415472 +220503308 220503324 +3589009075 3589009059 1969800140 +1461383775 2120977288 +537056890 3732382237 +3857147633 702158742 +3971456346 729746222 +4206472293 390750970 390750956 +4044792880 4044792864 +1964168749 2040998084 +613562019 892076682 +2320045346 3540796565 +3649217808 3649217792 +3546149740 1667386007 1104544295 686174999 3503891836 +1898332254 488192617 +3152222928 2654900008 +4224753394 3744761561 +3229108216 2552930193 +1167371147 1246011738 +3806742819 1401233948 700747161 1401233930 1370643086 1401233949 +619067638 3565068502 208382791 +2804844659 3842165239 +2376489618 3196630317 +1522696849 1899203142 2049092641 +2490149883 3185124656 +270701494 477005713 +3306600147 1813483328 +2481882670 13152648 +1477081755 418394779 +2699072406 3616036145 +1918798710 1918798694 +1106186543 4200074488 +3599361604 2137949806 +3927415505 4125585269 2573847619 +503446266 924719005 +3479796129 846963142 +4252546469 1633491676 1633491658 +420461767 986066262 +3983746232 3983746216 +3493537508 2971547881 +948828413 75429451 75429442 +1899613796 2717902719 1522663534 1926844571 +1621466183 1509227047 +3655331196 1409121063 +3239694453 1889740842 +3100310455 2659860742 +1048979209 177762335 +3926906621 3287136245 1945071682 +2185184120 2174170605 +2880720646 3785968977 +1238845373 4209372811 +3751977023 3482302460 +2749484422 2188806654 2188806625 +3240619136 2446937491 +1357059956 3380472719 +2528124045 829502105 1594769806 +1916616147 2842186554 +3750727163 1105752283 +3324731036 3339566387 +557111304 1580215771 +3294879087 1415229612 +3792871263 1112597121 +2376450512 3421510261 +1388474136 31520208 +4194804283 3573834468 +2420165837 3808585380 3952491065 3543509156 +1480342086 751811639 +2852869902 3185183513 1303637778 3980355737 +1699040310 2450972609 1699040294 +4161050433 4287120675 855488807 2956598102 3356727375 3632646434 3245934694 2106721767 2956598080 +872970149 2387892396 +2520675773 3891135962 1095981204 1301303098 3391284403 +4157486618 3265028750 +3730708448 2159579820 +2871487050 3378894757 +433996415 937602536 +144676530 1161443891 +3555434089 3555434105 +3174981489 352865021 3854276592 3722054700 2811197440 +3024722762 434074989 +4020112253 2999719380 +1840750366 3591339049 +3619735283 4291259488 +2395896779 2584535170 +26458083 1388488442 +4057180447 3476241374 +795319769 1198206121 2031975582 +2186257049 2892322005 +2115772666 2115772650 +1778836557 903439666 +1783505748 2902564143 +2566719305 525498360 +139770622 459431369 +428222866 1677368365 +3654004451 3198439260 +2311871438 173717802 +1258568159 1359870603 4138146312 +148630892 1580646657 1580646679 1362220160 1362220183 781149052 +2108127100 2895713585 +1827894148 329686813 +2473941718 4156423911 +3344503099 204873700 +927493888 2384772170 +889668984 2382800885 +1727335350 696425625 3384897422 +4260340427 2336048514 +199008922 911466285 199008906 +2537027585 2537027601 +164386825 174468495 1876322936 2257165051 1876322926 2993408799 1974375992 +884112565 2851754218 +802626 2972970062 +2001188499 1491364204 +368922571 1757715604 +571427114 3356503309 209125778 +501625999 2690956558 +1487478541 490989170 +3368447215 4284316728 +886522796 3672082391 +1870011426 2565753219 +1279618164 2236201615 +3392340625 3427216438 +577646483 3329549420 +2663801739 317001852 +874291055 125891857 2975153103 +3032667828 1621349151 +1512724846 1588250681 +473972333 3861005714 +1800510932 513690237 2955887316 +3466720387 2086465627 +3067763956 1162207965 3067763940 +3657465486 3164576783 +802059066 2080334923 +1237158494 2490983996 +4219466647 2171369136 +4065902143 2190345707 3232988456 +844852085 3135908156 +3296598458 209879005 +3478005175 3044320803 +3625325574 2482140026 +4051951285 2100340398 2174916774 3510746632 +3736056015 3736056031 +149364008 4194307412 735241725 +311485493 1368108179 +1877483139 1924864999 +4200192710 3782436257 +1555874207 367994955 2619657544 +3747855036 1711207911 +4028154152 519573995 +3657558733 4261716132 +2191350063 2191350079 +4041805754 381295664 +4080888612 1097076973 +2409803609 150755902 +229245296 4070589269 +399147987 1187874106 +2099425243 3216933768 +2426242150 234319006 234318977 +2224429339 700267758 +3319959894 3651848817 +2516641543 711700502 +679102698 733701957 +3823716370 2665570418 3760922299 +1477702916 2875897183 +279960965 465384874 +4056817685 3162276106 +2025172281 2025172265 +1209662645 3772210089 +2010342435 3301352202 +1689625708 4126266903 +1189597902 1827723855 +2408293774 2262146703 +2074360151 4203103216 +1994039588 1043049407 +1753835651 323978805 +538078220 2926585659 2379237746 2228239169 2967707250 2967707237 +1646894 688833535 +976080810 1918132730 2316643347 +2291409208 959466299 +85099093 85099077 +397070225 944279671 188349580 3538207047 3538207056 +3972369710 3908910959 +3470172278 3899397206 3442337866 3899397185 +3784384937 3229089048 1741536511 182672654 182672665 +237874973 1030397186 +713486989 2138035172 +49770135 527461433 +470516124 3256682631 615808071 3577568652 +45671609 88117535 2101870238 3075695450 34606888 +905376532 130066543 +2182778503 1456365206 +3246775553 305932909 +3834228954 2663475005 +666442260 2623802735 +715147313 1263641894 +3341826650 181940236 +3606587073 3606587089 967121680 +2430789999 4112392342 +248721405 2725722357 +3077905285 1381651034 +719079451 2479194765 +1495202755 1495202771 +1280672612 1280672628 +3249100136 1089970068 1167159997 +3533574921 2547513134 +2799672313 1496416879 855484382 855484361 1974626177 63964853 2869070078 2419480120 +2491985000 1260880123 2491985016 +3153383675 2851559870 +3775423676 4231435249 +3976371822 3093582341 1257053644 +2538275253 3759386602 3759386620 +3207180097 798942038 +476928409 1195586890 +103566062 2461806447 +2656221622 2326858868 300547040 3601602593 +1592770187 1396271544 +1784122915 4219635235 1164240285 2229406646 2834038544 2329198858 +2685506471 2729144310 +1752675066 1852751755 +3931704153 4146025990 +1318859456 2145641541 +1390438666 1390438682 +2875068471 2312034279 3982530409 1656542371 4229138064 1656542388 +3977420357 2442773610 +1249822514 2006160307 +3694616379 898509740 +481488075 4171940738 +1459986011 1490569554 +2892217117 3551091807 +2875961415 2260409171 562462656 +2904741803 962961639 +2485502345 3228543672 +3479867095 1539234918 +1642442621 2228257909 +4126279300 4126279316 3647442808 +3473391511 2150800038 +321860519 2370290656 +462455048 1820008331 +2209141886 3240311689 +3417770623 807765480 +924519487 4078247059 +593179859 2073307180 +1899314284 670466191 1467567732 +3178025542 2286886257 3178025558 +1578716350 750057890 3755200265 2037321161 +449399413 52043511 3623175180 +161120102 2218167681 +1110278172 1831234828 +3013578770 3593456723 +1821112502 2139315520 +2012451607 3950021936 +1621134736 4051397992 +4099783425 2224173616 +1665970868 96293199 +3399201157 2014868570 +1641510145 3861086829 +828340256 3645512293 3645512307 +1929909965 3869990624 +635160594 635160578 3871833067 2107743930 2107743917 1042234510 +1381062972 526134503 +1412363845 237624444 3761668647 3353745191 3807157548 +1316225533 2107580738 +1482123881 1382200270 +4105344558 2116914350 +3412614833 1516364497 +1398291249 1692741158 1692741168 +264365598 3963437353 +2397224912 3203658851 +1224393306 1019212733 +3327258586 2860606326 +1537453177 640399858 3148382824 +4081976836 2424618603 +930618777 3944126430 +1496628486 1946521697 +4040714136 2510913560 +177768397 2065549220 +2013798058 2356972134 +1800063197 3283760098 +2312982475 3933694641 861444118 +2614727109 478181644 +2022604517 2907816556 +2536876303 410591896 +4047899913 3406014329 3662054702 983749151 3406014318 +1776930580 242857773 +1209364474 3098025337 1412560686 2027516874 3098025326 1418236959 1042173142 1435014565 +3836207483 1866986674 +942308162 2900363509 +3392273290 3601791533 2507202566 812903141 +1970936963 1916461610 +3117381753 3117381737 +3843527420 2407306019 +3613510167 3746922294 404084980 1654370269 323405424 404084963 306627818 +1938146788 2197081561 +3868252001 1459817910 +1824875673 321560327 547284629 756624162 +1657485917 3538732836 1657485901 +1373275995 906171460 +2742386556 1844075824 2742386540 3455561777 +3185065982 3647782089 +1601786582 570255079 +3155048074 2489309997 +1805824808 174887747 +1663329873 3629290977 1665995142 +697883808 463687653 +3036283834 2677267933 +619298703 2868416024 +207718163 2130748397 +3830507252 1599836688 +2546998526 2187377762 4204635081 +889808348 1506498887 +3300148502 1778964983 +3980186945 3083056448 +455466539 3885809058 +320602021 3691034840 +2667616947 1264502326 3694266129 +1462494353 3407401040 +794220868 2360439321 +3621584034 1927394069 +2634747064 4033152429 +2031210894 2336314002 +3690351850 784012365 +2484872339 1070418029 1193218816 3142423404 3247655334 +2967057740 2998429367 +3182705191 3182705207 +260884613 266043395 +816289569 3039809355 +2897019425 4116339190 +502934973 3990225044 +3087580870 1000841410 +1525257455 213218360 +3565002190 3646287193 +4169769556 1031246188 +1703274918 4052875494 +638674632 3043282141 +162825852 1964653607 1164602156 3274683687 +2524600721 1181003431 +987226351 2430015537 +3120527839 2888620574 +293954002 1727593861 +502897921 821176470 +2911042967 3157603494 +978862558 3069161590 +538056341 207109434 +3147363777 1880962813 +918672263 3391100582 2733512133 2153517203 1299641481 2153517202 918672279 2153517188 +4069416938 3223387469 +2908645647 552088922 4204749464 +4042740261 603449383 4151423995 1664049050 183673582 +1406749662 3440530777 3708972671 1406749646 +2857547766 372742215 +2283756072 1901784317 +1006106554 559610333 +4125299075 569390442 +3092664893 162139723 1826846210 +1317204247 3787968660 2938210086 +1560145615 474175025 +3381815113 433531833 2591594478 +1673755872 1156998418 +2143610894 974222224 821644825 +850624667 1562354248 +2276803118 2276803134 +368321794 1698351785 +2708105284 3487377199 +1454859833 3149261758 +2415646350 3634803726 930267535 +1550239819 1080908330 203103363 3234680322 +3357389669 1807837164 +2164056457 2534869688 +294304861 4201023092 +1001448768 2653515753 407801613 1184293026 1353396580 697298267 3842755224 +1112502155 2446525103 3993802708 +2571351812 621147119 +3099143328 1188837015 +1876161152 1876161168 +1327790609 2808883408 +788013272 788013256 +1695911522 4065208170 +968209458 185248421 +3585999707 3575597138 +33098748 3604348895 131338372 +7154385 2379229226 3721947727 2094688006 2446339681 +2674507572 662175449 +332303020 3659812055 +3054063166 3466996617 +295090084 3466425743 +3734900387 4027821380 +3866760197 3610084300 +1018726620 2409690503 +1888925476 1755585901 +3266018728 2339293297 +1286183332 1392303423 +750091032 1581839525 +4029021120 437112808 3955116587 +3893322975 792447774 +1544201103 1941928462 +4141827696 293331523 +2707348461 4115936786 +1606802849 1702618208 +3008831635 3844622188 +2941226165 1512233064 +1977816422 1977816438 +2749817666 1839123030 +2039235969 3637602816 1554567847 1739194534 +3074468079 1774841912 +3066654740 3442506623 +963081751 1960764966 +1203804487 4002982980 993086144 454774746 4002982994 3965142277 +485514186 1482718957 451405093 3926119110 +1206394046 2321700749 +359304 2426500875 +977430754 2140763362 +765724601 2453153854 +921364301 3234471474 +1743207286 3491342145 +2497713965 2311355332 2311355347 4180756032 +4125192651 437296437 +1951943640 2030834532 4278150413 +1627867198 1506000152 610654317 +2257198134 1166236754 +3763231736 3773295175 +4878847 1440368136 +281225781 2285590572 281225765 +690507783 3514170134 +910273526 1842269121 1200932554 +1484461299 750903626 1484461283 1019345548 +361483995 3323372242 361483979 2577545887 2577545864 234937397 +149093327 3427952334 +1644752646 1511016055 +3146502818 1023316925 +1618293897 757979896 +1668098601 992991641 3735088943 992991630 1668098617 +2401579375 3331117486 +3751017322 2018220717 +2741398764 641562497 +2394668099 4102643068 +148646953 4239107378 +3784259681 1970651296 +1637296486 116796289 +2742165423 4222083192 +4210542916 1477563913 +3899263516 428310275 +4240806191 3654613356 3399273445 +1312704635 3825961514 +1777628830 1544026815 +3628999384 2671768608 +2466370825 2575198751 +2535747231 1170815009 3437698396 +2503782427 64133621 2265390536 +2809969420 3042604023 +3778256089 1771881406 +983663543 380387090 4134270775 1356322959 1356322969 152840255 3135620377 +604141382 2798329949 +3758956921 1665689929 +365905202 2269769139 +3757626884 3757626900 +1301459485 988701602 +567115472 108962147 +1723172577 1990278403 +3076191487 1275984572 +1207304556 3362523264 3024370945 3362523287 +2805518764 3933344193 +1607820014 3716282489 3699504867 +1617962265 3918161502 48178665 +2878675125 3501581564 +4206281766 3551971287 +2265967760 772892348 +3523190670 594029721 +640629698 3730510453 +3340459694 504761337 +493640636 1369518951 +389412914 2530122701 +2740955848 2740955864 +3061746563 3026824048 3174777411 +1643280316 2931808492 2382016368 3590038429 3971120369 2382016359 2015531060 +3086086247 4175262240 +4248828045 902437874 +1378313178 3464238839 771895339 572943372 +2096308103 4075986857 +3976374614 2524346423 +2617605056 1554108229 +2752667278 3803479054 +1164450606 1893910905 +3763739279 1981219532 +2542322480 3159049365 4286379676 +548127461 4147639116 +2012873055 1719753133 3531044449 1911541258 +2649174569 1745688214 1285188484 3845456089 1863131545 3153327751 +56572391 2088029668 +1476525254 1361111969 +1320539688 272638205 +3809999791 767636600 +3518953552 2807360975 2141251043 2410174180 +2657884965 2301541178 +1253616652 2897663713 +574681694 1792066580 2265065665 +424716279 3505940934 +4138452454 72958897 +124331658 881306407 3115022598 3969027557 3969027570 881306427 +1665506304 1184142341 +2655547729 2097832582 +779913126 3557395031 +4035246798 1867960915 +1609342674 2187408251 3548251269 +118141415 4241886902 2767783396 1646396921 +1984469867 2672601442 +1816824424 3780633003 +1861318770 2356699106 +487539018 151242619 +1798074405 2146803606 +246346596 2940910354 629636507 +15290777 139162568 +2849093772 3777332321 +2203707816 2203707832 +3622403604 4170283375 +3141476931 123924348 +302649485 1531232187 1548009793 4074245618 1008595954 1008595941 2168207680 +2249037905 2949388257 2249037889 +1137631400 3736998749 +886646143 1223483178 +3190286636 1523947072 +3622063061 2238746161 2634458031 +1606226753 3951790933 792454246 +636001029 230437583 35464440 1078821592 2022033542 4211158302 2398850228 3484328896 2400230686 1253571703 1283570623 2512918585 3922242427 2109729748 2423164062 465294872 2272411418 23971466 3430296589 3153751966 2264977195 2616990395 1196437740 831531561 3776489126 3516742875 1595594138 2792573804 910090015 1207192794 226746 1223879239 559862795 3291874922 4238546324 2228708298 2002811239 2080295869 374713555 3236527730 188226750 1044498063 3464775604 3711099660 1181123135 2555501349 2730539751 2978367932 2187525089 2531800083 4153605704 1242064264 2846911169 3309163791 3457525220 2508873320 28745013 1847331364 2492363638 2264640573 640260420 520574213 2204001948 1711210706 1990081484 1126096048 1094930855 188185907 4224604174 1607094450 3102399689 3069489785 3347683156 3447339421 +4013333574 2834004362 +1289984690 3159131699 +14085016 3212384 3931430989 +4176385288 4046084528 +2874199798 2155667142 +691384951 2648172355 +3160176459 3499084546 +2505021136 1042547516 2505021120 +3447077891 2266892708 +2200012296 1960858143 +1913808181 1145846115 136843400 892388134 +2370584792 3789394020 1191842829 +880594064 813041333 +3386979105 4001594592 +1670662597 2936134417 2381043475 2272272652 1401168438 +1681912825 2037497822 +3090607576 1617194272 +2812012513 1144347153 +180491052 461647425 +2823653506 636378818 1947067573 4060881422 1423895709 +2162843308 3667317457 +2260204587 502024021 +33771681 3426217334 +1963736997 4148709884 1963737013 +3848879630 850178063 +2775538037 4147604236 +1178674715 840403483 3702425544 3368660133 +2335122389 4030031946 1846750317 +816970031 1267570205 2971505274 +3082401798 2596204034 +504316634 738606379 +1251041328 1141468453 +2006061895 1824783351 +3095438068 1968380233 +2722240135 4111038080 +3615612013 690574034 +1045228763 3994606802 +1840547630 3778071929 +1812466646 3869942247 +542151525 3340013212 +4050962095 3386164590 +2101407749 842651610 +18948563 2163539313 3646648918 +1804701167 1159884600 +2615829369 3942291304 3923277039 3520614181 667056700 1719434078 3940054645 +3014615240 2829838704 +2801215918 3004594270 2793097887 2232851694 2232851705 +247414162 3917445276 3470635806 +1936134184 3544084221 +2066705012 1604621465 689302728 +1873235182 2935424566 +3090816005 142220250 +4138962918 184920359 +3303334526 3303334510 +1214535444 1496256110 +195614208 4080784424 +693779247 1637131372 +4200185536 3678881875 +2587973039 2587973055 +3321900691 1162432876 +1184397580 772181495 +2646546095 3868044268 +1170249251 4046215452 +2316449175 4054473894 +121237673 2378581006 154524174 1193095643 2378581017 2378581016 1929339391 +3174559185 669526368 +578661922 578661938 +2233803665 236621228 +3639576022 4105300129 +1428562741 953526988 +1406081451 1406081467 +1135614239 2906098654 +956400218 392180669 +3259713943 1938086054 +3332962612 3850423648 +2994878597 2281634124 2281634138 +1945150141 1087385492 +2751035649 2751035665 +347958681 1545527934 +499478758 1300449562 +3220060714 1577429341 1308987405 +2950859385 668629598 668629576 1355866607 +1971900767 1700894856 +270067114 2080190981 +150916277 676340809 +326605987 1212912796 1794830727 +1238757060 1238757076 +2447212864 3753015237 +614820570 614820554 +563591715 81397020 +588055513 108859016 +1540746572 2731003013 +918545575 3608474336 +2967628692 141515257 +3934076597 3626612458 +261152610 3809453891 3809453909 3030666877 2512729518 +350725356 1600901626 +1171984173 236922347 +3140572799 766192126 +4161050432 343494088 2939820484 1720995737 2939820499 +3611048991 1383263393 +410232094 143692954 +2079035544 3434530340 2882838363 +3137570955 23826722 +3315418789 3147183532 +2492084776 4253873405 +2491381689 2108258366 +112555070 352525945 3450207625 844566392 1531855177 1058212898 126849582 +1948487992 221988805 +412151220 3038855688 +1661592145 579498486 +3303948811 236058434 3303948827 +189944280 2557774181 3304750369 2862012187 2557774195 3092691232 +153937825 313565814 3792682961 +1803254802 49157994 +1362275652 2786319843 1141235716 3823334447 382124553 +1709496726 4248995623 +1347893823 3092295976 +3324527155 610285132 +3211601906 1255530995 +3166120527 1666685518 +4123156968 3372228651 +3797028271 4130048632 4107758468 4270521068 2410738031 4206821841 3554092564 +1333405814 2471342535 +278860380 1840668995 894729723 +1266249886 2726271883 632714907 +3687804374 3716802535 +3848632064 1683216091 +498620990 120983433 +1358452576 3606154291 +1300174155 3817997237 +3303948826 487722749 +2663009208 3471754835 +3956202182 4238501281 +2358128329 215197304 +3378050692 2097151855 +2512002228 1744514895 +2961159058 1795665619 +1747837797 1698494458 +2797714040 37925651 +3893071662 2016568697 +2298092115 3837220714 3905314519 2298092099 +1029844023 3633027728 +3940584831 1233553212 +2004071252 1596149039 +148846028 3016246240 3016246263 3846363936 3244341148 +2590832921 957134485 +4247940368 2625529832 +1362342115 3076486492 +1475978690 1073737845 +4246186503 1933617430 +1526469212 1004231440 +3057445061 562799271 3497218812 +3246260488 2707136413 +1050357254 2487841655 +1677688272 832132763 2630384565 2156490385 2512941238 2780005464 2156490374 1684195911 993201763 +3382528782 1889347342 1889347353 2336668415 +719530440 719530456 +2611347464 3438393799 +1181018621 3453770068 +3261229678 2617799342 +987071979 987071995 3560697880 +3028306529 701677712 +3658489755 3798057234 +765942845 1091822974 +2040804921 3061930935 +4024346431 562337532 +3488177522 3193838181 +3606809560 3531126560 +4077660888 3877145189 +3961238074 3919155549 +3977017521 3684826800 +1681850745 4058197348 +2870848847 1667347340 +1700035055 1929114417 +3796501814 1887843335 +3660576476 719465569 1872842084 +2380526410 2953052758 +2099575221 3056932842 +2820187032 1142549600 2353107251 919177293 +706081687 1767810094 +758923667 758923651 +2466454111 3437396872 +1879173643 1577283394 +3270586706 1913801210 +4033567102 977719902 +4067790104 3339525339 +2016822345 2255322872 +1540910729 1722933919 515244472 4286880236 109356270 109356281 +558997155 2184260058 +654406399 1715996542 +3054543506 3095112843 28357030 2865495844 3095112855 4021306481 +876090266 1718426806 +3173005373 4139288578 +3873375598 4158020810 +3769096999 3476946550 +1116812885 530089948 +940504799 1380181111 +2569014860 1500938679 +2075637011 239775481 3576827130 +2532396743 1692336960 +4088274944 967521015 2602328076 850077644 2602328069 2602328083 +573926821 2132515514 +3605317531 3844487428 3207315807 +2508125856 4141759987 +1478482774 4053800193 270944359 +4113427685 1166361628 +118156586 1706934311 +2974657199 4153428056 +2272549219 2670245596 +2559099200 3283077900 3200688632 3283077915 1253112187 1598568389 +1282615916 3310077952 3761125229 3310077975 +148831809 191888658 2384676710 2912105191 +3003287178 641396211 +1670838413 1836823707 +228577193 2010430222 +372733928 2243246266 +4235192483 120273052 +1909974905 2950783870 +796209445 734446173 734446154 2849638115 3665583404 +966894316 2775808407 +2169305048 1680484635 +2719940436 3154952971 +703195790 2302426511 +3825192394 4110127884 +3595696854 3084248502 957210353 957210343 +2015376657 2443305633 733186502 +2033888927 2726780235 1986061384 +3440340490 3645520301 3252212527 +142991472 3670036547 3049159704 +2390139286 2211826294 +1082641197 3267680196 +2948557701 794182234 +3003377462 2022031168 4103200954 +3062959769 4284087006 +2771383564 1250637111 +3954745552 3523026219 +2213176166 268073345 +4187872681 1907652888 +1826991365 1921998540 +3487773951 1101819240 +799520735 3825628190 +3155559927 1489905328 229336006 +995576433 1311336214 +4179731873 3505896566 +2689561856 2371421388 1561669381 4096559928 2371421403 +529603309 2657968900 +780006111 296555339 +244375027 3558267744 2313009037 3775751578 +2106344638 1641035529 +93058652 391434961 +683010931 1354261750 +1915158556 1915158540 +2885831485 77361428 +558153305 3090654750 +3327925347 2785062876 +4196454921 3400180792 +1908697681 568080864 1764973968 +370516236 3490481655 +624381880 1309834939 +3097721834 3097721850 +2968713816 4147746464 +1496189321 4034869241 +369254704 3352520386 +2555651836 3363397287 +94815246 4085686799 1810963854 1743853405 +2663848624 2741961493 +551990828 551990844 +296001587 4180160602 +2076099553 2673450061 +67136892 475136355 +3169727845 3489533420 +1885181521 1885181505 +390104716 647220855 +4093464911 1724317518 +1394603397 3978755554 +3859274748 442453425 +2169200539 3081771336 +804932102 2365753207 +1282953142 3135720449 +821740831 3087636426 +4119573141 3348183354 +4011512425 3493411662 +1929572038 3550339489 +2625281497 1397247083 305540265 305540264 2670374671 772177054 305540286 +832033751 1055412546 +4207512978 2923864123 +1889346113 519109917 +1321976660 1750147263 +3465912155 2424953938 +2407610174 310290055 371086056 4246612892 +3132557623 1485605481 115668404 623083910 +3874816984 2673564058 678183988 4197786923 1796735457 2963336859 3601634086 808921682 748231502 631989432 58938884 3435973828 3719249851 849447898 1339378592 1233505182 1923152325 3132307895 450844861 3617818423 919745709 1182288793 3272103898 3821998023 2030131518 1958435581 117009403 3614885114 572396640 1269761757 4036169538 3065983857 2349928910 89751415 2736529765 3200670262 1079927234 2187531379 3457166000 1431852918 630495879 3528914517 1871521909 3933170186 122829867 1365643739 3797201476 4078353147 2746346491 1376092674 506899467 420611473 716923684 982346445 970043068 2177390118 4278931827 2037884672 2078788477 1469544204 1295939467 1260998084 1776529396 348705861 2874137226 2115313353 3172517986 542721112 2649876791 2811153160 461065912 1629846824 93436765 +152583479 2284346768 +2106596032 3881468059 +377093099 672494741 1292341986 921458200 +1721163238 3731662641 +1250093746 4144810619 4262950450 4262950437 +3250570425 3118640958 +3089742735 1258479126 +2073415494 2973333823 2227965348 +595875942 979894282 +3925605599 3925605583 +706630737 3870202263 2663299984 1816212470 +3315575656 3992772407 +1994610284 2480999447 +1106772262 4285124289 +3147413353 3159144254 +156642514 2225639045 +4179385834 3643068966 +425530783 2357791070 +1469700237 1949296100 +3217231779 2198969756 +2098089780 294039247 +1177767892 1819485117 1177767876 +4008701217 2731423330 1943655945 1152535264 +1788760296 3918259044 +608231443 235838502 +3795710814 2240158966 +218702510 862033903 +1538181300 697543096 +3545414631 3611893732 +3023047840 1201922035 +752894012 3775209073 +1139701233 4109063437 +1492657486 1554168281 +1704846277 3973596668 +1014336346 3366923130 2265603773 3786043894 1079183157 +4176305633 3198863648 +4241674307 1121835388 +28853494 1179556298 +1210504683 2418203186 1210504699 +3180068051 912195642 +3078383447 1056166100 +3508282936 1733306916 +1378094242 3195870115 +731151889 2881647814 +4108265785 2221377323 +1698003979 1580352834 2636325688 811228661 +1869555313 956857437 +2513730738 2407549989 +279111587 185371866 +2903643899 240455592 +3157682476 1973915713 +722328242 821806622 +2144529234 2332586515 218356907 2165802238 2149024616 +2242359214 4091281967 +3565296664 4159765939 +2681455778 1012828949 +1002622214 430489697 +1887520375 2457988422 2334145577 4069037283 4069037300 2457988432 +4038595422 1338408169 +3617157701 2878268058 +899358695 1244870838 +3031449652 2775912921 2775912911 +4006944417 2592028512 +1819121651 4165150048 +327077569 3149528952 3020737510 1906276800 3694053479 +4037573727 943442312 +3038539786 633626541 639804709 633626546 +784745212 2652598951 +4137397283 4065570717 +1674486997 506479081 +4119759617 3837231665 2422526614 +3487189979 1894140874 1894140893 2899415139 1369904078 1894140875 2240368770 +1986779939 3824260112 +375468811 679772495 +3201885763 2993847164 +2005189403 3584354504 +2857334521 2570874844 2570874828 +1751255053 2986013311 2166716260 +4096074295 2373246096 +2038901922 2038901938 +1183362512 3643383413 +517800173 636504901 +2858794194 39485819 +1007285419 1051476594 1007285435 +1693689503 2324646977 +646440416 2280578995 +2077131448 2154775152 +987299727 3567746673 +1791438177 2022469558 +2214130506 182910317 +2488921043 3756674135 +2471136854 878580081 +3215928599 3215928583 +1261341931 3367674009 +1827262491 3192470984 2400361106 +1533722909 705363732 +1897746874 2854549466 +548952782 1345778255 +3805757521 1775910800 +2556449776 3026376028 3634342792 889941025 740887737 740887717 3026376011 3483640533 +2056684114 1290741523 +1665855534 697202361 697202351 440718702 +582529073 1672625462 3944325846 +3796661811 3796661795 1633548554 +2981402083 2722624586 +916063264 2556623084 343178853 +2005714097 3818496678 +3323875811 3300583498 +2210014358 1324647799 +3393049011 3393048995 +152536974 3725223065 +3737438064 1503737053 929383705 +3818661301 63921130 +4123434847 1185735326 +3360440747 1726509518 +4267301399 2055137507 +998356636 1228044177 +3289718886 1046112774 1690647877 +1102289369 1186672798 +187993592 2612755835 +1513697970 302160475 2787782342 302160474 1797599248 2702761425 2000072866 3121270323 +1098206595 2393441596 2393441578 +54028708 3970641956 2696234440 1556314009 1556313999 +3194544714 152844909 +3504959449 3095073438 +4226041791 1197273512 +2067146219 3778916578 +294394736 261042517 +1578941060 2872679903 +2017345681 107977270 +2941672566 1416114262 2062781895 +2569347817 1284102847 946107767 1638948942 60175300 4269143239 +459924378 1427749218 3249621867 +1022350549 3263957834 +3743201145 2385042549 +266851494 1404656625 +153582153 153582169 +975445400 2948901472 +2963979352 3504891260 +1279611932 532468423 +2706720269 2339225249 +3055699063 3068438057 916243188 787597126 +3691443847 2338683298 +3489574727 1005269741 +4147584792 3916049861 4051074536 1281375319 +654474227 1006414176 1383428324 413204877 +2102941082 104495970 3960389995 +3321859263 1883934910 +3461762060 515564576 3722032865 +868004464 3167331587 +916425704 916425720 +3551056467 2244155578 +982324146 3483624282 3725984051 +774977479 1817364878 +4134045357 2475426372 +3426230588 3762056680 3762056703 2167075077 2845392356 +814814028 2118853555 +2575133794 41000533 +3506680093 634376363 +4224524976 334338837 +627518576 299012560 3943304465 +3304305779 2124747034 +2688441025 3478468592 +4220779197 3014255028 +3791732424 2097027061 +2451847315 2718240620 +3363194755 355636028 +4026765179 4026765163 +2454804209 4084762056 +3262055453 834894260 +1882050113 3910912400 3682949015 479631217 1882050129 +2551182992 3710355820 1278003435 +2097560207 1607347992 +3396364938 4015537162 +220101335 2113626214 +2313922178 2683772597 +1574444921 876186472 +322265714 2936666469 +77738452 525627577 +2927069449 2938943800 +2966152307 3301544262 +2444891743 3337697182 +3010549715 1315782970 +369142927 2210651057 +4209466058 3291737074 +205739247 52129121 908110353 905292090 1925222849 +3620241400 2829153147 +4181927784 3434547371 +3732251130 2858716867 +269613671 3008180278 +2370576688 2741666973 +3095767357 3095767341 +3119632111 3119632127 +3923153274 1716111939 +3293158355 2535373681 588872790 3405838381 +1375099487 3470413578 +1751401695 886598430 +4136147765 1309430908 +1376678378 381506381 +3713867873 1420417259 3596781200 +3027254147 2410524476 +3620241404 3317236652 1932693927 2896263591 +3698987943 2277350835 3140284384 +896825653 1264235820 +3999257420 2433843104 +3294784912 4069883968 1307682926 2692764046 2388179259 1402847210 3232804927 2624934679 2471520015 219119394 1766956555 497004570 +503959648 2842887973 +1955213384 3448380059 1955213400 +2612185851 360024370 +2423485780 1791493349 3359078813 +3921281741 3167905970 +527471616 2117663763 +1496588148 3779471816 3775759257 3597263892 3779471839 +4275265264 381580227 4275265248 +1848291046 1395741697 1501983514 145175037 +3613362158 4184013753 +2304591967 2614352242 +1645371371 2484422443 512591964 1307377384 +4056293197 4055457746 +1074755344 3898109475 +2485888624 3923794907 4113595751 2232986589 2300097048 4118055826 +937976060 4275088551 +2571847044 3581832905 +3310270954 2230233947 +1575598180 988628351 +813828315 934539474 1950614664 +564448261 3545205824 +4171119338 2479730561 +2995520804 1428766488 913053609 +3161017685 4005870794 +4115923401 2835606872 +2326559929 109598526 +217247318 3982093362 +2474887633 158774288 +250922107 105991588 2516400447 105991602 +1546263272 1477752675 2577568796 3448033488 4266154795 2296881411 +1745317592 680488548 2612231693 +3176994334 2901698110 931778879 +3707863492 3258163198 +2588295250 781664531 +14533411 2149199900 3308895239 +2918233270 1712509311 +756743703 1336335982 884517578 38660527 +3512571834 1347803613 +1110013665 1013645574 +3258381068 2205508384 +917225667 2012392238 +2179966320 3013151346 +22654394 325871478 +3107087382 176787703 563681322 +1563504963 505165668 +4223760636 1301378215 +1179302100 2074146223 +1015938879 2458439742 +3662064050 4030622043 +1065129189 3592316026 2346200093 +3068211329 3537101327 +3647536879 2708235066 +394229268 3137255827 2679485146 1801863580 968155977 3956163690 4056829432 +1756070623 3312774044 +3537726354 2224051909 +3802618086 3010523671 +3206381006 94948697 +3948263576 919315500 267491149 +2074638125 2554219410 +3046867451 3518971615 +374015003 857175684 +1409973498 2328912322 2328912341 1182973323 3305118678 +143555787 2290086392 +2343760077 3081835172 +2207750972 922336377 651562755 +1476358442 2971608347 +3501922671 92866990 +1851578713 355084040 +3584713239 1916299814 +1926977501 1926977485 +945520653 945520669 +1695876940 1813675169 +3476740974 3547573773 2812767801 +3801298335 2018063073 1471652849 1379613382 3026364369 1287481694 +1772122808 2791612000 2791612028 +852119248 3296334179 +4254631386 286963243 +3053840654 2572017926 +2587786219 1756306887 3270376710 3143439074 +2902217008 1899214195 +530613846 531855719 +1475736192 4163682195 +378590022 3422328631 +683832485 3474825146 +848250333 1436187518 +1143101098 3960368525 +895115176 2772735357 +543258134 3949718677 +575250739 753451845 +1844223123 2658827130 +3604853996 762547981 939501591 +3142577337 1024083614 +1099489779 4122509175 494645644 494645658 +3896853987 2296369497 2222839428 +1123758014 3326290121 +198908527 418028718 3998219793 4048860588 +1413999657 3594044568 +3040607455 4208653707 745476872 +1599031153 77932264 +748200793 2370381064 381352689 1304908108 +2196860534 697733718 1662141002 697733697 2551243719 +1192137708 3354582167 +2499338255 2462627726 +3402182774 2688284006 +3955049575 2970098803 2180165152 +450639647 1100895100 +2300158082 1431809187 +4075464437 1550111676 +1213664486 1789259313 3339275777 +2936568721 1434438966 +384130629 2296992184 +2088610359 2790307177 +3399384970 2172831277 763857926 +4212635015 73025592 +3217578533 224782380 +1375496217 707502676 1541811046 +3057788441 1283165929 52558174 +3871810620 2273184359 +1557748238 942195718 +2856648001 1268428096 +3209568700 3825146609 +1234435754 2113529229 +845453278 844829289 +1893081392 3137635467 +4143919688 3465684159 +1840797994 3811859739 +1551654018 989062405 +1472401211 1662056932 +2451355578 32218010 +3905376242 4273805723 +3338501868 1867350528 755944833 +473223297 3894688534 +1334256704 1908281555 +320754331 3015444996 +2444808734 4236769298 2444808718 4130112041 +3053545232 2228284779 +1655448716 3774711905 +1395695951 1131399066 +3536904118 2972601510 +983328852 3128247357 983328836 +2355725140 2355725124 1535434920 1578745145 +2060223937 4175989549 +4056043690 2641892613 +1378443255 1041651797 3483503220 +1484712643 315330794 +1967368646 339019270 1602503351 +3718661137 4070265568 3397613235 3783498448 +2524847536 1409713236 +4240688762 1647407645 +3896575631 761090830 +2365862791 2224889216 +708516486 17481953 +1886207630 3266993166 2314828175 3728818578 3266993177 +2810317239 1756711686 +2532413908 1917358255 +14834477 1552972955 2611269509 1802931680 2611269522 2438301650 1569750561 275882687 497120250 +309625616 2311907855 +924748297 3457371192 +2991381089 3747205265 2792165447 3747205254 268158646 +1339997736 1514079169 +3518953536 1872809171 2068814468 +3183289187 331265244 +3525004795 2683459348 963627743 2666681742 +813529389 2189803972 +2856975231 2440489192 +2185649325 3250840644 +3584001528 1109386605 +212448512 31287611 4012371731 1297959736 2161984731 +3128508631 1675694704 +3386178801 197696896 +3852579102 4144834745 +3751636388 3100881487 2832439615 2832439593 3751636404 +198394608 2375180245 +1634603173 1728670860 +1511647810 3955786826 416007651 +1644775508 2828852281 +1593220623 3952603724 +643599105 355828262 +959543008 3906871987 +2181385952 3196330413 +4103024034 4221131446 +3881323928 3355584091 +4242011976 1073528343 +698096007 2906572420 +1478666345 2803597664 2116584405 663690584 +4277842392 2101599061 1017509659 +1803814980 2228814623 +2861193234 2311627845 +2948697332 2712724495 +2531755869 1626805222 2631815963 +2827249533 3312380372 +1205800878 1955628011 +3913066993 461342320 +2627813673 3134821272 +2569316818 3870774675 +3121491887 3121491903 +1466696010 3909486459 +407690128 3506283445 +54243915 295371445 +3925176187 213997036 +852967541 2111469628 +2527321921 1293784749 +2574013831 1245672807 1044341395 210412416 +1340324056 3486820843 2193463703 2176686081 1040763176 3486820860 3442328103 +112507601 3345621271 +3175496897 3331439888 3175496913 +3457712752 3457712736 +2312377493 2380031644 +2804732450 1301203843 2596953898 +2656916454 990840549 +333721869 1564030820 1564030834 856836197 +3352716761 1870812296 +3758417579 1387732770 1387732788 +3723899834 366053195 845197354 2924930582 1595266690 613641675 1595266709 +211494907 3544182820 +648496598 2941448167 +249438446 63711343 +2151182647 2151182631 +1705389661 3602056111 +958319101 3900176724 +634415592 499386389 +923905434 923905418 +3308284758 3241736305 +3337164569 2379112866 +3574561448 257824363 +1017947135 2732669862 +2326094563 3093026548 700170704 700170695 3430185437 +1033085404 3412577607 +914807551 3578445672 +2637919141 852035805 +886799583 344298270 +929809241 2544141598 +2700643161 2700643145 +1370400111 82734510 +1852710248 373606790 +1610293953 4212342769 3646404054 +630260719 87589240 +1977581722 685208189 +1586926075 3792162340 2728525490 4132012735 3792162354 +2183234687 3815423890 124537148 2826181631 192374690 254473869 1421918537 471612692 472432472 2390227256 149395690 1863333240 2858825862 3465304568 47891510 4213376000 636608307 +2619944939 2619944955 +2169020523 2593221614 +4100682133 1512295836 +1428175551 3493480742 604530455 587752833 280303228 179637524 3233577640 280303211 4009989743 +3299038197 2112498074 +11754800 1247523459 +38079415 3655779817 4257802645 +766787365 398419770 +887468519 4081780639 +3329282479 3113309178 +350499483 2117839378 +3778154176 227597099 2483624631 1910845762 3742341864 +2147372464 1890829596 +1965101082 2097961213 +563997916 2338257297 +1153438265 1667012248 1153438249 +4242169303 1365642573 31619312 1928789559 3884212675 +1756489424 2685294947 +2033701023 1910336072 +4022774969 3644786313 +1110756182 3509608800 2889507797 +3183610691 1440017917 +2538275234 3440611861 +3594895864 1204836717 +2342519171 1340236074 +466023188 3459295353 261699176 261699199 +1347617560 2722981219 +3938325503 3938325487 +1513638185 307589780 2017822108 2135265433 798698382 798698392 +1760560032 2895927136 +618320974 1383872207 +3162707255 4183451014 4183451024 +1186083065 1132664808 +1803043558 340873239 +2889927463 1358941814 +1930149313 3699095232 +1696536624 2495233121 4030214793 428808400 1679911877 1432194197 +2945060338 1213461498 +194042174 370071071 1929772169 3505955618 +4008140919 2369575760 +1492657501 1805832564 +1365035392 2500932741 +331241918 3534177823 +2759581263 1493742105 3957046596 3209729494 1251934791 +794921994 3075142988 1130996376 +3766584602 2246346749 +2090863832 2457091172 133445645 +3438249093 2514417073 +2725320807 520710710 +1475879882 1168135917 +1099252931 3656653756 3888856821 +975073328 1356884335 +3182217207 1477948020 2382285254 3949702313 3568044845 1477948003 2382285264 +2756668810 856256571 +575727554 575727570 +1297191039 912685032 +4087507136 1219159621 +47965189 3532861299 1446194976 2756180851 +4098307446 345715030 35203271 1532530506 345715009 +3636091348 22767801 +3029788250 2743902141 +1140202777 486661630 +1323511757 2470094715 +4063289276 1159944048 4277155057 +4001476776 4155608276 +578786840 1725515739 +3777294007 5712407 +3423473089 4213155520 +1363149327 1232349295 4139990424 +2582262103 239320898 +3336586730 4245557069 +879727599 2057691448 +3948254156 1136110120 +608505042 303193207 +2864588960 3298491549 +3609757257 4257965304 +2092788981 248101377 2793959654 +25075629 3714181125 +2758783034 366111581 +3225010402 2095752149 +3043339522 2433702435 +2982640039 2214887904 3004724147 +2457032796 3576946128 +1435290431 3953390632 +491940916 731411962 3687261343 4017397844 4221388819 +3002359008 1272846808 +3130156495 2205566158 +2663064462 2663064478 +3397915616 3023522213 +3062624730 944618045 +2789150464 3041172755 +2881669619 1453582746 +2801128214 3942337447 +51044071 1319026958 +2837528178 3873070137 +3082228373 3392290954 3392290972 +2302129399 2681609551 2262169059 +2101447421 1058574910 +3838385230 1989643983 +2091243131 3020989362 +3533158485 2807957527 +660395489 3626283296 +2329434996 4198155743 +1131428471 2696786790 1255324631 +2360117436 3892988187 +575496171 3939368692 +1153438257 1801233200 +2065644244 2509620562 790839315 3958288213 502871153 2045986450 1825671555 1351767040 851324564 1280943915 1922081744 2708769425 4004510840 3597241539 2558184816 2298503098 1928154991 567069629 1097770406 2902384871 887457535 2055690829 4175019209 115134169 1316932275 158204940 1809388221 +3015967601 1572100840 +2524664948 1478881935 +2374732037 3618157260 +566002199 851495462 +3574561449 274601998 +3893882307 548096508 +4147229152 3929737911 +1876008692 4210899471 +4262484092 349658663 692054337 3156668716 +3408616148 2839542713 +2530981173 2530981157 3621948621 2967356010 +3680109513 397669742 +3478296702 3708161609 +2962302022 2172281515 2360650875 2210330528 2245197845 2905146175 +4105677750 1216683922 +578017483 123619220 +3124869119 611618094 3124869103 +1190355651 3395971510 +2416104755 1412064928 +2950320624 3299802325 +3917361960 3114960875 +623610854 2287309609 +734633840 536371732 +434249219 3254075068 +2804465387 1460669880 305890046 1460669871 322667652 3045962377 +1007560751 3108585966 +1449750432 1420890235 +3172602583 2987081199 +2849044940 536427575 +1864018572 1864018588 +2089177338 2155451040 +3090934553 3590519302 +2383984449 3409776198 +786913836 1899092317 +1734586676 4126143695 +2763403020 2218589985 +3485398295 3485398279 +3500962265 3500962249 +3261829854 2271020182 2271020170 +3774397060 1355780871 +1787846810 1398188071 +3929622015 3072929918 +3054926901 3664086883 +1215611513 3666047561 2429503983 3666047582 2295211134 +2990505438 2012423295 +685843606 4033648679 +1030153209 4106889602 +2835009689 2614517960 +4213631565 2873284402 +3400154733 1996506514 3917860955 3882714322 1996506500 +4050651797 2586399034 +2664572570 2664612971 +3470512412 14709047 +1486452103 9700246 +351974085 351974101 +1852686659 1852686675 +502015983 163765550 +396008054 2797135215 3261474378 +1109765471 3811905414 2245089802 +3357339430 730626263 +1730461869 4232016133 198922322 +99014124 511193367 +1024378607 222505518 +3524819122 804409435 +381070115 2240232029 +3141495915 802663540 +4254076532 2647048335 +3910675706 3943615883 +2035736120 1006099653 +2496655912 188376028 4227951189 +971905651 2765333274 +802977797 802977813 +4114298881 221850006 1727821617 +2712079644 2516165393 +3275841224 2077356877 1250041473 2148225514 +2957157802 2459759123 +1685927319 1685927303 +254387945 3348218055 +915223622 1262573763 +2729982524 3804788208 1409520471 +440003738 440003722 +2294913435 4032614162 +3064119419 4248109476 +3593676914 2760420211 +3867429853 3208867060 +737821644 116963873 +2720844355 1716054055 2407688060 +2048604587 3822831650 +1741609729 129561217 +1213726771 361254988 +1891808695 1891808679 +2232470704 695351555 +3982392532 2143191481 +2838287680 4035182348 +554121132 554121148 +91753807 1144198043 3942445912 +2980549527 1178564354 2548586549 +1048714984 1322690347 +3946828392 1873641324 +4131693769 1997498488 +1053904121 360267998 +4221578681 1391385781 +263834043 1590488718 +699625203 2557978778 +864851384 3729764525 +914543772 2201192272 +2610031580 3266726727 +1024063037 1403953684 3186166069 1403953666 +909229541 894300026 +734221345 734221361 2591506513 +3186505449 3875565784 +3883481201 3570653680 +587205288 3239102077 +2432498367 4248746686 +3514727401 3233798898 +1568020620 1568020636 +2421770678 4069460359 +1330044649 3046172888 +2424944701 3572971040 +129604992 2838687877 +3693235323 83781042 +1284172190 3834324415 2850983746 +1869031596 3087641793 3089911301 4192993197 191170240 191170263 +3587227473 3902614672 +3025714022 3783229606 1303314839 +319190774 3912058183 +2700233347 2229863015 3765128252 +3479505041 218922064 +1957694641 1378083168 +12025458 2206022554 +1600427498 4035376630 +617218024 528213968 +3797628827 4036528402 +2338675916 3589481628 +1052573195 2364774029 +926554400 276139365 1309513196 +4175850436 2528880009 +4233610058 3082519931 1376218238 +393052414 2103373291 +29028449 440952992 +1725421456 1976063907 3899399016 526520811 556574085 3882621394 +223676172 3495139105 +283856856 2054074637 3376461683 +3849036418 1776992781 +1521185305 2179185406 +1005465987 4031824240 +1414625465 1967196968 +793680921 2190594554 +2971772056 2372729380 1878399821 +2553373647 2368052529 +3226947682 2850203498 728992323 +909556585 3240691278 3240691288 +1222432212 1092794175 +2161314876 138166897 +1760395697 643762287 +1927276042 3765903803 +1820805093 613347619 +253167448 423661453 +1980941051 514428895 +2663161736 1794056989 +132896221 408945109 +3559082832 821447035 1409159672 1409159656 +189829193 416490222 +4088970714 2245189163 +2181566558 2508332544 875641964 +3889214802 1066233861 +305474474 1404288155 +528903910 2258670593 +3284570262 2866716647 +4257899657 2919140078 211220005 245121966 +1114323583 2715384875 231544296 +238820600 2338724228 +3486502340 3894471583 +4025212731 3947915748 4025212715 +873529540 3133420703 +317287908 3023850571 2843213311 2616590472 4293603267 2665034480 855141137 1309707216 +3600479446 1415874558 3451932299 +3068314980 1258077289 +1051224468 924726265 +2310056798 2365035138 4208794985 +1805035117 3408395652 +3228273707 2856255566 +2880851310 3187401775 +2951145684 3162539449 +2222751888 3360835177 2222751872 +103239698 3252882515 +1046762146 2512198532 +3211472912 1706862883 +3174811116 2863571200 3508048513 +2881967271 1135735865 298468064 1152513503 3781641892 +3512999788 211646209 +1324175605 1406804259 1993667814 +3707436091 437981412 +2209352579 2209352595 +1710959673 3278282152 +3163963904 1636646706 2115312077 +614931484 3474014225 +1159505728 965268698 +3791545988 1199268319 +2302419925 2302419909 3735840842 +1185135977 2512148548 +1418590387 3464397260 +3656862206 3058821986 +902330758 1966062545 +907172882 820441157 235130174 1317819053 +267205382 4185530274 +2043227292 1358798663 +1028629381 430009276 +4039658157 3092090436 +111139196 3919797799 +2789211565 2649703897 +3930050566 81072452 +3379556455 491300978 +1434231961 3455773007 +3302600093 507445122 +846586126 2106673433 +2595284622 310047129 +2869473107 4257446871 2869473091 +957707565 957707581 +711104371 711104355 +1560272 4118450531 +2223963425 3457710816 +4179835655 594502152 1777570393 +3121411555 491064519 491064528 3652393889 764775133 3311866972 +970470901 2384051499 +2615237692 4074465255 2680435303 +2900254886 2900254902 +1409918292 3496399528 2670674745 +2702938333 2070219746 +4222400945 3790098854 +651645838 359191736 +1890883716 4031518687 +2536801962 2981100955 +871630105 3794011735 +3267203364 3026942888 1195218501 3026942911 +1561596935 74944634 +206157651 3576125089 +3526125385 83962798 +211778791 1992185618 +64503298 258579747 +2307098442 486522035 +106649608 3262060848 +865133746 1909370670 +2853611545 3668615006 +3126468284 400450032 +193870470 193870486 +911157734 2613319158 +2985174039 1728302136 621656963 +4055456376 933959287 2182699338 2786345504 +399738461 399738445 3741090914 3741090932 +1216844459 2906490974 +1110836530 1450696548 +1913418583 3766944201 +1581657270 1382858100 1422589483 +3632815024 407187656 +4005831505 801347718 +3850883537 634342416 +3501841973 3382234492 +1145629848 382497627 +3240423227 2720768111 +880406576 4169989844 +248509394 4195959091 +1429050923 1909477457 1050222763 +1321852864 3387837837 +1145980003 3929384924 +3058465532 3480210199 +524208717 3133383589 +148425308 1229360849 +3813221444 2641206445 +367185553 84618832 +3052445963 1959625794 +1055588612 1762063431 3988065367 +2570053977 3045925928 +594774216 1612870133 +1551439572 1160994879 +2540312736 2692768108 4228170725 +2607108359 3880504456 +575145609 3367632110 +4197746093 3687815747 2377019204 1427930474 +1250621907 734480186 +574698383 2074356238 +3772748352 1072904921 1072904901 +3252565888 3119845527 1405689254 +4072135249 1751952784 +2760985447 2572483443 +1908465057 1908465073 +2827603952 377403288 +1055905813 3867384506 +439572601 3777689694 +2770591740 312353302 +3704777044 3616608067 +1949507094 2078114213 +1926921409 2398249920 +3687774929 3621050128 +1854665175 3712857456 +3750594260 4028855864 +1107054300 2992482984 2713182063 1624580449 2348878407 3403858229 1393872330 3392020293 +227235333 1315000877 3460590122 862544999 1513005628 1465412044 509082176 2539615363 1513005610 +2681648736 4278262053 +3984106533 968857881 +1627894408 624237744 +2800759726 2049006329 +1270390881 4045445775 +3377579486 2763117692 3220274983 3744089388 1512782375 +2507683366 1916616151 +32320404 2623248879 1289408884 489906943 +2841571830 606896577 +3689981128 393676009 322896130 +1250934096 2957444323 1959579051 527542952 +3076493696 728894611 +2262152199 1231709952 +288467870 2939234751 +2701090212 369125673 +3290947412 1044167348 +1348218090 3952301599 +4158456296 417988651 +3881291588 1933264927 +3198823027 3052157943 2564870938 2564870924 +3555744852 4150351919 +1588459044 802847423 +1597333808 285736597 +2859052976 4099904021 +921106881 781920960 +3546160081 2384841222 +1261852423 1837826070 +27483455 3542862398 +2612140073 1113327751 +3588182581 3817761148 +1897990599 3334725368 3724698697 +1483454184 2548887943 +12831952 71002997 +1059422468 1063137194 +2680137132 649186775 +1374164126 3560949951 1989558930 +4132658922 2887735330 +1732867681 3041774737 3041774736 4185458339 3041774726 1971504199 4188363446 +158262376 3197283029 +4064733591 4238456998 +1364714813 1247665940 +1155120017 13831478 +2592193247 423177502 +2243560319 2924483355 47415550 +277724986 1227098205 +2394597839 2806980401 2458786352 2128171214 +1662395500 1742427671 +1883479526 2848417585 2848417575 2999767362 2691797271 1810326134 +1809534491 1633807326 2939164837 723930729 1840696236 1633807304 +551936829 21496647 +147022945 3887884934 +4270437397 1896494281 +259948194 102848789 +2543386271 2723553866 +444439627 444439643 +2826764635 3378541201 +1422911653 676019116 +1950184370 2931630387 +1210293594 3926963371 +1913612105 3611269112 +624173513 258287589 +3291319172 1471324383 +3174811129 3726157544 +2110188173 1819618102 3045323497 1819618081 3999031264 3186815847 1870447904 1920283781 2273110762 2256333140 +3301078325 1769215568 587680973 520570513 4078862954 +2295408698 2604815197 +4050362866 4268748773 2100738970 +654955423 326640456 +2976062149 1676790266 67314707 +2948439898 174799650 25287339 +1182835934 3666053481 +1888541504 1946756563 +2255505330 2661037901 +2865785887 3426816143 +1707501509 815196099 +587241535 1553365127 +1066952165 32008058 +2630156994 94542791 +3327304441 756452862 +577842674 707482611 +2868244332 2368202497 +3084064716 1938028023 +1582487477 829002236 +3011803331 403598036 2841346685 1552554730 +2391690175 687947176 +4017913415 265001299 1207617984 +1259941580 312553157 1259941596 +1276338350 1887515129 +2286131542 3630850663 +872231658 468803909 +1871438532 1563818655 +1447025874 2559090309 +123050826 4256297125 +2349308616 2349308632 +3475448312 2717258368 +2963164289 2963164305 +3000690750 3432749449 3086144841 371722274 +3186849374 1682134505 +2169619644 1345112424 +3844302816 2884854820 +1753038843 1535793516 +418242978 2266012292 +2013204037 730035852 +1223642581 2780268124 3905912435 +4216467452 2657192359 +1368138288 2409222531 +3805630868 2848943087 +504512831 2512172584 3759325419 +2325121542 2349022114 +918161210 623355210 908640483 +3942890960 3336818293 +1894845441 3698720464 4162371484 1894845457 +2050673485 3079539236 +1500746545 871284161 32552486 +2014439485 3706182097 595656779 2709474082 1093703700 +597251673 1667427870 3718468878 1932278927 +2630552387 506171696 +3070580861 2590657748 +248648671 1851810972 +3942174294 1477289249 +4010543425 4251756560 +1103366762 4053558491 +394352652 211655415 +1138427166 4022931007 +1725707634 221425288 +4230123340 1175386487 +3691809016 3691809000 +42014208 4046823955 +3342094647 1788312995 3462125968 +3139761001 69938766 +4072081032 71204695 +3122773647 516245196 +3147336017 2720017030 +3450487566 501625998 3506933519 3506933529 501626009 3829863186 +2358448389 2574800188 +3066370289 145910291 3286039546 2797222917 1417296261 +3938101098 3666069749 +3824484117 326369281 +173868487 1359244467 +4039847665 821074676 +2561795900 2618229624 597849595 +3572023370 1952887917 +1499075499 1405941282 +200867371 66592162 +153551148 3730379462 3839201641 1103084659 +384054719 3359677352 3359677374 +702609457 505853232 +461022056 2853125291 +1370374406 2605735031 +2616875470 1289262255 2133513261 +3832767393 1118164598 +3324690239 877334561 +1088373874 2065001751 +1667550077 4104934868 +3101164647 687387001 +2685186434 1979412387 +2955653646 1657359385 2060425234 2447555481 +1743220383 810755166 +2014439474 23333837 3080469150 909149861 +2826878708 864459289 904172872 +578793375 4098803275 +3064824886 3374784775 +833989186 833989202 +3492366925 2760042802 +1355180809 1355180825 +3378669842 26456759 +2973833689 3799756936 +2789887557 2789887573 +556035467 3076026818 +847919932 3415949159 +2834625380 1570449023 +3254292976 1246608579 +2940224111 1361614008 +472691683 3199997275 4160634918 1445506396 4023249621 2635439698 2635439685 +4073423368 1465264158 +1700782608 2784026403 +1993065544 445620140 1254489437 2071992176 +1283322548 4290400008 507842905 +64342526 64342510 +1609153015 2088538793 +786148147 1019979239 +425236976 3598341315 +1169939484 3803938833 +3778224242 4118549349 +3939916597 706382227 +3517960077 1377782514 +2093683889 1904840185 +1202906006 3036730901 +4008052199 1609069982 3414489830 1274830323 3479239828 615083711 2740753087 291872485 3924486841 1172091846 4259823781 806855116 294642994 3383494532 3654350530 3213178207 2893523778 3732233184 4038004052 3644222067 4057599000 732334940 1482735634 1526646128 609028895 13746217 1780513130 +249438449 514435200 +3461841857 2139841119 3715642127 53543578 +1640465871 3155666126 +2043231540 3955972313 +2253518068 1728355343 +54489787 1009332584 +1896053304 1896053288 +3919196471 4105927056 3837485174 3919196455 +590284370 3037131539 +2180686974 462484041 +141592354 141592370 +297923786 3193199085 +3091310535 3596295766 +260051459 1771854524 +3524286541 4157015291 +339740179 4090073082 2046613741 4127816964 +408740446 3090700799 4290096254 4088764810 +1712342093 1712342109 +805481441 4008882080 +3306348465 3272052813 +4128126081 3646727936 +3461475922 3780291573 3033650489 486157075 +3143625068 1677489409 +1138430235 3973836173 +2479179784 756381872 +3812161344 1512600568 4071438789 3417436428 +1899281668 1882051304 +1488713595 719754916 +148482845 195583668 +3497471171 2528921700 +1793232087 1628763526 +1475224026 3848662692 763480049 174739431 2488123504 1172261437 +3420968160 3723762867 +2796729729 3777480163 3702250171 1419543645 1216480184 1233257806 1419543626 +3500107363 3454938570 +3674250894 3647150906 2309104922 +1471619723 715746734 715746744 3602360569 2059511157 2689294530 +2688380802 3266742709 +132949861 1510501283 3733685228 1335935626 +1141886306 2262847829 +3029968800 51331096 +2536472920 123347872 +2658604 1809614935 +3856079721 983574094 +762654217 2979067870 840052846 1988394271 2557966392 +2509048024 2398337914 2209358109 +1936450744 1321689280 +140022740 4151359161 +336099349 280168774 +1367318403 3471317802 +1401217263 3415220282 +3588300914 593892197 +426103858 760023731 +3720477508 1549700127 3112942084 1909879343 +2110325097 1819097176 +659763093 3812723888 1039498810 2096359306 2096359324 +1838263704 341067355 +2591930393 1887334654 +4209722693 3440132989 2856602691 3440132970 1163791258 3507243446 3428321681 +3444114083 3438225034 +1217774641 3574582598 870969991 1958992176 +3950557339 1242209298 +2341069908 4262621241 +2704402141 3273217392 +2756001624 4098290405 +881753770 1716610445 +1274830479 540933190 2393897653 +2933216361 51710160 702814737 +590035127 4214289901 2495899850 +173093664 3765504203 +2588813608 3304842848 +904273255 445972438 2626593152 1077954876 1630751079 1362309191 +458744597 1162803251 +3141108360 1178406064 +1650409645 3896373522 +2537067894 2215856337 +1202247925 459710568 3285027260 613970053 +2925289791 3127711294 2713313532 3985845505 +4229618302 1548088415 +2325107173 2899277923 3936472227 3455855142 262335340 262335354 393785610 3305909526 +1170226708 1170226692 +2443013588 277942079 +135568569 3286013963 264174255 3583407752 +1885939951 3834343480 +1562728174 660252089 226194926 +2511893500 2632295857 +4028688843 3469740674 +1364655978 1978930125 +1242845626 1304175746 +2297391060 2186580716 +1209192091 278609412 +397070232 2253915955 1345166643 2964377696 3655650395 +3659210207 2586592725 +2620734839 1590673990 +4128228647 3216665395 3230951865 3216665380 +1144234436 558344095 +3689981129 3936508194 2366729340 80963704 2421245847 +3639647810 3301515747 +1452564159 3175409622 392897971 3027817674 2645765282 +1672454979 1672454995 +2965490310 1477178577 +3562216255 1016081131 +2506114424 2660064237 +3550283878 2251569281 3677689265 +2249433651 1139299916 +1193050980 441841933 +3846880798 313084201 +3570422475 2327273095 +1368475879 1320534966 +2799323521 2225690717 +3785423051 3273845014 +4018675247 1385481656 +2950468106 3693389170 2950468122 +4196343946 4196343962 1224751419 +1902173968 2340365859 +1965986245 1028618522 +1208982267 1804663090 +4113150232 144820429 1672420004 +416188558 3841563550 +338995138 2430867061 +2874192918 3322642097 +4191139216 458340916 +1725979301 490975075 +3351912829 1124175352 +2565586478 1584086824 1722741934 2260253218 1722741945 2565586494 +1055242257 346079952 +1708237265 4139449696 +1828598633 4247449176 +156389031 1402065142 +92576754 2526627227 +4136547840 581468677 +1528824359 2590204768 +2982334955 1687560034 1427836267 +3539699006 2703567921 1609744534 +3811652398 3773690297 +3772915406 2383101789 3522592345 +4076014031 520707099 +3587632694 135886849 +2601049929 1688100178 +2780561925 1276979169 +4160394332 3145174225 +2606566875 2994409887 1853673412 +1078975713 515421750 +3582302494 1062210089 +1522432880 1239175516 +3615095113 2114153976 +3080188253 1630598498 +2250282786 3265801258 +2699735653 3061241082 +294076500 3957998648 869486837 3957998639 +2788671451 3271693192 +2878673275 1718517650 +2942191129 711481694 +949657103 711381390 +3901275654 356721527 +2881143887 2932220571 2785216600 +890166258 2019835365 +385179919 1443099544 +654955399 625410696 1575227524 4218944918 4218944896 472104921 1575227539 +1928171899 4067752331 +712107043 4098499338 +1279464236 3925725271 +4289890378 3490483314 +4014259792 4181170165 +2068178694 353021566 +3782809389 513768388 +771872926 182976703 +588218080 1906541881 +2965625584 877766613 +326495071 27362974 +3018197216 804234964 320862387 +1797202343 972250718 2961177855 2529753489 965104425 3664992220 1534858149 120337961 3834794219 2369880869 564055780 2280578948 3838709649 3255348265 1888843470 +3058748578 3650482998 3171802641 3549817249 1359525591 3549817270 1376303213 810534598 +2943384509 3943877268 +2911849779 2851536032 +3004524954 2226470269 +143867268 63559391 3216842351 +1253223800 256316411 +1353352007 3826099780 +2432031842 2500456021 +1620481304 621589709 +1907860829 1629049204 +3609886812 333975761 +756492312 4224749242 +3853722342 2130702359 +3589055256 3018861032 +3269648005 1344555846 +1552199409 2514445680 2514445670 1420599169 +1455038349 3463530580 +3358432112 3306160217 +2026876763 977819237 +688029477 141581376 3018729260 1927787840 4006530515 +1179349600 2875844184 +491940925 1722588625 +1414890693 868968131 +3303146120 2922922040 +755139936 5801821 989328947 +977161481 3105047854 +3740733820 3114483505 +1076873888 2872834533 +49012148 2287610916 49012132 +2944496965 2378931098 +2679775691 2684919534 +4041460828 4041460812 +1355465472 1326973645 +2890499821 616523538 616523524 +1919481026 4286586106 3711520117 +2849939113 440246798 +3658919687 3658919703 +2766597282 2445295037 +1373103168 2992319518 3184730079 +3183884611 34350186 +1114950636 2312963223 +2013329353 2995130734 +2354180296 753603479 +2529155433 2529155449 +958605487 1999441388 +3212095410 4009420185 +2048107798 1122820519 +3570955796 2060084925 1446375807 +592623832 2457462304 +1767357701 3659435724 +4025815563 1700431727 792485862 3253939039 2662972855 3843948361 1784387015 291965028 3811149910 3728815399 1338433014 4191552330 2982855460 3500103296 1151778747 2357313121 3327954414 3170643127 2901694666 1332710852 596786266 2460215556 1161525521 3565387634 4171946858 1668728563 3056787911 1781628862 1076187087 2955591554 3511753992 1371245792 283271091 3537813843 1301594427 1022448049 1732804545 2340223292 785451457 2047351835 2562674473 1164122233 3032697250 3823219960 4276104108 4111039180 1004930962 1083192282 2211567518 415953225 3803165940 2190719596 3239412500 195006775 2410886531 783456359 2438072526 3195462960 +2878945146 3996901442 +4207762318 1598496921 +3226367543 4068743302 +2364035997 1857790004 +249411273 144557880 3361774907 374770309 77447378 +3140549411 3508230154 +2962431843 2098401863 1520068828 +674976531 674976515 +2719023638 918964398 +261194519 2568052016 +1442326909 2432188559 +2124028795 2002014308 +862334202 3822636445 +1722848810 3522978829 +1502359235 3131940074 +147627403 1681599691 3626789838 3761010788 1782265432 2834942825 1782265423 822026089 2485617538 3744233182 +496433264 3752287496 +1875332781 446148357 +4242266752 2186818027 2384000915 2984278888 +1634003669 652062026 +1991456180 2417855065 +2731609420 2602036897 +2829485524 1422066228 +3622109672 681992195 +2761422131 1821631671 1821631648 3602073421 +2003640121 969418430 +693845579 2662699706 +2535985185 353461216 543185990 3283816327 +2848264241 2848264225 +2902591857 4056549879 +2623650928 3586372043 +2407676997 788848780 +1336011196 2170468758 +292837123 4046710090 849090111 3232100353 3151796553 3417756793 3174376166 514145414 1762128241 1351054902 1693604967 363146838 3107265700 +3150522632 3150522648 +2128864976 1511576381 303335700 +2616913277 151247810 +4138762301 2497306635 +3220389764 2951544009 +4192323944 3329232555 +1311260164 3206303624 1505354877 +3455094479 11587534 +2816279977 2190031259 3538460262 3521682624 419802898 419802885 +71040249 1176203465 2741976062 +853576766 1434240415 +4252338828 2349406839 +2566944233 3300498904 +3706572703 1767757662 +2747912681 3216339416 +1756833658 3184365398 +1140327513 1483659272 1483659294 +3563362981 4284445112 +3668612416 1089192619 +1921470317 2999423560 806296348 +1099865634 606015881 +4218139057 2072558000 +1337741684 1257679816 +1396538904 567115739 +294272247 833531746 +83071384 1668166235 +4101107360 4101107376 +1527710907 1065581614 3083365615 +3694243985 173765844 3970470013 859370576 3836249066 +3915978767 2138103694 +4120627532 2009228847 3731609172 +600230451 379758535 1778242605 2695016512 928690131 4139960634 911912525 2454405559 2258203943 379758555 2454405536 +3933993939 2407717952 +2584943606 2182415441 +2436033230 1080328793 +4037565743 134918392 +1710579295 3676484961 3762524062 2455434012 +2013184746 2013184762 +2953940266 1436629261 +2261689467 2568982194 +3761018577 3073469200 +1629893962 958784379 +1747142536 2005506827 +3113437491 1440496474 +3265272665 1558166741 +708804126 2683537705 +2631534172 3171975628 +2178795578 517390083 +3116526275 806228220 +249988867 2191543281 2639764531 535805932 3823821914 2471988327 519028310 +3611335398 1914514481 +363741544 2303784637 +861538871 230560912 +756914406 3952587265 +1986427960 2606074939 +3025901697 4198566832 +29265998 217918169 +1565948636 431830928 3408095313 +498606160 416996853 +1437757795 3355423824 +1069965631 3392397564 +2441641157 3942318241 4009428714 2317483360 4009428733 3738987020 +769284137 2783164302 1471727768 3915134079 +4249476661 4031303036 +1450559860 3560368442 2770997203 +4106291941 1650838348 +3048560409 4016477906 +1292970858 3599714166 +1906193513 3458103556 +3931593549 1469725607 +3144575466 4174429019 +2817646417 2817646401 +464720019 1079810661 +2176302745 3443591880 +1772834030 1185553081 +1450269399 3950116976 +3550207790 1281381743 +1028325851 1801201055 605618661 3579165666 1801201032 2729557079 1477700548 +1252940362 3665306221 +585764848 3866564309 +337793039 3279767260 +3652918649 3903897845 +1088841058 814049266 3539815146 3314831207 +127457938 2275414995 +3689908563 3294029248 +2715382510 3075468463 +1051979332 1759583544 4181726495 2673273604 1759583545 4181726473 1398866088 1759583535 +2521370261 2154494596 +243442246 497382433 +73794973 3233748885 2308625954 +2747087787 862125016 +393422775 1472294125 703135165 3066523796 2228778832 3066523779 2212001226 +4239625628 1789389969 +376537343 1403916648 +1537849089 1202045130 433364052 +3552862002 2418138021 +3836472122 672209429 +1521227745 3434678801 2649331510 +1827700361 127349166 +891786965 2186441052 +3050509604 2413684347 2183159147 49563177 3991067673 2045111582 1927668238 +2795180663 2656229987 +2938715053 2938715069 +3790928877 2562776640 3265063501 2826364263 1043079609 4036390792 768484720 2674865026 146866586 233822497 1253335332 1039337722 726018953 4036154068 3408541726 3105384091 555158179 1668879304 286376273 2020364676 4242902374 330772795 1687983719 3551907911 3896928710 2385623355 714982707 1156298813 1200971790 2560297235 2770345430 3327321095 1400440449 3302063837 3673384323 3843475777 1171678182 +4166618309 1198418873 +4186437527 2029026051 2029026068 4186437511 1380207577 +1538589740 445721761 +568608543 2680700000 2036069832 2036069854 2472486305 3552831947 3552831964 +2320759267 1915729629 +52915905 3088275904 +3333973714 2964140926 1497774971 1497774957 2789858437 76522162 +2332945172 6508376 +3068256288 93573747 +3945774510 3928463590 +3620613472 428961331 +2200369730 3093034485 +3633921510 3745280279 +2359064968 3797111051 +3641040124 2686068159 3483224018 1923514148 1261646917 2686068136 4054826211 1278424539 +202162861 2769712722 +2489028853 4153224858 +3706131307 3319658904 +2487299523 630917628 +3044098290 3992709650 +2200012317 2810827249 2309180427 1836169960 +937428484 4188633161 +245052493 1263752484 +2988115739 2988115723 +1052479920 1900435477 +3498371565 775700498 +297381735 72073848 1720581988 +1312498445 1947175538 3969166139 3985943745 +2251526154 1294712749 +3583456120 2584195840 +2848270766 4016086265 4016086255 +1375683084 2420361783 +1106772269 107600324 +1884413425 3252707942 +454776314 3328169235 +3878330915 2600940295 4080429115 1714930077 2600940304 +2561345893 3124742650 +987526871 2394851367 +2112558560 1163722594 3197334487 +2970969717 4203003917 +1548768725 1787080300 450794519 +1983397870 143434671 +2654896709 1634144908 2153737346 3953714786 1582664299 +3095048808 1343206224 +1590260549 18424189 2082502042 +3584178039 2714221635 +974021501 1647076674 4215953506 3190217739 +1262683248 3934256195 +4288664882 223584264 +1596789804 2179855823 +3796590410 1944540325 +1753559948 1459658719 720479764 363865463 +47211987 823144938 2561037911 47211971 +1246842152 637302251 +1922165715 4076413207 +1513697969 3104492720 +2837041756 4287573476 +3246892966 3246892982 +109698705 3691601488 +4278504782 4278504798 376137934 +1149451782 3768230753 +3187672828 369819313 +3293680757 3043563132 +512572251 1934913618 +1320861093 2499316396 +3108903877 2533708865 3108903893 1260758060 +1936591070 1936591054 +82057578 487850445 487850459 +3136172613 2314805900 +5039198 3280898010 3607855094 +2099115728 3324741987 +2097726412 2697738807 +122831552 1182733395 +26694342 1194806689 +368409950 2192489253 4017380073 3429740978 +1772107111 2922647862 +2838757855 2868688578 2209843690 3755545142 2209843702 +148419241 2354062974 +3225271370 3225271386 +2757924920 4281704507 2490087891 1804629824 3999999699 +2716132443 3379235848 +2347875815 881717942 1735722183 +1847017556 2385585588 836330943 +1309659809 488645318 631278343 488645329 2213057398 +3782628977 1581913072 +970122769 2319873386 +3543019943 414722550 +718332321 131280992 +2645299871 3571535966 +3597440586 3597440602 +2039833055 3886506634 +2785374855 3784526486 +2976592997 1035638666 +2185298351 3142952558 +2986583101 2025557012 +3870616597 1137681674 +2212742089 1754084718 +1540526903 3279798160 +2836923562 258402578 3671021467 +2264722175 2133192574 2133192552 +1991779635 129062733 +2982858658 2219105301 +2205020423 3977408000 +533450045 1255413506 +2719841964 449772212 +1907700632 3035828412 +3164231810 1761170613 +2949742424 3515738968 +3662399317 3662399301 +2112383093 2416218650 +2145067430 4227207569 3409309926 2145067446 +2551103848 3342497451 +2717465394 1332382622 +1972872467 2667825046 +710288634 2951951280 +241706797 3673533394 +1551328406 636704814 +3557140852 821806047 821806024 954843545 1363890708 +2670274182 331850977 +1271937944 4040020045 1627318564 1627318579 3595109676 1627318565 707490912 +3763863446 3230095655 +3353571040 2332527283 +148128554 270908173 2254801797 4143235107 2161163238 +1383849786 3144290343 3431969363 +842915362 3699395389 +3721940589 2827187588 +3929633122 443383107 +1834895693 1561060848 1297465933 +2667397483 3014523746 +3078201263 2205573230 +3248231332 3552973768 1185427865 +1954519559 2121295705 +3744651628 3373024535 +574270939 3785470344 +3996300518 2786666257 +2629142129 583181296 +3762975553 1446211414 150488166 +636001047 1439474980 1189889818 3498207012 1857283987 3952214805 3119614001 1543789816 3053548173 2231751829 1612827467 3109633837 3391352878 350878766 1576792866 4289944112 1912312035 3341146213 2434961938 3752145337 939902549 1571321289 2755449951 1029495752 1107373047 359987066 3441186085 862551555 86150356 2939564766 833273161 317015091 4108277624 3188679375 +4096390377 2680059740 1192004303 4256464356 1192004312 +4203010839 3351789510 +82801760 619983653 +960263802 3091986242 3495480974 2221521550 1194764597 1040990749 2486075906 +1436629273 411586300 +3533518360 174086112 +2525835565 759458244 +1562508557 288948370 1218638948 2843827058 +2042078421 1897429852 +3249323694 2431658982 +2113027533 290933170 +77426762 2648169917 77426778 +3437750545 2719212998 +2526386364 725878038 3088961271 614283377 +3377043791 3377043807 +3489796688 3489796672 +830605947 2706042687 1290567474 830605931 +2531988955 1863542738 +3846670985 2194871967 +1253713583 1376445816 1376445806 +3175849588 1913286799 +3279436455 1154094157 +4225648813 736913476 +243550507 88026804 +2381002387 2409723159 2409723136 4232505708 +3334573269 1965702522 +3568378685 265976084 +1762820138 158040871 +3649346235 3649346219 +2771815775 4135403624 +822860865 3387457347 +1807465882 848001387 +683168099 2279486964 +2729138422 2610479319 +1803344843 1871372988 +120419941 2178656650 +404030061 404030077 +4247293053 4090826628 4247293037 +409396756 3439452520 +773593654 2339406871 +2046180620 178395624 +394324604 1301758000 2079400241 +2866790993 2866790977 +3565613246 3565613230 +309457789 1321232482 +3423116454 3616446807 +976362322 523650043 +2214935666 2214935650 +2699036386 2345744601 +252677257 1048198072 +616250169 190374597 +1053597726 1340439013 1797184880 4286054441 4078020042 764795992 2487103474 4196405055 4286054462 2362083010 754208105 +1935556026 3760195374 +789380492 2641568609 +1384922789 1384922805 +1536585030 865349462 +838627442 577045363 +2149108546 3250908856 +1006848660 3104578024 221144825 +2506793831 2791969636 +3039560310 2856837063 +3697501495 662197657 +3221244013 668182866 1582861044 4005084763 2625347269 2909930386 2625347282 +3838736620 487086999 +3634848613 3634848629 +3602451793 1448081040 +3106998748 1681032519 +1363149325 4106435172 3643768195 1893418544 +615527609 3030146277 +3184620257 4201209105 2981615670 3219602887 4201209094 +1873682479 1688726865 4280258924 +710826855 428466976 +1587770098 2225508370 2226484379 +3310039133 4137497385 +2010793504 3432801395 +100953789 905597844 614066123 +2883084036 2308805471 +3654517557 61999821 485985386 +3437995721 2017516951 +1797730119 1797730135 +1339368557 3282164421 1339368573 +911034510 162084751 +3338840897 3472750148 +4161050434 2973375733 3782965578 +3848542292 1888635961 +520446707 423843203 +4075257455 4075257471 +3549215439 96284350 +132470058 1046928412 +3667748290 1100032970 3466965966 +935233957 1710403244 +1730284761 865745310 +1476246184 2646076876 745330301 +3353606832 2654993332 +3303674416 2651612120 +2429152235 3638452980 +2302392346 587387133 +2019097920 3021384645 +3778345329 3778345313 +3353967747 932119082 +3872194108 1085595683 +2404857603 2840304060 +1483827523 439623472 +829794917 1094401260 +4130579669 1749842780 +4102564523 3934585551 2639997748 +891890445 3028345016 +3050221272 2143856679 +2532114004 2532113988 1242583976 +959703828 549130351 +1586413020 3058746444 4022252167 +2045566096 23273195 +698245093 1141634293 980574018 +1772123574 289451510 +3949695910 2865282531 +480783278 3401368313 +3119394992 1643554051 +1866273005 150397358 +3941315059 3288932748 +440460707 1376630097 4146691996 +4249700738 2512328075 +1595870920 2658774168 1911769632 4268156017 3877943882 2761309459 2081774808 1064861571 1062568019 505329144 709573574 3090288316 3473849168 936188078 373116504 3761601787 869048022 3850008618 2230589951 980425704 1618687114 985140325 1836233527 1192864251 2870265537 1929997051 2509539942 3916004657 98322396 3576527265 2705751457 3355484937 3131524903 3245986673 985088646 350551560 1262339225 +1897868048 4195417593 3967817695 692708822 +2817373314 2817373330 +2300303644 3459610687 1696297636 +236739096 1319228379 +2612667929 1057618248 +1011811622 405356647 +1487781898 635208549 +2442026192 4078705507 +1609574792 4080330079 2400280833 +2577264858 2913085245 +1276887092 3794549844 +386628008 4010836861 +697628629 1261849715 +509835559 2513911588 +2876423664 561270603 +3384444441 3384444425 +2448531045 929042844 +270612843 3809152091 3402862488 +687258973 3647740276 3006007337 +2652379655 3874552086 +1408613554 1408613538 +3838495137 771947897 +1347222339 2888796778 4133035643 1879064134 3623511541 4032369941 1229650853 +1730360198 3798604791 +1170838403 1599289148 +783295550 783295534 +297836813 4282222458 +470613723 4082180805 +3377444520 1309570396 2180035088 +426998038 426998022 +3096218893 362393919 123080987 1032246264 663525829 +1351001443 835782727 +3284565316 4087596079 +2265989946 1377653574 2532228137 3265892744 169726747 2432521852 2057875008 1208200151 2347480059 3069120804 178628095 +21838405 1368570522 +3030216061 3503512514 +2707696016 3032051235 2718150063 2695720355 +812203056 1705623427 +2972640837 836009626 +3896794789 326070806 +3538131747 3922838243 1646383116 +1409894183 1409894199 +2210573973 7918730 +1998558115 699754908 +1666526755 246445562 +100102964 440196182 3904608354 3522538494 1991092127 2482051135 177719997 2100511016 430852321 1711404802 967724421 3021983639 2247501749 819236036 +3455057320 3096084240 +1470440033 1390368912 +815023963 2099179915 2861082376 +3144439452 2810992519 +2240691594 3370836027 +3938717186 2493648181 +513952054 2195704577 +888021601 577169428 +835037253 1818279737 +1980026646 3750887345 +3410097504 844189595 2939897688 +3631105878 3112846054 830501522 194661479 +802318020 204981888 +723287639 2003118616 1036181676 3079638451 +1503278262 2949276310 +3816948869 2863471948 +3942914557 4101302612 +1278056185 3481996143 3838093800 +1080813057 1792742272 +3896335230 378996575 +724337142 2691190911 +845563175 2113854560 3090475812 +716118624 4007452642 907289355 1914937224 +2819314657 1792346912 +2415543052 3002567649 +1090357473 3699521613 3355335840 1160375280 +3683268660 4101071566 +1962585310 3971451997 306429578 311173768 77472105 3287202537 2322432792 2477949698 147932073 +1043475774 2194495260 +678225767 2462055840 +828158678 2510331444 +3211521284 3211521300 +934989351 748714813 3792865142 1328230151 +660839069 499332244 +2249920406 2996406577 +218476455 978888658 653493216 283884657 2163697541 3011588520 653493238 +3832303412 616456295 +3090005660 1374436492 +3873738016 1316551832 +3660068913 2656072998 +2790438361 2790438345 +3484072624 2579751683 +812603640 409690981 +2075706272 1675359475 +870312525 4135442226 +547077681 547077665 +273642461 3654684969 +3110435393 465531990 +3638346532 3110943295 +3808685537 1076853024 +1337896827 70139570 +1666110573 3256379282 +3657558726 4144272801 +1998266591 1998266575 +2413824590 1969843663 +1277811719 1570229031 1616672294 +3984222109 1957764148 +3866454736 3236791156 +2889399948 2840852065 +4087306839 1998027732 +310104253 3588856212 +3000613325 1505721787 +3328340157 72000762 2226639961 3219209222 2096784880 +2925406267 1741318130 1134658988 +560424948 2311628047 +1033050837 3251856264 3281206603 3281206620 +3930502957 3930502973 +4070875120 3911698115 3734896971 1405480840 +1352574823 403851152 +19088460 377783223 +1848918866 3460692485 +2921449332 1221595615 +2776050530 2287041149 +843697188 1311530144 +4018826591 1978281096 3712686689 665066012 +298397432 4155830381 +1421078468 457339295 +1526048799 1337436382 +3049230925 1692773298 +1866849008 452437973 +1583795483 1428095688 484945138 +1883213645 17733156 +2496055812 955253833 +3887993529 3091057205 +2138257435 3177271940 +3983380056 1553920672 3379911155 460788891 +302339546 946218557 +3074523968 3156319685 +2409866181 1723074045 3818573594 +3007832845 1193962866 +3466575203 2826379978 +2888561758 1765277777 1731309558 +920624148 4220856920 1061193577 +2993819573 2660153834 +2452724681 2670240069 +2452895139 3408949148 +418112703 4200143016 +186901282 2067421226 2877197955 +3432861648 1440421416 1764680747 3953435747 1340334315 1764680764 +545041388 272802967 +4157784691 2835515596 2479364890 2479364869 +500370443 4265342274 +2870520180 2870520164 +1289844763 569381508 +2099690002 368503365 +689129345 3640865564 +1207398508 3062233623 +4192489567 3244983710 +838454032 3157961269 +3823450545 1926877606 +3024845951 1031537392 3876878384 3962440561 1343285649 3946668652 +747867987 2135596972 +2700236298 2776238451 +3168952348 1071562449 +2025865218 385246350 +918161194 3006080998 +1740976408 1936476365 +4166593748 55569854 1852349184 411983981 428761587 3807566783 +417967284 3956989785 +3044517924 3479023785 +2652722841 998208360 +816373870 2316599545 +3430080340 3442711720 752193849 +4287201769 779583960 +1207437972 3749226223 +2900173238 2792834212 +2522818174 2948466834 +1847168943 1847168959 +2734265991 367523478 +3614511103 637283966 +360398334 360398318 +3134762453 3663775340 +2315920234 3086335949 +727357696 739428571 +3673485554 3882527547 4239964651 +1498680146 1498680130 +557532223 2404151080 +739630672 2823306581 +1664450551 607678928 +1976068274 477941797 211566844 1368813602 1368813630 +1946596131 3349927201 3516120611 +1306262316 1152426703 +3960293376 2565363717 +4265629685 877295274 +3191024023 4052377494 +3662538857 296017240 +3146797376 548750839 +3088500740 1745742254 +3352625411 3906916854 +4123799677 164982114 164982133 1836078274 2736319243 +2293247614 2874749023 +2038863171 2447177852 +3659418314 665828333 +2184360011 663125667 +148958276 3261156152 1041493769 +1161359640 279152845 +825177888 3441618400 2995656505 2276534046 3012434143 +3068675334 4121208929 +989328942 543288494 39357049 +458166038 1271511602 +1459102242 331100089 758252526 +3290332536 2422759680 +2238746543 3851753425 3207737454 1946307820 +1496840160 2027254459 2027254444 1394292133 +4184280988 960336519 2901260871 1197078412 +286548319 551283164 390722910 440070002 456847624 551283147 719059359 2758118485 +2376687831 1383294446 +3074991285 1012615402 +3080333245 497309365 3299643010 +3313496134 778518049 +2237106819 3672214114 +3225251845 3114224700 +3353577960 3398978112 823256987 2960666801 610474930 493413401 1017926889 1424049345 1633722419 +610168848 1353345315 +1659729992 6670874 +149506103 1044164230 +1165962310 2905780769 +342681997 3027478756 +2341787477 3077785331 +1608897423 2269171516 +936283306 2542646398 2217176973 +3868153782 2846299025 +4090718553 516865528 3449594921 785307400 4090718537 +3238133778 3054617632 691282044 2167020958 3338573485 1129983004 372507295 2312183605 3894811717 2973891721 2850347326 +4061065873 1733539821 +187020807 2472381718 +1845909435 4009499506 +1645826798 1487614757 2351585714 1287944057 1541246137 +128825152 1450670533 +2064983020 2923924609 +3390195500 1187383873 +166724380 2686753233 +4260567289 646832604 3199225832 +2625094104 679880475 +1549277911 4154159171 1549277895 +2397168410 3692330662 +1346994234 641453974 +3150166625 457682536 4129187488 668708998 3403722823 +2093739465 132708736 729937653 +115954348 538704184 +1203011186 1395534861 1395534874 +1601073265 2883256816 +3751436707 2735190922 +4086234995 3709608460 +2934012437 2934012421 1643327242 1643327260 +370551548 425808808 +415341195 1109082419 +2224566241 2626903840 +3838547814 1014220707 +4223998032 1192042684 2806334965 +859334895 2429366318 +1453299240 1453299256 2235130109 +2114076233 372005550 +1443664919 3605638018 +2610112504 3769101165 +3836207474 1982842651 674656146 1982842637 1982842650 3562274910 1715988083 +2057908792 1348079163 +3941224977 3755946192 +3474733169 1514084333 2606431946 +1328115840 507255173 +3567555521 1986828518 2148833472 1919718042 3135948925 3626110584 +85618833 614422606 2577347663 +1900896534 1926223271 +757340533 1138371354 +3095048827 3827759012 +1359393271 1430478407 +2806323682 868728533 +2217902666 1703090797 2217902682 +2213416855 1187154598 +3141876076 2137967360 972645633 1535944572 1150943383 +1614689643 3975026530 +2915028496 950606830 +2499316406 2792858165 +4209383646 3962486215 354382625 1034736948 436196927 899149085 1433321685 3642014184 877064702 1005285925 369305436 +2436620446 1887169602 +2235536708 119011849 +3930625974 604263981 +2367522477 3531276868 +754403453 1215108695 1522150118 1847304026 1522150129 +1131084317 3729777109 +4050433254 4095788545 +1901760444 764429561 +849290206 1118125914 +3257382231 4219631590 +297975664 297975648 +2193567891 1710847866 +1813979956 3370677899 2788246629 2232388256 367326913 3301591341 1228301759 3333732397 3285682941 1382019985 3888451529 1458581502 +2405752228 1607002409 +3142792674 3321746115 +3913209189 2464804346 +3916262559 373423688 +2731152710 3204742038 +259594274 2107702659 +2988304081 907172624 +537348780 3136002579 +3364866795 3364866811 +4110899757 4246130873 +3123452327 3312637651 +1812897812 788922233 +177643364 864355160 253553257 +3718081166 9263682 3631507481 3631507470 3718081182 +2381744411 3746711506 3618319598 +2319271554 544603811 +4280751287 910986389 2505354530 +3865712087 2147502166 +2003742476 2694645620 +280924163 1593619626 +2367290775 3068802224 +3846905523 2822853594 +4022809331 1771385996 +3795987346 3224016595 +2594258446 1245142938 3782197315 2043981849 1865121642 3637585807 3637585806 3762374158 2043981839 +2237963460 3244476575 +3342486531 2351472615 +3450550435 1737107594 +4011199221 2963597 1421033386 +1209125538 369229077 +126046159 2729878222 +1412762974 3984853737 +3018051189 1321035789 2761818666 +2942719185 4011296016 +4274949522 2972245189 +561040414 3264303935 +826097884 2311089543 +964098418 180881502 +387020997 3980548080 +2158546649 2181194516 2279585929 +1528532294 2992596257 +2862870002 1290349022 3783649165 +132390418 2115720787 2115720773 +2613950824 3649872788 2377927320 2900025021 3649872771 82673701 1095221328 142741033 +3613055733 4177964988 +1532142546 2501370771 +3696744907 2840320642 +3957700804 782366127 +680542216 3809791115 +526193836 2453908820 +2359975368 942776797 1394724579 +1380309923 653836682 653836700 +877489930 2721986182 +3751636390 1109335281 2865994817 +1829466753 1078295533 +4185463934 3937924655 2100497760 +1760495355 1179877311 3580372247 1112766828 726138148 +855364033 935397094 +210672088 2541052396 1685983589 3948400928 +1798661712 491331260 353374179 491331243 1798661696 +1806534242 3827993685 +1635503505 467691754 +1226689893 3370475222 +1209998753 2683260541 +1700782607 1059903052 1059903066 2767248792 660510320 428562929 1059903067 +3511948771 904500035 +3340226302 1483012638 1752881631 +2504959912 3628517543 +511112680 2429252628 664088192 511112696 2429252611 +3278067122 1197467429 +4243206195 1470750797 +1089518722 2134400526 513228957 513228938 3170418851 +1899832985 3695428296 +2435752352 1462241828 +3297823357 3975070420 +2730603117 2857642937 +3388703894 1251276576 +2737761284 3149969211 +341255770 2788009226 2243533347 +1922935552 1922935568 +4036654454 958851271 +3490532040 3253225361 3545426490 4121363444 164877887 3905783596 1290582219 1290582237 4287681022 3939338846 1647774448 2810956375 2699766504 4287681001 3970364837 32074864 2229064399 3788340285 +2696104976 172014901 1491720828 1558831288 +758945162 3227478061 +4124221342 2559657407 +1444404608 126988421 +3653796616 1687771402 482317859 +3970609872 1622637941 +2942530193 1149570355 +1509088556 3310496855 +3191034914 1561749628 4101044489 +427260781 2192411076 +1370783229 3381780036 202127074 2673352587 2619495764 +2263983149 351801311 +218887692 2513720567 +72240508 1128528433 +3345886398 1845502706 +1440876378 456167434 1491723043 +2904173079 2268080406 +949268477 252775234 +2998178661 832257102 1320304719 832257113 +1103426620 2745483239 +1190019284 2098204089 +3093353312 2691481637 +3492048631 2690297542 +1902448495 4044835768 +140053318 1781317409 +1666049347 3633052935 2579168038 3366790769 660167873 60656090 +85378748 3202013671 +3153210168 1955010828 +3076759755 202465845 +1848021704 783880413 +3417215746 539020953 732773149 2781965347 732773130 2563880334 +1442374587 298745700 +849716845 667221380 +3975188470 4105347143 +3996286296 1367036301 +709536946 2974917722 +3815305415 3308456278 +891354251 942834549 +365637931 1888604633 +1626326604 3849660855 1626326620 +1071064703 3328291264 2952829453 3650439210 469153473 +1295529151 867082347 1316685992 +4131572892 925368439 +852387117 1771468076 1032958666 3986800711 1654765861 1016181044 1554100161 +3411688526 1829564121 +2412640302 3978084015 +3251884151 2540776262 +1754002044 273594673 +1026818779 870350546 +2098138714 2067323077 +529636404 3862488527 +3619709909 2027759708 +3254256268 2302347930 2382873843 +4058306654 4058306638 +52326522 1659572253 +1642188288 1657374171 +448767858 2377422963 2253126925 +3173327273 1785986318 +1902778821 1325830426 +3893583517 2482228843 +1645800383 742071720 +4280501368 2551113473 2136037904 478464236 721308625 478464251 +1246391883 1043046420 +3172260469 483649066 +4220406711 3118480418 +2482781307 2772267304 +2172340325 1708837789 974321402 +1786180936 3779338333 +2611881628 2938554247 +3326230329 1397327550 +1186876186 2005940715 +1428066398 1562199017 +887131974 2206305057 +1863338759 3718650880 +4228144873 2749458648 +3528976754 2193308511 2456059493 +3815959233 3471281600 +1337483477 1413508938 +3298091862 3428966513 +3229264528 2434433187 2434433205 565746940 +4139618650 3328954539 +4128640902 2055094737 +604093429 2746933948 +530635845 2853599527 +2114010393 1962094152 +674908379 784380114 +3536812970 2258611341 418105702 2287777797 +2662768437 243048554 +1687599250 3947138501 +3463453527 1367017958 883991764 883991747 1152712072 2419145161 1367017968 +2071139496 4264133739 +2303734381 2520736132 600222649 +1681187800 2537729293 +3119125695 3119125679 1298366571 1518243694 1786685608 1786685630 +3257642162 1556143141 +2068900720 2621698703 +1711448209 656589894 +34101215 304239624 +1949622990 3175156313 +4125324967 3434139138 +2921294884 1064778921 +1029603709 2775927208 3396514952 +2353721453 1190689682 +3773108803 1268498300 +945381041 1706037424 +3732418532 456352745 +1055588625 886885275 3007868969 250149670 2195624857 2227823766 963643502 1466896131 2944907028 2177015117 2527227671 119301499 2497151868 571082021 2117761808 368378583 437373365 456091974 3671641423 1394092131 828861599 3635464465 4144990878 4240565674 3950834997 2159187607 2546182427 501046370 1997303067 1317651660 1950993009 1949789049 883833096 2188962606 3687933700 3346383710 383292082 4192089592 939758262 3573834915 3349955682 3778034963 117851019 3146183345 2745277401 4214273074 185890605 1284266306 2885290542 3696068762 1619825660 3477343603 658052188 1737615815 1050528251 4198582657 2708918631 624809215 3041727546 2875016297 2843403532 915963013 4004478252 3316171145 3265203615 60744155 1985462890 2850152991 1738900034 366418146 +413265530 1089104413 +1493750914 1880547405 +1098206596 4027952760 2410219209 +3119332990 3119332974 +118945440 3374726643 +1611303768 2523602660 2291751821 +2071199452 865743953 +3018312480 3018312496 +3432151245 3616811698 +1245413460 2065137934 +778494360 1743060773 +304791578 836599301 +2883377416 2125506428 +3830612522 892560018 2548230171 +1601362798 4069159929 +1648666749 789920980 +361007631 1178975835 4272254686 4003812760 361007647 +4170062099 2975947648 +2880121184 2658279987 +155142932 2728603768 +1591697363 2415503946 +781187770 1157526915 +595284795 371459570 +3855244778 2811352909 +354709695 1076575339 123567272 +1677993011 2776955994 +436811785 436811801 +173049039 197202382 +1222752349 2827953307 408238708 3022712478 +765821688 3549244539 +3013777755 603417170 +2139009199 1668293486 +4068076814 2182540953 +1554322726 2076900642 +2983728782 2234220953 2234220943 +4023574911 4071555973 +2636307922 4121365115 +2105922411 78369140 +3964912524 2480723319 +3038539796 2872802153 +3006374258 2300651109 +1994007354 1399157835 +2668100188 3046055623 +4028790982 3427016631 +981019790 2596348825 +2962140238 1104085124 +1971243807 362398174 +1409384490 601902526 +3338421911 3592626086 +1968965484 304119447 736079639 +3462863402 374222875 +3528750875 4117881491 +2632262565 2713132218 +452096234 1437057101 +2852931555 1522849516 3487454615 +2396018886 4165913873 +2002772280 2002772264 +122961456 3364907420 3114132885 +3873878337 3190360406 +3687110697 3155310489 534792334 +2041253478 3997674113 +2679874375 3143764182 +1751519709 900603636 +342980424 2294304647 +2109204343 1721141973 +4246829156 2346845273 +2326323620 1930735503 +2068307584 3594712271 +2463644528 2590347587 +2571900586 4240944525 +3937379554 3937379570 +1975074709 3885963164 +2525693381 1146042365 3252294938 +2136821496 2136821480 +1825196230 141594551 +335967812 3391892745 +3011659789 2370532769 +1371909083 2234347650 1371909067 +478283018 3937267373 +2946128297 1633375502 +4013470773 3410210666 +2680277095 3842931232 +2484516939 649812335 1791237652 649812344 184009909 +3458837175 1383821209 +3992854279 192962137 +616510387 2348704474 +286957781 3253415772 +3280428011 3105207028 +1840636266 525457883 +2406127176 4276950122 2145778531 +2883955668 3736700058 +3096317392 1470086773 +2857639281 4134138369 4134138390 2473220326 +675044284 319056103 +1973416210 1973416194 +477688799 2788688353 +3556089314 2376567509 +1503547537 2771965008 +1634920386 1461158953 +51891704 232501893 +3806094201 2381855180 +1119939627 2399363150 +1927536737 1304056304 1927536753 +811254222 3974043481 +741321509 3020581690 2791754826 3033122425 3150565753 +280444697 1769493598 +3545246804 1774807104 +2399633132 348966273 +3284531293 1581852756 3240786991 +4142481866 3293266865 1908486944 3576868789 2066911483 3952753445 3952753458 1925264582 1522601724 +1836966270 3676961119 +4216351417 1486356798 +2049233634 106957464 +1589083032 4148166576 3596101924 2445853996 1589083016 3596101939 +1142623743 1142623727 +2403331111 2829107574 +1539607880 1109660039 +2082686295 3263571952 +3534285897 2574629049 3907778286 +1476612610 1476612626 +3054530485 3144944403 +2350693175 3359291270 +2794736265 1485792847 +3897044013 3600648900 +1429463036 480876967 +3412681975 390469475 770306246 +2868326386 354449893 +2740010100 2363632271 +2502400158 3056921769 3090338882 +838198752 3190296748 2249777061 +3126621198 2564561738 1837806095 1837806105 +2223534714 483145227 +691800437 4060846874 +2804435066 896466335 3585845036 2657753117 3794796014 3742950574 913243941 +650208685 2943553348 +2380095499 1442195957 +4091834735 4091834751 +1068710169 3035257342 +2432498353 4013860016 +3102899417 3576869136 370249908 364050097 1405946160 1647228223 3294913673 +2011486606 4238793786 +1470033383 3462242803 3593503392 +3044109772 1838143543 +2177196643 2897863114 +332812078 1751033199 +215736437 3005372458 +67011832 3955842381 1101746797 +2645387491 3225861761 2735069382 3155872466 203279521 1610628061 1207965207 2148791782 3569880726 3605149648 3605149638 452730186 2423007846 +1851128675 341490890 +3688760195 3688760211 +3338743803 259581253 +2800579292 2748043335 785970627 +3663682403 656202954 +1472967159 2342886111 1298369943 2803060978 +4181481627 2989505119 4110384132 +461747151 461747167 +2853953897 1789756121 +3115428593 1698704140 3115428577 +1016153094 1184465786 1588467041 +709326365 2664645214 +1447923208 1040242461 +2399635054 2530778937 2297819186 2785187577 +2627676286 3308342061 2576963524 +2824807407 4240806200 1975197252 4240806190 3188201040 2762163857 587438892 +2923320501 4288231390 +190176514 2492372253 +2447381098 230489293 +844394066 2364123923 +4005517827 1181179367 3661279932 +840747586 840747602 +1088897102 1404634322 +448353270 2029171649 +3335021866 393691405 +1500975491 1356469121 137666918 +2283194071 316343417 +1948395783 2215462838 1285436647 +277721902 1024528761 +2202812058 771119493 +1468019741 3687975348 +1864756125 2511464500 +1094955751 864572063 +1548386077 2925264873 +2566011549 1649558836 +1742158737 2299271511 +3901082046 704155274 +1906991623 1899021565 1154547967 840368613 1409585534 2939219208 +1832075332 3425550137 +2740360785 1649313856 2740360769 +2552511148 755522753 +3256694324 2872573599 +1590637832 1211136907 +2104148125 449694338 +3705463973 1169104332 +1525124709 2735675555 3922348624 2139433196 3097461130 +3094160867 919774300 +2239525981 2146119284 +450032366 450032382 +2154978813 1172244317 881132896 +4255021373 519364047 2269168692 +1274194970 4106282975 +511838268 1119024743 +1288999170 4104144419 +88498284 3117009431 1202463471 2618564244 +992792562 428562917 475280237 694065549 694065562 437374673 428562931 3068396797 3786017662 1728667614 3454282029 848190424 3857963604 4218463562 297921129 2884351862 +676152239 3004819550 +3701021005 332042625 +503662768 4065422595 +529603299 2490192714 +2360623511 468413664 +792985866 1913496251 +1434394363 1434394347 +3629552487 4148824886 +2657086033 2292431350 +430393179 3176485970 +2951802607 3880264238 +2146453626 3779205149 +978118278 1292821750 +3586500787 958960090 +3089837211 2066558558 +3742055297 2679024640 +3626570002 102666170 +617710901 2165168019 +221084450 3356362530 +2511754968 1874012139 1874012156 4257642150 771617687 1728017538 3946255144 754840065 1157502923 +3845548218 2393300171 +552039233 1532839014 +1165495689 683858937 3841805998 +2528818773 3542303469 +3105190672 1824793123 +748453232 1928848535 +411579748 40635519 +2431166362 2431166346 +2041721246 2985799103 +1804803036 2381507373 3967054495 3967054472 1566193893 3795749572 1582971515 50991026 3142598553 +2392621398 1302103419 +4006605087 3060752624 3940829335 +2071830683 29611012 +218161856 946140243 +1959376555 763063897 +1966293875 1966293859 +3743022 2280189817 +2652557783 3141031280 699301699 +18565224 1880844444 +1560262919 2048799250 +1869905197 3720921477 1869905213 +2155122082 2227644554 +3669496363 2387917547 +412649174 2384216817 +1280016941 427088613 +363472041 363472057 +197300942 1364007503 +308669794 1484042563 +4242656830 4242656814 +21699105 708452863 +653942153 3844161198 +3387831820 2272430684 +2081323005 3647258639 1075298548 +4032353111 1960058050 +2128014915 4015592316 3933283350 1161407536 1940680445 +3721735777 1077192700 3721735793 +3479429730 3695009859 +1422832486 3882117527 +3808270288 150760491 +2143963096 1961127780 +2877529099 4278426831 +3763687356 3763687340 +2342615731 2184456132 +435275940 3289476760 +3824918499 3357323850 +2761994656 3371671269 +1489243889 3194683286 +2890519988 3963316825 +1267337127 1267337143 +2909353412 3231687583 +2853054894 3750743901 +3351046694 2489620929 +4288689420 1628796193 +1208001986 453308515 +3563599669 2500782204 1000123800 1034551081 +1069543442 658900666 978987326 +4183325755 401247715 +2868252918 233715905 +3117276438 2501052849 442338078 3016870221 +506007654 913594213 +1321040883 3880394650 +1532494032 2609465205 +384054702 3074457839 3074457849 +2645499543 3517786022 +3251733420 3369224151 +2274449994 2302230870 1528945265 2874409393 +2708095146 3292777357 +1683136921 2199467646 +2007905095 108058195 +3863303252 2588383656 3542335545 +3941377103 562473038 +2684276597 4273331728 105566490 +961345118 330686569 +3149076768 1303287276 +1973049972 2516346009 +2523714541 1618728517 3125911058 +4237636105 2816328743 +2185895662 1509958510 145666223 +2760284504 1206078539 2760284488 +2693186500 2015767967 +671251866 1830085493 +2066812066 2419516163 +4028736951 3761306162 +815123012 3217910047 +322615238 191843489 +2188043509 1128689084 +743295622 1148571902 +286925435 286925419 +939182972 1993247025 +2468722577 3315429528 1276471584 2188795 +2472380651 3879635444 +3643655860 652231433 +3891655591 105676196 +3251976424 3251976440 +194693917 679352299 +4066233292 1437061687 4230991923 +1453331815 3305222432 +684074315 527329577 +2147779227 3405194771 +1501874472 1357313142 +2522179172 4254769752 +4024797000 2334970979 +3791510383 832597944 +4231970734 3301424889 +2683682341 1345196008 +622159878 1722990967 +1590834275 2817030090 +712161702 953373667 +820013988 799035355 +4063668719 990741294 +3800983492 1781356959 +1178964374 897855281 +419096772 385641631 +2708210291 2416433932 +628690966 3177724113 +270375247 2912442200 +427537523 2428309765 +934858023 1272886052 1571930553 +3401726199 650095814 +1522499873 4235740918 +3189920029 1106579221 1106579202 +702170748 1587344679 +3406191810 3485540344 +1285168565 1827825865 +2022002053 1054410828 +330973464 640973005 +2108563479 753145731 2108563463 +1755825483 1804440501 +2587806146 2517062370 2422945321 +3500760485 530475706 +2906389764 3111079263 +2335019132 334074152 +3835011880 4287617003 +2714578973 3478160917 2714578957 +3587153475 3637912426 +3569167654 1818732657 +534539370 2449386203 +2177599764 1123466367 +468848791 2500861360 4215264137 +3198392745 3297436952 +1821947852 3228128801 +529446610 529446594 +2821510087 2240897622 +2955014363 3446285900 +1526405865 575364312 3399686222 2191622847 +182488728 3078650203 +2821263797 1839652842 +2787508132 2581032522 +4044385176 349790299 +3085839758 435271321 2607063423 435271310 +573296201 334871790 +3471764033 958600049 52085846 +1454404331 255817567 +1127388028 4219120548 +4087050282 2813432347 +3395103362 1726388238 313125557 +2050308962 3284958037 +3904651956 1734942495 +1946515681 2359022353 2241677878 +277305716 2031210895 806155209 +3301087208 2790597163 +3867269850 4172322147 +1527140494 4080450811 +90931929 3022395816 2545382813 2918220629 3022395817 2346501647 1631517598 2955285346 3022395838 +265471205 1980883542 +2866489827 2275431900 3657625685 +2163846827 2784765646 +3301227168 3016463455 167180804 +250881258 1951800397 +131296550 2010436289 +1066642823 3763506535 +1438794639 3918162545 2097009612 2412796430 +275714255 2916578766 +4236206898 1499632290 1499632318 +2915915727 2242878399 +1267603161 3383621512 +2719588659 2126208451 +4131067805 1007037492 2880932969 +836626039 4149333328 3038977065 2781230324 +2341124988 892860721 +1645826806 1675467079 2094549718 1675467089 4085756874 2094549697 +696096937 4189540888 +1984588959 143562037 +4100654571 4226794671 +1800386749 2877280660 +2268027556 1938534463 +560832980 1939194041 397162036 2914935592 2914935615 +4081428562 1098624956 1936529658 2903831052 969418408 3136066463 1218967827 2003640121 +2636456096 24271845 +36062217 1799166510 +2011130010 1320266347 +3204947 3868104365 +1281278993 1244571344 +1624205132 2994707617 +2406745596 3483724721 2456324016 +4128331464 625712331 +1004201719 1372088675 815371984 +3403934498 2530273006 +486381855 3258452958 +1421257653 4247431002 +2925774753 2672017197 3028194403 2354159568 +3180848775 4246726272 +872193225 2678771832 +1654598351 1735649841 +2314164813 3251549106 +635507297 1574227661 +964079997 3760330895 238966388 +4289374661 3195108349 315459587 2275641542 4289374677 +2582212160 2298893412 3234381836 756044024 3234381851 2649064039 323800124 +1678119423 1955484798 +1302163081 1213051660 3019509051 3226353863 3084190136 +3939910130 2705969125 +306515321 1001665918 +923367332 1206343487 +1297747910 2328286391 +489977867 77134164 +3304575725 335020575 3003411780 +642963922 642963906 +1491990769 417789187 312142820 2187315444 575300635 2601449553 2703228893 +2710818041 2710818025 1420536808 +563854846 3902531426 +1627219863 1172968112 +1960380024 1074953107 3053117824 +3670250604 483087232 3454182913 +387495211 1100839509 +426119340 3039218113 +1753034249 1753034265 +1374748937 3513367417 124035374 +764843682 2899376061 +2540173860 4028808216 +236879233 3137311254 +1578716326 3352537431 +4017417492 3236767678 2817327214 +898692009 2846487451 2978643218 +2478607897 2866000222 +2053593758 2748284606 2053593742 +2397578002 3509440375 +2453854585 526799851 +892269595 499974622 +4025815555 1192188967 2299142045 830575002 1475114653 880126075 742419277 3571881939 1912359155 3843434898 2729264498 1438587541 762147436 1513568786 3837852241 802210802 800487196 762104507 1294538889 4154202673 923391754 4230662379 530576565 3468106267 2856814397 560616379 1372602040 3450470977 3904352292 3839343257 +3589315416 566528923 +1715200718 3611441753 +4110149835 4110149851 +3074484274 1370164173 392247966 +2881318113 4183222033 1009935904 +1237104326 3658725815 +737500889 3918090082 3781256986 1548450387 +3887932243 566139824 +1724367480 1148658427 +2585806643 3553629530 +1845134604 761229815 +3225333030 812426025 +3832980307 3659829206 +2109671524 1471821161 +3456859882 1176029787 +4173321301 3942334922 +1119907147 4169941519 +89232850 829348243 +201423840 1768107736 +2745672530 1933249517 +560664075 2793872194 +3268267325 680787354 664009732 3919854513 1956180604 4020520245 3919854502 4053285527 +4050962083 3432227706 +3251871721 153402328 +2445254810 178901611 +3733259794 1567133253 +3302178767 2811065038 +1832075334 540196998 766389815 +4076392855 1643501667 +1539551670 722518417 +4009428730 3376215430 1358332385 +330156887 1625150676 +2427834177 2427834193 +2950799321 510261346 +3560521993 522281272 +1462213024 3545683699 +2368209011 1279546125 479116644 193266144 2834871578 +1622546907 430617554 +3592893245 4093185589 1555409154 +3008926240 770406148 2922854139 3227560008 2922854124 3008926256 2922854125 +1102081036 2936435482 2784103027 4102888162 3846707461 3698545643 1494714678 4102888181 +4225514681 884184872 +1716556613 1716556629 +3113119007 976603102 +372055616 372055632 +591680526 4216132317 +3225277183 3225277167 +1798116459 328950983 +1517942742 1140925937 +1186603114 2795355295 +3654557930 1787101010 +243108639 4003594689 1778959040 +2110278170 1940569510 +1873171335 1238728064 +1846179539 1636912983 226037292 +2553721327 1478023482 +590585911 2643410190 2963387535 1532982418 1878320291 2643410201 +984818676 2477005277 +3277045591 3554031088 +2083116159 1516938795 +2265954352 3451843459 +3437575427 941586662 +3657379538 3803745131 +411945927 1849150016 +1505210809 4113352232 +2499704092 1868913616 2828163857 +2827757993 2150030100 +3703493087 1600414238 +806644606 774190943 +2589547658 2225909051 +2080021259 914494018 +4124520674 3821138883 +3535150585 4210006517 +1040246194 1298765605 +3926540187 1689909576 +2921178903 2134928137 799934768 1056470659 +3239288162 1407238485 +1899403278 1190223385 +4126346328 2241621659 +380963414 352273767 +172123978 1110140960 +1339767594 3760071451 +918329873 506287077 1081126693 +440460732 3733780605 4004645248 +1309322953 3084350815 1346338606 2748393080 +4148105260 585801793 +2958845019 2876148744 375695142 4235328338 2963513393 +3753349757 838593104 3449070225 +3791779690 857242573 +1835288472 3437016155 +3925553362 678288019 +3906530732 1499141409 964568535 +1087922473 2455726233 1033958286 +703190310 4090007654 3400211472 555387607 684349413 +938298698 1418767227 +3790136801 3470095629 2191647018 3036810766 1688627563 +3887659310 4244252601 +2728316478 2728316462 +3463627594 1219063149 +1002338134 2878670130 +1558798275 107069418 +115612808 4147678132 1629022731 +3579478909 885225589 1518140866 +4282105688 4282105672 +1061228563 3900615296 +453137819 115198757 +3721225653 3747027964 +3335872163 1756466 728702945 3792395980 3775618358 2697215495 +2137560074 3112531813 +4182665732 2054218824 2713799205 2054218847 +210394722 1535075690 +1059149886 2989933919 253417506 +2286241404 17691953 +2437038980 1998960135 656229366 1080200732 +1183661306 1183661290 +2500895961 2500895945 +3714941107 3714941091 +3295059783 2223822310 2511726025 965550675 3295059799 965550660 +486161784 367969275 +827877392 3190542645 +3772407583 2653143499 3772407567 +2967058602 4121017605 +3561293877 1571548010 +3684940972 303892834 +831719405 4151671300 +1645826813 1792910402 +2897863114 1254097368 +305943310 1866575507 +865900364 1055670624 +3741952969 3845746040 +3008148399 4039040110 1953829115 2587861969 1953829100 +1989176099 3361253404 2140185607 +2346626525 2716506581 210481890 +2743349120 2743349136 +677664435 4123023699 +3920987584 2831256915 3987825563 1598665592 +3114465557 1351490570 +1840750337 3104788096 +3927287021 1415937264 363203901 +1847062810 236556441 +795803103 1782603403 1849713896 961212385 2002704683 1782603420 2327422472 +2918516577 1713979207 2529576326 +1123549866 376189325 +579725993 4229520458 +1998277469 3707216738 +2147402108 4194997809 +3981702439 3257592950 +1508517082 4062701776 +4156294245 1912276028 4156294261 +3048146787 4048366429 1703452892 2987735623 +3603893027 1257146378 +974305431 2480120852 +2329849016 1613116881 3446252719 2172022087 +3507176880 4247156695 +1612349999 3875703995 +4080166126 3869301113 +107376317 4206622480 +3684525924 482984575 482984553 +2550950109 2550950093 +2365750694 937743656 2295350618 3569758134 160034050 2699807809 3829982646 348233105 +2334206134 946632321 4241002868 +2058748134 2058748150 +909262483 1486006705 +1438023199 222857950 +3672174341 2501395660 +1807783668 1557540168 2486018585 +462448703 1164361706 +1063735909 3698255242 +215845410 1656779651 4160083754 +1332746063 1551151448 +3559604304 1343634915 +1984187877 2750221578 +3212703909 407792556 1022032227 4252210634 +688135700 4197308777 2871221492 1059930200 +270864266 3769573093 +385917746 1819066061 +3896630579 3534698316 +1994194646 4091882225 +3527569475 1100396906 +223199890 2982305082 2204715987 +1944379788 4249816951 +3745649916 4110331095 3615926956 1896286375 2668801703 +710730455 1323399235 2268665968 +333879780 397656536 939803113 +1591500287 2116815804 +3130651463 123336918 +1474645055 2633434942 +1850255531 1197573410 +957717838 4199888696 +169181178 2059574485 +836010826 1445487326 +1933400235 3700617052 2529222862 2529222872 345150754 3282821333 +3489156748 4024673911 +1847731437 1287659780 +3437371109 37864970 +11841857 1567820118 +3601602108 2395029220 +1541383523 1129449543 68246236 +2044178095 1031381852 +2791940387 457746972 +3091970726 3308704577 +2754059644 3578047280 3779378692 2822187052 3864848945 3735913554 3578047271 4140586843 +562198542 2029793740 +2969944701 1745244002 +788301346 788301362 696729765 +1844451694 1135358939 1844451710 +1155204771 130773660 +2926131038 3986827519 +3273726368 2752247989 1685300354 +1470343712 379900019 +2324978598 3448522327 +2226749673 301472982 +4150283432 345549949 +2390690157 3204175506 +387425408 387425424 +565213102 3066849017 +878659010 2170543526 627694138 856029907 +2661079441 3060491095 +2210863898 2210863882 +4225879214 846542329 +426787001 426786985 +61552505 2610073839 +674427057 4180731568 3992655702 2119141815 +3341799950 3341799966 +1464958101 172433034 +4158216643 4158216659 +833433353 3985115358 +733272568 2784861843 +2431647561 600883714 +2886074914 421651466 +2745999184 2304343996 2745999168 +2401343715 3497525258 58798280 1292906477 1378935762 2079253816 4063661059 361392368 1960142365 +3056226721 639436284 +2938286415 1968723866 +3134934005 386851212 +472630470 518439863 +688969653 1730065242 +2985174027 1693453112 2094862524 2398626121 2129198508 1844451694 618839362 +2809617889 2179516704 +4248640856 1304232179 4281676173 1304232164 +2215231216 4024285277 +432953409 3772051018 +1459829563 1979936255 +2719617584 1594532245 +71148689 746336265 +1208874896 4261197731 +4257345768 3626657539 +27658152 3507436483 +4223797136 2383340466 2308165767 +723979082 1576591539 2714352090 2143471053 2089778208 +1598571830 204167173 +2073964647 3463767168 +3089254290 1878436549 3747105726 340716090 1878436563 +4174149027 1755367649 2620519046 +2871634518 2276027220 +2405234217 3629613720 +1098206603 2560175 2527662548 +2972733229 1774138479 +3051554127 2319633307 2741066584 +745698979 2603664010 2603664028 +2113080210 1079465081 869060573 +2320992156 1674214023 +4154427822 2116402415 +3757373654 3711372581 +1657102369 2645971967 +1640908859 3246244584 +452177486 614445529 +3237090518 2748840608 3151503466 2467745009 4130899887 1944358817 3134725844 +2811512791 2775390064 +2930663628 3363987744 +691409550 1847539087 +2147044675 3094650986 +1311776394 2680165165 +3520485929 87329177 3520485945 +1862429309 414665289 +1904106162 675574482 +3289258576 4063456227 +96569530 3383377117 +3451698459 4213027218 +4248746656 1237305843 4260025196 +1979096405 137997532 +1449229693 2021166018 +525147259 271141612 +1217225125 3683694246 1590666973 3683694266 +4229088316 3266252785 +3577130906 1058434935 +4219209251 121481482 +2579112679 3875860918 +1518168724 3354376013 +1976104141 945381028 +224929177 2750617272 224929161 +1418615077 1091982636 +3293900529 45360496 +1533961388 2596829911 +613761065 3139231641 +2463625366 3220159527 +2756400935 3382325878 +4100873734 428745082 +1106538839 718171110 +2469180091 2469180075 +4127559371 1425524226 +4181341534 3030516479 +2010513585 927283639 1457723056 1836885846 +986684564 684948719 +2854706830 1777981849 +3670250600 2361489044 3387072445 +933197698 302588323 +3904878370 2278378133 +1553327032 358749632 2012576443 2221940307 +1251470842 4105026242 1730912395 +1830111288 563702227 3348453060 1224345408 +4125278064 219933899 +4036152351 3591853256 +3652068158 3944839817 +1938124163 1206934887 +2449275982 524365529 +1852046148 1763632045 1852046164 +2655865934 4121788377 +857283138 3914544221 +2071791597 1961437764 +496113701 735491043 +2959025487 2926308251 4106730328 +298602206 1092496638 +3849954294 3891495894 880614471 +3866727810 2448411869 +1771298649 468939243 3531118338 +1533146210 2607278973 +845556581 3151384556 1131007640 +3320919543 2444751814 +4238072335 3405090394 +2589042570 4251547365 +2293284632 1178391259 +4233419959 4036457478 +3026693485 1815478916 3943041989 2083920852 3026693501 +955598212 773615327 +3621706273 1662821293 +2309976470 2103111102 4079496505 3013335999 141248449 1313746930 3349974186 1094916726 31585472 1429196583 1094916705 +4267516142 1354757497 +2764775688 3692979235 1942290333 +2470184572 1132344615 +504628094 3615588169 +1625443109 2839300908 +2928832115 1132715788 864273866 2928832099 +3343726887 329096173 3457971716 +468659876 2642832417 +388147531 388147547 +1392220483 1392220499 +756864641 756864657 +4231797463 3919462502 +2578903849 993872537 +2179213198 1770646798 +3303277698 1962088629 +110934518 1320723713 110934502 1589165639 +1803618412 3087527935 +3146961956 1814295721 +2640616467 548046102 +2974373373 1509164664 +2877530893 221883748 +794875049 1087385477 +134508995 134509011 +3447213543 2286294215 +3838137804 4003860513 +191870726 3449153130 +2548064908 763565020 1365587808 3289849505 +3878794256 54424885 +927346745 1014884776 +2111658397 3228832308 +1447941543 2752805070 +3524228586 2555813723 +1870956444 698448519 +2781161531 811488498 +3070997239 510311110 +2951618802 3856522469 +567427004 567426988 +2871759229 2754492002 +595752763 560050674 +1641478614 3855837850 +3443314985 1069368206 +3904700229 1698072121 +1416524803 2711422960 +62810889 3988946734 1101028383 1999517038 +4077162339 4079859932 4079859914 +3772506014 3772505998 +453603525 3298347676 +1946444726 1491662727 +4050693470 1918954217 +718166150 852755706 3906296567 2128491217 +1252024024 1383419405 +2992075870 497823734 +1192225438 2081314473 +1223150643 4251733413 +2207312346 848677282 +1111262992 1985023356 +68975790 651707897 +1710109960 2382206171 +3414660780 309473473 +3761045579 4112841878 836204034 836204053 +3513455334 985162791 2537924982 2442051607 +1943740733 3879783652 +3915004000 3104227109 +1781150616 3094296667 +3868408826 3936162006 1307359445 +1925484235 3889635257 21058542 +1878693514 3514497851 +643007320 2910307213 +1928260640 4025471384 2647007483 236828275 +3517697445 3061103276 +2809785371 3220090514 +2351082893 1225285454 +1454531194 1879868226 +116029774 823981529 +3838467158 2156878705 +1874985876 2188091897 +2366176329 1571183160 3181143012 2642979295 1311057656 2766145083 1630617599 4068231342 +1421508725 2220672385 +277383997 2149458895 +1135207196 2720102855 +3488562366 329031455 +794785025 4173217063 2487562390 4276845617 2487562368 +1880169929 871490414 1880169945 +3398957447 1950207894 +1185415047 3005275935 +3204061956 1199368665 +1541976037 4010622748 1843026183 3520096547 2488067436 4010622730 +3114435347 1305761516 +3589992904 2718604747 +2864884835 863330268 +3280746926 1264356875 +3819008431 633536236 +2182370519 2634124902 2634124912 +663154114 4217915491 +420183249 477820695 +2824847319 3854237542 +2472582798 3561798671 1137445774 +729042769 3894617825 3105414278 +1956521203 2280925850 +4115319693 2982047483 +2445478645 3725388297 +747913478 1629733745 2969110274 +91394491 2484488313 +80130670 1684251385 +3516862912 3177771333 +3193594285 2722489371 +3215425882 2552358094 +1797202349 2260545793 1840727888 309634454 263389980 1332575912 2229769869 +3950463660 2346424851 +324750382 3378760874 +873639724 2495362421 1837068500 866033071 866033080 +1358626787 2309695175 +369622960 1586987541 +355788320 2040376044 2185643109 +3459663547 1517377636 +2833991953 4217636294 +541958212 2478776111 +2289964976 3215806087 +4090896213 445020314 3849016314 2548784883 789795548 +2721087664 3382226972 +3980864116 3327372488 4211594393 4211594383 +2988172917 3605776956 +4127628454 4066941249 +4108124946 2692167884 +2691157287 2858939510 +929135157 1668505980 +1975787920 1771070895 +585406600 585406616 +1637373465 95764222 1277504516 1103705375 3608509642 2882498616 1637373449 +2445449011 2910240077 +906554187 1527408386 +4030597707 2091529236 +3226291634 1541014795 +268078273 3899364310 3899364288 +1168059716 970350570 +1155954406 1556950017 +3543271878 2042900951 1036346017 4223299843 +3587196860 1390472423 +3525064919 5753954 +2608012974 1681476591 +1157105104 1651582563 +1234136994 1234137010 +3368303147 937922978 +1635899802 612114102 +3171717775 701150990 +3737041732 3930115081 +3824562298 1292370243 2258238570 +2985697808 3047294735 +797057760 2849826469 +876675310 810841775 594820915 810841785 3086402202 +3554478066 3245939007 3251760548 +2256440396 3596336736 +2866753121 1582695072 +3673485566 833579322 +3080036039 3347641152 +3833144643 3988105322 +1265262526 1987360777 +1508535919 4236876305 +1908184082 501028933 +2609297259 4272984849 +599642866 903025395 +1461713871 1356064733 560468410 3780388145 2797397516 4133054158 +2740830703 2831051067 462965560 +1999167945 1583050606 +2442550508 464799617 499945472 +1083473317 2717378434 +3748024981 1125384348 +739163714 2637529589 +3678164529 1358671664 2936585383 +2061524821 3291878108 +3874900259 3098878474 3098878492 +2124348461 1622993785 1488772846 1972426059 +2709246521 1860956094 +2631172670 545851273 +70894186 283970765 +4120047246 4120047262 +1475382877 3434093666 +3918289552 938643637 +400832332 1116528992 3896708257 3896708279 +569510618 3022410403 +1323844364 1481585440 1134660577 +747458675 1345506196 +3445165962 3358102293 3353326641 +381058860 3981062743 +4272274084 2640325371 1559948779 3277119118 +1488188708 1676324623 +2450906719 1466765214 +3985514161 2814005414 +3852009885 215845410 3354610974 1208753003 1807778216 3172175723 215845428 1656779650 +3058331206 1026267191 +3251497367 2921773222 +4110927459 980853878 +2039190119 3352435314 +1210382915 3577083772 +1821528137 3862304410 +1734810653 4127197154 2952581867 3830530484 233460226 +1500857048 2878880283 +3928861080 1038219853 +237087396 2171150489 1367232712 2641640228 +269218814 2572916190 +1102928807 2963678643 605505504 +1985672500 314557268 +1313654862 3733937113 +417983301 2101173658 +1262750115 2479203984 +2976862011 1192607069 +3295362784 349436581 +2403560386 1227006581 +3810901817 521051400 +3104816378 4202144194 1304853899 +2492701700 3898514015 +3362664006 3413301303 +1511579418 4012324349 4012324331 3743882413 1706680546 1511579402 +2576585351 1246734976 +1621995191 4075674992 3899263494 +566688297 1698424744 3139840409 566688313 +827318579 2726015159 3552543564 +505071926 2586492935 +895541445 3431061018 +883263202 284164586 3264435651 +4117028203 1267860757 3100151668 1353506144 1471796120 +1848402681 1759497704 +1993547668 2723853807 +1240993212 763207399 +3321859247 1615492974 +1485383721 2297051271 +1506481547 1535301237 +4161342035 3376103610 +3683648445 1622532738 +377515351 3209640710 980834743 +1124699320 805858411 2053795652 1124699304 +3569188132 172752800 +3836888416 2381198847 +1555835 1614309935 247421559 790576579 2075039171 2297882163 3440400041 3731735581 3064029881 4251164184 3691238738 2615467208 231942491 2163771423 1413964052 4153663275 1010822337 4090503130 594170223 266781504 3154225646 2221687535 3918794592 3875469419 1580321607 +3123754312 1655529547 +2092459491 2636068119 +2885011430 2885011446 +1078380379 2322322514 +1788298348 1788298364 +1919806695 1892301043 168554400 +314162674 4172265577 +840570726 1158862209 +3545096132 1737965961 +3367321008 4245339408 +2386617965 1011379396 2852337823 2116094043 1563082130 1011379397 3037877364 1011379410 +3009215810 2774093661 1656067662 2640490211 +3254819720 1215210147 +3524228589 2606146564 +880757123 408549095 +1133931035 1081632735 2160658564 +157818704 518605539 +3777823210 1675232077 +4285900364 1780050016 +673675860 2330553436 3320935415 629807611 1239922259 1518035655 2575319850 3471424269 3471424282 3471424268 +1963425658 2531219286 2865195074 2865195093 3033378059 +1918603956 3123179855 +2247695455 1177004446 +2220166488 2850292123 +3278331798 834369831 +3126150758 3393055697 3126150774 +2459508089 1074357608 1288357193 +1605480633 1572418344 +4265292988 3420599408 4080272369 +266841162 1068820914 1404319867 +2478673838 2478673854 +113987996 1309767815 +38589208 3684325088 +2478155039 2784161758 +205182838 1186767702 1862517525 3064016583 +2736484138 3996122893 +8421465 592055326 +881560182 766179281 +418888899 3155648176 +971327886 2754923578 +1786262434 325979268 +1462704791 3475756547 +1239533938 3144708816 +3460339524 4088274975 +4273467549 2559559467 +4269249205 1499424333 1262220010 +2670137114 3681259746 +4060864300 848395328 883970625 +3032405957 1299032844 2846865347 4158865905 3148686069 9726520 +2062953890 1133113125 +1722741934 1399533039 +3370474191 1259541116 +3190956224 686394963 +858608853 1700563786 +1911150581 1209988796 +2699535610 1185461661 +650106627 190676610 +1920645378 959528501 +598399660 1201775552 +1639384340 784524733 +1315414006 1403510721 +1309707217 530889933 +1643986706 1403668819 +2286876073 1028438286 +3060232449 3069052181 641323762 3069052169 2236158247 +2401184786 1611817029 +1698183783 3196317750 +4231274892 2450575201 +25166684 3095742929 +635394714 1484781149 +3619688149 2018990428 +4166776008 1257158551 +3731849513 2622579155 4280574597 2503815398 3771590683 2487037760 +801629277 2494332514 +243920352 3273750451 +624920383 624920367 +3118268377 1877394056 +4016144441 259840424 +2945274669 2289692626 +1174045591 3227330214 +3005048637 1371300405 +262504190 2478704681 +3708871888 3516412771 +3067064306 3136420325 +342634092 2454524929 +1157387160 2448661129 1447696891 2753636744 3242903891 2823819186 4187559452 404935412 +3009498559 3672682187 +2775227272 3850615436 +56028780 3122614388 130126750 +97620532 1558783951 1558783961 +3587044635 1863059259 +826051180 631519617 3263596032 +386872308 1089390863 +4243797007 638210081 +1312834858 1496113421 +167499599 108261720 +3977905321 1906392575 +3723386119 1698460182 +2819984127 2565459816 +618090564 1812745290 +3077716623 1473392398 +642985483 1609661268 +549581748 2048440328 +2551108290 3708346570 559269731 +3958803771 652480488 +1858878352 4219585443 +3040025501 128080864 +4182075033 3599631209 287509799 3795459378 3532520738 +791896501 791896485 +3208235512 4294504813 +1088768664 3237244228 +4110165058 3941405685 +2559474847 2292547520 3141046849 68343055 +3895363551 1614799902 +2566719312 642941667 +4087914849 4087914865 +33907871 3447547464 +2376285356 2750972631 +408480749 1090217476 +4106822746 2752617157 +484369617 1138898192 +1591486683 2976390346 +4019483918 884229391 +2819083611 3746055762 1839320051 +257532774 2417768855 +4166164440 3255935236 +2300434293 1325018410 +2138396072 2138396088 +3333208568 3119038843 +510083172 1082809705 +2504452380 446756615 +1815911806 3781946719 +2266827554 3568862869 +2483512603 760099839 +1520995975 2770125700 +3225942422 1721950839 2641650858 1721950817 1196287793 +3248063118 1386775951 +3036393126 2385768257 +1135185554 1621171214 +163129161 2541279214 +2922178691 2858240671 +2433642966 232305825 +2362913369 264520200 +2688578447 3564497432 +276975308 2124679836 +3847522959 2467700504 +2614164803 2365501564 1894765360 +350919461 307379002 +1433998840 2241697147 +269087668 269087652 +499780290 2802773877 +201477116 3293300652 +2212169107 1436769302 +2698679123 2333469612 +3780375038 3039163081 +3594126197 1618046601 +415491390 2266274398 +1977076380 3863506257 +1802735681 1802735697 +3408418586 3934330347 +2583998469 1408959099 +895557060 3420576649 +106982580 2129155895 +1101347330 1494896931 +1844164838 4027847169 +1743171966 237594975 +3609981720 2920295603 +1873907333 1137233578 +1213303273 838639449 +95072445 2830383508 +2147441289 133924280 +2109741895 1013641430 +240755154 1763294597 +4068219086 1465142650 +577994781 577994765 +1499575958 1255304743 +2479089026 567914646 +2154147919 895020698 +151441836 3787198913 +1017144434 1017144418 +2376916613 2562371175 +2762577838 1681140281 +3457161057 440856391 +2484585865 2859202222 +845181025 2932926646 3906885265 +597640458 3272017289 +607058090 1679359237 +1209436033 1209436049 +3489554052 3877069039 +814397672 1382094123 +3221106233 1981989822 +2707322290 183347821 545902598 4092429885 +484720428 2807001665 +3456276207 1190066065 +114518915 1104297770 +1346967417 2977116399 +1627446906 1885023318 156589909 777927197 +2701807058 3136551533 +755100277 2372854796 2979069687 898056531 +2407302159 1847543884 4026786702 +1377991526 985610853 2991079831 +1698919652 1295057641 +3197282074 450694635 +145706356 3937929183 +3344288744 2989308419 +3495259253 1593315704 1805461014 441145607 1648619764 719599581 1803140156 1648619747 1648619765 3654717040 1403202304 +3264775550 3558483273 +3686213271 414237186 +1164331332 1637898945 2251212070 2214942239 3714478127 221811716 +1033745923 38110890 +1280569107 992041722 +2642665342 1956172617 3952393865 +3014471292 1436560679 136787716 +1784446364 194624657 +498197742 3940004938 2903204537 3280115816 1542660018 1921449593 401365369 +2981990855 2981990871 +2489823537 3493589030 +2289221257 1436676536 +3003418227 78919833 +4278107370 1426285645 +2783934822 2650545025 +4004624047 3540830073 1425049191 497259574 +1235051900 1675866929 +1979355532 1165172599 2255211016 +1136270264 1442423483 3238855937 1442423469 4227532853 +3766003854 3958462361 +3492942647 4124327814 +4021771761 1319690854 +2432003871 2432003855 +2894426713 4011000350 +1837806083 3753801191 1951808188 2220250106 1951808170 1837806099 +3628457935 1978624539 1157583576 +2817051585 343458006 +2662449483 1956383352 +3782781488 1962456476 2079899789 552855957 +669168988 635666375 +3302592712 2860444363 +3198239779 987644700 +493567659 1525695189 +56220102 3465716410 +232926256 3580742302 4164093835 3646867016 36902751 185307029 4164093852 3630089394 +4198201996 2007100001 +3064246422 457309233 +3647722364 2616906023 +1116360279 381244134 +4008837637 737750476 +930280928 704188325 704188339 +3444584578 386258077 +4184869040 1532865795 +3017676124 1811715600 +1220210522 577833763 +4004950621 928020628 +3153353486 51639752 +2145750711 496547636 +3056740009 2514143212 +113766215 1939272260 +3252154299 3790496626 +3212778501 260495402 +4028257441 4028257457 +1438585766 2714496577 +3163592441 2589507130 +4046888826 855444765 +3011884821 2961126940 +1682823795 133131255 +4013137249 2388095907 1491979152 +1734810650 1660633873 2648892917 3780197629 3945142838 +845513822 3016712169 +1741998494 3716226021 +160915315 2960115891 3866687712 +3620816078 2356105305 +2699234901 2591002570 +3155523759 1031073783 667484182 1068487408 3301768049 +3074344146 3074344130 +1618248286 329665641 +3673856222 2524882303 1751025406 +2096015530 1437827981 +1161658531 3486337427 3754779315 44877780 2731638912 +802654889 3889790975 +3567161827 2560600156 +796938856 788642237 +2786014222 3693546905 +2533814981 1612016874 +2777068033 2483697558 +3976531321 3010475337 +1490100647 4259840825 +2094960557 1063005522 +1196226329 1462303838 +194944259 194944275 +3357542963 1515460769 +3376451433 966902360 +827191747 1622382058 +1000643546 2038287285 1610467190 2038287266 3189856299 +3594398677 417267804 +3344856358 4289882817 +968789207 3187127921 3187127910 +4040264549 2128506874 +1064771732 2089306351 +1444359667 3427642208 +2924821716 245036607 +931032230 2230170598 33884503 +696652480 2449080952 2540517517 3991930340 +1910413066 2943641165 +4223910740 2315853992 2838265145 +1087005930 3902594125 +507507447 1827820898 +1312337629 3884532 +210428175 3449834126 +4246857328 4246857312 +312598952 4241898347 +872383073 1010450080 +3729982604 2387579041 +815023956 2160796226 157230092 1756322618 1756322605 2658618123 1890557661 3005886142 6231507 +982754628 2053974537 3269012536 +2201782937 2081671017 +373708194 1677220719 2998455811 +949261250 3004983938 +150656656 3001009333 +1664339205 823921639 +8678663 827590163 +3691113965 1082555187 1141476356 2782293690 +1045009202 1045009186 +619830772 1474446860 +429738622 3305087391 3499902047 3779956962 3305087369 3177934174 +943580148 2104351001 +1330950068 2563861472 +2452012202 3170566029 +343094267 4143707304 +2334590695 1799722639 4117749174 4117749153 2854480490 +1732577904 97119511 +1045688028 1897603887 +4211053660 3662672648 +2463911561 3117392312 +2227858016 58155775 +3186807394 1732325443 +3666523536 2556154300 +900063713 997254160 +2117839381 3438067484 +448690065 2866166086 +823953352 3589114009 +474798768 371038748 +2529457465 2420410536 +2357734996 1536623551 +4264494254 2346704687 2756619506 +2627118524 943425943 4244853484 +2044161381 857814508 +3290556719 4032959736 +1771963559 3526955639 3652445078 +3547071273 4228446616 +3031903866 3031903850 +1251539752 3902731693 +1836226225 2047295540 +1240390286 527148541 +3550159829 1691295161 1691295141 +150124116 941149119 +350034664 3222362941 +2281696274 702586963 +4075647414 566886801 +1470930568 2369234520 4180525812 +2475597014 315357290 +533280153 289663592 +2953304555 2053899403 123473149 +3546810611 1893039734 +1454607434 3743187057 +1890939259 638241673 +1820376694 3783156311 +1927076355 1160496517 +2999308681 4134066862 +3425761459 605520332 +2036936536 2023065485 +3167127672 3411319296 +3901747056 2325081411 +1031937375 852769928 +3733781904 3891472821 +4058265615 3645128600 +4189694695 105384352 +1098690253 235625508 3829869746 +2593727555 2719225205 2422245132 1408538615 3622492755 +1746466066 4048145221 +2781048346 3570698229 +3366599484 536559473 3498371553 536559463 +3150518618 4153600189 +811080994 1018551445 +1560053817 32573378 3899612203 307107746 139331553 4008012240 307107765 4024789878 +158572471 1846820193 +4283024521 2321236980 +2514822033 2115024182 +1618510294 3014943719 +3172857866 3224205229 +1717972537 1803576868 +2909174541 3110379625 89372018 600242967 3569787506 1936116129 4294339211 1271028655 3991798782 1369144020 +3523795389 1839852270 +3542224239 3449497006 +2254565121 2368421504 +2226218930 814896973 2504408357 2105349406 +3401378308 727999583 +1714781627 1714781611 +2722040008 825938635 +1426253039 2116535355 3264111672 +1465922085 1932247074 +1798299311 385481384 +1566561660 3486200005 +3609756477 2537885944 +3897223436 1357665304 +3081325542 910301276 +2100105492 3905389695 +2589449728 4007007707 +1526303182 3701581434 +1135114332 1135114316 +1503540815 1661959758 +72174374 3637507697 +3182521500 1505746759 +3518053017 3003072200 +2435319504 1383314216 +2486853538 4192504853 1707632829 2979694702 +1265066053 4173106316 +3101069171 872088441 943953411 3862688676 2506434218 +837539509 1262681834 +3347489071 2312668933 845575199 1206893806 +3192204554 2430985915 +1339874060 3299660776 +3316816021 3441832586 +4072251338 1021102386 3828779771 +710661695 2453886797 +2107960335 776073292 +2230570949 282071834 +3436049716 3436049700 +1950036447 3782880225 +898537378 898537394 +2544167806 1524279966 916371295 +3485266424 4268812667 +3336377412 1727464328 +2973736911 2973736927 +839028044 568973852 +2407838247 350516086 +3371329857 2526785878 1830300273 +4126346334 3176192091 2342287337 +1113998495 637404744 +1471796872 2710353931 +2408293124 4241596233 +1322901809 1375567920 +2022223828 2469186223 +1437051487 912274337 +3567657554 327681811 +1555409166 1444356712 3081309 +884256193 3923099805 +1562508575 1210343221 +2627532717 941221188 2730754066 313120283 +3793465437 421634114 2550989227 421634133 +451165194 1598718893 +1728377349 895981537 +1635166462 2875151086 3037695161 2882918000 921995491 +1523606626 1477314115 +3012040957 968149474 +459321536 3515794242 962858216 +2210713577 262165849 1473465294 +1367885652 2184393396 1720403135 +1929572036 2223329720 2223329711 3516784265 +1965688997 1965689013 +1282257781 3316744508 +99675109 1184159910 274399917 +620588815 340437233 +2319309674 2646834629 +1087853781 3891956572 +1207636505 1207636489 +31692105 2820498336 1615698085 1117924731 2837275974 +292492845 3641672756 +4128343547 1486219826 +2993038402 415962083 +1778099007 4286575356 +428753479 2180142550 +1850373199 3996457041 +4091597199 4281469823 +2342206971 3227685426 +185296591 1427996209 2034878747 +350966405 1936910170 +4187411303 740767326 +1262984309 2463688205 1262984293 +688029475 2985174026 +1444266392 473940571 +3525814259 3525814243 +3817805113 1153197281 1320973474 2392301907 1320973493 295817846 2079697707 279040208 +2465367165 846462032 4077881489 +120741551 55250286 +4006832218 3726945333 +2246291188 2246291172 +1574792349 1620179764 +1960951738 3110130141 +4150618613 1772473532 +181114531 2977840090 3583015815 3583015824 4206893005 181114547 +2616746959 3574566426 +404726734 3352223055 +542291430 542291446 +929672944 727606211 +2244655476 2244655460 +4095508052 4095508036 +1280677611 364680162 +2960894639 1002509981 2624479226 2276917457 2624479212 2175644014 +1784393523 1149185718 +4183163390 1908003682 +416551830 2883245351 +738207210 775663451 +2772514441 136442503 247614065 +2093308146 3560491661 +3421779452 3655088039 +1807795763 2591417603 837524918 1273578897 837524919 3547857484 2144043597 837524896 +3447516494 1156614361 +3312290350 455319737 +3981195194 1224456651 +3732653175 1783775971 +3356452411 2224833996 2349959685 725479154 4135522536 +2306418295 435389186 +1602712738 4226630742 +2007030092 2954842976 2654343841 +904243699 4145448822 +575325133 575325149 +4287782089 476582008 +2254954674 1761527732 1200011301 +3195680240 3395479747 +2619467484 2774428743 +749840893 1355435369 +861036812 3592519991 +1003980552 2228238900 1011454365 +4119697105 1737783926 +2487503051 357082187 +3137288947 3752656992 +911913431 1076285769 1741026672 3433127764 3433127747 +3991322430 3225357961 3459601703 3225357983 1111753822 3556050210 1111753801 +2809707574 3148019222 +85297666 48775459 +18372595 2891084698 +798244724 788342648 3723708873 631234630 2784187767 3656598412 +1974016191 3540861822 1899687109 4133275391 3590208914 3606986536 3965499196 409953653 3965499179 +107329257 4213108942 531960921 +88436272 88436256 +4265195781 970867404 +779558233 1559747343 +3768779333 1044360003 +636616837 1089917274 +4257696341 3585737674 +366144265 1678245688 +322219283 322219267 +3714950474 1448217253 +2456373831 2456373847 +99064269 412556722 1742978853 +3141739569 756097079 1596667606 4222744880 +2521166990 505412495 +3254748776 3443561899 +3331531028 3343127656 +3851607960 4264950875 +1522373383 3135282194 +3309463005 1686526708 +1617845687 2227013392 +3608304517 384176716 +1914969285 1943620122 +4192323962 2961330401 3923724934 3631229725 +2869020022 2848577745 +1958470431 1958470415 +3772191735 337901357 1060842122 +308681575 1572676393 +1756303718 832070529 +4082252568 135509171 +3648272465 3648272449 +79281211 2875412722 +2895149250 2944545684 3670602358 1478837048 4205367611 +2254518701 940428100 +4252932449 1867215798 +2123315402 1400103074 +377210901 2951876403 +1511478448 2193248515 +1963623879 2577380096 +3910157727 4148177782 2208143688 2600749494 +3637595385 1249651688 +233463896 804622667 233463880 +1391811235 993898140 1654466101 +3740596029 1614072909 1513022234 2327901276 3880292133 3450365130 +1659729994 3046448829 3434607529 82357429 4264546487 1655479661 +180162959 2703405306 +3722868397 3053392616 +189728335 1188900196 476507736 235484300 235484315 4268996785 +2092465760 2092465776 +1743134716 2774897451 +1109335271 4261052342 +3130881922 3448632202 1206067619 +2038976383 2038976367 +14795618 3311833941 +145014167 844526769 +180213744 1431394184 900069707 3638226627 +808426645 808426629 +3799475813 542055921 2475630550 +597422283 597422299 +872799138 1330440374 +2051337533 3078715138 +2891446047 1836713416 +2230917847 723861616 +1544546770 1419310715 +3709058183 4048098302 3052799103 +3472527625 3371551598 +1607791086 3392723385 +2585875707 2641938212 +3841023421 2988801186 +2944884615 2865743231 +1125974507 1125974523 +1064583292 1398900272 1064583276 +2656953413 2462996634 +665236912 460325909 +502566566 3455881025 +1304283954 1427252954 1427252941 +1250621911 3230010613 2797528898 +1611300590 446053420 +3027794793 2093478638 +2469567069 363397218 +714852184 1519696612 1799016333 +2584946902 1646872807 +634351692 2201043575 +2144410123 1093402434 +1520877911 4265991113 193092582 +704807084 4071668183 +393891692 1636501271 +1509976109 712330529 +1527096476 3588360311 3856802183 1527096460 +1735313702 1939383409 +461747146 494536443 1645804837 1645804850 4232878790 +1694099247 3154792477 +4265958823 3647141796 2766772025 230401822 2783549663 3996282358 +788154501 3577813181 3460369840 2299944215 2030053722 +359026486 807551254 3859722759 +962613185 2507319236 +3901436587 3189818146 +2583890675 1707752602 +2470100761 2572963816 +636851828 3898132158 993735773 899405967 2176900361 +3346707883 2972449844 +3815845293 3815845309 +2312019925 3163718771 +2313922188 2851548791 +1555956849 1612768416 +402493739 4012607138 +905748449 831574534 2466540743 831574545 3719278390 +2891512215 3876645040 +4111381597 3065398357 +830771731 112325612 +1319134523 1065199615 25123812 +1676037550 1254099129 2065295626 +2727500699 702903647 +346040356 2619289769 +697613145 3458395422 +3713844006 2668049623 +1935055168 3608996344 3511893971 560693300 +1793531811 927897313 +1171664743 1462542112 +2666324662 3840468113 +3908622566 4123073430 4228398093 3455486052 506886502 4123073409 +1026927428 2675743753 +4257315868 2476105735 +1905839278 624252938 +2099804820 2251080620 +2385321970 3272165861 +3991638873 3540573503 3805869320 965336638 132848527 +213802408 3081596797 +949113524 949113508 +605149787 1153163983 +3098049962 3859335553 +1631344101 4143658874 +668938233 3498958447 +556872812 2893383191 +1998277456 3489107683 +2473151474 625309082 625309069 4084577246 12750323 +1436596376 1677891419 +3804416126 527191966 +1753603679 2702398081 +1447716798 2501988361 +2420907234 164722627 +3784138073 1787425566 +3186619132 3186619116 +955091700 2131360711 +3114333138 174052243 +3104830088 3622273420 +3990011784 2724778686 +560058662 3002875607 +197072295 617551350 +3698364844 3253715612 +1401233940 919569708 1957602391 +1635558155 3816278773 +3746231028 1996256773 +251082165 929513804 +2899658569 819179381 +71954052 1147304393 +3644576899 3644576915 3134626919 +3415116137 3415116153 +2387029452 2387029468 +2198532482 3639932489 +1400401412 299565817 +1159505743 1835712247 4021866655 +1090896234 2774324179 +1368107833 3004689528 +1554913323 2420272207 2420272216 286264244 177896277 +3177197796 1854340749 3391377380 3129520335 40695551 +2621626314 2597634341 +3875563497 1795559871 +2833469239 1617539568 +3391140473 705365447 2860053608 795160403 3546863452 3523608090 +3119841646 3041925322 +4177827786 2076999987 +2017894616 1414459493 298309994 1917292160 +2691879010 4139649610 +3678918132 2674619784 +401146050 1707880821 +75782753 2103068342 +2119877421 367083460 +3212295182 487884306 +4074176576 2289394885 +4036823048 1908255024 3410764579 3476268189 1036804598 3310098855 613347469 1891477418 +2558993550 1492496910 2864614287 +2147286535 2185487638 +1957060235 1957060251 +2716581971 2753878506 +3212386366 3665035888 +4101607852 2271236545 +3494958888 2600556372 +1737094943 2298714349 3130595786 +3707040789 4140636004 4186045790 2017720182 2977664713 4285637251 3442259666 3956582111 +4109808756 2836874975 +3688371035 1881569357 +2256139929 3988591486 +898823717 1625195584 +3552605187 1526112426 +3608116680 1432551883 +2969634325 2845604300 +2017375584 3890754184 +4065594036 1942713144 1006249737 +1600368391 820807689 +2763885744 107247875 +432307093 625904522 +768398835 520129847 +2131971933 2131971917 +2103437988 33447999 +3923557813 1248894202 1918634316 1390584503 +3179837220 4103229578 2178125247 151519503 3158012067 2626659492 +3077378429 766668420 304259419 3792418402 3077378413 +562782013 191294722 +4206190936 944579952 3405239330 477684979 4080180698 187876256 59260315 726039979 3690458865 +4153348956 305887687 +3918821523 1434552064 +4202431643 1849256040 3963306002 3997553774 1544729856 1782145580 4199475570 984236609 3487633851 +2773823145 3665734578 +1842006176 1983501285 +2021420177 1021241414 +1062160826 1104304150 1674645469 3978026133 +2533329652 2823274009 +3043827868 636982067 +1052677306 4059669937 1367318402 2147754205 1256083734 1367318421 +1722965614 415934255 +1559135695 2809604143 +3842746057 1185279291 2782213944 +1948956774 1161840791 3686465251 1161840769 2871901082 2603763121 +4060079104 4124306451 +1770998622 2324931839 +2911677076 3362817775 +3832891167 3141331402 +1620924291 2595275580 +502566580 3690767705 +719943361 1927001073 1317401046 +3630897837 1570438738 +1985124602 2603126541 2586348919 3645625446 2019515542 +2894773719 1969805680 +3141646763 386453474 +3055699062 446322774 770819537 770819527 +4282592329 801034248 4282592345 +3554544399 2508941464 +92882474 2725748632 3976550125 +2076769850 392705373 +2685005427 1654808332 +1699806126 746337007 +657711868 2997768881 4184616112 +1997620155 1303693006 +102274475 1135844386 +382343573 1678062780 +3361563184 2600571267 +2473725162 2797783890 109728859 +2890276320 308348851 +3447120580 2036997575 +2582628513 390055415 +2111357070 2855739289 +3454423317 4047846330 +832240238 423148247 2177182457 2084891698 2230860591 +813575087 2930101201 +2697527286 308998222 +1114963996 3706261504 3380447605 +2866256487 1588058541 +1970403373 564984066 +2388036568 3929941275 +819559850 1900044134 +2793417112 3949771329 +587829630 581655644 +568628967 568628983 +4228928845 3549394647 448153650 +1102729125 1552800344 2774050133 2001893566 3555960244 +2221706756 2061733961 +1044724758 486381223 +1897167596 4013785495 +1779295889 2355282227 +1300850714 693035243 +3594875866 1080453617 +2754091781 1616736061 1393306499 1616736042 +1430349681 2801129190 +700399488 3283356959 +3330690918 3949919617 +97280013 767243364 +25166952 3297177533 +2403825271 1689404642 +1018286075 2263509028 3256334511 806213739 +2025948542 2230965406 +2986226923 1968289550 +586089816 1447389581 +3794469451 1421122580 +1375329515 1369022232 +1709780805 3004524940 1564346219 +3839623633 119067684 1343616191 391568400 3283901792 496037399 3283901814 +3574561443 3994091408 173936284 2661592861 173936266 +2440908611 1262732924 +1734823172 3416145225 +3713522558 329192525 2903200773 4116254861 194971562 812447012 3698549140 3660917313 2476327250 1988496376 946667978 1264457021 +1909680457 134865397 +2700157200 2700157184 1805061155 +2256972246 2617072625 +444288540 3424384529 +2374912552 4278107371 +2082583865 2718976168 +1974327807 2804934570 +193982572 1014304640 +3128598821 3264369856 +1633074237 2022331394 +1442407414 1477422794 1301830727 +342441940 2084450623 +1828194432 4224222299 +1026304111 1440951773 +1401141253 2364587334 +1406254993 2217775430 +3168664257 3931847431 +3316176106 315042893 +1718431441 249606918 1908003425 +1340226970 3847920934 +1460029574 1460029590 +3829038741 3709158538 +3827903580 834602247 +393212255 3987684892 1189004807 +241722947 4049140586 88753574 3040795930 3790355539 +350499462 1765509345 +551274675 1580246048 +1975753526 376403334 +3322679880 1173378451 +3756568777 4114764078 +2557470910 1094493066 +1851558404 113409784 4234926128 3215803465 1862871345 +111253330 3261150725 +814935634 3377277701 +4199753243 3625694418 4199753227 +1647806085 577291084 +1440805284 3575407935 428752084 +34606898 34606882 +1916117938 2087760165 +3015457027 4098736060 1382339815 +2680485806 2680485822 +2340192975 1191593243 +2790224063 2383314088 +1088909209 2186130537 3310661086 +172271314 1682733933 +1139069468 2072516365 +1746756030 2971511497 +4088650831 425786010 +84560149 3886377873 +1374228418 3018051189 +2568031021 2796224402 +1121206090 2116002157 +2307934686 1814317161 +222427776 1591564165 3681601100 +3738155666 1392686035 +695572464 9134740 +615807187 2602185786 +3144673825 841847286 +2403655920 4250053213 +1653810393 3368501603 +419587572 1388740367 +350571162 3602179086 +1957118732 3651547959 +450774333 2296839956 +184457513 511186928 2528427325 +2022458236 967362403 +2895251087 954225422 +1394539139 2262353341 1159541360 +3018342495 2510116254 +460144626 519809519 3443144619 +4059517872 1689443599 1048134437 520611500 3526125084 925444711 2692049026 972052965 2076078771 1653827276 3199589474 331966872 3123121166 3127981566 3678519335 1257196962 2181339804 3797736490 2665488101 640403835 4148021485 3960215969 2891905499 1627531918 4129786936 1206173599 1560623618 1709883706 3866387272 3994333217 3821591957 3512874384 1034565401 1759982322 3395163310 +2645207490 4121508981 +2902704727 718676948 +2974781380 3635239608 3829354889 +3074981857 3052070253 +3652059278 988471193 +22022675 603970540 +1961981133 3843743396 +2386237046 819753973 +2075719787 3138840207 791613556 +370081608 3179469040 +4154893246 2111683806 2572403743 +3087430565 1462242476 +1850613749 2583449276 +47095492 792981129 792981151 +294430050 40393027 222594173 +245725346 3883260782 +3237120380 876125026 +4199665458 1906051825 +4213302098 2824395269 +3519828938 245884653 +274741193 3667832888 2423771512 1200807326 2343671903 1607428155 3667832878 +2385763852 3886451959 +3440828085 2415957738 +1972732639 3136493035 +2359064961 3679667712 3047362806 4274261671 3679667734 1511478438 +1140119803 4117861170 +1697176547 1955851485 +3501827751 994138358 +3139706049 890704658 2348516495 2046760863 2023259931 122269158 2175209141 121734901 4189532067 2079849284 2223295015 +1905506268 2810867527 +3015563195 3015563179 +3439705970 1014748443 +4108956680 2481350795 +602048373 4070260028 +3841261747 3859318553 3700163524 +1044677287 2404930205 +3800018776 1272547452 +493036045 1343134322 +266347927 2497391792 +198385258 1810495698 +3761993867 1187884098 1168693109 3857494968 1185470731 3318104572 +1348037239 190273763 4089616720 +1565371189 1943825553 +832688634 465407115 +216874221 2579195346 1182198020 3524911067 +3634529699 2866306954 +2668799900 3269557489 3719086594 128818129 3744920153 +644604789 380515411 +2888472893 4066639211 +2700840588 1268898630 +2432794438 2338020158 +4147516689 3730490017 +1462553547 3608434936 655489845 109367426 +1246056347 1347094821 +620918980 115612831 +2995651676 2550897927 3513922103 660990924 +83805822 2260019733 3475746102 4068414471 1695934919 1293309802 2334802124 4135524931 1737548636 +426164936 3301220555 +271735767 2155527300 1567026478 2072624987 +123006740 2662620281 +1164331355 1302296863 2600827460 1120287468 2600827474 3558175845 +2189890784 1520819365 +304056419 3329753493 +2907205766 2807494486 1650592455 +3713045961 786156391 +1320579865 3672187881 +1453918502 3573343345 +2791382324 518060239 +995164831 2673131968 4287045726 +2562701355 3653045336 2697915298 +3987783516 2302492113 +3926738167 2235366832 +4122509180 1299230759 +4139554980 249842217 +2626864354 1959527273 +2816350986 4243836868 +943659529 1393338738 4056175035 +3695363023 1632692159 962499749 +2824708241 2301291080 655011927 1997404726 2623784006 +4175901328 1676974243 +1160814473 1942699423 +3285886860 3711287671 +29558470 2349050295 +1559377896 961413693 +3471872094 3471872078 +772864664 481983821 +2545773780 3006419385 +3406386842 1078846581 429178294 +3739590655 3799703144 +2333299499 443280546 +2370480094 1250312831 3258363286 765599468 1780505761 614600877 2662124276 2247458797 3294272266 +1581941285 2487935020 +2025984375 553240208 +641061945 261403863 +233285931 246369954 +1160550049 1160550065 +4103696776 2509093131 +1138241692 3583090934 +1680559580 3605631480 +618604731 3326942820 +2088362298 3778107852 +1555761574 1555761590 +3492817321 1691456792 +620918990 283389017 +2717327811 3138004458 +3173697998 2556145487 +1166048528 2034556963 +567229574 48477894 +958081580 2850040664 1133859380 +3184939821 90501074 +1901865201 2234624384 +3325103791 370881586 +3953838124 1285405116 +3183419573 1759542524 +3751504478 1984595842 +2866943168 2199784091 +2646799459 3169236938 3169236956 993226576 3420101213 +3424997959 3424997975 +1375496196 3816599070 1533587304 650744667 +129921387 2613873524 +71684041 2164148032 +1505990343 367418176 3114378707 +2985950957 1685894619 1239447890 2405213678 2414834763 428625668 +2497903463 3360801568 +2351642332 680940423 +1974648392 3674787312 +778007414 1984086737 +1867633880 1722762341 +3322519209 434147109 +828005258 2109950706 +862764791 3945832134 +767132842 2769016717 +1612010003 184663191 1418736634 +3672333765 377180138 +611655657 2651923790 1298217934 1566659816 2651923801 611655673 +2416038816 601565899 +1105387254 1105387238 +17232422 1296744421 1519647172 1525821343 742287150 3560729977 1525821320 +3544141012 2193471707 +419587568 1321629891 +1374714514 4072862130 +1192616065 1777593493 224017319 1752197888 +4099952902 2488881786 3763289302 2905218887 +1068437412 3835010879 +2110325090 1701653845 +772861268 3634731823 +3164301779 3164301763 +2318333721 3238408747 3057076200 +900422026 1291690931 113112122 113112109 +306570104 1761707012 1006966253 +3885765502 1078596255 +153698429 153698413 +3051882576 633442492 2890208757 +1273579491 2478223056 +2542629222 2748985769 +157067359 1694256395 467471752 +3579271762 3800107518 4286782189 3783329896 713240325 +1964250475 3114121076 +336474014 2481538842 +2950529242 3612843602 +1318214655 1248259691 +3352090227 3352090211 +3718535254 3022864161 +3882994537 969979967 +2864507987 922651188 1036157143 443025068 1036157120 1125322157 +3220253833 2980649902 +3462695288 3462695272 +3219739917 693166962 693166948 +3511288100 2608843711 +1761897872 3791157667 +162081584 3673717576 274177693 1458483508 +2893321456 860859852 +605244933 605244949 1478713462 +496815942 3822734135 +1685038585 3760887848 +3926757838 1096583001 +3290154116 1292988356 +171653327 2382030015 +3757231582 1765414015 +3029085 2781002356 2358434219 1401645122 1401645141 +4217808872 2862240299 +3896672291 698171654 +242598001 1440992534 +4147771007 2940144126 +1541497764 1204804415 +297222450 360423859 +3796348772 751080280 +2430351005 2261981169 +4058103026 377093117 3284576889 3093065957 421877294 +540979694 2964461999 +2230708037 2484801946 +3325067417 559918462 +2609124797 2381199490 +1022884175 3592609691 1230862168 +3718736712 915268189 +2179164095 3392441195 939282856 939282878 +878067217 4294414560 +3927049463 3395136195 +2452725134 4018885401 +2314579084 3116277879 +2192275469 669810918 681863013 3236822130 +2018337056 2177885541 +2810197263 1811734875 2810197279 +869933269 3309365945 +1390434572 3712007429 1390434588 +3883436700 2629250375 +3217471717 3402961004 1074469642 3345543178 1781009443 +2665034480 3023850589 3157905242 401356404 1650852271 4144537904 2956740111 +1098992347 3091279270 3091279290 3216720215 1258385074 +4142636485 1061140931 +2422990733 1622483685 3935515242 +3776438989 630851748 +2064658513 1321797934 560413847 1052418883 692997639 3135742219 +2454622428 766380625 +2222840649 3676320750 +2444594278 3335259287 +2316850569 3981354680 +2857316030 3634795785 +2534104253 1309385163 +3703995998 459188350 +580480152 3168666163 +2020572365 3922582066 +716311679 2632587457 +2271498148 3878145456 +3463497844 2997714717 +426277200 2322691756 +1091915690 512518299 +885353323 2110265698 +3610258604 3610258620 +937060290 2932954741 22487212 1747171850 2313894418 +1855828910 3493976815 857272818 +1917872739 1469544924 +4130031675 4214011590 +2376663988 3037779023 +959646634 3042663579 +2162070473 2198506591 +1017772812 2434163936 2658380577 +3333345567 77235146 +2129731887 77020398 +1391040266 2411250861 +3629830884 2156471000 2063203561 +260044511 3165821503 +2486902752 2050020479 +2201563302 956798302 +1157105115 1836136388 221956511 1836136402 +3415783028 3934132447 +4039898225 2819039489 2182204902 +1386295425 2478288733 +859381055 3386572011 +724147449 3151106270 3151106249 3951172606 +1473761529 1576536821 +3909732949 815757299 795444170 1830450925 1830450938 2854333477 +2727859428 2323838169 +1405613710 1405613726 +630860148 1810121695 +150798140 1648741233 618611431 +3698966639 2112327252 +1701036278 2450047825 +3587735308 2775568160 2949644257 +3683540190 2132554089 +3144680170 2181376294 19444050 19444037 1736281066 +3256999368 1666195915 +989328939 4283991476 1148749141 2891610712 4283991458 +4114702996 938453067 +2927690884 2927690900 +2510366693 1907477882 +828074469 2495577626 2548544371 +978936274 2897542533 +1615371810 2390379348 +2010696648 3315133667 +2505976760 3504711236 1919364544 3678327469 3504711251 +3974893389 1151079986 +1737140369 2152153856 1737140353 +3706194769 306827398 +3032793667 1657643056 +2436399511 3860665603 854851760 +3099909056 3589777819 +3218886960 936627843 +1033914983 1783963702 +2130001904 3423839957 +3993009113 2210592414 2210592392 3993009097 1942150520 +4008265104 485766712 +1231441799 319762838 +2247115792 1562088060 3912967477 2473682152 1562088043 3912967459 +1180400295 1761744118 +3847545954 1721992789 +2103954382 2904908085 +1840750356 704389416 3423562863 3656523461 +257110307 3191100369 +2157385725 694762891 +3727271499 110151682 +686399955 3080188480 +2579151640 418678477 418678491 +2350823149 2996826450 +1386244986 2357801245 +1663456585 1582842360 +2715062158 1335753881 1013574651 3686041323 +1593764586 22403410 1967902299 +2892086350 3712964818 +3337384499 1496827468 +1384970929 3113926829 431045050 385728166 3248147795 +845556588 3094430336 3268827905 +1178436519 1178436535 +692321856 3582840845 +2331914770 431849278 +3143151060 3940437800 3231294649 +2675830986 2265598037 +2241769156 3756462511 +3854642752 4011577029 +2250803764 1546222519 3125650611 +916091367 3384431260 +2342442751 2390759787 +1160445696 3187407160 +3996719829 3135208314 +4251734813 243717803 +1524235537 371810758 +999556815 3180554508 +2893768430 1950550191 +2047088462 1651552217 +84181979 3261495199 +36899126 2891415566 +2499037768 86518975 3297832788 3291005231 +2309676292 3153718623 +3644437328 3326000296 +3014269476 1250024472 1250024463 2942526884 +444062800 2492992300 +2760709750 2149211089 +2999109496 2296580115 +1633284662 3968349599 +252753273 810397054 +246527685 1468515824 +704181519 4211319116 +2951618787 3604858186 +1567290122 425498797 +3009177874 4185384402 1819895621 1819895634 3678101467 +2279310302 3163592319 +3013410887 120025046 +317731283 4235498201 2174638165 3907579747 +3980605135 2068715803 1338984408 +4047011407 2382064780 +1345237774 1199824655 +4163008076 3930077623 +1251677944 1780820091 +3801229163 387190114 3364957583 387190132 3801229179 +1179046084 1702536351 +152179251 2054334042 +419879535 419879551 +414473489 414473473 +3618569154 1249268323 +1711805246 3413418274 +505424638 1789111775 +492454663 1008174080 +1373447214 407751342 220197999 +833586116 4216090015 +4207094505 2759387205 +1880453923 688986759 +905748469 4054830780 448940672 +2604815194 3278452395 +3732851715 3091274148 +1060863932 985598532 +3367444286 614437266 +3985464358 1452547747 +2021637210 185958827 +3799092127 3799092111 +3863641283 1245865706 +317104937 4268174719 +107856007 1993491858 2667807941 +1303874564 1542548041 +905298973 249805236 +1800746047 908148520 +1677854358 1310994709 1677854342 1378105206 +1997804024 1622906501 +4029607059 2900257644 +888970846 3350023657 +327284462 2744629423 +4292049952 3656148595 +579697241 579697225 +3117829328 3117829312 +2979678658 1474436195 +1495221786 1495221770 +2574079218 686576231 +3799309523 3921085726 1358405690 +3476946550 2818356812 2570083781 362653842 +1513638201 214959151 1067140264 3748476702 +100953771 603600674 +3102617360 524219772 +2961876611 1833181226 +3162478891 3890093730 +213279509 4247820145 +2934034398 729430655 +1748211847 2419661974 +268078300 57392721 57392711 +1270788461 2107551685 +3041891879 2471059318 +1997248118 3711818695 548665930 +3927360112 4057208387 +2292369282 2587890101 +3774416363 1990075705 +3396219242 360171995 +884021551 566928622 566928632 +1254510030 2217507663 +1492638771 1093641306 +2804335576 4194716955 2309947251 1464475424 +3954405115 1450323451 12470524 +570625104 517821096 1690186940 1690186941 3631665064 1690186923 3670827509 +1796893285 1381219741 4287986938 +3270293070 2162721625 +2838306436 3590785503 +1443048921 1073818760 +3144363775 643417259 146471784 576306799 +3342613640 3342613656 +904431273 3322459877 1309432328 +1632006280 2850235915 +1382291028 458827116 +853451544 2531252140 +3969531271 3948335135 +2842008111 260348795 2842008127 +2426346278 3497508033 +2353647253 1831875740 +1831562526 2984754056 +275330224 2241720579 +1000487888 648787576 +513218472 2360155408 +857799319 3988951435 2641427646 259961134 +2164274660 4149532137 +2637248042 1671124476 1787069365 +1503499294 1503499278 +2289054987 2120418350 +2197657714 2805398373 +1564257106 1564257090 +2122484830 2239952873 +1989176125 3149342978 1406207541 1406207522 3660210507 3797471490 +637890353 193858086 +1921820513 896084858 +526942935 4132834377 +2059634919 2495524328 4118829285 3762238706 2979922681 3762238707 3762238692 684753824 +591906310 568007751 1546802198 2171820898 2415704929 1190631802 568007761 +1756264279 2289794218 3098947997 1674582563 +331642225 2403655920 +3377080338 3752263355 +3761683330 3419592605 +935712041 4117663630 3943431321 +2419719389 1938924260 +1005514592 2530473517 +819167104 1559344773 +3530064812 387404115 +2520481958 2520481974 +888683601 3016160134 +2588787924 1482341928 3161250233 +1695701623 2375141602 +1658348095 3272624618 +115612802 187277450 3716509721 1528357027 +1992440190 1908441417 +2590615437 2706555620 +2891691790 1650535193 +4089730285 4089730301 +1360501679 3172187155 3639849373 3172187151 +757994506 696880059 +56924124 861605713 +773354488 2289995629 +2628670035 4184578234 1597747953 2468212653 1348556480 2972821135 1281446004 +3107401328 31332949 +50066640 446861628 +2343272668 1455349783 +1189809558 451581187 3567411825 3093160045 +3599462060 2663634232 +1096263684 3774709343 +3509716632 3921699163 1037639189 122732001 +3706495085 3391067072 +421113951 421113935 +1720013714 3936803961 +1019707632 2959830852 +3733994182 3820388103 +625523507 3833508172 +546627244 4133128407 +189520599 1662333012 410571849 +2070843044 4077554729 +4013918232 1164045996 648005555 219826597 2571394528 +2057549637 353215015 4194764156 +1903120468 94205568 2828531112 3862656057 +1283012471 907308532 3762738985 1544860938 907308515 3654438992 +2489599424 3068011419 280753016 +1128039970 1124699298 2164470571 1007189848 1936352341 +3505005851 2498632415 +3110718611 908280753 3859348246 +3922045492 496093780 +3397290539 4029907380 +252192452 951281368 +1444673758 412600066 +2918581717 1835694299 2305573144 +3253615965 2802489716 +3888173912 747418523 2726204432 +3576548646 4094653988 587408241 2213591447 +114917348 2892256224 +2667581361 4263031718 +3039154622 382867007 +2129405829 2713423786 +534444770 129561027 +1128831816 3689738564 +3653110194 446333195 2015970099 3379989278 1542768986 1542768973 +2599338838 1857066643 +1429144071 1737219929 1615667972 +2562374020 1108403621 4059171528 +3791972803 2428239356 2400091182 2428239338 2428239357 +3355466276 1712980016 +1913723855 1609483992 +2528897031 496906540 3299164505 1035175730 884177156 +4271895473 995650231 +251722022 3297261249 3154261836 +2573871356 2115929255 +47566316 1653811841 +1899995088 3998778514 +844239123 1244717292 +3381058063 1313424782 +1490381574 2758563191 +6616434 284058213 +92218232 1875575552 +2721145698 3049222979 +1030898556 2525393960 +1303972156 2521401713 +1726793341 598668130 +3606422180 145688639 +4022082974 52600758 +1378629136 3936465250 +1520364963 4172622480 +1102323694 1910201368 2027644716 2165059477 +3711777028 1264632159 +2617111138 100841202 +3915681080 351970259 +1101023572 1856096436 +2191193204 2281015007 +2199148122 3003379645 2050116149 4230015734 +1964512685 1435454994 +2585831146 2338767451 +1629022736 3929569077 +3101547231 3829370142 +3961035637 605520742 538410253 264019948 3961035621 +3259965255 3995280475 787064960 +4176289142 1397055687 +1034851523 3704893180 3704893173 +3701478383 1056923950 +745128062 1752827487 +267314183 470873856 +2213848031 3942979391 2568878110 2474938849 3985710821 304968860 788469490 +1272903555 50314362 +3706587959 207687869 +3485060786 3323631194 3011535411 +3228095351 1543824454 +2510609167 3693147995 +1156916960 1844196019 +3070692875 723196738 +4142358676 1111296239 +407625712 2267525806 3264522459 +914058329 491491336 +3528586370 232784645 29837356 2567170229 1474357518 1457239634 2323460170 +4026016453 1961472195 +1736902332 1883104207 +4082410021 4082410037 +2569419204 2124906411 +3875465998 2974549785 +4244850886 304844705 +2682299783 899978113 +109491960 1041369197 +3201088701 424484226 +3065163363 4266165724 +551063409 2433789386 +2752597790 2718549822 +1785556454 1883504897 +120011336 1279202740 +3143398820 2525835583 3684611108 692347791 +1517655645 429717077 3290149986 +720363459 1520254954 +2332444885 1610911024 +2052746179 3572675453 +223806771 855453530 +1506309663 3339365463 +1398918270 3237276233 +1117585305 1982225864 +758403464 1365264564 +3257360410 3257360394 +4022588935 1549801235 2018110720 +42251785 4293562424 3491540077 1715252173 205584494 3995686175 205584505 +1139836449 1849811325 2180054945 2180054973 +4066715562 1060991117 +1415306806 654305302 43962119 +3268456834 814182307 +161888422 3601542465 +3138930017 3895801760 +2960122685 2960122669 +1126341153 719782228 +518308725 2430854426 110213724 +2600708882 1395374522 +4290360403 3830898362 +130213486 2781921071 +2966660552 1684035316 2694208378 623770059 +2017720866 2479923134 +2243145999 2296363662 +2731854657 195883292 +992955524 1113438352 +585668181 3751089336 1915337595 3671280014 4294222723 3269200464 +1053624879 2186382203 197593080 +116160799 2580529557 +3693888696 1370500525 +401763175 429855520 1936886867 +1860084108 343428961 +2291551943 3416130368 3384745427 637115289 1626337736 3416130390 +2215807289 573441192 +3012663924 573973647 +2487120537 3528156213 4149110472 3199921144 +604156240 1286040707 +451599089 1354148208 679209591 +3068324943 1575558354 1369054279 1218055707 +2468707677 4093638345 +4265515894 4144438556 1908951712 4185288806 +478801993 715676857 908411630 +2835488360 2411591318 +2667397484 3031301399 +3473895719 474947702 +1254300664 2837776237 +3034155533 553762879 686253298 3602630817 1961101439 1536709993 3592276324 3139340946 3592276338 2426117797 2212765723 3212071524 1224857659 +4027142570 2292944539 +2993003230 711998722 +2391340788 3889358624 +1416863333 1459771628 +4176104292 1020571263 +3505297185 2099493713 144173302 +393683401 2189994553 3112841070 +2701176151 2701176135 +825544833 4146346774 +1575555254 3237650070 2347060871 +2536025136 621219715 +292219461 2957953690 +3153568879 3153568895 +1814767833 1814767817 +2772143503 1996565978 +1745440282 1872805942 +4231636075 956519833 +1380489704 3126542060 +3449620228 3449620244 +785414430 3492719145 +3769373345 1340167030 +1822866544 293914711 +2871524160 2951775699 +845117910 3856989366 575458279 +549928332 2770661792 +2020031765 681445306 +1872433111 2075941705 +3792162344 4274169428 4199123197 +3644928903 2292456832 +3020294907 3020294891 313271231 +3089793752 3089793736 +4107677390 992718425 +3920909750 2632117649 +2674727794 2410282590 +3303006305 3303006321 +1235246424 2723957544 +2919959710 2573524137 +1066982615 4104365689 +2078065506 2078065522 +1590567379 293551930 +894928281 2490225743 +3967678601 1841462955 +3191901163 3355272719 3355272728 1788625652 2247206037 +1280432438 1524166673 +1592749436 4008270385 +904525261 1477262100 +909097808 2636373731 +3936808772 3154542556 +1033920666 3353114058 +270421471 3192401547 270421455 +2035925060 549223895 1279896351 486029532 1279896320 553140024 +2271660332 1389277271 +3522311788 4229940631 2590607153 3964382231 1126286972 +4237042182 2526646135 +2158326966 2414322326 +3460339523 2216295719 4071497340 +2052041033 1290485176 +1835874783 569514526 +2764481510 2836476945 +3256648828 249859879 +3254979920 121150891 +3280746937 4101495689 2394873406 +1538907334 1100028400 1358817989 1152947212 +2250267826 2446775387 +3748213472 2459637427 +1018877467 2770268994 1018877451 2749412319 +2439890263 3395291081 +3339833595 1544289074 +1597294483 3511617381 423721110 2548559383 805734933 2676781734 805734915 2290896502 1930833004 +2564814091 4256744504 +343892932 4048765081 +2613292691 3356217722 +1743958500 2265844223 +3175497874 769741581 1186597690 3730530193 65625014 3783050740 383856349 3831195878 367078727 1642471937 3730530182 +3348256161 3428633718 +139657279 1504273214 +2436555850 3920978029 +2853324380 381993681 +2335735911 2800812246 +1782350311 1779190757 2978436594 +2389683301 2664194796 +3188287895 3218159792 +1815531781 3709998396 +940144935 1072516434 921517875 1575598176 +2934885946 2616108381 +2129709898 3606698460 3929480151 4264424094 422268739 422268767 69938776 3139761001 +1962164060 2182598663 +504684736 450743877 +2526078540 3771115639 +3769466810 1797263819 +2100608903 1706746841 2701754774 32955524 +759888842 386555643 +4241894797 2452206834 161994981 +375721827 2755222133 +1082153132 3577631168 1175171047 1082153148 +1678245690 1004012694 +4102939283 2388372858 +3363477775 240641371 2818503320 +3993003080 4070432075 +1136149920 1136149936 +3930055468 3520012352 4002586177 +1446080431 548841473 +629144939 1937502050 +3990270727 1231993875 1878774784 +2077158557 2210298658 +4090098677 1100542264 +2591288366 2591288382 +3526578101 2613475818 +1832986564 2867544964 +3134653255 2924360818 +3519495063 3550662310 +4098993546 647245869 +4253834129 2767457280 1249031520 +1309352624 2340920067 +375241250 1416202027 +3531978818 2860584949 +184168871 4007406070 +2511847051 608270334 +2513258556 237549159 +1169396213 2930689187 +502566565 28819354 1804803036 1431972943 +1057618251 2276684034 2628702133 3011183224 +1532173323 3470075202 +2286965916 846541201 +1299076577 1810921478 +2388496957 784606157 3093030628 697042228 697042229 2607558863 1515009538 784606161 1334431307 697042210 1515009556 +3974450809 124051016 +408226483 408226467 +3893882328 631984587 900426509 3893882312 +3774306041 3218556917 +4023771324 4191593832 +3253924437 3253924421 +816606735 2867229629 877281882 +3408848962 483893237 +4121851721 2231680885 178636792 2097459935 2114237541 3328703212 2969156526 +2444891714 2407424909 2851146229 +3296067940 2765631228 +425896136 425896152 +637833385 3996929685 +3209517893 1808182682 +3972844155 1096990642 +1146763900 842746984 +991161048 2299103898 3629822491 1409626237 2315881504 2747681395 +972495897 1493252958 +1558109572 3067524831 +1623824112 2541572171 483588837 1515145970 +2651262980 3817829624 +756242121 165193868 +1320003701 3945614405 3945614425 +989009939 3752781306 +2736807449 3841204552 +2635122845 1169625730 +297273390 3787280046 313843823 +2769739089 872310416 +3343357850 1337173885 +136446267 143126514 +2979031435 2215539317 +1321987429 1879487994 1301310864 +1627362936 2558127876 +1633955835 1441484990 2205803845 3466059783 3753393255 3753393275 1270319154 +2434947092 2251791660 +1451063516 1451063500 +464133857 1842256950 +465863187 3686556006 3378037754 +4125213500 3188380785 2796592982 1315329895 +3372242207 3639715804 +2589864530 1414084357 +1944997373 2099561812 +2908508335 171781908 +1040140203 3556144970 2288992374 2526677919 +58675316 1387543950 +1239693569 1397079168 +2240781485 451652869 +2087216981 2704947809 +2737445061 4019113817 1908348936 3901670489 +2046749245 1655250229 1229635074 +3760779117 1299245188 +2343939048 3606945323 +3640819424 1898721502 1185708915 1353485068 1185708900 194962423 1873018489 2847159072 1966920108 1889796127 2129509029 +3602415922 1856164633 +2694863538 1801585243 +3413054287 996182412 1592690609 996182426 2396743000 +1089545620 62815409 +4179685397 3658904250 +88090617 1023339752 +1668006505 3953331032 +1152995690 2579179995 +3789359275 1927139925 1881149656 +2661065239 3348310576 +1049502612 1049502596 +3412681971 703195802 3412681955 +2332369520 571494425 +4034405550 992067055 +2246970062 2746942041 +4274376821 3194239514 +1694506834 3885887033 +1070910436 1610414057 +717807536 171450883 +3265807185 3219257488 +3325814936 2823759707 +123781989 39032826 +3748138431 2830672235 1875747752 +507719877 156687082 +4244585382 1582748706 +574431053 859325988 +2805439686 42716065 +1287243860 122891711 +4126346327 2465566102 1956098167 2224844006 +278427435 3332988188 +2555357546 509715798 +1068306679 4114424999 2259979438 2979886787 879867078 1431502570 1759472239 +113700758 3887907186 +1167900326 1002446657 1718703601 3748941914 +2754949535 2880772188 +2225003726 2225003742 +1260383452 524410449 +3774483406 483067165 +913652787 3985491034 +2425433073 2606621825 2240293990 +4150898548 1809725896 +1544798238 652484649 +111356601 735854910 +2730006787 731439018 +3230993688 1072364952 656441024 3029325491 3029325476 928077024 1118018765 +3102034020 1961948521 +1513697968 3882429896 +984868854 1597384785 +1342807794 2425716890 4045747955 +3024802109 247948034 +2116705350 2837297955 870213653 637312928 +2950790058 2314579085 1035264723 +3695606289 3555862736 +3199712183 1620071913 +1532465130 3034025293 +2081510348 457632289 +534711104 56112335 +4104739956 3879574247 694797076 935242203 1500370099 1030349450 2593950351 4251856607 934256429 934256442 1344643516 1131015192 771598132 +3495791974 1766168471 +1928673128 1611020477 3670752928 3872084355 +3079605544 506574333 +2959451424 3489853797 +1705341308 3545256134 +4258071261 1723564532 +4291274397 1145784610 +3054857294 1443012559 +3620407395 396243914 +800929402 2698822173 +2655981693 2751254752 +1554744349 277412372 +913858874 287932419 2202712726 287932437 287932418 122979498 4185984587 +965606032 713126051 +2679544995 4140953990 +2531168481 1991837639 1633554976 3210853848 2098637574 +2956097082 971772326 +2939859880 2315531043 +417021045 2124776972 +2840933805 1042513746 +3478062839 587277135 +771488456 732678347 +22128636 260796849 +1843631925 843516010 +2079339604 740129192 2079339588 1864523823 +1988413595 253750642 1602125243 +1063222045 941972617 3766368252 +1492045117 1022170900 +3935415474 1886435118 +1114359445 1132728650 4197780848 +1117302334 304219319 +1787194474 463252173 +2079343142 1094197719 +3206001637 222159626 +3539311695 1738870862 +1105106787 342380764 +1501196967 1629866707 +603138299 33219141 +121091658 2796811885 +2432687069 2035304472 +2854630617 576837221 2231664876 2710379454 2592936108 3005559176 +3483194492 1353449255 +3354733908 4243362996 +3075447113 3679342072 +1256176874 1256176890 +21365502 4281775561 +679548500 3275631528 389424697 +2745924917 3690338922 +1756056425 782743118 +6244581 446431242 +1471972544 3720673861 +3701424780 2904620727 +869946942 3736454025 +157787354 3804658850 2821227307 +3331075980 2503287714 674177756 2448711956 1648374711 447666551 3649282091 +1143473530 3305152285 653940742 +518187458 1630927971 +2283314589 3686800930 +2251858311 2251858327 +1401546750 3992987002 3189922181 3825210834 +978374029 1680151073 +1685324133 4120758691 +3096000278 2516694951 +707276749 709050276 +1284371409 4178352426 +2290149737 1273983054 +3697522183 4160195840 1521678084 1521678099 2514000729 +1536711346 1259995725 +1337357463 1337357447 +2813340618 3293900539 +1765094419 2982214124 +1575559851 376261242 +3571806979 674500021 +1166308949 3297134556 +3329167695 2950184782 +2739639098 1241039965 +3169723469 2895351218 3085116722 +2028884468 1395327759 +3751344135 261681497 2432633092 80638742 +798186231 3690476230 +1136270246 1746243418 1140426305 +24583479 2239954310 +1679970026 2348956237 +2283333263 2989797068 +1049302572 2700339009 +4215851504 1295785494 2879610022 +414957097 3496220141 411851416 +818928585 2687958392 +1557456386 2098529934 +3564689717 2940071548 +3861615678 2493144457 +2190909965 1278201574 +158774282 4024265645 +4112029046 4063990102 1270040775 +1993936360 3229043715 4289782827 +2535888198 4118977937 +3470072264 2376588492 +1870269081 371109598 +1547253238 203056598 605024839 +1792818098 1915273741 3642290216 2960120299 4165828576 2505122580 1244530312 2379860391 3553138473 +163324847 2016768977 3817472250 742361501 +2746461961 1086895203 3053930917 778030794 +1006410115 2878114008 +2585286605 2585286621 +2617052187 2858028676 2948913631 2948913608 351060645 +1785071524 2814723480 580781865 +292229943 292229927 +3130752205 2412082852 +3259038106 1716055403 +1706099766 1269408007 +691674788 767079576 3736745764 767079567 2323528745 +1092932920 2738677516 1160260549 +1983236739 1292106714 +3746283833 3175165118 +1738492142 3574999673 +1623837563 2428243963 +3979459970 3250235786 3880604579 +741184115 4273834778 4093384973 274850784 +901926009 434004606 +3005122042 1479783705 +2297907061 3982756109 3982756122 306543914 1148223571 +18626358 1582197015 +3657309611 4065588910 2003017353 1808839881 1196027710 2089586411 4232379362 1212805316 2190252143 2190252152 +1850113895 4294610720 +3104220006 2103683239 +1582409606 9091063 +3568111616 3650852812 3429904389 +573347066 3165990682 2412061654 3160758107 2252093909 +1754592793 2274549502 +3881668693 714897907 902999277 902999290 +3026840877 3965600411 +3233495812 1185195844 +2394597829 410142560 +3972202099 455290871 704024346 +294391989 2688497171 +2956176725 3648426476 1101510295 3059342556 +3099811566 3381555375 +2615772099 4276992049 +104083800 472493453 +1309080944 3791115272 4119157451 1157691203 +3633060254 2190234537 2732040002 +4174686410 2160440827 +3603205483 97521314 +2660364441 951959752 +1002173535 1742844289 +2817105370 784563755 +1589454003 3602957786 +1846086575 2107975931 +2329540319 2210194145 +2660015282 4089748104 +1053813578 726623611 +3284822211 4204980970 2323114672 4104704637 +348419871 2627548577 3494348254 2828507612 +2715740575 1349271841 134320220 +2112309956 2282163640 +3417829192 4203589195 +1641844502 607469479 +1250046789 996139370 +3642927867 3432196388 +2845456243 1891977754 +1285850772 1285850756 +379889685 2855567308 379889669 +723021639 511126742 +589638254 3246508847 +46875230 3287906793 +3292654707 2564847373 +1183407415 1914288080 2379426365 2154528259 1434056301 1897510474 +4274947359 4274947343 +3525923550 1999420938 +800672403 3014681964 +7019955 1537196229 +3938454181 827376058 +1520332042 2976229037 1518096697 3835044594 +1970511620 2661280107 +2787970535 2146230966 +1754002037 3504090125 156151338 +181660539 181660523 +1304341575 1304341591 2854826966 +1291890399 1328767008 3351038689 +650325756 2909427889 2909427879 2942934704 1804028076 21165735 +2653099466 1475236038 +2958845010 4084329733 +1410057062 2127361178 3283994801 +965085329 305177142 305177120 1587095639 2621386326 305177121 520059974 +2870041842 323907226 1045778675 +1357223958 1869507249 +1653992065 3003132160 2665163175 3745557926 +3380646376 493203499 +2311789487 2011017887 2078128379 +567054386 3808621531 +119581555 2876106266 +4164190864 4164190848 +3966367211 3966367227 +2561459519 2561459503 +1510692136 4102751572 +21566073 2131235944 +2211588657 3601902784 3034082096 3601902806 1412031031 +3241057324 3241057340 +222165943 1023951567 +3801706110 1739309674 +2331501488 244206364 2331501472 +4073494332 1947341671 +780504146 4215905517 +909796539 2691330942 +4121396086 749990609 +1105098700 3221639256 +2262539269 1354144716 +209343575 4220699878 +4259434435 4259434451 +3581693427 271026061 2114440055 2114440032 95335834 95335820 +447299036 3080532624 3563872593 +3667798016 1659794984 +1158473503 2888590551 +1685400354 1181935235 +377681008 840149451 +4208651409 2007132240 +3001929403 1734111346 +1951361428 2902668271 +2269212282 2658168661 1711335965 703945814 +1271553539 4062020438 +2013436109 276583986 +1650449742 719938009 +1024027364 4191372521 +2517604939 1434717048 +3804307152 1145550169 +2636156709 2134988602 +4014259786 1387122876 4080504429 2689586677 144453190 1534413733 +399182140 2082823399 +1846285484 2468769216 3909388993 +3109215183 2356152024 +1059172361 1795694126 +741321507 1650582535 +4147413263 4147413279 +4053624405 2565517744 3008894845 +3433285180 1641091175 +4198513705 3785490559 +3598927690 4205394285 +3218658574 274162969 969738619 3218658590 +1535847551 2601978878 +3140099061 2554987196 +155448414 2502498366 +751721398 2026135958 1054498695 +1132753703 1887520352 1887520374 +2814121382 4181395991 +413465476 1200622712 +1314102777 1314102761 +1026688131 3636271676 +2294895651 3781382672 +1146344373 1146344357 +812756616 3405103115 +365724811 3690243778 +335383287 1864483526 +2335403736 2336618244 +1975530163 3731103264 +3159504076 1097407777 +1809934944 1018025854 3253101311 +3135220646 3558553153 +2598795357 894278059 +1215504290 2939866133 +1474039125 2605052410 +2831481408 3994415827 +2448632740 1707979583 +14708336 3618565896 +2642425271 1822382878 +4267303739 3427473340 2726344178 +4068464482 4068464498 +2589714231 3639993358 +601623501 1080464292 +2752534223 1991260428 +231230655 171473002 +4253825168 2811747051 +2179917140 2932963564 +132390420 2149276015 604887423 +553873548 1941683377 +90931907 1262409980 1877972135 678122216 1877972144 1262409973 +1636988901 3137357597 2123545978 +133975486 1476687561 +3992260317 1302766848 +688029486 3169727865 +3373622041 590448876 765856004 +695543723 633505237 4000150050 +1172838803 1913466919 2994339708 3231998074 +3521072106 1283752269 +1916295265 3439099526 +4115026074 3429349463 +185296582 686999969 +539934451 2627115162 +1658619547 3067025480 +1362619230 956794111 3319160190 +2541222170 404720354 404720373 2346525675 +1369664336 415968171 +2513775885 3952470884 +3264132172 2550944404 2460341181 +1361068711 1556671712 +2521276208 2521276192 +4061684529 1298408998 +400832347 2969664824 4148372562 4148372548 2192709384 582289644 1617178213 +679316854 349522241 3050067380 +152341497 1146640638 +3292804777 3705539507 2287532568 +3067818944 2601678675 +1415271196 3997724675 +2762034615 3773650704 2762034599 +2210921570 3587329621 +3235376662 2850802855 624110326 +486118345 1709417848 +3359746006 2515612010 +2608179188 2922865935 3037618580 1513367135 2922865945 +3239411628 1038331565 2698509248 2698509271 +504010333 2812982388 +1682548728 1682548712 +533063077 2844295866 +2133557992 2562963436 +3016326555 2704325380 +4101654063 192707576 +2069515741 3330647595 +2582262086 1691204437 3421280141 3086713515 160075914 1257700194 1693522224 2211117487 2283116934 1691204418 1791870122 3103491121 +1381312793 3544704642 +2786016315 2624182015 2767966436 +1293085726 4068813886 4068813887 713476802 4068813865 1925821247 111454014 +1626143564 3775895735 +3081893558 3811008657 +4079198169 3088970630 746323625 1760238748 2585043614 4229187221 +1983161372 184858020 819877895 4234801471 +3212071551 3810385384 +785302762 4202804736 3698196262 58345857 +2961702124 2961702140 +2835288101 780560954 +4002067052 2860653180 +986090362 3923465301 +2485246539 3179301752 1660992181 +2508693345 3313493430 +1443801595 3791346344 +1113153699 3304871302 364060810 +2066856427 3662130402 +2829145091 2029469866 2829145107 2029469884 +2644800556 2166926388 +2936538527 681630046 +1435974623 3192771304 +1043069591 1983609776 +1948200913 3206830155 1310990792 +3453961651 588486671 3391045566 3380263130 +3959497537 1187411046 +2512376649 1441822638 +3328274543 3127115448 +2237638644 3918882063 +1184303741 16042251 +3433643272 1200611363 +2790678378 1026133014 +886167249 3297069181 3431290135 +2851091369 773935896 +3078152398 3078152414 +2123967845 1077917853 2955048442 608546211 1077917834 +4021815640 782224627 +2606704901 1392576884 +2695916328 3334277972 +505275365 824594519 +2539140378 1276777614 +103833524 1915136079 +1604719031 1887799273 +3060600809 380636110 +210523690 3941311515 +886691720 3136178973 +3615228594 3929554469 +1693770031 3542006380 +3415010451 30960506 +1888255288 1697193787 +1469757428 3700397337 +2647604091 3896156850 +3773242119 315591702 +4028837093 2375842048 3965693036 +173958187 1774819407 +3700926722 1153371701 +2110461921 4201646609 3887503158 +3280287530 4105557787 +1763665120 1550568627 +3843527395 2086869582 761138521 9503596 3084354581 393077736 1330996692 2397085493 649344572 869857631 +1159922705 2775504846 3877594831 3877594832 +3574547754 2433343757 +3581810940 293688487 +2948011495 2218228406 +3101293963 2318016980 +1351903735 1211369387 3077599822 520356382 +335576494 910696434 +504329914 962613634 207087307 +2438346382 880283101 +1342310263 1781645382 +972233643 1010555854 1010555864 2688222553 1145373141 +2135439035 1182801797 +60975017 1638477582 3411350297 +1177556047 3434084440 +2950811029 1856418160 4271570331 +1964228264 4128580203 +446896377 3888140264 +326979174 326979190 +313648734 3423446505 +1554097143 4083019362 +4083069335 3131491587 +2426733411 2612686669 +3188676209 3109966593 2737116134 +3206760423 3414831264 +466809971 1075237146 +1412926414 1412926430 +3118676416 3118676432 +2899085827 150815420 +2945870002 466014245 +3069344164 1959734557 3419755192 1651102270 3410689353 4047176926 1292153889 142159931 2045326781 1230953312 533832254 2936493086 +123603442 2332665843 +414973567 3561380535 +4018897287 3288362643 2946302118 3111521835 3375820425 3111521847 3288362628 4018897303 +3248307839 1148275136 1233740286 1233740264 +2699486633 3849893404 3590326769 4101736728 +2510541577 1842730770 +172965794 2266515627 +770844280 770844264 +4074064633 1053099496 +1253708135 2280054377 3097779864 3629525545 2471650690 166290742 3075055615 2840168937 3278520210 +3386169774 1762579522 +3806742830 1585787769 +3943847637 3806245212 +3061543471 1613034727 +3713002788 1731372029 2844771111 1748149635 2844771120 2442461308 +210740044 4236647141 2744915728 3846941312 303960247 +1411450229 3841693482 +1898602490 531961483 +3742020531 3503874778 +1076057411 3299207974 +148630905 2154590026 +2585935093 1447267754 +69467669 1912332595 1929110217 4009963706 +2181124824 3226403482 +3483656180 3552775449 +1025822278 2750545553 +2848700130 2170894326 +1424334446 1540290610 +2265307625 2270459839 +2890755441 2890755425 +3546171511 611056182 3546171495 +3366599471 1970990721 4284798545 3647251564 +96712169 4229389784 +2895286908 649894183 +1139143363 3053273658 1233618087 1139143379 +3907647676 779461612 +646650095 2616737848 3217889339 +402809926 600487482 +865576423 3942875622 906592761 1040813715 3240294426 4279310820 923370399 1123693406 515517110 +2084382966 2319940423 +1499177694 2302763903 1276941570 2431623401 +3203283103 805511774 +2022150713 2830903326 +334497566 403914558 1893407513 334497550 +386346857 2840568391 +1998082417 3685434881 3964155120 +1240993210 729652189 +1770117010 2842057413 +671869764 1913586540 1321425951 +3988309615 3784920730 +333716526 2028517742 4015620782 4015620783 4015620793 2115525743 3167424370 +1102075598 915973721 1102075614 +697152123 1008916286 +3450764282 3282905757 +1970933155 4022626435 +1299826824 2125901332 +4129702436 2721717929 +3714490303 856879363 +4101860223 1617967358 +3462091892 1304818319 +1622362832 2613879803 +2968992103 4230962464 +2341245313 793316886 2248223910 +3209050144 998922867 +3694127209 2386190798 3922343743 141221208 1213528126 +450314375 3436013635 1864124873 775841380 2768403088 4287877822 1340446942 4209510128 1186861097 3136900038 2823637060 1016226850 2503451105 1901586528 43559253 1104785298 2786887117 1805232574 732506346 3644422098 3278842386 1117006501 407174889 1180306811 2574343887 +2435980 3330510177 +2665335696 3167135113 2804380585 +200768703 1054722691 948293943 2183695683 84410599 2694139777 1798312780 397676205 870491381 3632817136 4206793285 1176425365 3067481608 2637593931 264974602 1764011267 2569979876 3563677774 3380023325 +2395119091 2650708854 +3257708895 439550887 +1483589248 3033496467 +350359299 3739589351 3806175676 +1569241370 1480287211 +4142657343 4100562984 +1563188715 1563188731 +2654896723 1869031610 +4101308335 4197727468 +1721144266 4140096805 +1931095291 758435629 +2446954430 2446954414 +1551282869 1138447100 +2351824723 3775405729 +4076485532 1375054267 +552283925 2913206276 1563166303 +2578021087 2345963233 +2512337561 2945311893 +2319344333 375001527 2826661718 +1359991024 2347100629 +974004568 3158211981 +2030237777 3500992400 +4184982957 3224929390 1528442706 +712315384 2157666944 +837687243 1184138488 +505811551 3572427678 +1070956595 2954416218 +3177983227 3177983211 +2797184761 581577438 +347361016 2413318267 +66245080 255874829 +896150547 690184698 +697254113 2907365510 +3965341947 3561502081 3734557548 221084466 +3103962674 1900335283 +876760061 1096654658 +1978343271 3996446564 +2885104002 150947991 +2366181771 2366181787 +2897236170 3897788510 +964826891 2462729794 +2683607978 3895208294 2648102930 2014383259 +4109496323 2614940860 +3148543074 1369289526 1704841906 994767247 563956603 +1912245057 1450241717 552375938 2926131008 356944233 +1820368195 293048426 +294513408 3506117538 +589630015 2454659390 +3416512393 468470968 +2065143684 1243841759 1243841737 +594234157 3895410578 +1906276828 3121403207 +3665829533 2494574882 +3356452386 306038677 306038659 977343293 +3684605574 3837825237 +2431018451 3987884858 +308833431 3189959477 1948617421 3773172842 2395109378 2587936649 2439180720 2395109379 2395109396 +1258408534 1258408518 +2432623604 893442319 +3611381661 451249169 +3571068546 2253575497 4188738942 +230099018 1507187782 +2226264637 2332544309 +1676683563 2115030717 +2433310274 2034702410 +2918214406 2918214422 +1214167338 4074982886 +1207941750 1701217866 +1229068074 1229068090 +3808363769 2783557832 1120945519 2631749038 4142785227 +2720901148 3155117777 +1611390026 3178011045 +996233967 3612271148 +3838906621 651330036 3313512587 +984675729 4120023888 +1159338059 484292984 +1231441793 219097088 +3333532814 1471325071 +3371059275 2915395960 2585513474 1725654777 +2021543289 668202344 +2061260003 2966041067 434002182 1570392645 220086532 4121109010 +3337801953 289329718 +2239850336 2165780012 +1371452055 2505804143 847326740 +4097416391 1035062592 +2131403281 247275728 +704925508 734676402 2624302926 3396898589 18017403 +3480694937 832667870 +4155306570 3740966821 +1875009332 586931929 +2815591919 2815591935 +2612706857 2775324287 1938394521 1737083371 1341741710 +2799088997 150965754 +1840002579 846809867 2146509378 +3016870235 3535206664 1849686610 +1068306665 4291208319 644980430 +857944536 937453939 +1235803141 4191312844 +4264582692 4264582708 +2568114388 2578459176 3419749817 +3850662412 4140076308 +3392562895 581162958 +1812474074 3539726774 3716456629 +169877025 2596936272 +2290273687 1406026004 2095686822 +482396139 779794164 +1345356710 1345356726 +3869140912 3143449091 +2525677578 3205807411 +1846569687 181933910 1846569671 +1066380280 120305531 +3726954485 2834521770 +1645531684 903297343 3075427748 2328284863 536302607 +660199215 560840430 +1731928052 1980976399 +3627965464 2863082192 +3694875173 3596767276 +3462280288 1045197619 +2059761564 3772467857 +695303670 866732625 +2601889995 3995422612 +3254020338 3917361886 3257293466 3257293453 1170289907 +3886284854 3468273944 +3500471331 1296487687 2527875868 +3340581727 3709363164 90925653 +3182045678 2162164143 +3234837664 1881717753 +3768335969 2073154705 4143329974 +3359677353 3870624526 3870624536 +3743882418 3441136717 +1061518655 2691860171 2305974935 +1674229936 664488456 4196993625 +4263723750 1322635034 +2953924478 2839552863 +1393994699 1589721326 +3912596878 2905908879 +2859902361 4056330184 +2004714575 1771522126 +3547529933 2869782692 +3038921455 334454318 +646413674 1536003238 +2410676140 1398788288 3725556673 +1758169726 1986724959 +1772004366 1388069391 +2237540002 2503397635 +2241344528 2255795432 +2884583656 2443390269 +1745498071 2668187494 +4118912213 989028631 1234226541 1342825290 +1378110965 1143388348 +4126189268 4258701231 +1241148029 409946697 +2992440520 2423162571 +618839391 505055841 1878006942 3301430944 3204246044 +3455978189 1312407334 217192485 334168242 +4177441674 2197070386 +1550809629 2831577433 3726341764 +1414332816 2522114695 622685755 910036239 2993967672 +4268591981 4084366482 +1273467724 3922042231 +1896026524 1896026508 +1532498421 1131081528 2742488568 +3877124035 3087520176 +3052465813 1739511098 +1290970275 1351613725 +716832715 1321643247 4079776523 3656981058 231582868 1321643256 2496411445 +3787377898 3619523411 +1779823489 151936688 +3764314295 611277108 +1570313324 3288016407 +3197266988 746604887 +2940929314 4281570857 3846703000 3313196318 +322968192 3454646163 +558827754 511584069 2945313574 +2936839197 3152785978 +3589315406 398752729 +3948324314 1984423330 3948324298 1399264811 +602277116 2132400305 +2969384020 4070137903 +445609540 332868895 +1477673684 2058810297 +1017844837 2343401373 3864075002 +3951973018 1795950699 +4239041798 665752401 3332491383 665752390 +3017144299 81086196 +391108340 2132241737 +1310593101 3887290788 +3813279477 1601631904 3263755196 +2231258779 3602317559 1543117324 3927338273 +3699532284 490749863 +2268649275 5794302 +2164716542 3709675294 +693056712 3484423883 +3052503239 1039835091 +3158914072 1934933998 2255106924 1596257105 3061543471 +2291148130 2360609481 +3195086904 69357613 2625939264 2936288979 69357627 +2969741428 1682332383 +3366528862 836761983 +2573803990 298839508 1451246567 +2988272617 863385925 +1456089034 1782358765 +209700101 1938915158 +2920597809 1001961520 +1233982260 4246026960 +3462222770 848177561 +1806389295 2913942008 +1650922528 138718835 +2508410611 1354057868 +2076769843 275262042 +2513260269 4171189208 3293914587 262949202 4013233646 413947800 3843384395 3207806724 +2518714925 3599506670 +1325235826 438250509 +1661013690 2494181067 +2597618818 1049401525 +3023552797 1210056450 +102887360 413983720 +626528484 921928377 +1068001493 1612075644 +1362852258 2191555075 +1575559848 2114031211 +1783575375 2846737752 +576675968 2619664773 +3145445468 2142675143 3224217040 2085310412 456218357 +3527782762 2610321005 +4064299317 2419277436 +1913801189 2009748339 +729235763 2679874394 +3573186919 1216536479 +2821274235 870780836 +3525803277 3777616740 +2672776131 3254406576 +3748938190 2449708889 +2923356048 4162832656 2887311247 2852750388 +2481484118 753560177 +4231545035 2721858101 +1041795850 3110585957 2907925126 3399671981 +698237751 694140835 698237735 +368409934 3748938201 +3836207486 1179488415 +4214306277 533429933 3752342794 +2180095398 1434897649 +3582623822 814732239 +54411079 2681486636 +1866748919 529542598 +1808809666 3168152778 3235263273 3168152797 1808809682 +3368247757 3633509810 +204057094 561879970 +823224355 1642771955 2440481389 1896507664 +3007597867 320874840 +3680998969 2366726808 3680998953 +2731839761 3245579958 3305940439 1705008592 +2967521484 2189135607 +1893262791 1813043775 +3902398385 3678086064 +1534728378 3140807901 +3267517038 888976646 888976666 412161888 3404598322 99900217 2393606905 +3169727846 4208614042 2532477606 3506311041 3506311063 +1596327901 2782814452 +2717279607 1843509840 +2453210916 2316505359 +3864344196 3936081348 +4238260837 316632314 +3034647157 860059196 +2793924421 2793924437 +966158438 231102593 +1075452094 2803168031 +2622447844 2273534169 +1091471995 4142624575 +3193472610 123440213 +354611690 4017272914 805491547 +1991766555 1991766539 +1307292456 2757595989 2757595971 +3491840147 3491840131 +2718137905 1014998822 +4053187073 860601147 +2019494993 2304838694 +198683436 3498210881 +257192943 601680705 3854658362 3917204573 3854658363 257192959 3854658348 +907575442 3130156499 1284768603 2167809151 3130156485 +243695110 3820512119 +877148689 2781451099 2535983183 +884901089 892498518 3761880849 2263974855 3907726880 3907726902 3761880838 +934085699 4123441173 4241738012 1082435382 1199878704 861878517 2858203731 3134400282 264691965 3571618981 3898455402 799414598 2872955965 3571618995 4224106875 +883544902 3043706133 +646060884 4073784633 +1244500946 2545922949 +3686729743 4240027534 +3098584610 3759507331 +2780345330 1181821918 +2185628743 1531270080 +1582321675 2205024578 +1024093951 4044173675 +1969345729 2315381727 +2396144373 814483230 +359009223 151365888 +2275127601 2962850740 +795893077 48426204 +1461767975 979833712 +3199225826 1697018602 +3476217041 4262567174 +1451690410 676461633 +451008012 398097975 +774565655 2830827138 543073973 +1976104139 3765965921 1746016938 911825794 +754458041 1616927042 +3574053304 321477819 +271088638 1840984265 +1213001389 3618000645 27474495 2496562679 2115746386 342812959 3018874503 3819332089 1658902402 1475099368 +2557488864 3338313688 +703409047 703409031 +1450825473 583890560 +2079609861 2823475261 +3293867424 2968031987 +2062561987 1260382442 1528824378 1060881575 1935947053 1260382460 1060881584 2062562003 +2138264603 3180160658 +1041177651 3838403674 +4102985247 54808796 +715192811 715192827 +1699527447 4174359188 +921983280 1508577883 2115488696 +2433759198 423118173 2321980785 1322830737 1063365178 +236940312 1400318413 +3008191637 322424407 2831342595 +3579380843 3579380859 +1026716830 3505695059 3522472681 +3620291042 2008397053 +758595758 758595774 +886736873 2068671724 1865988709 +4187681977 2016653498 +1492846 2447110713 +3649514481 3292783744 317367671 +566166391 2186682930 +3704035676 3916229585 1198995984 +2008600544 1475296677 +3120460971 1989257524 +3819802023 288751072 4160661427 +3868093985 322395616 +1107218640 3022174051 +2425081335 778907312 +4079704279 4224441923 2755451504 +4175340618 411340870 +2804673660 2787460903 +2573808105 1639351012 1771672024 1771672015 +344360864 1544546427 +1966166487 1403245932 +2139272420 3583562968 2932005903 3650673435 2139272436 +2804578504 1888148375 +3042188446 660541609 3899818471 3699998396 +3578296504 1253129043 +3797402615 1193901520 3797402599 +2941118996 3517613439 +1368120428 3408657943 +4252912109 4207829010 +3453961649 1427456183 3039560308 3039560292 3346707888 +88047789 347615492 +3440181061 388766503 +391545204 391545188 +807718411 2321532207 3572521812 +1660626808 1230971372 1230971387 +178599350 2014547345 +1705597740 2806079123 3605517524 +695323154 1344346707 +1399119348 1399119332 +1603924635 349968767 +3221931070 2398285215 +1196483021 290682276 +2065767468 3769354925 +3872398519 278737936 +1581036269 1534653817 +228419865 698886164 +2946926625 2754104310 1634702417 1735368102 929496312 1185963341 783300487 2493702180 2058693697 1634702406 800078109 +3124726745 185149064 +2414598717 3444084244 +368345622 3564363511 2783496359 1993632169 3564363489 4252099114 2783496369 +3426827527 1739288585 +2422567038 724776862 +3970317388 3585141687 2101026588 109244023 109244000 +2888217994 2330970157 +2783593529 1758029224 +887556117 4021575740 272341310 272341289 4038353346 1362211391 +1907860817 1427717776 +3880866922 74063570 +2566921988 3744519007 +612433222 3576120710 3171857719 +249619788 1461469025 +1268607820 1422911671 +4048081154 2507974923 +616375934 1136885561 +1036776057 3238966376 +1606551559 2983240025 +1556898776 3968902417 +3364593200 63222520 +841673663 3096518056 +830605951 1857455592 827640875 +1022600176 3817542357 149857611 +2843065867 3203544376 1472129189 3203544367 2843065883 +2078576064 1168706424 +4113132809 2063991058 +317426392 2697695771 +905776134 3180384849 +2778001577 1288057307 3742975000 +1272982809 2330394184 3953244567 10642156 +2325107181 901086936 1200391237 396556292 396556306 3125937883 1351389848 +76502182 2530030594 3545423654 4089657623 3550626113 862470746 2137840625 +1998716214 319332118 3229719559 +3749750589 1391567412 +1734382847 3154808190 +2532814508 3610023872 1407711425 +4271513777 3661968283 +3799233754 2704855408 1049701445 590287033 3428389617 997306788 +1781085668 697425032 1868414425 1971832548 1868414415 48223721 1868414424 +1905343460 2879473663 +1995095687 3129601664 +179908706 1132931651 2428995434 557314222 +37917192 2529944221 +2476469986 2476470002 +89821653 1270851216 549997309 815446447 340739121 +690245729 938817169 +2211242463 61345989 +2415998770 2083615437 +3120527812 2435624863 +1190178126 2645750738 +3966963307 2667405333 2753540706 3370848349 2753540724 3521506456 +2267122774 1581344928 3893858681 956390071 +19089318 83055287 1888078401 1888078422 +2503327183 1214517501 1931290 +1579033283 3527299197 +1482363736 1093920794 3199623421 3762480868 1868526477 +1079602779 1079602763 +3310146671 116550318 +3317063991 1964706192 +1065476331 1012486063 +2852393762 1630838510 3691907115 2501303202 +316081442 2568231071 +1882335623 721878069 +960440396 699644512 1785491361 +3684226239 3684226223 +714274897 3249147152 +1948670651 2472596594 +3917477926 3128140737 +2111987165 1137995487 +1725644108 924942007 +4126346311 78774134 1614738455 1956402134 +1486974639 1661859526 +895741066 3536436630 1254280388 2542186769 +3434835598 1101794329 +3516458127 2192559384 +111753223 2717779781 3576252690 2482893151 1578873177 3576252691 2204316416 3576252676 +527560331 3011451310 190481620 +933859544 1358114336 +2330812318 1370326441 +1111634668 608392727 +4029279025 1745597917 +4154597195 1055213020 +1438503003 1422851922 +451165191 1548386070 +2517484280 3491380608 +2051083979 1063930260 +282993191 1964026463 2822517662 1947248825 3501232164 +1105348310 2369094375 +3904237831 311111744 +1577943115 826503102 +3496289554 1341125227 +2947573145 732950494 +1878392951 3074603846 +2571916192 2892534893 +3267625651 25633382 +1629439042 641233891 +804675996 46817923 +2450652290 4062270142 +378223218 4012704115 +80432592 1544257123 +1399219650 473057669 2516724682 1399219666 +1092395250 2046196225 +3904018069 3861056668 +1720393078 3808387281 +1468541383 2398506414 +1156572377 1587888542 +3163286909 1296489428 +3110163261 437268002 +1397554275 2749554970 +1694480236 2940834172 +2115255809 414061789 3492561763 1881701688 +1395963069 3103294868 +2911720814 2742910009 +474448379 474448363 +3704145087 1326299326 +78085943 2326610822 +1175716727 3363927120 +4148030698 2116135749 +4173769856 549555589 +283984697 3732984488 +3448241986 3474380003 +3736348364 3304660193 +601073074 29462225 +854592852 2212821807 +563994548 2676435023 +3767751306 1943445537 +1129572840 1129572856 +3735378196 3920929324 3742015189 1904995021 3379368651 3964110398 +3497877289 1583140248 +3707205122 3300939293 3683566901 2447718030 +1116587379 942527514 1676791121 2082787062 +3688415409 1414105555 +957803339 1377715311 705980180 +1867430919 1867430935 +306376555 710862178 +1872607686 2068542135 +722783247 3770497934 +2185945129 2238450815 +3477235840 3314188677 +2237214811 2237214795 +241706799 3468849260 3707088632 1108146769 3707088622 +2313462128 1804967644 2313462112 3475483480 1804967627 +1314432412 4052530311 +497831223 3980234128 +288082654 2718977282 +2750174268 1770725351 +1249980493 2613547745 3919280562 +1658597180 808453155 641756173 618988416 2356424172 1715559727 +2908729837 1139074130 +1240159899 2614369810 788688539 +3648770723 3152705309 +1383383903 751799937 +1351961633 4228306934 +3725074704 2549487442 +1617367300 3326069065 3326069087 +33128087 399956482 +1495874822 2617961297 2617961286 2688185978 1642795127 +4249879499 2415261844 +3673134856 1565444660 2938814877 +3052697314 2561700331 +3238652282 1553632011 +4260340446 125195578 125195565 3138524298 +1618343452 3783954199 +2334977804 599543777 +1655869913 4050731177 941332638 +509112845 3527117426 +1972298958 1972298974 +3564147223 2218129958 +3644730524 2564831623 +3179886620 2063815697 +447197373 3002808724 +2650017927 72468637 +1750129438 1430843455 +652356515 1205180551 3641356700 +1207817311 1207817295 +1832597282 372755075 +3741777602 1703970510 +909507602 1761333317 +2815056329 3968554872 +1481925988 1893440617 +1692558382 211578760 +3223015432 2758257460 +179048766 182396041 +636330104 1174236060 +3810515319 35870278 +194922383 4129519578 +2017117404 545515079 +3250475560 3297000236 +4284802402 2098526126 1842682197 +611211191 280237318 +1630643082 2875233930 +2538057151 3736155744 3839263649 +2995651652 1502656287 +4139510061 999034244 +1958960095 3332826703 +1578512988 552721915 535944293 2029078215 3619713586 3462505028 666005791 666005768 +777328820 1964303624 +865351717 3017187676 +1853836745 1379467149 1910158894 +1288654857 4082826798 +450967405 3179954308 +1511596867 3717366550 +2747030219 2357390740 +971354175 3775558833 1922206111 3406451201 1670673192 3937486827 3937486844 +2212195164 2212195148 +2973792096 1752951859 +1212296558 774734895 +3922749216 856840051 +2608335423 4244119870 +3861407941 2733939879 3590988455 4096808108 3003831036 +3401579094 3282230506 1672917302 2184648039 +4218512508 1333866289 +1573502273 3211894374 +802915078 1552892513 +2918301510 1960499079 +2400021309 3699542045 +1793446516 3150597263 +3256671715 1987136586 +2258043522 2032531101 +2709679300 72431775 +903567048 1286384607 2077387713 +1392154927 3624499762 3481216238 1223384229 3481216249 3481216248 +1465025722 820441309 +1104691817 86525336 +474351032 1474433092 976945325 1474433107 1417183059 976945339 4056026048 +3806368954 3783925963 +3944023622 1478025249 +2780737385 1412309592 +415418050 1361048778 3164529507 +4066628410 1024410114 +641727663 3854223214 +2165440326 381558586 +209741029 2468271226 +3399663147 2261511349 691101090 3399663163 2261511330 959543026 2293660700 1397055495 2521914756 691101108 1348988302 775308753 1534877826 2360771151 1827804395 2360771150 2602777803 +4228516826 2647697469 +196065132 3516776193 +2733942671 2013351074 3679298298 674724626 +1393569788 3195767207 +2916441560 3421271411 +607976884 2656293384 3221447257 +1514834405 3042609228 +3710737639 98249619 +893659069 2538245762 +2997452501 2997452485 +2260757921 3253507168 +1276107284 1771435391 3505671545 +330543593 330543609 +3843527415 2813165872 228114091 +3353435293 2315112546 1642543211 1824978462 1674299010 1153747764 +973012829 386074434 1105340075 +1948009083 1132242866 +2953378689 2609686182 +227435810 3994068206 +1592719161 2871996094 +2202873572 2525024489 +1321629919 3782231816 +2921804394 2444516557 +4045100801 1316977972 2322649352 3343760842 1434421304 3444426585 3667103955 1451198926 3485691963 4022048355 3266260529 3343760861 +2481070427 861606152 +549581750 264972454 3458054551 +3045411992 3232022223 +3125652904 4031274859 +896719467 1107859608 +3050509605 1615481132 567395015 3471918666 3990464627 3421421815 1615481146 2746964492 3471918685 3471918684 2244465379 +3690828385 2693089424 +2164962089 1289226648 +4039403486 583691753 +2768673197 2768673213 +675146299 2490874596 +3623826882 1321051086 3368132725 +372128786 1942908222 +3037026316 57252577 +3042733105 2977845552 2413412054 3486595127 +81652413 1208302539 +1482063847 3107750898 2353247717 +618090579 3511205241 438185135 +2282916570 254842173 +3965404996 3965405012 +1453553171 1985142764 +2464084816 2954437929 +2198113862 2198113878 +518761499 583228059 +1469221169 972207927 +2559390801 2001296272 2085587919 +339861372 1605554215 +4131090483 3532759109 +206894847 1757467496 +1904751041 2989767580 +870864462 3028796505 +2548153002 3260602770 +3853840074 1595440444 414730101 +3313251516 155277154 3964878507 128377444 2659648487 +181800958 1315414793 2953309538 217787593 +1947095979 2048250830 +1748395962 1748395946 +3951735315 3951735299 +1642207782 1022306753 +4270616449 251619773 1041451551 1488925786 +3808885339 3940684319 3204193604 +3573918490 1620508470 +731245836 2835622377 +1007938636 1080041056 2899090331 2490216220 1080041079 3893513048 +964642304 2203791877 +1782715345 386216464 +2119415896 2119415880 +1510969600 1510969616 +1893839548 822304356 +3196138668 2439375575 +3662065305 4079604380 +2148728622 1191522671 +910874208 2739846231 3768300859 3887774690 2032685125 1764243211 3835411336 +4082749500 4082749484 +2395442219 4011960226 +2864782381 4059822226 +2308111054 1616958041 +3401566413 2297759282 +3590297440 129556013 +864844478 966318314 +3515121110 1277682538 +1403782113 3226646727 3156792838 2563382070 +3213875615 779326814 +1700031188 2255494589 3385445501 355521599 +1744883027 903837764 205732282 1380513965 4191406528 +1683837678 3974728889 +3871069505 1464788948 +2828080151 1935843366 +557642794 3551537857 4283649472 +955420667 2001732933 +2562314103 3816921158 +2016618980 478867967 3222160100 3619344847 +1485123667 2896892602 +2926021363 2147466394 +4039118584 1434091904 +3009475502 262118137 +3261611816 3261611832 +1198067806 3362046953 +285500365 1649468283 +3060351975 3361138660 246801590 +4115146079 2140329108 +680900442 1034920637 +3726423505 1748115136 2016557062 3726423489 +915601345 81501424 +3966658264 2208125679 1037842411 164357636 1716765480 3080856065 1037842428 3097633687 +2938225713 153747511 3183138496 1830817875 +3676905456 4194547854 1576434447 +1190157329 3784825706 +1774487353 2440996104 +2484530152 404060027 +159877211 1532733252 +3783861159 4102766727 +2617830609 1930218768 +1668947238 3796244593 +1608766554 1302809003 +1704369401 1375273188 1704369385 +193453780 2912118825 +2303913996 965731041 +3732513509 3732513525 +3266804940 2371052256 1389983009 +2418395642 2782309078 3242247907 3467966165 +2600399789 3648421016 2600399805 +1797231147 3588515225 +3619080302 45974841 +3266148927 3054989601 +3659052703 4092034142 +2436678927 2436678943 +1133749632 3782051987 +218069397 187458972 +3559826689 1528901337 +3363316456 3363316472 +1201481023 4217479742 +3555963818 4189064092 +1098240022 2782124230 3886603511 +3154083055 3794906158 +2833750730 2929241069 +3403910831 3606862144 2612997159 4081550012 673678580 3412810339 3206964744 656707110 4281453261 1153823203 683137672 2099585020 1400979335 669324908 3083280529 +3276113344 644975955 +2952458215 4010256544 +1903619570 2419626981 +1206526647 251981098 1113152803 3041909526 +3887898618 3354384002 +656694978 1614883701 +3663826915 3848025808 3848025799 2861924956 705472733 +73219036 3133487953 +1845811778 3897263301 4117382546 +423066495 2493130026 +1476228465 2496596502 +868368970 1339586017 +2484946654 2436265525 1082368258 +3079977987 35911868 +1606761760 2252823020 +451725207 4246294401 +2753290504 1608728477 +936120179 1442130144 +19229413 3001501292 +735436719 2067509228 1812906094 2185710437 518134325 2235285423 2067509243 2415914648 2818577506 3329376271 2399137026 +2794525828 3059696547 +481028154 1553896267 +1075126719 4080915836 +3659720144 888129123 +3840490853 3224085996 +2322542529 2086858709 +2012474422 184342791 +1141065035 2849772469 +635236010 1154200987 +2865808250 1266023805 +1633314759 1477926596 +1903954904 2118559003 +2367544791 4244912486 +2175935027 1343770120 +3395391559 1683115033 +2647685138 2167211077 +1304341594 1479806990 1930137634 3173601707 1930137653 3123322102 1779139103 3173601725 +1802618502 3226620113 +4126579706 3111065794 3111065813 +3221275451 1758475774 2083739122 +892920875 510138456 +2925289772 4204825788 +893845821 3157298229 197581252 893845805 +411508605 1013412981 +1909627184 1954194121 +1634144915 205959447 3896655212 +651291352 1907593329 +92717762 1965332323 +3843819985 741734276 +2547514217 1912653390 +3939059137 3939059153 +4013939126 1468250503 1264390038 +3674879164 3587803460 +252016295 2492348926 +750924210 4087759646 +245613984 2882542309 1570395771 1570395756 2976174032 1795164696 688756497 +895450734 1564561896 3158789881 +448319709 1053755179 +2212409242 831418219 +1594966430 1177177001 382883650 865418665 +1052648542 2601369193 3112502658 +1827585254 1641242135 +2896657060 1873154089 +223977545 1293374200 +1403034739 1810871959 +1620481300 1995872841 554479215 554479224 419468213 +1368511018 2458769435 +240469059 17232422 3287232961 +1051236113 1951561715 +809302846 503277945 70949389 138059870 809302830 +3680156482 2446641379 +3115361396 3115361380 +988556930 1137522339 +1549410106 2615093341 2873912853 +2681506913 4237884576 +242858180 242858196 +754393994 1393357371 +1540221048 3399334400 +777900948 2444497392 +2088387222 2323042865 +79813682 3623781524 3462209158 395450813 3361543462 2343214846 1654066401 378673191 +1848572406 1777565255 +908659372 279210379 2443129144 262432757 2443129135 3775315796 +2463955459 886936252 +4128781450 4061836589 +1414989614 660565466 +3875999137 3595555847 +3244274888 184057332 +1128803160 1117535131 +3840321204 3497272072 186150233 +2714616572 419363504 1458994642 1464405169 2923518383 3074516955 4292882030 3001676465 3575424172 1464405168 1464405159 +1062963781 1062963797 +3572275999 1333277121 +1721936237 2740585311 +3880313010 3384391717 +173667088 2160373435 1809473464 +594698348 957205015 +566489959 2390240033 2390240054 +4226739719 1668586525 528286183 +3323540174 1093143118 2813000271 +1059847204 2520640703 +38331973 3720511116 +2120725984 3712176044 +712878431 1121034398 +732419860 3442971769 +3936392643 499892714 +3756369390 1686386095 3473907224 +3248465169 3746617808 3746617798 +2416885816 4281899052 +1510314674 580254285 2033626654 3190443718 3257554197 1757802021 +1737548636 4068414481 3473708752 +3658302007 3658301991 +3494361523 2269915172 +1232570816 3106738871 1731057996 +2462303524 774854591 +2045362061 4150027024 +82567402 3905077074 2840793179 3109235101 82567418 +3684344942 3389635122 1722148079 2250728494 +424591379 3925368314 +1082191310 1492540249 +1968999055 4218813189 +777264377 3882458110 +868745934 1373399641 +195517765 2641875852 +190985166 1661000530 +2426144191 1688013736 188307836 +2728250877 4218111316 +948145057 3804301837 +2476699844 2464703644 1788191998 2125112239 1804969604 117291469 3348282313 2125112248 670991497 +4054886402 3934902282 236772494 2065201955 219994872 3934902301 +616141664 2092994904 +3039970592 1579340147 +117809098 3356018995 +3325569955 3226700707 +2656492178 3568964549 +165911112 388841968 +1085929998 2957677249 +195670914 3727005091 +1196707941 229579222 +1001812450 1765187886 +2114081075 2426786636 +3302995450 3861608605 +3052880205 1663201970 2852441440 3241921587 3241921572 +2133941127 3249739158 +1629426149 2417306299 757905432 1507069170 3925758925 3705773886 3932479229 1620890778 1338015469 1109191231 1694418547 2429440076 4145664400 1846710061 1166197288 1879510114 2505766564 590174717 4259427886 1335692488 3980159568 1013062008 2337271304 268684426 +3443561917 3651909780 +3929330714 3035844565 3408520418 +340922769 1605641380 +2860729512 346362987 +1944570687 3966524156 +1186049405 3333692372 +3683201925 3683201941 +919907287 919907271 +2202447465 2095945678 2095945689 2622713327 2202447481 +1458154853 1447311517 +3238844350 2771886111 +2591653890 4277936888 3640954771 +277949072 3019054315 +618454149 3631541843 +2391536198 2890818615 +1519158979 1312302314 +3108240316 1062327152 1644513521 +1134580682 1063511803 +1765094400 2663439365 +3498678910 168587678 +3873424721 3361328651 3916598496 1599325363 4217222295 3916598518 3082692744 +3564384367 1486535611 +3627835177 1761659327 +1196750196 3200148879 +4130153086 118312031 +4184108182 521590497 790032433 790032423 4184108166 +1254450229 1579242458 +219097119 2039755467 2916886728 +412472584 412472600 +816444072 379585242 2930334244 3328632253 834809168 3459340198 1133051499 2990725317 +3049329767 1831094439 +556154706 3387918914 +3830335742 1698490313 +2667471266 3967005205 +418630378 3162030374 3625455297 3112548690 3112548677 +3930730820 382438943 +1192509698 1613229122 +91100162 2387181347 +2347875812 3798824889 +3086517242 2520236701 +1320525446 4162183813 +4185839197 1021851221 +208766322 146084453 +2594031191 3177134822 +2670467577 2339169022 +3674416548 4102198168 329143309 3674416564 +873866315 2207303831 +1257777575 2880016864 +1362920839 3614696921 +1766991528 1951586941 +584468022 2004388331 223381265 4173629877 +2125369150 2102940766 +1662390034 1662390018 +3302832472 3015736563 +4168023390 4168023374 +1888074718 281813767 3357075458 +2605874831 927205068 +1283156680 776542411 +3751083523 3751083539 +4115280421 1221390394 +567999644 1485414216 +1493537060 1203993513 +1247378178 215786549 +2177411852 1524974583 1111609692 4159298359 +1526666972 3057464209 +807784491 4136022946 +3404027620 1258801407 +1879380237 1694095204 +1864680932 3672344041 +1205460336 2348259139 +3993855343 1169389754 +44584422 368118509 +2115630030 1356516678 1356516687 1356516697 2389779745 +3724699077 3078759404 +975873980 1294339313 +565503971 4073261642 +1134918920 2240009099 +840380223 1266966251 +703190315 639275700 +1153853713 1431791056 +2378253527 2471398967 1626863762 +1246756915 787501132 +3078809117 1581343599 308216043 +1431968158 2657473983 +178339939 517495772 +2490108283 2490108267 +2588553425 3016415504 +3454083090 849557822 +349405589 2307374810 1923817517 1923817530 1576336796 861530035 +318041317 3163614330 +1350322779 3955416338 +2743987387 2267314217 +98551180 1560590775 +913411476 1220665337 +803901705 2000834862 +847383552 3574529789 3457086412 2193155077 2536288857 2193155076 2193155091 +2340644638 3185267753 +1531318198 1699396487 +1139553962 2530872731 +3722827116 2594787103 +3162845315 2714065008 +146591005 3728139426 +2483058811 2008918450 +285719901 285719885 +378757855 1761912094 +2379504514 1605990283 +135242165 3722677580 +2593080591 758422383 +3576377629 3911065521 +2432238704 3424662415 +2037605598 245877097 +3105121007 1243070008 +1696581722 2332583357 +2452298932 1841596703 +1832507060 2785869135 +669908112 1805948579 +1858303688 1316475756 1316475760 +3141639481 2017959983 +4158250993 100120726 +1161178774 4016595567 +2673131993 579312643 +3331487924 1284768591 +1137659886 2432382525 2499492985 4135592622 2499492975 2908410809 979531954 2348494411 +3635962635 4146417063 703192060 3350812849 +4196518381 1878433921 2598165194 2955993106 1861270597 +4128761326 1436480943 +1827066120 2002456459 +1765156106 1811049959 1168990908 1554876128 +2212608464 1817674339 +2707542710 3271472273 +481239731 348425760 +915427288 4240002792 1428258297 3538790751 3173888260 +1907066703 561257868 +3324940916 3324940900 +3417805937 587116016 +2943623651 999163379 3012779418 +1622574151 2253536200 +879282306 1089070726 +630258786 42087293 +2817342437 1064651116 +2212768669 1026598946 +4075430012 3682231856 1858898220 3682231847 3801162535 +2183474255 551022564 +4095858426 1262840715 +2882733431 3367263405 1201577738 +1652799937 2515575549 +100953767 536490230 +2915611275 1503057269 +4099145780 4025799244 3188903923 +4000746903 3527935824 +765480146 2774068869 2774068883 +3854928191 3370862827 3854928175 +2790126887 1111412645 +3038301825 2233264944 +3445213174 978700359 +2478517704 1470697940 +2569653395 2139503736 2949450604 194435215 2732082626 2407592291 927301741 734591744 734591766 56837041 3688483211 2949450618 +1342700231 3280979798 +954544012 2999006112 482990433 +2526504982 4134455123 81802465 2381528608 199245811 2392098750 1891977037 922567316 3183663179 79330818 939344938 536682080 643357361 615501551 3145126195 +4194562902 490852897 3651653610 3929542769 +1879223416 3426058491 +2287068855 1341010438 +422332316 1018477191 +3089305042 3565836542 +1188457736 1291358243 +2759554041 553619369 3881275639 +807754502 3772752125 +4289414591 966708158 +2271702812 1137961223 3617056199 4047270412 +4074379276 2499916111 +3270586692 1575983160 +1490001038 3078702570 +1346955367 1333231391 +3916912680 1128827043 3162079888 2933901035 1195786307 +3420594970 2142158502 +3703979639 1304225231 +3438567713 2905607395 +2877400128 1024823493 +427638604 1856638936 +1772522609 3257865712 +661773950 3887617438 2520858719 +4217217731 2003253482 +778963825 230745548 +2788567627 3471064467 3243213469 2889415806 2046108107 3353621122 2379313127 951272305 2825081399 3622063052 1145892461 1010538684 +196364390 196364406 +2667937924 3651751903 +3973927940 3722008824 +3215892650 1776741275 +3336491685 3759210442 +250179137 3128463424 +983352724 3637184505 +2217402612 2217402596 +1638422928 1624990699 +4078557218 3551477123 +3329930261 2284420363 4200185544 3813102795 2284420380 +2673581732 3876239140 +421207324 2712589073 +2482395751 843775133 +3525527607 3058748578 1901372589 1225304637 76197520 3260080023 +3743969534 1252646857 +923568805 923568821 +1279740796 2419840039 1060047152 +279918561 759243706 +2310670780 2346537703 +1269747645 3778086530 +2790001648 3458116680 +500195795 3255435052 +316944224 490116147 +2112334630 182539878 1504865495 +98688112 1905319117 +630599457 1146164038 +2608752193 1964304666 +3459236687 3515314785 3828381006 2945278492 +1317388642 4274585725 +3635901373 1088455330 +556748061 1774751855 174091028 +1849198089 373769503 +2995916812 669991671 +3546307740 1555155345 +2446789316 479050504 +3281863058 1491301421 +718686112 71673964 +2164470571 240710434 3818222231 2807055019 +250898700 1004148120 +3652558548 2346133544 2364082105 +1886954584 1709880973 +3230617960 1600387971 +2400367604 779176217 +2408322522 3548800555 +2335690662 3470516801 +1808407302 3039332961 +2198798910 2392885129 +2773455269 3779217068 +2279006430 3041131894 +706808445 2760300404 +1934094262 3173587626 809393041 +2197817087 940245864 +285351040 1179835781 +1616280441 3553995822 2588638447 +4238947229 1532772386 +693029330 975361658 +3573099160 3695054157 +111499299 2571747082 +2929442534 2108092465 +2118825650 669648807 686426429 +2357300257 1357879274 +1559562178 398145123 +1021048816 1598101852 3192344277 +681203267 2491047394 +2860504933 3426751468 +252115170 806717268 4147889149 +3139754 4117447579 +1036933228 1704834967 +3220039420 2052654117 +4264435586 2761660835 +1149290806 213696529 +2245513093 935046746 +3575207054 3776256738 852186091 1003184665 1947054994 81795993 +3173142380 3934527015 688064279 1102322044 +3571562882 2667644299 3650861506 +4138256850 1477236347 +2238414912 2041979404 +2367322731 2343482978 +2465202809 1347021553 1643163851 3693625468 680634838 3919665561 3005587250 147580300 2363218842 1871088562 2861370032 3108351403 2631974221 3216378335 1605180633 1992429616 +2323212856 3453698695 +2509980496 3328361387 +3989595244 3301053953 +1334554895 1072102438 +2334230673 2529819728 3534456802 4058906854 27764823 +1207247606 107110805 +334437626 1533713821 +2780056112 2611828124 +4187631856 3720022467 +1052010700 1786750726 +3133259355 4024727070 3265655081 +2693529431 4261290531 +3414252598 2460231950 +3723456802 2179930243 +1332606158 985457194 +359166301 966183253 3255916539 966183234 359166285 +2166724726 3291414983 +3159706012 3159705996 +185469599 3826260316 +918827285 1272529930 +2689142406 2498681031 4010366714 1881121942 2498681041 +1403008399 1572532903 +978332056 2334396776 2071704422 853326401 +289885110 1146096250 3023450515 +2309915483 414763076 +1897654927 3159970508 +3821707485 1962621940 +810860183 2892498854 +3720284975 1119787758 +233651814 1809267622 +2505037452 2470842332 +2600496468 3979095154 1190689406 771248942 2347430265 +2392793395 2392793379 +1941840977 2236820368 +1628832247 1628832231 +1231441811 521094266 3667452269 1359525376 +420449951 1208403866 +3847290279 1936173703 +236879249 3405753168 +3609245682 2592182771 +3712414775 1499773770 +4131258501 681234778 +1510807667 1928059382 +1899107206 1524884935 +3155553124 2055310975 +2807109877 4024595440 3865632162 456999261 339555934 423444011 1504332202 3390172032 1504332220 +963593540 2921990665 +2089286498 2795546210 +263286951 1532253942 +3707247646 4170466111 +163471152 2259671171 +4191754800 2160343445 +400544641 374993920 +906544107 906544123 +2174315930 4090111621 4292901558 2659682667 4200420213 711931892 4200420194 +2842233858 3561668374 +1805327590 1261338113 +805506191 3824902914 4247009786 2047296669 +398717191 398717207 +1179672431 1419296400 +3990352480 4279461464 +4271267264 4271267280 +3984015262 846621609 1397604674 +3945810549 1748255757 3945810533 +82487329 82487345 +66723697 198216723 567324337 2715447911 2313360439 3698639873 3698639872 2277949900 3917675507 2816113655 3698639894 1906173343 3015671526 2565024708 +992449521 273540198 +2582395523 2680975984 1220183485 +465014575 3505809144 +4225269727 1423002632 +4160942001 496980912 +1867461732 1697164099 +3816589575 3194978835 +238259939 939773382 +2936360605 576373026 +4067349435 2899442302 +1304813018 1559615389 1184226722 1021451638 1184226741 1216101931 2256889669 151097740 +3335321674 1051384941 +3870376376 3775558829 4215049041 249286916 1616450909 2334784206 3829289816 2774997183 555785786 169900538 +2154034774 34671905 +2833426610 2395967539 +744741836 744741852 +29318015 1060964584 +3124818715 11044585 +2317078667 4106832578 +1072306933 155803764 +4001100221 3256391788 3531880190 1679987145 +25720016 2000884029 +867398414 867398430 +4073403301 1279183069 3672263866 +3886666562 2996655035 2983872184 +2907670928 720585064 +3460710662 3197656161 +3201725782 764224545 +3176542025 4067701678 +4040020060 1878982855 1186639414 2380283665 +2142253318 2712469319 +1332769454 3928096047 +628586278 3826516593 +2963899667 504932247 769424620 +912533723 3779273864 +1995440169 2761005460 1691369624 987075740 +1405342147 2688759274 +725715457 983541379 916986160 +3057851464 2861625716 2861625699 722360304 866485597 +69182637 791945907 +1428954816 3091211419 2583267812 3091211404 3564398661 +3916714369 4220447910 52186646 320628560 4220447921 52186624 3916714385 +3589315397 3556146755 247754124 +3909346631 2655023176 +1374119651 1639409095 +3613602001 3794131216 +4085581107 2649181732 408352589 +2655608945 2655608929 +864265823 2000611208 +3834775789 2466288466 +2050596998 3257842374 +677917799 51019296 +1907990228 3677685689 +3701478371 2749913798 547968221 2749913799 855592540 +2500346074 1979586365 +234947863 2813991632 2830769270 +3342899739 3316816018 +2110325108 1761074615 2003650959 3142566108 +1532449856 691172057 +1870519916 2222440564 +4242987743 44285503 +2703801808 3838509611 +1207412559 2581356878 +2573756192 2673497957 +2223912733 3370173090 +1767217968 348998472 +3393282266 1055618877 +1209138476 2707409495 +2441839946 3890165612 2643027716 57586001 +2590619470 3042137249 1651216326 +3545555496 3600811261 +4214241901 1704696065 +3082537743 2783536972 +3010424682 3798754267 +2112176659 1122436090 +97853075 16384922 2227996659 +338921677 1391380018 +3063619587 2212990372 +2249767866 1166851606 +2325025934 621617689 621617679 +295311313 2257812998 +1704369397 3776517547 3776517564 2609316520 +2880172460 2456510091 2439732469 1608870996 1244235832 +1398482516 2357024303 +2038976314 102637059 +3821050879 4018447169 1096120764 2268435070 +360506663 2500132942 +3433353140 3472684063 +3680776612 45753641 +3707408294 2221941335 +3836032859 1259742290 +882164286 856768350 70109087 +2589301156 2562776361 +2712842635 390954434 +3395620955 3202271570 3606388315 +2853017208 833012124 +618722848 774075493 +1548386065 1514538950 +1880161238 3483848374 1086091751 +2246390223 1029442586 +647451705 4181300663 +2184158460 3975422119 +1100214416 3420697269 +3365982582 2663250183 +304056435 4205038874 +3392812748 631522103 +1234644010 3168795514 3412139155 416677606 +2614726519 2399706921 +3214804029 3804277780 +1810588069 2623784014 3812035424 2741227341 2199868979 +2421509541 3679009452 +515405939 3479543052 3479543066 +74080923 2390309394 1289114719 586854597 3446704765 +1359675159 3728838292 +815872930 802217987 +3150210011 3889780616 +1422741892 53957343 806285764 3642184313 4081944877 +1561755579 342182243 +3882862305 905319456 +948016362 3724373083 +1024119026 3152478875 +3663941271 2831613321 +1804026362 1079646492 +1366678805 172069424 +2990538540 2990538556 +1474345113 4022507720 +4105067718 4101770167 +1178349626 3401575261 +3912111145 1015659672 1015659662 3671315353 1284101544 3912111161 +2634828007 462812388 +1256251472 1689250728 +2246811696 3453871426 +1686162910 1158762686 250153774 +2858402576 2017078293 1086237199 802480067 2587172788 4166837400 970256272 2587172771 1069459561 +3005081685 1293204956 +2439364654 2439364670 +2020002129 1775727064 +3727200187 1960461170 1529770457 3866440325 4048738363 1469585000 2152382791 4048738343 +3287306082 3578591061 +782544510 3946754143 +2356688560 3510507267 +3497008762 2592078347 1605561430 4239002481 1115070293 2592078365 +3363869489 3182274253 +2991464406 2264669681 +3954701216 2996077811 +176840562 2143873630 +1326068398 2243018030 453887983 +568750296 902013979 +3581910596 1541809417 +3400158013 3878544930 +1343085865 3276791500 +2080472177 2807490022 +2857334512 113994905 +2873476676 3805748489 +1897961623 2907714982 +1374655563 1229379855 +314250336 2494393921 +1933338 1933322 +2549263582 285614441 +2128517593 670402045 414338876 509838830 2821356804 +4048489791 510777896 +2594586835 2142972247 2642693933 2142972224 1186466860 +576849278 2655954249 +3361935243 2095441070 +530330301 2145640340 +3348233247 1238361288 +3611956072 2674083508 1636318416 1369214141 1369214123 341766371 3950609544 2217608367 2275683852 2309239102 3950609545 263954768 762412869 3950609566 +3740321743 3289025230 +1613591709 1316069012 +1796685415 4237769760 +3272941274 2673992416 873760589 3724457093 1422975310 1677413819 229086549 115761131 207931677 814928968 748526143 1664073815 2825295721 455363287 +1238936137 2299793656 +1586926048 3339166643 +5352713 2308138296 +3458651790 354664847 +503918552 544624923 +1540651887 4269690808 +2021340372 2113153465 +98461724 2303241691 +281055708 2968352381 +3813558099 658130860 +3577850420 3932090319 +4273127883 3194426004 +636001027 4291609080 +1684846589 338010946 +400127332 4015246441 +3630660628 4240138540 +1966569798 3428051255 +1995968408 42659287 +549632278 575080677 +2167583358 566954210 +2343548045 1496725476 1415183359 1922644466 +4129502813 3597571188 4061369941 +2317704731 1113754094 +3676680851 330715415 2404916588 +322458549 3569221321 +4010081841 1977362224 +752544232 2349757904 +2050202580 1031445816 +2084789180 1510566129 +1117747844 1695407561 +4053804318 798723391 +290990636 290990652 +1157212033 369274902 3157996198 +449006115 3568573200 +1931387791 1302410203 1931387807 +4132954995 1062931994 +130247777 2609889460 +2487596688 4190004412 +283349808 3379160646 +3910273617 1324538358 +3961461785 1158801975 +4178329626 1439082997 +2391585870 3045054159 +1786320370 2392689637 +282149136 2247448444 282149120 +4095465054 2613822687 156221567 +1128898048 1948356152 +521038553 2897353336 2793880418 2296544085 2860990889 521038537 +573846750 1062694922 +764455711 3653067230 +744049617 2710723078 +1657827589 2019865917 2468473562 +3998416736 2440988204 +2276868721 1047641335 +1402369035 1402369051 +965194411 1000227618 +292902674 2377650501 +3150034441 407238766 +3359697781 3006441788 +3712530744 625546498 4105522084 3357728662 2429584605 847818692 2769232058 4105522104 847818707 780708231 2786009664 2440794925 +888808745 2395504526 +2003143815 2074931602 +4199911714 2676405802 917731459 +488250735 295366842 +409499139 1775772826 960601725 +2071496723 1908291066 +454919039 197356843 +2505491237 1016410931 +3259306184 2709952510 +4247791212 4274813953 +3262604299 132208117 +2293660700 1397055505 657865424 1397055512 +861179383 3306912710 +2802352308 2791480143 1178242312 +3643802381 3846138482 +168022014 2986365881 3254807753 +588406485 2616752499 +2151029073 640277136 +4225879207 729098998 +1139025157 3844490970 2504100157 +1460649975 1541368436 +1845771766 648907335 +358250016 3177706597 +1360288157 1074336308 +624118703 86644826 +2509434269 323990379 +60875922 891833178 891833158 308542297 1426598379 2872537220 2453096744 +3074925179 3653650238 +3370970903 1677484336 +2194853570 2441301950 +2974781400 4164907291 3638490980 +646836494 1837513420 +4284055006 1449948159 +1101741940 3566527385 +2948744093 1271951412 +36379440 2581318805 +1017037963 3034505135 +2183298115 1298736724 524918122 3541633277 3168987696 +3337408626 4233874957 +3294002443 230207682 +3732813634 4283915862 3549646925 1575446820 1043122287 2192637173 +4043135395 2958418129 +3990390830 2819739310 +139657273 1403607464 139657257 +2747351168 1228442003 +905787651 2759505107 +2496331249 747487846 +3580329847 1760405584 +3759661368 4254567227 +4194635674 3988178274 +1698795842 2822220515 +1890924405 1890924389 +1249405722 2644659445 +81306979 67918556 +1702035055 587630766 +2700550197 3748571002 1836269715 2584195964 3827265498 +1827464321 2215720870 +2782691908 1579225375 +3143607001 3143606985 +2008647722 2735823373 +2490093194 3277186486 +1959361817 766343829 +1504078170 1575001367 238386166 1059722549 2063063229 +3698749503 565350913 +857105176 2218655451 +2978153443 2978153459 1413422666 +1622120568 2892825851 +1090351593 1600014998 +1357055964 828727111 +569173216 3791433224 +1006732662 3966048455 +707212706 4256787971 +1202665751 4023836454 1912353033 3208730772 +3838960847 90911182 +3871688783 2542851160 +111835338 1213998587 +2567138072 4167145165 +3756320356 3976316476 +4013644660 493075752 +3746695426 2418290229 +2075137973 1798656490 +747012533 1368556540 +2006310639 2878623276 +860236276 11368520 2876508953 +2767450292 1610869583 +1027841173 107970186 +705008008 705008024 +4060775418 790273302 +2793176528 3858370147 +3814172960 4258765515 +849031239 4048355264 +4183871211 2120596477 +4102419768 652281645 +3443847721 2202358399 +2416798634 1864400013 +4277626918 2200294918 3611470486 +2962298520 2355532109 +3493894562 2008144387 +1261719169 1563325863 +358490110 2081989521 3999749254 1427419212 999393206 2952454221 999393184 2740966665 +1976233292 1976233308 +3773871827 3162607447 3991916076 +475168611 4175333578 +199364008 1557888875 +4252401517 2519608773 1854576786 +2197787756 4005974140 +1301303084 1177330263 +812173853 1106645604 812173837 +77305225 1445154719 2368054254 3387713208 +921498470 2337670298 +2604315023 2144940198 3966075918 +1267889751 2636511188 +2726839773 2726839757 +1982194000 1302442229 713658812 +3880535345 1309731878 +2527161687 1979664084 +505082508 3669765815 +1882147987 4228545303 1882147971 +3179837219 4249724514 782510627 363070167 +3182854805 3896543533 +3798669218 4186468056 +2578972769 1571330208 +4114012210 3488250843 +928240484 391450239 3726928740 535254873 +475324941 2795493988 +2804732451 1317981468 +2360467574 4060371409 +1793282091 818308184 +245704674 4026386627 +191976379 554888519 2338577467 534280808 534280831 601005701 +2273609475 483815229 +185867931 918432302 +4220048955 3534618879 862535396 +1639740980 2282307208 263066585 +1726951853 523306079 2776932409 +85471817 315832581 3631573074 +925919308 2326186200 +3932532446 2436715440 284472615 2346508426 2656495148 2557614338 4022766825 3692185449 3835361319 2540836732 +1933741938 3821523059 +5797144 4131965786 2759345973 +3678834840 3356860251 +1909557317 1910080666 +845949101 125985119 874060036 +3588182580 3800983503 +3880496467 1864489402 +2242993890 2003898414 +3141207892 300714287 +1736646066 2505178459 +2133873167 1209085326 +2416890016 1733454835 +2800801276 1337579441 +4008666664 1256050941 +3356092958 94080297 +1521446761 724329038 +1866283295 2898669845 1588414114 +2498105651 2036525340 2019747718 162691041 1547844727 423437729 1547844704 +3709165060 212009055 142991465 3215908029 3761998851 3215908028 363563052 1225219415 126213832 3215908010 212009033 25548122 +296254984 3141241141 +3342169008 1227169283 980310795 +619886316 370537879 +3754182791 3640542630 3754182807 +906152760 1046866235 1735266771 +1019215031 2275136820 +3576144162 1143309857 1523943494 1698071556 52171863 1143309878 68949485 +2734620723 3396161626 +1738180777 2645670363 1305779224 +2285571341 2180352882 +3872923348 3427139513 +2867923818 2294556326 +4179101824 3035137100 2698338693 2698338707 +3887813279 996803617 +2281265709 982054098 +3814662620 3401731399 +92467132 1835788145 2984072944 2848267830 770118759 1845166316 1763665127 1835788135 +2815789117 4285601282 2863718475 +328715926 1845114417 +4270812863 2060146344 +2201673268 3383479247 +1249677103 2260689537 +2743214203 3772326322 +2771056416 581109605 +4060271931 4060271915 +3835321999 1845680910 +3902247070 3902247054 +895633932 3520577664 +355793446 2288372183 +290096495 2807041454 +2613278417 2613278401 +258795622 876082609 +333156812 245793825 +2002025861 3917665706 +4223760631 1217490118 +319249683 1784022570 +3333389695 4022794044 +462861671 3577712928 +2808524883 3651637946 +3845408440 3465853267 +851073545 3884736799 +4149770520 2017894605 2017894619 +4091985258 1581002189 +2790346702 530714450 805171022 3098646238 2643492713 805171033 +857781618 857781602 +1156436909 795097412 +246218840 2362383333 +580844195 591695498 +4095707420 1772410641 1602129872 +1956374291 2758591226 2758591212 +1913123343 1711415229 +2173247420 2664798055 +3280537419 464943874 +3884580252 3735903875 +250220324 478107929 +1535939324 441148071 +33843286 2196782961 +1397319601 3038337565 +278961890 278961906 +2789956156 1495904982 +664682506 1746849709 +3587440603 2130295487 +3227345958 4137516063 966609732 4177831895 2559791970 +682677414 683191797 +3909261328 1585592020 1671956093 1789399399 1469281511 1671956075 3800826088 2319368556 3742720291 +1686389271 1686389255 +186714295 2233581859 1006680080 +3854047030 3283750694 721242391 +657051028 986619887 +1576708722 1671057779 +1473442958 1227464955 2267935723 +2678176160 323423645 +2133136705 1321541661 +3225533977 1690363646 3229499720 +1832415641 2296042440 +2315489413 3365699930 +4221148552 2597518621 +1879116933 3160960108 +3213182288 3178150036 +3320919547 2511862322 +845556585 845556601 +563196894 3059623551 +765355571 56287820 +4015977172 2792899503 +3948901949 3024554180 3948901933 +2886228177 2886228161 +4184782074 2739332491 +2485127452 1018367952 452956172 1018367943 +2182667635 1076141068 +3641164158 624269663 +4222219038 2513242921 +3891571142 3961995937 2026767889 3881669306 +976884958 2272188799 +3993182344 40792353 +329596739 1076015034 329596755 +3764708151 3454625897 +331642235 2571432114 3951481384 +840124888 2891792141 +1489746890 3044206046 +1833192718 277171471 +1484040991 1588158942 3433360860 +1549236732 1505036199 +18448885 4099875795 +184857901 2238264772 +464663495 3117713826 +1524819783 1513231574 +3382327019 1220834292 +2171623086 650019129 650019118 1910010863 +1380583266 3968442197 +4293293785 2966230942 264371598 2966230920 511590927 4040961470 +4030788465 4030788449 +2510398532 4216391388 1798876817 +2978874029 2717454107 786400018 797849156 +969450535 1590944292 +1115924786 3879950757 +1443595260 1881195949 +1948146936 2746372935 +330170976 330170992 +505006239 26661470 +3053865726 3947741994 +3077133493 2852617369 4003331145 1230824400 111026707 3643615410 4009490522 1875925244 127804329 2800886552 3892047168 +1539346646 3625693837 +1296245673 64625701 +1857759124 2624038260 +2618145525 2661109692 +3706758760 3706758776 +1537989383 1295189609 1189885671 +3821050849 3641390157 +1527705186 3129033813 +1479629812 3384000783 3384000792 +2367385191 2367385207 +2938409957 1766181206 +3329930269 132423989 2472782338 +242753073 458987163 +3358141068 2764962423 +1898457934 1898457950 +1782938690 2610937524 +4250567997 310361876 +707689626 571011343 +3560190772 87540639 +946827276 4063410964 +492532285 1945425428 +2038907497 1811041230 +1412717104 663262704 +3433785075 617812108 +1113207097 2902162600 +1062003688 905430193 +2978620127 1534387457 +3174726149 1454363453 +1253926330 1318934658 +1461272997 3250738874 3250738860 3514063971 +911407310 1386064975 +150621605 200569565 200569546 3339205306 +463836198 2879928257 +2424031753 2078215207 +3312388574 2882308223 +237581941 885328337 3811472400 +2935237015 22902950 +1620081550 2440200335 +3226475475 2395203939 2596535360 745044013 2434518330 +3855839148 1917373377 2010696663 +2869602249 1608948178 +2774458940 2422088807 +3381349645 2415182949 1397377906 +1860075693 461733042 973950385 +1182697132 3937769651 2477824595 3362467776 98165622 +3172164030 200092233 +161227567 1338729208 +2227972067 1705184657 2427345735 +3870397844 3180230639 +2465490152 636290970 2916189072 2491134518 4246993684 3364257488 4246993667 4190285927 1052432701 +2892687370 1984645051 +3200162244 1442606684 +3751636413 3251880084 +1051979350 487441718 188756327 +505141699 505141715 +1016158714 1389405323 2458091249 1389405341 3916629717 3205094102 +138836607 2247284200 +937614134 1767333514 3354373377 807343623 3354373398 +1095847829 1114676794 +1268701971 504553196 +1324910311 943480224 +285755914 4240645491 2847720243 +594539684 1832787497 +2720577986 1544916098 666804171 +211852839 131659616 2596207801 3129830436 3129830451 +2491472902 3397551770 +799327121 3150918148 +3184460686 1524799631 +2580436773 2438039500 +1631925269 888208668 +3422325797 572672069 3249507681 4078153804 +1487638109 4077984894 +148963756 2788532673 +1715390870 3086889569 +3220253836 3030982775 +95060864 3327693208 +835189500 1385372784 +2245761643 809865309 +4200769208 3779883949 +2871087371 1886557268 +2179701237 384488592 2061720764 +790032417 1109132278 +2467482517 3970078131 +4061233045 2794182556 +1213211877 3140097146 +4034267906 2122355512 +57846504 2978328211 3707872207 +2782558131 2782558115 +1256251473 1334943127 +1255909084 3016207441 +1835551513 1412315223 +702125765 1357496589 1359633267 +3526121655 2463082502 +3908822384 622532937 294161869 +3289718888 2936736280 3012503504 1860059134 2912577260 3156958831 1820041470 1255279521 1590418746 3603000428 1541710046 3881349998 2058840800 +1476117687 945204240 +504234227 270019404 1124826757 +1980239267 2350072900 +922062240 1663722392 +3055338324 3774083073 +3154083067 3996237618 +4266461501 528077858 +2432095959 2857274435 2432095943 +2851974535 559426454 +2998275853 1637462386 +2981847218 2993059666 1548974171 +1193060966 3781589694 +1068216635 1984430052 +3869731235 3158619165 +12547021 3696240932 +3083664168 1971924787 4061399136 +2518489678 1041563097 +655809883 3825104466 +1775670673 1617721142 +2079686887 175762336 502131940 502131955 +3386418345 1762342414 +2129368368 2736330891 2129368352 2736330908 4078982296 +3817580358 1284542805 +991509272 548931291 +2928729554 2277837434 +4136147760 247346901 364790212 1225542805 3650212216 1225542787 1939458663 2472316572 2589759885 106889713 129903574 106889702 +3822419811 746214237 +3369317519 1921683500 +1272677827 3142504358 1237011704 +3964501694 3154019593 +1241844542 3287331487 +2102186217 686612174 4176578603 +1624989046 4015268049 +3964539684 1501783415 3459078658 +2849829593 1070746526 +2476135417 4209515811 181641161 4275277045 1332719870 +2270020208 1869157955 +1494415703 2265143468 +1966528471 3174560585 +3255052254 1250607721 +3006608815 4064524753 +2599254188 2413098711 +2311691542 465170913 +2015722996 386221849 +2494228607 2282487806 +2258694397 1440047605 3339112587 1440047586 +3072044239 261163470 +552112948 1126548113 1748899380 124125855 1941771901 1246377016 +1274717282 2877181869 +2668883174 1381887489 +3089829205 1086717148 +4283600327 825040179 +3369303556 2972646570 +3751694600 2929543180 +1217015619 1955096170 +2433778902 855710951 +758383532 3765269697 +33448396 4017353783 +1444927542 3391184135 965046806 4105793337 260162060 3391184145 +2802172053 2198743708 +2532396573 1785878107 1979087422 207340009 3513571934 +1338813007 1304000666 +1317401731 1769847911 +3426319666 3932414366 +2828327706 2585399094 +609943182 3376331161 +2962140503 2832107203 +2763440486 3833552538 +1587089258 1425228754 +1454422636 1093396887 +93266993 4048943407 +46575083 1324983362 +365910035 2623444502 +751826947 3800312816 +2405366658 881192373 +2298321131 565820174 +1510159943 1690112339 4195250624 +4129502800 3379462133 +1174435657 3831468170 +753940685 3358784654 +2187382322 3172329108 3133304765 2341182622 2707186138 2707186125 3748531154 1885640883 2707186139 +1714520035 906340048 617085149 3270267466 3284976628 +3567899527 1314389376 +1490016507 489646149 3392312114 1906155944 +1944701530 3540618173 +910908056 3437922656 +670308594 3611510003 +2129171382 1727793318 339040663 +4195500042 4274944778 +3060540763 2269040205 +2055108301 3642123314 +4269027615 4269027599 +189019346 2388600453 +2310824405 2827878979 +3607293565 4137512660 +2410424272 825590392 +2247194942 421649567 +199322356 804881044 +2516278690 3165939203 +2710740935 550602326 +4239564461 2049952324 +1519694119 3205685366 +3704356708 4062011559 2536070396 +2726462834 3540324697 +301077509 1159037900 2598277162 +2447265814 3069711015 +1526615870 1536037961 +3224853193 1612966510 +2450243095 4286332454 +4246152300 4246152316 +2931979416 1469249073 +1250724790 20960833 1250724774 +156911965 371293556 +3503857247 604065672 +2933834596 2897057407 +2476908501 1040292950 +1831349612 2823445736 2823445748 +3601044568 997838821 +2211947048 3027518708 +2470481883 3468649375 2845996484 +573951486 1134055253 787388258 +2140493351 4279672694 +269066632 2566312536 +2160088987 1237969170 +4048807665 2388301696 +3878987459 3135407338 +424918861 1874835282 1020106245 874389682 +3034979044 2856080617 +2924377271 4030401827 +1911854556 494160528 +2742624688 128976899 +3732493180 3036572721 +1788068479 3932182314 +898674060 3737203553 +2571454969 1091793640 1091793663 3331588468 +449850617 873277878 +166314348 4215612165 +1190942373 3574625782 +731286459 1224597026 2076996223 731286443 +3527527661 3527527677 +2249898657 3172191094 +803661137 3111845510 +439464239 2643880017 +1259197376 3065154936 2350211468 +3532840773 1797208599 +3056922037 813371135 +2282408616 3506243197 +557920740 1033996777 +1594135276 1932541248 +1796208821 1780220830 +2892258175 3774613736 348259627 +1634975981 3474084672 869171009 +2691861187 1623002778 +467942807 2135749798 +420732098 1121843914 1011123555 +3061762112 1525590540 2308259013 +2155593192 718009387 +1363149340 1852096388 +2761831444 2057958590 +2316765606 138686551 +985640823 4072749126 +1523707137 2203562973 +1231016961 2195373440 +2218291458 651814435 +2958963497 3008790412 +1407863891 715253572 3447598509 +2512544950 3810923137 +2475018489 882597864 24465099 3466075336 +4073594317 1968694066 +2873785163 4047509250 +3462622028 1164380064 595670369 +607961902 607961918 +1747997546 1747997562 +3351506499 3161461610 +2889725717 2889725701 +4091610067 3191407916 +2034816232 3584502059 +3854364512 1284224925 +3068384027 61166482 +738284785 568898945 924366694 +183064927 1980425739 +3074889263 773355372 +945783614 3811862601 653793429 4233861791 3811862622 778203426 4233861769 +956158962 2845091322 +1109550533 3777377548 774682090 1176785347 2300942314 +2881756695 2092654128 +3831371435 331009752 +1854747245 801872082 +1187912698 1886784157 +1406836199 549415821 +1489353946 2571651901 +2232619980 2232619996 +1669394734 4264484782 4264484793 380401266 +1656166201 1704703241 2671349438 +2366294229 3707381596 +1862846526 148060575 +3679141538 3648231683 +1450553967 2319967416 +1543073122 732377429 +521470265 4178143524 +3436123450 914641411 +4114885475 2102414556 2315430220 560528967 +3494846257 3506371646 +267051812 267051828 +3767177102 1499108633 +483006499 2208995600 +541976652 541976668 +2796368931 2234062086 +2616321358 3419142617 3419142607 3687584489 2616321374 +3859821244 792109548 1598710375 3883916775 +1635770489 4115553896 +1505009074 3914612517 +1053826877 968481314 +2533827067 2533827051 +2618629922 1556345917 +3354590170 2642573373 +4205074664 1184304899 1117194423 +4210890454 2237424055 +336845388 2881797216 3879773601 +3546825215 2410961326 +886061064 2990081354 +4274952317 2621050050 +3134247381 3954856540 +1358303278 1912510126 2707126383 +2092122740 1293518047 +3591624783 3591624799 +200581586 200581570 +3066595297 2662197046 +3412028434 1690821306 959914067 +3137528550 52212785 +367833622 3950438721 +49247620 49247636 +700263699 3352163564 +3215574184 44679380 4198136959 1614845053 +1680076285 1936435313 +1447308467 3450447927 +2187115841 3451690609 +1615530398 3449308606 579521304 2449549801 3383483305 3449308607 3449308585 874521513 2308435778 3235183064 1706412990 +4068909102 4159580281 +3596974945 160584427 624381860 2955796429 2888685969 3804314038 +4060666028 2951550679 +4046658455 3523153033 +3607062769 2175199638 +1153853719 1532456742 +3136031942 127409067 +3463048245 633263996 +1700808776 1700808792 +2428153062 3151900183 +1921492483 1606846960 +2281499779 2519224874 +3609855716 3609855732 +2739596064 2739596080 +3619997967 3116925592 +3807844319 1482198497 4137220385 704287774 +2661878268 2768783929 +2091982295 3112943159 +16440429 4159242130 +3815086707 1811030796 +1612311104 2291786589 +1522719553 1522719569 +1149011340 3028783411 1684640602 +3307733979 956174788 +3558184990 512962242 +255683489 1170072518 +3095048829 2099183883 +2323594716 3796787537 +280999448 1207678300 +1876998105 4156648072 +2150923977 2611189368 +1645800364 423296983 +3999072628 3319816819 164741863 2959690128 1126457658 47298515 1098717623 30520909 1098717600 1971197516 +1729969339 2297876819 +999556809 2466688632 +1766309957 429438589 15969434 +3916213013 4131661228 3711799347 +3675244017 2997816961 3402930790 +3958508271 1468317702 2164547770 2788286647 1468317713 2858048059 +62347745 3131211040 +4079754268 3933224977 +1996776283 1984148731 +2692993182 1300326591 +378976709 3303279594 +2086690084 4281423640 4021460905 +2435788068 2974027689 +1502104373 521508663 2735462803 +2662087762 3406286075 +1767574726 2689932215 +2782172637 1756413483 1213645250 3936873204 +1659794982 3814981079 +3299891554 60601685 +407587129 2005157054 +2139184656 402866872 +653792309 2374487914 919307213 +3747371621 56773868 +3020617391 116334451 +4035552420 1286483497 +890592882 2594835482 44281203 +3455898444 2432737463 +753128587 1255305135 +2884354879 3124564715 3810810920 +3651346477 3500893151 +1855736408 2013857933 2013857947 +2553860423 3899749078 +1184082196 2201404998 1434865860 +2936233465 1062612024 +808849460 421233113 +791037361 1370263976 3930043824 2381836034 +946717167 1699634746 +277985256 435489823 +3328004577 812059048 1374457913 4011398121 4218798296 1273792189 4101354964 1273792170 882280713 4011398133 4235575918 2992542747 834319875 +3482902905 1185608040 +4090718556 835640273 967051792 +2956996268 2956996284 +1021703065 815388777 1996388830 +2410182122 271687501 +3409577376 2354502373 +1498513312 2562857762 1098884808 994830585 2976299415 +974258076 2305436231 +2847814198 1818823431 +2775874070 2354852007 +4202744253 2442832484 +2992225440 2365115367 +72791274 1191951616 3195980877 949726454 +2106724357 4120177725 +4191258739 3084504332 +2895441334 1685206407 +268934930 538104825 +2729853232 2729853216 +1221162295 3424880016 +3071404613 789143697 2978477750 +289950241 121382470 3659280212 +1447720344 1623503653 +1881090442 1442103477 +123444532 3375921359 +3736706634 3895733869 +988628331 780420962 2923199375 780420980 +65279965 2602685483 1631649698 +1829982180 68608589 2573648873 1548444900 1556502969 2573648895 +2933294720 1593518626 +3870805943 3931897104 +643357364 299911503 +3484721766 657672602 +2874784320 4265620179 +4013102844 4013102828 +4272880836 3905097647 +301235157 1895056492 1252230039 3699761276 +3692451287 1643626005 +3152099427 275217068 2322839677 +1724949930 2222246541 +1121290404 2465934991 +2397083305 2492279822 +1761064867 3774223754 +2158317236 943383887 +1594357577 3836032836 +3606869954 829458019 +1845134606 2706351428 2571450475 794785049 +2907633170 3847052869 +1875429698 991220451 +3633013928 2339337341 +468035234 2357547267 +3522204947 2428153082 +3450783045 2618593332 +1668098597 2849593403 1497176987 2849593388 +314671066 2431929757 +3401006317 192211218 +4007655281 2073200368 +2629033405 4123593588 3130818485 2390786920 2105885533 2036140540 98891949 98891962 2036140523 2928746302 3886772819 1814433940 +1636827820 2829931855 +3737617904 2362528136 +2452980140 3594199511 +1255093975 1255093959 +761197327 4142190426 +3431974579 30021226 2182070083 +1146375889 3670405750 1639453456 +2208483217 3393202512 +317287929 2112353665 3457728204 3195543272 +3961538724 572780175 +2303975919 504146734 +2431777874 3123551710 2215935998 2129671443 3877866746 3877866733 +1067995049 3740624654 173095705 +2565076030 3973676425 +3971585305 3422478031 +725287029 3668734199 861202956 +1424282215 2796493811 1370027165 3421331616 +3612182902 1695507655 2834235974 +389955000 1325082811 +2999341037 1529860612 +3776674872 2521074747 +3095609933 688446386 +156367803 2317080197 +347175706 2909063659 +2911697851 4025501540 457204351 +1391153866 1383289851 +2277089625 37289736 +1682696499 377494362 +4222563470 3449181074 3281404894 3268393871 1006912025 +3776730571 2786587384 163408181 +3857786647 3166104329 3139086972 +2244825278 240903208 +3795907849 893500718 +1978945197 1978945213 +3532229403 2307259282 +3100844368 1146974453 +54629573 4065711088 +1801961545 1565766382 +602152391 860818176 +2302055537 341820151 +2920636878 3651729231 +1591531632 1591531616 +497747970 3057490723 +976945313 912574530 +4088358575 1279163387 +1976327846 381222721 545894466 591003875 2705572279 381222742 +1347643008 4081736581 +2915972385 3164447478 +3653045330 868364286 2819431661 +4179280449 4045512423 +2744311830 2520171175 +514859594 2571500147 +3416130380 486116704 3416130396 +3209790971 1143217970 2805964027 +2025667275 267748281 1312284654 +4076825588 2081878297 +3559027626 1336045926 2621183131 2375315474 2375315461 +1524486518 582559477 +215081030 227009924 +2017907555 361205731 1905256016 +3756229139 2250621932 +332674538 1754242130 554753883 +2230834560 3525646483 +3104492076 589160256 2013020993 +2474778623 2173678697 +2312567469 2600286981 2859245138 3653353192 2801618425 +642110317 1732867931 +1604655395 3018232330 +944563022 460877529 460877518 4010398671 1366869458 +2892233836 3446038039 +781026587 1674086802 +2954621464 1409162203 +3948758907 4275537572 +556851045 2672540298 +1786750541 4092775218 +3264463026 9984051 +1977242956 1389047649 2465821212 +1280495899 1825875679 1096756612 +2723529445 1912721004 +3303466305 947578198 +646350760 3995319252 +136371343 2051429181 3971257562 3904147071 +2622245586 3726231699 +146769281 1182738944 +726907884 550556801 +1617362827 1617362843 +3816032989 1988083413 3970767330 +3315397843 1309986731 +3727825668 3437266783 +821403844 3601601673 +39746684 918419249 +2282341828 3190525316 +4134708914 2826725925 +402295045 3563441180 402295061 +2693080107 3700944802 +1197886563 1461880647 +17272972 4178907028 +1325163353 3116178854 1795690658 2970563656 +2185036829 1829240977 +1328499680 4136664 +3435652797 464534420 +2831346190 144225177 +3045644061 731880427 +2762912034 4149220391 +548332036 477666619 +2788476035 672225852 +2259819854 1824698457 4104206542 2802151961 1482957263 2721780394 1555706942 581874702 3939266842 1392381384 2213842841 531541843 2721780413 2554004194 1388480346 2197065219 2263189973 +56134635 1810229870 1199548926 +2110818093 2300934146 +171374498 848189922 535853291 3062354965 +680362086 1019289751 +1547422916 44326840 4129511561 44326831 +2977398488 3475373668 +2514283914 1959391277 +1162732537 312336638 1284059081 +3764865681 3764865665 +4004377886 4264224009 728094445 2968734410 388697193 1493089261 +480316407 2693241001 984585827 142988752 984585844 +2592496239 2961202350 +2639706948 2255733724 +4054916371 2561015703 2362492140 +1947236091 2791993256 +744427380 1302680473 +524802470 3827015745 +2134289901 3881519367 +25330878 340198857 +2670168180 2670168164 +2502250237 4058201207 3334166612 653001417 +4281864232 2063710292 +2841159409 2274282854 +1153160396 2735438561 +2552117467 1385398482 +2822208168 1501914836 +522303603 1964334362 +1276028331 1712245812 3712710095 +1850377754 3307890134 +3291584521 2580908831 +392535709 2357123202 +766771315 1700574490 +3802437197 370711332 4206645170 4206645157 781135611 +677140308 3713890617 +4121619802 370386109 +2844889382 2844889398 +3027045545 605336844 +2988827352 1235491355 +3469643197 1277763714 +4225879206 712321345 2002655659 707546792 +731076209 3127940381 3442645239 2357351190 +2805525336 2721087219 1933183962 3013196029 2319069210 +656024011 1495478914 +1074694804 2193271188 1242484600 +3815062841 3449249183 +1499546921 3709853592 +4031113108 3523972601 +3622839339 2945020386 509083883 +3223797161 3223797177 +3966682000 248482703 +1265735550 4224005790 441917410 1104247625 1104247647 4224005769 +1957137649 795339590 1329205367 2495982998 +2664087753 2664087769 +2851676782 2295507197 57901082 +4282326212 3400208494 +3093065971 746966669 746966682 +701994462 3160468585 194268137 1565902338 +3858109561 2070035048 +3333525066 327351917 +1235429390 4191686159 +2423010276 1045802985 +2687289147 1635623410 +734183845 3212052189 2291586746 +2229881362 1296013893 +3559027617 1031678929 2470184566 +1356516677 2373002124 +419046884 902407679 +506550982 300662106 +874995949 117282052 +2047716471 1025659230 +2587786230 3169532211 2660270769 3172958860 3327992913 +717546623 3539186686 +3633060255 1002092256 2377732385 +2225077801 3121663374 1563334508 +120139146 3486691387 +1614085357 1614085373 +1750927823 964124399 +848217563 3616508296 +1297267602 1148616237 +3973059911 311525078 +3815690881 3871856038 +1876420219 3646566779 +1336190720 3823288073 +3822967260 2290691728 +120471730 4291811379 3878770778 +1557688357 1303939642 2474744157 +2584702723 2303443370 +993200324 2323167522 3877971115 +752261771 2210506159 +965661093 1087637164 +3019949875 1867678767 +2326834411 1404366607 2011058069 1404366616 +326675141 208266492 +2414495250 2414495234 +913782676 2341097192 1370258937 +1865972540 1596452821 4075830595 2441263089 3015011334 2880790380 2864012758 1683824359 +4265982675 2712186323 1346909014 1389916495 419267491 1346908992 1353150442 3081293937 400224195 2880207974 1346909015 2793919617 3951758637 449124908 +3895054687 3637811358 +2184747317 2184747301 +2904603116 1988406913 +4229961628 1413403652 144835143 2189765255 2754039692 3892946320 4125243767 144835153 +996488753 2975092518 +2814360449 2480155648 +2398092333 610695476 3518485791 3777061518 564754747 2932906996 1867793807 205561554 2725456516 531995914 2957952460 42553170 85969029 511188945 56070674 1254377200 1866638439 2195297904 3902898221 1559458105 1116976926 2636366935 27446431 2344187104 1236686209 1213171714 3477015374 1490999972 4016622273 194730480 2679118720 +2821928127 581017724 +4239805794 888918357 +1028639502 3684367513 +737939129 4140510504 +3509709253 2741681148 +633706629 2462378154 +687488792 602232996 2582729421 +254138691 1338622631 +1830595919 423243511 321180505 3051027282 321180494 +627120265 1624874936 +1983433784 1399422011 +4167404641 4167404657 +467378114 88264406 +317099337 166750712 +3995324724 3755025760 +3066847447 111683139 +2709066480 563662787 +1934845439 516149569 +3899364319 3227109384 +4119425597 2013556689 +1716113650 350977099 893102408 +334724846 247959628 +19986786 2916799406 +4194898143 2068156168 +1094036520 3481141995 +20561331 2699403468 1011516621 360456480 +3368890077 4160800244 3731287216 4051735217 1261929154 4034957611 142653169 +3897504867 397375452 +1325645291 1325645307 +1024568938 2402486482 2362806491 +488308070 930932631 +3811080663 3811080647 1314416451 +4284442529 1629617115 2891223576 +1471203697 2430554863 +1673913950 1586072793 +149509555 3557035213 +777775144 2510639189 +1602110032 38262676 3221445309 +3880595405 3951181732 +1057291247 601397560 +1242675423 1242675407 +933981735 689749043 3655237766 3386795894 933981751 +2528844599 2139871110 +166579819 251041071 +3552048175 4093183273 +3122655536 810069653 +4234352471 3513909442 +3053220081 2638164353 +3600721209 1698755358 +296317445 3535699418 +832103969 884098528 +870668028 2919755431 +2630048727 2659816294 +1665428453 591747869 699783546 +3458843218 3458843202 +1033284960 1033284976 +3608135024 3916391132 +2893748801 1876535619 3957548775 +2442566733 2098728228 +517649510 4165598337 +1677136191 906760444 +3616385438 3489451842 +576915030 483078987 +458940266 2316160285 458940282 +1438416037 2629318579 +2853234143 2939717276 +265771306 436296973 +1007653876 2321962016 +3258209153 962556928 +2031768317 1817353557 +737821639 33075798 +1500024586 1793157790 +2988012497 789664262 +4266077654 989162625 3199561778 372740102 1862840269 1471531605 1538642103 2856416106 1538642081 537733105 +3087000625 3013435853 +275455911 1134186754 +456170896 4095713910 349579047 +2659412290 746273358 +4260944803 2953037959 1908523420 +1639453456 1421177647 +2125470843 2281828759 2747358638 2517995331 2735683841 96905389 2263909995 2263909994 1573145324 3929855410 2263910013 1946363617 3617823330 3929855396 2685771549 +4228452734 2383036574 1078364511 +3982333012 3982332996 +946307171 728292176 +2990202298 3370121079 +198538923 3882954446 +3353874441 3142663726 +2376477970 727152498 1304890299 +550424351 2765309024 918925771 53928173 3297775048 918925770 1865219489 918925788 +355505194 2239315469 +1754023546 248705547 2414519382 1628637013 248705565 +2258093329 4058724816 +1660263948 2888274209 +316452234 636028422 996487213 3142249701 +1840176296 3184835 +2318904892 453289584 2069301745 +1960882375 3300280662 +2572546396 2599362568 +3652683986 229174214 +1771146574 1771146590 +3288633649 3291516976 +66013798 2545032833 +958342207 721817406 1339376406 3683242218 +779686025 1342987944 +1449282601 4159622041 633201806 +671312289 2657044598 +2582572481 2228191984 +2836092259 3689022813 471677008 +510143409 3186510400 +879874163 1978356192 +3452598404 2310787311 2042345417 3452598420 +398973271 2520355523 3332056048 +2739344566 99620879 +1725265454 1725265470 +3048721703 3628668837 2138420018 +2459343262 2459343246 +3900048085 3157528835 +1029187352 1029187336 +4288599999 2406841212 +3035904282 3868576501 +384143412 384143396 +3359455677 4116833428 +1922728313 1786162532 +3073857456 455831433 +457727032 719924269 3121646276 +130840853 2948309933 +3231529543 4222294553 2122497494 +438495446 4210329841 +3266122929 662147750 +604856992 1628586483 +2988304079 873617368 +2420219174 1725444486 1511629667 4065659222 +3105034189 1759594363 +3823306525 3680776866 +2950686607 1819903492 +1858349352 828504404 +1714642029 1714642045 +2977914888 1763756426 1779574848 1938041995 +1064949983 3776065948 +3743134275 2073665386 +3071635436 2930253564 871979776 582955159 +1401003364 3363604429 +1601605644 2371799095 +467942802 2051861701 +2557774203 2054450349 +510458207 3381534305 1900512796 1900512779 1150062728 +3222693320 3512295536 +2464900914 1788041877 2464900898 +1024922053 1746318787 +943989409 1578478719 +3376728072 3376728088 +3938760322 363548341 +2521163226 1778964011 +4211237435 1606460146 +815516495 3200382512 +2591538405 1977231367 3723203612 3654301731 +2347875808 764274597 +4178111121 2584298064 +3451495828 1866442735 +3442503312 2142109931 +121436970 2346840203 2250674424 2990169581 3694995100 3524819113 2055607049 2959627023 3215829698 3357042926 2976404629 3966578361 3524819134 3359277214 +3438863987 1780468035 1199729588 94378204 77600582 1593648544 3378339681 1593648567 +3881399534 1097348226 +3060305682 525851810 1283690225 +2320393586 728347251 +2576853225 2998855374 +32158607 1257328405 3737153698 1027727820 3753931320 1707539973 1236700114 3150922766 1027727835 +1575144423 3003579574 +2127811448 2606998563 +2317574898 2806035327 +3648467266 2560789219 +3698143754 3698143770 +187646473 2758079534 +3215574200 1875306662 2708593721 440436234 1657890628 1657890629 1883286957 1657890643 3224440928 3567620492 680001728 +1864312821 2546678842 3951426302 1509601938 +1587274155 707356163 +1612271581 618182900 1612271565 +3636625279 1820772668 +760919801 353395361 3385541472 +2898371681 2624511421 +4088684533 60822924 +210258906 146865059 +913404484 3651077922 3054271056 797371229 1197926730 328583619 814148835 2953605360 3054271047 394708375 +4010081843 2010917452 +2581995589 2319764620 +824477510 134143889 +2201607692 2685963511 +1076494822 2196663078 +1970731365 1894670727 3571741091 +448229233 4082344094 2282704644 2143579878 2218842377 1494492827 991275320 2143579888 2369840954 991275311 205167197 +4097138410 1510238797 +4274246327 3309614617 +916925065 2452092344 +5058017 1518287158 +2288465349 4149075868 1506215348 +451098494 3416713384 +2677342288 2211508468 +2470514420 3115803999 2865135699 695993018 +2782172629 2601066571 1589120958 407039610 407039597 755167106 559126131 3802652234 +11906257 4009692422 +1715123374 2624220655 713756462 +3416241374 1785313641 +3893882320 766205539 +82448599 2528466499 2474148464 +2671159018 2366161499 +2737219424 3932057132 +310744555 323682548 +4033646179 3722716636 +99820938 3888388141 +3632988529 3684005376 2400595077 1012047625 2890449427 1406354672 +951468961 2403236816 +2264722163 1931861146 +2327304005 2758271372 +3507398797 2803062244 +3153404946 3806356919 +212009037 832141604 +1625063213 2820420562 +2366903367 1570499520 +710896959 735817985 +1397398601 3181827525 +2568155011 2077166378 +1654722905 2449902654 +3078265983 3185356331 1426349032 2019313857 +2053199414 3828514575 +1033240580 4203685916 +1885372807 2285025753 +4058103019 2975622626 +474064808 593161579 +2991559010 356638019 +1721144274 651735162 1359655827 +3862267212 2990593719 +4036134372 2594751999 +716284014 1928958717 3073060378 +468680324 2282255117 +1112159274 2252980117 +2773429024 2553235096 +544841453 209006340 +2012229146 3910701803 +745051621 3450074988 +4155490056 187642420 187642403 4155490072 +2323190697 2113381119 +1991332270 3773149855 2267256057 2267256046 +2354663497 2354663513 +2163227701 2163227685 +318032591 3390831629 2790998990 3581775301 1625397461 3984438171 3651546395 766622158 3819322575 1369630712 1352853090 1383115861 3182154584 3651546380 3508274972 +844464317 2061888137 +1383323545 1700554184 +2156378861 3832987763 +1463609263 65058936 +2656581173 1097692634 +1623479431 3692105856 +2672447974 2818501911 +716056945 3717687799 2635128321 2635128342 +2197507423 3523937953 +3732481713 3921143984 +3330604194 626635523 +1782334180 2251532071 +3623323962 883754571 929097749 +341969598 3562465545 +2696367825 3515945734 +3991710077 143577044 +898976305 4244163798 +2958564926 2446467044 +3928719056 2833656637 +724829025 3238938984 +2624715590 2372833079 +151811086 3026982926 +958543531 958543547 +265742212 1934521545 +3395823473 318117606 +1585387896 1546955283 +1724822540 3815075553 +902396852 1613610063 +1383323525 1365001804 +2372673218 4069582542 +1662264454 1662264470 +2524884811 879620884 +2743990922 750092787 42034989 +2985456080 588708296 +3918083749 3918083765 +3282531096 412757709 +76137239 1856500372 +1931362463 3617569374 +940374573 3387295378 +2233567547 4163960401 1577643562 2575141656 1669483259 1403308883 3434551048 +2740984514 3450824925 +1524501996 4153404055 +3398687706 3234011179 +1414048950 1684529799 +1086513848 2865424301 +1250697449 704281445 +908981841 2606416262 +294686973 3082779505 +285694457 701928926 +2909261000 2909261016 +886947288 3961247091 +4019906453 1544997299 +4056568249 1518249512 +2237486022 3085623457 +2692763189 3740999036 +1645826807 2564470132 3731449257 1692244678 +4257315864 4095046668 2408995291 +3126071347 4256182349 2236973146 +2805219626 1631753485 +1053848905 1053848921 +3800644096 2651213331 +4250788695 3450559944 +3734118687 3304477643 3734118671 +1963124190 2331391100 +723021647 645347672 723021663 913789598 +3586064021 279626891 279626908 +733438162 733438146 +2654896725 3471984578 1334095915 1902586844 +3553668983 1478796770 +740394939 740394923 +501498052 2667835915 3528586376 3528586399 +3445157622 38225601 38225622 956312903 20867018 +488143451 528680233 +3637945113 1927463006 +1316492521 738828878 +775117913 1388657749 +2421592776 4788427 +2487810501 1223536067 870396186 +3657558723 4093939946 +3878567097 2220522565 +2964390906 547963531 +612847972 3842318441 +3655949973 2673861788 +4105004687 4105004703 +3413964419 1640073252 +1370009340 2290841265 +1052677285 1795424172 +904019409 2754039824 +999478425 1629793502 +3468306868 588228175 +1597112908 707994743 +1854437212 2855181516 4069705735 1557390791 +1063378826 1055173638 +814528239 3686983226 +1392653975 1132195750 +1136021403 1734740261 +504124221 2322008340 +1326072697 3989771503 +3816725720 4166051853 +3453047621 1166415244 +2312352157 2504038946 +4214748666 619512686 +2042229706 1773848301 +1696536639 1806444861 1566504871 1235215544 2988640223 +1332948775 961755766 +3639469463 360737958 +3666101145 3013753948 4133715925 +1308411318 2967900682 +2322234468 3807571166 +2681079421 240400066 +1125547086 1125547102 3932532431 3932532441 +3803414591 529720104 +1566029933 1578587026 +413604421 336485004 +2249670170 3946257142 +596084824 907875240 +1515396652 3909384592 +530045244 4161468775 +813828297 3356977465 +1055588631 2531346208 3755305266 +407848231 247851812 +1014610088 3684544619 +203554318 662892569 +1591903967 1033523486 +2377365653 3576927812 +1040074764 768377249 4022193862 +131925661 131925645 +1462299230 382487118 +3972952401 479072007 +2635420606 110285855 +213345595 1068784621 +1313199475 507730068 2867790874 3574489715 +4082460143 4268717870 +1744798755 3661431562 +2253394708 984818676 1528256127 2215512175 1543608591 +265790662 3061343137 +3223982560 1428758338 +794834710 2859906983 +839324248 421650587 +753669103 2335312684 2795725102 2780665489 +2130103560 2147479604 +2327593046 3159967591 +404094878 3373471946 3574803369 +3877245064 1443366429 +1991835014 1298105238 +1220427335 3397126592 +1682223968 2305382956 +2578535707 2311019369 998296286 +1200391236 3862181663 1518795949 +711790259 304241207 2091787212 4126556109 304241184 +1774814357 490452636 +1270541729 3628340320 3047228356 3911988678 1554150407 2542169901 +992793580 992793596 +2952804893 2952804877 +3932160993 1824241179 +529185419 3841798393 652395950 +1619775703 476653866 493431472 +2596444002 3641286774 +1819581667 1331398646 +592025252 819471401 +2337092155 2240156402 +1239842521 1588557225 786018206 35166735 786018184 1521446754 +1789611678 2309800617 +1233632083 2744608704 +3730978286 43705785 +3614248511 3523406031 1605201204 +2882231226 2962439829 +2161100616 499192931 +614665648 1554943005 +3501263284 3187862304 3276934034 3310828315 120073966 3025269729 +3059909233 2540924196 2383632368 +1678176685 602829636 +438132022 438132006 +3909416131 2513260266 +702103777 447775914 +2479855017 1489541390 +3419647890 2208469549 761209865 537510846 +2587840160 3517941612 1906886117 +3869974726 3610571426 +4085522359 4085522343 +789884582 1390104370 +2755268127 3083372764 +1910307096 1457266907 +868212838 2557457410 +1974506911 754523228 +2400959689 2400959705 +1287098236 1089921063 1973611815 479792684 +405947207 1579149526 +1102149255 3693648634 643770739 +2639523625 1083208063 346964315 2126030488 +456468019 1583807926 +3241240365 1304783826 1304783812 +824904843 1824024504 +4141586850 1035131413 +2095049861 2095049877 +1650784984 2242239076 1650784968 +1792938490 899042461 +3127462451 245048148 2797588058 4151717453 3691701028 3421618592 +2692645595 2854781659 4249817822 2356843118 +1766030523 345328511 345328488 1762632069 1883069028 +3488257642 3091908813 +391109581 3206205733 +123928096 4059397311 +3181177555 279321901 +2604709510 3667050694 3974059255 +1757683676 242905727 1616377700 +1974676710 789556759 +3153906475 3486641237 +1065020822 2223244081 +2594440274 114612222 3205498057 3371750651 1521960754 +3513971103 2989952736 +2394748727 3933809542 +1447801529 1454013576 +3705804930 3420400186 4154387065 2386706208 306798451 306798436 +2094615998 1209360927 +1840750354 3390007621 +4092585763 1691516944 289536157 +2446302141 1188178580 +1939297394 1765404531 +1229061563 3805441157 +922264080 2573672227 +92453352 1955454052 2013714452 1000891856 2013714435 +3691712539 3027012590 +3714383453 3808193652 +1450105908 506041828 3176186766 2815991837 3050378377 973696601 1149543887 756641876 3050378399 1159304734 625268763 739864270 +286163746 1535095224 +1247417053 3905663476 +1227875624 1583726077 +2118826440 2294250661 +2304056729 3388839880 +3565775897 924008098 +1051394282 2436001869 +2839350149 593629415 +672153793 3626273251 +1314439537 3333981414 3128505878 +2731609419 2812950127 2585259284 +1751995923 1751995907 +2649790546 2649790530 +3475718554 3996467494 +2325509731 90027606 3048233578 2538495434 +3417706990 2912834249 +2400498875 4170744420 2400498859 +2461013541 1870408473 3529121036 +865520461 1217550305 +1610342892 92579479 +3889243357 675162380 1192908708 3886794993 3500909745 3692263144 791954096 +92055347 3594204492 2335499959 +2910517381 2643802458 +3110642061 3378264763 352414962 1823887588 +2551113676 729212471 +4205945166 1213120532 +163809224 3950508719 +2977429134 4073702891 +1913006427 2347915528 +3024619751 3026584502 +253714292 4104267580 +1478966396 2662288664 3155782918 2662288644 +2956598091 3061380866 +1535780563 505065773 +1549269337 2810015224 1549269321 +710674188 3135182824 +2575237794 2325562301 1156654357 +1053600327 2789033049 590351808 +4021740621 2850645298 +1851258538 1585008013 +1605583336 2797510677 +4166548133 1963386845 4166548149 2554925498 +3628063235 1870934698 1870934716 918591317 +2401020670 1210133961 +350499474 3730372717 1966840773 +1354413722 2951574653 +1837761457 1935166376 62906945 558092198 +1304781951 2514007594 +1292841719 3832780148 +3252518475 866029432 +1847861845 652803479 1121488620 +1325094948 1014103863 +1352219119 3493212984 +266572117 1480444106 +3368446592 2421794707 +626766810 3339101109 +3894895329 738774289 1459660854 +332564582 2590816407 +988680728 1500832691 +482851703 2306189013 422613474 +1442975719 1279199414 +3120026752 1092846995 267071564 4654520 +1557434617 1145642296 463484904 222579055 +4175426326 2828556313 +2262960279 3973285296 +3078687038 231759433 +2927512683 466766946 +3869651667 3936485946 +3203418488 998332947 +2485400672 2978956076 1871766868 2499703589 +3596322264 1242805019 +401059646 401059630 +688820158 1609320479 +2152625270 1904301521 +4163490194 53118010 1003808979 +2808340579 3064740688 +3845163167 1785139784 +3034911574 446525543 +4160359538 3500250981 +1756996114 1845715558 1246688093 +754045989 3482557789 3853579834 +422187562 3342505997 +2688493717 3375633840 +2668799875 2189406249 3488082544 4010115148 3176202881 3124604893 2027547753 +2996680843 3441114927 3092205863 342017642 3441114931 2066194722 +4201290047 4201290031 +1151443659 2557904879 +110332850 205842725 +1205708247 1205708231 +1839556320 2069951141 +1213950752 3640255029 1820722434 +2608136598 244005265 +2520046620 2848692944 2848692935 3634520332 2436268049 +2529385002 3975248102 +3391646795 2513078566 +3449122727 3449122743 +3088859744 880573733 +2308182392 202866669 +4026564322 2999434691 2818532244 2821361682 862960125 2935975576 337320283 4020817383 +501498050 3495031157 +1472173021 4288005346 +3336217828 3289636749 1746947044 3775546584 3842657051 3775546575 2100936430 3996226281 +2173909273 331539038 +3720967891 1021857600 +32320407 2673581734 +2054425976 2012528132 2012528147 791253248 1018246125 +3341739228 1652633932 +1868004202 2964801485 +2103437991 83780854 +4244002665 2697697870 +2048099431 2900909156 +2690199660 3630643735 +69009915 376793925 +3937866991 1832252462 +2157893237 2034479116 1967368657 4010515004 +1731918695 3906585376 2932747123 +2664790539 2664790555 353312596 +2666692802 2371305162 4190155107 +2846952137 1188881957 +3779498163 3175918624 +2736428816 3269178643 +3751372593 796750384 +3619318221 2390429490 +2091503167 2091503151 +611650150 1685044464 +2344784676 2285206808 659399081 +1236296302 1713165039 +2234557024 2350847045 193961267 +505152710 1276658417 +3993903052 2352746039 +4192988482 2488909643 +4077296305 1147503792 +1303796851 3373500684 +3143941443 1309250342 +1590830170 2664380843 +1319782094 2752345689 +1513060349 362856692 +2121957442 1091516246 +3801463791 2696337720 +3207093070 3538749708 +1248263307 2870972098 1706328949 917362616 +944923062 301681106 617009461 +3787395441 3502798064 3250807287 +2439213340 3916896208 +1839827562 2946390950 +1359172741 222170458 +619640708 2821694687 +3024596547 265769852 +1786223334 2152257537 +4057352423 2606023584 +471894232 523725851 +1635560389 996440761 +3395931052 1351327681 +968643464 968643480 +3259038108 1749610641 +2778457301 4121063340 3875438404 3869399071 +133046482 1306372755 +2234355365 2973625187 +2321554676 1435995128 4263519049 3247286420 +689585298 1721733216 +1171376636 1109611091 +3107361571 439880314 3476708509 3018432522 +3917002423 1074242054 +2184681966 3951514041 +800007435 2932744782 +4070914221 1921507611 +236643745 1320742352 3579280502 +1661449341 4138969913 +2639904255 3007715454 +1975897586 1482896371 +249507447 3644906384 3628128778 3818726211 +2967077994 481276899 3509908173 828001989 3760200102 +3394714589 2084803909 +1320902053 3385066205 +988870693 2726103923 1885431702 +3999634223 466591313 +2964783705 2964783689 4024460585 +1058840021 2046636228 +433341360 1823582987 +1604443636 1309822024 2144364313 +1909604201 4182118617 2532954702 3980787173 +4222374396 1639429041 1095600556 +3818921707 1074834420 +370725697 169119552 +796475916 3353540855 +1336199809 3781871872 +3135321814 2472013547 +377559263 3092953879 +3208616321 2451482112 +1877551020 3621861591 +2076769836 157818711 920032293 +862347476 3190451641 +2049013722 225089217 2786991665 3631740061 +3121411572 459331659 752837657 2733400414 2313959950 +2468405251 52327783 +273020816 191503412 +1355226808 3782564795 +3963921113 3373030280 +404647490 971477475 +1026341625 3613744841 1181373950 +1591486669 2644110426 +2270127461 2270127477 +2196458003 459637418 2196457987 +3225582286 1990677071 +2051946127 2472586788 1918920884 3413351281 305299148 305299163 404742936 +2886082350 4221769081 +2632185159 1104879318 +2091576443 2516995564 +2488457678 1282203471 +283388995 3660688764 3929130682 283389011 3660688746 +1168798707 2656339866 +404780713 1363126792 +2059804228 2313266441 +46610019 46610035 +1186384350 2850594814 801097855 +1907860826 1578716349 +2905665066 1877323397 +2628157553 1667403008 +746473580 1993081367 +3413763685 3051729132 +2386895682 2386895698 +1947155573 2127430903 2935588364 46417747 +2295788501 3806499896 3216974345 +525326484 3736203513 +1622151468 935198295 +2707478976 3413559635 +285565417 307135273 +4012790366 3823872489 +3810285823 1238843558 2225084798 +3980970694 34180871 3823463754 34180881 4027989434 34180870 1335309751 +2176351281 1718321456 +1019878980 4130186505 +1848219631 1517956408 +2946566526 1305337810 +598309319 3939152982 +2604693116 3799680295 +2418617208 1087261047 +3301961228 3746807031 +732349781 210281674 +3315622935 847089702 +2815673632 2193001876 +819680946 2880136345 +1310810666 4056760965 +3081406422 3882223041 2963608778 1918483105 1313526122 4151563761 +1998277465 3640106270 +65578257 943446480 +254827069 539125713 +1548762782 1548762766 +1885809199 560424952 +2994093650 3956355442 +1556847487 597378347 2741239233 2475018472 597378364 +2444017386 2444017402 +4062324400 4062324384 +792939960 1595182401 +3885267849 249035256 +3102013339 3961485211 +3651382640 1641789872 3169144852 3169144835 1008390447 991612809 +2940544662 1844205409 2145107505 +4195480437 524435772 +2556248530 3002194615 +2763249331 4196072410 +2427381819 2427381803 +1947263468 2996027303 1869552896 1947263484 +1421963363 3481529301 +721584713 3260345311 +1137076088 693428731 +2247244620 2247244636 +2592245955 2401170046 919978404 +720702344 356854412 +809510962 654263973 2131094583 +2671709400 2141923728 +4048774879 4048774863 +720142050 1951120853 +753345186 1787865454 +567837 715377570 +1136565407 1141935710 +992166352 3900742261 2004035132 +734581710 3941274447 +283572446 1303170373 +1182049652 4237893577 +3569908516 463067561 3340554404 463067583 473015567 +3808720174 567478429 1059888547 1076666169 630449658 2382657401 567478410 +3907248837 3107647683 504618218 504618237 2570971194 1673395226 +2480730593 1071222288 +702979353 94787490 +601897759 983957220 +3380450047 799958910 +3150154011 2088395579 +2341346370 71637310 +2120024481 2372505696 +2408476725 2408476709 +1649512480 2131528889 1649512496 +2222762734 2222762750 +3615250578 2166971657 3401543109 4267303725 1318995646 +2037206212 3943684255 +3882055456 97593928 +688029490 3236838309 +1517949806 3693909561 +3393247355 1419442675 +676296992 462548927 +3461477570 2365869429 +1943658523 2063321732 +3939478276 2833921865 +1666619857 1081390454 +3307985628 2477569915 +2058544703 3063442923 1721791784 +3705826176 946813587 +880792688 3247147485 +1424769265 3132852189 +2762182733 57989554 +2550354753 2386300736 +2095195097 2005407660 +1971202136 87567347 824840352 +3743457825 1633630688 +841987951 1880998830 +981026083 735587090 4233638650 +3937862969 561576747 +1575598189 3060092123 1139626884 2308611352 +451165193 1581941304 +1054820807 3229688918 +3791779684 756576895 +257579888 1142840840 3078809803 +3938458793 896343566 +1836115050 3718305269 +2213557197 2503592054 4093670676 2503592033 3116575015 4110448298 +3539969919 2809441534 +1634767058 3149019620 3319910705 2826714839 +1125991739 3379922920 +2975856040 4045467303 2092970922 1941972362 3246069805 +2277660072 3956750787 +4186274765 2585912228 +1405040717 587571492 +910882975 386228808 +2770863175 1560383300 2006075417 +116711815 1442369156 2764757465 +1018384477 3281141844 +3635788344 1578378797 +2386001553 254094476 1295386678 +1194023 3951662643 1135502688 +1258762799 2369516411 1263796216 +2787476680 2787476696 3308965364 +2807536908 2062301687 1658789175 +4224895178 919737837 +2192709391 3445247118 +3421744222 1855477759 +3119433326 3119433342 +4115207713 1124980214 1393422128 4115207729 +500022770 500022754 +3711042714 1911112291 +2946160055 666791686 +2917234842 1408293483 +3174924041 1020616316 +1837806085 1985363404 +840717919 3498486539 +2982147258 2335064267 +3887359658 1795005851 +1976104142 2468009315 962158681 +3236225327 3901667963 +1202187381 129917833 +3178984504 2170025005 +3218067362 1567840426 2518932483 1567840445 +3870349870 1449621103 +566983704 1263819213 +3592048392 325740939 +1735266771 3424415578 +3464769704 163056853 1436446736 163056852 163056835 3256391805 +1434428890 2603712394 3917654225 2333664675 2333664693 388478326 2333664674 1911690795 +2234244015 3282203037 839678202 +2871363637 2702535530 +839121968 3371325749 +2299887019 2010436642 +2508963016 2425281904 483902947 855256779 +3512398272 1378521413 +1795519448 1368743181 +25647968 25647984 +1044396271 3994656814 +4202860917 3498769212 +1941416076 1941416092 +406808634 1708200797 +1767540546 907734953 +501498053 3545363980 +2534480460 2534480476 +1112093679 398249990 +3325162829 1302669348 +1253598422 408641441 4093747095 +1236682011 619628932 +876289639 445286002 +1731988799 3263748670 +906659586 345147427 1348354761 2443993598 2242662154 +2796664622 2546163055 +4023797190 1414518433 +2829694825 383142105 3962288718 +3140616567 4211746371 +2280826415 838573038 +930189078 1606935821 3945509162 +3778568521 3658397113 3569427950 +2901173154 3833201606 +2354308789 2635345660 +1956033672 289288732 1105781667 2598298209 769547936 289288715 +3207770854 1491323791 +3562456437 1127254633 704070114 931413982 2999045257 2358791519 687292508 2037751100 3644477639 +608504526 3870294617 +865287273 1677710809 2580027726 +4022352121 1365631303 196722140 +3708063160 1054331399 +3256189231 3067763960 4156840017 3519044219 3519044204 +1897127597 2940701252 +2461839703 2802316323 +160332641 3739934040 771674938 +1235080194 3849633589 +2258670621 197732788 +1808039854 2184732654 1414856431 +2324998887 1262102259 +3358619428 1013902640 +904527225 426282556 2276889205 764924518 +2682318936 2682318920 +3421349896 1805501237 +926618438 939480865 +339713414 1713699297 +2345044482 2351955404 +554127505 2407781446 +2201209033 1401230446 +2957617975 3136849808 +1925553831 1410908384 1123524787 +2268693951 3789708929 +2531897977 182711422 +3490673345 1230087616 1230087638 1498529552 +3393830865 2272077860 3054804888 3096544553 3054804879 1125709318 +3261229671 957184419 +4272541855 2104283501 +4200230546 1307371834 2925268947 +3815885388 1571564663 +1329973513 3554375992 +3254529562 4087039989 +2468577383 132325921 +991729563 2742713829 526772805 3939327782 3369623348 373077970 2504131792 1550028244 4255103137 2275973108 349125035 1352719167 2723674442 335356428 3344046630 1491881907 +3319530559 1589754858 +3303793656 2185291904 +4179180502 1921617590 +771956526 2632586617 +2973393616 782872380 3471412597 +1510863976 4093826691 +2892880462 3203311823 +4058103016 2074321034 1436787457 2925289771 +2131331013 3238050572 +1370527257 2986101064 +971485079 3199822502 +1972989024 1033455853 1368932297 +1795286559 2466071262 +880097557 2844318748 +1873725501 3013028642 +3418902773 2320681171 +2419695899 632855954 3705366949 3852465864 +304056432 4154706005 +2626461453 2120114546 +3230469071 748906850 +1465687806 2228111817 +1286183352 1128132045 3907342912 1737930384 3077203904 1788103986 2708096316 1727855803 3443639379 395267409 2038963032 2929276256 1727855789 +3511697658 3511697642 +429220415 2234100030 +1436223673 2301674142 +3565028903 132977700 +4063789011 560579629 1446571736 680027316 2596077632 +1873192276 391529263 +160982643 2380875546 +3590944526 4276513561 +833009042 3825993773 +2466361227 947770428 2821715061 4138162114 +1074163340 4117367479 1444939361 +3297044122 4135054774 +1580001478 112357303 +178898312 64280151 +3775558846 24495903 +1989506822 3276437425 1989506838 +161089085 1517802004 +2065387932 1744926855 +2929834055 798300118 +1696374967 3809542150 3809542161 785195194 +1846999610 2820686082 +3929822640 1828381699 +2960187309 1857035588 +100913087 4108586113 +2274383685 2906218906 +1612271552 131631955 +3117991575 2059100675 390104726 3117991559 +797057782 3218934097 +920175732 3409789593 +3185770965 1259420275 3244024412 +3733121043 2822269338 3733121027 +3860027024 3228648629 +2178020955 1066935141 +3523958494 2245640041 +4108299101 3584976661 +3462774655 196643671 +3217295761 1922764624 +2777181276 1200535710 +1728342631 2465431606 1968353892 2465431584 1968353907 3746337657 +3269158735 3269158751 +4021417285 1114272636 +1761010042 3321121174 +2446251202 2863302694 +1444017732 3661782748 +3073115562 72149645 72149659 3073115578 2666621974 340591581 1612010002 1612009989 +1786486019 1150081254 +813031880 747349581 3892753130 +3396658038 738333393 +3990337027 3990337043 +1985697691 3345797448 +2073367015 3417209829 595224050 +3403048852 594870015 639853940 3817147897 3817147887 +3355040542 996781118 +367277101 3436236933 +1966810423 3273364880 +1180900624 1327901417 +1207762865 71730086 +924007317 1360368388 +1770514352 2247425929 +3283175265 3078391174 +1421551520 43999461 98928748 +2865245551 1210025390 +3291133243 171658226 +2862951135 2164423944 518706059 +2419466476 4046836631 +519000611 2526241552 +1978728064 710976403 +1397440105 1397440121 +3522094943 2063530874 3640534027 3658889864 +111912195 111912211 +1478789743 4113425373 1092865553 +1958969929 3990437560 +743121329 2611534631 +3137102631 3405474251 +1230862172 3659720135 +1820220707 3991707146 +4158764383 2538636424 +684886279 1248704000 +2510539960 1222329787 +4260190746 4260190730 +1908993678 2907670937 +2166460215 946990004 +701935477 316036745 +952342461 417848980 +3068408073 2813143774 3745590779 186867231 4063834424 2114481016 2114481006 +386628029 68199554 3895654581 +919394508 919394524 +1160978989 478072004 +889820045 454254644 +2985099177 73231128 +485179729 3612856966 +416366890 3737364117 +3938147435 783936152 +1039485194 2468477627 +1735886385 2106636196 1307563981 +3229439381 2588785034 +2698618106 2742241693 +1824268858 518891779 +2206853175 2712169652 1226346128 2712169635 4198555497 +698542046 1769144937 +3206589345 913515462 +2526553973 2256936234 +71317037 1837212293 3725936850 +3908160755 2812650119 +1347195958 2675346967 2769526031 2675346966 2997588362 2660061447 513912358 2980810740 2675346945 +1146712471 802017456 +1296818315 1194811915 +2732681014 2664790535 2664790545 +3524541221 3671661370 +3330396833 3621921478 +1942263642 3010917154 2558149291 +1120059479 2479254275 +3215073424 2200175356 1010385589 +2926999400 209582251 +587734709 3402120620 587734693 3670562538 +3889371545 1058943055 4080782763 +1274070229 104347002 +2413525766 2782743427 2142397507 +773367782 1993363223 +3144279212 2747317719 +2216764526 2216764542 +809633736 3220324299 +1138994794 1934954241 +2784625222 2787922566 +2091682691 3332349756 +807920308 2778559634 +3720284961 884901088 +2061511625 1858737247 +1974971323 3809862647 186865522 3775708182 +1246092915 1246092899 +3612329703 3650493878 +3962000229 3438401911 +1658524724 1193164893 +3391140451 2490945994 576134523 +3095230515 4230258592 +1005777501 3580869577 3108198315 +3104712084 3772638892 +1141934970 2685112605 +1082791884 3163747831 +4001341299 3857187354 +1889829369 1274583784 +2658642566 4234244343 +3083047674 1122000779 +982603456 4073427013 +364886780 953375409 +1379585231 1099983320 +1650225376 2356482988 +1356192059 2074408946 +1894705421 3575177060 2930879803 3894919282 +56047151 1900694510 +3290585983 1091963112 +857425662 1911603657 +3147900867 565286890 +2441296629 110481340 +4164055175 1046946966 +4211101583 3978870746 +4147623088 2270498573 2799649736 3702616323 2153055243 +1497397601 3783201696 +1546722257 4065249798 +2697072573 2475851426 +1922569723 1778159468 +3633568825 2097840649 +3301210787 331956193 +1733771393 2727191102 +720902812 1083302791 917060935 428421260 +728094435 3086177735 +4019009425 2890824006 +905852905 3889299903 +1128039994 306662749 +3709756751 1708751704 +2521879974 2528544159 424414148 +2847485230 3642358446 +1731954117 1202951450 1202951436 +964823329 2830393056 +952026287 952026303 +2626809192 315488148 3786980029 +2190730681 1204986408 +3098073482 1003385915 +4246002736 4246002720 +4168332350 1545911711 +2246700854 88314385 +1356114483 1561022029 +3389460697 3389460681 +217745430 2221161137 +2432498361 2432498345 4148080936 +3167361624 2317842573 +2272779215 279905998 +1171376195 742277500 +2570577098 4244449773 +1789611670 2175579697 +3216382567 850104352 +551830903 3226480911 1990798324 +2442867874 3929615529 +998773008 3341999139 +1175164668 1077849767 +3021743242 307070267 +1974971327 3624175023 253975998 +1268835147 2632252526 1786339641 +1630802710 452594609 +739477828 1169839108 +795444162 2341829067 +1791711175 3843763776 +3572748142 2848950831 +648857223 1850640282 +653913360 1483794408 +3891564986 3891564970 +536217795 1654426278 +1408110465 2697095190 +2512114433 3081579158 +551227146 1981278835 3268979899 1981278834 3268979885 +88348447 1596996042 +2518413957 2165559997 3808354460 1973364865 1494994540 3539912538 2518413973 +571494295 917326512 +3749925314 2646193269 +1738022792 62658634 +4241747444 4120876825 +491868272 467017307 210724316 491868256 +1529621436 1116264689 +3119700795 4098825714 +2702504840 2475304880 +2841374507 1335017177 +1319045308 2153431025 +501780086 1382626646 +2352336119 2311049174 3210682439 3311348180 2947655878 4160393679 2495932461 3182499600 1412488871 1878730621 3311348163 3755680909 3165721994 3316720554 +3776438976 773976696 4284188812 412742725 4284188827 412742739 +3472908897 1050336950 +173174324 10181246 +1079170311 3596977672 762709573 4052991219 2118064567 2324475410 1166095486 3918770265 2324475411 1231378944 2324475396 3935547903 +752518091 1727887517 +119948453 3862826938 +243472864 3873072300 249842343 2312878357 3093412773 3537280674 +242807202 1784963587 +2283416602 332122678 1530096893 2096395765 +801020620 3851071735 +665464672 3504903205 +2472787455 34970327 +3688167906 640953579 +3591844225 2273504768 +3893376467 612678458 +2613142642 2742099813 +3115513007 1604824785 +3215814147 3215814163 +2441074307 302348823 +577990531 3199765290 +3649280611 3442215381 +4071992928 1946255667 +636851816 698074539 292229637 +2133931730 905153389 344072680 +1033155523 3021405162 +631259231 2588235144 +4034751028 4118108395 +2792372683 3450534530 +1181673477 1192854589 +3769097023 1025233015 785574634 +2468841925 2070500769 +1180605620 3789818121 +2341850715 399759698 +2649199951 2649199967 +1138856842 1713062445 +3125564313 3358600783 +638155948 3381795644 2644907479 +832590625 1369560913 551302543 1520559476 4085299544 1080220896 +644156116 1158679472 +3885439335 2061664160 +4110443895 648002128 +4256805154 2370951299 +3116958879 3995196460 +810032659 344414188 +1621780161 1365124080 +510773854 1260491241 +1905290752 1235822043 +677051698 2158446118 882943893 +2497344456 3633547018 +2034921614 3374485902 860347919 3854157576 84204280 1657979993 2667056442 2117021593 1540536665 218425234 860347929 +3609152019 3320956141 +2111552239 266815032 1368710087 4156064657 1091799596 1091799611 +3183642519 277328009 4254436098 1346073264 4254436099 +4013981239 4278710964 +765150457 1906296965 914356446 +3800595405 1775952804 +3206051751 2055494646 +1914242241 1795748337 1583512534 +3765608375 3765608359 +491294953 37494471 1269068630 2583530393 +4205204061 2335319337 +1893262784 4056338914 +1355101066 1665690484 4286966049 +279803672 4237714144 +3292333836 4161935351 +1409918281 1237689118 2486120942 920988895 +911983334 2175090717 2020855809 +1655031832 1358494556 +2949262404 2949262420 +3964206181 3964206197 +946076833 1718006112 +2116124201 3907295531 2412341129 4218618580 4174419719 2849899951 3291092234 242754955 +474644165 1204618212 +693940453 4146097109 1947965506 2810223919 535291195 3601227576 32143482 4094366248 158380021 4179387176 92255267 672897878 190621777 226476217 2115741725 109032889 1735242050 3841666631 4146097097 +1929022678 1929022662 +938462454 1542739137 75474769 +4146055801 4146055785 +1639231100 3640923925 +2897340624 1418437931 +1768261067 3439108847 3050413716 1136556341 2679405753 3439108856 3439108846 +3693072803 1195584541 +2030480116 2038373913 +3843163822 1231061999 1911533870 +2819830291 2839008236 +659205389 1570773307 4147324018 +3403910822 41852544 3281993431 +3484454039 3499595796 +2707811186 2296768345 +642126501 2495120896 +3576107779 568952922 2705640817 2171424753 2954156144 1575904236 1559126614 2954156135 +3049818704 2058468348 +1431575681 1998008240 +3369347468 2582235297 +1248497156 4268368623 +2186145731 2969354535 3603874865 2969354544 1017789489 +2743117246 2743117230 +1465592339 2541960172 +1056605794 2254539861 +149763741 2859268386 +388584214 2349714343 +2411035649 1001534848 +1239933373 352869524 +867473188 4293971580 +2979788724 1283911759 +2962096422 2762099674 3256261745 361483969 +2413321381 1378787350 +1479496210 94976173 +1041796411 181800959 4221981668 4221981682 +324643260 841364209 +4011003692 3412341395 +3963965916 3695845452 +3035506910 4156282626 +1276951233 2453274048 +3921365085 2013722709 +223977536 1575286520 3873275881 3516955228 4120986139 1142375635 +1499682267 3656752613 +357286869 1531267146 3256452135 4082547856 1583870205 2594201155 2594201172 +237345445 3929174444 +3520305517 3172632196 +400832329 3846375406 +1753860121 2007420879 +4227394320 1052725736 +42415720 4010124525 1510367056 1658496427 1530062979 1493589450 +2259818613 2828911130 +1039302849 2709532867 2757021168 +2242959899 2422691986 +306974964 3250499599 +2146428037 8947208 +2334233275 3237093726 +2228571212 455140023 +1812148548 1095862809 +3705983253 3509920778 1621605306 1476571699 3509920796 +969046986 3072909037 +1652305269 1953271045 +186555235 224454660 +2193096834 1000060178 1662149415 1806930969 1000060174 824527374 2093695599 2141232476 2545558685 1235799221 2612669161 +3390007634 1749208083 1749208069 +4255917187 3640490556 +3001461205 976560749 1981635146 +3643734367 2128184843 +3503343497 1101667512 +3141048862 473613506 +1010309622 3260079697 +2830878150 1704482465 +702072920 943940251 227986138 3013240317 613871386 630648992 521413619 +3649888343 257918135 3477278745 +2647328223 2580522652 +2087025303 3157865986 741204361 +2436890348 2478722440 +2478785270 2350278983 +3510503548 3769064231 3554139925 1156696555 3231293602 1457897781 2240446372 3748960561 3554139906 +2083587384 3879885916 +931161872 1780009015 1008385484 3542394344 669511019 1864515107 +1642066562 2508898979 +2350054264 4192329211 +3297641832 3433287573 +3142002132 65146099 +2958845011 4101107386 +4230862901 824925052 +4196449234 2475142035 +1502153094 2025455095 +1077660126 3961433945 1077660110 +1280164669 1533696276 +458732919 2182261318 +1009870390 4156811025 +702325142 2085773095 +3845209484 1150933446 +3623563773 4251955540 +4168994455 34241929 3305912240 3795560980 +167035586 1850644323 146297034 +3818918781 3523128788 +1925821230 3148040940 +1804041187 692586058 +3655470754 3356185846 1173699239 2698840341 +676462929 2850367713 3390575238 +967293744 4077628565 +2576385415 3395743290 +584370188 3774278391 +3548901962 1775083442 +911250271 3909464074 +4240180668 1932253701 1321473032 +1561794364 3344536433 +159855533 2899728708 1735302162 2872928795 +1325617795 3845841980 +3230822214 212010886 1820666679 +3102979066 2091772550 +4175682465 4175682481 +4057340976 2543875996 3826147221 +2990569752 4078348992 3413763807 2502658476 1565991589 3507344154 3910007008 1565991603 1565991588 3011420365 +4076450969 404180190 +368594516 2917810100 3923988015 +4111540597 1239577370 +1566658569 2472134584 +3983667780 241197343 +2870503415 1315678662 +3139587163 925545503 +2170980044 1172472627 +2202972649 2008271957 +2459675171 3236754391 3639417245 3993818378 3363098052 3656194851 859944970 3660806928 +2093449358 4228865945 +3135370683 3971339634 +1003480869 1296621356 +262406673 2114020119 +1540397081 2724163422 +1352764776 3499285584 2675349379 769298349 +985109218 985109234 +445731191 1851463668 +1437796751 1437796767 +391901526 465365607 +2179164081 2234491308 3339842660 704396199 704396208 +3847772730 2041618709 +944496552 4093957076 +2967466786 888989738 2458631811 +3022438956 3305352023 +539292041 106192878 +2212719317 1946234204 +768296867 1825182864 +2986854324 2224090836 +1826953009 2644738608 +2428241050 1912290941 +2744016708 3260249656 +872234031 2610713723 +3014762880 369222446 1108153528 2731689307 1621179539 +13337732 13337748 +1492657485 1537390642 +1816594139 2641197285 +1552352515 2878137276 3402268912 +3887985613 3977816754 1784550267 +2051947461 656172086 868158137 2762277636 219918999 868158126 700381933 3216094319 1755326322 1738548716 +3772112012 2091528311 +894225116 3286456391 +1200489459 1738138341 +1039661769 1449118328 +4246185455 1530541880 +3471162636 3215497719 +4071240146 3555487109 +1894705408 3357068051 67606747 3372189496 +3763928999 849635748 +3553157682 2537297075 +2883870064 3037838027 +919005318 1726639335 2104627459 57757123 +1853768688 3771003587 +2267082741 3303758204 +663993831 882111158 +2126207328 3773674021 +4172466638 1332981583 +2744385924 2784120516 +2533529378 388365820 1666853949 1578191598 3675515541 +2584329562 3523940353 +3779469525 1986375516 +4018981730 2037389949 1654086062 2091133781 +3900336384 4172499717 +4001417978 3800195011 +2955672217 3853039465 3996876510 +1717640666 3670220213 +1394750188 3693308148 +2992996974 717653946 3348118655 +1433487180 3674763639 +2946861257 3634817337 1251365998 +4168360627 3520241626 +2068781074 2068781058 +3093907221 1656415754 +57376674 2855176362 2855176381 1583278190 70904835 +12923948 1651581249 +1926427593 2333459832 +3805517571 2177262311 3805517587 +2398501608 3856711957 +3701032964 2889379064 1229741641 +3409557079 759117780 +3012291848 2907054987 +1357668904 2433440323 +3052284526 3435387641 2335439922 +3218632271 1354081870 +1897942950 1693592910 +1756182883 2687219204 +1627174865 2127912454 +2342598686 3529123050 561572670 52058175 +2797588032 2797588048 +2580516003 3300549788 +331349405 3704999829 +335326864 1676953400 +3903655975 1869639008 +3935648580 1938294755 +3800587907 352268324 +3406127734 259653585 +182338525 4175746292 +3243425558 2167202807 +759398989 1409100015 841110267 2386960178 711138213 711138226 1052426388 +2476105759 1958301918 2277124811 1958301896 1702916753 2277124828 +848579186 292630885 3895515149 +914500613 777095780 +3383119188 91781437 +2012801733 2715390988 +626722506 518500256 +3751846261 2128489270 +1586926062 506381086 1057721567 3574053294 3574053305 +2811460274 1650074202 2133468723 +3399997867 2973476898 +3159620997 4248311884 +1360607265 945101206 3428435847 2707014737 3417529334 2707014726 +128070913 30161958 +416696090 3036252386 +459907308 1034821767 390400412 +3196744966 1191172329 2631785700 3577920255 4120568657 204151917 2782784272 2648563322 4193663073 +1778062247 2203318707 +4068041033 4262733304 +3275333859 918046044 +1342959708 1590386887 +1329470934 2496198641 +4123030616 2165420005 3068018442 332916076 1607690531 +1553419169 2639974900 1663831648 +3705488994 307612757 +727928600 1700102861 +2322733648 1100966908 +3276323002 3411043202 +2354474872 1678866925 +3522464354 1224964041 +1627912823 3734663290 +1725274102 2968688598 3627956295 +2363245038 489140556 +419651051 1263327458 +1388098551 1388098535 +492951086 1862543993 2309918066 848219321 +4219302339 2843350506 2338813309 3341851568 +3409492775 2663600420 +2111966479 970624664 +873968418 592379523 +3600257163 153260555 +2894171724 3690135991 3729650526 3084002182 1774611708 3855477729 3767242871 3100779804 2136838311 +346786354 2497190268 3838255058 2246715810 2654174754 2173594539 2430906526 3080420827 2246715838 892703619 3080420813 3080420826 3154807987 +2190886227 3851362732 +2324866215 3420009206 +3311306661 1489995962 +748137978 751231115 +2732588013 1402574354 365221083 4124241317 1724007730 2898738757 2898738770 +1044076705 2557248886 +3874816982 3101274268 1994929005 1121588512 +968677917 21715874 2879471637 +3929117944 2752348795 +251327652 957292095 +3917507252 1227356505 +4072109354 1087205645 +1323559333 3608643893 +2555544528 2035359068 923384533 +751721386 2829490194 853167259 +1082931616 1019131635 +3368068278 3901950721 +2039803779 3117868286 +1241013658 1051571535 +2126603551 1478553505 +933019985 1428081229 +505312326 796071057 +3764753510 2783485079 +3159770187 3335356930 +2999807162 2928031619 24888026 1078551338 2928031618 3158284566 2928031637 862070987 1347747619 2563613706 +2565847008 2897425069 1450057499 1241527058 +178300312 3405669157 +1033626930 778685875 778685861 +114660968 2853994320 +2129650426 91589679 1186464657 783156536 2211642153 31978904 4232460408 3983550123 2097841228 2800292123 2327136141 2560052266 1639210726 2651043834 +1356516678 2389779767 +1015492802 181518691 +1984782267 4140675954 +419046885 1350339864 3423739099 +2047556045 1153457970 +916920091 1371701900 202787233 829358994 1119970075 +3695119123 1279827328 +275139392 452611303 +278770985 1363423128 +1692152394 3518318931 +3453339258 1904695501 +3104187531 3484124866 +3509280968 256465611 +2632586622 2189415753 +1068407637 2497611484 +3302120143 2787439576 +3046385829 4177201507 +773354477 2105441796 2686481989 2105441810 +3252630187 3713844002 3867642186 3016215779 +1327157192 2308213399 +715147305 2302976714 2272470926 2272470937 2589692926 4264133759 1129420942 1425957268 1129420952 +2350350899 1187399306 +4241759777 4241759793 +1135883097 3316725111 +2914153136 2914153120 +3881886204 996590513 +3261229667 123923771 1616160248 +2651540545 3361397760 +828134993 89907600 +3041504460 788202807 +618069320 481575664 +912228353 2572583296 +3468227646 2871557535 +3629180794 22832395 +791696130 1259514915 +2398092322 2160177921 3767028739 1398736476 +4088001755 1871475922 +1254148684 4185814433 +3400640048 1168678293 +1577061563 3037989490 +781089364 1751396287 1751396264 1751396265 242013951 136321806 4273407768 +2292155861 2776849863 +3941072016 49429358 341021434 1530042019 1101215919 +2196860531 2196860515 +3407197560 724347885 +765480140 2673403191 856126620 +591868667 2215985458 +2963014711 4151175330 +811598525 811598509 +777703657 777703673 +4038571549 4250762242 +4264422047 2246241856 3242743873 +161515555 161515571 +1101925209 3187399944 +2196936965 686219994 +888122713 290241301 +4104740674 2556526922 +70040851 2775426298 +944563032 2542876403 +739603407 3936034331 885346008 +3612409832 3699563051 +4228224245 2982772156 +2870867191 1462280400 +2610745949 21797022 +3209050152 1340088404 3209050168 +250819495 250819511 +2871446177 767285958 +2681529235 2681529219 +1472554632 3076493362 +3881511322 3464658301 +1126861565 1126861549 +740875109 3894127130 1159337629 3914424314 2733210326 1159337610 3355944867 +3335138463 2403614302 +3900110574 3900110590 1364507503 +2217126618 3806262571 +306145138 735041637 +3739038121 1253435058 +2776181874 4022400869 +4225879213 763452677 829764676 +745804078 683084665 +3926906613 1810850748 +445246524 1520334833 +1714793878 1632566209 +1682109541 979811066 +1055420704 669652325 +2230096751 2156630817 +3185378643 3620589418 +2961958745 492065342 1161638152 2678044559 +2621040349 2621040333 +3222674256 1840602027 2999779043 2999779061 1840602044 +3813225997 1009576916 +3019232633 3305049448 +73694711 3778169798 +2387192385 1712183619 3678653661 1960563568 2537571805 1056375872 4195859629 3793196775 3809974397 1960563558 +2656702448 935794371 +151767943 4041394308 +4055038686 1555216638 +3354054851 2040963818 +1029835331 3830851434 +2763456058 2249340235 1504306453 +788734131 2621684791 3035396556 +2897119636 1791136761 +1301812711 4141638541 3198093796 +1227407794 1882822961 +2032260230 582148233 +1367678711 1267711696 +1234693234 1474447885 +2364517639 1909545191 +3080633192 1994458283 +3747069772 3747069788 +3421436933 80365067 2808897443 1337381000 +1899503037 4166439060 +1139981301 1561055642 +4056690984 3429982717 +3318607844 1194370047 +2558969473 2636807446 +1153024183 1752517655 2275854374 +3045847124 525030457 2090177960 +2581314017 3028634915 2927000592 4128635881 4128635893 2927000582 814680775 2927000593 367369526 +3786452077 4063193579 +1972841755 939262354 +1776735733 2875379900 +1594260444 1932852049 +232382041 1663833231 +1769064679 3844031414 +4205863582 1506774517 1101741737 529778345 2558788162 +178731598 301730554 +1351773341 3586059042 +2553289029 3904364764 2553289045 +4019125909 2099471660 +994945302 994945286 +35316146 38882099 +454678671 951052558 +4217844370 1433705413 +3563880876 4281309425 1587880663 1587880640 2601751100 315630017 +3255607583 1339403766 1815398602 +2864065557 1189351085 3519505674 +2658094678 3208139111 +440747752 3439635733 3546052636 121550032 +755139946 1157105101 +4063327277 2030047365 +2566938028 774004416 +1245259329 418854998 +672505233 2182528801 2869365574 +645949922 2614082426 +2384467768 430587332 4102327597 +992592210 843943506 1871696985 +2887932693 253059587 +3449677032 3522213732 +2589770954 141096498 3389639163 +283388997 3694243980 +663124893 2370534805 3585382434 +3328917555 2379616346 +4047398025 2493949243 +3912932673 1749388608 +4046955748 2660799209 +132943031 3937543555 +1177977150 3318576287 +3495190566 2315091217 +2425772894 4205958377 +1908978297 2549150824 +1204449255 3937282230 +1138388849 1105030896 +2642363119 972444204 +1140094148 3193161899 +22428169 598230087 599612472 +2652809801 2773264046 +243853111 411302800 +1805686808 2244963803 1206128096 1041873344 1921636787 4076827069 1189350490 +282776966 243147233 +553417111 900584272 +4215679736 2057523869 2652567313 1465431034 +2261090007 2261089991 +4015841158 1429463009 +3089612010 839857566 423933638 2871524178 2871524165 518432550 3498992731 +889147764 3790420367 +3996580841 2860478277 +2244133304 1234629805 +336264007 2428871961 4023311955 3567778565 4023311940 325299736 3561590976 +248911419 2516909796 +3839346365 4239252354 +1682606996 1682606980 3040854760 1968814585 +689119546 689119530 3525459970 1551222246 3525459989 3810348619 +4186788995 3544456304 +1363311904 195754355 +3915630051 2675210973 2363482905 3600392772 1259373642 2264947920 +1313507200 3039075163 +3423562867 2940713242 +985034634 1578073829 +2328809651 2739507180 +3472588513 3068705846 +877901781 885679178 +420530326 50727338 +1485105874 2769313659 +597612336 1124909205 +2065340945 3688925392 +910947205 389954474 +3783883134 2305442143 +1765110003 2451623578 +2150404727 4032795554 1026199878 460686826 1026199888 +2281469506 1416505827 +3402248279 2471106790 +1678988511 1768856328 18746780 +2374883296 3058357669 +2966608169 2966608185 +3108240296 1327517652 1260407159 1308961149 1327517635 3134432838 2562713872 +1304341596 3207156935 +1452026378 1218850221 +3873526906 4005035037 +2034557384 2943315403 +3069097668 3184113311 +3012548577 1419958324 +596674567 2351503620 +1051030366 1151600382 1788028287 +2171146478 2171146494 +4252950032 515347253 +1976235130 3900627979 +3117366211 1694528934 +3321008460 2182394675 +3818251021 1374973298 1976060516 3461159807 1976060517 2724916027 1976060530 +1442407417 1553406575 3722489822 +884914044 2218448945 +3887549723 3227637575 2471092594 2712048037 1748405414 2858449400 +3397822895 2255943404 +2638992891 2573326898 +1962651928 1077397709 +2970415394 3044714764 +2615729811 43409772 +3423359815 2120685760 +2461678185 1680470872 +2816190835 2484196877 2441385067 +3231530224 2405625480 241722955 663154115 +3464298042 3621774613 +955386078 2198074729 +535548024 2377035245 +4267930254 2961023467 76371353 +1446508040 692306211 +2951543939 2257585254 +3570298213 1710634476 +1381787951 1973080641 +95703928 1939934319 1927243259 3488617216 291733268 3266147347 +3610531175 778203446 +3739701197 3129045874 +627771862 1015869733 +1932883539 2955494572 +3061488360 4042006804 2358923472 4042006787 721541949 +3802474845 3341697365 +732568229 3845257113 +1404931733 3535574951 +2736391500 2613731168 502689735 2736391516 +1031438264 3817606197 +1376093733 731329598 765828751 1400794770 1790483225 900049713 1384017164 3909462519 1135750188 2714532211 3480987030 +3577601951 3745544427 3359659191 +3949407901 1606609026 +3453716037 1435786906 +3508545003 547074274 1309829521 1159170524 +1285584327 1451171027 1738106944 +3041891875 2403948810 +352235093 2021061016 +1628406215 3150121156 572820633 +708419132 3900864999 +3193466342 2335506711 +3340788706 1509768387 +2918659253 1693240656 2435315964 49725544 2435315947 +2953347456 2953347472 +3527450000 2931249901 2931249917 +3176136062 2196507977 +702951883 161555214 +989328931 4149770524 2085005063 4149770506 +751373123 3279731324 +48231550 163240225 +1019077412 3270283689 +2687858529 2502618528 +100953782 788154513 +3357283372 808698199 +1049099211 2421885176 +3763435735 4148247152 +3433740929 3974757798 +3118503554 512552629 +3103112517 1203799176 +1026533053 1026533037 +1372872931 3025438026 +1401233943 2442439206 +3891888451 1892056170 +375468829 1161999159 391475107 1269872068 1476622004 1369792400 +3321859256 1766491579 +676743834 246944592 +2120215585 302036982 +509014384 445174804 +4098760653 106403432 550290290 4260082309 1677463483 +4209892277 1872200510 +3775657514 1876198407 2139944000 579596342 3242935221 +1941614663 1977843648 +2933519229 90728546 +164688966 3119548983 +97303950 2148037900 2572173815 +1482446797 3864934322 +3810816709 3810816725 +3732235571 2412172448 +1436983556 3645864287 +3937421803 1585732852 +610630672 1173409000 +3194710717 2851724502 4227313295 4070210103 2149123988 895935625 +4138685701 527972669 +1245862477 863250226 836350885 +801302322 2961351373 +1281364330 2772134349 +96254481 4149018072 3720058345 2264534979 4149018063 +3224119193 430667886 3777832482 +3691384159 1352186379 3162967176 +1138234598 1478375650 +3779841833 3779841849 +475964220 1429419926 +3410118431 32065617 +2835626279 2835626295 +1669366127 2733666970 1825841478 +1946019461 498197324 +1646541625 3087612599 +187271138 4153305853 +1647391779 490365399 +3550173578 3540716225 +1724227482 1662664555 +532178479 178024273 +167012545 167012561 +1438588894 1539121257 +106113075 4216454033 514445238 +3415877762 2475461770 95274147 +927702336 1810063873 1929197047 244447464 900802790 1810063894 +2325884081 3997981360 +831385056 3798824883 +732121514 1544353421 +3385959760 3747935676 84360419 84360437 +82057575 437517622 +4264218069 3462465873 +3914720476 302231943 +3494012979 2442416429 3794380938 +1514686412 1316267489 +3900470080 3900470096 +2626348741 866732044 +3330722991 892554143 892614520 +209914211 357025482 +758111821 3958599992 758111837 +1836136384 154846035 +1063608699 1201173682 +1417083751 1417083767 +408192629 3255806506 +417113091 643182762 +1626260627 3921851136 +121788298 3221333746 4151299643 +3724328554 3040647365 +3701828098 1902209565 +3839054262 4004094353 +3278751342 332357433 +3454783469 2873572815 +1159443760 2812076153 2429157793 471218333 404107855 4204673689 471218315 3619372107 471218332 1476716872 4204673685 +1965198672 2774817747 1965198656 +2674568473 233733726 +714718784 3081224034 +1567177591 2208865350 +3219086069 27013034 +600084128 4000089573 +550721909 565564202 +510428520 1463711695 +3580681547 1163943170 +1530042033 1101215920 +1460868833 1719509264 1740934179 4094493728 1179811366 1589935639 +2473064463 464224152 +3927430993 403042038 +279854180 772171864 +3294967925 2421671660 2690113578 3294967909 2488656397 +5223540 1373676114 +3714809323 3958286351 2067216628 +4115804984 2257566163 +991463525 4158262154 741758627 4158262173 1822340858 +1373459903 3539330551 +1343619672 1789243533 +939475251 3022655671 1507042124 +428753495 3878545071 2448584422 2963579860 +162412870 2202282295 +2049583214 3698002169 794912306 3698002159 3950972974 3193808185 +213239180 2384853879 +2308041621 3359700809 3880294957 1229634735 632675210 +1077420090 1822257166 1381677917 1691025891 2968326130 1381677898 2392062026 537333563 +4109931531 3180854062 3180854072 +2713901411 1661952442 +3303948807 168947990 +2570367021 1525765842 +1676507608 1270704883 +3015181961 3416913554 +3559860367 2503792920 113885403 +67792727 3372611957 +1692152396 3753912162 3125851878 3672434204 +1125278022 64709462 +2376967076 2891488063 +267023543 3306535952 +4208339546 958704573 2679782965 287704822 +844615968 3874360827 3874360813 1975512068 3874360812 1614689637 +1048902905 4161564873 1683635198 +3373124182 3602220401 +2314774222 7247449 +83325356 1883581436 +2333702485 1310326986 +2333183686 2997076385 +537920030 953098058 +2825688520 3941583307 +2117527885 4252058674 +2071008908 3741744744 +1968232967 3041343766 +2262392000 4080337793 +3607473699 2700157212 2006392583 +1294863144 2692982007 +571615045 3885224332 +2631938807 3958389456 +2725668493 3371280196 +1429189792 3122223091 +2426148537 1589101864 +3360908016 1262796739 +3991594667 868818722 +2666409088 2514048119 +3154265468 1939038769 +3130054848 1449675195 +2033635089 4182443626 +2487905659 3962198189 +404174538 1804008390 +3047478947 2193269923 +2455010489 335566632 +1384209353 1384209369 +1003425902 2833866290 2499206457 2946380025 +68208085 4068845171 +3554142978 2129065013 +3967101682 510820821 +2197305360 2137122235 +374591540 2896773853 4091336927 +2415040741 3408381200 +1987550365 380369003 +1342878209 2050588966 +2468505122 3240544149 +922311169 2340990870 1043097905 +2947875398 2947875414 +3075889356 1760413985 +1750652856 4225472187 +905181176 3876543341 +29383144 2848819243 +2666438461 3011521969 +4283393100 2611006259 3575849441 331460950 1162110099 717346182 +190355604 1886925039 +2107291901 999844322 +1615470449 3274255001 3728608466 53697655 95387376 2159909125 2739567607 3645162518 3274254981 2605346653 +2717644647 3087894372 +2896803235 1383150215 2896803251 +1188095947 1172104322 +599604948 1521769245 1521769217 1773433522 500181883 +1697882303 436820974 +32710446 3544831387 3236937134 2890526834 3236937145 1069159801 +3346707878 246804590 2475847686 2888561750 3845877943 2888561729 3726581895 1753642818 1062384562 +107888391 646789142 +3345993788 3345993772 +3269107388 3167130436 3678305170 3488170879 3488170856 1240760932 1329531675 1112408379 3655947064 1312754053 +3730792881 3054465089 3240544678 +3994139738 3938263093 +1399453006 2647468505 +2911060359 1075719826 +1240993203 612208858 +3740827940 1067184205 3987994973 3279043845 594521277 4252271186 426745059 1265180462 1372216583 577743644 1019224411 1870350628 1232024654 624118719 +3955349333 863350938 +3699201431 979372308 +363042967 628917831 3971916014 1828684820 1968876847 +122698936 189308741 +1498208018 2784399699 +1748277505 4284205351 +3647427711 3165258728 +3712968812 3980901427 +504561747 23375089 3113792726 +1044722441 267343672 +289869896 3503477744 +3056740019 450304711 1797023534 4288276961 1078668576 1216104397 146591135 146591107 2204709408 2213735386 4023039471 +1486818311 2304765718 +3611300216 3381289491 46274511 +1787548798 1787548782 941589087 3097115550 +1815484893 908769012 +3603785046 2486540914 +2556675731 2014419308 +4029324 3972627809 +412151204 1344674111 1274645881 +2207663860 428978703 +1296998682 1228567285 +1098372427 1520747796 +3317138984 1089185906 +2381856612 3771705755 2381856628 +3031047094 499752849 1868633331 3031047078 +214995705 626482686 +1476006791 95206784 +1159712334 521258201 +1547390837 203115217 2791183676 +2626176526 3395514265 +3886512230 977518307 +1137580692 844851689 +1919245622 23790930 +2484217733 2643736140 +3496260281 3347405096 +926648834 1761384589 +2319451216 4073114083 +3337697161 2977940895 1433998830 3065670840 +2221061243 74754344 74754367 3316659909 3798080932 +2821510082 2157009525 +2796953596 1823758769 +1632274153 313418841 290611406 +3817995644 1235618609 +1195639632 2148611811 422849704 2417591211 +3198866584 3203181389 +1912245064 3043574347 4261090764 +764484152 4009061249 +3526397095 2305649398 +3470998245 2483962378 +3246240700 1424093425 +1058984116 177967182 +4096113754 2118073654 83183425 4042334243 4145090275 3592532660 1855297290 3772417391 4042334242 2976350635 3591736762 3935030518 3918252880 4042334261 +1920813987 3728609674 1291053597 2008397968 +20914161 2701064321 +442178949 863665142 +596648204 1291141431 +966836819 3135341347 422659799 2123530993 422659798 2993995693 422659776 +2862559907 1000126108 +855056833 4228522710 +3273530050 3932430179 +1170318904 405645267 2266227923 2266227908 131639853 3174273344 +4216273684 2981757049 +402063436 97875873 +2576695911 247719955 +682041963 1780166269 +3296663943 1650050706 +1392325747 851400160 +133578646 308341362 +3646888484 1421223615 +3949824801 3279802193 3195143414 +3613559676 2851132725 3262240502 1542929436 +561465159 4123342016 +3706841404 215099768 +3596782064 2153126409 1303563400 84921126 2064276423 3562835352 1046838325 3731166387 +2596075688 2384005136 +2431616405 3188672906 +866300591 1546658247 289449964 +1794577603 636858090 +2125571365 2527525178 +301094489 2575167006 +29762612 619551903 +4211282552 1250882435 +1966628427 3535564820 +1738529800 682057867 +1945045016 2571746779 +420961436 871069974 +3913862170 3511948770 1469664491 +3521072096 1115976115 +2975295548 4257817832 +2987190593 2005713556 2851514993 2337485142 +3102395540 3102395524 +3421554822 2500394646 +2160700319 3669959260 +1016158709 367181114 694591386 1015245779 +496595666 1063516863 +2381219500 1968910295 +956258250 2214015725 +3112381487 947817966 +1730819750 1730819766 +462356195 3237555677 +4262546847 2757006428 +2165887549 1960396085 2165887533 +3963936392 2891718068 +809638472 1074749259 +3745005382 3937591098 +917032033 1824111776 +2361541382 2885504483 2167882325 +104419866 3862707947 +3575207062 216016945 1809790326 216016935 +4037217589 95275644 +4225879228 3201441943 3090089526 1772522599 1081428967 2118959084 1772522608 +4268384701 3635421364 +1074948821 2846036256 274789857 +3599251822 3598629428 +3622007965 3622007949 +2987190592 2320707539 +3219958410 1939004384 3229518517 2878371643 3948076646 1332457971 1399568417 3948076666 3805748803 1332457970 1434395910 1332457957 4186513818 +4089922202 1487643757 +1679754981 3771526666 +3140865898 3317600722 +311253453 25451940 +1882904879 3684951278 +797829838 2858984025 +850269672 1621595157 +4253936978 2020382725 +4010966113 1067270800 +1972984504 304543909 2097960256 4188984776 2845495356 +2599588112 4225391651 +3558916642 3805204409 4294501358 +3363423089 437364792 3572483725 +3745649914 1862731165 +3265933772 3842244045 1038902304 1038902327 +3280633077 2351098073 2366465784 3355620796 2252601996 68753531 3909315191 1828302035 2252602010 +1487841062 2459349617 +901099421 704869428 +4246779254 4034767047 +4007516917 3326185190 +3912967463 1327201376 +1247378201 3812705407 3532614654 2879996111 175179214 3532614633 601671774 +3347697797 2733850970 +1893158334 3084351199 1194336542 +407845643 1337586242 +1457611236 2832013801 +3709583093 3350069971 128818090 3226209421 3226209434 +3439236705 365345440 +3242032947 3347873036 +1759997137 1320179507 862535776 +3786998444 1180392382 2350282175 +767443476 377619823 +1740191601 3094463109 +3675311871 1689248102 1252824535 +2332699434 1367910590 +1294814645 2753762579 3003586906 +2375315475 4088163834 +1893675893 610140476 +3847127061 2405860026 +661701201 1736566150 +1760185632 1222076773 +3569410678 2096440918 +273653564 2405688917 +2774998728 693466333 +3023330516 3023330500 +1217218264 3093628517 +2678576850 657927315 +2645892513 3843925088 +3580768311 3435198439 1182398313 2459563171 863364752 2459563188 +959735637 3613842412 1652468426 3613842413 +2888041762 1625644412 +1265695475 3553935478 +2147826708 1844389759 +796009447 2544796832 +3205830802 298941028 405469962 3991258199 3570904909 1550828318 3039687105 +2058247414 377247569 +82192528 351052362 2336304787 582228527 1824306906 3001247163 +2988793992 4174837277 +1498111532 3181723479 +1407328315 3395493650 4007394159 1070913569 2305673719 2584333580 4158392731 +1842793373 2250410036 +12470501 277659756 2207447489 +1991317423 944379131 +1078772726 2877050215 +2329251249 394229258 791540832 461339713 2329251233 +3588182584 3868094011 +199933819 1032548004 +502566569 3686715016 1298543997 1298543978 3506213902 3084665411 1478201754 3101443033 +211158564 4096502463 +4076729913 3200949160 +1925680076 2299496951 +2192116410 1780212445 +2363493013 1378040136 1504749724 1504749707 +77318753 2990518256 2722076320 77318769 +2990292966 2061014807 +3346707879 4094844729 2083786660 2905339382 +4229395228 4108989713 2645658064 +3259951053 2939611044 +2991559037 1355969346 3119658594 809633748 3764999691 +1530596313 3750709928 +2851475355 693801234 +1131617339 3555499873 3994472966 1765109989 1765110002 +4100039224 3987889709 +138169159 1038778560 +2076593720 288170541 923585732 +4122125042 3124134643 +653780794 3221932206 +3543922257 3630481798 748463585 +4228928856 3943626980 +2153006103 1995017653 3090209684 +957243949 4272196804 +2827860210 3745190418 2337841886 +659453323 323516591 1803749844 323516600 2904553077 1354519891 464297408 +3689813682 3689813666 +624732991 2925990343 +619717934 1409976166 +1864312806 522980679 3825488534 79828113 3154647230 2161839919 3007386894 2875797101 3148497382 1198044332 1286859292 +704266407 3751876665 3153315574 3153315552 3233944228 +562351067 2668423634 +2525486483 2330054266 4242889521 2647340438 601518257 3890559510 +3142323245 659154596 765238552 +3407530489 2830235580 2469360373 +922234221 4121920146 1430948805 1430948818 3698840923 +1086412561 3924612278 +989224215 3906243366 +35186320 3711104181 +1452026389 3098885306 +4286052393 1870740348 +2123025602 4135605621 +666409113 765560190 546846920 +906155246 2206124398 +3747098570 4203075877 +1512820335 97565201 +94710092 2651071328 +3498031532 1530337984 3843115457 +2534317121 2499837159 +1358718587 4146046605 2226678665 47667493 3990889319 14714272 1258141281 3272253538 3214136453 +2379628784 944257493 +4054830755 3151721360 2488879901 3151721351 448940700 +2705671430 3319597597 2606379846 2606379857 2315832954 3859523703 +3520262486 2769414759 +767514992 2034564596 1274746589 +3698037610 1733889997 3485588895 +1855402889 2701533358 +239464008 32404508 3222674251 3450561911 +1455720236 2667712999 +1383158901 3450163978 1030222883 +2195252269 678376146 +2325107180 1819044589 379778711 +2947960712 603927307 +431722520 1370677934 +2266102453 2266102437 +2046131677 3362122197 3665109730 +1985363400 298009035 +3132557620 2559935971 1547967856 572751055 +1838928697 2536031244 1202387653 1459933470 1350005295 +16214877 3037294184 4115751613 +511369908 511369892 +2126564128 2625492062 +2757596645 614174401 +3180961948 1623536455 +2769727274 213237531 +3184324013 111928836 +137401815 3145458022 +3800295688 3426249780 +2627118503 673629664 +2456055866 1646372629 +586823069 1248249749 2900518434 +938677863 3277802853 1026506354 +2903455593 473723413 +270723601 2012641488 +3235486953 2140275416 +3755298624 441785817 +1957219292 4223458892 2176379719 2266656903 +3613559678 560967985 3314025824 +225595813 3820751971 +1614939535 384745496 +514087761 1959001139 +3802754622 3414412127 +3751912320 221714252 +724893088 3118091899 +1183407398 4034389520 2798814269 4135535746 177885892 3196474225 1961904776 1584749296 981798865 1550895666 3355924593 809345729 4271521754 3548951303 +1976463243 988416267 +4222264197 2996791899 570315704 2996791884 +42185652 2840847449 +1065603146 4005571360 2078782433 +2430630810 1552255737 +4057340983 3943590534 1257249641 +2051476468 1909969167 +3233909708 3871210807 1561688421 +245820662 4240161336 +3763104949 3444515068 +3918767003 955884837 +3931564045 1029214847 376859144 1297443417 +1341792276 4206919535 +2222194179 4289105683 +3399349110 759905835 +4142788077 2949873733 2777517074 +1805073114 957457707 +2631174055 2308017142 4013483321 1881092516 +689146061 1992317604 +1837351149 1837351165 +2693327436 828918903 +2248346827 2851013103 +3787134856 3347080223 +2487024562 234895653 +3334915061 3756423851 3756423868 3101491624 +831018154 831018170 +3751219381 2949598460 +806281699 1183242448 +3606585768 278723453 +1709390757 2616457432 1494268955 162981036 162981051 +1037584854 830225393 +1306149803 966297140 +295356418 3570464797 +688035238 890344513 +488620839 489391443 +3455978186 2632625202 283835387 +1133402707 2517933760 +2775424621 2775424637 +2474992396 3090397126 +2298661903 3462878430 2769916527 2655984801 1417859148 2298661919 1417859163 +1695911368 2348318452 +2921660472 1547655227 +2868915907 4098465002 +1447210958 2566570329 +243366455 2879304665 3234287267 1748200041 215180432 901837293 +3414042986 3248173531 +1078582821 3034209484 +85947401 1480910457 1819725563 1480910456 85947417 2261005263 1480910446 +2950979833 3716458494 3050599625 +4183646257 3204345126 +3948410213 3661124423 1439678620 +1262933656 3833756723 +3060817950 2602680382 1357336383 +210793731 378822081 +435597544 127308903 223160085 91522588 1168936848 2491255706 223160084 3344465213 +585530455 1205189872 91778516 +3289788558 3289788574 +2506747934 505270334 3419469506 1405419327 1405419305 +1579999987 598289226 3749111927 1579999971 +3306396685 1256106084 +2448994871 25201798 +1907844757 3421169775 +2250079164 2250079148 +617764577 1852760336 +3364068809 1882284910 +2811893740 3237819456 +3395712390 625672673 +3975645284 240030809 +4014901075 194971578 +3805831649 1445422086 739001031 +3713838316 1692678039 +2609696621 3460910305 +2849395848 2849395864 +173084740 2174524169 +1085814472 2852011229 +2025115893 2451327593 +1001352533 2854172915 +1387062771 795222880 +592776211 1727122025 4073260695 2984378860 4006150196 +686528111 3655192760 +1550388394 1232285971 +2784438282 1309935547 +3696644269 3425927442 +2395964500 330895796 +2608007639 2608007623 +131296552 2043991549 +1990908103 2515747158 +1126343492 1126343508 +4163565771 1990567810 +1450249825 742774766 513772349 +477155834 3214576779 +1638330760 2963530327 +3967911203 4124592068 +3893915523 3782708010 +83326955 3741851414 +2875676106 2875676122 +352160903 2451847318 +2170205532 3810576076 1486418743 4257972177 1482307079 1482307088 +1025413200 3595610072 2126430595 155885866 3207014662 +562552672 2230216251 +3830640506 3901685021 +484720424 2739891179 2095460240 +688819219 2487711388 +4174283834 3877250909 +3309650053 607178922 +1010159952 414744803 +570045467 2548041348 2548041362 +3783604912 3032179459 +62506772 2537173195 +3955685588 4265194927 +1916459652 1916459668 +1327276921 3416182367 505162076 3925794697 +555576343 1957493382 796802997 3686943184 944842790 +1004359968 1840221691 +3215992434 3547735790 +3188676223 2972002814 +3682399938 1247651037 +3916524001 146516998 +958847715 3677000540 +1660263963 3819431064 +1595068222 3856061175 +3411210588 1871836103 +4226184100 1534124700 1944304046 3065646546 1693030363 +1271318017 2212869414 2212869425 1256829846 +3310977460 1608986201 +888877862 2373027009 +3745212223 2843969598 +4182001162 1887060411 +2640303467 3352923023 +3693587489 3702637447 +1549391222 1549391206 +2206709555 395779405 412557011 530000359 +3580004432 3647239095 +2682348148 600702105 3808789780 4131693791 600702095 +1107879882 2489225054 +627817874 2057006291 +670684980 670684964 +2741487031 4082908934 +3468497363 1588650582 +2502733617 573782465 2502733601 +727922129 506312720 +1000810403 2763584656 +740027439 794834719 +3395471530 308644379 3766045970 +287519654 3730395878 2691321431 +700310725 4101998275 +1254066897 257527414 +144701702 2773880226 2580874337 +2096531031 253065958 +3717095412 2919734879 3139505423 2919734856 2871063551 3717095396 +2955796429 1647060518 +920078016 350511187 +4061233028 872034424 2508963039 1809088564 2508963017 +1231107443 3846026188 4144440325 +3817320458 1391548306 +3446552106 1834497669 +3032204638 550422377 +3508634748 3015937841 769288752 +3902361285 1291135210 +1063493157 4006736940 +2761176418 369005693 +3146225254 3725939623 2901073316 +3447373594 2453329405 +2609513209 3544362472 +1759891223 1268591230 +179975335 179975351 +2868012766 1638090184 4167071842 3217834637 +1823022131 1094149210 +1661848575 1895344292 1194867834 1948816258 1233941753 1954280094 1168971051 1048722164 3355746507 3059660183 +2806837968 350666556 773995893 +3735987135 1273742760 +148319117 2008649444 +2304527588 2218969365 +1146932365 722862564 +3763898900 3763898884 1063345529 +452752250 1468493365 4117350658 +1664042910 1664042894 +2387767515 3871844548 +949942314 3670196544 2694199251 3686974182 1279306253 617334917 +1710459868 1516579665 +2792493899 1351900948 +1945122199 2341546856 438590630 3079750021 +452558532 985829001 +2917372581 1648351674 +1431532245 660456796 3456456051 1117623162 +1328321773 1006958457 +1584262613 2081252938 +1489302206 3322977186 +1337812898 3562452745 +3054301065 486530872 526193848 +3306522096 820107476 2443580873 +2887678370 2887678386 +2472698369 3988420829 +1140475722 1140475738 +391675832 2018578107 125422016 345643603 +654263985 462563180 1343174989 76677971 2864488685 1011787977 462563184 2111516861 3608417603 3359963072 +1548161312 1675621733 +2589217972 2797688655 2797688665 +1343023481 841232016 3955577931 3363926344 1777714474 933738223 3363926366 4159004941 3363926345 2102626686 +1427717764 2059233759 +602430257 3083308592 +2744378395 2630882962 +2884249993 715088568 +4111728427 4185567412 +1222017997 2338699570 +3014097328 6093512 +2641080847 3750317464 +2851595141 1495509948 1931307267 +2556345188 191725635 +2301441946 1133916335 +3181549771 1375111042 +2130808863 2410747232 2341526236 3942549665 242606302 +1130305632 263327672 2468991358 1767819053 1700708607 221481924 1767819067 2973599832 1767819052 1857249061 +2717413161 3972999934 2722230655 +3210572381 3012440642 +2577637601 31135745 +3359017073 3103276791 +352546273 1004039225 903373482 3270758427 903373501 968955096 2314791427 985732718 +1905826502 2570823073 +1493900096 1820059077 +3342899732 3199372655 +2823409000 1412324011 +20264989 2496384532 +867117890 3438947677 3438947658 3304263758 2663454947 2005478477 +1452326306 63165 +2809504490 3250018177 +3960759446 2658714998 3960759430 +4289188643 761333161 221709830 744555528 1077662623 2653811353 2914665924 +3850471602 4243206181 +1960832711 3280266070 +1448951031 4096293461 2896643174 3594308856 3839427587 4198084451 1570863117 4265194928 4198084468 2896643184 3955685584 +795244601 3612295592 +679011149 1703011506 +385889714 3881076517 +3672374258 2263195109 +3878856260 1485477167 +3012412055 1059672998 +2703207851 3563702229 4011310543 3907372885 4011310552 1339974708 +2896066022 2896066038 +2638217871 1643011953 +4266382066 1130173157 +1539394982 390937687 +502566577 3640434864 1588283282 4105514488 407801627 930669523 1001448768 +2631750713 694916542 +2048620637 3864701012 +1461162598 386542300 1178318338 4231961705 +4056070086 3439182854 +1028700799 85300734 +28283394 1800120130 929655438 +187900553 712990126 +2580569848 3200926192 +3253763042 798164181 1684931204 2988070831 +1681287992 886747588 4188719405 +3808883445 1492154300 +4104598875 4156048648 +961981992 1251900202 +4282987324 473671537 3779282796 3806893808 3806893799 +1371856841 3992423734 2179746151 +3003448424 953767869 +926523094 3316976369 +1534480309 2481751369 +502934964 3839226457 +2979438079 2400893032 +811979380 1948407060 +3674156617 2756364984 +3176974242 3138274307 +4244662584 314559728 +1369799722 2978117147 +2422788759 3959653292 965234179 3959653296 +2648853131 372988098 +2802244702 1268304382 +547596736 1379549048 3677538409 564410707 3032569063 981870491 3254996933 340737980 +2565648998 580703895 +277443207 2405386902 +1947630121 1623304601 3898756754 3898756750 +805580589 2989617146 1340187104 1270192673 1253415067 3079455634 3281404868 +3004233102 1907527321 +2715903395 2027093898 +3596782071 735156567 3875838021 1092655423 3834008134 2757726722 4190766675 2533148628 671484565 984394292 3382619241 4019625806 2050013389 2154160306 3382249301 46656592 670015507 +1700225860 3229203551 1510552068 +3811879440 3152525109 +1354674443 3214664949 657503298 +1216101946 513440752 1435891037 34676422 +2867962297 3546388008 +222655836 3372834000 2346145096 1079492551 3694146532 2233927372 455276039 +706546422 3222194450 +3538402631 1238300352 +2401886955 203628949 +1570598024 3872512523 +53607053 2494393316 +2298997613 611818628 +967413513 3471584039 +1191819090 2600018973 +3461475918 419046607 +3924590492 3679249041 +250238553 3555061256 +1414596442 763921349 +788466563 1579035504 +4001907569 367626262 +1607180332 2681621730 1202730604 1607180348 439461207 439461184 +3575597141 2079794412 +3577845270 781783799 1375263430 +1895655235 26010109 +2564181200 1327540541 +1379417217 4273942439 669536166 4018618112 +3228416853 1102964444 424948449 1504178076 +3700351010 1458230659 +36080386 1689048117 +2328307301 1731917633 +986347221 542521197 1639518556 +3093699076 2845899844 323915503 1338494233 3878974266 323915512 1287320649 +3917724364 1717505825 +2599456105 2599456121 +1515343225 3634328904 +4123193864 3445431587 +1890455901 392522050 +2607583352 1917876499 602369275 1301344768 +3411389872 3602399367 +1618074662 854159217 +650204332 2925021911 +2480282335 2567720222 +1799858423 3637443792 +3036883260 700471660 +1286654196 1286654180 +3041059481 227793684 +3112886105 3355656771 +3628004397 2551866066 +823549936 909706947 +2962431847 1587179318 +2743844535 738015760 +1008241179 3047254162 3047254148 +2208238573 543147538 +2523495432 594523957 +1501461402 4240807094 +723848952 3814101101 +3247633154 3159657507 +1055271015 2856926585 +101709007 1511940568 +2247115805 1094433282 2032372459 4131076532 +2905339372 2285118103 2905339388 +2514694052 961531139 +1091328287 2238729182 3836898209 +1267152113 2503493751 4180564115 3604502384 2626786710 +3959748998 299159009 +343719968 343719984 +3102497469 3641890690 +1101315146 2967490549 +132371547 4250631176 +1373857554 1373857538 +1989919991 2922844358 +534342930 827083706 893825875 +970404351 214152318 +781907381 317770748 +1921418654 3770237762 +1427176140 3048918839 +2656003088 2656003072 +1527096464 3655470773 +2935158577 3268854208 337441079 3268854209 2574983718 3268854230 +1880790618 742558261 +2691571839 1587925546 +3799380637 1178160258 +2346500975 2391606971 +1255985477 513634202 +1022884162 1012753141 +1771328304 3369797276 3369797259 1372926792 +397405107 2234624993 4243589836 3440642085 +929955584 2426206520 +1319919499 1683646420 +386539692 778970534 +1932560712 669296245 +1687341718 729323936 317496161 +983701628 3860800611 +4118765164 1349811836 3816924183 638922135 +935437632 97985491 +49639230 3864927903 +823687338 4141776146 4085642139 +3642194611 3246432212 +469219927 1576687344 +1360607269 3484639802 828612957 +1892203311 1205759005 1457988730 +4159064033 1685502470 +2287015372 1671778359 4150089628 4265419767 +1678847516 560379555 +3035506901 2681092461 2681092474 2817148746 2174396275 +1611135194 4018609027 +2678823536 517717963 +2142555624 2618887171 72368592 4053804075 +1086568314 1086568298 +221493964 3419721975 +3226757771 3080464362 3794658111 +4153197001 2073366392 +451165195 1615496532 1615496514 +182468165 705606958 1899491311 1677854348 +4231953642 1504441936 +862084211 1456965900 1456965914 +283265486 696120195 1348568874 712897817 2029850842 1348568893 +2021748857 4137865310 +1461273004 3368182209 3368182231 +2574269792 738784300 3954220581 +3694178852 3299372713 +895650586 3404295413 +1908993677 2890893284 +1972287155 3265895372 +3114277800 3886281236 +2608412543 3441967420 +219861947 1547390820 620437125 2505964136 +2907670937 3378798185 2130752475 1832229854 +2563771922 2709923397 +3342051159 3981471216 2241663171 +640664766 2403732196 735461261 +2332060224 2404260876 +1674474133 1349646650 +364462860 65070450 1050971127 +1800656739 1476137162 +1841822346 465143822 +2132160795 1881774501 +2404978824 1811817105 +2324267152 1805884626 +2970171907 3028701866 +1779693235 2959956940 +2403099146 3281057138 2249086395 +2726612991 3591597672 +276172889 1121696776 +872964672 872964688 +217416066 3900366773 +3584594509 2239146930 +1504729318 2927499825 +3618281817 1645460223 +4088313711 185254840 +461852703 1963139294 +2493405210 2336853497 4163012657 124740263 3078531363 2576733430 24074569 256159997 2641578212 1036680936 203991843 2336853496 2311088452 3478938928 2336853487 256159979 +2602495237 917446362 +1279211921 1040828716 3614547108 3195106632 1518372506 1518372493 3211884254 3546450904 3580342359 345743435 1208604915 +3726345661 2419391537 +2967342724 268883823 +4286786141 2558242914 +3459297780 1605320799 +1674021088 1523706796 4078729381 +4151113380 2877508751 +959543017 4057870542 +3155878446 1280446063 +1670251747 2846381845 +3688682970 3688682954 +4233767786 2884786125 +1628359208 4064820477 +3918225076 1516639567 +3267305264 2410393374 1873910681 +3661215952 2821239139 +4263692067 2389727684 +4272857516 2565374401 +4244968520 2533289291 +494108525 1190342084 +406578342 3427332439 +684547217 3427317840 +4252974975 2048721362 +2366967677 2502386114 +2801942004 1291860515 +199127421 1323632462 3129809340 3978907304 741124062 1340410101 3129809323 +1610263974 3181337665 +999495597 2222159167 1972258116 +54416752 1495823068 2334162773 +241705763 3505344522 +1635372810 1635372826 +1263220994 2305474101 +2590066066 3895534397 2569045210 +2197416063 2001394218 +3036108590 257834361 +2108323045 3092644972 +1100660578 1716114862 +1299024560 811977245 +3591597341 858884866 +2798837106 267557491 +2320158562 365197123 +3852172009 3559553113 +1599350847 2605361530 +635686663 3190241298 +4110643451 2387468008 +212010892 1889853815 +1791926780 4243232388 524877735 +3650670039 4135116842 1823037603 +4230168522 2994860449 3143147206 2943314213 3044895469 +807608757 2085490666 +1119035523 459880108 3716381446 +2928019931 241331592 +3400188591 3117447537 +2066740760 901523628 +1606047248 3260382005 +4157327797 1910230604 3486206115 1498361060 2074323711 2325987984 +1254257599 1864119742 +3681854490 2459849981 3124735458 2459849963 +2705820638 3983288154 2453151913 3996700138 3327681112 1270623149 +2666875910 2514684933 +3915106304 2329009208 +966609732 1122648632 +382960857 3355058568 +3233967661 1384058267 +91847046 4274568145 +193012851 193012835 +1918884191 1810051230 1810051208 +3118331392 3305863552 +711104032 3643954291 +1675475694 4219508026 +3971482032 1437247491 +295618184 1049734184 +1502276873 570656632 +1326922811 3383878926 +4124459952 2538612936 +283023383 2775149606 +2294407106 187907690 +1539208695 1539208679 +1746845170 2968899734 +2502735313 2791454736 +2227766348 2417423969 +1350383724 555733527 +2902803265 2830603366 +1566788970 6519974 +2578101154 2310588419 +2880388038 182130871 +1092838561 733440352 +3374527318 1972572726 4167684199 +2686772777 2469633747 1399594560 +2536684508 1309532304 3772627793 +2958845016 4184995469 +3721474108 4047592423 +1790054685 324071586 +1964889948 2509711376 3120170449 +88636987 55555515 725507289 156221192 4153643525 156221215 494917588 1938409417 478139982 3716145497 2019158270 2350823154 4051375474 2019158248 +2334775578 484485805 2334775562 +1667490979 2038273077 +154846028 2512670071 4112750898 3944974688 3961752321 420096434 3548475575 2630113377 +3559905581 3123475088 +3590341789 2137785140 +2700751633 840372385 +1443528723 3426617101 1892958773 2240257530 2948220714 545102464 3149552177 3745391874 2240257516 545102486 4020016877 +2214339799 2632842865 +1633607808 3361434003 +1601096404 258558895 +2008526552 4188324720 1898158707 1311260187 374976115 3893360672 +3718623721 3157311423 3700492110 +2237937244 1489081031 +3931815979 3924584401 3931815995 1076055580 1143166031 +826458098 1824393613 +2035005318 764422609 +1364667429 825916972 +1154553834 3355201093 +2772687915 3039661667 1423153058 1230490826 +2390096494 2981706543 +3819214806 840631793 +3083858994 2388486821 +2244039233 2244039249 +3463705896 1832321598 +3754081099 2324485908 2324485890 +1022884170 1146974061 1710714439 513280339 +2379090991 1784491502 +4139030132 4199919778 2779578155 +3100854902 1788753873 3275995441 1176207884 +3373840101 2836799005 1994910330 +2814006611 2545717718 +3843476760 55023283 +3160962928 2745459932 141821269 +2164056453 2467759180 +4073582639 1764825592 +2549351177 1042335534 +2232494975 2232023313 +771729924 966725904 +4152407870 3718280841 +925823956 925823940 +2646880077 2832627236 2015238763 4288419598 +1225278242 436317827 +3248767275 2472771157 +608789963 608789979 +725346805 1979428762 +1329961331 1032884236 +3018347821 3594279314 +3893960881 277771942 +1364642823 1457716499 312684288 +1193785019 1322587496 +1125120169 1125120185 +2052041049 2903696425 3831994142 +4121315940 415701865 +4282439241 470897912 +1409508062 1658834355 +1453433044 590670644 +169359924 404987855 +3795721306 2061088522 4138762293 4205872753 4138762275 3170009797 2177278397 +3599652091 3171927858 +224345797 2458161825 +251150412 1829312364 186840549 +2466896506 3541877137 3474766677 +1910163962 896267403 +3376289936 1556130485 +1145022438 1446334209 +2804536480 3988553083 +2818544053 190364303 1380511696 2880239377 833671373 1255239274 +1169655944 1206644235 +2404709383 2847680256 +1848430180 3565741951 +2555916109 1578391463 +1678417184 2629130611 +3619859384 740520740 +1957627388 3046868903 +3068051798 917133927 +1050961286 583782881 +3271849907 3003674330 +1880776855 1880776839 +1254413529 1524415401 2363167134 +3306399238 1139694433 +728483984 3937188515 +3907314140 2085588305 +432398438 3370495409 +1843466795 274995362 +1874745838 3601306031 +1970324866 1653009315 +1090960561 245041840 +2104211331 4086424380 +3009342653 67621681 +3029900729 1983171765 +251905017 2616033512 +3103795222 1363090097 +3729985615 2608156315 1271049304 +1423578194 3847093523 +2030920048 1073987 +793139281 2811420221 +1150804488 51958429 +3161150613 813607738 +4113433137 678261552 +1029864814 2606286705 713737270 2815163610 269186086 +1925457296 1014632444 986128821 +4158195259 3933321019 +1993032297 1993032313 +868414631 3520849587 868414647 +3620225002 2306446829 +1767766706 1600692813 1600692826 2431755827 953493022 +426778063 3665751246 +2909750077 1126619394 +682978632 1570441309 +2153427931 3922272708 +3180703508 1794921065 +1577960464 2344314819 +3877104699 94953714 +4167811189 2258630716 +1927713228 1923419271 +2425066512 1525637757 +3930448277 1627528604 +2189877632 4199873669 +3415470652 3051770983 +4108653207 463225776 +254149570 254149586 +506263888 3503061237 +3685810026 1101140955 +1695371960 3327305043 +3089612029 4196472836 2389758060 2045000912 3258897680 3928537681 3542652433 +2214041116 2555420881 +2339583433 1584717368 3925463611 +3749867696 3357846896 +2127220394 3365280358 +714703650 833187459 +4270764238 1814776640 1645052278 4134558428 4266606305 3470723152 2819500343 3151407669 40922552 1667545167 332179265 158365900 1123841373 2292208729 +3129152016 1218170601 945086812 2891280163 2891280180 +1790272068 673655458 +1475879874 728945163 1033914997 1033914978 1834296519 1834296535 1033914979 1716853213 +3106196538 2866766594 2934800203 +3307346480 772655316 +2749522675 4032939162 +1185102731 90699893 +3723240372 247215183 +3750563786 3688008538 49658163 +3795820385 3318652304 +304414400 1346177107 +193536587 165111405 +3190811343 879666136 +3563136092 2699830199 1424211216 3563136076 +2816444823 3689257126 +557944468 557944452 +154491779 33492778 +3906792013 132039589 3770996530 +3721407837 2344053108 +1646480132 960602524 +457392824 382866771 +2754399603 3850857498 +2144872277 2521164508 +3890630912 535067545 2815402089 1345257305 261194515 +2085344841 2764812974 +2874956919 962957136 962957126 +2993802777 3201470927 +2301216899 834121840 +1901395803 3285056594 +1885747396 3534376903 +3080368560 1950316682 1756539043 +1270786339 1612988956 +2847243567 1471418606 +1275109664 2152422892 3304957285 +4227117006 1882243407 +182387069 2584696788 +1441923879 1929049696 +1129744091 3694545604 +1670678515 3201206035 3184428429 3572726420 3315307872 3050439578 +545710792 2147555106 368465303 4233560267 +1037359311 1037359327 +2703568766 1497147362 3906899614 3906899593 730448735 +1474785365 1474785349 +1993065566 746624461 +198245233 184275696 +1876387065 1214847177 +2520843511 3538280899 +2527933764 1703495793 +1982503082 2936951707 +973562180 2644385311 +1362106765 1426171122 +1413122000 1700453419 3106820696 1326612008 3018528902 1747176547 +1008458780 3151724551 +4044827134 4185869577 +2232544489 2232544505 +257995495 2616419474 +3614452092 2710654513 2710654503 +1057496863 1489567198 +3392273300 2894902015 3481292813 2894901992 206126840 3769567737 3769567727 +3977997371 3358852378 +3679903313 3635627715 573951457 2596272518 +1922382650 753068565 674011286 2599173213 +1173488546 3052785954 +493688923 3755024722 +642995565 2908290939 +2603536986 2763334571 +3093065982 1186950174 931520479 931520457 2721667170 1186950153 +567346917 554556012 1891036686 2127488961 1622594752 +4049352872 3363883024 2037877665 +3456478090 3706522171 +2900518442 1382470683 3537888914 +2042902182 1440876353 +896875191 3733679622 +1128039984 2636509597 2210735176 2636509596 138886549 +3750818625 841936704 +2186184643 2186184659 +1452276379 414297160 +3244726924 852760247 8735351 1590328340 1423644251 242326936 2164095964 +2320503648 2052591554 +2917879509 358647575 +3525739004 2796132780 +222891637 1593950762 +1656250651 589084382 +164357660 562214087 1086597665 2281389575 1306545932 +2630083849 3398516601 3512831278 +1028445254 3320982049 +3708906754 2872415118 +3514414176 1716352914 +1453280595 2949036474 +2333855431 3284566848 3553008742 2333855447 1904254419 +958507492 2727170511 +2374655829 634655434 +2277370256 2523488616 +2710740354 2822146443 +1398178884 1966225161 +3928015741 3029579892 1823013899 +4006666734 3771967919 +3376498882 2479196533 +3720229775 867386316 +1089227113 1204657516 1538791397 +1397397668 3262007849 +1875730346 2857212045 +4102242721 2325626805 +1193580930 2089860377 569449742 +4216264603 4175860063 +1000229602 1926040566 +3392366345 1475031854 +1737743401 3783802917 +1288393850 664520021 +3914554388 3914554372 +32710462 1337601673 +46006186 46006202 +1979549894 2216578999 +1539608342 3069916150 2355969959 +2065109947 1750350440 +2546728352 2518696677 +3885327265 3931604504 +617585297 2135324923 3337716768 3975829912 1311964787 +1867383353 1166017845 +2035274962 1991278174 +2097184976 2097184960 +4229229114 3383210242 250394955 3383210261 +3215600917 3229376456 3454335004 3454334987 +3905359214 158825778 +4110349144 4164536051 +2975562798 1951629194 +3763791412 2579081820 1556898776 2278234581 1556898767 +169211225 965819144 +4174339505 1601207728 +1750880659 3696519802 +3774992197 4084234129 34530230 +2124865511 2113135603 2124865527 +3642937989 1456564044 +4219767861 1167637452 +83325351 1498554037 4088260380 893159713 1850712005 3249554700 3434801944 3210825255 +2696635199 1174223912 +1016764037 3965383500 1831671485 3965383514 +1123361520 1474691011 +56710776 3392872187 +3145294156 1813260961 +2595403706 3494066745 +485102307 1736162122 +2517432214 4051374177 +3135321823 3775429634 1432605621 +1373134553 2963099528 +4147976206 3466695065 +3251837400 3251837384 +4129014268 1773297575 +827269663 1023360758 2928844174 3371547851 3197286088 827269647 +1630588117 3570561884 +118634898 2987207739 +2076769833 107485838 3227047551 2749484430 +1557959213 2907937179 +106253656 4018712805 +314809019 1156355186 +1629426148 543047657 3494516100 1190061733 2385621917 3766053168 2128078206 2149495353 493039292 3988127746 2078643747 2496735759 2795431299 1654193631 +1153941517 3700294233 +3737041738 4030780795 +1906924263 3566868918 +4035210694 1719193271 +1086514979 1378276689 +3733254544 1565571432 +181411992 2644725595 +2480729160 2207139824 2076655989 +3309345372 3769827025 +3761392234 1542364070 +2176218063 20467416 +597320140 1037888339 304459621 2798017545 +139531654 495956357 3228115185 +103170673 103170657 +2858166296 1192435141 +1591922170 1493844107 +2264631540 1912117263 +1998120457 3689457774 +320643279 1912509210 +1665822052 3782246735 +1319264320 3891790349 3698669304 +3580709161 1241682073 604646286 +2461708292 4293072479 +2124316009 2914849792 +2842196646 1433998145 +2763785966 2470988665 +3020512102 3501908353 +3796116607 2688899758 1700099627 3796116591 +1213634040 3628995963 +1422384102 1553935127 +2478485933 2627291653 1004909394 +32793236 4267635176 4267635199 2813800185 +3344560668 4002947591 +3679531889 967851629 967851642 2202381715 +26361262 2864463919 +1772277327 2588591694 +3746290281 3983070030 +2842359231 3061434748 +3062848806 39600090 +1106772270 124377967 +3470766380 3470766396 +114482716 3656623633 +3322671382 385246689 +118914624 568610828 1751695045 +3679667487 3679667471 +513610123 1094429707 +226439393 226439409 +2706051447 1613528646 +3304404406 3288567175 +2608349081 1464606152 +2344453323 955535792 +4105240508 1502349040 +2302413983 2827476574 +151550858 795765490 3260709435 +3940685821 3203122004 +3758147702 389779921 +4260554346 794867931 +2454269161 3000237349 1994418828 2048313925 +2539686578 4277818917 +184857917 919035957 2506706690 603590475 919035938 +3472588514 1648393166 +2089470380 3128654295 +2326456681 3020779608 +4007019575 843932294 +1292144408 4237186834 1794156767 534932192 1983916211 4075221403 132269338 1445806811 518154586 4167817405 2201143293 +2450536419 2450536435 +32068414 1824195770 441221767 2666788472 3642382780 1983013154 3058060681 1532927689 2393649059 819663100 1078856329 3654989897 2277565239 1078856351 3654989918 1966235548 +2148557811 2362267532 +4143685832 778324469 4242566332 +3220486609 4282418182 +454250341 73792492 +478352654 2889251258 +4032298737 1267094886 +1863027185 2193474875 273758052 567953522 3815518477 +653650907 2465869230 +848546398 4238840297 +2072233153 3517241959 +1801053702 2424976901 75832161 +2184434232 3664416183 +3903215319 349877350 +3118272432 3766837773 +2407517802 4095933883 1280222020 219507677 4095933882 3838985973 1995453624 1760566954 2734948781 1345450203 944637250 4095933868 +639612655 4075616814 +2296293773 1197284030 3029591100 2874378745 495891558 2234132609 2221323918 581773509 4224962188 2671506182 2204385659 3209750670 2374919463 4109216996 1660879004 4169266658 3277162835 +4043523271 2007761875 +2772638654 1404159080 +2894902007 3723302243 +1052663090 4155291059 +1303761806 3812362383 +2593342602 3755271483 +2445139021 3135360292 +3595143471 2495811134 3595143487 +3478880607 3081845377 +721088673 31158470 +316944252 959889447 +3468994043 381138623 2056342052 +1138388840 954032299 +630159573 495430088 +2023134888 1541399252 2098145917 +1202539614 869218281 2156772738 2385847913 +3841058996 3062248735 3845899353 3062248712 483480409 +2450206945 2225220131 111430416 +3428873080 869647867 +3673442253 2072840100 +517424891 1916310249 +3208262371 1172640199 +1885328939 299771298 +2241916785 687870998 657026039 3445157606 687870977 +1522688438 2830555009 +1840130736 1496134421 +1007285408 598480883 598480869 +1074190173 2536928920 153793065 +2672802229 3082589803 +1195608543 240257566 +483297516 1159826327 +2283416587 1278432578 +2241547573 2289732202 +3047069487 396885752 896950395 +1944448679 3210244274 3210244260 435597536 3210244275 2790724153 2245143895 961987280 223160067 435597558 +1391991789 2308175364 +2138633426 3886473931 +1445636427 4029186306 +2235187040 1102508994 +1469612649 1310018382 +3415877775 313383192 +1870086835 2603471158 +449096374 848668938 +3458361906 2989304997 +2334769297 1426817341 +504792291 3512120263 +621003267 4060481008 +2449300069 1153966736 +717203141 717203157 +2531097378 2531097394 +2469354360 2079570963 +1173740324 3817334568 +434160710 47512097 +3934179555 3934179571 +145563391 3224035691 +2826197824 1865131461 +3961192417 3961192433 +965940365 965940381 +2266166171 1037401362 +4008466146 837059 269278949 3608891882 4008466162 +207685803 666936610 +830763402 2373899645 830763418 +3722327685 1476653433 +2777144087 2777144071 +289780874 289780890 +3937110777 260615902 2282588015 +3257579960 1631739053 3363300435 +3786993512 3485984950 3579949031 180472212 3189825725 3086127696 180472195 +1777166186 716819405 +4029071403 4029071419 +2243019379 645501943 645501920 3141937421 +798164164 2825945247 +967564608 1183222745 +3176757142 816729770 2228981857 2849456433 +3886203338 3886203354 +1521695191 554749173 4123076418 +2900633656 1663782971 +1807870029 4013994290 4013994276 +2301084307 2090290554 +2412029056 3099063736 +3400154730 1946173659 2003179717 1946173645 615454630 +3535704366 2224707186 +2528715507 2528715491 +653493228 1297663399 143898085 653493244 +3534915260 1978064035 +3983560716 3553493736 +48637305 380256070 +1394574844 2441227735 627688876 +2917957990 271379810 +591063059 2672140631 +112331766 245414187 1486361694 1084634835 +454689550 2721838223 +490832547 2971707036 +1037089207 110385926 +1285420995 1605175274 +3899822089 4116233774 +895812713 1996878168 +1207437979 3866669572 3866669586 +3000253088 2516942055 3859069769 1847808771 1343236533 2214678402 2634118882 2231456024 3074184059 605571571 +4170160333 386763428 +4235190060 4235190076 +298454220 298454236 +3337578762 4065642021 887249586 +2975431 242797398 +198908520 2500209098 1478745800 300585405 +2431634800 617836564 +438581975 4261978214 +2305220777 4126386702 +252650770 4137529406 +1129526190 2851756783 +2251342561 801300848 2251342577 +909476036 909476052 +2248150389 1729441578 +838054707 3584235866 +1562841208 478080237 +2992132453 638067194 +4124750004 626015519 +3324243147 411580815 +3260603803 3260603787 +2575451164 3289462791 +2863673451 509360244 +1412053123 295403649 2319818854 +3739658126 1931068559 +1190798639 3939010808 +411072262 411072278 +2652283942 2695523817 +4261771373 1335661467 2036214505 1335661444 3713284894 3754808872 4251448613 1908829512 2308509737 1908829534 +1649029083 3154476005 +2711529435 3133619102 +2826011081 4088352632 +2228077467 2867522834 +3769948095 2075107745 +1785541920 2850726259 +1701150616 2805558458 2107619920 +3517204634 2677951101 +2763979853 2779196722 +2458234309 1836092684 +3521942202 1021586544 4017953093 +1921966086 1826968861 3757056470 3160983110 2482648954 3160983111 3160983121 +2519847521 2519847537 +2773148109 2096364991 2817279780 +4221490728 4281935547 +156873496 2421419173 +1730478339 1588581659 +4008697681 4008697665 +3797644963 4177248924 4177248896 +3071508126 3517993663 +3203283072 285405587 +3878275570 1223990750 +3378011318 1943587457 +3099056801 309519111 +373344564 1006419161 +1983523727 2895286808 +4263991198 3052334518 +2773950866 3660175571 +1967218421 2330491818 +519082146 1454616323 +2075479146 677857997 +3631590228 3014049223 +441485844 2160680313 +1809040008 3735003573 +1434161146 4116304894 +1732285311 162017534 +2756567470 1419396335 +4171505276 3553596455 +673214701 4126751557 +2113227792 1495711029 +1684008086 3621688115 +52558164 1115389743 +3920988362 2999342587 +610186077 1007409986 1226698890 2395464363 2412241969 2292988208 1007410005 2652134242 +3974568419 1916518134 +3933756231 3261808196 +2281937836 1040370880 +2303900327 4197457075 1205524025 4197457060 3560690912 +3912703609 2596599934 +3506311059 2465367162 +440460708 1807218493 1640086080 +3282787496 2932005995 +3397761417 1501762232 +3628698689 3167210048 +502934714 2002843522 3969636630 2002843541 +4127495194 2359249091 1664427261 +2875724729 2273854878 +2854626903 1511637614 1334649954 +3297507865 4174084092 1469729200 2345983199 2351638958 4174084076 +1365385344 3601825023 +3722289201 1056813923 1961045286 +1444430064 2016295381 +1426309531 1764960805 3772085874 2484806992 1877591812 197947173 822365000 822365023 214724795 +2013196425 4030985966 +3551874194 2113795885 2113795898 1038729918 2231239223 +2081684885 3900191114 +613829581 2791229326 +2082853801 2082853817 +1102323691 3108857342 4008516111 2924690283 3511287957 82555211 4008516120 3000471241 2991413998 1502494452 2647008441 +3739266691 1588770858 +3826424923 1682711373 +2031726249 4117105663 1595355673 1595355662 1282274318 +130596719 3496960699 +3769971704 3040923515 +2008358371 1428032586 +2112174663 3351452185 +540559559 540559575 +3490149726 3183960919 +1280246985 3544366802 +1622489453 2856937106 +743816880 2926255627 2926255644 3226090547 2063281941 +2554951943 1893593618 +3317325348 3341400318 +3723878705 3723878689 +1845134593 576675968 +1403953670 3253276513 +360912721 777892998 +3737931245 4291246964 +2261688974 3309954447 +2830811477 2136634528 1348847084 2083951255 4076755164 1348847098 2938099 1322792033 +264821974 2939397361 +2370007024 1361655491 +3726666409 1443358744 +1482958894 1403732079 +24907654 3695996919 4272794486 3466188834 2691473997 2373684977 3209968517 1580154242 2860647792 1680819946 1634003665 2356907371 1580154261 2759570225 3328037813 3337861296 +2238134326 1569442741 +1157867594 2309100533 3374880380 1283336010 4005686381 1950226556 906849175 1154959774 3771661407 +413161316 569303356 +19699742 4147345215 846064968 +3676972921 2086413160 +3720552037 2133383404 +3642287077 2804859244 +4108514445 1807448050 +4096023191 3963263910 +3057560526 2318443805 +2618310706 2863014874 3751087795 +3838883681 683767174 +2159012519 1095293656 1005479145 +3148066955 3987663554 +3322729285 187733388 +3061349992 2813263275 +4229685340 487777307 1004679384 +1493537617 1959192710 +996182309 3327446755 +1667626963 1283793210 +3579322173 1676641770 195993167 3810933802 +653994775 1952765222 +3400170815 2937806058 +1862692323 498156449 +2435446419 403646842 +3031047099 661815912 458045061 583640946 +904087086 46627449 +2618863190 1703885103 +2491757435 1940179730 +2205643682 2534082563 +3084437606 3494082689 3084437622 +146198266 2982663069 +432718543 767720747 +103972910 4018129017 +4291891371 1629306146 +2214366301 2214366285 +119283006 516004287 43052796 996506505 +3772169426 3289071237 +3660046456 289687827 +1914806620 1914806604 +950705145 3175131102 +493602026 2456203026 2339176230 2950644562 2950644549 +3158202655 946626965 1965444040 4065880993 860441547 1026090674 257464640 988740497 1906158943 4184025637 908647346 860441564 845961226 4068794495 1787729837 +955897162 4288764661 +1751043096 1698384333 +1399143186 1399143170 +2770648254 2857318612 2673790541 3833588458 +2102186232 3402232057 887511016 1997008275 1997008260 979195776 938276461 +3758185702 755770847 2198566645 +2236744173 3440969732 +1065178279 2571911904 +3507338105 3507338089 +1205333561 1374421946 +3406943584 3116387387 +3694969280 1371602843 +2129312550 4051999959 +227591651 2946726621 +1802319549 3656199043 3644708944 3656199060 +2881099560 2113041387 +329991944 1002320304 +3039333255 2578075352 3157100676 3050546560 2311825369 911849527 +2670717830 510641121 +2716717013 3193842780 +636851822 2670171209 238073122 798740281 +661815904 282676311 2034449708 +4108124678 2112499575 +3036977676 37650679 +4272296136 2808900299 +3912941362 2409249499 +1809211417 2371835855 1969172997 3386621388 184307587 2388613461 1964613852 626533446 +3125402864 843500995 +393741593 3903249787 68783167 +394130315 2252760020 +2009670401 1767782589 +3457465477 4020553036 +2246105700 3344595044 +3453469148 4135645260 +437517628 475625251 +2524646005 2372116819 +1148445191 1054607844 2726384121 +1850602193 1974812422 +41640460 4097530081 +2261235515 2763146156 +176721974 2418600470 3405448455 +3521937926 2102439799 +4146807846 814028657 +2499275155 3380177070 356823660 +567553985 55283354 +3642475658 1243700197 +2909239738 2909239722 +2105956413 3615287298 +708972742 1275094945 +4048136039 2570875513 +413452880 3753078820 459963381 +88857639 3495287347 2104201568 +162700030 119186953 +3242636760 441467675 +3422383206 2247206039 +3252319271 1373952352 +2365414391 2909736061 +3325019608 2928745829 863061484 684073331 2928745843 264485757 2253632410 2928745828 2270410016 +1072928512 2893460741 +1908244470 2124464087 +811849250 2471124973 3407151620 +863739503 2056939704 +1222438548 1204523769 1204523759 +1647334929 2736225478 +3185461534 49093183 +2343381537 1297949789 451713632 +3458361897 3758561689 2838306446 +805268356 576234161 +486157085 3134316212 +70944952 2415750336 +4022464002 1964924558 3284949627 3875245597 1948146936 3875245578 +977828435 320377018 +4031795252 2188263888 +867986017 3533403808 +784479511 2998506288 +3034683707 4196677604 +1503189059 1561984253 1011263024 +152582329 745106498 +3684472089 3497965150 +715593660 3775552743 +1614999066 2740769506 +3828541466 1445159147 +4289374669 1185500580 +1284982644 1174507977 +98835197 1125547074 +1808235524 2936552009 +130266625 2176990144 +1248278470 3040615621 +728296341 3945454492 +931413959 3694201255 741369430 +3475058565 2520632915 +2892980102 1967133137 +3087010928 2841495435 2372679944 +2925581094 2825675969 +4149255002 738730486 +3357903737 2350550910 +2324985131 2115290114 +810956716 3728525527 3728525504 951712506 3795635987 1993204796 3283723201 +304339807 3983693448 +1183877045 3397755388 +2060458059 2171004085 +3949059352 2735672525 +3393347759 360592248 +3180121370 2124865533 +2012842647 1960127408 +96399141 814905132 +335738413 870474373 2913568978 +2296455761 3159601633 3412657542 +1040095072 4157099045 +1768786561 1055339159 +1284456386 669946318 +4043775334 408834714 +4161050438 538486586 2173005713 2173005702 3040486199 +377540536 3446890262 +1212288127 252290184 +2173911816 90720239 47351188 +1627097670 709935766 +1072683025 3212426657 3079742150 +975786939 2462608543 2462608520 1638329817 108591188 +441083744 3345324447 71820445 1152019428 4099330208 1152019443 3328546809 +1941340229 1833692307 +3293821496 1204692525 +2130530875 2278141445 +1730704799 400817226 +2659812127 2657393086 +86914953 4001240568 2965466286 +2743511699 4294870394 +2949610310 2918544186 +97426341 3376350394 +2482172411 3799182884 2666324671 +3690908661 2577293722 1192956604 3830043091 +1058124962 3774983202 3940506389 2904518510 3231466923 +4242340291 3996083120 +267297947 3600923762 +2521652535 3267994742 2521652519 +3319248175 2468955061 2820411160 3122223077 3840240943 3672464763 2803633538 3672464748 +1211875921 118678918 +3779882591 173129630 1037329761 3333456668 +3085095783 3776105270 +1034516734 3781503295 +2011898314 2435199213 +474351011 624615306 +3012315719 2726187890 2642299776 3973639616 +3502798069 2693799338 1826534029 1826534042 +645080244 2736771337 +1616684066 4252729661 +3408097013 1867727590 +3069494199 3069494183 +3023509706 2145661382 +3455496340 1685911115 +2687239243 4029304177 1883947522 3327725698 3719269323 +4207077337 2580740744 3240132706 +953170009 838044478 +2560580250 3705380971 +482963188 2962168350 +3621005406 553356265 +2376579538 2835172537 +3540527169 1574938137 +164989393 1277686790 +2782627670 3863751658 +2412902474 2978602093 4144371122 2978602107 +3052943229 4072626626 +718866528 599923940 +1774622493 2108802324 +363501325 680249700 +2612667923 956952570 +1885939967 1604931243 4102785384 +1515344548 3818402127 1515344564 +797057779 3788238477 3689818231 3168601228 +74101642 2113446459 +3677160697 14603262 +1523477933 592012805 +1394642848 3373650305 +3562358722 1907045688 71300725 531689662 2710240009 +3427754004 2776111104 +2905669277 1092669748 +1816272662 2182541233 +2985950965 193643219 2046053517 2046053530 562846634 +723721369 3733701510 +3566790351 3566790367 +4133716120 2495152343 2776182187 2478374721 4131148390 1420004968 983786859 2776182204 +1751986673 3985429327 343435444 +2217522309 2539662682 +2866169076 3525533844 +525002122 3437713458 +3219958422 3079703089 +1046140192 1383601304 +891192224 3323350625 1057567973 1057567987 3036961032 1137690374 3509014807 662589341 3323350646 +3331642063 1799871438 +395585589 1884796890 +518859257 37283294 +4028188626 1060930682 3385593747 +2475145788 2514233968 1375327340 2057972849 +2420940144 2522087704 +2070174242 1626989461 +3379462140 351500721 +3019832413 3076998772 +3962623572 3564199040 962002547 3506820599 2638807763 1678664638 696998877 1130470644 2789806348 1772488514 1827631674 1827631661 1272181259 +1982000003 2434119911 +510167240 1407361392 +1690785951 2621249354 +2965671436 1366007009 +1195157856 1635780292 2222891571 +1625761026 2380218915 2037718283 214991001 1046263874 +2601015398 1948461207 3304823706 +3871208283 1304789072 +1845072027 3135153170 +566845487 543403345 +143159637 3284822236 +3686729740 4189694711 +2815976144 161713507 +2222273148 4162373671 +3054253811 2285535372 +4264749127 1898162134 +2316313016 3911158852 +1210752347 1210752331 +98688120 3129872635 +3222208817 981334860 +3635691620 2277596521 +1591645610 1626497555 +2294272389 556080554 +905058485 2323405914 +238228837 840472649 1324343453 1133815203 3211439610 1324343434 +2993241489 1823206224 1823206214 +3647792894 2596000286 1148166623 2394668842 +2087388822 1597323105 +2012508833 1743401091 2272372528 +3797498427 2373364466 +2230725447 3039137348 +1893333164 3814354748 +490846534 1417062711 +817973155 1665385866 +3995962896 3951227576 +2386276668 603455857 +180516253 2367628834 +357813934 4126165539 1646164509 3345456762 4142943161 1646164490 +1053188014 658986482 2152242937 +1953650145 821899552 +3592357116 4172979415 248830119 1175517868 168894119 +3823242477 2849659140 +1657513181 158261470 1670678516 +807574843 1450724012 +846657701 3482621386 +3968266365 3152948597 3580662978 +1593339224 3641975181 +3752061863 3054237664 1960261043 +1394994645 2727347834 2727347821 3232774313 3635437171 3114741304 3652214793 +2703033761 1813979711 +3032989925 2339684796 3032989941 +3293776062 3434529539 +2381816968 3171636149 1305789948 1187360883 81265163 2176254640 3171636131 +1764422859 2782733244 +2049935242 3805437485 +1200742445 3617842884 +3241256852 686455943 +400832327 2189457988 2120104217 3812820160 3758968556 2189458003 +3970137618 2655470778 2655470765 2437858110 2539615827 +4259204062 2962167810 2702242281 2196860521 +3489479279 3935558648 +2798719878 555858913 +1999077686 377880714 +1900655336 2769180880 +1121073372 2854524821 +2762034609 3672985008 +3399054593 4036178048 +1499451176 167804580 +2144837132 836339255 +2185649320 2773752003 +2590874407 1099644512 +3884759113 3683005448 3884759129 +715934821 715934837 +3187839123 3187839107 +189710750 1794821033 +4192711894 1036102897 +4055663662 3116635257 +181263135 554693064 +946950300 1986127249 +2748566294 64149042 +2155579037 3134252650 409972547 +211617538 3517710625 +3544901113 2229852644 69206488 +2791396491 3997953976 +3465235406 3688031058 +2445622438 528382273 +790462023 1919797718 +2740108665 3898135279 +1871454697 990089151 +1224183302 3259806691 +1558116925 1479519522 +499594032 1800603956 2960713355 15834776 2960713372 499594016 +3486116333 131809298 +793722456 3518964877 +3171205340 1786485329 4053003664 +2027210159 3857920632 +68052202 80927990 +620919003 501498066 +946222278 2397377441 2397377463 +4108985239 4108985223 +4044038045 293782580 +367828331 601052207 +2851146211 1769115722 2872133081 1769115741 376891726 +1430278193 1698577702 +3846776030 2944323243 +1925629141 2213010250 +2514929903 2118666284 +4085161543 4085161559 +3980532983 2761593769 3363616597 +3541456096 1009235395 3541456112 +333721879 1731807014 +755550336 1691591059 +2836798991 1020350862 +1000024407 742527974 742527984 2617598659 +2597212313 1271455966 +2361158768 47571420 4238259285 +2591505524 829396319 +1497837933 3244949851 4161982084 +1741866501 1741866517 +3167699086 3359809423 +756485447 2759451701 1112139478 1524788216 +1481443321 4198730984 +2626835852 106736503 +1762187647 3622724350 +1666427895 1666427879 +643356267 4029085717 3369699956 4045863339 2725573784 +2429041343 2560431740 +577852747 2204714242 +3996565224 3895363371 +3451015256 35445008 +3535989342 651620863 +1305672441 1814101208 1712692937 1305672425 +476345446 2524471729 +1134805593 3553292808 +924691998 3787004223 +884804826 222137550 +107249949 758595764 +3907014456 1496395655 +325498186 3568264059 +130602695 136977216 +2584702749 2739661492 +4072947724 3708912244 +3654449864 303987207 +3109883847 3013722824 3475449497 +3590480742 3387055792 +2814530371 2600293552 +1159042762 3326810162 2331795451 +1899887734 2124992577 +3887687973 3990914348 +4248253278 4226145513 +2038108219 2008714468 1655427387 +933994478 2435629999 +3274815122 3645007813 +2704827954 4257800357 +1946516749 1472923963 2980305764 384988274 384988261 2980305778 +1648202917 2813783416 2931226764 +4087768748 2391150528 989044929 +857034442 852099162 1656841711 3302219902 2394948550 2121653564 2984087602 2984087589 1673619317 881526779 +1128488807 1242509088 2299353721 3051827058 3438260325 3051827044 918928156 +1938496902 2111880186 +1647277730 1248760969 3040227324 +1657513167 1435791822 +2165741210 3158123618 3499037803 +2954834489 2167471228 +4096844507 1140137668 3051898644 4269810053 2445598013 +4199630681 1727222039 +658621418 3062327643 +1715455264 2740527596 375607667 +2239710011 3149054980 +393650236 514059448 4094535099 737046802 4160659823 16691099 2176152292 4294880773 346283263 346283240 +2191288771 1597668860 +2823456926 1268765424 3869611594 1631528002 2337607849 367615145 +3193862160 535224067 +2313922194 2093228222 2952214483 3576488250 3576488237 +703044649 547017870 +986942448 3385932519 +1707178275 1385280028 +4252681333 795276029 +65281671 1662275955 +1485753333 1353605516 1965672668 +1354645970 1980436090 +3992047153 3299317552 +1520543490 1761907086 +4208614042 2163247203 +1567577896 929970064 +1394126097 3132824224 +3920251496 1058218411 +310102188 2831106519 +2567341769 3329955641 3192276872 2567341785 +2401906964 718906495 +4287741329 1262477089 3815598918 +2566598105 2689525876 +3092660291 3092660307 +869420898 4128438083 +1250046431 216573834 703889950 +2283496966 1226939233 +1569802475 917883380 +1010710086 1093090362 820881041 820881030 +461234064 1732991485 375296907 2210689762 +921235844 4105450207 +4071995709 1360173826 +748050516 208285577 2225933369 +269905636 4174649468 540349526 3164677219 +1754023536 1863268104 3975826379 80929347 +313227291 1422337503 2129531524 1422337480 +4010675662 555727695 +3385177001 1262080792 +2076955528 1776156445 +2077820193 396563190 +87534296 2538638389 245494289 2473001261 245494285 +530810325 2741743178 +783597362 3095985075 +2035632282 2035632266 +3980782666 3474126957 +683987954 86444196 3848178654 379600283 6207063 534357491 379600282 960559890 4266633401 +443522058 2813502395 +2951223491 955302388 +1944234632 4124210205 +1146198557 3311685228 +630685284 2440820585 +1595675512 1153360374 +997461237 598739597 2360370602 +4087601014 15478481 +344087647 2822203784 +1518844294 162074081 +4277990309 1975448967 +2294275866 1611412971 +2766552848 2792703541 +851010536 851010552 +3240252864 3373071699 3295851404 3373071685 +2441539254 3834031233 +3670574085 1870650983 +1132015016 1045143244 +4006803159 3765816911 +2789354839 2789354823 +1491665607 1491665623 +1992998374 807931856 +3234188301 3704084832 +692657935 1304491569 1451697687 378621629 1304491559 988339034 1304491558 988339020 3541585190 1653029105 219931790 +2727926455 1666900770 +216874213 1047977068 2327623715 +1509798143 1509798127 1697428363 +1200718558 2282816361 +1153853715 1465346298 +2792393890 158522794 2771215107 +671690578 1340224114 +2199034834 25688173 +3675536788 1960636399 +3146475439 4150207806 +953512066 4194311331 +1021346828 3290160183 +1901439919 1182662854 +1503348153 3294349214 +2212719319 870269012 3331327049 1979789414 +127723685 813958602 +1720436615 1243993758 1243993759 1243993737 1963408265 3771882335 2087911394 +2850185575 3596571958 2850185591 +1853515566 1287407022 414215535 +3001444820 603638380 +2076426203 292426655 2454891493 1713838258 292426632 2471669115 2320670543 +691524006 691524022 +662990061 578255108 +3368204853 1066082666 +1858884492 4154951031 +2696344646 1761578565 +1255742419 2798046522 +2841939338 860540973 +499725193 2969958978 +1020900528 3223725039 1849234567 +1370980288 1675500371 +2308795947 3110646351 +1145355392 1074157645 3137797560 385679652 4164205971 1074157659 +2080759559 1144920086 +3109883842 2407517813 +3542406332 519758833 +2560838624 688943539 +3305020216 1422809403 3244185664 2916508115 +957637517 2689868318 1746450158 +3389767229 1300003348 +3421602849 775094240 +4207410401 2849183264 +780915939 181104801 +1673596085 3186032874 +1617246102 2116898913 +1441200308 4003038031 +535636131 3359670325 +3359673805 178207140 +3942150579 1048311072 +1571585015 44700878 1151408082 44700889 12501454 1110529487 1837573584 44700879 2053178265 875642841 +62347766 45410538 603924929 364429514 3483541073 3192729503 3537174223 3259839979 4256733952 2289561940 347651892 +1330810973 3412295765 +3646141854 3961442729 +954439709 2873652660 +1945122185 3391672197 203703992 2534155624 +3207022759 2219623973 1980390066 +663197538 2624802627 +3071635429 669515549 +350880540 620880682 +763798244 4104223003 +3843389108 1860022752 +1396214225 880815037 +1384970933 2905964865 3719763110 2872409656 +4165355614 883158015 +3929129136 1788604444 1954858952 1548899605 1788604427 +542886488 1216317572 +3634236796 3139194416 2872613681 +1577228516 3793137407 +2345056577 609024625 1255514454 +2683586165 4004423270 +1494715780 3289630431 +2584880827 3931964776 +3543275513 1578091393 +1210865944 64357029 +2291005462 3496517236 +3327219998 1343179318 +2628746100 473913231 +2553892084 2519999513 +2095019148 532969569 +1569508381 1638224290 +2827595956 3507959500 +846691704 3927606253 +3424258069 1643821322 +37192331 140673236 +4180627249 1987684902 +2001559179 1506530498 +1420504299 880260596 +714665104 2663147171 +4228144865 2615237664 3267859615 2502226004 +1966593350 3437542689 +456591157 502188604 +3846082135 1133682110 947524326 +3119656902 3119656918 +1004994987 283193807 4154957876 +3457657478 218420433 4114706657 4188343034 +4239974469 3538658599 3158234748 +3253615964 866975248 +3569045756 1204672037 +1360691346 2403879738 1052272083 +2153405507 2153405523 +417631693 4241177010 +147206428 2777126819 +373056926 1117905730 +3776517565 394082452 +3661862351 1734661336 +2884701449 3044508984 807183108 3525745788 +3033511283 2777693943 368747532 +2569513769 471875460 +652724397 2769139972 +3630997114 754809373 +381067245 2927477266 +4248194991 1266643064 +1384627929 1384627913 +3513260226 1901975510 +709085912 1622692365 +386392934 2808805783 +3715117822 2510308831 1783496222 1783496201 +2711807066 240551970 3446503851 +3450736155 284585215 +41534993 4186063188 628646397 +127994889 1373388398 +2399642777 1355116904 +2308710896 2429119701 +1283909938 2858490291 +322630912 1286279147 +1438567561 2220620728 +2358225255 2358225271 2905058592 +2449975007 1878020505 2063156499 3074475776 3238768926 2724704765 +2228209149 269790539 +3800788022 3615185159 +1459102269 965809461 631105026 631105044 +4099732790 3830842385 +238830632 4079779367 +1076411742 4108283703 +2281063020 1957335041 +1385805279 2725631626 +3752758221 3972404132 +1715780414 169252599 169252576 1118956556 192012813 2894892102 +1229665751 1273271186 +1336247035 1972536729 +4047805658 2508496957 2508496939 2835540770 3768245386 983053493 2328372130 983053475 2835540797 +3835755906 2281284043 +1351924704 2873743021 +1867160826 745872797 +1679355588 2789707908 3800781231 1463803529 3800781240 +825210000 616114550 2376524839 +2034324637 1131208811 +132390407 1931166998 +442378182 1211669665 +3022430470 2664397921 +2869608843 2869608859 +76049161 734035768 +4195042651 4206767704 4206767684 +195075223 3987613699 +2865988360 3698563596 1878098225 +1688660496 220309628 2193782581 +332016972 1933921953 +3365743227 1248452530 +1611570382 83941459 +2359505607 2359505623 +1452498589 3351420638 +461378168 3941973786 +1503818292 3346373256 1320798169 +646183135 2160117512 +2827738079 113104054 2380489098 +1558507811 3734531850 +537957776 2654207996 +565075511 3403207348 +2870246517 3326077994 +888434337 3305680765 +1559783170 1560946741 +1933269611 574952028 +2304902628 745272150 1489972067 693061119 +2349647853 1696512516 +775723910 3892446985 +3044244596 2744471240 416082585 +639609390 836298361 +4105186710 3344417585 +3584096604 3584096588 +3721378048 771767045 3721378064 +2475690275 1857970698 +1598683865 3665159070 +1461719885 2499056804 554040895 4112764411 +2814925622 1909540626 +2165908073 2744200014 1772893503 3414633422 +2094575072 1763293107 +321147157 925606940 +3190105627 2009531624 1657188345 3796030958 3812808564 2009531647 +3349614568 367664661 +84293662 4018624553 1962020546 113923881 +2901775239 2943680473 +1718029658 3310946385 3578890230 2386166973 +734754547 3830202508 +1338017265 2098387558 1252904577 +752187536 3880601192 1665367124 1965234941 +4013185117 3966179956 +174612482 1682907957 +1305421369 1738529822 1955185455 3055102888 +4247079368 1236477387 +1710498124 1308427627 +589140171 3233226684 +1784153653 2054802470 +2540216729 4078909054 4078909033 +1198801271 4077063750 +3109883854 1311894975 2608849241 +2312143925 3337712589 675290986 +161236345 773408843 +264650279 202633350 4229158752 264650295 +446403746 2229992195 +2884108586 1309309317 +1413140488 1413140504 +2102844809 2102844825 +717703101 347467412 +2443876069 1278084615 833289756 881560186 +882809878 2895939809 +2812650125 1992221691 +3968611008 548660300 +2267469087 2267469071 +4283349068 726364956 +1621043108 3196806953 +1305959182 2303007506 2550421273 1574243481 +2196033573 859023916 +3003976549 1116270572 +1954901965 990838706 +3940691604 1443844847 2411442804 1931451903 +2317621843 2317621827 +3417129857 851533136 3417129873 +691366235 691366219 +1647858658 1326276883 +1832419202 1911601578 +1928224084 4068588360 +614797949 752622274 +2796088204 3605567262 +1317511054 763374735 +4293830803 3680450326 +2676215521 4252937248 +3241921595 1814200557 +4107624193 1826918016 +562505044 465552185 +4269669765 626399322 +2821528823 3053754566 +3226024526 4232059309 21416153 +1200560330 1883506171 +3141906188 1536183571 +3008546351 2051931118 +4066723378 1287832734 +2197762237 3261007778 +3955225886 1026481705 +3746149889 2181661590 +4150561494 1091761569 +3539834689 1714756416 +1011554229 2357392218 +4033168128 1869117715 +3268059471 4093374296 +3928498301 584596235 +2367950909 1090632062 3551985993 +3992137645 3992137661 +3864513091 3744687996 +339446819 4202376455 +3981447656 3378064848 +4111219054 2912101562 +1517051121 3619165046 +1388560 828025141 +1188919471 224942801 +973579876 2486624847 +3782011796 1920391673 +375917927 2899122464 +926363666 4222568109 +2839867311 646271096 +2706483926 882185654 882185633 297472618 +3490761184 802657453 +448012865 448012881 +1429753506 2048687538 +4084519704 1571929234 +1816330476 2807083194 1623448147 +971187312 2425510997 +2219417706 1450791169 +2460832174 2497156345 +1324814833 1072774768 +964826893 2496285042 2893127269 +1675263244 3545038112 1675263260 +671733045 2994554771 +714993048 2893350871 +2258420073 2258420089 +3880087953 2740045638 1914170199 464124164 1606202166 1930947821 +200813934 3645704139 +2964117390 2579109597 +2926138104 1486712192 900546436 900546451 2278399085 +2893665855 3268166974 +2710021820 76249575 +1946349692 480285479 480285489 1103607344 +693940457 422457028 3443016859 505781849 819401619 4179260607 359059072 505781838 +2459103308 1315951407 1449186644 +277380580 4160941991 3653041580 3940429311 +2243789719 2543773442 +134525918 1835470169 +2356542035 525680320 1266505144 +2411805100 4180527575 +2874573808 642118004 +814941778 3728764414 3379753733 854894317 +3282747473 3282747457 +2070234258 1842107804 2361514482 362621470 3422497443 291155771 954165950 291155757 291155770 3530224083 +3025218943 1523228414 +425344221 2847817940 +2328126020 27416906 1525199151 1263463662 4232297699 2705647364 1525199160 3935479172 3072766217 +4178298458 1737047997 +2625572707 3204790474 +1430259811 814699281 +517500129 1874028064 +1661970723 346505749 +2313140736 2758234587 +566863302 2355327210 1979471557 1619061955 +1160924952 4130498955 1160924936 +2529516714 2487727206 +624429444 456587977 +3827667403 4062478978 +1128529139 206869088 3607573146 319081613 +2827377670 3355615815 +4274826880 2620830597 +725519035 3463734386 +893782844 423866225 +1639536594 3393877463 +3422374993 48557024 +1958193681 1132650422 1132650401 2493826087 1958193665 +4085066277 2355549359 +1061042882 1705427397 +235965789 2165213538 +1234865426 4031517509 +3383573745 2465917876 +247754131 3526917740 +724530412 3887402903 +1157727577 4200917768 +200520678 3957314678 2608622887 +2500067423 1806838625 +4285600648 2801909515 +2412011541 1730363658 +274109338 1380604797 +1457316924 2520201482 2530620963 +2418132672 947109496 +3000554351 4199864238 +3774234546 3584443699 +1945122205 2296420112 539256372 +2549310586 2878396910 +2512866958 349426204 +3088733848 1380056115 +382551479 287942660 +2038557887 109555880 +1072727082 974098153 +933327567 393675313 +1070637207 208457126 +3472849510 3632011829 +3535989326 383178959 +190254575 3372937016 +1094484736 2990684421 +2148909547 2369799394 +1121341661 4146754773 +1775720133 2040689280 +3296307099 3867334930 +3461722110 3471051999 +3851686025 3925327050 +2562660861 1909844308 +80899378 2243729626 3376539059 +2866901973 105743717 2673861768 22409568 3588839516 3588839499 +858622182 3954625073 +1332458602 2156731421 1332458618 +123245132 2728670304 3698216353 +877233012 3015300735 +1680796192 202460909 2420718488 3963567876 +1727142236 1528681143 1897544208 1727142220 +1855667687 90337952 2489256863 +2710606376 2710606392 +2323063523 3700157276 +767177753 767177737 85977656 +845588433 681192976 +2125470840 3879522541 +1521026772 1473736691 2744956692 +3942477828 4042741343 +2917503937 4237571484 +1618480000 1559894668 +3784811691 2046954712 +2137970732 3243200220 +725281055 750582750 +2908469404 2204343687 +2918326585 220875938 +2759055292 2656869617 +2489798611 1906485562 +1122040680 2955658429 +2477143668 1894494839 1661440652 +3330540322 2748378755 +3705804932 1005361097 2884108078 3001551422 3779600265 +848694436 2950255257 +4261700124 98739951 2294465604 4242960903 +1449636611 3067993831 +3784399837 4107508962 +3496155359 3942655774 +246071650 2596897529 1878392957 2026794325 2002807726 +1202681946 859469227 +3759330547 2963618458 3030783117 +1283251607 4287681702 +324165189 2947180172 +3173601703 2938768292 465127401 2131469062 2938768307 3173601719 +2700665982 3855594057 +691863935 1778997992 +1883397430 4000889873 2167960714 1863319297 +2995651669 1787875804 +1194900340 2454656921 +4257024971 999919746 +2703221966 1932865625 +2494318902 1094139911 +2353739836 3105793008 376014449 +2498599375 2269744160 +2995954683 400041010 +1013450771 1068130966 +1563204778 1463459739 3964223762 +458528622 1948934703 +808890880 3860477459 +634320995 3889234908 +1804682355 3366895884 +3043574367 730560284 42107233 730560267 4088626056 +446641043 2073964666 101071383 +2623966464 896530181 +999606795 999606811 +3833961467 3109325874 +1516702240 1516702256 +1399671387 4158548048 3151347557 +3926359760 3926359744 +1431282436 1861843676 +4003834572 1945126707 +689732750 2183580185 +2362340726 2559865153 465063348 +2917801522 800459934 4186802341 2362323405 +214699029 2936255909 +3631163377 594468016 +1589465486 1735074636 +3703926778 2639006915 +3458361918 3190636446 3190636425 891119023 +899299384 3737894748 +1703690686 2580250121 +2408619745 2194378648 +823953356 3059366986 677938859 3285811163 +1388254565 2815340012 +4043648339 4043648323 +3373307093 2167688051 1511672668 560235898 +1375539333 2522939738 +3995118577 1885545847 +2531240732 1936328204 +139923208 938408919 +3698711415 2223537232 +3675394597 341379932 41062444 3357733347 1680662983 +1944816505 4107046760 +1951560892 3654140903 +3115227049 2771698446 +2117962520 3333915813 +3253042342 3796056407 +3727333351 2752323744 +3037676547 1151520317 168300732 +1176701332 4247262201 +2406945715 3695507216 +3492792022 5068508 4165814834 1871771131 330026149 330026162 2064026453 1019188448 677453158 +2072024592 2070690613 +3544362482 514705375 3544362466 +1511481782 3834894209 +3354428763 3354428747 +1969927165 3556333378 +594077069 998594382 +3089154393 881876744 +399238021 4210502220 +3279597395 1485142999 220331948 +1108769446 2942505793 +3914443258 2961097637 +3519983085 2123220097 +610301457 1423563984 +3329672882 519752243 4157361741 +3550330763 2891220948 +1443424870 1316796615 4129855426 +4245285336 781917965 1798431076 +1519907235 1076978570 +2174809192 183823153 +2643858596 3074588201 +2745393497 4080156446 +3161816161 2872590993 3161816177 +663116585 215937688 +202877144 2019957017 337712796 337712768 +774766575 2708071726 +2241513465 46884853 +2782966688 3233465573 +2277978542 2277978558 +1788598022 1788598038 +4003118278 1670851489 +3293401246 1985832126 1307041534 2746607807 +3128445592 2229585123 +690954957 2721302706 159707172 541460671 727000212 +2937635437 1269410002 3023207515 284823940 +45687757 344269691 +492719562 2438211378 2438211365 3621773217 91518203 1450162374 +2723113578 3976496333 +844715332 3940381757 +3799737776 943789059 +919884527 1061064238 +1356354710 859190647 +1017406030 1893757905 3301359833 2866650742 1210120373 +1489290247 489048075 +2013968969 2797549230 +4216896040 3379262019 +1102543151 1264521851 2731787512 +3261223263 251714742 +1887700846 2379723321 +935531748 3835497362 3589830236 3653253915 +1376261674 2810733546 +1764150393 609057141 +2394145312 3426040521 +4238994556 131050792 +1738056327 2621954710 +2325509728 2740346973 2488162611 +2550070262 1013359697 +77406514 1968914867 +2997491868 3720658311 +1861730214 3990355049 +3576179564 171734055 3576179580 +1630912868 3904837838 +2180285054 300510303 +2705309642 1701683790 +3573449315 3435401437 +1624858688 3056764115 +3803030662 3953942225 +3649984957 941048980 +4163604233 52033912 +1620624468 1776323007 +2156543835 3030498372 +931313530 2550227011 2368375146 2670372316 1506450988 2837089317 1394799072 3704018205 153141078 2550227029 +2829022444 2293350332 +3012557840 2706246251 +502642562 2882527669 +2228727468 4120122680 +2806323688 2497202460 847263764 847263765 969394237 3367667152 847263747 +3554328105 2857982616 +3397650807 2504059176 489621995 1762749583 +3249130452 2991316665 +2944595439 3335044396 +897565317 897565333 +1571385406 1882570506 +3743769752 1642530860 +56838192 2236261251 +2437705364 1330778873 +3534000574 795892446 +1680331747 1680331763 +2427422638 1918015225 +124646810 928586594 +1824257253 283280506 +4208138658 2085706243 +234717473 655509216 +4233095344 3360849458 +810924207 3320953710 3320953721 1315726770 +2002643189 3721771434 +2230223017 3953164401 3953164397 51003066 +54326526 3843490413 1818229322 +1120032490 1710564690 +2722593377 4072271943 4251283601 4251283590 3615860406 +3838655532 2563880380 +3089682709 3079388077 4248904714 +700628610 1066526371 +1277946747 1680061106 +1848798580 3982642585 1254107080 +3777900082 2914171059 +4246375579 197875716 +4161542500 3742103657 +3872398524 3557699564 4152712295 +4276542945 1818755488 2932930381 1827984112 +3246771030 4031373044 +3435591053 2730090725 3929312498 +1168329195 2332908788 +1802122129 2604942625 +1154142178 117764842 +1835874775 1155563838 166851670 1835874759 +3438790752 4242470715 +3761072642 3089723497 +4080479893 2097089056 +922382585 2235553790 +3463859622 2856074305 +2621848845 3805954260 +786516410 786516394 +2578275223 2196188838 +1677121360 2912219893 +1318476267 2712636642 +1135340220 1134724583 +1946349690 3972182847 2693558870 446730251 320339313 4123181378 446730269 +3960992792 374117489 3249881563 +33843293 2314226292 +3225657349 252247101 2943674330 +3806742846 1854229641 +3395162306 3205844701 +1269296937 254570879 +162698670 35764745 162698686 +2632422997 1435609052 +15082042 2598489863 +183593067 2768724066 +2708587800 3379527921 1246181931 2232856151 4139196392 2216078529 3652481766 1246181948 +1277076943 2738816216 +1191648041 3088817285 +2448653494 2250452746 +3088851460 3628698719 +4049140589 2092991031 +3669725587 3669725571 +82057569 336851894 +2190886213 4029629309 3616476044 3616476058 +2256946619 2153760114 +3193152529 3181406646 +545548299 997181762 +2814857229 2814857245 +3329810847 256585054 +3583489443 2282697360 +3881625935 3881625951 +1665975409 3269017072 +1341207235 703779222 2672033917 379897008 2612193514 +1446587498 637594317 +1849002589 3678982242 +1364708590 4214725295 +1445122435 466604341 +849368250 390172950 1855414165 1855414146 1818583243 +594884190 3434618985 +3994574037 291338729 +3052188506 725774114 +2743987384 3866480467 812361147 1683470528 +1033751447 2523365030 +732675094 3579385511 +3030089999 21067120 833539878 1718029644 3660574449 1786062192 1600586330 1607215758 +1852480906 1540751419 +180478080 1309024476 +1066413839 1538157403 519705752 +1992341695 1764183937 +2699252354 1083360925 +1330314726 3604688144 2636556396 1670234341 +4231936031 3720274998 +2855010195 1984124012 +2834777034 2756513061 +2483360939 4003722453 169415742 2935982388 2957311183 2957311192 +2910443458 619780558 2958028234 +2878653041 2458885910 +2900382275 1690020324 +3483512351 3136237812 1771111807 3427391763 1690151115 3431387809 1757261608 177912811 4216232648 1690151132 +1640391017 58374639 +2735921572 2735921588 +2560567510 411912433 +2824918182 3060711767 +3989103138 1861221269 +620566963 2261155585 +3120527829 643125091 2720844380 19812848 +2804996126 1340356393 +1213901725 2402500713 +466312366 1864558073 +148340999 4064288278 +1333448917 1663516984 323477769 +287377200 2067441562 654200963 1961482965 4082685007 +1770999502 4204334671 +3657352666 101807659 +3387063204 3999054247 1564780458 1630027772 3999054256 903524221 434736611 219733979 920301827 3898388560 +782400860 3516661499 +2988706774 2988706758 +2687457488 4203270005 +2567096120 392142125 +1245050316 1474102240 2666655777 +3227381295 48100334 +3827019190 3448927633 +885770039 3807021059 +133857355 3663197716 +1879324603 683671144 +3035766040 1750820531 +2198251521 1148877206 +112934889 2177211342 +1745249476 2249236639 +3517754811 3453320548 +1639183632 3729442851 +3842177119 849706881 2463549878 3726608785 +2419630261 2419630245 +89469637 706669594 +4039007486 3915462687 2198558942 2800581730 +2195541706 3292952480 +2659348012 3267329856 2665307068 2371363671 2371363649 2371363648 3008589633 +1462035895 3860176646 +3767405718 2403013190 +1425547032 3667456731 +3021083500 3832845079 +1174850792 615813419 88122115 2359489866 2914431227 2376267472 1905826610 +3635193545 3771371118 +3143199160 2474509877 +3833955577 3073397758 1595160777 +926433048 2270386340 93016781 +3645112741 2869860026 +430701006 430701022 +3933727815 3008871808 +2039419733 3911784553 +548364738 907469923 +298984684 3137286441 341996979 +4140734884 725343529 +563961645 398250962 +567115118 2759619631 +1498097364 1360751544 +2401695222 1347760718 +4253964998 3089591738 +493363980 1458514935 +896124937 512091694 +2471037422 3388645817 +754677397 3828553095 1692118154 3613881775 1096650557 2035992167 591953155 3556713680 1894143030 1339071789 1029540073 905230234 1448980553 3764880371 591953172 +3137454300 3137454284 2958618000 +157818710 619271271 2186272310 +1096592858 3202723389 +1045404690 693284947 +4191384267 584961746 316519810 4191384283 +1977560992 1045959171 1977561008 +2131689357 722074341 +1696762862 1656150126 593643439 1696762878 862085321 +2807299941 3459976186 +3501916291 3485501373 +3515514276 1106619288 2164508969 +38255880 1869608333 2555358890 +3592720762 2319479759 +1179786613 2258748426 675569443 +295618772 4166503480 +2425288667 1812999634 +674226797 1063636782 +4111410219 4057329588 1289572706 1382874965 4057329570 1741183064 1741183055 1892181662 +3106444372 3858553279 +1857522246 2431560737 +1230750002 2909872563 +707627677 45167924 +2056600287 3622546718 +3267817074 2065572441 +3347847105 2101988126 +1175421050 3295100957 +2329251252 1110315609 +778006279 121358358 +3378918599 4204803021 1462864819 987841114 1004618720 +4071839729 2086269078 +3700898444 2306593117 +2141607660 1400773120 3738883457 +288236437 1762366010 +936043455 3040012417 1228721101 2940102506 +1810201612 1532335136 3863103201 +1848476816 1341654763 +222214884 3183490281 +1231664893 2389381204 +599075979 3241483970 +4290003053 1971084590 +1784967360 3882731148 +1742771708 1132163523 +2885392058 1997424349 +155125854 3734192745 +3461925825 2798180880 3461925841 +3100725323 1015113218 +3323599158 286633991 +2129839157 679328294 +2511675221 2346864049 +3505531249 922017302 +1992886298 307324010 +1630588126 3721560425 +1138247875 1709752246 2423950077 671511342 2423950058 +2985795935 2278754440 +3341519116 4155431268 2508766688 2418362125 2508766711 +1451379623 3592230902 +2703068677 2793837018 +1865088297 699172750 +2888505791 3336144808 +1832353048 3431974579 +1810449195 1810449211 +327087519 1339861320 +2871962579 3279198460 +3301431824 4138065493 +795273079 1069042486 +3919367923 3034171532 +1375869359 3346522271 +3933200905 3933200921 +89592047 721205031 1168494651 3537130102 +388324221 3972990402 +2133218191 2133218207 +2788341851 1281294344 +109609681 434499344 +1709780811 3105190658 +1561706661 2248449482 +2762034614 3756873095 3756873105 161325974 1311926794 161325953 +3810947917 3800531492 +1404877992 1404878008 +3330314014 1531730537 +3704713959 2226643382 +2182903559 3654246400 +1692152412 2043487134 3718200396 1683247014 1727915986 1798953342 3124104020 2280093917 2498338966 +4162173114 627401602 +524140251 3730661605 +603862364 3937718307 +1018817236 3436336191 +616056279 616056263 +36584308 3804731279 +477678969 3546936649 1261139326 +3204059352 2074641421 +267138213 2252369112 2500487339 3913172840 558031991 3373979788 3243084531 2886372596 +3657558745 168080264 +3525783799 3400668368 +2243560309 540732470 2851504451 4174606652 +3498535090 1439879982 +2292856046 3991218553 +2424285126 1324692977 2424285142 +450946663 3070932022 3070932000 +253975976 426344577 2091675516 2091675499 +3561915160 2955470560 +14713464 875739909 +4059962200 1258621851 +3066897747 3675869252 1504624813 +355654173 355654157 +43294762 3140680422 1553838226 972562971 +3723994356 1624812559 +2824624079 3630054094 3630054104 +4185071633 3241900752 +2157086342 2252411079 +2114198958 2167925619 2933331397 2436367549 2922450266 +12170748 542735281 +1555424840 736737408 978944861 +2933990393 3419391534 3824584814 1101502872 408275122 +392221159 2945202375 +3525702595 1542540532 +1577831779 1685466931 +2789524524 84502848 +3833693978 3833693962 +2886194071 1733433017 +757561774 730591279 +753584315 1889140338 +518254822 2262055425 +3907568689 2137854035 +3168452249 851080289 +2496261678 2130677084 +805395250 1969764058 3290599343 4102158271 3290599347 +3937816687 270073039 55234577 3605500384 3959463598 1023007660 72012199 1757940214 +3483194482 1185673061 +862573190 2397293019 +462701889 3008626663 +2905758658 2890646990 +1990943088 1070228291 +1766521864 3372925067 +986939900 2664775724 1381542256 +2355704595 4104324503 479946476 +420238459 340216127 3915972004 +511288464 644949739 +3100268407 1569173574 +1176479419 517175396 +2634366655 3997288126 +44896242 678435301 1514049298 2725831831 +2492577280 3581916200 +3736138483 2207151258 +72898744 1910287629 2400430509 +1915672792 1915672776 +1926196921 1926196905 +2629919212 2959943319 +3961330379 2094083476 +109918249 2035247246 +2902786199 3213044739 +3304582345 3679043704 +91314272 895158060 4050525989 +765156304 1528418364 2610006133 +2157336214 1494812513 +541277329 4167262106 140736724 1524127824 1284701309 +1894372933 491108135 2777660540 +2539270205 2147086356 +760827233 3298086838 3298086816 +3393806730 4219767858 3583070171 +3077711918 3875580179 2497353136 3251409778 3461639865 4139073657 +43218602 912726305 +1041846721 1041846737 +2394009848 462092160 +105068660 1339154073 +905748450 3736056021 569383726 +3798917540 3798917556 +2500794641 3083105734 +3408178797 1392866501 +3905015306 540087605 1859577918 3796132476 120647141 523309999 3125778825 3125778846 +3933753446 2170982551 +496537138 3374831795 +2756668804 755590879 +4134858509 2315002354 +3387442083 2074245532 +2556489932 3642488544 2895843639 1101842355 1747316572 1847811552 +4074689782 30317761 +3996178200 2857440172 +135513013 1813845500 +1355555328 827950611 +2731839769 1839229512 +115612824 4268861441 89218912 1465922084 1897464653 145782100 1897464667 +922849195 1114974772 +1435958683 1471232772 +3888321556 1618619292 387411700 599572351 3961035631 +1680608981 2254133578 +2751410117 4021826323 +3071483476 2150969268 +1600091303 3393495798 +10082208 2452517093 +419587552 3798269561 1053188019 +3800600635 3623554290 +82192515 13250550 4286347198 3368006572 +1213001402 3351677314 3351677333 3351677315 2088808214 2333855435 +1317204230 2652990561 +4168136795 2412575180 +3444021123 3297100989 +2585754644 3012580207 +309350940 3566203254 +2591720674 283062211 +1284030777 3024628904 +4216509413 2288226682 +2465216922 982993458 +3943940072 1213671376 +1240214409 4092076863 +3468078800 179759912 +1679086915 1422988206 +2957276946 2378658131 +3233491401 799197048 +1620545310 748047401 +176973356 3338983255 559556209 238093244 +4229703681 3780311446 +3568926688 3221507507 +3329838959 3757575086 +3977300111 3228285208 +377526783 1802660968 +4145839290 4145839274 +3217016147 3914826198 +3974764303 58870936 327312862 3974764319 +363231531 1272191964 318655377 +871428643 1724179202 +3312032072 222055499 +962391401 4221254320 +1014806635 4020647874 +3822373890 2851940131 +3086371042 3984823275 +3926616822 3465814742 +569814359 3161884354 +3737549572 2165331951 3061032799 +1239943114 3816121071 574898925 3967119653 3419879110 +3596387810 2676270061 1436992202 +773602451 2895702807 +1774705478 3416141623 +3708442284 3678402876 2739302615 +2189037602 2284283285 +4239504183 45948806 +3730308306 3598909061 +1093252989 296475102 296475074 2262790504 +104983943 398548441 +3784652317 988032948 +3068256309 445903740 +3089354135 3089354119 2530689283 +2898952549 1741271546 +1214510061 2849406171 3585649951 1679291986 1679291972 +1859377218 715701688 3816235594 732479310 3751979195 3469548781 3112005603 3816235613 381878505 598258356 3599847759 +3763382997 4093439306 +573806745 1882798302 +2196782950 3730131581 2251541889 1718700186 +1884573803 1069193341 +3893882330 933981739 3453906357 933981757 +1161886796 1364011959 +3344647122 2796274565 +564199372 3381140983 +383484387 3031726272 +72896719 72896735 +748940510 599660203 +3261484067 3739835605 +754458044 3998783976 1075398342 1365824476 3741123140 3496461671 1081703148 266287701 2258030311 +2796377699 1510580560 +2776743618 1295993717 +3056230401 3890809390 +3579525659 1968289759 3579525643 +3039173799 1956073138 3523156704 +1862681365 3051647468 +2196614988 1747645623 +3747356643 2164666954 +3716810790 1432180954 +3134718312 185871252 3134718328 672009472 185871235 +4051263212 1275854390 2454474210 235957633 1377445505 1661739622 +603324017 222268400 +1291889159 2322601817 +3030038742 171430838 3030038726 +3128503448 4116635991 1009586016 32296509 616641357 690209316 992808410 606923162 690209331 +2734063109 2399691226 +3085983806 1717186594 +3168645780 1850336996 +2967590569 478473240 +3713527890 3278852357 +2801479248 761915381 +3473515393 4074868390 2233293991 +1786700076 1823559255 +945381031 1538261238 +2695462991 970259544 +2974781404 4232017745 +726818412 112201503 +133658222 3553989057 2788970263 1653098162 2847728656 1515037048 4026557672 2204597918 1470529362 249606659 1627798877 1483792769 2268955680 +2677502652 4150894055 +2160286599 2781665427 982062464 +3465138257 2556770328 2514475689 2556770319 1280129444 2135810179 +4145937071 2401316858 1262388893 3006374254 +459015735 1222494352 +2042390283 2929079892 +4060518393 4183899390 +2417481960 3179967805 2650181396 +4088995754 1449973901 +3338466534 641041921 +4126010340 3989332953 729099912 +235190773 108051626 +2936199966 1508822978 +2668499682 2668499698 +4102978917 704481418 +856680641 167019540 +1148106910 1481416873 +764368583 833840595 +1851600563 1873839066 +3650358608 3557881059 +1931057761 2454587040 +3664784952 3212422340 379109933 +762654222 2641854479 +49478530 2179846926 +1927357977 362171996 705500148 +3530233540 43308703 +3195608185 1369952872 +1259623250 2363190322 1252998139 +242500364 3439692791 +3321295115 2931651650 +3874501242 102725131 +731271034 3996778877 +712490911 182376045 +1756141566 1756141550 +1834653148 3595192967 2752580684 3595192976 26863953 +133751901 2048657744 +3421290118 2343562465 +1210200909 3671507492 218463676 +1156083728 2313709884 2498382056 2313709859 +230790470 230790486 +1142081606 3128560661 +3927686370 1806325717 1806325699 +4073468889 3102974223 2267591358 276143752 2461152897 2461152925 +670711160 3990773749 1726923771 +2795020132 626459859 +573972528 954866588 3072283176 3012769988 188001173 +4174606632 3705348587 +4230489384 456293867 +1451974873 376010120 +1971542267 2952702606 +4154944263 4154944279 +2324275525 536690755 +2149652547 4145623420 +10234189 1733663410 +992320860 1653883303 +3542909677 3407552064 +4025815575 875211191 4121877784 1767593051 2783178562 1191644568 3168051546 3108988112 779386270 1930678397 4049639725 961165860 1269939324 2597789700 2444001047 +761229800 1899909140 1430278205 1430278187 +65279959 4145121136 +3549255178 1158482290 293499323 +3086951438 100779370 +3654517544 267876331 +4118842649 2455641694 +1345861994 1396061843 2994889178 2994889165 +1893641731 2978737834 +2196447414 3458498183 +2890893306 993201803 +4133446460 2634776123 338245479 169975128 +1990782222 3656199449 +2826878712 931569787 +3875840608 2148032813 +698369666 156171939 +302285187 3759661354 +746361690 419776742 +3753666560 1658236877 +419587554 3046439530 2871299489 +1194154461 3545690056 +761050923 2162563586 3620552331 2645009230 2480651170 14439982 2480651198 +2733164754 2293115846 +969845404 2622919559 +3309676712 2001881215 +3928085120 3492830796 322854789 +3085726028 1167108983 +21699134 1195003807 +3855123595 1298094965 +3175496905 3197218936 +1112575680 617658437 +2513678846 3661705929 +1585720368 4195454869 +2486622350 3763791769 +3126360185 2175080542 +1435767177 1067692879 3678585143 640188398 1438080420 899916703 2331530892 2728952016 +1370346943 1403485089 +2087673027 2790196988 +2622035997 1823650910 +3894131145 749041528 +2963258386 494211141 +440857648 440857632 +1629426157 1919704457 2507495045 1345070828 3607338550 1715216795 1645681732 4122030139 1614750905 3629800448 2863815141 639145798 1376656598 1780498508 +3227674454 2645947959 +3477043840 691602092 +3618330101 2008567996 +2997010691 959829930 +3666460846 151588635 3666460862 +3531117194 1734203890 +2801215906 2709209770 2031520259 +2783593508 1405699263 +4043566159 3089956952 +718756301 2076487903 604586757 3514709323 +2266506651 990465864 +438755041 1410348141 +4191574074 261994181 +1903703749 1995590305 +2566728871 837852814 2389503186 +1464888359 2102023865 3235179044 2593800566 3386177618 +3094395830 1708638374 4192314378 3760046487 +771386841 3771157251 375042736 +3130456125 179089483 1941101346 4171810836 +1343829684 3417382233 +3531605067 2860958228 +3393777466 1489112765 +4285780409 2026910184 +2490735869 2988843604 +1026245962 962112179 +3955158883 1126916678 +2540912809 2775061518 +2960448267 3539259988 1801919023 2960448283 +4224353482 3421287973 +3692584507 3042727666 +2321571683 951462101 +2445233252 926670436 +2186352551 3433577462 +1443630663 3110024729 +3185065973 3496783530 +3922328809 3107048025 3922328825 +2273822196 3115296288 3110396877 3127174483 3115296311 3345688524 +3023659684 2166203517 3618395818 2182981123 2499481767 1445129468 2499481776 +4186274763 2552356994 4186274779 290752751 2552357012 +569753044 1239012537 +2785024774 1106770246 +634500302 634500318 +3901896404 4237494201 +368810524 3071515143 +2973873236 1584324655 +3456565877 3389578812 +1315828270 2769567343 1306413230 +1358718568 1524575230 2917251827 +1113153708 515059415 844889902 353540567 +1388469246 1388469230 +3102062343 413081622 +1124698764 3842541216 335878753 +1676480935 1993000986 +3313464713 56394734 +1709390765 3763815576 889054226 1137426971 297201988 1040052824 +1448797168 2571556015 +1388616484 1870674367 +4066483989 814473785 +4246636463 1653409004 +3191927588 2755576255 +1745306366 835429964 +3141394475 4153545557 +3251320796 2924905036 4008243015 1773190279 +2111925556 2111925540 +2109850360 4026920059 +534680747 3011149006 +2615237670 2311327703 +3718377277 585866498 +2458715157 3372051722 +3797043644 59380455 +4221801889 3280243808 +2115305016 154336467 +2933223546 1729708373 +2774125186 3461991075 +3739799872 2293652251 +2589693663 2589693647 +2700370783 2298958902 +1371307794 328815194 +2944306362 4265052381 +3967896789 2146169111 +1057780265 1771550350 +1538188139 1268455956 1769195285 2666678680 2666678671 3209691508 +4244208889 901757928 +2068354821 2640472370 2413025785 2589474001 331895158 2623694764 2455253039 3672716247 407223514 +3132505194 1457593037 +3202156460 1169994112 +1298274516 2730065235 +518475708 2035767876 +3190636424 1590455216 1155917475 3912958731 +2151222430 2010045631 +1455625154 1461197411 +4007597435 4106560209 +3620572388 1731947727 +1837806091 2086029122 +2417650440 3784736157 +1217915595 304520578 +2885900605 105216770 +2885048315 2413324437 +26422728 3653181155 +1839713594 1656563882 622119939 +2771476598 2193283537 +4243381428 213666056 3705630553 +2574035917 1393718194 +3261098726 2873719857 +1934702616 104561060 +3228933188 1025834783 +2887217580 706843329 +542566953 2098655771 2550705435 2626656665 972094079 2626656654 299015822 4195265240 1947657176 +3547324627 548260182 +2422568395 2757104376 +1617219414 1617219398 +1479851163 1479851147 +1824679565 2125227830 1306716975 2125227809 879779562 477116704 22300519 4206182478 3540486452 97724011 863001940 4139071986 1824679581 4139071973 +2181094478 472411088 +4037833674 3263018710 3781032789 31904497 +4253640393 3516532786 1291516077 2584455309 2584455313 1566819330 451473618 518584110 502456439 211770719 176159418 3897347694 518584121 +391574026 1595278693 +2179528313 4206624872 +1189141022 1734855230 2985778473 +2179701246 2212719305 +2454524775 3059059488 +964015248 72040099 +2902075379 41178154 +1250046430 3888058677 4159064041 1650817538 4159064062 687112319 +2807902966 1840724295 +2989655549 3213721314 3213721333 +2748662066 387075486 +3506433105 130102280 2655084484 403579287 1126894164 1407255440 1336119372 2436402166 269358333 420356909 +376704660 3971150575 +2413814297 835037950 +449085578 2908117293 +4152099907 2573972006 +1979888494 1887046638 876639791 +2229183319 1859176347 3985330771 2608422447 1528902447 2735945099 1712903321 +233815030 2453536090 +4224416938 190136219 +1382491450 4066351709 +3236679076 1463073065 +2996919121 2231550096 +3402619939 1748470538 728759559 +1329620515 794595524 +2756836564 3385119219 +2199646438 1258043905 +630154403 3770432797 +1643468822 1262070449 458396714 315073761 +1779247066 2920667593 +2689912244 427807311 +3572216410 3572216394 +2573182469 1989302746 2187555389 +2431965624 3916610747 +2806192636 769637296 1252124583 +158042377 2273018745 3712530744 2273018734 1343131832 3712530734 +2757248450 2029375605 +816594324 858058745 +763141607 359808402 +2799586593 2579886109 +1313400391 1159511949 +105679556 1041126395 +2143856512 1562360667 1629471144 +1201198729 1050261934 +984855918 3605437487 +3837039887 390506126 +3244052630 3129422450 +838027633 3383426561 318545126 +139575978 3266670989 2814088806 513922821 +1546058045 1314544404 +1413554873 1413554857 +3960512097 4280898239 +3003239028 1070707855 +867605212 1148569671 +852387108 1367364811 +3464570729 2119240270 +2336129607 2053576128 +2890034006 3994094113 +129331594 4103815855 673458823 +473294416 3101265909 +3023018568 527516144 4008697675 2157748067 4008697693 +1573148296 3906229685 +3768560999 3656330596 +3810410785 790522503 +2687177794 1708188643 +2617619421 2617619405 +1748976962 771355164 +983705771 2843000668 +1885429987 1885430003 +97762499 1700446741 890446526 +1159119236 1188209353 1188209375 +2627813674 3531979154 3151598875 +2145247076 1828319076 2923866729 3258860367 +1442423465 16453656 +70027177 389821208 991530776 2881777371 389821198 3618021119 +1900448189 252368020 +1164964140 2230190822 993058391 +2500516375 3071627814 +2728787935 3039395923 1785738019 1785738047 +3252601992 3383720795 1813476276 3252602008 +4153418802 3924359859 +2649730291 2649730275 +120758099 2378901761 2075503845 3757636970 1104256067 989727206 3286865153 936479895 +930430405 4225043946 1393569789 311442700 577870275 1393569770 +1301524996 1301525012 +72472962 1322870709 +1112146158 1630868024 +660635338 429146162 3337066491 +3431713730 3841262027 80713166 +2377716155 3579242866 +1305012756 2269674873 +3221283329 1113835414 +1553353580 869201812 584039928 1595013685 1611791307 +1383879240 565544779 +555277127 2805972563 +510141614 1015938862 2347875822 999161273 2223553082 2347875833 729903695 1015938873 +2652267574 1655499821 1415372289 322945297 3845234214 1415372311 2033942922 +33843276 2700926667 669797576 +1391858528 4183851059 +3472934250 584636758 +375185421 1093973092 402132837 1093973106 +1922213403 1415904187 +681592061 1016097931 +910555353 1417475435 3321659304 3321659305 2690603023 1227275678 3321659326 +3335936900 3335936916 +1487628996 1507398281 +3694311224 3688262957 +2661556234 27911013 +2416683106 2416683122 +1107054292 4262629523 516826841 1153858952 2829657838 2235965281 3088674840 288857728 +3327108205 860856052 3981226587 2623526802 3168819922 +1332737930 30912666 1492666085 1492666099 1573762054 +2563372574 2750312767 +97741303 584044496 97741287 +1903507689 239907737 18971999 +3750942266 4073028866 +2533796854 1598801204 +1508822963 3785748230 +3753801190 517183745 +1230024305 2257402830 +2778812253 677353131 917886786 917886805 435154786 +1213004932 1429308383 +3921135712 1201600315 1280339763 +2272059641 694560766 +2607030862 1455984310 3970040015 1376208334 3569899241 878000850 3468628318 3873321447 1376208345 +221197713 1381061456 +995418754 2711596574 3902837429 +1159013372 3158812081 +1115953055 2585480837 +1536425098 2216709526 +2415450270 37786300 +714984815 2238342584 3137705543 3884150951 3733152379 3195936955 451565302 3867373329 3195936940 +280862963 2472597088 +1207437977 3833114334 +3064833574 2114690594 +1937083446 2171880961 +3305209961 1249806967 +907839782 2254201959 3933343286 +755139943 92388479 1106772278 +2102397227 1878945460 +3791779704 1722660868 1092129261 1092129275 +2819694861 2683766642 +3049349885 3358543908 +1489802948 2383500937 +3649591037 1856041044 +183663894 1371204017 +2932088063 498705790 +2516030535 1539206080 +2871128309 1992469533 +166629122 2760581155 704878346 +2809218295 2387579078 +6896263 749150870 +1553120781 3355520612 +3443151265 954253725 +436365194 409482981 +3615161699 1695555035 +1501401640 3505931228 145560829 2776107605 +1828590876 901174437 786808776 917952059 +1665537814 1565939633 +1180287816 122579549 +1429644849 1443340070 2482997441 +1229868073 4131829662 652597246 314231705 314231694 2403460238 1072738431 +2734694402 1304180362 +459389084 654605758 2933469229 +4269247478 2352043079 +614481456 1539331844 +4546765 1462787634 976708260 +88838246 3153350785 +2710115017 331911800 +3557140851 938065946 +2111357071 2111357087 +3586129695 2621349342 +2238187444 264170527 +282142281 3258926318 +4155047225 4155047209 +1444495383 2696930342 +823687347 1391776823 4236640716 +2635555439 3134190776 +2331539225 3726867543 +697379498 1729319330 1611243627 428222861 +3991736035 1865314122 +3923156023 2565231511 +3004362994 378014430 1785362962 1148986011 1148986010 3637595379 +324166631 1026885618 +1949227974 411075013 +790656787 2075467863 +2521370251 536995028 +3220157564 3844188794 +17299070 3719835017 +1631427368 1006321643 +4152098776 1882439963 +2821693299 3684565574 +1446039570 3235351621 +2128951987 1977313242 +652290790 443975703 +1064390129 2487135123 1769985664 +3173978337 2434476806 +3612182903 54402562 +1602355577 3534246270 +3386183422 3093731785 +934512281 1218241246 +989329044 1029613033 +1276570757 1293309274 +3267066785 774086240 +4227341928 261610941 +3024167256 3190706033 +1465349194 3210966633 +893113897 4130480782 +3464627607 2913914032 +3634157810 849103515 +179148156 1262637617 +3188683503 2952398968 +2914065899 1426051660 1490163938 +3573991682 795611192 +501318138 67083421 +3730462305 1679057991 1442425990 1765145248 +29459058 899701093 3966315358 +1039048043 1035572120 +2777208269 1825836199 1000173081 4057223496 1368272661 188485794 +3105599457 1201004320 +205167181 2402022322 2402022309 3662568187 2369840946 +2684216435 928653069 2078770679 1336844556 +2413114366 1744010765 2922730538 +3988257394 3988257378 +522372492 2411527031 +3489211040 87130611 1292454168 300907387 +615600601 1584262613 2619594888 1668150700 +2274744164 3571585641 +479792986 2652787406 +1063960660 3625510312 688702521 +201889655 1753641030 +623353102 2338077967 +184526241 4050762870 +1658134986 1602498811 +2246811689 1426353150 4209844376 +1616272487 2839737459 +3405610238 3112520187 +691367360 2669397331 +1332948790 1213420049 3794411777 3009149578 +3228441750 2203516974 4025829497 +1708609893 4259609756 +1727978389 3090394012 +3193412631 1870656404 +1190758196 4006598351 +2746117598 396551145 +3466210610 4197079258 1857365427 +94941080 2156686427 +3099629055 2406941610 +306172078 1610320686 2051646882 1610320697 306172094 +1200820891 1199983108 +2448950452 3479154975 +2796891648 423355852 +1655187982 4229947578 +3054339204 3072634430 +4266426601 165682884 1958846021 +2181200487 3437970297 283553846 3139912292 +48502341 1202977898 3524202124 +4035860461 1784446407 1428354073 3206517954 1965939262 2635360782 +3059924348 2574273073 +1891243134 3423763337 +1474932476 1625192103 791992496 1625192113 +447264669 2493058100 +2940544660 2111552239 +1124921093 1919285295 +2080890436 1890487599 +2655405749 3718336252 +801563989 3314059757 2333803722 +782988344 2294082368 +2888620552 4055722604 1079198689 312162972 312162955 +1199036341 2390835383 +744049618 2727500677 +1283078981 1307257213 +523903111 3972795846 +3557634930 1120402547 +2262193827 3865731722 +2374359026 187261654 1084907221 +974639324 1946516871 +1527248360 1527248376 +3880174758 2763531426 +1940212364 2960607051 2570345085 +1439073244 3816919879 +1415208490 4097981453 +3192660938 1541166843 +852185716 1779616911 +335587148 395759968 1233737056 +1121221767 3145730198 +1446681673 121898744 +2857338077 4163774434 +3842883244 2178492375 +1922151764 2942333743 +3953595715 3953595731 +1164331357 2634382690 1192544546 1306711211 2634382708 +2944676592 1025257411 1755765315 140463197 2332374644 840899058 140463179 118420466 2175205807 3370624622 252641416 +4048932989 1729574100 +1628562721 2100096518 +3639773511 1205783342 678698052 2275154271 3436059350 3169206041 +4209865571 3894071133 +4124263736 865466171 +396319703 115184496 +1666685521 3155880438 +1738180752 1738180736 +2930034988 1830853001 +631448386 1591675478 +2317718069 2921671036 2921671018 2390766029 2653229100 2317718053 +330938538 3076371354 +1430222180 2531642473 +3807667882 3322782310 2508135173 +2012229140 3810036089 +1389972211 613275685 +4152618520 3658358455 +1719105344 1241803097 +2119345538 3452558487 +1302239833 2302879887 +4049767106 3223351157 +1789010561 1581011200 +164305026 2911195662 +3184925737 17716376 +1111113201 2048860991 48444525 743063626 581921056 810174081 1111113185 +2566348979 1911547507 4159831072 3004505480 2154641882 206006757 +1510420081 2049630861 +4004990741 4073167923 +2587631873 464036135 +1361674801 1668533021 +3476126592 1412717095 2867161747 2673372540 2351345499 2448421560 +292948995 2144659644 +642965387 3749046210 +2906447309 876913444 +1390516631 270846128 434629891 +1952894747 723882222 +1459985991 1155017174 +2061020899 1176194890 +613066242 2286114101 +4006530501 3029200140 +3832410976 4178976812 +3105227711 480765374 +3690566076 1028156484 +1073985878 1233523098 +3148490146 1087077042 4233301042 249118229 1660722877 1254853230 3174028624 1283912332 +361416617 2085458181 +1010582288 1010582272 +4051263227 1065476105 3280710213 487621938 3842086824 +458407219 910153562 +2769316668 349753201 +2109923139 1019573866 +2183680861 167672661 1115372386 +1423467393 296002582 +4134538034 4172179149 +3912212735 3912212719 +3437338717 3211403462 +3285330610 938496589 +3128480379 3128480363 +3032072747 330926545 +487017786 487017770 +2215503240 1776309533 +2875588501 1720801162 +2551671497 903682670 +2585912231 3937529266 +4172980610 3174982854 +1573325652 3719407785 +869056060 3343874161 +2630378665 231156051 +3240252874 948662066 2139820743 1440507809 2457211078 +2816889329 2816889313 +886784116 2837870223 +279442262 2388922481 +2532578558 2688355295 +1014399751 898647040 +2012914893 652801608 +2324049111 3896022640 +3568129113 528980611 2868638805 +3140719700 103972911 +567130794 3772569997 +656852059 4245101380 +849153555 2353387648 +164682915 382424202 +1959550237 4206269620 +3637283102 4034433321 +3926193753 2132900158 2132900137 3201289758 +3363511895 4040213222 +1272588838 3898592419 +4145546597 846656931 1607499244 3476443274 +4182665740 1694352988 952840759 2188439799 +1091750826 2048429633 +1790744507 1790744491 +3895512050 1056681059 1993412069 1214788574 240406742 4263048589 +4210740040 4210740056 +2662130201 4124748521 +3284689001 619944409 2641347928 +2318212332 1896122241 +4012091067 629835135 +256332173 3442973938 +814450480 765292360 2600950411 +4167359340 1925540631 +1601881211 2029005151 +903791855 3165652014 1092002860 4237980049 +3150769211 3734495474 +132124615 750310976 +1415287475 2133323724 +1267993657 856636862 +3385888654 1662031129 +2454125650 4292314652 +3054819642 3917920277 +2739774681 2115636137 +163072981 572481610 +3325325819 2969095378 4154670299 4003671727 +2748909840 4272505909 +1304746357 3125338122 3789706026 3789706019 +964364877 3383834418 +2743326648 3931189829 +1731819151 242590488 3861475645 +953790073 2162436731 1394746011 1650711145 249345815 56523614 +934075711 3827321406 +51162454 557476486 1853496375 +1767357714 2200377858 674962349 3156883518 674962362 3877544787 +3938843199 3992166890 +1872636552 2989771171 +3141876091 3003916591 3154915163 +2834368607 1383083400 1318563083 1383083422 4063220128 +716458156 3695173436 3855509185 2230043095 2230043072 +879073503 1525655326 +3744573313 3693785088 1951460860 +2758985157 2779600140 +3651332787 3651332771 +2907285093 2907285109 +3184620259 816992580 2724571673 +1166158334 1776818889 1776818911 +2388320991 4162004225 +621291597 3441897893 2564256050 +945192137 2032562296 +1151501206 2715100455 +2197750486 225539815 225539825 +3706883971 1423436586 3420933990 1663171969 3070520509 3420934000 +3212760953 1551004277 4247399996 +598480873 552189160 598480889 1842142553 283747278 +471029252 2399493596 +2643046281 4229098911 +4255819439 4255819455 44328312 +3452035757 954622738 +2014789594 3868820523 +15165315 3930318695 4014469948 +2314226275 2286229980 2286229962 +3608483002 4244246911 +3090375734 786874631 +2743990935 483769424 443385141 416658946 +105185542 3835731063 +381910768 596473948 3317748693 +3200092882 375490707 +2147022713 1188043082 +1656065926 3922784247 +559824273 3549153946 +4234650523 514545427 +3502798067 685361760 4173067405 2660244122 +1937497141 4129852365 16492394 +586823067 1901591142 2866963218 +734218252 4033506017 +1956402112 1235591193 1377294163 +3612483261 3007734658 +2885173269 3435979030 1397831475 3435979018 1887847085 1887847098 +1883938440 1568123227 +175360400 793744287 +1306752088 4111476365 +1439391699 3525820394 1439391683 +1069454934 2936449393 2936449383 4001148214 +1631141318 209107462 1402713833 209107473 3541843639 +3031047089 2874784321 2578753030 415864742 2588549815 2874784342 415864752 +3631229707 3281240642 2693858646 3281240661 +3311562539 1714956887 776274815 3640097619 2101776616 487220582 2393762738 3785298204 2564649462 3299876605 4060082896 820554422 3947052194 163690507 3483458790 3462948511 3526053072 2376835909 1224610344 59063185 1187826759 2516015242 3218172236 1633249492 1246390917 179124364 1779065239 1812548451 2949961897 1549964516 3858650977 4149313120 +1413610041 3705464766 +2613073329 3771131302 +4103064057 1559742652 2700672501 +374144515 1414883622 +98835179 823549922 976817423 3083833401 +2016954345 697906136 +817145191 2696471923 325083424 +1871087005 767841844 +3045263935 3045263919 +848997834 104847558 +850763886 1105956143 +2442439218 1283038683 +834636092 2357528935 +950280262 1885261367 +2145074359 1712580536 2938773737 4246770694 +2991994932 4055529935 +729319455 3025393857 3973131638 2235650087 3629413802 3973131617 3935081163 1900097697 3935081180 2378057928 +2287247165 2381986872 2249349666 4144078155 +4186172999 296753622 +2435226374 2244348513 2754543738 230848849 +2192652572 3640452881 +4103341514 3249962867 +2642576463 144941745 +4201211650 123088650 904734755 +3720284977 1578300865 1153343014 1578300886 1153343024 1944243511 +786061765 2328839068 2540795881 4155412916 541552263 +2727368107 2486623266 +1008241154 2627813667 519255449 1061518888 2308051598 3034155549 2627813685 +3515931534 3660527866 +3051606429 4067327851 +1843866548 3068775503 +4145503389 2529610558 +1225702617 1245710982 +4255488777 1421020974 +2290796964 2524671295 +2698054179 1276310794 +3626073042 246803333 +1472711326 3447977641 1170042537 2887219778 +1133130015 3898787424 3503868435 1171976190 1904956360 18895761 2253710282 1101174509 1904956382 2253710300 3098949759 2912465825 +1878877205 2433509 +3427665153 912562782 +1838059074 3110728163 +2555951325 4281801941 2963997666 +1291984028 3722299020 4122480455 3595766151 +2480725470 2467218897 2729526390 +5362508 3491052289 619968220 3642050866 1775405716 4001511845 4001511858 3474274656 4011756795 316270689 +4129668967 3852001100 3832303392 3061878643 3061878628 2055174777 +284653954 932464565 +2985503929 3533908655 +149168038 1156718321 2770195009 2770195031 1274161635 +1986478067 1468640133 +2339780186 1259807718 +2880242951 3983171076 1214179862 2110527326 2358231129 2226032543 +1914735696 4181516789 +226390817 1594834166 +347919678 3812864137 +685484894 550905098 1066439298 2949563625 3246398825 +2016539236 132415198 +1772942094 1765973775 +3848156713 1011827342 +2285124102 505327686 +1485799569 1078123062 +3579326467 3579326483 +1801461430 3192936583 3192936593 +149224169 1414527065 +451165187 1481275580 +1803674180 1803674196 +341965199 3040605534 893090267 341965215 +3169499190 2608856337 3514520065 +837393473 3552639583 +3778810870 3021173697 2274585681 +2861055439 267647002 +1213872359 2280239571 +1666962236 2777515889 +760620383 98734602 +1273050531 30890139 2164292613 +1537659966 669658146 +2953635370 1056265621 2973088156 636825157 +2886048773 1747187331 3520371674 733042730 733042749 1763964953 +1781026848 1200664583 +1003520080 3610776949 1498978040 1003520064 77848350 3410675900 3410675883 +3005219555 1875193364 402479945 +1496677453 3157437732 +1660913736 541296989 +4119376914 2553509957 +3518953538 248302296 583404219 +884727987 2156559392 +967302231 3296095146 +3652951721 2088032261 +3850441207 2789047893 1835928674 +4123678740 2341550656 59752019 1065423405 2240884928 2849527596 1043464922 1082201011 +3620241377 2443267872 +3202262316 2759722071 +999268829 2686177012 +2416626708 2416626692 +613486524 796814726 662593772 1281082599 4008711281 628557671 746001009 645816150 +393761657 1533759064 393761641 +2573927988 2573927972 +423851999 2754982942 +3902934227 322557271 +1601023064 3587024868 2443595405 +3339206292 3858399983 +2990741019 3130772626 +2610018736 2523353109 +2465811246 31249522 2356238703 +4197746107 2785965475 166776970 2611905906 +1033418073 1348827934 +4005611810 1748020779 +1499812640 1600937979 1600937964 3665943397 +2929712383 3836274024 +73094809 2880376655 3069014910 +1864855861 806827626 +4241381297 2849246118 +2562505497 3212956824 +2335456444 3745225713 +2340471501 1756539044 +153560783 4007507157 +3934032325 3877217276 +1054590529 888739904 +3383479240 1097976779 +2096095195 3209550231 +3126017791 1797805227 +1304341569 2754161216 +3613342985 2352502649 334304558 +590282677 218741866 +931652419 1758672381 +2467124526 2885490553 +2485455424 60013595 +3261380240 289366248 +2044472244 1037999023 1773550292 4102664223 2308492367 +3885901645 372426930 +3255560860 348279687 +1465958522 601364747 3414953134 +2678369535 2678369519 +1500633589 1766702168 +3052880197 4216572266 3107700620 856596330 1073422403 +3945973452 2753601614 3370014942 3866275168 3866275196 +1408751796 4099253512 3811189593 +469379740 2798719879 +2912825364 340926521 +2703057635 1234991581 +2983209095 2009001363 2009001348 1907346560 3484264153 +1447720350 1966548905 3609455898 3609455885 2047114372 1032088659 1154716073 1087605613 116297951 2181335338 1048866281 3441679730 1400440280 1966548927 1635097189 +1563551603 3853172982 +1659875284 2471611055 +1186211797 312122124 580564060 1186211781 +241372233 1279261328 3825663542 1440029772 1279261319 3642447116 4028332369 3899659027 837061 +1245540311 3048673126 1946031934 +1226066165 2374875087 2332074065 586964880 +2639759588 652986575 +3830335714 587701806 1228717013 228299773 +2952988388 2236511951 4173584617 +668563874 1566210563 +2109787496 2156083466 +1620749159 4042087283 2054935328 +673001075 3456163808 +645939163 1994687940 645939147 3988689823 +2506947807 429003550 +4032562733 2380118212 +1296115230 3146711337 +4072709367 1962120841 +350499475 1190558078 1983618426 +457046891 1301465460 1319992610 656920747 +352726595 3709526735 +2956896412 2956896396 +99374531 369820138 +3775584245 2469746131 255791991 957478588 2101823313 2168933772 2168933786 +356698835 4192124205 +2366006274 2660314434 4098618379 +2515113816 312412915 +775234903 775234887 +3058166228 1368779560 4275238227 66539060 614686380 98532800 1368779583 +3783195042 2090098203 +2083782451 3101343052 +1546545277 1187931508 +2867257573 4000581740 +4075886310 3768059953 +313661534 3428604927 +1542004633 1224523208 +3976196055 4059286868 +3481434742 3368844886 543606727 3368844865 +4239218565 1507909532 +2874604262 3099488284 +1507786789 2614274396 +3340800334 2898110876 +3611440479 1010435230 +54035736 3704359015 +2872505255 780242934 +148810505 1582582373 +3291998778 503691613 +1880519632 1478061432 2030479420 3884519413 2030479403 +962591561 363913134 +939591472 1904857046 +1910217175 1930463060 +1643205320 1043582832 +19059348 1574010607 +3350613593 4156853460 3170719263 3170719240 +226549915 3705771026 +829092737 1281184790 +2089601374 2774795359 3906187142 3111218025 3111218046 1821128958 1872822015 177922871 2423151746 +306269778 248400645 +958630103 1433898563 3387976304 +4002769702 3140988119 +2971916089 959606908 342609598 +2087713771 3477705442 +2638162186 1737136801 +4176401221 620139916 +541003695 1538575611 1917169784 +2498432322 2953174755 +4037314529 2871748186 +2879873960 2879873976 +1649337658 4231191115 +642723887 3369017723 2108217848 3825704273 3369017708 +1726751538 2238111564 +1030737110 2365551847 +2955135534 2711444643 918246312 315796893 2217790714 2728222265 315796874 +1344818808 2809366244 +902227714 766400876 +4070879073 1209497415 3370265990 1514149280 +4135593474 230413603 +2499474361 327558558 +2061527099 2856588530 +337385089 3654964124 +3516426789 33995641 +2723522114 3470047722 +316640620 316640636 +3288916766 3609028682 +4101736711 1023836676 +690749887 878687595 +567811 279159466 +4231638200 3335185851 +1387755015 1036963072 +4074250552 2783634145 +2925456633 2496651464 +1005286412 3002971228 +4255908013 46469188 +3138573245 3290656440 2981585815 3110646487 3890952 422528285 3361883483 +2712242639 1290006744 +1004183398 611189937 564359391 3225123716 564359368 1448376229 +741998520 2099763485 +3723536373 1457022652 +829254210 289293795 +2197856060 3229870956 +3192739609 1349298174 +1579844823 334437990 +3941072005 1345488218 1345488204 +1819529961 3973484622 +1507583613 4062959298 +621057629 2084992721 +2939051561 3291883314 +4294327482 1734576021 +1427717776 3906993067 1552962880 3511374076 4204415080 3511374059 2260565173 +2899773253 1535144346 +18882406 1640404560 1643824395 1920756578 3993247426 1920756597 1660602001 +806909740 3800275543 +3115432356 4140252457 +3349756571 199352869 +2876438950 2348744769 +713344688 2667890435 +277380595 225196825 +1333885036 1333885052 +8907148 1742652512 +1897681374 3985956982 3985956969 +3359760601 414512520 +1461475060 362603023 +2383722030 3634023033 +3033950110 2710426558 1267015103 +3495716413 882686568 +1941740475 1460208232 +3643479301 3822196442 +3218409987 3190590951 4284400316 +650866126 3762150223 +2871844645 2627946298 +557889651 909496670 +1093290219 580062050 1542320491 +1114093713 440896592 3821515674 2913067076 +1630837140 2580399097 +4191604023 2056814448 3248319606 3954259543 313766473 4112906582 1568687761 3818905736 1688692577 1972926344 2977460720 2834202597 3767440040 4273034287 3508564900 2827018858 2225723477 498320280 2783869747 2308739648 696547397 4188013353 3378708821 2449299553 1739172540 4189146183 3112814514 4256256663 973272602 4086361892 1542607864 6657674 1403473059 3883897659 3548198145 1670929227 3865835882 3676688494 4053765272 2841121195 3837949043 2964232898 2516410026 211967904 1234564038 3833417674 3616441492 3868105772 3878019906 3733884807 420602218 515097907 4087347631 1070039234 2022273491 3676688508 3524347120 1032501661 3045124376 3316562888 3818905733 1552353067 3657723274 614777886 2867201119 2006481615 236622723 2125057784 648333092 1150675949 2813087258 1403473070 3148786714 2611024859 1662991616 173032351 1763804440 279054810 4102992418 1770462106 3649996732 3768572874 3894797550 2341048255 1569130656 1552353068 163730032 865309327 646067454 2122939194 967107853 4122035716 3699457655 3803260948 886997232 2916954311 1895199436 420602228 1688692586 3733884829 3112814519 2468195768 3910674585 3794131824 4254114524 2489197306 4069437207 3945130394 2482854790 3732751976 1036484007 10636487 4152339532 1124709854 3732865797 2324270643 3607832652 1470583523 1756269053 3676688495 3164431495 269313816 914656441 4171382834 410161775 3599663866 2005348768 4270915715 2318890293 1575321826 420602229 3505450942 3867120026 1520044458 3648977719 2175390634 3297496046 495068887 2093621097 420602224 3135904639 1806282988 3727021355 3769705714 2567879273 4189146176 2041169669 236043101 3899391122 313766470 144857447 3850195299 1708269012 3844464702 414432191 3852460980 3315430071 1223659522 3010030208 427958392 2555754584 1067773577 126946986 36542203 852316244 2257160158 1988718261 3995463249 881644053 333457399 1264713014 93391750 2190049664 3080543411 3358264025 3785350524 749116162 2041169691 1000635985 2007614433 3322170899 577528334 3769705723 3945130383 3833564786 1961468674 3693466108 2006746067 3574679966 3752928105 2156494451 3724984395 1843331213 1559093874 462646469 1719977944 2583520521 2108280153 2625687441 1560230242 59836531 2912039807 3733884809 1050010227 1668083251 2498499604 2708442712 3248319596 1017440731 3659910869 2623997884 91678592 4273034303 950330241 4253005255 444584682 1989703980 766735069 17377327 3769705719 2304643482 126946985 3718240016 364099296 4079351335 4119917138 3718240030 2602416710 3717107176 4011313826 3722427112 4119917124 1755950149 598000241 3971037151 3867525457 313766465 3852460989 3632086262 4107618229 3743798975 2542932171 1844870133 3715974356 14846506 3954259523 232238492 3626355636 3751795241 202203353 2305779861 3851328137 3768572884 3833417685 3332207694 1687706842 3126916826 377474217 3743798955 3869238599 3978685647 1998717555 531875493 2190049690 1823060618 1669796400 4279346096 411029468 3114098639 2895989584 4123168557 1149543122 3415780625 497451882 598000240 169515797 4192347557 1183098354 2053964950 3961908027 3769705701 3583003609 1770462095 3165564346 2594109833 1544729969 3861242281 933552615 3187373836 1955015917 1050995957 2139716800 1082432615 2652346990 4205923821 4137827615 3131834869 1508211367 2160996033 3182341971 420602238 1981913475 3629816375 3648863903 4069584260 598000244 2290715388 1133898334 2006481603 3599663847 126946977 3605563452 1660054739 1905815891 3593150705 3237149983 1070039233 4233957752 2122939192 2139716828 3700329585 3495444770 2122211787 2022273482 161635059 411180788 3732751996 1199875956 2431942323 3127473563 4067167302 2357825866 1048877385 615763605 3761207869 2464944334 2175390638 1234564047 3230385541 2980836307 4156549546 100980916 4052659581 10636509 2224010333 2107147300 1631148877 2024392037 3903926663 3968771472 3928352780 3817772921 546534557 1487361148 639432690 509576592 676216429 3919420128 3718240014 2774704847 2167626566 3951993882 2023259222 1567846504 2807415312 3777354195 3693466106 3662235258 1703351621 4205923816 1324904906 2484973370 464765026 3894797537 513669262 2125057763 2420397237 2807565938 3911575165 2920497326 3820038584 3951993856 1513152331 3432005052 2190049675 2308739665 2005495856 3045831767 3440727684 1420250656 420602217 3816787190 4104125274 4069437195 3676688507 3831147794 3475147072 1636241147 1199875957 236599832 2119942561 4287693314 1826668084 2434237953 3689451546 3064751551 4155590950 3650978209 2100777711 3827687040 2357825856 1654151600 2089383956 3817772920 4070570027 3961908013 598986011 823145266 2237536542 3475147077 3861242287 2593845374 1334502328 847545960 1789505405 4142014703 3090542697 1277106369 46843431 1237815438 756011854 2779532007 749984573 680755508 3816640089 3987814778 1669796406 1990813237 1973888524 2630628441 3103512213 2072459253 29217486 1243551153 2156494432 3868105771 3693466102 2022273496 94501020 3582886259 2139716823 3751795256 498320259 1722247822 830768347 3935216238 1770462084 3743798954 4185894798 3248319591 1887905420 515097903 3417228609 3777354205 128079821 1721262065 3794131838 3031460750 1223685987 2840974109 948211659 198418119 1955015905 1670929231 718936529 4287693342 2089383941 2156494450 3935216231 510133329 3781947776 953823209 3961908002 2055681602 2997641047 4253005250 3928352773 2156494459 1722247825 2173272053 2089383966 793659752 536213248 4238493289 2796309605 1610271518 914656423 3911575154 4070570043 1905815889 3816787187 2489776943 3700329597 3810909456 882086936 3146369737 3643133249 1044364749 3679592492 925208930 1132765487 1638359742 4287693315 2451418131 1032099762 2357825867 1581395651 1712476188 3867120010 4152339538 420602215 545401708 2908231650 714310733 3750662413 1996444822 3688871893 1939371122 253108746 2425341748 266926571 4280915023 +3346707895 3696997923 3173781254 3799880681 3696997940 3173781264 +2047944342 3204431409 +4171042783 112836764 2355115489 +508973022 2682239615 +1060283426 2931325605 1598128426 1060283442 +715985516 2591293441 +2465202811 3375917083 2901674312 1874265959 71081026 2451536304 886502226 1521968327 3105413006 792621913 2093659583 1949206176 1344235085 3699194121 1134780091 3947832680 831434100 3309323209 3392964400 2372917617 1913310392 3890651199 1731637119 4043169641 1465292476 1422019974 194527190 10543795 411620175 +1580996382 2946990499 3840261194 1989698601 +2997317652 1885095512 1368747887 3879631721 +166015903 852509512 +912499733 3017493770 +3638096746 3347525581 +3738957903 591914062 +1010555172 1095709464 4130788265 +2514511630 4265753359 +1099746757 3973364921 +167810820 3270359903 +3846976292 123451556 +4025445818 1877588957 +1359307497 1954198734 +2978997975 448142403 1552442480 3937954754 3786511150 315372163 734812655 +1676784084 631159815 +3856080435 2600842656 +3280215701 2112718138 +3689548112 3004037564 537521832 3004037547 +3629973041 3412338470 +2396420912 195292291 +754249144 2106734779 +1754820513 1754820529 +4137481409 2660624999 +1832718791 3189963840 +3754568618 3004098565 +776143559 3364698532 4284124621 2591907670 2002581504 +1390203170 2476554389 +2495590906 4276998071 3664060098 331682637 2495590890 +1050853561 1396007742 +982717959 2797726984 1015786774 2379856729 1340167940 +3219382606 2842860750 +2860053615 2717703185 3412642478 3992395692 +3435189028 2005688745 +3403542289 2172989805 +3471021304 4198098428 3294002911 4047149512 4188398125 1238473505 878565970 2959731931 +781108835 2915192266 +3141151926 1922327175 3939816065 3926030528 +3594508569 1602404936 +3130010531 1408545162 +3938512876 3160841980 1753859969 542169879 3144064358 2042212503 +2931335496 1420158027 +3759511633 1830033376 +1351419608 2785134107 +238331183 3156032703 +2825713165 3607958898 +782076099 1004928350 620645116 +4171273928 2504785017 1245644968 2122628985 486673186 707557542 1615407511 +2761076928 1697008760 +3253763045 848497004 +3712380294 3688786401 +2434467613 3451113420 +3848021955 3541211114 +1090778576 3164192372 +1069965627 2689273828 +1953480324 4105776569 +2882561653 4013408269 3994110524 +82533316 4207675064 2189522313 +2498063303 1682993285 3288597202 +1484001790 434302842 +3276971134 635895406 +3917994018 58369350 +931095242 663258107 +3961752344 3836419130 3555981019 1779266000 +2488715168 1858332990 2197430847 +2243517968 2463044405 +1063941975 731504102 +1342542676 1288105263 +2502923106 1004864323 +3115278859 1511479124 650017071 3487743989 +2890851625 2454726220 +3100100555 2910815380 +3048393588 2088126361 +1941039879 420000772 +2977600281 2096468040 +3261210401 2151314567 +213192068 2231650015 +173936277 3876648074 +1158283400 918476317 +3775105556 1284660601 +3248398292 2696256175 +1693557689 1693557673 +2593914371 1720770236 +1359172751 2932329691 +176311031 2182873809 +2677236697 2981847742 2981847721 235286174 3185488143 +570142180 299955672 +317660000 778573861 +1244609556 1562978153 +1978364275 2307414774 +3469692357 1923137514 +1796738515 1796738499 +2452642551 1545403764 +1396194854 2486027542 4162297351 352035185 352035174 663344577 +3710666209 229769504 +965873633 1091731235 3241918992 +2509365860 3634848617 +2664140895 1510569227 1500792200 +4092245357 1736153746 +2263133016 1605955233 +4211742060 4113579159 +3143189053 1760754233 3845701839 2918608898 2572574283 713246228 4003935522 +235796323 2197582026 +4277413466 3025690539 +4059517886 2105212733 3987916277 3845776427 236210686 2810549739 710286521 +1000001034 3736230317 +3643281939 3698612145 3977540602 +3437491669 1608253002 +1796762034 854522534 +2159056669 1739310356 +3243880579 3811630634 +2910638688 2071932211 +3986234223 1996894136 +383002235 1794675620 +2581777950 1232920105 +2609966029 1905574728 +1951091299 1543603039 3659181828 +2775610137 288039912 +3650478184 2469736975 1479552336 181726957 1613773290 3778716291 4008723371 1462774730 +79281191 2539860342 3457468089 2972105252 +2155243787 2148977909 +672170379 1549630069 +2577381329 2562589558 +1809040010 1213939515 +4063185749 3015406352 2383732180 2507380426 3922666365 2383732163 392257191 1658008977 616592860 3889111115 +385043025 1912470928 +148747895 1812348240 +1042984438 3543128654 +9190964 1083328136 9190948 +4145853871 3854815762 +406869478 323434775 +2852174717 472327618 +2165921090 2095134453 +1768002257 127696699 3046776592 +2316026934 707441148 3351328693 +4182665736 2831242531 2389771227 2831242548 4182665752 +2821510093 2440672123 2341563300 1743554866 +4148014249 4148014265 +67463100 471248901 605350980 3995017072 136063212 276974833 3995017063 +3160082594 625907459 +2139528907 2347497858 +735831746 3442230133 +2180686961 403339897 244375024 2338394802 +1670993281 3232075942 +2393609601 440179218 +3224725599 4078128520 +691637172 2576804943 +3759710714 841772910 +861895494 4067750801 3911545658 625938209 +778714721 1916809888 +2669296232 3729387947 +4167760677 1322949724 +1764265655 245736726 1100409546 1982610951 2083276675 177445869 1117187152 2083276692 78946248 744458511 2064853693 1437194317 1251408106 +2559930388 1996988562 2614915611 3138160830 2735497972 2715581311 2273140793 2718720366 2715581288 1195339641 +3483075783 3533587411 2563900736 3533587396 +4070529184 3990333384 +4034619956 2836465870 +2493959859 2493959843 +4060061609 1816201998 +3087587993 1055917496 3087587977 +3376904902 2709931447 +3761094478 906242009 +4044877531 1672282820 +2339412285 201448267 3208723202 363848738 363848757 +1585137871 3254045181 +2633976516 3923948191 +3819252772 3272621592 2164554921 +1617751923 3866488088 +3727827755 838513749 +1480755534 2142271550 2340575246 2337633963 +2762286906 1778171979 +2746722936 3615630085 +233660580 4038249691 +866595360 2194955639 +2337609529 1516877065 2415103678 +2841398148 541778143 +3778128549 640655788 +2832722031 1798386604 +4200449128 2308714429 +3120828409 2851831407 +2835737404 3774877424 1347506033 +1131631566 4237094223 +846292116 4236334319 +2239786230 1485173974 522946375 +1739318128 3687035083 2744584515 +2925855674 423482480 +4139691390 652164233 +3576967408 1486518859 +3466463221 2005269900 +1195562921 3716350745 +2134088810 2822716109 +2518917428 3181424210 986589012 2611717907 2383856847 574096122 2729161255 2262294943 +499353465 1806974792 +3482793581 940223890 +2652542248 198757867 +1236220978 819708581 2633203674 +2046980636 1570875664 1050288337 +1969333719 3737350996 2679640432 3737350979 3419163977 +312504635 2375172068 +3550502127 343034929 +1584472097 3472354385 +2669421756 894292967 +297472728 4092995972 +729662073 1127510622 +4060178720 2246927867 +2540450399 2067313837 3878605153 +1769886726 400442743 +454385395 2510583962 +3990130461 3990130445 +1776637379 1776637395 +132390415 2065387928 2065387918 +3573930048 2553507013 +1854803095 2694697392 +1985714930 1985714914 +1693285227 3260840548 3582161405 6253619 1863266488 3939864683 173087291 +3051673942 2906792551 +2077891198 1985459273 +939300326 144701719 3364495386 2866093862 606567391 +1149025101 968951681 +3764982592 3764982608 +591498290 3735530292 +900206078 3985953054 +296842841 861752840 +1158252344 3858750765 +3825608847 4227383515 +2601070274 3514080099 +687739562 2662565929 3426411294 +4153944953 1645445961 +2430840541 2430840525 +3555155070 2582969677 +1831013060 2228339454 +3995233057 19834080 +1622386428 919592625 4198207664 +1561859878 3001839831 +2587394780 3821828940 +962083791 350627544 +3123227492 1912983145 +1432115685 1164018540 +838525784 435891444 +2259170379 2910234388 512329244 53949865 +961481147 75767912 +3150605734 43261158 +2405264504 672252155 +2510299733 2510299717 +3961034670 3961034686 2528848430 1488373487 +2347875809 2137399302 781052192 +969386097 802984541 +4073055851 2496693400 +474320121 3315990635 +4029649668 2520935870 +1603745544 3897518644 2198577565 +3338017188 1802545039 +2612667908 904464332 +1604641451 999346996 +727525275 3636016274 4266610981 498142747 3847023420 3735378194 +551589471 546092936 +2196182301 784743595 +3608180246 2766791847 +1498700231 1724470358 +1088237367 1395741574 +2987190603 6229289 922073869 2322098718 1841738599 3368305450 1548822882 +2938768306 1898998053 +2934592085 2950667228 +2221977199 4284787387 +1157988863 2796266622 +176248222 664389567 +1787883175 1769697444 +262095316 1180238655 +2747543414 2449587009 +3377303312 3979828712 +1876417805 2022517441 +852380715 633464738 +3025629726 61383999 +3943212224 3197852229 +3481839832 1674239694 +2895251096 20524068 1105224013 +297797436 759915367 +4261515394 1853265349 4261515410 +799603823 2006203890 +2774152817 97792790 +2607964204 2987796263 +477005708 1308582263 +4289103929 3249212958 +33914531 3517340316 +598385750 2074129265 +1632006291 3034789740 +3692675919 3120568241 +2536509730 581630101 +2941387677 2602283060 +3939038154 985684678 +2610430096 2814173931 +2701738720 1288666072 +3951172594 241392619 1007481745 +3795431901 4258463458 +2963624171 4282278370 +2909353420 3365908513 3365908535 +1397593570 1672101481 4113568344 3842259934 +2065529110 3321310710 3848641959 +1756151973 1022598602 +534424965 214735001 +3679903302 2904442678 1287583581 3754354535 2411718689 181957690 2182778513 +1909813605 2893654395 +755139964 1459102247 +3619175280 117805397 +2745227211 2745227227 +2566062710 1015865287 +2316866257 2489331595 3682677000 +1834653147 10086340 +3146695818 3418318125 +2184949826 1173780469 +4169592320 2273588620 +2732289955 40942986 +520131019 1162645231 2565178004 +1743252398 1939308031 +3136405632 3398568339 +3136172608 4131158651 2230917829 2230917843 421864475 +3262481986 1627544053 +89839695 3171058776 +315171394 1003627372 +4073691092 556284675 +2442932902 3739466583 +1338236898 1593581048 1556908361 1935241429 +1125367235 1528019434 +4071107957 4071107941 +1887137100 1832926070 1477032660 1473617312 340658017 871594524 4215752070 1582108343 340658039 1081986050 +926265354 268299542 +1463037702 3923520849 +3021164032 2053360147 +1617989431 1617989415 +3670012409 251456990 +2130278464 2590527926 476398311 +2554718884 1511022655 +1720003877 1349325648 +3566744054 2711004753 +3456758666 2688066290 3819594299 +1947745308 3352165073 3727073297 3088623268 1944333810 3727073287 1366526779 1514264336 3352165063 375357708 +2417946029 2642304715 1649273966 +3161688233 3936393443 +2621445541 1155758794 +628392716 3099709336 +1056015007 3039862878 +977736610 3519034150 +1021142793 3649647406 +545220229 86963756 2944934254 3112008367 2944934265 103741362 +3681295988 3013674656 +3543271893 618627693 618627706 4224750195 1288010314 +343263859 816897014 +4239638808 1038718922 2957615532 3064995683 1726982821 +18843041 1704942710 +3500696922 3070119926 +3259628320 4202058611 +2609719442 207565627 +3986439055 2616312344 +3106728884 3106728868 +24677786 35746658 +1056669906 4159425178 +848285641 1633950062 +3265085453 1787548786 1787548772 2912561723 740257637 740257650 +1515504541 579337624 +2879200335 1387670193 814496396 +4146280426 1324052050 1324052037 3952390182 4134602061 +3421636043 3640598146 +69329838 794389241 +626519964 3549140876 +594873225 2753501888 +1498958845 2734661442 +1790782941 3838784244 +224548424 3154361187 +2748895301 860871834 1622689405 +479928863 1986297677 2752663201 657897160 942349040 2200026332 2200026315 2769440823 315901574 +3718081154 1624156853 1624156834 3446953675 +1353557694 3210575135 +3251497369 410136140 3525435527 2955328456 +189219399 2307702818 51614111 1993227614 1993227593 +2542885543 3927948466 +952420742 2362215366 3821616631 +4005034058 499757601 362536045 2364288070 2136741285 +1990622697 700183448 +1969697804 3715559137 +3635907259 3824116836 +2187931931 96601800 3631262923 +1720839898 4204257930 3563247267 +2783340250 4013248975 131957668 54007025 62122301 +2844193756 3144803153 +3596032825 2753551038 4283823228 +1813664981 3059959192 +2010970116 3034213961 +3976066167 1078742130 +1795208104 732477117 4021408016 437965181 +2803020857 1284464118 2631726926 798821200 2328995271 4012170577 614265863 2590800428 3517999883 1537555357 434479012 2263908211 498599217 133719506 1247030876 1539151443 1411824015 3981888380 1814129197 +759584021 759584005 +3605369469 972201826 972201845 3362101972 +359061267 266777185 +2948156221 3719393556 +860163179 3977452174 548572258 +3785423047 4150763840 +2901324286 969028297 969028319 +1699765844 3515121199 +2472622416 1376598261 +131296557 2065248645 131296573 2127879634 +345435100 898970167 3674574992 345435084 +2118796516 4071893988 2417157327 +3297507844 1817875551 +2011317005 3325005170 +244429075 2356867565 +3346707874 2821451285 +3589159940 413310114 3242458903 +2656045552 3429923659 +153532109 328774258 888259771 +2509365862 3668403863 +1432731786 1193383326 +3772169410 3274929829 4010001836 388590978 3498826442 3813093582 3498826443 3020629347 3498826461 +3954007196 645222215 2649278865 645222224 2546566796 +584679198 4200799295 +3293329245 291440030 +238294867 2667617898 238294851 +3961196491 2040126612 +3699308724 388053167 1388267988 +1758900081 2062954224 +1850691714 685489322 +4205739442 1387257637 +306303973 1975842832 2728431980 +3671640335 3654915418 1267080381 +3312458494 3447356873 +4232634987 2445045364 4232635003 2713487282 +187795332 2496307719 3521999388 +98550107 620784073 641072894 +3410549047 1546980332 +1557719760 4185498979 +3172128460 3783456273 +2515847725 2515847741 +2420237834 1836196787 1796346336 +849449769 3713706382 +2320590800 1717968424 998030379 +1138247879 2491060566 +2191529556 4127401529 +3909009903 3554728818 +3797813984 973807269 +1915506831 1254281486 +1244893137 2687198726 +3847113344 2900791688 3216725209 2050967428 2050967443 +1893384418 2321392597 +3345857036 1405290611 +3507143032 2347667437 +4270368727 2283812710 4070554233 +2817679875 3960918298 +255781364 1161050207 +1334327966 3514058431 +3310087491 3736875091 +3583658444 232926263 +4162292262 3066678631 3669520090 648960310 +3886515807 196642718 +1322265283 1322265299 +233890953 2731082898 +355532411 1280639784 +4244968514 3937705154 2432623605 3915282059 +2592992534 710853089 +777368967 1236779667 2012005248 +3413559619 1192036627 +642791098 172369611 +1871480063 3945599968 2570411390 2466382959 +2965819304 4042843499 +3294737870 802534618 +1490163965 1225705954 +1624878772 716047705 +2253836093 3542208663 4114308529 1719566852 +1849874819 3469117159 +3534710825 3823582358 +3245566849 162675712 +909414952 2255146288 +1242445312 2593141800 +1422295632 3296666595 +1709364412 269798103 1709364396 +1947044578 1541172668 3427885463 622999288 3444663085 2465221622 2465221601 2565887350 757220230 2961288265 1026942066 +1622759786 816664130 +3698301652 1144489023 +3525714518 671616369 +1355176901 2577497596 +873558496 873558512 +2945838131 2362418253 +1024725434 3768051659 1512170626 +2922838042 1518899453 +382532293 941536508 +2795047790 2968321583 +4121039742 740601695 +2810726401 3459469443 1647839024 +3538216541 1532404834 +4278369781 1235723920 +2200995374 3560242351 +2004889352 2903319075 +3881751370 3538900294 +3007920921 2939829781 2590320034 +1647073097 3982138286 2314552636 1961089772 2229197456 2323993701 1344001536 2441437045 +4233808149 1474989084 +2872998372 3481184283 +1320938984 725953539 +2510203628 1959203223 1709086063 2433315348 +2043111595 822177999 1609155874 +811296858 2045068715 2397875234 +4240722028 3282756721 3437045633 2801275324 19214336 3712158844 3437045655 3437045632 1425932801 874870146 793031371 +3974647815 3974647831 +2883635040 1031065986 +2322689362 3661817325 +2502539682 2362987178 1924086275 +3835859702 2843571146 +842908271 2251887790 +2115003419 2395838098 +1904832529 3428543174 2045318582 +38582497 2143750710 +2056710607 3398570200 +775047662 3602368111 +2615746514 1833854590 +3383569034 207630834 +2625281486 2954382674 725998776 2983450113 4027311671 843442124 +2758153497 3853727326 +2323889229 534113588 2036262322 +2434315953 281877857 +3240356666 2180189358 +742379905 695651862 +2458468872 1251938992 3448129804 +3379623904 4241896869 +1529957208 3868826509 3868826523 +2520517432 2410547406 3095767341 2746099776 2808697299 3095767355 +1818011221 1102703603 +371945475 2999280282 +570188129 2870899262 +1204427995 3727387858 +2915945896 1123729259 +808477944 1927782803 +3979252607 4090144193 +3810469999 4178355896 +1665996200 173617339 2537552340 1665996216 +111250342 111250358 +4013884290 197925698 +1762988362 1064654501 +605782487 3554062164 +4102961270 1859355808 +4003363036 4216350087 2138587729 +4286800223 2597472414 +1336353071 2467904760 72235089 +2441775109 3207386248 +2602429866 4141709842 3659342491 +364785595 4117046130 +2855366661 4040382426 +2656052845 2656052861 +479863973 2879893434 +635962875 1878660776 +1196265795 2182851690 +3714953203 2259417996 +1343978703 1343978719 +3072444038 2855888002 +1774964726 3047135955 +4051108872 2228124976 4274814755 643520651 +2175086831 101451832 +3121302624 819061422 +2115427513 654138904 2115427497 +2614187621 2945122554 +1813054257 3252794397 +2602447999 2329874911 +732350537 3429692600 +1856135225 1654487464 +1110966928 1110966912 +947029528 511852477 3855533658 +1953996252 877494609 +1454738681 12757109 +4256546850 912260395 +110996974 1480117689 +3246069810 2657663949 +2754605944 3749457067 2754605928 +1807999670 1532880017 +1252193008 3438520471 2035364850 +2275091703 1882927312 +3895992712 1009027075 1476567472 408733963 1997576355 +1946549795 3362722058 +451165190 1531608417 2588291602 759398982 1531608439 +626738898 2295602043 +3109883845 2457850636 2990098160 2457850650 +1448828536 2681052658 1775613691 2221863111 43064941 +4108031561 3199046904 +382017143 15389646 +2057941746 186954469 +3349751256 3776544115 +339390037 4203189886 +3628056898 2925345507 +814264055 4009147726 2030724016 3747437391 2255229324 2182455217 +1549759701 1061481290 +3703986082 775681045 +4160356269 193822020 +2371040362 1564918714 +1067471408 1229757835 1499554197 +1883972270 722896853 4021557850 4019807097 2810538584 3478765914 1950849017 4222889273 672651543 2927981932 252078235 2944759538 +3333918320 3171603403 +3723536369 2840741692 1389912176 1389912167 +1642670334 537626569 +2296323221 2156809711 +4256172910 3391225391 +1638891088 3564393147 +1286453634 1198395507 1451059744 95230078 2690747769 1198395492 +2004139615 1808248734 +2558399237 326627546 +3093281006 138431855 +2988519785 3544238158 +3864944229 729469322 +4203729504 3496488236 +1817239914 1979425606 1692732758 1953297362 1953297349 1817239930 +98835191 1024881360 +256031288 1040918075 +3226501429 1751572092 +2247048899 2183217860 +4066995791 4066995807 +1087358037 1544688074 +3822985164 2192313889 +3686808975 742126165 +1469462049 3685349517 +3346707886 3022782713 1314665770 +2800585472 3354513683 +2167520321 2722847318 3533649265 +1993753542 3151754530 +2177235455 1235782760 +2974531030 2974531014 +2350761699 2000349767 +779431834 3162107755 519300469 2565361846 3162107773 +298087005 1430259828 3702492400 1430259811 +3753980077 2131940660 1436498241 +3014157201 1662303567 +1788235164 1721511047 +189104037 1667756218 +305896258 4124403957 +2722634933 4289462348 +1330044644 2962284799 +74496384 74496400 +2680423761 3532938886 +1798900214 3234508369 +3932265749 212486154 +2986841038 267234639 +2313094070 562609162 +3004275892 2562305871 +791771090 2364186034 956837502 +1111777638 3208330731 +1421673574 124481969 3415075991 124481958 +3586064029 413847860 +2409051539 2651412076 +1679588336 2295798467 +3064089934 1963256025 +2785321938 3399308110 +758348056 762326588 +3585110874 3200620221 +1457057439 3946753557 1756105500 +1904083544 3044864270 +4183325739 2974513058 +943944783 3778025550 +448491738 2237474979 278736502 +197728116 244310472 26209177 +115239075 3131992349 +1086430803 1714110710 +1323916030 928660959 +1179344042 1309372990 +1716301007 3920896798 2389409563 1716301023 +42589131 3389325442 +489793869 1604786866 +2615013803 3885345912 832557257 +3743248092 391480401 +4209648393 127215406 +3962228606 1164223305 +802530560 1297268485 +2617850631 2844257302 3774383108 4116025945 +183243822 4154555090 +4215349650 64640059 1269995762 64640045 428333267 4157614526 +365012262 1708587735 +586539435 586539451 +1568971808 1472317043 +922690231 2409524003 +2083243594 1342673829 +3163949917 3238147174 +2738015938 2868607861 +3205453837 3525811314 +3079978435 3257317866 +1921148862 627646665 +976817437 3301942452 +708425421 1171965092 +467947988 467947972 +2558016226 3880038869 +4129668986 293345110 67589775 2141747052 2978352537 +1844624195 1478281834 3268406495 827506983 701897491 1478281852 +2545527454 3717479678 1204693232 4268021846 1237945260 4268021834 +742527996 2818930097 2818930087 +169786327 169786311 +1638506296 4127565101 +1309435735 881241584 +3333027882 3885083163 +4228144881 4192980886 4192980865 2883679590 2883679600 +27938230 1427658119 +1932895583 831394332 831394315 3161674888 +3095201430 2526492513 +311153063 3642427872 +2421846764 984978967 +2720847921 2107135280 3704490689 2107135270 +781856402 4110284990 4004990931 2643634477 +405035395 3220936596 2218322236 1637296487 2218322218 1524144829 1637296496 +623070677 1128031866 +3748142920 4176035403 +2559698716 1236193553 1236193543 +3114294847 325406103 +1978151023 193216174 +3342592393 743482023 +3730308179 1845235927 +3037365648 3038212092 2408595893 +1360607280 3716084619 3669193621 +83621173 228786812 +778152294 1774037889 +2096433047 3841945187 +2671265018 1183538929 +2381256377 2137723642 405584750 3461775518 2785982639 677430568 +1211044319 2165907998 +3109883840 204277949 +3012522561 2412436337 +3588981076 3453807933 3631590223 1742864521 364681007 1893863103 3369283764 +78689191 1315257779 422242566 78689207 +2997900248 2997900232 +2393153547 2552754516 +3660688758 4063498449 +1349439213 2464794962 +519657336 981774829 +4096776441 2683874505 +1793744987 3519211528 3621597541 +3905929970 1896866547 +3426732627 2567820126 1502900239 3681255610 373001920 2567820098 161748909 3384920042 +1386011973 2538838909 1386011989 +3231070977 763290262 +1086924089 766471362 +1000457589 1420416810 +233884359 3104782166 3845124415 158910014 2465462724 +378456347 3818741470 +524300594 1678602661 +769211268 2882030788 2969088201 +2187290195 2402161850 +125755902 583712621 2993121610 +2517246359 3371360432 +4119989403 803854354 +3346951684 268906591 +1824024047 357070638 +3554910444 2069255063 +215679969 3187932860 +563794098 2562099237 +3634738312 2497393163 +2945791399 1343393700 +369262632 104217232 +2577617042 579181370 +1205375565 82415329 +2218322230 1536630801 +2229183314 3961322515 +1943353673 3624241375 +4174535239 4196670934 1486584345 2262488388 +316257688 1152966235 +2078232553 3918187480 +360661997 3294096914 +3455978185 267057774 +1662981392 3473746738 540014535 1710908210 448176828 2305332640 399274868 3724988578 837925826 1877063692 4211269085 218900829 3915717588 3276647836 2307555271 4157059582 1429867421 3591940423 563831069 +596084770 3815975877 +1585337773 1258262034 +2090979132 1857633127 +1674842059 4057259138 +336287349 2781098010 +1885939962 3772521840 73930481 +3734820255 266619208 +2983945169 3445498374 +104653862 4158334913 +2112693988 3449132761 +376619601 2172329124 +956952572 1718190512 3332688305 +2271874421 2700291900 +2430799848 931536405 +3682315969 2615447085 +3052631297 1866543254 +2240883795 2773532864 +384054700 3040902615 +3976457050 3104701439 +3522250708 1231279212 +55116991 3941759144 +2432599875 3361828134 3361828135 3946922493 2209279612 3361828144 +2303619530 736422475 +2381703749 982392506 +1556516571 3885163204 3885163218 +1194732282 2971000924 +279224980 3643219731 3805269482 1826806893 283352578 1021532051 4146145101 4146145114 3579241244 2420024958 3008489406 1319517341 3341545199 2267625547 +3102982692 3754411023 2892996004 1915731321 1270521535 +1367614163 766068849 +418903725 1736555359 +378106329 1398683784 +1578780148 391913241 +56105083 3199109554 +3631494858 2297577453 +2588888501 2681689066 +3699301175 1387468678 +661910073 1418088360 +3896356716 180250263 +3077255094 3077255078 +1693272295 1693272311 +3248374413 2073466234 +3844993263 3936211138 +3226757788 396758352 1625543569 +524241577 3651307534 +374654532 1802771721 +2361226719 77567644 1026562017 +1710403256 889785275 +454909676 3776995840 +2104047001 3085167230 +3149254053 607304378 +3108599820 238097560 +2663650953 389844206 2663650969 +3096156386 1707191235 +3014498659 1028159196 +1633044698 473841914 +2713530082 113817288 +3905158919 1938454550 +2079035525 2564063564 +643026234 3684748291 +3633037804 3633037820 +3370352577 4280425664 +4271796540 649575912 +2233885921 2087767606 +1196512286 1661430569 +3109782214 291964689 +3460317405 2351307755 +1671152587 3267891448 +4261700105 3924186159 2834805940 3924186168 +4262488280 3982620787 +3823757259 2149158530 +4129502803 3429795002 +2542659509 1495903773 +2886425141 182387068 182387051 504963560 +916587090 1393141523 +2663210390 1651567794 +723900282 2200535125 1720857867 2200535106 +321720283 4223656840 +575577810 3552838789 +635066762 2558419505 3176034966 +2826477409 2531452320 +1718322745 2565006288 +1737518308 3942145429 +580814496 529395173 +2925440110 3976818991 +2127069972 2800959484 2846251128 3695965172 2161981513 3036171005 585576885 2846251119 +1130005618 2038333299 +586823065 2833407944 3126651497 3594852299 2833407966 +3981670788 510151391 +1050365548 4202460183 +704772088 421092205 +2548590329 467278334 +2614471710 1599986201 2414210110 2614471694 +2008218093 2153606226 +379880965 2852059596 +3142755610 4246333419 +833062462 1756910473 +4119579609 1678894750 +290324190 466106239 +1457022625 1978455761 1470730102 +3798092797 2100936544 +175422273 2968069661 +3546449187 334206476 2268511128 +3775239546 3049934621 +3392220420 1332337984 +3983887428 4244418939 329715465 +4188510709 4158086314 +1544120701 2551959138 +2084583466 3273157133 +2644120153 1921704478 1856107817 +1889532389 1535023370 2285967139 819356524 +869946931 3551900250 +2331529783 4226378896 +1354379298 924435843 +3453000386 2058697422 +1211961639 3743547488 +3902300253 2229252724 +1398171806 2793946281 +1297178934 1147828928 +2254881888 3883684652 4089914149 +3770293767 3422373120 +2259784940 4119687063 +153374462 1646811593 +2439029923 761215376 +2846426476 851487895 +2700816890 1701817501 +1518301036 3801900823 +116880589 2593594963 2434367000 +2165859928 615791264 +3937558513 133095799 +1762753105 1901972932 2155658541 +34654303 3450604033 4063910289 2656221622 3638226817 2343636490 +1909911152 2955685059 +704395209 3775648110 +2731861701 2880071622 +739327675 1628034770 2784851845 438681714 +1161382355 3425646394 +2400697244 393196453 2515272279 3730593425 2623292999 2623293008 +454811092 2162046127 +2627195438 298526894 +1459548646 983882534 3646344471 +500551938 4187489845 +2990934131 2762361334 +3569222083 2854012394 +2709449685 639381041 +2407508667 3442485631 2700723300 +3172098026 295528486 +766107904 3798807315 +403044015 2489289708 +3690846211 3690846227 +2346508674 2931228597 +3914838703 3665668091 68045176 +4096802618 4096802602 +89304027 3610628475 +598252506 4235024427 +3162848896 1170301843 +2005653212 2005653196 +136593348 902402299 +786302629 652404867 +2639798523 2897996594 +61450815 51839272 +2135654320 333054467 +4163404955 1120452626 1120452612 +3902471364 1378123053 +3723536356 1171803135 1476249516 3068476839 +3838095202 2208307011 +2083010167 3930963280 +3313274814 2702592009 +2895641619 2512640394 2081164057 4187841443 +1104088917 3992265436 +1328478664 2245905123 3842554992 +104977689 1338003362 +4170956219 2203954309 1891759208 +3483877487 1679034366 1410592430 3483877503 325110715 +3280633058 3731930493 4005543668 1510398510 3031801839 2649168022 3054823402 1776993993 3036846019 3054823421 1376177556 +4260253182 4260253166 +3856454627 3181481564 +3474272697 1355480582 2933399958 363377850 969786915 1562733760 +2922988478 36021279 +3667292110 3516403545 +2457914509 107553497 +3028074610 2455958373 +2993952194 1033704459 +4014429827 810364970 +999495588 216061336 1821259583 1821259561 +2970521255 2583536531 +1015859556 1434467672 +2579177227 380605820 2688629442 497090095 3564119433 2004492427 210886228 +3038902453 3462540819 +2374883314 3360354789 +904329276 904329260 58745840 379111015 +2964653038 1988768946 519704697 519704686 452276143 +2905504112 271133532 +1970447163 1919290073 3284021326 +4144733772 860500385 +2761893247 2777155304 +4181765676 2362584919 +128216156 1675007175 +1434217613 534700530 +2074761445 1589111843 +3277683393 242012412 2964965727 1280923622 2707834642 30204050 1294482880 1149521978 1213813146 2628725863 +1771298639 2241271858 2194180430 2382389243 2974350002 +622091968 248400683 +2317700033 2951221489 968245462 +2325267773 2168725700 2206917905 +2433679061 994180973 +2042051806 2984626942 799060738 2037698943 +368409933 3732160548 +1151693965 2813788755 +3923178214 1740063793 1740063782 +4135194072 3659778843 +1915771950 131520431 +4271430196 1142213090 2987804907 +2368733368 584029376 +2901712874 790084955 +1040055827 1040055811 +3901852789 2880631116 +3852221018 3471825853 +2103151480 3474755053 +1693285219 2308967340 2205913742 1662167278 1907620486 3383611607 1915226676 2379269662 4208998719 1581483475 1803739771 590907202 1197338216 3994034443 +3912989295 3945594502 +2187722688 110205765 +3004312314 3751389067 +675780419 3924610737 +1666167710 246720083 997242199 2943390310 263497705 474985261 997242176 2428398927 1993592876 2967974698 +1314342398 1365454537 +1944785763 3725558986 +792187318 2873217689 182395281 +100528388 4044078584 1925343561 +3431390901 3653472275 2907739882 3218969165 3218969178 +580556025 3207664331 4283943112 +1107025957 1315603201 +3226319872 1752835035 +283984703 790411040 671834881 3408077753 3833650238 3738866428 +270664814 3549231407 904676590 3549231417 +1598203372 1598203388 +1650083272 2619070923 +1998716200 104365475 3436632464 2994832893 4276481347 4276481364 +2507383385 3850241342 +1136716427 2221752569 872183214 +3083596141 3272412804 +897813207 2647416899 +900889384 3513155 3513172 2952257533 +3084541593 4123185592 3084541577 +2582032419 1321393061 +2186101921 3231910240 +1478005332 44980783 +2578378011 2578377995 +2428289742 1893603929 +834693958 2548621111 +811520936 3443995005 +3737006361 3737006345 +2324967795 484754527 484754499 +554758395 3523829917 +650563277 2624100733 3440848865 3623324836 665828777 878938739 1535526944 2624100705 2897378354 3575069819 +2277925803 1750001204 2088966613 1748263887 +2252271874 967821579 +1427717767 2222528729 2109566614 +2796482462 338533289 +512106265 639824990 +709422818 709422834 +3371726353 1330549245 +2922965218 1140034038 +3412538541 3412538557 +4270112739 2381976138 +3098892407 2280101934 +3599360509 3087974740 +3033130902 3033130886 +3552875121 2001465089 +3376829327 3989332955 1756727832 +2552562331 2552562315 +2089274824 273984512 +929223490 2110845906 2110845902 +3016524800 1120545740 183749637 183749651 +3072769924 2788256284 +94690731 4271400860 +1113957833 4247871859 2705552672 +788133354 4287319567 +860938147 2332388496 4242734523 +629628868 3165760184 2385776685 629628884 +1960520546 1459964757 +3398804307 1250128931 +1686271339 961360363 +698478043 647239229 +1837904544 3907062651 330543603 +1017905910 2026416455 +1668998655 2204395622 433476311 +2751913470 886011615 +3159516551 3159516567 +146143 3800214792 +207319877 3321569642 +3228978186 70890413 +406970878 766952137 +2449275987 608253626 +3392798435 1678902517 +2265615625 2661025080 +1340424075 1357055956 +281198063 1368457016 +26940230 2804596034 +2383498221 1143017028 +1649051770 4220523270 +1042644035 16386301 +420431101 2703087074 2703087093 1242918027 +1781498679 1567817652 2881164217 +3452598406 4245775610 2075900641 3213316817 +1352555846 793564449 +1073435756 2026013727 +3744213008 1230247531 +1134491471 3258929496 +4007134916 3256002185 +1420781042 241838743 +4223333240 329585683 +1090757128 4132807250 3737472308 427476784 3737472291 1707656010 210755252 965640539 1622676125 3650647967 319040285 +2234288623 1641967930 1261190749 1641967931 89492399 1026304087 108628692 2484937528 2535598225 1641967916 +505729400 3958751227 +2833926379 1705896719 2833926395 3553675764 +1449652009 782073230 +2167194960 3238335932 +966481414 1019292742 +1695433889 3050367757 +1976104148 1062824377 1925279295 997623604 1062824367 1925279272 +1151859926 3933406449 +400293108 2203005967 +2807001669 2802901644 +401146940 3755059825 +2788141139 2238291136 +602227098 602227082 +3866337473 3565653191 2227064423 2257250202 3525081172 2324360678 2324360689 1713789880 2298875862 +3317429819 2179243748 +2509832709 2229153242 +3673752469 2617340474 +2041086756 3416834171 1562454553 3797359630 1283842910 1915917353 3914802974 3931580580 2704615275 1032338656 2414144783 1032338684 2823188927 +1500498198 3774451111 +4000959759 2025705112 +2339938294 2229522513 +3229302909 2131133634 +3370454267 999517988 +120075894 1614397406 2337676211 375301459 +3672481284 2608316511 +2942876957 2942876941 +3570597662 640130111 +2855346774 1177557281 +101039316 1325941177 587167272 +1948376727 1380658569 +1108787012 2248332857 +3063127802 815414393 +4130643211 1210786537 +3198361408 2974570779 +2215583169 2764822218 +3789965201 780314960 +2219757994 2962423301 +3050701059 1122211765 +2419045108 2259900143 2042669385 4081745400 2042669384 1598069396 2042669407 +1307443741 3034230366 +1242593866 3790635629 +3698126585 1784589283 +4070153788 3621943783 +1958861000 2502443723 +765480149 1191637600 4022914908 1335049712 +3862020177 2974924687 2974924688 +1767821872 759512025 +2074086215 1083995594 +3797506953 870515062 +3721762299 842734116 +3677995856 1810790133 +3154181799 741376831 +141929763 1950322204 +1780988737 1569441622 +478630314 2154396518 2466614925 213876229 213876242 +2616803040 2213646779 2213646764 1767766693 106057688 +3652325844 2676846420 2819174200 +2358441138 4250350643 +1891431398 1601434391 +63951180 1243878763 +516919599 2608269393 2779834988 2779835003 2948697336 2948697326 2917966210 +2743356766 3343239913 +2359273713 4068358887 +2421529593 2421529577 +3227224440 1209624557 +4011226727 3344720950 +1006106544 391834115 +1379641824 3257758892 +547208631 764018210 +3091355122 3144329398 +568608518 1616629345 +3140385344 1708305435 +2386218922 896150546 2233034086 +2296293762 686801685 +2836363521 609975424 +2764207026 270278963 +638168724 2236815276 +358363130 3365229367 +1821030444 174058839 +2778542611 3379942394 +825783175 129152646 54767762 3046045125 54767763 1031807031 1907138521 54767748 48094592 +1684947512 2094491285 +4040467905 314047206 +533818167 12962942 +93184883 93184867 559740106 +3803397547 695449711 2334790690 1581323465 102846660 4056416701 695449720 +3902836486 4111437126 +497093984 76025395 1194214445 987058884 +984177719 2799109872 +3083538447 1672103822 +3836065411 3836065427 +1402206369 1709822669 +2617406560 4158468915 +2077821761 934066006 +3424022245 3499846466 +1499450888 3117504148 +2408040870 2562879553 +2001129521 2493825750 1533576247 4118396198 2493825729 +3313826579 56049402 +697165440 3932281747 +2564150108 4103846343 3794109447 +2592338187 3356696632 3356696623 1219785812 138587580 605792377 3356696622 3357910261 +2909565061 2260017498 +1622943541 2100410474 +2745373207 2964683312 +4175874983 2052233184 +2806415411 2264649818 +2877628409 63491038 +4035587777 3615328763 +3234638068 1714282239 3234638052 +2715735628 499866039 +474351015 3566391097 691725814 +3519483462 1828601478 +2187373437 3140351426 +2811315701 3199279292 +1770715178 887538406 +304589204 672643956 2705133823 2438731663 678425583 +595209514 1509328274 55908635 +1354674442 640725691 +3337697153 403025654 175224999 627393190 2931449856 +1845309105 1803191616 +956433485 3552059617 +1458626357 305094762 +2649615928 3582853691 +4108478716 2087404721 2380079792 +3209681510 2427768449 +4223760622 1191148466 3235384697 1066491577 +3071503381 487267529 1205378350 +633148081 64424256 +1840750339 2069220607 3263499534 3138343338 +3074517093 3774306042 526248861 +3720187944 1589852227 +3500655092 1813402383 +2872836571 1786178514 +3814802622 2954835721 1580377677 +1116529023 1120336609 121436970 1120336638 +362831693 1484129828 +1818927553 894719718 +1989785357 3237685604 +2141831664 3896265923 +4089280950 2570526827 +313461828 1126984504 2911915785 +2727358428 1756001425 1431666768 292760140 +2444612973 3460233860 +1961613471 2923823710 +691242183 234247847 3100282143 4252473170 2736391488 2736391510 +3018223363 3983604464 +456048035 483490448 +761300059 3387972434 +3735574726 1224982433 +1256493182 1972849009 +2180820067 3364874064 +90487238 3880898615 +1942772601 2697563182 4185136367 +4291745686 4214320810 +591498285 2905582299 +3126177266 52353298 +3765003394 3765003410 +701149433 392905950 4055869807 392905929 3272906750 +2880451099 1633607826 1365165890 +1959684056 410732796 +1140327502 1299105497 +3083402690 325548131 +1471715827 177887628 +3272434139 3000341412 +1443430998 3324947825 +1237467795 781017366 +138478580 4065933583 +3653110178 4224524970 1747528195 +3584514648 389133984 +367787915 430576303 226707412 +3087423012 2535407147 +2392232352 386350835 +2029054774 1321291633 +2987103594 1875429317 +2590177677 1570736974 +1731177971 1909764325 +478970118 4147059809 +3130033813 3130033797 +1778216552 1106562493 +2095628312 3127272923 +1315008750 1365558969 +4124997067 3975615214 3627249282 +3566843603 919768919 +1691001857 2885692800 +2509978356 2002636313 +2294213680 776027188 2991261256 272484235 1744948727 515389708 +2826601413 3180717546 +731075990 2397116021 +1526295509 1526295493 4221871884 195346524 +2980115167 2306857884 1782363873 1615128051 733878342 2306857867 2136888584 +3094423880 2720267357 +3160212502 3880071415 +3524582333 4114188164 +2924015119 1808712078 +1907860811 1720793386 1490864515 1327052034 +1311520716 1833064372 +2557675914 4202118626 +3744688026 4159444843 +450314376 695847552 777573506 1434277933 369967263 3615802366 1502844499 1044041555 4044921126 1882213796 222038722 1816431247 4250590799 815943998 3521941357 1499031109 2230354385 3134394705 1395927288 1632123666 1139421627 2242302600 290278818 3303280959 2034948106 903945467 123329807 867875174 99089893 2211020023 884700849 458211783 3491290155 2421993802 3405142194 3931960959 1354771549 371795486 3899418352 1912003963 3780172675 4216183487 2138266735 3955698859 3385282792 1742087323 163351847 3261674863 1333396008 2825856468 2571631120 527277601 823120672 3029952555 2586211813 3169573138 2929640206 2784528113 104585922 3865098935 483413911 1593136780 3447934061 2688777745 1644046587 1077494603 3394447848 3541597922 2000993228 1860215989 498227839 1845658215 3724112085 +667864090 3297463531 +241295532 1906543523 +437747420 4009538641 +1522961336 1182074451 +895803626 1885583606 +2643637457 3740443920 +1999866293 1528940522 1613608282 1613608269 +3034460437 1397924810 3469165590 +2716390918 2852876407 +1501190727 1002624324 +2548655137 1164484598 +2357177838 452906425 +276966781 2045615042 +1714122650 1395926370 1885384555 +2978997977 1585997726 +4233995002 1097306013 +103500317 105721858 +1363317222 3519786241 +878067224 175746385 4232798255 4066776039 471781740 3684988386 3397642755 2783285973 983585039 1504209390 +2278450000 2784352701 +3963855018 2557864859 +1910275643 2031793906 +914405727 987842076 647454305 80854276 987842059 732156040 +1688028608 1212097421 +1496418844 2231134737 1165729418 1784346832 4199766796 1450948953 976595619 1784346823 +2754995487 1753855947 +2731557512 3587750941 +2887526582 2790528657 +121567868 3827585319 +3357689406 1274319775 +3966759432 1817320756 1010434717 +491859500 1389080385 +698860301 2685930852 +2920609873 1543694214 +496884065 482973996 8205216 +3611579382 1037303092 +3117509801 766381582 3979511259 4143980568 +603228095 122054182 2893720427 2893720444 1527903361 1492234664 1544680983 +2559498325 2111737290 +2862072739 130084999 +3371082782 1687007548 2106448008 +149168059 149168043 2854083106 3122525042 +3688848308 3567082575 +3686427246 537531581 +1969306449 4274518333 +2587541924 2519520382 +1263221010 379653916 3927309170 3593533371 2165171870 2519960638 3593533370 3593533357 +531412786 179560350 +3689861098 586239323 +2036647355 3567469924 +2283422746 1532572925 +802836458 1051446605 +3292375548 3910309809 +1705397404 2697632135 +1722344838 3539448703 1286866886 980571130 568414711 1286866897 963793508 +572842162 2392698039 +4205472760 2454189933 2454189947 +1248219437 3638759488 +1553273249 1605025888 +865518708 2629377656 3227375327 3227375305 +3510714072 1102441997 +678417398 678417382 +2274716470 2966207745 +266976917 1952262689 +3176436623 1377870796 1868028529 2602846734 +589357433 4110897405 2313140753 1356669347 4246473135 2936480480 251478507 3004576716 2870355766 2209268962 2041492769 1988894269 2209268981 779832314 2853578128 3086191159 +797216171 2024473661 +2050115756 153642711 +1996506526 3815603865 4084045759 1996506510 4084045737 +4237773539 4237773555 +2790698796 108380759 +1359216956 3370776432 +4251694314 3666725979 +1278488947 1366254714 3508121101 1764349964 2564758240 3524898707 +2545843070 1591502687 +2933683927 2612866115 470750320 +2384275786 2134324449 +4105823801 2040884136 +2551704302 1537660079 +786750104 3639983153 +1233436043 1233436059 +3162556247 364498416 364498406 +2750559261 1048894187 +3694312403 1994239276 +715887344 373667661 +2931233863 2521767763 2913728959 2896951321 616179646 2521767748 1362422720 +1175966673 3344529706 +200599989 1262359898 +3532383324 3459808455 +1301939053 2033050455 +980456606 2637821097 +1640863806 1640863790 +1470006002 3767018227 3767018213 +142734785 630578902 +3004533459 3186199084 +4282757463 834022374 +2368043287 1893655358 +4279388841 852199438 +4220317534 1557975295 +3555071145 3515418638 +1217774646 2042880273 +73513918 269128926 2749008927 +3220253827 2424478356 2879984170 1298361277 1999090800 +283389007 246930097 3862020185 3862020174 4080276050 +3197286086 3337992609 +1875559167 4214290280 +3507259253 2344172842 +3966396368 2662932008 +1804733868 1505988311 +1072326395 3846740110 +719052348 3021920359 +4092283446 828756753 +699438166 4143547249 +2642059129 1060968265 1060968286 849531967 2642059113 +435068602 821541269 +2590678447 1430129388 +90931932 4106058572 4089280950 539852679 1766234513 3057077770 1681850449 539852688 +2857806188 1306872973 +1799925954 2552757345 +2194213194 2194213210 +3889453277 3494372340 +980893150 975185361 3887490166 +470332171 749853250 +1923488170 2769620103 3645238684 +3791337503 1788526753 1845936860 +1635658046 2178522947 +2410224953 935078664 3308764555 935078686 286924847 1614348456 +2339780189 3206452821 +615984045 3642798983 +3495031158 1727995089 +2205642710 3406106087 +2993006659 419946858 +3740596018 1368130221 278087625 +4104601226 2907140909 +2354346333 2352353621 1174080866 +2661267204 3110935360 +3728609680 3728609664 +3766707043 3520427210 +2779745515 3193624052 +901383584 3980708376 +424442100 1824048158 +1359384399 3696466254 +2617299041 105390576 +920420155 2283548834 1485328895 920420139 +2516757844 2639993535 +1689100506 107175732 +871758540 2553925409 +1016849327 409431150 +3419625295 749891928 +4228144868 2665570559 3499127730 2910729593 +3512893980 188096297 3809779219 3024828773 1788297338 +3828156051 3319880044 +251947211 1861285780 +2870804895 2582210652 4255747400 6637857 2515100175 +1376144976 1877821411 +185136843 706511252 +168535275 3142884852 +508885295 4005840113 +1140609544 2842573337 444361629 2464693896 926345362 2855474564 2457760988 2168615687 +2210757536 266444005 +3892638526 2110450313 +2372677721 4199554056 +2767483760 483506499 +1429194751 451315132 +2955328476 687455047 +37413743 4055107512 +1030222096 3833563111 +1094484762 2004886754 2071997233 2108704566 2004886773 2613313072 790170828 3426902507 779749125 +135294798 4292818905 +568265047 2837165030 +784604230 3837297207 +1825654608 2641576693 1825654592 +639973315 3482765308 603561054 +459604196 67135209 +244385967 2639309678 +2278596846 3156178297 +1251028960 1116626355 +4102148324 2985317445 +309208835 3928510269 +3051234483 1410632782 394681005 1601844370 2927214183 4153756602 2809770835 +2029619124 1298951177 +3611956074 1402769357 2054583762 +2440510314 1455844654 2354643919 1623620862 1623620841 2371421525 1001919326 +2629633465 1989149224 +1174615673 2953756798 +1121352309 2896348732 +579899086 357838414 3354707535 3022886710 1496745042 3354707545 3354707534 4148975463 932236879 +2866848843 3381451550 +4116824227 4046173575 4116824243 +1834837244 637925553 +1423256704 194317715 +20081382 762687354 +346405953 3253164630 +3825472047 2410926970 +82337262 3572365945 +2792084892 2546025617 +701497855 476933771 +536000974 4158513707 1395526977 3987453209 1158309183 +3990683515 3991285412 626748479 +2437511051 1101475796 +993520501 993520485 +1338274859 3175276468 +4059548547 1520754812 +2245761645 3531881443 632560004 3964650587 3968090322 3426486864 +3354033456 3861058197 +1977832642 589705930 1457417571 +3008497968 2049210005 +1691267307 3012159811 2623570402 3843699818 +2192297264 3832808085 +2813818466 3219462128 +286968860 3372174794 +1206280688 1206280672 +2581443904 2013549509 +3605207264 662710451 +1342352308 2821999695 +1260727932 3347590439 +595506637 3325442852 +2978177511 16050126 +235797158 3321992023 +3254748795 3762336690 +3501524186 1162011377 +1956021965 1442198692 +1014624379 278152511 2935329188 +1241275260 394274824 +2488122190 2833102798 4005627599 +3900792865 615142390 +4112757388 4112757404 +4217198059 2666414306 +313968023 1869601417 213453990 +3779534471 703925888 +2020663598 3350363001 +3425493205 1067839306 2084024685 2074251123 +2985174029 652394596 834205243 +3207156957 3138420388 3406862324 3248914043 2367625410 3207156941 +3149570268 1657485895 +3383548617 1142712942 2797308729 +644322675 3893380108 +2444431111 1675667478 +4016910880 1726797548 +3286614821 2276602668 +4013625153 3169045080 3899610029 +1927653518 1837651865 +1565565850 3560864117 +2980449986 1078367937 +2283875862 1379627873 2283875846 +78501493 939537244 +2579112673 3775195168 +3812894218 4002318944 3460817325 2049466273 +3985135486 1805761375 +3046149049 2341205047 +2395937008 3221504451 +1308385730 644735804 +2143851438 3602938617 +11587548 4065802055 +3093426541 2939096731 +129928982 784486410 +2415786966 1088015722 +782953580 3809619457 +959888984 1764598925 +1676730990 3258217273 +3182631554 3182631570 +1837904546 327650846 +1482864752 2473089091 +617680953 3050908547 +2953179207 1820285779 1616461760 +1363149335 1030605204 +133422772 954701135 +872248211 1794961509 +3099452318 3014389758 +1635574473 517919534 +3995072325 2643830515 +409479503 2919665563 409479519 +3994789475 3994789491 +3467516758 3256631410 +3916935883 1382970772 +829563034 3314335349 +1938409430 1701509793 +947330407 1823219059 1250117920 +3043281975 3299703430 +1785608817 1827788544 +355798773 1468435370 +1502128823 2837757446 +2629563336 2212545501 +1006414198 3837707473 1973259082 +373025083 186607237 2762667218 +3815765309 589690915 +2436386284 101869847 +4278814466 2113898531 +1504975854 822798457 822798446 612890543 +2216837672 4209259511 +397200737 2785497014 +400832330 1803425651 3863153018 3863153005 +99918577 366982016 +836267291 836267275 +4061588338 4152287515 +3180295945 2772623391 +4102951588 2678544425 +291508268 2373162305 +3361241951 3259643528 +567832 631489499 +3949507529 2443806447 +1774183322 320031613 +1009037423 4206474461 482459310 4244585403 +3739542439 3813647173 +3690256534 3631281191 +1571049416 833198027 +1079610590 2604400510 613980927 +271602244 3222372639 +3657284518 1959467761 +1835321356 1101458145 +44427208 2870044916 2870044917 1097349564 +688064265 2562986798 +1617925006 1571113113 +1404776275 581664698 +3486716662 3660119429 +1364137020 726610540 +956879805 2246398612 2246398594 3884089035 1241572002 +880097553 2777208272 +2112555449 4060106280 +2715001242 1512531325 +472579031 782922598 +1217395262 2024206239 +1136896274 83290029 936139838 3204654917 +737425463 4284693667 1752465040 +2690876631 2734937714 +1815260587 4274480180 +3398876548 1867273929 +3236838327 1846018310 +2216476739 1011001724 +2127450111 3267117728 2647125601 +1535154586 2775698813 +2376470683 1664922184 +1624903865 1504966319 +1856726191 1858770077 +2582180126 996207158 +318921881 3991769417 1581967742 +692347807 2458276672 2510869342 +2315801968 3139338076 +1313828166 2366178615 +4181057306 2673987631 +3982530222 2196398894 1561146351 +2691907475 3527534742 +331642231 1266473972 2504321616 331642215 1266473955 2504321606 +3950899630 1698919663 1698919673 +3296002359 3617337961 +1218592733 879397090 +1985994649 4058840542 +3088972770 1327103741 +148074172 3921404567 603324007 3378329068 2698465767 +1669675857 4223426704 +1348885142 3209866102 976080810 2552485442 656448039 656448049 +22295757 3834584740 +2515656839 2462348416 +3656322907 1851075652 +3061203439 724159278 +1140609541 787925459 2918425215 +176508066 836215555 +1230841744 228935605 +2022595520 2258446732 2283433797 +468224853 1853607289 +3946253349 1108687637 1108687625 +3033280301 3396223940 +1218645295 606100561 +4089506028 276795900 +3439623814 3439623830 +3763181457 2871368016 +3285239197 2735200130 +1035899666 1157727571 +1905925589 3742873197 3742873210 +3198164287 2313757773 +157483348 2145750696 450565945 +4253640409 2131795369 2131795390 4211773967 4165789598 +2667882561 2505367126 +1112523159 489051412 +618090591 803789350 2843535195 1784796682 1925486687 737120163 255379838 2346592197 3077298518 1028513188 3155994747 1565567715 3596178999 2286175824 4253560860 +4077269390 490997518 4077269406 +65279960 4161898765 +3785933455 3416934158 +1870008748 584962497 +3918566536 287687604 3918566552 +2530048168 494209467 2530048184 +704567420 387663557 +2516386461 3125484852 +2812274824 1757089291 +3450487564 3386979104 3399571804 3386979127 3473378273 +3837871009 2863405116 +3344482511 2679604696 1172812571 1907678257 1172812556 +1867461758 2289867657 3081740895 2813299001 2289867678 1867461742 +621584236 3202283265 +3221931067 929342779 +1309637953 4136987005 4120209383 160259686 +725228457 3159746318 +1383973286 4096366402 +1724305430 3774452391 +969107019 1616131836 3246045048 3246045039 2483491575 36618809 966395924 3246045038 2788736693 +947916211 2761265370 +3002014385 3576451414 +1136692491 3005089876 +2720162294 2720162278 +208137536 3348790227 +12896179 3905314508 +4162569515 4004536655 2981309013 4004536664 +220983952 1278138556 +1346571418 1757078542 +1721845720 1743001869 +3120527824 4069845854 971640845 2636956259 +1039661789 1784670708 +3120527827 2687289146 +2405276939 1812666812 463978807 232745623 232745611 3143514178 1060047093 +1507588178 3343378693 +4088094404 1522937481 +2958633063 56269344 +3332873602 2228453831 +3840257501 2076809685 +993261522 621720685 +879471608 4044205488 +1824354966 2509014185 3849957856 +3873614872 2153988415 2201736547 3559159854 644429114 137429231 3963102628 2586573520 +360816408 4077744859 +2590918422 832169915 +935489411 1242925866 +1351360680 1956079723 +1836956544 3706595973 +568014656 1321087245 2350381509 +964722958 2471176473 +4084195051 3791100316 +2011074247 962168648 1538729217 2672029652 77971599 2568638880 3465400123 531922368 +2479865677 2479865693 +1500546098 3213494234 224915102 4263516851 +1023166207 558870668 1370275369 313162344 951414076 60378333 +3039392054 4183765782 4183765761 1005015178 +2718516348 2425802535 3675788588 3462933031 +373717801 972284312 +2451600821 3189328874 +1171400954 3822485899 +429172518 208852241 1406103482 +3263036768 2354437669 26038418 177037016 2740953796 271365165 +1647771341 3835046962 +689376655 3975958010 +1390362194 2612852866 +3267234050 1847182734 +3489452955 2009115999 +2279613687 3705286864 +447872082 1479554323 +502674329 3200522366 +3722178902 2537351783 +370910295 2117940995 +983028929 4261669846 +154333993 219761294 +1810513334 2545886599 +3729706619 3666814996 1397977962 +2924122111 4197617066 +1555880089 2521364695 +2681755179 173327980 2886436894 3431966132 22329395 3698657085 1264449613 +3928930570 2978826925 +2906953809 335267728 +732148401 2611916685 1946407529 2969465908 2611916701 402935771 2880358621 1672629434 3331381214 +3522204945 2394597840 +727425663 2449746568 +3568775689 3848520760 906202556 2931845463 +440076762 2240012901 +1373914962 1012680211 +282188933 4284360026 +32992480 3811353215 763932749 1627666399 2867460140 833823798 2808989276 2718918694 732237744 1008876990 3996376614 4063682372 +3545543548 710315047 +2297486087 940894013 1377757181 2304353562 3243267571 2990090816 2321131168 +4086593090 3031837173 +2241916779 3344491892 2241916795 3344491874 +2120241637 1548924355 +3471021300 1246180846 +2594423923 3801268371 +1471723887 3942706348 +3168196617 1067441659 3760515705 3840930824 1042086776 3760515694 916443064 1328944686 916443044 2113882911 +3311977940 790152192 +3833182647 1356618274 1826743189 +802891379 1931188215 3103616458 802891363 +2711025964 2969773632 2359967809 +2089601348 553653252 3576754223 1436603935 +2353721463 1358465862 +3868787476 1769970040 3907912333 3991946296 383768687 +1108049708 2766689980 +3295476575 2285654479 +3203476219 3663479743 +3212766180 3024184271 +2171551949 2401436338 +4017092925 709188354 +3378451356 2628509319 +863319928 2038845947 +3102110546 1707789362 +1894058171 1938603634 +1475387378 1640745445 +3144363761 439820161 4019912040 1624278647 439820182 4206552422 +516157088 516157104 +454838116 515217070 +3168848618 1071607387 +1773798107 2891009253 +1281646169 416486956 +2636230358 3396868256 2582447687 +760428807 2706891820 3076370963 1989999705 3076370948 1627571712 +1162972271 1291151547 +3190092897 3039605942 +2059388455 1659170678 241488932 2530718905 +2306433123 2961029959 3440557020 +1292719397 408258122 +1090757122 1522010403 3963230862 536035131 4072038941 4072038922 +926669647 1111113038 +441073783 3655564112 +2699069651 1988617175 +3904066795 1136905762 +3924250968 2401570189 +4074183879 262294848 +2213735370 1968101080 +3125611079 4036823577 3121415492 2387029462 +2451340195 4280744477 +1768427778 1768427794 +3195143419 3363690290 +3726393595 591270542 2976475374 139059675 4283028399 2709146418 122282053 1468287400 +848872321 662422550 +1059677648 1043023459 +1779251861 4115552188 +3434306955 3378266562 +1345361227 2272986388 +3356572017 3356572001 +1862949696 3057382683 +2945683209 1850354488 +162871129 2705727774 2705727752 +2580647402 2580647418 +4275833708 2579378427 +516270288 459505791 2347244690 +449085574 250504855 2841006817 +809994940 3164562929 +1818886062 2937533938 3551449657 +1423593960 4049874964 +3986700637 3986700621 +3147564273 1201391462 +295970860 2088683462 1129946456 4122880105 1252993395 +2445873916 2072568487 +1163092237 3599562853 792840050 +3225405716 3341089919 +1311902071 2734067683 +1761643904 3752121348 3751248895 +658610186 3594672059 +752468775 2006948147 3251517024 1046205369 2006948132 +1299217749 4068991469 +3812280105 3713482392 3227973325 302690029 181730149 139954523 3733423512 876198271 3713482382 +3947208857 2823409001 4154183902 2100252283 2685451599 2823409022 4154183880 +3777823219 1826230682 +724345238 2323370162 +1050362660 63517308 2205099907 2188322301 2993336745 1908046128 2264247576 +3942148286 3942148270 +2160256883 2401482182 +974685926 1520196609 +3087581320 3819570420 +1281315704 4278775932 +748509131 485868783 112276628 +1514083522 2917863879 3124971617 +1146304512 926044890 +1264590684 72441287 +2788564789 2788564773 +3309957784 1297406382 +490285219 4279285691 +3657309630 3909669385 +1634043245 2282988498 +233285945 481256638 +4174429015 4174428999 +2779595203 4260162471 +1631493016 2911825997 +3453515104 1807795763 +3189273480 3189273496 +2951228883 3733700141 +226266341 3551082491 538037370 538037356 4010072336 +3608493977 2083455624 +2917790262 4249373457 +2637465869 2637465885 +3758417575 3392940196 3402742329 1320622326 +3434547375 4079135598 +1567265214 3385011996 +193203276 2158432028 +2448830058 814420173 +495897689 3029750539 4272308009 3771445278 +2851146223 2851146239 +1088094288 3784920824 1931089522 +2101135802 2189778069 1994840086 3769733085 +2219883961 68856382 +1579340129 2446302112 +3818237527 2611049190 +3556244032 3671773502 4015977157 2541235227 1786288703 +2286704137 1954886943 +1971447278 3061217931 3927943417 +749018880 1132445388 1206897925 +484601587 3030733920 +2991235356 412837831 +1058363215 2644013400 +4239746183 1485652096 +771401935 815250904 +3227994027 2375406114 +3523190658 392698293 +435520408 689513018 1971202139 +2463171098 1392409654 +1685318464 2863862039 263728447 +1543075822 3082275759 +3603226651 854379140 +3714362035 947435468 +2906937858 2700204555 +841726726 14117473 +2038077220 3264684303 +3101735140 3988983529 +2963152786 2599138003 +1693981527 1234373104 +3750327830 1658055829 +26885293 251463005 251462977 +1965674200 1965674184 +2766839479 1479661289 +3591729889 1237288669 +373619692 4204303496 +1936540508 1541038284 2510451728 2510451719 285280721 +1911124588 3481547958 2809163287 +530773382 1401455102 +3463344525 2229059812 +2325099519 3126865111 +206113986 1672778804 +563833666 698996981 +2770292349 1833471700 +661621829 786275625 +1209378371 2527021185 +953610464 3853751212 3853751227 3938153944 1516056741 +979008706 3156242638 +148452101 1114654506 +3036751196 1288556497 +3127008707 3910358354 2299812121 4203168244 676790842 1176061933 2625994877 1990287933 +2902008427 439828377 +115366065 2217451184 +3730011631 1386820102 +1092359940 3599060380 3867502300 2201500501 1205939843 +1217915590 220632503 +107355815 3116515552 +2813038458 1829952779 +3767089578 570803853 +1744292277 2049534227 1611827196 657192282 +3220253835 3014205140 +634674637 1515170226 +1011495644 560181137 +4261771379 3398119110 +1224942039 500146505 +156389032 1418842731 +2002958547 3278435386 +2211861611 4117161076 3304694415 +3468994046 2106674911 +670569923 1998772652 +23652220 3022284839 +1864659208 4267569053 +2084284118 1743233777 +3629094607 1414162382 +3235670471 3235670487 +1335309734 3741989360 3053643167 3590990788 +1725353922 2787708533 +1103486854 4005204422 1103486870 +3586504350 608074409 +550492602 705651502 +2785651627 1914498008 +3759384706 2070028146 +457919993 457919977 4035690238 +1504580478 4173558754 2869473097 2645299849 +2882733408 1507654701 2749430468 +819535636 3037020776 +2552670162 2305638014 +3995420560 1220018664 +3156176711 1820077257 +2903706316 1787601120 +3348317059 3047932925 1242749210 +85244282 2040527627 +2650666388 348079132 1437428414 2575084122 1254725615 +141832233 2011680910 +1769823495 391737865 +1042778746 3885873116 +2623521009 203094858 +1250765467 4147778066 +1039312318 1123740182 +3250364540 2012259111 +2660317144 2660317128 +485684669 1333319828 +3504230184 808947540 1589908544 3504230200 808947523 +173228413 4116014708 +2301481772 522415703 +1790328687 1810226104 +1983321915 1567976690 +3177319345 3506608625 3529009062 3674084644 1877187269 3341494870 1711109197 +3248740674 384762613 +1866283287 2759809155 +1131490970 3308018813 +183991063 1925586790 2828384302 4274266350 371732729 2686551625 2309323874 893228194 2715829013 +439525759 2378481601 4156078890 567190285 +4018247785 1912794456 +3151853455 3169724379 +149150189 405359698 3954184196 555802331 +3975422135 3142549520 +102385458 3517595323 +609943813 1078106828 +3804362189 3902094100 +1385438948 3811352831 +205344156 205344140 +1514582016 491196435 +1794387610 4167392381 +2434931442 1789946597 +1022345996 2556610068 +2458028501 1374032499 +3133307483 529216539 777061673 3251212830 +569921624 1463799250 4141016487 +2005378317 2005378333 +2710599091 677014733 157894860 +1326149733 3556896492 +2567170210 236940059 1246101294 2200385301 1575170210 2042337725 1856343829 426814318 +2861721634 2793008533 +1300083758 1300083774 +1905522191 113846619 1623353750 248067569 264845191 3672922510 974195276 +612821278 2657155625 +2358925779 704341818 +3562885325 3562885341 +1298350795 2655135106 +4182030371 2721462544 +611655653 2500925208 1231107451 1231107436 +2403818628 290890719 +2879211445 2879211429 +2712724504 349063527 622411732 1224907238 1858357697 985627311 723077419 2708935117 98710760 1875135319 723077436 +3581539896 4023170245 +3874369391 4160007086 +2712524497 1437149968 +1330962760 2981283345 +3729197604 232060607 +2687918623 3763864822 +1915257316 239864535 +3370315578 2000590941 +3191329923 4108552746 +722365482 4055123469 +2474003839 2721840894 +2609769965 3684965642 882009556 4110484609 +758582736 4255825507 +508862108 2834289855 847475748 +3467716437 3051416284 +1571506092 2548667046 +340914864 1988278556 2882103047 4023275337 1820502339 3620612483 617988976 63531054 2902526741 4040052975 1820502356 +2053816229 1527492794 +469075643 3196262514 4147226033 2117196698 +1254891535 3231422590 +3334237927 3248657846 +1252168591 216943128 +4233187645 1896014612 +357648228 2174038332 +1722689534 2720593097 +74983910 4012504343 +3016525434 2230825501 +3024999151 3024999167 +2377019200 1031445496 +3874125154 3843475797 +3666086755 2791910760 1499192903 1806827698 1166104413 1499192912 873276795 +1222135974 1384576321 +1987108359 522739475 2058192128 +1091173511 4116757384 3921184896 1837031812 2900017881 3921184918 +2994321980 832580711 +2610583653 54022288 +3444695548 870760369 +129397005 825489262 +1471377819 1693678408 +1426041062 3027690007 774236710 +974685932 1620862337 +3652899303 1047930340 +1823735853 1281115844 +2786972663 2012523984 +1254309646 3210494735 +2744127441 1288234502 +469785418 1854918333 469785434 +3855933588 1837015039 +1775157984 1887225529 +4266776648 2732030283 +2306305429 4227957130 +2182831267 1947391114 +3918349394 281872178 +2097454430 742636265 +4069646751 1419328842 +917769893 3530761980 3575552989 917769909 +852590313 1161436248 +76985808 3827994537 +677737225 696286574 +1296664432 448804181 1905521884 +1366296525 6047652 +1284220998 2902812807 +2496067136 1766953768 +3040929044 1764269679 +3730758781 3846925890 +1308486250 817366221 +41301046 370422033 +2846003760 1454955933 570744372 +356122407 2223073209 464532772 2437720672 464532787 +3124088005 3593524970 +1994053556 3464597583 +384566125 712059978 +2495613364 3729737295 +1881528281 1687341704 +3686270840 1521730029 +267731296 3520892612 880777261 +727514414 1902284655 +2529995073 1578920550 +1248670059 3559670108 +3975823469 2062773124 +384054713 44444812 178665790 3259011647 3259011624 +144771026 1736396677 +2296749278 1601565055 +251638944 251638960 +577963515 1123882664 +3077191231 3146760608 +1713952662 1749770543 +1406477788 3565853009 +1292342008 720126763 789938052 1292341992 +679137258 2051589715 +1024311526 44476929 +1122495334 3105329537 +3612272449 1628690534 +14228451 3472272995 +845556579 3117829340 +1607499377 1856486166 +1864162494 1389431914 3605651768 1116018573 +1233126978 4136229347 +773676997 2189005145 +633947133 736108939 2027292500 2062380258 +1314567428 185667954 3893316027 +2274539482 1280575500 +2726413411 3163995984 +3738072691 839153420 +449085581 3944424590 3862138811 2314593266 +3751694623 1306407719 3150612065 +2056256760 2928472903 +1626691188 2675573012 2444998879 +1250582273 1795782182 +3650027648 1743010907 +3965758404 2322788228 3761137055 +240750934 2881990232 +3461282193 1196606976 3178593078 3178593057 3461282177 +2581604029 4175231883 +372791343 372791359 +1184711778 2341643861 +755393339 3505326784 +2602317779 3587405888 +4157158382 1159839854 4290559919 +3524844431 1862276892 +2564340164 2180224185 1265835816 +3747720683 2445592802 +3653796621 3819326834 3503024741 +3568139045 3568139061 +358502565 1215886252 +2314576333 4205688228 +3305828289 4046941376 +3356151792 3641005781 +2195944295 1930341152 +1731965056 1460728444 +2639225483 788013250 +1045820821 3417170867 2356458554 +3900054802 3900054786 +399824714 3457083771 +1560445419 1441957108 +3211955569 3528763630 +2330465748 2136628409 +339833985 1678403350 +272044249 1062164393 +3389334507 4044851938 +4000807899 1092090322 +2448093363 1742268876 +3393345141 3681425962 +575245012 2650465801 +2675343364 193693257 +3123066901 522864906 +3551213276 1756577160 +3050399308 1463708956 2225342881 2434839366 1866147959 +1707714060 1215325409 +350538602 866415836 935497593 3346857262 4240291157 3514633449 4223513551 3514633470 3095479134 +666640490 4126297510 +1787073397 599007548 +4182189539 2217643955 1076408370 3498534907 1308664906 2201066205 654490832 +1080798895 411303278 +1708545685 3848948892 +1026616967 1489778279 +475306563 3694057340 +455643620 1911716312 455643636 +342372505 3104080094 3104080072 937487695 538369406 +3778710066 2952135048 +593457139 593457123 +4147114941 3715936907 +4016626708 4128404345 +1757511140 3432590825 +1552585535 3978677310 +3697646467 3340562621 +293293153 3860413600 +4179616462 4214360655 +3402349697 3687117332 +1376093736 2624072910 1186083069 +3598631818 2950377997 +3964492681 2261194926 1923768655 +2114628380 3458869000 1040385548 1126400455 3090626849 +76847675 1894697700 +3581161987 149600938 +1256187727 1548132687 +1489301411 844881671 +3576390235 3997947204 +2598799986 1256976755 +2914056845 1930948068 +204713646 2124950365 +3648155542 2976315050 +1350221838 3208402457 +4027314155 157299527 +2754008476 4126804040 +3654643540 1056850233 +224693276 826839047 +2927981932 3057616544 1548884577 +171676072 3284552573 +895071389 2570539828 +1078380369 2154546320 +2515054460 2035040305 +1965992185 1903427582 +1241300838 3739307393 +820554849 764634979 2676372866 +1287268853 3188722876 +2132149592 2118942703 +981453410 2301342053 981453426 +2454255274 2454255290 +1639740844 2276277719 +627045196 798325930 +4235072474 3866296484 2203060721 2135950242 2986190311 994656299 +3348359043 563774643 +1769832734 2403223849 +1249103329 357374240 +3574879246 3447791457 2097172998 +3243480786 680946821 +1711986138 2098112043 152016309 +1000366843 1556469317 +421864461 2725757028 +465351295 688717288 +2985503904 4265710956 3251584997 +1039661788 2078086493 1767893073 1767893063 838514147 1767893072 +799091742 414741289 +1158903734 3741497354 +3804322221 2740988754 +3127462459 2931809010 1054037509 4228224232 +4077568623 149951662 +1305421375 1135521276 3155768638 3790726145 +3098157308 2949770407 +4250473485 2950514235 +913904183 913904167 +500767246 180618255 500767262 +1326701981 3942428546 870712171 424009268 +79363678 3495849449 +3776152419 3031946442 +1735715952 1292907587 +4002797727 174980526 +2595123107 597278108 +1078846563 2644412362 +2844843285 2398402775 +149509547 3940394447 3940394446 2297168729 2991709236 +1463091950 817420409 +2318591501 2602575474 +854282769 854282753 +1048659461 2268907033 +3839623642 1614731662 542566973 +1709780814 3155523545 +1282101692 3458892348 +1943805582 3254008857 +1057523957 795843004 +991463551 3558505003 991463535 +2607799751 1361102034 2014978112 1361102020 1152614553 +1772321434 2884469335 +1066264445 159349876 +2758413850 682715598 3393374794 3975426813 2293808291 1178140726 1312361676 4016842741 1161363088 +1527792532 4003095023 +2403179378 1010635021 +183468484 4211689353 +588791465 3895108632 +1622183112 4260208331 +1578716322 3285426947 +3765043059 3136667446 +3010709313 3225594688 +939303697 867480528 +2112894865 3525802310 +722049324 3961266241 +370995334 1070573206 +2489770450 3530862189 +3045257206 3005202513 +286970996 555841521 +667262794 3507437257 264566270 3507437278 803354869 +2160323586 3060565813 +2914830265 959342632 +368641544 2667871883 +9968295 2524050684 +3718862346 4220678573 +3133371528 2310042141 +1941303973 3429693882 +1966575852 3048399873 +1581626994 3653121395 963519501 963519514 796944222 +742454364 3225903832 104901841 2488377957 1720612932 2354157007 2899317571 520867382 2505155579 3058127624 3058127647 176497714 +899794500 1426928388 +1483357463 1178479398 +378373982 3737917695 +3487709322 3407806765 +2680075466 2058544582 +965271838 2960810537 +1970806879 3943873242 +360973582 3769288335 +2034619156 4243277935 2674071167 3186779124 +2171526721 2835854883 +333594797 620294404 +2681160272 17605032 +1939104769 2068407651 4086918550 2272900747 894665859 277316400 +3210009794 1837562589 +1623695385 1933641566 +242986579 2462067545 2272526307 +1763362382 3274058969 +364161479 4066853974 +535053294 576122809 3185266798 576122799 +3381184608 2723376933 +4060119566 80526361 2544651162 1580925821 +913681778 759171685 +2616034230 3092052437 +3725202400 4045788438 3378332063 +2599161736 1771860747 +1158283980 2059560759 +44076661 2545959484 +2619035927 1985043637 +1604783882 2650582203 +3301083679 3711921886 +3651100071 1021341174 +2031838986 3205601421 +119027073 3480117731 +2028620133 3184626156 1486676387 3403429002 +3112238032 3112238016 +1425795416 3493244147 +1971202125 1349487712 +3093699078 2727752676 1320875873 4018937814 1733529671 2744530298 1733529681 +1988193719 1153414918 +1383569406 1383569390 +1541976034 3945469878 2105480293 3465894491 2890451352 2739452786 2437734595 +1925883793 1174784326 +609344864 1444691800 +2365306546 3648993416 +2581620621 3531453913 +3065314222 8924729 +1671820072 3493974868 +2970365707 2970365723 +514584738 589643810 +1115872779 3204680514 110384440 764154869 +1673099981 3866337403 +1618336058 327480925 +3812760354 4132393002 +666606736 1387257596 475494069 +858464259 1056412656 +3350724813 3350724829 +1756963399 577828288 +1471796882 314322728 2789096427 +2862497157 471521356 +239622346 4237337558 1722932952 +2453164746 1864512563 +3489947965 865922101 +1359932204 3062458432 3330029121 +1911588474 3617829405 +2574786529 2031759136 +3048281084 29521329 +2467745003 4047011790 +3890261454 123509074 +2124442591 2881363036 381951957 3835602661 1028681864 2881363019 1011904242 +1380885160 3953382928 +399663318 1286759530 +365737957 3915679498 +2755900033 395444480 +3301054712 3658575354 +1796710545 657572944 +1924909207 882689456 2194355203 +3665479852 2605311681 +1988401562 3653918562 750636395 +2821592756 3558937352 1955446105 +2012431928 200772145 +3729310752 210550387 +1934785011 2111175052 +580427307 554572980 3174510415 554572962 1901382859 2705391010 +396515726 3697307417 +1120599975 1120599991 3882248627 +2679438233 1901338750 +1708765304 1708765288 +2542915219 763900268 +321936700 3931748824 2327630064 636444860 321936684 3931748804 2327630055 +4081964889 1078890640 +193393451 1435647832 +3490015230 1370897617 +1654850234 10308317 +1844211869 2294541003 +3514604216 3427211888 +2571427634 2037078949 +787277873 267486502 1060412097 6870033 3688467511 3003180342 1060412118 +2449875808 1068085285 +2356491988 4035268527 +831741727 383460695 3825517002 2980333183 3179090157 3825517020 +2398492714 929565197 +2265334304 2790549228 2265334320 1448294472 2790549243 +3054980989 4234883720 +202727707 547872146 +4125213478 946222273 3201452986 +2100341235 1129785140 +3638061471 3758407969 +3994659607 3994659591 +3191901155 2323655356 1369146141 613700597 +3858890175 3559027646 +3840559277 164653124 +808870603 2963113346 +1403241324 1386176621 +1798362968 367198107 +2333678025 564366221 +641874486 3193152513 +2164947799 2055219686 +3814180231 3813420166 1675323492 1574657815 152820749 3947349536 1675323507 1761246845 3930571930 +1772949702 561080225 +2754344477 2385801122 2123086868 +283389022 4113684457 +1941528301 2820588754 +2197602023 450921910 +132263204 2634885327 +1938829394 1039929619 +3034014083 839811370 +544455578 2592653825 +4273582790 1290961623 3293867446 3293867425 +827421494 4206626049 +4054930427 1965503524 +861895515 1482630449 3054312037 245955359 2634724476 978268242 245955336 +61734524 61734508 +4229961630 2582308286 1554449343 3184331074 2223320489 1554449321 +3725677388 1113939319 +2521717842 60237096 4165251417 3955687374 +2546603233 3558792758 +1589246145 3754072022 +4218724466 1251513189 +3478714272 633329772 151900389 +3065923201 654450087 780729622 2868404227 +3193201889 4000987172 +1860459501 2390544212 1860459517 +4216325760 788157603 4216325776 1223406156 +1960068909 1280744338 3429709761 +218729935 1426734296 +2777100737 1423135424 +881409191 830434980 +2007030088 715896560 2587233355 +3615367644 1737930375 +801228935 3037637782 +3309622100 3747130681 +1490712806 2852469297 +3908268088 3301162693 +2887617522 216458002 2914235789 3104076766 +2454542509 2133406849 2982866972 1710101972 +2585722222 214496303 285916526 +3696913314 3696913330 +4106591591 3122055456 +4204817535 160091112 +933135855 582111170 3702967596 4189781137 +3713898495 2035697249 +2704698181 1814615148 +3751980429 1522646715 +3449347679 97888169 +799327129 3342916230 +1399231706 1291235513 +1896287234 413195274 3578361769 +707088827 331327844 +1492723446 1492723430 296632022 +888306311 3770081942 +552112947 3687075752 +3835764751 75187276 3020063729 4171593614 +3376451427 866236618 +3621151622 2846773474 +470765922 7555047 +57628985 2762131208 876564875 +1595582187 2163011543 3467550939 1871110556 3897587983 3180355170 3897587982 291189355 2717172724 3528178380 3897587992 3299774745 1756925333 +1630898402 3913710531 +1134580692 4294582426 1621148051 2663065728 2626819437 2763731479 3306182764 2643597043 2763731456 +3517252828 1538778212 +2164056456 2518092061 +3048750883 873161756 +2041762024 4025607660 +1150119476 514096079 +3335155085 3705537779 2108323044 2108323059 205026208 +1130259335 66222013 1832068800 +1743141074 2751583835 +567854410 2453574523 +616794449 1598419169 +3274660814 4039695193 +3580888611 1488247516 +4064162457 4041844424 +2766389387 1430405643 +2385763854 3920007193 +1308074634 1188355885 +4241710046 3736706665 478857218 489980393 +3339810221 3122450528 +1375118408 637778275 +2935319934 2935319918 +2274304181 3920929882 +3088299812 3943255487 +1995799021 3819170898 +352762588 4120389713 +2780741908 3958829959 2305346204 1103775480 1003109738 4283036271 2304683482 1365812809 +3879904056 1172762925 +1651221760 4017405715 +500352645 2010022746 4095264445 +914527180 2609818167 +3314264738 2631769365 +3886333430 2315595201 +1022884165 1063085964 +1802811995 176921896 2134892217 +4229857839 723166439 +3124377674 2319996325 +2832254629 1705555372 +3575001864 2045924747 +2274663011 3522103772 +3683082535 3172855904 +3558916641 277977568 +597549807 609485544 965884817 281406431 348516908 1638382277 9190958 +1246507832 1246507816 +1407162589 2864874717 3858605044 +3907408541 1066667316 +2266274371 3899578218 +4186896664 4094828749 +3630917069 2682550651 2115060146 657091378 +3192631150 4280625721 +486402633 2472404654 3971469560 3769918431 3971469550 2472404665 +399042908 3444005831 +1573294181 76893932 +4011303615 1414212451 1652612254 2786605476 1067044390 3874070821 1316295550 3702883967 3773792056 2505482949 458556429 +3864015642 2856350178 +2731254643 760274144 +3244612417 3244612433 +3651004967 3130497910 +1801832398 3063097167 +1716199955 189172394 +1720350347 4143488212 +3109002337 424881312 +920699109 2951749656 +1775679861 2304625434 +797057767 198205171 2967269792 198205156 +2319344335 1865780174 1917700798 +492307190 3287630794 +520270646 520270630 +3388883250 4022242509 +4158262167 3275767462 +3221333565 2140713474 +3158558886 4239901575 1078883458 +873595157 185625517 223851530 +1753871083 1831775083 +2472580631 66070762 +2432633108 1241586008 3052877300 169229417 1434143343 169229439 +272724970 2164881746 +4036611715 226895463 +38054889 2065342424 +2357817811 1919571073 +490985361 3070582619 369198587 896520344 2377156896 753393011 +3984692529 335404080 +3796847813 131455514 +3762073221 4195937980 3577078275 +2078057757 2422837544 +2441735856 1873989131 +1422033769 3610566226 2284767062 +4168901541 1993047830 +1419346627 4037597418 +2281590565 1395446071 978753324 +2484880283 2908987182 +1007340731 1073760868 +403112829 1342864834 +3544227624 3065678827 +4125621855 2067099550 +3173121414 3173121430 +4068333654 136287026 4016228921 303796078 +3601023047 704524246 +1962071077 2400650588 1091372000 3500903380 3668397833 +3897364280 181512170 +1096837892 2526655934 +1193334506 968336722 +2440008503 509185955 2197636333 698662800 +3276665739 4273365954 +3231530226 1382895258 +1042561531 672888543 +2895251099 1900058719 1155556868 +1729336813 819266578 +1698789618 2522999451 3585451083 37871944 1477534963 2522999450 54649566 2522999437 +1857486016 3394348494 +2115225445 3726828538 +3727825670 3470822007 578419014 3470821985 1091403898 578419025 +1680803375 2174347130 +685919826 2923514629 2923514643 +1418399383 2779518915 +815404208 2876138525 +1884008701 3921527913 +995997746 3701234650 3701234637 3510774430 2793993907 +3991889038 500910991 +2146794358 3849411281 +3280633074 373067418 3305287923 +639033854 4094018271 3825576377 68273438 639033838 +3018342494 2493338623 +3728169015 136306310 1512791203 136306320 +1362146216 3739731907 +3325973364 2283626393 +3730993853 260643252 +649846592 414870114 +1562152165 2029112442 +419748773 1570341316 46118452 1976824581 +1164571204 2311610655 +1050692600 2388105083 +3764530169 864762110 +32808962 678331534 +1107760584 1373192343 +3413130407 4009234628 1481130533 742289074 3512089757 3704896954 3903814390 342223929 432100625 742289060 4090782202 +3239871204 2715438204 3823242473 3823242495 +3684684272 626234760 +3036704321 816681024 +3637556162 1439763418 +2810763489 418652103 155071238 +128226793 1388610802 +574096314 1530144387 +242583753 3383168356 3589936255 +1982238440 1982238456 +2080291451 3264735517 3787815694 4199489343 713949049 2902429604 +3712712326 3822595297 588261114 2756626641 +2641160327 1500646550 +1846879058 1846879042 +3069379510 3062814599 +3711306806 1913993489 +473827634 473827618 +2468868066 2313068739 +752804782 1011372029 1078482478 1356884719 +3270882195 284440230 1249950208 +2294234360 1024260731 +3851496025 3162876424 +4074098105 4053489071 +1145304817 443623318 1825110533 +3731754862 643483630 643483631 2504149551 2479559474 643483641 +3111884345 915241896 +2906671074 2654021845 2906671090 +1915679481 335435464 +2126484808 3482845277 +320179922 320179906 +349405599 1744112990 2489108769 +1118071767 734738014 4256528653 3218457446 +1847563964 398084600 +3284637194 1026634157 +3484943885 196183666 +2677692641 43294663 553249312 527151878 +1464031271 2248394102 +516185498 120068399 +1724122503 3413935258 +3908275949 2758409988 +4218171885 3092420627 +1500653797 3015073914 +3199893455 3199893471 +1875226675 657743948 +1202088033 3871410234 +2999130327 10998467 2153505776 +1113627906 3807950025 3547817982 +858062719 3364159877 +90931931 1360722927 4230678604 939114149 939114162 533123122 2521099259 4292182420 +3795264106 2261462221 +143092079 3493418485 +2444153051 2702419685 +4014384691 1411280685 2747388554 +1152785658 1092323723 +1173537618 290139117 +3227635792 704310773 +1209233688 2392525019 +625637637 1950481725 3107750618 +3017601668 2335857528 +4094218725 1728077603 3992511712 3367152653 249719660 3782157850 3899601162 249719667 +2293841329 3969654192 +2846111961 2183446441 3552319503 2183446462 2116335970 3867508126 +1856740571 1791112258 +2447509314 2376955828 +3101714853 2923843244 +2115305021 3175043381 3087809026 2819367108 2115305005 +501664364 3432757451 +3319124292 3254073400 3254073391 3657264132 3013111305 +1739132341 155769165 3827340266 +3494119268 1058513513 +634672113 2118132838 +1379494544 6471861 +4044392074 3945398688 1892978993 1106831254 +4185346450 2062812205 +230976537 3308661598 +2113690461 3130182172 +2174735810 3499982965 +4126457648 1615394947 +1781143216 3493967619 +2995651675 1888541522 2013867039 1888541508 +2267625557 451128778 +2790886707 301549388 +3597965018 208256675 +1988413569 2651175856 +1237582609 1237582593 +456139962 4206079874 2261373131 +1191333017 1637782728 +4234780884 776482223 +85426482 85426466 +1829092127 3204813256 +211130979 847382986 +2528606112 2107805730 3805368563 3477731051 551049054 +175772459 2838244532 +3598808261 1925894682 +1066723275 3798525058 +501232365 4109380356 +2133840398 533512772 +475067062 1231950993 +66034670 555379997 +999121762 563311445 +1321629907 3580900410 +3596563522 3118416885 +2623217514 2251055570 2373088219 +1314491828 2695553567 +3261058182 3738091653 +1880879909 2896188508 +2345838025 3774467640 +2882622057 2591912936 +1948956790 1430282705 1059136963 2726949866 +2713839449 4248776968 +235190760 4184909867 +4163058035 2919069122 2193163789 280582086 3429134586 +3427971596 3851869788 1608301088 1608301111 +2527536665 1109457224 +2600237002 3312489211 +3351169263 1616269358 +2418887460 1337785130 +1147913706 332055643 +2226214784 3443091128 +1409625158 2317660705 +1290048871 1290048887 +2246811688 4193066731 +3935156567 2484782054 +1256251464 424309443 491963376 +2514828107 3401509367 +130970569 318784888 +1002043883 4039404788 +916740321 3854035488 +3583885980 3677152311 3814284167 +2429629633 3126201311 231082465 +3320502336 3501354195 +3376878494 2052974823 2590835464 2171395004 +3641811850 1086616109 +1297929121 1780557408 +475721692 2085827719 +916740331 4021811682 1774690506 2088815041 +1630864624 4134979029 +2558131370 2986917787 +2453333972 2411837492 +3914862004 3188158676 2081251848 2081251871 +2994732141 1819959186 +151797119 3679565610 +3099094238 2824036713 +3004845753 2875845950 +1431145425 437459462 +2963850604 1931898007 2133229428 +661988496 2909310645 2962794219 2962794236 +1787101219 3808441860 3145672785 +779431833 3145330120 +714409025 1627078648 +1743401113 2949281575 1349048098 +3311935014 3907483095 +2075636997 3341940428 +2993392428 164038720 189535809 +3178931682 1443749166 +417191672 2554100938 +3905769081 4096952446 +2131130635 813399691 +4172286423 3717363523 1411349872 +121522511 1281710919 +2650430475 3131571701 +4115864717 1556865010 +1219606533 1959047116 +2027918369 831357008 +642774375 321398271 +2559390814 2219405311 2219405289 +3053752790 3255555255 +3174632957 1913341685 3721463106 1913341666 +3263526804 3424337391 +1135137424 992388200 314800291 +4153522459 3580257682 +2790224041 2014206488 +1637246129 2111625834 +3745387301 3745387317 +3047361791 4004345192 +1074950670 3943271439 +2868611746 3422240003 +398955573 2754498428 +2637836174 2795710187 +104969019 379915375 +718166174 164432294 2737199882 605981408 253523878 13992118 102342289 3052385177 331755585 3454688398 4135234849 559189633 559189655 +3897052541 3733934709 651295682 +2635496421 2635496437 +2342726640 3252562627 +1016157597 880571497 +4157831408 71238219 +2267622646 4064064726 +911714485 1090426108 +2178250589 3005890388 +3695737664 982637887 +3386602063 1855385743 +3091751298 2616295331 +361440283 1920774600 +3689981145 2959320772 349405598 349405576 +2146834873 694844968 +3107596652 2787047292 2693327443 1555067196 2417939648 141586583 42939671 +1638600240 4031206787 +264820488 3777659293 317327907 793792048 +129315899 306056385 312157911 2913765548 +1711232941 3722272786 +1556095026 1556095010 +748670849 1047632560 +2091668527 54166297 +1468245062 171678241 +3965117454 449380879 +277494162 285172821 +2450492746 1699361445 +1664534775 69999476 1344935964 3482122153 641621190 +3249708946 2054357549 +1291707130 1900099522 766267275 2292252118 +1774699873 2512458295 +4270508325 4270508341 +86361028 3732090249 +3349178890 1267133869 +1980045054 3355652553 +3946293264 1486721340 1486721315 +503158844 503158828 +2138759158 2758709319 +724724819 1398834860 +3281863053 2564230373 2106470642 +4057879982 2908887097 +3167203622 1415306967 +1954424493 4286552859 +981535458 4213449155 +2846400425 3396397317 +1666997365 3604719130 +3221464587 1874222382 +953448292 2558555614 +1629825636 1367456617 +1743023373 2576853860 +997682143 975273099 +2002170705 779896976 +3903569040 887843580 +1533142657 3713843740 1533142673 +568691293 3109605492 +3103990071 1995262342 +490107776 2092421779 +4206265013 1649394428 +1846018316 3680693272 1958324699 +3805869338 898226173 +2823782831 2754160248 +3284822209 3432035382 4171425728 3137529447 1047721446 +4014777626 3344042207 +2981839466 2981839482 +3157885260 3157885276 +3412681983 2184983170 +1694592628 1967186063 +4123958796 1244169761 +32882815 4022082300 3861399144 3727178194 3844621522 45075125 4022082283 +321809125 387073658 +2828093313 397136561 +3369733282 1840799165 +3516011637 1576416316 +1243672017 29757975 +1304890299 3212721261 +2836435653 1700954307 +2655547735 4288907115 +2855154053 1807217754 +3793216594 1033661715 +3315575648 2052769829 +3231530210 428267459 4064651242 4064651261 449124910 428267477 +3997938500 1697330207 +2880265700 2880265716 +2813340629 3478454346 +2164203916 2260301239 +4196091385 427450846 +3996353770 3843701851 55378770 +3092077397 3923226775 +2179164090 855394781 +1331405032 3577630013 +2046828853 336115490 +857636576 1493285555 3266892219 3657175000 +2888561728 1227981011 +1994935663 2662458798 +1566561636 4190496272 1585073341 1182410487 2424910698 4291161968 1116285731 1601850947 1596115772 4291161959 +421391983 4179515566 +447504866 838874885 +1326680104 2747225853 +1708873118 1912566185 +1106871077 1106871093 +339913222 1882750818 +2925607438 2925607454 +97290742 385691207 +501498067 3780250682 +2234970698 2901894874 2962530227 +450769877 550213724 +3626468028 36883943 +2743990929 3440975475 +2026318979 2026318995 +2965957566 172694537 +4175623901 1391755687 +3037585372 2102769846 +2948524877 4136397371 +3205545888 3205545904 +659453329 445126487 4149696310 1904415568 +3065346662 2324682663 +4273110734 507524687 2699996716 2304950138 507524686 838325330 507524697 3237846607 +1836010095 3797156934 +3441693000 935801931 +2751517397 38528348 +2045679177 3214448571 3967469925 3154932398 +4139897807 1109421774 +1982512007 2353345942 1787143091 135656506 +503536192 2135364293 +2796210094 215504633 +3105414298 1518854321 +2946834737 2985508912 +1532761596 2159688256 +385656715 3132866516 +3963137628 960133841 +849381342 1297321449 +260521262 2682605433 +3768985966 328415279 +741275914 2549222075 +3926874707 3382811427 +2300612775 2235807456 +3581161993 250266680 +2671361480 61878004 1877328349 +3538274609 3716342742 +823103809 823103825 +3706415718 3406776241 +465824231 2624140982 1183673849 3651206628 +2776338733 976572059 2386032005 2386032018 2927987154 +2821510103 1348408269 2509339504 +2901374962 788124133 +1168067503 12935839 +1967552817 3471886383 +178097588 1083105800 178097572 +4018247786 1929572045 +2976649732 1361075273 +1770403695 2512727925 643145976 +4075693135 3152226392 +3374795686 2071407335 1134070198 +3646127563 3646127579 231168751 +2043907592 3490223755 +636304950 593512449 +3092818215 1519536246 +1024807131 59656388 +4198813606 2689786433 +4189816404 1983149615 +791366416 1361521187 +1704841888 2540868083 +2745322052 3699042591 +3782132837 1180642028 +1705501876 3142387535 +1119950738 2818054867 +2654904046 177483961 +3703120122 479831490 1903094155 +4165316989 4146419316 +2773178572 27052343 +3565903444 3073372084 3385177000 3949297209 3385177023 +3522164112 213881269 +2064338922 2630798683 +1766491567 1867543160 +1894116121 3539015752 +3708586140 2528841095 +1607822882 4277952387 +1390964900 4249638543 +2466089361 3115223862 +9527022 3537399983 +1813742940 2337468359 +2324776024 2058262157 +2214089491 2689050801 1625694742 +4102394305 3200304881 +929765487 2895607470 +3328156043 3549121986 +43639574 230176933 +607571245 793050564 +3033302436 1106665791 +519060484 908753564 +764452411 2637105384 +1713314244 1644200198 +2272579566 1285443402 +502566564 1711396273 3422325801 3082604796 +3310469113 2561750270 +23012783 2137464733 3411872209 676975354 +3052280144 777554347 +1209971175 545344541 +3198181876 2460664568 +1185933488 3379189788 +3376207291 946011342 +3574561442 157158677 +2597618826 1183622445 +1400576600 3268049051 +1709780804 2987747359 +3839623632 4224497727 749679268 +2762630074 45151766 501057173 4063952349 +3809327423 1846539521 2912591422 1919351036 +3036850833 2217902672 1635980342 1635980321 1029873239 +40917880 396147717 817626060 396147731 2224974592 396147716 4221144680 1323302381 1774579833 +3615907472 668925456 3557421859 +1812216282 503421346 3836154411 +3021653119 4271707690 +1012171659 3067668285 +3546619255 3295790051 3811905625 1947761849 249938738 2568456666 +2987090870 4260231057 +3888590016 3666141837 +2413125660 2296794119 +284839229 3368021638 741709643 +1959392639 1491957502 +3402345591 1000893155 +173578859 3027965556 +3669428360 3592580619 +3096674264 337405811 +395979603 3532085184 +1000726304 102645605 +3231851066 2033967435 608413973 +1869242905 3801361129 +2312297251 3814421661 +3123525954 1622481466 3272487825 827981374 744093271 3891888465 3797273636 681495286 744093261 1622481452 1462837994 3687161054 1462838005 +1360619270 361768273 +2631158021 3878613708 +2196879331 193765063 +156096998 3348235046 +169239906 3359084655 3012913940 3511216091 3130357272 +4145087527 4145087543 +3642573712 1494309795 +4081900462 4153608189 +67606733 620071588 +1917900524 254846289 +4266157731 3470904208 +2389131205 4088909170 2066555605 3224937954 +3254056303 2857207980 +3824389337 2976299400 +1990943089 1087005926 +1244316332 1093642068 +303502957 3881323922 +3181354717 1598494178 +1388212440 432776205 +3410774958 783810094 3072008943 +13448300 2580297464 +2730902463 471385980 +1458634382 2554600463 1453214459 1458634398 +931448217 2493280469 +3831361694 3831361678 +1083456324 3982052383 +1091475944 1375488061 +3211115725 4266130611 438843059 640709856 438843044 +2317139532 437403767 +1547241816 696831219 +1187368243 2052160695 +7471511 1249411238 +718869947 784151922 +430625469 619298708 373633995 2650306978 +2516287647 3161811594 +3116363032 367376037 +1005369901 2192118980 +2084144072 1451914187 +2183234681 2619888396 3363120986 1163565505 1726433863 2815253503 1217437991 300134883 952685119 +1449700924 2531266322 +2614577612 535374881 +2802901649 2425662022 2425662032 +4175637220 4175637236 +1004910665 1352490578 +2980184267 1829191554 +1115793594 1408561528 +3569597797 561499527 5556380 5556362 2238569891 1428366828 +3458250957 1250093732 +400449651 2849137066 2383564547 +1113707225 2180396559 +397764605 2247110882 +1037962571 2945379604 +3454571401 3401961966 +509522411 3390189106 3732339727 509522427 +3023785586 4038039125 +898784882 3516829614 2233846909 1791230477 1609501709 3345657189 3429736286 +3628532287 3853511147 3066595624 +2314471565 3678710770 3845679035 3089724900 +1413508620 2909617377 +2313526860 557126522 +2368263107 438512509 4147105200 +2528606142 13729801 +1474579507 2405692492 106533815 +3614279516 2104235473 +174797111 2646505862 +160334391 2925064044 1112996998 3511156073 4277114548 +2378674803 3500222794 +3269968120 3402942061 +2319355419 2694260108 +1527584241 1784865891 1706717859 3720620519 1184467558 +2142894601 2142894617 +3282004272 736300188 736300171 +3326359637 3326359621 +3455978206 940391253 3056642888 1464745700 275348322 +3375515214 251691778 +2914648769 2501713905 1020417494 +3157446701 1895675588 +1546058041 3229594075 2362274207 +728621869 2331811780 +3386602079 594873224 594873246 +1866175143 3251100904 +2377019225 1654212872 3184889743 1431181886 +2883279485 1142007669 +1399715938 3088974403 +1393317417 2943408796 3653660224 296701723 26979887 325029587 3849036440 3060852121 4059662213 4059662226 3891886033 3849036430 2338485739 4273446416 3670437862 +508880168 2773947715 +57525038 632234538 +2584767900 967999884 +3327187031 2286194928 +4168738177 4078759632 +1935716250 2659935586 +876328692 973764120 1838270100 771817999 3353503704 2224442719 1184781613 98753757 2073444137 +3827971023 2882442993 +2537501964 612401655 +1913386767 2547379342 +1616727212 1591718615 +1614133217 1435531040 +3018831890 4141912320 1415496773 2114244358 991822824 1880414066 295390314 1563541822 674174201 4229857652 4003181917 607063725 +952851451 1663159332 +3961885651 2452075834 +3923089815 2990590118 +922875198 922875182 +2521717834 2796751717 3881519218 +1446074574 2108607577 +687962619 2287142450 +3418992303 2105408878 +1284480284 2538171963 539749388 2719240967 922665927 +3505490129 975768379 +3946988078 3287425470 3971689009 2270047865 3021098919 3021098918 3275459222 2270047855 517169729 1924518269 3021098928 3119649276 3287425454 +3282531074 3292374724 +2266168577 2266168593 +4186776903 1962345508 1664231757 1962345523 2562585562 2579363168 1292296253 +3567026318 1079926671 +226037280 974786750 346164415 +62915130 2823063829 +2527902112 1435396716 3521656549 +4028209901 221214034 +3198996166 2544869848 +3955232175 3955232191 +1337312378 3844354765 1337312362 +3383366882 2004500477 +4084783130 2076163069 +74985659 3291788914 +1351774583 3543717161 +1512083474 2892703494 +3653166947 3653166963 +2996791885 2113165092 +4055833577 193036622 +3855839163 2262360932 +2006547648 2984751771 +8479766 633203339 3786444455 4091719765 784201908 1225687896 2368666558 3786444465 +3125597091 3802431622 +2968521648 971138563 +3601602609 568988976 +3328644601 1263383075 2823012706 3231687440 3248465078 641999723 2823012725 +2218786806 650113095 +4271674449 3629625139 855168392 871946014 3305688410 3305688397 +3350724806 90354961 2338523600 +1942877253 3345746556 +3473594043 2352823227 +3675406854 4211079249 +2627951673 3458870696 +457233936 4145085237 +3894623177 947330407 1367561273 947330424 947330414 +617568127 1824219434 +2924733210 195651382 +1292086486 1037401690 +1447030436 1447030452 +2882893135 3490163544 +2319650354 2375310494 3650050227 799580634 799580621 +3381007091 2354961914 +1128776432 3656900547 +3164716641 1402909344 +1046674387 255974486 1521343345 255974487 2580942532 148008236 2391808045 +2044971332 630576671 +2889921970 3688761139 +3477985419 3800818370 +2626809193 1308667455 919629518 3803757656 +2244471899 2203669534 4105769810 2203669512 3818875689 1739142501 +605284866 3445186851 +43944348 646385634 +2064888781 29181665 +29535032 702607813 +2382902033 2817024966 +1555839817 218570670 +3509885100 30168791 +3935405307 1041520420 +2259338671 513700588 +1916888549 3522396348 1916888565 +2526968825 343746792 +1271302312 4052295805 +2240245911 3409329574 +3083870732 3083870748 +3954606542 3729676111 1146319182 +819677118 1386021065 +1477967021 2201177761 +1314908144 1358569155 +2133745899 3943416600 3045985173 553816546 +4083194986 2333489869 +895520997 3959691372 +3485711471 2294117393 +3595696859 1041098450 116380999 116381019 +2177127460 1813017791 +2101735695 1142586008 1886306033 3450797403 +3571275141 2641207372 +1760320765 595973903 3617813643 +4188921120 749934949 +1250634036 2366758095 +2846286827 4239969012 +912666936 3134121939 +2753365788 1974612241 +782967186 157669573 +1886168768 3138027603 +2930820982 1984560839 +2197600875 2425804531 2665051746 +647805513 647805529 +3549794186 2950508382 49106914 1051693602 2798886629 385912131 4285011871 2658203181 3932681880 2384671273 3994631174 +1149638227 840246444 +3887960768 372294589 +381975090 458466811 +2425433062 1676939396 1441087298 2055740183 4215448871 2557725546 37924899 1693717018 541802192 816068598 2055740161 4215448881 2968124534 672058385 +2392023294 833084446 1879158751 +3192649886 798515369 +2187217424 1248761653 +639138350 396365998 +2471882284 474345281 +41756935 32580115 +2082712201 4112872888 +1336515662 3053522639 1386893262 +1036303974 2729949825 +1804046806 2315960170 +4241480248 3366926533 +1459680010 8296621 +3909103022 2034755823 +1260115328 3167819909 +2154668261 2154668277 +3905953753 1487020680 +1952864067 2149277308 +4203759995 1613284927 2816901994 1613284904 1986623066 574217669 238665283 3961760932 2264835246 4223584173 2816902013 +3318244247 4050962086 +1445933575 3008086281 +2742853932 2301737025 +1152043265 433745024 +3496778284 1190572887 +2053192927 2053192911 +79184170 2551092493 +2767254722 1766935907 +3946830201 2529550686 +2824539084 3448703457 +2247115797 287827642 3996855580 2387487066 835085107 +810240086 1552080753 +4041441934 1249062290 +748050508 1745450656 3847645793 +1961313532 68262055 +1980646709 225899114 +1612645285 4124228780 +3297236673 2928743398 +3615952192 2791369060 1647638285 +1385083117 3818947858 1739684677 +2404455498 3013415207 3092986492 +1234909619 848297270 +350374996 876488751 +1231544819 2173219226 +1667163046 341859905 +3644832353 1616012982 +1947840824 2490263493 +495381303 2943990694 1876736663 +1607557328 2795202421 +2731046006 4230120935 +4251612962 2763328554 278497923 +3564369029 3948504067 +2316701698 2410774538 1656435491 +3225703772 127033287 +1472628471 1336740212 +3535085042 2770215909 +3759975215 4230052590 +758696623 726214368 +3031382109 2707282347 +4273850471 1807907360 +1245984071 3874203731 49009735 3105305346 811589312 1552161834 +3944589898 1773343341 +962718909 304590210 +489747154 1534044013 +3968190060 2584540796 +713591000 3438242843 +1147917587 3368054010 +2976165263 2437868199 1715168502 +1408134756 2220345215 +566296912 3027014930 +3767459675 3767459659 +3766249144 3766249128 +1932685701 3714626636 +350943955 3236485690 1708298353 3666834262 +308348340 2730228313 +1736256121 1720064606 +770355864 3765904717 +2989463337 2850747800 1290054437 2594217800 +2856580626 469987839 +1599367647 4041386504 1020373643 +760108695 4237521411 760108679 +1430519758 1430519774 +1275052991 1654728104 +569486351 2772217932 +2850991420 3199907185 +3997191344 457923595 +3476717763 4229477098 +2999768549 2562512138 +86712164 3211625304 2262985321 +564698976 2916951596 1551033381 +3284762133 1759817914 +1125418722 2068862421 +2925631153 2416716727 +891420274 377720165 +1835461521 3389314374 +936829229 340031940 +1962494852 3512377417 +234523046 3718748390 2313144666 2808524887 3718748401 +2703778431 831720958 +658623347 1066616346 +700814663 151649984 +4232798255 2665433231 3051345110 2692220530 215099625 41525435 3265547906 3936851637 +3809551041 888780246 +3873937493 3779066694 +1963027843 3024053546 +1345138234 1677957969 +2226320865 3334017334 +3275893905 3212814733 +3443939776 4045428621 886426656 +4229231573 2851854410 +2820173489 4164231976 2728752461 2577753885 1333149872 2711974839 3173500246 1467459620 +351571589 4198747837 +1075033551 2919707854 +3198002712 707557339 +1103456506 734480730 2210677149 4025687999 +474350064 1916079299 +1520668298 2352277307 +3357389691 2176944804 +4167407863 4277128400 +218559963 1559562194 +1073333878 1542629975 +2811801732 1403950020 +2506747920 1170532643 1170532661 +2946770889 1843142712 +3126621209 2022359880 2022359903 2348548335 2003273876 426869228 +1031021280 2647844531 +2313838274 3376315862 694805815 +2217727976 4283490859 +538191262 498546623 +2415033111 975950977 +2137163887 2086308338 +3423093675 3691152948 +529232853 2106021980 +2633829782 3093062449 +3211426002 4033778674 +2363535503 1421209870 +1611968685 1125648667 +1464802702 4287334041 2560139767 3411711634 3394934028 3617903385 +1431594097 3302628848 +354394440 1316186858 +3483962941 606169602 +3803228955 3462119145 +941360738 2998596102 +604141388 880896028 628433271 +1208352081 2993538694 +182513525 307454506 2757539923 3762942221 3762942234 543585783 2501440810 3762942220 +3225533966 1755915239 3044945939 +3331075996 4035351556 533627941 1518120336 3261586001 333282267 2983924248 379213708 3261585991 716108423 +2353253902 3971840297 2353253918 +1042701049 3479254504 3479254526 +455283257 1971562526 +2895367887 3685792670 +2958642602 2886469524 3153584193 +371440984 2167436924 +3004691775 3004691759 +602998271 1302938997 +136306332 1561778517 +3461980855 2177930456 2384143878 3300715316 3011773161 +465500874 357880977 +1515204184 2997418483 +3798724952 1190786276 3354193293 +1274249018 3394324555 +221087048 111726685 +2866186402 2444826378 +1575534254 3316721977 +1102908365 2395177266 3051494267 +2639445460 3859734312 2101400761 3193924148 +220390753 1858860610 +1990852770 1872690947 +351619298 3760307157 +4131761745 2638814710 3230262921 4128259436 11626896 237234941 371455895 3348148503 +1534124677 2008323916 +3982498160 143560009 +3857967416 3047120836 +2626689536 1242132664 +3112380587 3027830068 +2982334971 3501231666 +2327091834 3561958923 +2305892600 1611447699 +3280542988 2772130528 2170107740 +3073788748 3061352631 +3763791418 1657564509 3536850197 1551544726 3385851647 +1459102271 2703734785 664660286 2241202684 +1006369500 1006369484 +107716261 3228220844 +3595083139 3612341564 786369895 +3385167519 2220726305 +3561905045 3428461468 +3636957967 1361871000 +1562734052 1562734068 +384022724 3430669449 +3096179962 2119345565 +2844096870 1394488529 2844096886 +1381050088 1381050104 +455339739 2492531410 +1443792059 95130494 +2566127229 2566127213 +1222492044 3763623572 +1539823333 1992811192 +3008716235 2970272053 +2237435055 3697218028 +3485775811 2890847281 +3662228524 2396855418 +1141211250 2259235685 +568608512 1515963653 2778468664 1515963667 1131882203 +3334289562 3334289546 +1520332062 303108642 3311781417 1018422089 +923367346 1441230117 2960770334 1850795853 1850795866 3987820073 1441230131 +3060474525 3349642530 +3515807114 1846315067 +35077853 820967818 +2139845396 37241454 3968897849 +1463468052 2376081984 +1674868464 393690069 +3782736312 2816351405 +3392019919 362343633 +815318219 1266535316 +3816612634 3352317226 +3920545367 891435750 +3236838329 1879573544 +245984640 1950996664 +54169571 1282316723 3350106694 +3591297756 3409086203 253013354 1268585801 1332581878 2457588113 1795500208 1799669502 3057979319 3779809712 2634546637 4000872587 3572562388 569743924 3194202186 2785848620 4247915174 3270060327 3224337097 2247492075 289365829 3449789454 2888863282 1599388589 3143870477 2885024897 1623906479 3237685673 3353247734 1904254226 3337881972 371001969 737142578 2040783214 273143670 1009037454 3407903696 1420453070 1015496599 4144448310 3190249983 1753541428 4222403 939756944 1622418450 2426271856 2829019521 314530730 336002010 3135612426 409678083 181128013 2735498321 4291338449 10300427 52830046 +1519099114 1942488155 +151717883 928878628 +3648089994 2462218390 +1490577886 3132008575 3132008553 +2150932178 2765489285 +1925764979 623585804 +1806345804 232155232 3382954401 +1214600857 2424787656 +2222063113 2367923171 +3537049167 4073964684 +2954956689 3404279962 3574301008 +2247730990 369241455 +2422220387 2858184156 +2752522417 4134538927 4134538928 2371052524 3225177297 3326538167 2556890966 +3006343020 3975644416 1070243457 +103991681 1123235350 +1706042993 2236384240 +1220965928 3094085867 +2967869203 2369147642 +1708744030 274866046 1708744014 +1132510761 2084411081 +533073196 165304919 +3500257610 3096057709 +3200934186 2929973637 +2275644910 476574318 +2805338689 403577856 +3392273291 1551265464 +198927731 2905327093 +3179603360 4164254451 +239742360 3378392839 3428958668 +4137576872 2703762192 +486231793 4088180847 +3976529801 79259118 +2563498397 636758580 +2746296755 2045734198 +788695195 2617052178 +2673735143 3725295118 +801679893 1306771228 +1386088459 700891794 1386088475 +475423281 2079633404 +988839939 3415835818 +1415465650 2410249565 2188351034 +2800095984 2888814549 +162981037 4159306820 3279071041 +1380051157 1388414787 +2261763000 720174675 +9483608 2775991824 +3922038667 155784743 2146504054 2651660966 2838011426 +3349128531 3120261679 +1480241600 289959835 +1937822318 4114842056 +4149863927 3566143508 1501889478 +3553559805 1567543255 +2532217507 3102107514 +2955122639 495970392 +3592553677 3834482354 +3745265931 1509468216 4094412439 922400055 4094412427 +1509628253 1122747563 +1813967051 4290056066 +3789726576 130500931 +2825666343 2825666359 +2760297669 464658207 412890791 +3747399233 151670630 151670641 658819815 3758889046 +2723117111 3122282128 +491678024 1785707595 +713378130 4270987549 +1222672216 3822329087 +379450908 2424131235 +3628807922 3628807906 +1657243480 3625586587 +3979904188 703071335 +3851549314 633541220 +4056291063 2446730960 +518254816 2161389747 2161389733 +3543544718 3141652475 +2621793083 1010513394 +4242987717 4009378540 3271727545 +3713459940 1405974783 +1309857822 1605794487 4232442130 +3377870718 1481617453 +3410555055 3000165240 +452190224 2112469283 +3181904636 1179471015 +3202306940 1992340995 2085324486 +1489543457 844485958 +3594656866 2886905429 +1501648430 1736243594 +3007030195 3655512780 +3892104051 344771597 +3841261749 2939953110 947735687 +439842572 3637443782 3511663327 2874905948 3801319201 1799858423 2791017839 3181317036 1364223991 3801319223 3251558565 3476928736 +3457558162 4276008915 +3921191535 3921191551 +3414780096 2719364216 +1218039815 3108479251 1361214208 +2685954463 2775467358 +1139587577 3869819646 +3827350014 1393252045 +450314390 2378633358 +985542025 985542041 +3712643564 648752407 +1074550649 1282257768 +101802524 2841473543 +171301770 2630392365 3255824691 1261665888 +1632455877 2446612202 +1567778935 2451206982 +136637952 3515983323 +1379853289 1701042093 356157784 1644218328 3274061211 4010304959 356157774 +1321119218 1813227625 3895186419 2499766750 1878960013 1878960026 +2202197244 3535058599 +333721877 1698251804 +3645293671 1902587446 +4094227739 1159322002 +2790224039 1980651232 +2790660469 3445369613 1317671722 +3405610217 81408202 1980474066 +518605553 2587949424 +161325975 3123218086 +3013337011 1902192332 +1245431864 1245431848 +1921711576 684563213 +2147694154 2147694170 +793731226 3350320003 +3498403346 3498403330 +495624208 2436495669 +3623636312 1812072060 +3317497027 193062652 +66160975 2218469208 +2008198565 1224011847 +871509956 3563099049 3646987140 765524655 1078865772 2319528351 +1804491395 3558374442 +3346707889 3073115558 3073115568 +32710457 1253713576 1510666764 1579264019 +844715328 539424712 2191602643 +2723113574 2588940226 3909385879 +2269390205 2269390189 +3589843102 1953591459 26503626 819833185 +3881234739 2216618270 1625142093 1625142106 +1687778113 2660265792 +3096317398 1233629366 1570752487 1570752497 +1117896621 2443230546 +36188999 4135245394 2890447062 +3383668818 3489632517 +2424582400 2828147359 +4092175319 3486313328 +3370092720 4212796853 +2258133530 1703385744 1685606563 1886690293 1720163382 +231198162 2206794117 +337325176 516358380 +2972685743 2972685759 +1443266291 1597626522 +1600789271 990415894 1600789255 +668680401 3142695091 +1918884187 1474498818 +223103189 3289818954 +536490222 1155204793 3695535026 332105081 +2374671785 2050371854 +333716519 3678935602 1998082400 3678935588 547284665 3678935603 +2252235221 691274314 +539622725 1515594791 3877221260 1735768956 +1810131075 1619218535 +428569338 814088075 +3695330383 3413446773 +2563656831 535877825 1796202044 +1119286076 1107355512 +2458479228 2029677650 1478087573 1076722792 3507732519 4089666353 710058279 238368150 +2321862158 2191996815 +793252470 3441446474 +2163227696 1376858955 3282925128 +2662158262 3628400913 +2011946221 3041708306 +2488746858 2914985426 4015988699 +1854162277 1597586924 +1654078796 2148892343 +2933451315 2080004948 +3398871243 1523711480 +1365441434 2018164494 1806353166 3249753855 +3773187593 327172152 3773106297 595614024 3773187609 +2191807273 2097790335 3517901208 +1053216401 3809266377 1677143632 237334484 +4141233529 204877182 +2223761543 588657103 230250151 1739803837 4008299170 3829445568 +2559390812 2185850055 +3020461319 1887607318 +174360434 2121513311 +419825924 1753231711 +2871842931 2871842915 +1614824599 865383460 +2006171978 2274969453 +1933983015 1660073918 +3735541772 3303362592 4061855836 +3887653346 2103025770 2852886229 406675826 +1536430537 4078436216 +2928541187 3025183207 3431390908 +2521509533 895115572 +906834112 125816804 1529120397 3603152467 +3924631074 1879370681 +23435527 972023318 +2917613948 3674747948 +1077952694 3676692102 145168967 3676692113 +3452262176 3837133819 +3169727847 3002398052 3523088694 +2815255188 369094260 +2809460854 321069521 +1600486251 1600486267 +2793361155 493445564 +3363175390 2195672582 2076039863 1663574526 1874558591 990881794 1663574505 +778691705 3888169013 778691689 426447800 +3633390041 2421277980 +3086305090 2937301323 +2009844753 1660473782 163311319 2798796496 +2234105613 3930424932 +1283319979 3387219203 +3526360969 1787774126 +2991434931 2305298423 +396921132 396921148 +184213542 2030310247 +2124003003 1620514152 +2747383034 3288104322 +2743059709 1596136002 +2910977652 1333567689 +1108669926 747929382 +3677934688 2054574885 +1682633734 609969480 2197514594 2887055953 3759149946 +201635522 2305801046 +2218732533 7605633 +898495532 2054644033 +3316444738 3841912898 +3941224982 3839834279 +1735337740 2124302560 +2125993387 650779682 +2026211046 83057665 +38865010 2334574093 +299475041 2993882758 +480663261 211180627 +1373343407 2611066558 1373343423 +3722637279 725589022 +148133019 148133003 +1738722072 1027978971 +2179701222 2773532991 4266311495 475728413 1616039546 1810056449 4166930546 36189009 4278745187 +251429131 2294519843 +969619880 3928271584 3987209895 4129603028 2733359997 +4221050435 1400349546 +2045676241 3603567277 +63864061 3727620055 +2865205728 2417990843 +3814662615 3317843321 +3812760352 624609209 3775968115 3108664093 +3692798730 2306975917 +2526978202 2526978186 +934238474 4069898921 +17347708 3786066 +1861851086 2162817359 +800481028 3457997807 +3487168116 3487168100 +3820641349 3820641365 +3024284884 586688041 +4060326487 1388652272 +3989942756 1159399935 +3060600814 464524217 +445680921 2612645352 +994636372 1846503336 2815785529 +2998403487 2523645354 +4130077039 104448766 4130077055 +1912052977 1506545520 +1016158690 986742467 +1380759286 1095920466 +4186251345 496099206 +73099805 3972815743 +3135854930 3186276409 +521259774 3875704265 +4121897767 745115392 3921735286 +3280232856 1634050637 +186251799 2430906928 +884901119 116088190 +3617415452 1460414407 1971979221 2798986076 3617415436 +2075637022 3761380905 +3045847127 424124617 3969712596 3969712579 +569965366 107734802 +993894412 1308816097 +3918877037 588197508 +660819317 2588426835 374472695 1854832396 1787721937 1854832410 +1622279438 1622279454 +3473873069 1294762267 +732366220 2953729616 3467498716 329348483 1346238903 +1964464151 2481763715 +2041419336 3561198411 +808931904 3030087515 +3208204346 1094273867 +2894174131 1124191948 +2755135999 2201468008 +3005081634 2435343659 +4082972797 941733218 +3747824996 222706815 +1409424970 3348500318 460881554 1865079835 +840180479 3568506750 +4091965034 1878378693 +3540733733 111479297 +3722486316 2416004725 3977822383 2143199700 2432782347 1343291714 3977822392 +1702957071 3643557784 +156590185 442942808 +2826927737 3115587710 +3270885598 2406608638 3336478079 +3283640846 2037493367 3004638860 +2145074363 18913906 +2851146215 1836226230 +1314138221 3145442194 3047325394 +2875687937 2207762413 +1566996642 3976256366 +610789484 1208868895 +813208359 813208375 +908153465 2943669374 +3328060792 3191968749 +1362850180 3827173513 944774462 +1058638992 3577228691 1058638976 2358726396 +202402391 1423402737 +1077270438 1579590131 3133307479 +3743205566 4176795370 900443009 4165993219 +43110280 2475275037 +3643402407 2214149856 +1575559841 407009378 1489058827 1996587872 +2556512542 4280687167 +1570275643 2450747364 +2737353324 3331372148 +3417325880 1573876103 881833878 +1014421845 3153829357 2216173770 +4038601702 3622640407 +2516445436 448119975 +1787014042 2684141922 1195844459 +87086569 350272984 +2272753416 2714348084 1225810333 +2244911203 2022309469 +4135068893 3693217780 +4009879821 2884812900 +673675845 3260469143 +1446755243 1446755259 +2895587917 4277638948 +2096464524 184630944 1115456119 1115456097 +2276275175 3717486564 +2982807790 1809006023 +2980549511 4061651815 +3132384685 2533101394 +536735490 1589592117 +4121761977 2619288607 +755621132 1098809605 2876988704 4068932065 755621148 +1559277456 1559277440 +3698977465 3438051646 +3281863069 4177441685 2374912546 +249411294 684840169 894233025 684840190 1158078335 +4285707466 3952253421 +4244847047 320074838 +1823612114 3999489669 +3551216256 3063525267 +30710006 3376669787 +1948364043 3959652754 1948364059 +2086268716 3985867351 +2409342941 1479329236 +2712321557 1120399532 2496215818 1354113331 1120399533 1120399546 +3358226312 2732206859 +160837011 2960573462 +2254882708 2674679528 2674679551 4193195407 1284474228 667692537 +2874115688 2877012116 4016978605 372282795 3164983120 +1864532834 2542310013 1431622485 3273408942 +423108200 458743229 +3747399259 2699528172 4195107154 3846880776 2528318309 +3200412180 3813221749 3829999371 +41968784 1042176308 +2031165368 1307897517 +2052046473 344519096 +3612777639 2757270240 +1825342151 2697097683 +3207700594 1396861275 +2151598763 114183842 +273703513 4253599038 +1913331114 830452379 +4075339480 370749525 +3900850083 992016097 +3140636615 1999869526 +631138769 631138753 +3044418784 1992012248 +2995651678 1938874367 3960512126 1938874345 3960512105 3881143221 1091282306 +153800693 1667587754 1667587772 +535053288 475457067 +151833760 3743817701 +4060119560 4274827915 1890485212 958656183 +3196871265 1476320928 +3967000378 792714401 +2741251274 3364596600 1567171657 171083684 791201741 2691071983 389192747 1567171678 1160309374 +2535806992 4291404067 +2550679230 2594433005 +2775687437 762656882 +344012548 1265212255 +3711018058 2738594226 2133172347 +3930482733 4191551172 +1077809571 3300246410 +114053962 4255587693 2558776646 3373492389 +2868357853 1320971496 +4013536394 901274163 +4117814993 833536784 +725972702 4233764735 +2780656155 2542983785 743092190 743092191 3194716315 758214645 2780656139 743092168 +2283160383 1219203836 +1139381521 4189432272 +1852767075 3675803206 2166728541 +3070337084 3070337068 +941358921 941358937 +602232730 602232714 2365869429 +210819753 4251111038 4260380174 +3934248647 3997938496 +726687363 1124546151 2995046460 +2700550187 328547084 3892424412 1285018453 2416419746 2416419764 1879487576 508104034 2030486174 +2853877158 1846277185 +1482307089 654515408 +127261199 734200305 1870630476 3519873463 1870630491 4293281176 1870630490 3754760125 811160978 +2956476387 218249437 +850525265 523252624 +3699077641 525632568 +733622557 2145804322 1692746155 +2717619402 3372956141 +2812446310 2480946065 +3085161651 782751194 +1518215738 394242307 +3374673816 1039051853 +283286699 1115943006 2314323150 2594360939 4138939978 1069326626 4120432729 1377616939 2577583317 2980246175 1158406935 2100045193 1334815806 2314323160 +3818423952 3642479797 +2650607403 1299306581 3915103064 3764314274 +3019862121 3019862137 +2678146513 467724294 +2654896734 3923414914 2053585385 2944420969 +2943100479 1447042030 521383403 2943100463 +4206522261 1216194442 +608478263 1326350982 +954517196 1545925431 +3314479284 3020221273 +4075211551 704366611 2680320611 2680320639 +2287430197 1105316314 +599136738 717901053 +3663682431 1125976318 +2909175752 3227199453 +2431519310 1958361305 +2469564570 1385800299 +1308860228 330545161 +4127495195 1286320110 +1536358627 190696796 +1819063220 1654749215 +3144197302 248926870 2255349514 +1459295373 1725994981 1725994994 +3045263916 3913876289 +2570735764 3402422511 +3396854067 3396854051 +1545260436 652284979 2452725753 488559848 +2466415468 3639927553 +1091756927 4022083816 +259547968 2592357843 +1957768535 2348091092 +695011769 4020653608 +1794692716 672621975 672621952 1794692732 +475213746 188571483 +3787226562 498727029 +2091445564 1500307812 +2169138919 1865192886 +534259817 2319949134 +3898325466 3504675253 4154298742 +2262547153 484906758 +2766473915 2766473899 +419946038 3381389334 2640498439 +3491917160 238172843 +635797182 3013084933 +557977332 1064633018 1981836203 1576373908 1914725727 478773331 1325238799 +2989305015 874341382 +2987449699 2117204484 +2482831205 3764007843 1548094458 +236961826 1576760707 +2333520222 2333520206 +3836135059 2240452972 +2870131321 2711777138 3308746821 1495161944 1840257753 3692880569 +722530979 1856894620 +3576046585 453594384 +3340511839 3921948692 +3231851052 270595904 1799080769 +2022530583 2982363689 +2399376025 3147810504 +2384676720 831092035 +2584654495 660929295 +3201852372 316016197 +837374546 3830224645 +2480188304 1204425653 +4017043875 2400697244 1597945108 374437693 +3674317897 3179884718 +1446940857 3407055497 2105398078 +1765687043 2952606122 +152222153 4056547897 +1601054827 2775162978 +1961274266 148616719 4175142081 211270438 +3236944162 840845607 +1003168601 2043192599 +1345921807 1492267150 +298336376 1983741179 +4236225503 1543213064 +2704039123 2077624042 2704039107 +3646005174 3514723217 +2114514227 1580464293 374447201 2601346906 1528402310 2601346892 +3433722829 4250160050 +3139563796 2859369081 +2525651910 861321919 +3444802859 3582739902 +4142414581 2761215932 +1092395260 3681968317 150426509 2631495745 1472464362 746279331 1131468537 3866143103 +842333374 3345604361 +2369080893 2280270338 +919556487 3479000982 +1389199335 705397747 2862433489 2396253893 2653582226 3408881117 1279613882 +3696152921 689147678 +2211350183 392608267 1265452595 4175558879 +2191302016 1235288713 1798560405 2518214434 +2943139891 1530040410 +4149347566 1142801081 +2914561638 3450352130 +2095689788 2022784112 +773099216 3038624555 +3388192042 346435867 +2165901598 3164096962 1826165055 2562074174 1483299369 +4002725878 2318020689 +785307413 3298596380 +3804890526 2718357439 +331979234 3206374265 197876014 +2157652196 1480679145 +383705482 2329742381 +3078493610 3078493626 +2085395730 3197846355 +2182757009 972677844 3737987709 +4183159452 508357521 +2538495439 4284329176 +3609072811 3609072827 1599775346 +1250093758 3836647339 1250093742 +347175702 2841953191 +1407773791 1990990238 +377093111 585492649 4144629364 +2347781514 3578400813 +1407544793 3543585653 3945524360 +3164231821 2837139320 1945724388 +1933005550 1810412954 2953321786 1455817309 1504429795 896308840 1455817290 1521207417 +2458837351 502060342 +248790210 438019434 +4063348069 2454065309 +2292168283 1852576082 +2754846593 2550329735 +3793482191 878398944 +1519759107 3808856621 +2577274057 2438486245 +1542961784 3233038336 292074244 292074259 1056606957 +365608378 1557432110 +93898326 1994025011 3736586643 +1724248300 1724248316 +2291135516 2862117575 +1840126252 2881439296 +2194479679 669012264 +1940156343 3437098794 +2312184335 2706537766 +771434514 2369784247 +2179164080 2303443360 2702146061 3018561227 687618563 659928264 +1698216833 765617840 +2749458630 3723386129 3252154273 424052666 +1163490087 1163490103 1389381238 +2575097676 2050607479 +63072918 3149196402 +3162338831 987138650 +2637660109 1373506273 +2220210241 2482048598 +2106939126 3835555543 +900992275 2641401068 +2116436075 2339573218 +3645509661 643735866 +1683720956 3881864259 +3308599424 4073189765 +1416207318 3091223015 +2076292579 870829254 3486108381 2078759841 +4097080257 798937280 +3984066603 250934514 259382360 922681349 259382351 3984066619 +2306759883 1022104477 +4216860764 131342545 +1344725138 540531696 1435397745 +2273721214 3595544393 +3591297741 931436796 1967261386 33192288 57926928 314555272 3535690845 150402293 2264464863 284808802 1982103451 3888133304 2648740459 4290092053 788585846 3996564286 3333584000 2981964695 2032673242 1908338589 213139272 1141043347 3987957008 3498351053 1345980826 2959240251 1107563138 4168042998 4280366263 201092100 3767459141 341545077 2739102639 3357630201 2702283329 894347397 2319920678 3150748178 3741819767 1719399606 510307674 3086755404 3870111489 3463007604 1654955165 3422863237 1839293262 3858511982 4014751523 3354911974 2604367101 695980812 246765500 1665883118 16762083 1724077092 2370392665 3877004781 2359632841 1613657978 2633875358 2246165158 824291700 2911301309 2657167832 4281907554 2781442946 2304221199 2159007484 3333815015 1140237547 +2963890052 2164592751 +1033886000 849536643 +858877804 47343361 +2021210597 2346066810 +2007030091 2417812088 4018302901 2417812079 2637566228 +2356128075 1590132994 +140685449 783134866 +3119394981 1660117347 +2581940907 4009003810 +2296293770 2497564126 3587506234 2794286251 2133460852 1384718305 1369862869 146668143 1783175583 4091377076 +1197045341 2933216372 2933216354 +2951404929 1448854763 +3016254804 1484227385 +3475046053 3052461498 +1947551852 1461069719 +4051108864 509299717 509299731 +2153882654 934632233 +2721621693 472808322 +1811718669 3908219993 +1532086008 3116120173 +683972229 2994271066 1315378877 +301235140 1766659949 4000950237 722901968 4047808860 1602594506 722901959 4017727843 +536211493 2845514077 536211509 +2127948569 2264488937 1653321259 3284211806 2926448847 2264488936 +980763271 2716228781 2375531158 283418378 2375531137 +1948200924 372870821 870472455 1831459457 3497003761 679066688 1408366998 199577963 1176034012 2623580237 1544862348 2753974958 2212552490 2190912133 3405467480 4211783667 2675662499 670525876 508612073 1082238051 2564631105 1806321531 1158636344 2263694462 843986253 623151908 1406810835 1835503242 3815924205 3815578323 1875178240 3300870111 3974324728 2296930366 3026453861 3570791517 3168710184 1872530688 3805512070 639605641 2260982104 638552860 3625520283 2139534011 1069875256 495028953 1238446712 1436148455 +3246595347 3246595331 +1010571657 1536963256 +1660626804 895419007 1660626788 +3073567453 109682389 1109899746 +3561517408 1138072002 +453738465 1947881270 +2339745763 1833165386 +190355612 2021145991 +1891031729 1503267594 551175334 1570378049 +2127991633 4241090694 +1186125954 3448427701 +1846778276 3973766441 +529547615 529547599 +2391690159 419505272 +2609428281 288911016 +4000847199 3322520712 +47771752 47771768 +395021216 2964114675 +2910469922 963732099 +2184294927 2835855143 1042633334 527649265 2925209179 2925209164 +1591653536 4170602469 +3622584724 2672781545 +1459884626 3925411747 +3703259128 1925559149 +4087862120 3663421008 +2481487483 1375673252 +4069735361 2663846102 +1818320634 2994360790 448424406 +3168026011 3709664004 +3476365550 513988271 +4293997613 4263891077 364192466 +1694641690 3509215286 +3365917862 767410778 +3332195927 9812710 2260684634 +1026181930 1939100443 +3798816719 1092696782 +391690753 391690769 +1212795260 1860198960 +1504014432 2406481987 1504014448 +1020666918 3944409025 +1013507682 377872246 +876774034 3602090949 +1401106890 589146917 +357118441 1536638911 +4001508483 4192997948 +2821172062 598477450 +1185673058 2729039701 1616769374 +1654220909 2257174226 +1484400703 650543083 2269993768 +2405271221 1698369276 +2416338933 1226136986 2937431722 +4138328052 1097567503 +2350821753 223437160 +2951245129 2533475551 +3199234502 4123204257 +1426498319 3899830414 +2937803552 3355695973 +1166796699 1166796683 116908383 49797900 +3321977064 65927888 +2365138775 1127804400 +2268296295 1023426102 +992570507 2905988802 +1229592356 2923168254 +3494281890 359711677 +637428730 3380044427 +371681122 1107803971 +3320015839 1677905950 +4040281784 4040281768 +1477111526 2134250497 2402692433 1477111542 +2883712160 3699481979 +2986261429 3909189098 +2326884642 588467819 2002065557 +3407162217 3423841179 4184146500 +47333616 2114913295 +1745852002 2919516694 +3713305058 3714595574 +3583778241 96655040 +1772917678 590494702 2525333039 +589357416 3032667819 +100129959 204495584 +3470594129 4144017286 +620602814 4182501919 +360857448 1141493931 +3643281925 3742653900 +331453443 1004307546 4160038896 +1681946706 595421459 +3465923534 1328335694 63952207 1177337131 63952198 63952217 +3222485506 1615089955 +1007559642 3886486414 3656690411 1682075691 +950567256 2632627308 2725315813 +4032233316 3170110079 2625477452 3170110056 1983270533 +1603694012 902741752 +322606348 1885374455 +4094620944 2801032443 +3956205517 3956205533 +2630155273 2113515118 +2235868033 940957908 156410524 +2765561812 1672044359 3832410226 4157295617 113992626 783816315 +2273189134 2273189150 +1451238585 3837382462 +171699454 441848799 +1654254063 659243822 +2684485904 2684485888 +98835190 1008103761 +1879526291 3441950499 704036549 687258948 3643281943 4001101932 +2762445488 2869103567 +2813806589 42357588 +1921211489 3095315007 +3226163907 2418400295 +3099749884 3099749868 +2928541184 3381058067 +346657930 3966479346 +2602818529 2046185609 +3871109151 1503953118 +3209813359 2631898542 +1231632772 346393289 +3551183101 760669777 +990477796 2189991704 +772553520 1385770652 2906729621 674114376 1385770635 +2188582841 382218654 +691674793 2706527803 2018644850 +2461708289 4242739606 +3938729042 1893715194 3840603411 +132390426 136099829 2249941738 +4046037149 1702987503 +1724411624 4292875541 2774281616 3045496619 4292875523 379808976 3804311580 1604178047 767156580 +801814069 801814053 +2286235515 3580280474 +671733027 712672778 3053373070 +3071343858 566112499 +3277825860 3919870442 769791939 3843316204 3549712415 +1063321430 464647271 +976163198 4569694 79370257 2637125665 2598375712 664813705 606592482 370706774 1016185322 370706761 +2618948174 182782169 182782159 +2902731227 948822980 +2583496909 911530660 +2245761632 414450995 +2179701226 1877166939 1618857409 1877166925 3167708710 2110758994 2110758981 +943082636 1490561940 +939278110 482275408 1692230296 603353279 +1088173423 2309496248 +1145523486 1145523470 +220331936 1283811571 1526997115 1283811557 1552253443 1526997100 220331952 +2561308363 1593089215 +2350675969 3104100374 +2990301864 1024413291 +3461198423 1679700562 +4133216061 1686203825 +2850399067 3481282642 +3127462437 3717562442 2562701356 2195216867 +44303362 707940149 +2173909259 96652354 3640114421 +1511605880 1642274564 1902920704 1305079533 1642274579 +2662277078 2477527713 +1565190126 1565190142 3672847561 +1347625519 2715733998 +2358245971 2577862842 +3679334773 2971130684 +1967471006 972665791 +1192558356 1835550708 +713015147 1330481403 +3443036639 3711083083 +3765210818 3765210834 +2958845013 4134662620 3011548659 3210715386 +1934133873 3962695654 +2789806357 1027994993 3657819164 +2817537868 2817537884 +1177960095 3092606300 +2552431579 2541465234 +2632276525 705492178 73754258 73754245 +151686480 3226215416 +3649357501 346394037 +3220310728 3889696949 +3586064023 3014407454 313182118 +3923570863 3587105656 +848269273 1895789192 +90822733 3533668644 +1395678723 4163108522 +405061355 132664220 +975740255 2238040604 +4232082103 998785392 +1076054853 1284478684 4024613245 1076054869 +1485192818 3444854117 +1095401836 1360300183 +759692064 2608023547 +219795238 1257555984 3514144543 2661397104 2510398532 +2084142197 58649660 +2161704202 3751171757 929747078 +6706151 3670177779 2283148448 +2975061763 2975061779 +1673576738 711985283 +3084950552 1119059364 2392177101 +1976104156 367903492 3885360431 1197045319 +2807001677 2937122596 2807001693 3383266213 +2681758870 3880575969 +2687119793 3547085232 +1840750358 3457118129 +3528986013 3181211170 1920497241 +666771930 689419660 2837581134 +2188063531 2042727604 +2822437106 2364814007 +2779722655 3902123672 1909343060 +150408005 3090971005 +2967676808 4254546699 +1936996128 798062515 +1637994971 413035277 +1382881065 3938153880 +2679878565 79610763 3621996765 427543724 886403855 3689107222 1914175219 +12905839 2043297979 +3336778285 3866295940 1258727903 1151859908 +3366348134 1139908481 +590773484 1740222464 1522968449 +754941278 875715305 +2933897078 3772957158 1961665866 +440722017 3144703670 3353680017 +2899404859 3829032446 +3479076275 616554714 +2721040985 2856028680 +1783181069 1580536178 +1094763398 1056164833 +3808773900 1833883639 +1665650351 4178206065 +2347352237 4077678866 2879718708 +605741349 2717892108 +1399453001 2563580398 +3634439093 3131782634 +603766725 1809965836 +247178879 2959546878 +2492540951 4152499248 +2874171414 1836179316 2599283959 +3328529812 1249942783 +149314161 1213252855 +4153168431 4153168447 +2871734901 3925896739 +1934265108 3607267372 +1203714815 4043956094 416877926 508180545 3666522300 524958167 +392705345 436983104 +4031227465 2311767271 +1491014628 3217148888 +1689001595 3857965666 1689001579 4126407588 +1237326395 1416186610 +4218172516 3995148376 +3354545114 4123089665 +3249929440 2832631872 +2186737356 4209410871 +3092221190 725287009 +425940196 1056601304 3680412393 +940506713 2560255496 +3980841786 3980841770 +3898439738 1662381826 86262603 +2033527054 3225993945 +2392017163 2094791746 +3956108542 808372233 +1282216698 1236590493 +3140381783 2740575700 18124016 3298161865 +2511136076 3945592481 +3190907450 2713559389 +1053801436 3171203911 +451129931 2675026964 +2964711086 3696894959 +2190937411 3603554428 +857105182 857105166 +1301360655 3858006759 +1716572788 1431934152 2235255961 +2579112675 3235023039 3808750410 +4037802530 12239765 +1326810730 2008457413 +3741993008 1404238408 +3471511239 2198723481 +2896951601 2444658487 +507379756 4230921494 1708628929 10396753 43686836 3348776279 1575428540 1172765686 1558650918 2027619671 +10428418 3770485027 2217305878 2461025182 4236206901 1961459405 +2106344943 1488620859 2847459919 1488620844 2463242040 +3755440864 3755440880 +1025130731 4253722987 +2665054370 3092001646 3636916669 3636916650 +543740496 1426265059 +1190336983 213124931 2276568432 +1678457636 2712541609 +1208771608 1180591027 3522725299 2199704032 2206306779 +2061012224 3036929243 +1641649699 1641649715 +2033617870 2665354575 +3791711998 3312990687 226771554 3141736969 +2401030405 1331497690 +250200836 250200852 +1744514889 4184567790 +1578845075 396448856 +3330100966 3214627610 +3149558914 142960821 142960803 +740336149 63599802 2199810431 +2994754664 1745149867 +1436801267 3287189146 +154579988 104197166 3132024581 283193944 2501737327 243313664 912875369 759467244 3566126099 2094485236 912875391 +1443440961 2976641366 3334045492 +2976146140 2544617621 +398752708 1863984815 +986406663 2502334486 +926134337 660502080 +2398092343 1879034458 4286235497 +2876425021 3766798204 4154658487 3766798187 748356977 2969710904 2660708617 3238152790 3993373140 3087154229 +3468404935 2195022136 +983357725 1642711220 +4250290846 305129581 +2077906500 1018547487 +3360781914 2990362539 +1811821033 991844798 3928527310 1809680216 1809680217 633081755 1369325503 +2771243523 1242226518 +102195601 667850566 +500931413 923195379 3469397804 +1952927617 3215075350 +4124101432 1055658451 +2372833041 1504234678 3054188486 +2808482607 1926940241 +3033163257 1619952072 +1147151741 542835650 +1088527454 2166958057 +845556589 3698571730 +3257799006 210065151 +895450745 3040671319 2921574042 3008924148 2119440488 2119440511 +3401439032 2749234643 +4095229746 1949006757 +1286624893 915941076 +4240901085 3838341624 2818133744 +3473943230 746329485 +1472935487 1742941355 +384903557 2728680524 +3156846614 2690413814 1267964583 +3292413152 3455702181 +3380263116 4163954976 518085837 4163954999 +3334921288 856474973 +2552057104 2250264629 +949581446 949581462 +459648370 2467301989 +2515821740 588941168 2291119075 3149560535 1134302012 1200569815 +1338407525 4201819372 +164018711 3813169456 2623493239 2441971597 +1222477662 2098944361 2456663886 +1571378698 1049166614 2200339494 +1522712939 1910790040 +378598843 2277631395 +2624834891 2350225547 +2744504527 2343647653 3499310271 281581352 2312433352 1406645700 +1261665888 2150642998 801733958 2150642977 2280493399 +979106804 3536691481 +115306469 3065849196 +158712652 811757729 +3507189604 3583085709 3297866178 +1764618898 2476082894 626318287 +961345113 682368533 +4177631886 2340834703 +1182407207 423045984 +2525638799 804260044 +256757839 1988035998 2983071387 256757855 +1511996255 1691916316 +3305484398 2515844409 +3924762668 2138029671 +1355893325 2976267735 2256009010 +1363810441 824663790 2158272430 2229055647 824663801 +2769323185 2315313830 +4201208425 874388850 4201208441 941499353 +3081315604 2613120253 3081315588 +4221981672 2550465044 248911421 517353339 4221981688 248911403 +915292496 1180027569 +3021616436 1669825364 +3413818346 1010159962 1010159949 2561588499 +3156852911 3837416305 +815221919 489528904 +102565026 2878198868 4029685691 105000705 388661199 +768576785 784011718 +3342710112 103056947 +129614972 3389326632 +4221183502 564783119 +1024689930 800953517 +2940467392 2818610771 +816589891 3707604554 145505445 2921150889 1350535098 3792285034 1161561939 +3088781342 1798517566 33812543 2400540354 +2129785920 384008389 +2778803469 28157042 +3772391490 962643957 +3734173297 3529110512 +1933076102 3888735479 +3598562072 3598562056 +1707193851 1707193835 +1408031739 417221668 +3534588840 1328732523 +606423089 397452592 +364891849 99780206 +2515486637 3080287839 3215380484 +2023807739 1607532101 3761813810 491484072 +2597127330 1388202773 +1568003047 125605024 1814909413 1763571698 +1859962804 4095847455 +596976730 1006301006 +3018834879 803366956 +1030278312 1408904299 +3965815987 3965815971 +1787964971 4011765154 +3016135137 3801589055 +2174643159 3891163893 +2340923224 1142135524 4270616461 +4124485354 3133355302 +1453535169 2596700923 497693543 602156246 1045881464 1446155494 +2480729745 1439403600 +1053243766 1235186887 2902775105 +232631739 232631723 +919375764 3624273401 +1479332818 2693886867 +3290108152 2929440365 +672773192 1752616285 +2394667073 441422182 +2074913956 2992698008 1423164969 +506750441 2403934355 8573778 8573765 1072639067 2095623974 2078846336 +4124721491 4124721475 184293082 +1345850045 1602615849 +4204086669 1786299353 1584967908 100433124 +795028075 68929140 +3744573323 3861561282 +3986147072 99501317 1528211148 +1287333012 3864560616 1587188985 +3244166932 2064759929 +982895024 3051493579 +1884703073 924739006 953516991 +2898416799 2498442824 +2531832096 4045008379 +378643313 1682385804 3112298518 2743740407 4165225200 3263297060 +3247951934 2583559519 +1442730423 902774589 +3764050582 145285583 1213149236 145285592 2256284478 333804501 3305511473 +1835403541 2857874348 +3215451395 240175719 +1630001651 3837532556 +3588470495 2490949896 +708963112 2322238275 1855689616 2915381227 +4067641702 2916300442 +2398943111 2671356310 +750869938 2790931803 +2809449669 721934077 +783831144 364548739 +3411086291 3411086275 +2464969848 2758601264 +4092615244 1709959046 +1604080740 891175001 +3765983135 3541632011 +1685253279 3219816030 +3056957835 1630426562 +2180998921 2180998937 +3941629794 2367488350 +2753793221 687249932 +4137324240 89051509 +1308140360 2696915004 1172922337 3567379696 +91325927 2939029522 +2311027321 1029385532 +132071521 132071537 +3408056265 2429360504 +1098190184 825628547 +1933456574 686622495 +41915420 539038417 1695588112 +3339306100 3361751695 +2484152415 1308937483 1979878792 +958701928 2629946261 +2781761614 2373985241 +3485454424 3485454408 +2477600900 3526365758 +3483179737 2907784072 +3046559955 2943007788 +3063507389 4161594654 +4216451700 2205930583 681767143 369142937 124917427 369142927 3685735960 3585070218 995668924 3989542189 3989542202 +273773295 2671242798 +2243134299 4008723230 1111074857 +1599996472 978748736 +2490627682 2629746045 +3102810502 2491308839 2845296097 2845296118 1979084695 +3853326716 192880177 +532566256 3902368213 +550205422 2655904969 +4174535236 4146338057 +491875375 1445809646 +2229183311 3641016992 3178511913 1816395841 381759313 3182552946 2551818775 1752817694 186331545 +1578716330 4152618113 2034069765 3419647885 1252983910 +1583761680 1843765116 1583761664 +4078815701 874141744 2136683261 +3232378242 3454378933 +2012508860 2393483076 97870316 2087232112 2087232113 2446368241 2087232103 +2086913777 2950897299 +2512904376 2175189412 +2220474673 4118290637 +969854035 2174153571 +1913637333 1675278940 +3582786649 4173852457 3582786633 +1845155865 987901790 +1229637732 3300488575 +3923526145 649848726 +2841122734 1505621928 +2936062951 430043533 +954233014 954232998 +690023114 2295438317 +2505865371 2378235775 +2153427917 3687386020 3687386035 4133471200 +4170080726 4170080710 +734939614 3549175785 +2146993435 2402912658 +2402069610 357643986 +9674895 3706165665 +219269691 3456195300 +435069519 564757080 +1520205147 2924656722 +2643508025 1994160091 +1499037431 2665668304 +307010262 2761408241 +2497443735 108928266 +4255653546 2455538278 +3536079333 2952811386 2952811372 +2401465920 224790541 +3361752846 2106579737 +1851412833 1851412849 +367820626 3578555909 +3780653381 338761142 +3072400391 1344216854 +1121643108 2139332714 1473060584 2855014238 34491715 17714109 3910018551 2279666236 589124720 589124711 +688505434 4099732413 1347651615 +2183511219 1808644150 +1229392900 2598754107 +2323712924 2770683537 +1416054670 1470013016 2161853765 1368773394 +2681506927 177803960 177803950 +1024419767 3594536198 +2538275249 418648129 3692276144 3692276134 +1901597005 4263852027 +3700446071 2330388963 2922603600 +3831680889 9214824 +2201268565 3774032092 +1016158716 897055655 1422960551 +1446587519 989924350 +297620667 2819383922 +1071668775 2704485427 3040098144 +2541928914 1423383941 +3432401506 2799382909 +1635489750 637680361 3188249396 3669576375 +1632251048 3485748349 +2738381986 830799726 +377438749 2270499746 +3014839932 923053864 +2593805282 755638759 +4023269460 2283085247 +804525759 2851590102 1729900017 2154975868 2154975851 166582657 1377570006 1010814632 +3661581380 969985753 +1788257499 2787476690 +3005878752 3946455987 4169541597 +725239053 431666034 +3932454471 1127401942 +2364124442 3990585314 1384796373 +1261522435 1637732010 +4093668579 2509901522 +3017160654 3017160670 +2349639274 3790207181 1868939962 3790207195 3894470506 2733553734 3586935757 188452774 2119352530 2119352517 +1301665294 803702851 +3670255343 1358940718 +2244768624 3686711499 +536709383 628525170 +443742176 2197566885 +1901740299 2820272184 +1023923054 3268684793 +349311421 1941033796 349311405 +1765926888 2144661388 +1260962528 824886963 +2978620113 1299500806 +1192222223 3975844238 +2036369166 4027586702 +2950838870 826470710 924964199 +1684876212 3420179535 +1587514933 2528475795 +3593512592 3197514933 +1069965603 2286610954 +3183663553 2059193046 +3192829002 4056363429 +4174259888 1552344853 +3862634622 3862634606 +3590448240 1425710147 +412151209 1428562200 419825945 +3254305064 2456047939 +600595058 1700249086 +3404876586 2223428499 653598324 859771002 2223428485 2763647238 2402620390 2775339789 +3115040878 3076517177 +832763784 2651789052 702439093 2878057245 3522253744 702439075 702439092 +1615847836 1359481029 3140163949 +1974406239 2710600094 +2228938124 1665458163 +1367040052 303045716 +2367111591 3265026550 +3931536631 3710302406 +3270586705 850436752 1376770294 2868664471 +2915901122 1541892981 +1819249258 3315620774 +1217201545 254659813 +1620481301 571256842 +2046691035 2534045925 +2758523643 3499579698 +2318997690 3047672273 +3318244230 1437253827 +420924748 420924764 +15301482 3649914843 +3900933059 3389549536 3389549564 +2275211992 1411310107 +1169305457 679522022 3323770084 1744589617 4244057485 2828227606 2828227585 4227279863 2928893334 +1861109250 3793462794 3793462813 3366200974 2736272675 +3754045340 260963442 +1897669303 3326780934 +1320246016 3778167045 +4288353027 2678359706 +4153638220 348952439 +1739493540 3687690815 +3040814365 2727507435 +4169672470 4169672454 +3777027072 4270513666 +2987587927 2866709478 +623931503 2958098936 +3073332971 1250284532 +1899809633 2769496819 1495277887 3800715316 4131113657 2746493344 4231779383 +2695978715 3526906578 +215814815 898450465 +765493052 765493036 +3222637285 1189717612 +3994091398 1254244321 +2899728734 4159852619 2899728718 +3143218398 4206428926 3426204031 3558988546 +3184744210 3853652293 +1662069145 2365881303 +598877061 3614320899 +2844320295 1312378931 +183991061 2988496285 +3369589854 2312103935 +1379477046 2784438023 +1502086543 3415107020 +3898592057 93686024 +2633829784 4112710240 +4190384474 3277427929 +4205775511 1568807858 2490297710 2490297721 4016766639 843340409 +220588304 1958192547 +1280667594 4101962477 +2877012117 2294518428 +461213471 3488772572 +2501649938 3444567621 +2203591155 3065868677 +3915800788 1076522425 +4056568250 1535027138 171898198 2890978523 3262492694 19270127 4077581748 1535027165 1573521870 2645317985 4217978333 2890978503 +2592078343 1421007635 1316401702 1047959808 2592078359 +1469101039 3351986478 1469101055 +2800173697 1485686192 +317720482 1910244355 +2354525356 2571627223 +3965050385 3965050369 +3608116673 1315108544 2958170422 1003131633 2347699559 1315108566 +3521012635 4229352722 +124209377 2291644960 +3086032868 1876998095 1136088292 1955935231 +1970187661 3549237041 30323316 560467580 +15503235 4271510777 +1856720886 3208124006 732884852 1800094337 524701127 3107458310 3107458321 1604085814 1114864588 2947575234 541478749 894113298 +4261700117 1688546611 +4127504109 913045266 +2547573757 948672610 222307543 +2719507650 1126332621 +1377720503 4213674274 +4011303600 1006481156 1818776776 683527459 3130173451 1487761765 +1955249435 2439491986 2439491972 +3215239273 2976097708 +1124401445 2782973242 +3964319222 3964319206 +3442061562 2137306581 +3321008462 2475427747 4060955114 214769222 1221409931 1488094415 2328798599 2123840920 3186673449 2422472241 933090217 2421110725 3303574771 +1636981140 761463791 +2194862998 2283107633 +3440975475 145334300 2581735029 2985677807 1368059660 2842050138 918602872 368878281 1706445204 817937130 1773555703 2751623404 2315223053 2581735013 +1894688375 2649421229 +974511882 2054036653 +3692672776 718662196 +1553664499 3369734515 2373558726 2390336348 2088348321 3917349175 565200353 3917349152 +2858520489 3767871246 +3203284161 4150218180 +971805871 2671925755 971805887 +2857900770 2857900786 +191828346 2044232477 +3395304568 741999891 226439419 4164441600 +3730621655 4262158921 +3803918595 120096420 +1734630293 1476144028 +3053417351 136502678 +2808403216 2478532661 +3822136462 2451765775 +782320188 782320172 +1832682384 2252544931 +1152640193 1531892208 +3256569127 3256569143 +1804101039 4139258478 +285230500 285230516 +862128033 1031987142 +2120215608 687922235 +2576239929 4093874366 +1368885915 166633755 +2045615226 462033466 4195656542 1729693467 2764877190 4253799912 1898039457 810654707 3271600685 3970598241 473000351 1305273121 1462833050 1760431597 428764073 3395866961 4020865407 1985027446 3397264260 1738164276 282984613 1693173585 3158653817 2890846357 4023062153 2196691224 295132669 2069700862 1618981794 3959870106 1087555524 2095810028 4108721642 2022701169 1783154030 4046457670 2338243178 687141456 3146962022 +3340943382 2444518055 +159667914 1205988958 +3421197708 979552673 +2769932030 3852523999 +2699587813 2683136010 +1484733488 2352912284 +2199984376 2199984360 +3396855223 1908317968 +2104997211 3732045380 +3371558503 3552569631 +1321119221 3112634323 3945519292 3758494605 3758494618 3945519274 +4287319909 2907569146 +2444891727 2617338033 3069255246 +2098733608 352175357 +2436644690 4090998298 +1946206702 2544421689 3971471727 +4139515941 1148692810 2398370362 +2451842602 726406538 +1758900071 4084399972 1814415993 1895178038 +3989217014 3989216998 +1014250615 2717593424 +1271983111 1625526016 +2606584022 1776697575 +3303184359 3618971830 +804648375 4150852720 +2735791186 92984581 +3616088647 3776269244 +1987924452 3409263055 1799875071 163576548 +3804980869 2335335258 +1805047020 135398835 +3097548262 884170534 884170545 3513311258 +1374584079 1605616369 +3478193592 344719533 344719547 +4058729673 1948642957 3467398446 +944308868 518976991 +1718011110 432535063 +478600299 1397554274 +3264830935 2965845321 +3230993679 3655141122 3272882450 2171052370 1259917354 2721051783 3632132246 2570053211 52620334 +2234380800 1848396251 +1186921498 2024201469 +3541707799 3421307796 +3170593581 2898900932 +2404775006 2574385243 +3198191610 1165530728 +3806742837 1703231082 +2988883735 2315178278 +3124568303 1425971777 2931484438 1000497211 1000497196 1083388935 3124568319 +4289316133 3353310813 2638305594 3286200321 1774021326 +1468859011 1442509866 +150590752 1095401843 +2729859579 2729859563 +3143169449 3143169465 +3598788358 211419876 +2772687417 1657833384 +1124981793 2949744608 +1012257229 3357099442 +2637714112 1068123205 +1688139009 418839601 2093940611 418839600 4174953767 418839590 2700840077 +1979105078 3916366343 +3450419042 593637187 +2456415069 4097395371 +3415219894 1932221590 +1363715715 2019434538 +447346487 1157870750 49583011 917966777 447346471 49583028 +1157105117 1869691636 +3030562470 36013889 +3746332157 1658855307 +1280758373 2444047596 +745876604 3510260263 661333301 3627703601 1273826604 +4176694391 1577148240 +2051834992 4134829123 +69280149 69280133 +3629188695 3733781241 +2291551940 1092792452 1505210799 3365797535 +494271142 112825153 +3679524069 631497850 +3867600654 4099783439 4099783449 +765355567 4284144622 +3333026381 3334933426 +1304522291 2592111194 +4162413049 2297772776 +1440580404 1605733071 2211025800 1605733081 +2619579264 1275972249 +2365021888 877610616 4145898637 2420460004 +1976327848 414777981 1597955205 414777963 1748953812 602794512 1748953795 +1535408672 1409979540 +154538667 723477282 +1470039998 2908303391 +1777703928 3315894139 +1674289994 1670516091 +782474513 782474497 +275262024 469405515 +1288340997 3889232346 +1188558656 3065869304 +3021302590 3149386377 +1977133136 3557881333 +1474622952 2330555412 +1044107533 1842292447 +2606781248 3450776859 +2683998722 3648248117 +3793741701 363627751 2040698115 +1763573815 1500243817 +490095203 2655197302 +4178946550 1506671062 320507463 +4111620416 4111620432 +49770112 1780926580 3040435001 1090554268 1473750991 2203526037 3232096851 1464687038 1371030337 3288628442 3586958486 +940104841 1187889902 +2456381385 1156473208 +648036811 3903573310 3903573294 +2651811482 3846028386 1816861803 +1180418026 2892963149 +3028878471 1718167940 +1009366897 1009366881 +3513436737 389557460 2385255597 1999370365 +2389732792 4076648621 +3956782064 2484680028 881869525 +887773968 2057632559 +32793216 1434644373 1099865634 +451170419 3362432282 +969450620 1926950695 +1160448809 197300622 +2156179216 2969136943 +2796334235 4241733650 +3136172619 2415471618 +507936885 4100960604 +2410545751 3307889603 2410545735 +3398684913 3618761584 +1064089413 86621753 +1618639492 1691278793 +2844237798 2476751143 +1480018590 2524507817 +2352746155 1837831988 +3608931467 1104589422 3263615861 1179152226 1483109997 272913918 737500866 54804860 +241799527 389014838 +3070518020 2265220667 +4275688097 3521549183 +742806428 1666114444 2028510791 2028510800 1320525457 +1157258369 387948288 +1328289106 4100296709 +3784629438 2006460834 +384881205 3057371438 3210531301 111098820 816518536 2950985315 816518559 10433110 2737054657 2925361190 +900407468 677670615 +2081193992 1336773771 +283352600 2924601307 +989610972 1904444662 3690917857 796680417 1593899720 2765258507 1613289417 1413560368 3681904693 3754457156 1251010025 962579012 3355700836 2568205309 +4115202014 2209208493 1369223946 +3848933500 2717381415 +2110956850 2110956834 +3920143563 929851058 +1026628607 1397691006 +3671984708 3279855483 +1990927912 1739644048 +3356452408 675146299 +2274129337 454906408 +3651409195 3360510626 +1257497676 1176896728 +2915235460 233443785 +1026634167 191972112 4218497526 1026634151 +1041293744 1759148299 +116564875 1737184943 +844612805 86688268 +337746182 1606461255 +1953857084 223961780 +1057185872 434677949 +3395931764 412090521 +3238564729 1501570942 +1964913184 2525353709 2525353723 3786495748 2525353708 2243646360 +791216913 1919574176 3235338082 1501563863 +3805266170 2686533510 +453670462 958403423 +2278632411 1231515054 +3026048837 884597146 1189810755 3916604858 2594055530 +262335350 58233217 262335334 1844762454 326675143 326675153 +624182520 2303234669 +3304125221 3304125237 +1176184656 2898191075 +1789292827 4278455684 +3376817767 2380320370 2265098105 3404004709 +1821112499 2472051162 +3018127569 41136400 +1785979944 3814360330 +1802480928 1087211891 +2432994646 863561330 2687139441 2035467621 +2690167658 699798981 +2455324644 1183591423 +2988679754 3088611963 +1873780703 3598744142 3522611791 +2046454657 1593022129 +1138339662 2305825487 712651726 2376922501 498005977 2305825497 1851558354 +3697376497 2624134550 +1385608153 1385608137 +56713009 1932355895 3517934016 3609426259 +3792325844 704442557 3792325828 +4183325744 3058401155 +3446620882 942026899 +1726737734 1265009953 +1127506970 2309108278 +3313226792 2687835220 166656737 166656765 +2508382717 4284168930 2763746187 1510588756 +4076712094 593299619 +3510702385 2590904358 +95805907 95805891 +4093671001 1975143944 +721155078 3739806210 +3097600364 309402903 +3075119074 3075119090 +620919005 535053300 +649280017 2792070347 3883081543 1112598890 3983747287 2758891208 4247021776 1630621477 138104932 1179709366 +2694574289 216593175 +2591532428 3836523334 +3550510312 228892989 +2027316448 3401721772 +4125213493 1197886588 388951683 1204015440 +1726741521 377343686 +1247371245 4281942597 186863903 4155638290 4281942596 +1896323505 2008967232 1556614327 +1205712918 940100263 +2448448906 1197686843 +4207004583 82994428 +404553779 682053722 +457893948 3847376492 2581451751 854300273 2581451760 +2012657715 2012657699 +1789747078 145625542 1961713655 +3012729254 1439162433 +3393276739 2814999146 +998547267 3748649665 1171650326 3503375664 861030909 3503375654 4106663548 +6140791 3655551459 +1562089684 2179317120 +112392345 765560143 +3701373027 1266042461 +1010535547 1228894767 +3131416089 678452229 +3824827740 1055823815 +1433164350 4168612363 +1610420675 3731027434 +2915771739 4056665682 +2638997879 360744528 +324496233 131931353 +3595696861 1074653666 +2638685639 1577089088 +2989047897 334744207 1967641406 3488631838 1967641385 +2022472733 3794231732 +316699527 2771105472 +1168808360 1401938813 +1980555862 742935911 +2359476554 3128067763 +320935215 3337485454 3349460455 3198461883 +2161651782 2839097479 +445706454 3107361898 +1198137937 3172205968 +2313274173 1264998658 +1086496151 2304644272 4011495683 +1608407945 1508170222 +536490225 1205537648 +71473388 2698427287 +1069159800 4094544659 575006976 +3135882083 1945518307 +1740844011 1128145652 +4069905655 3638444240 +3529490030 3219230446 +2294748410 1264977309 +3051234468 3372479132 3674476232 333130393 333130392 441092058 4038307369 333130383 653916452 +494989338 2348415229 +1523248956 3065426663 +3410006679 2376516518 +1173810056 2118357756 2988822448 +1749556823 1586698953 +3284510131 3810777292 +2402069604 3344130431 +3728559033 1247919706 +727652684 2461323959 +1121248192 4112680787 +1202204427 3636596308 +3480688628 1043011144 +3825171164 3825171148 3742250896 +3092947575 992096297 3095875828 +802795856 2746360035 +2972004441 915086366 4210901822 +266835981 378821732 +3549459559 3414608996 4198995523 +2722626642 4285107437 +3041688027 1113838532 1193696648 +1337433312 1037162562 +3740596011 1651709568 +3495031151 1610551726 +3711048085 2606264243 3403564444 178591408 3739708704 +3885190191 3138821484 3138821499 3885190207 +1886037490 599220122 +1232869549 570591493 +1553833197 2286443065 +3357005588 1178963956 294098031 292469375 +2646025270 2102264071 +3982702023 2049812544 2514476243 +2973375722 1433492306 1433492293 812173094 3900408923 +377505005 1491894546 1491894532 1760336468 377505021 +4284806126 4192993209 +2523656454 2928494097 2722026353 +2866784727 3915062672 +1380771458 286187189 +401624812 2605464961 +843135592 2226057643 +132390423 3111949453 2635420594 2199608880 2484422019 +2692144689 3424634662 +2854341664 1013185215 4080293477 +1645021195 1703127362 +3481964487 3504849015 3706173203 3504852224 +1028477264 3279423144 +3616838431 1755150219 +2354598038 2231819313 +3057224817 534931333 +434387571 893911834 +3351404283 1912309042 +4142918624 3146811067 2612023731 2509111000 +677590505 2100157912 +528176393 3028332563 +3276600562 1961650348 2653932761 +3643391455 3149260296 +590862071 1743218384 +4074770289 3350744816 +112183527 1500676361 +68282267 133030239 133030216 1528659244 1568903461 +3908530549 3044623130 +2891198160 259414845 +1105319069 1105319053 +14803571 3331809738 3698766839 14803555 +2293964989 4220815746 +4229085259 477634050 +830605943 2890596474 1723234641 1723234630 +1041888634 1808394582 +2910583953 3159994346 +516672434 751937829 3238878029 4012138782 +2307913133 983547716 2279568587 2307913149 2608475653 2608475666 +3953003291 273903839 80444292 273903816 +1182123272 4083493789 +2016386971 1104042312 3455598852 +3636126296 3308568533 +3757871128 2996229595 +4282881768 1964473620 3316813629 +2019927360 4225724772 +2244048528 35985813 +4110717573 993175372 +1152179809 3064167117 2099385002 875368078 +355939441 3627372397 +3221368410 2641295266 +157818699 434717442 +4087202325 4232234800 +2266199511 1396072693 +2196782957 2368985220 +602859496 2031555133 +864597755 4248612799 3901911621 456658212 +2518482106 4106766229 +98457704 2768579499 +2303007588 1160545124 1210965848 +126345509 2053758528 +114240199 114240215 +3330102267 3330102251 +973405062 1305396730 +3004330214 772289398 1193931303 +1448761552 1448761536 +258314007 973512323 1407205680 +867655003 3630738696 +3853343248 2682570549 +4270630577 1751804070 +1955749439 2725291516 +3740032782 4229538585 +227590619 2579228797 +1979401909 2318154316 +4227357976 74163876 3220868301 +1663748516 3227217193 +3052400506 3803577611 +1925352199 3355873557 +3184823238 3840394047 81324817 2938734350 2924856067 451028165 855301028 2610432161 3840394024 3840394046 2610432183 754635318 +1870359505 1297039852 1805834102 2932137508 +1524224865 1339360071 +2994931048 1816232637 +128610497 3911597553 3528425430 +145039132 3085957383 +438506433 3862436032 +3018767591 668164022 +216561259 3170003581 +1247414872 1673414811 +2406046488 1389352115 +3654622748 108946951 +2389219199 2051367403 +1011634921 335963843 1941093019 1503858776 +349405591 223276681 +704824572 2264475711 +2499523246 1136602891 +1710257034 59105851 +2318877323 1471636674 +1476189014 468255239 +1178398388 1173079385 +1341474207 2115803464 +2324503672 409065205 +4160359547 3651249586 +965975953 2368300375 +2421553014 2907999953 +3840731501 444676380 +4273582800 1140948796 3461643637 +2839968230 1609688343 +1766227233 3673619168 +2976562657 738781472 +4250269909 2740369226 +42810019 2807254684 +3486453024 3486453040 +354982260 140608888 1857041353 +2873434175 2741245941 3325442027 3704734504 +2055115219 2822737708 135160384 +1332475073 2557305329 3354545110 +2418494313 256969639 +1157105113 1802581128 +1335594876 3454197809 +2790999004 3182154567 +2919142357 3166877788 +2652725248 3896385548 +4019694620 2308832981 +732411223 268597232 4083400634 +283117963 1753623727 464455124 +1668446987 2553786946 +2931628922 2921864367 446456898 2377269515 +3153224322 1620120234 +2086717449 3579504174 +2689561887 2081775582 +939825793 2956933398 +1912490598 1816424869 2928486310 1912490614 +1663861517 739396978 +118013430 3346825252 +2873873718 421672705 +179188425 2570711672 +572179344 1075960757 +4000060424 2834304821 +3662322275 108071370 +1636354191 3405167637 +292407653 2157700960 +1636807753 1784457125 +962714919 109179639 +2260679565 3337262820 +4134581553 1947849350 4289757242 4272979620 1947849361 +2769983241 1542575033 +3584497671 2013931780 +2697412572 2697412556 +668562616 1934802349 +659743033 659743017 +2124894538 2875520891 +1088161203 3445422284 3445422298 +807672564 3168169497 +3239276038 947061830 4153815927 +2029006763 219875874 +1324650654 1218935874 +2451155938 365094149 +77823446 2511511713 4080853866 3715521665 575905536 2511511734 593434599 +3854083663 4037922382 +2159525109 2159525093 +708963105 2797937888 2322091997 1496732624 +2476196832 938039731 +2102661552 2102661536 +2642212512 2344107507 +1669538126 709090510 +52614576 3011480843 +3806029116 1533042033 2987257196 2412186653 +1830072668 2713358864 328414161 +1000321022 3663858911 +3897813437 2665748113 +1338760130 1609233013 2139043266 2747549134 1641779677 +3941475219 3941475203 +3016309221 3938853740 +2466901080 1145008285 4150519795 3500084891 2871557280 +2207839602 3730598004 32570320 +2432059819 3430267352 +185487216 3615952195 508036475 1647638299 1248519672 +332840837 3222240858 +755209230 3936490009 +3018729267 1927787852 1927787866 +283793872 931921451 931921468 1894474357 +2934780732 2607261543 +176855521 3260369170 +4225879219 930430412 2818828749 428886048 428886071 930430426 +4257489774 3921921593 +19939542 3327957942 19939526 +620918997 3866528323 3745709680 400832348 +1025322479 575555870 3317280479 +3863153009 3968326896 +1050051898 179192853 +3569179134 3826559711 +1891037302 1891037286 +991463522 2278727549 1772008021 +1664843649 3081353216 +710945221 2554904003 +3691373396 471070743 2974080313 +2505053016 1427003979 2730485476 2505053000 +451300708 3163280511 +4027277686 1474981073 +3212071524 2255916410 +154789017 2562933771 3588333205 +4225879205 695543724 +482118096 214758005 +504053751 1119203792 +3259049374 1787705279 +1950285980 2603480465 +4152760668 68807633 +3404773004 634491553 +80827811 1050704936 3935361053 +86707533 1875243044 +2327054548 279874752 +3687518459 1398249919 4222335780 +1278325407 2436640862 +3295761785 1152710731 959036744 3077148008 +3062354964 1808980847 +4138456318 1928818718 +935437642 1791363762 265761659 +3022634270 408487362 +2838287692 1269101084 +2086029142 1963869729 1963869750 276982762 298994791 +1018535917 1018535933 +3713916577 465925984 +823687348 1928807688 4253418329 4253418319 2077407407 1882704340 1928807711 +3014201983 3665484481 +639811060 4239460111 +1686747442 1993247141 +2509365867 3752291956 3752291938 +1012076117 3189220505 1772890052 +245611720 934266357 +4166319420 3986931191 +429583156 3031028527 +348384005 3043686604 +1782863240 3516048669 114945204 +4094645507 889573937 +2369904733 3735769173 +1179088095 2172451592 +4179994444 3116619699 +2661443327 3180809146 +397965805 1147662340 +3766452968 3766452984 +3689981135 181629390 +2187366298 50163894 3624013675 +3503859222 2100208353 +4283674537 3284162892 +1549430874 3160333757 +1678784758 2072619857 +3600935053 4015362638 +3720284969 1019122072 +1556746804 888552095 +2429946630 249695635 +3170927556 3767103161 +826554834 1617364357 +2509365857 3584515766 3584515744 +2867923828 2373257113 +884901117 8328674 8328693 82532930 2758383931 82532948 2064443966 +3397103802 2058826955 +2610248651 2336901368 +1228686914 3112686923 +3695057360 2244125283 +1608824196 2030681823 +1140553848 2094965997 +3585307669 823565574 +3372907597 3363941668 3447465934 3592660402 2453377275 +3727186171 3028554546 +3283440093 4084195060 605809640 3204497416 +3479466793 3975120614 3958342976 2853094355 700894747 3740693637 +3762877719 702141222 +1492267429 2856593068 +1687847895 910003056 +265780693 3308983882 +2184818194 3955291322 +1575942218 1458248673 +3545327071 2284019208 +2697263639 690454915 756396592 +1624800584 3110885223 +810804953 3977537438 +3020655633 3538399549 +3072708466 3072708450 +765218520 3848228453 +2539325428 3070787596 +2690468870 1559747450 2027859319 3180008017 +4108834032 2029270467 +3219958412 3463535422 2759565259 2911926903 1336308488 +3416241360 2033037819 +3023164651 2507288034 +3119887446 332063601 +1806577626 3857940386 2391790289 491266934 3857940405 +724597968 4150160100 +400348593 4224451670 1101292976 +3283314636 3748423201 +199838973 3175363156 +953366960 612618261 +725787132 1870335455 367329191 742848940 679379879 +3023018576 4142918627 +1850014037 1960271465 +982582109 2403879778 +2934191994 3410187531 +3121929103 860762648 +1593028450 3684505429 +1067622121 1883257934 +2998591999 2797701725 +999237134 3495487513 +918525271 3513626324 +1848117974 1057558257 +2015458487 3674531085 1018442690 259951536 1626505953 2134409338 2689447082 788685854 133746206 902872351 1249489445 2674824636 3081018927 87262694 522562143 3069651438 2619286620 409351636 3854443439 2647016879 607860018 4124033453 1166019188 1854869430 1151217431 388544966 1241417784 1222770439 2527926517 2893069847 351533815 454353904 3571197883 2280949266 3015387400 4053963031 2119919147 3020457062 3068858921 845742505 1236205213 3581765722 2514445102 3592210068 3412008341 2430373906 1713308628 880970313 3581128625 3386472363 3270486205 4127438225 1739669950 1934322260 3220786921 2851122871 2592111197 3155325336 3592128088 4246425230 650407530 321855518 +936892636 664328292 +737500887 2575586388 +2341800328 3530027011 2591201712 +751632413 2746690978 +3579086963 4002990560 +74080919 665783177 1806174958 2323198886 2899074563 565716493 3822442889 2323198896 3839220527 2899074580 +1129639712 515141491 +2660269695 1997155211 +2552473726 4263657033 +3461024180 3461024164 +1225519289 3066819390 +2526876268 334389101 +3003868455 32521334 3475786169 1831799588 +1940503438 2989644201 1940503454 3827015950 +501491649 485619275 +2097836172 1368568353 1268722758 +715370836 2203664174 +4107090199 1980817200 +2256567554 3192179253 +4253031565 2645357028 +399738459 3707535698 +3225357971 2435872794 3225357955 +2519317327 2043210823 3749320917 3982075276 3978936130 3576273272 3982075291 4149851471 1563001669 2973264718 3559495650 +1536743138 328877525 +1026417855 239016104 +4116494269 4260707988 +3951055064 1809322581 2468170652 2837229472 +2579151618 3384386333 49570851 1717136782 3384386314 +3905201862 3870214929 +919737840 1018726595 +3641513593 3641513577 +3012729205 617059132 +2105273093 350076732 +3765107868 3832260999 +3081315601 809851334 +2796912580 867705247 +5946893 2016941505 2000163899 3370392946 +3189470490 1597593579 +243103960 2810526747 +742527994 2785374877 +79724729 873112382 +2675794925 484894276 +2742719996 1442454439 +749980747 2381881525 +2170205527 4174084080 4174084070 2555236035 +115612800 1876434360 +840029137 2735763974 +36030179 621594064 +1436787479 3338982036 3885612326 +1500112626 3015085811 +2937414482 4037761541 +1196750176 2864596517 +1818790177 1132199249 3381649142 +2515622481 1542532496 +239464030 3113722515 43468416 3591781865 +3120527810 3849257025 2402069621 415722570 +2829859147 3649520248 +230245587 1839683628 +3377107388 2623761137 +4252840100 4252840116 +1514166275 373984444 +3007788596 2574384799 +3574561446 224269143 +4181408463 786604077 +3528586388 2869167343 +2588828289 2467947953 1785008406 +186152606 360889022 +1939429745 2681521261 +1587684023 2956764684 +2742357664 3057338221 +916740333 4055366916 +723747105 723747121 2287711569 +1283242346 4216884179 +1014872548 49275353 +4098613804 2789259073 +1809689810 2683768467 1693184378 +1644496940 793595223 +515244450 515244466 +4053366220 462039283 +2957143933 3904042923 1750816585 907237623 +755139938 1022884181 +2970678130 800013413 +2315607926 1939761985 3983334730 3161802449 1939762006 +3071635426 415178965 +350880537 90366046 +3285034748 65376423 65376432 3285034732 +2924601307 2186677221 1172530628 3893924654 3371774856 +1802209153 2605076480 +4215489168 107934955 2713023592 451004579 +1291223786 303044173 +4118279192 2211791309 +1175837377 2277029873 359095766 +2742783290 2508149323 +3343206666 3343756822 +934304859 94462802 +3541615700 3541615684 +2422220391 3219279900 +1928323743 3011036781 3500257628 612381729 3382814282 2392965214 +3050629062 3307264318 +802500062 714552447 +101717315 3461445756 +3235263275 3157429410 +268356556 4196061751 +2684376697 3341788655 +1204070217 1133729784 +1948200916 780144740 1882890562 3116977057 63915435 3244280096 3025623827 1473836018 2028896045 2828997594 2925251426 1916879808 4246639409 346787559 3103029223 2243548748 2584157663 899737874 2462247811 4087924969 +4205917126 2500725397 +1928650531 3423352838 3864432426 +4098613815 3396672665 +2664994363 1340326142 +1959014083 2480250090 +865385791 90841345 +1468387873 1028191373 +1068912643 1325397162 +2432625983 2432625967 +659025135 3308911662 +1898169566 4182698367 +2057417358 3099275512 +334028644 826082568 +2297336993 815004000 +248131116 1279648576 1950789441 +841825235 3851474989 +1259458430 2869535561 +3374932878 975681683 +194522075 462227922 +4053274874 3395950037 +2796644435 3158784684 +1976769082 3146342677 2570126129 3090804118 3042068829 +547248844 625536823 +587542233 1865090489 +816211640 1307816868 1520683839 +900765458 76580269 2533216581 +1694182062 1791854760 1270314297 +2835712795 783940498 +3821248418 4187208606 +2527536645 981928532 112129281 +587372397 2292376801 +1332278883 1643083386 +1251519172 844419743 +2464818886 211487137 +568608541 2002514612 +1630561881 4082264382 +2036283939 3540618000 +1450559868 2420946736 2540449329 367135788 2420946727 +645210887 2439390230 +1238319498 122790117 +2503083886 1270985273 +266143963 1855390878 +568776713 1320500379 1734743598 +2600827461 1594753149 1319074444 1594753130 +3858890146 3072476693 +646832604 2371521873 +2096357010 904349365 2096356994 +1034040551 3982051254 +3949863864 3949863848 +3822585176 3890298492 +2732274629 605191962 +3442337527 2060675426 3167675733 4131559110 +1032881215 696266536 +781263700 2725944633 +1906046802 2992769278 +4233379116 1687964737 +1962406041 3142566088 +3957188196 529998424 +3960512127 489259518 +1827315486 2472049705 +3996624530 2476423123 3371449782 243082630 +1314382671 2147342747 1314382687 2147342732 +2431649632 2312870949 +2365471409 3131076950 +394899874 1027377570 +766423013 3472811386 +4254772766 2426912297 +1525788306 2155227451 +2886425150 3061172426 2821038367 3878000457 +3260973577 63353902 331795784 533570681 3260973593 +3778762288 3228085635 +165154320 2401116981 2171694187 +4112175769 2928627561 1916372702 +4260040894 2246078921 +1962011367 4292135350 +2062778412 4266427712 +1818942882 1312482819 +1041090248 163175434 +777354509 4254325618 +2452206833 130870167 4082359540 331104228 4116222975 3867879683 171449309 +4267311601 1487998566 +1844621085 839494324 +1822658594 662431107 +3855831875 246157930 246157948 2497780007 +797161582 2004035892 737538842 208420910 275531421 979064121 214374639 1347327538 4178819055 214374649 +3654378578 3475529128 +705369949 1144168461 +1943394938 986233685 +3025955518 2877032713 +1628711292 1321029159 +3278407218 1916200135 +1878341650 1359430725 +4058103028 3669913106 2153139609 3126621199 +3650970674 3032785301 3650970658 +3876314309 2091682330 +3309439935 136156886 +3852622488 430315070 +4145694021 1130040218 +3034253630 3034253614 +77220843 232448420 +2412508075 152081972 +3908277025 3631258870 +876017475 1971797610 +2715347574 1267387319 +4082901738 67827277 +3738140132 2762157545 +3031708827 313446404 +275412324 3507214312 301083837 18852668 14323559 373216106 317861443 14323568 +3458417122 1955614075 +2204594816 1667914135 +2087346242 494241763 +4222954784 1580599667 +892265204 659251115 2899265049 +1698531544 937323533 +204021246 582629087 +3319928040 1793517867 +1828134576 3037169588 +3113677168 2560496469 +2280140108 1048530615 +1547077121 54228262 +3030666859 3383194210 +1779496604 2494838663 +3755539517 2677347348 +1994043979 1699130388 +551091027 4224220165 +454811080 3601813219 1960714699 517703792 +3592161566 2616258856 +2355682663 2421415283 +670969377 371367392 +2561991732 723544160 3644191064 2397483027 155829388 2380705421 4283020511 3221732126 +362095232 900897343 +3616521359 2422982363 2616097560 +2062099081 100752824 +4277626936 1001169314 2921649179 3762761421 166862859 1139305461 3694021412 3112658658 1910148290 469169271 3765513114 19309707 2791292880 2340208439 3250559146 4029501910 710047665 938838191 1605800800 158205051 1427945844 205755984 4233736728 3178994722 628500301 1840901285 294815991 807071691 1785912423 2074974491 2399943615 2306352417 4234485721 2341911396 2916291264 1573868105 3780647664 339799789 132756871 337497963 2833119846 1727604101 140321791 319479417 1597224830 2253538470 3342131295 1183131061 1155407215 3144104272 1382990698 3748649879 1807262601 2930326405 707119957 2833476581 2642433656 35083177 718009665 408023894 477803409 1704541062 2338907078 +300257298 2264180397 +1584405370 612057355 +1930935081 1465622926 +901435125 1450685139 +3440783297 2599234774 2599234752 +3182283740 1956113233 +2868471403 2901410958 +4128288308 1667361947 +3487744476 502738264 +2948606081 2224384004 656417261 +3318244254 3739627454 4168405417 4168405439 +1597148726 1597148710 +2139950921 336531438 +2710111022 2024800633 1813135790 2024800623 +4157349876 575386264 +3332169365 526967895 +3643794631 2909087040 +2847935048 2241093678 3932109403 2169515869 3996815220 2784963734 2937197040 4083107975 3996815203 +4131191017 2331760344 +2394597831 1627815666 +2424939355 2916733235 +56713014 2286477838 +995393338 1953531779 +2461151293 729935892 +1692872597 1827661706 +2854463558 3072131913 +3749112371 2965917379 +1623367354 1173076354 207609547 +2318835994 3563221730 +177887147 91415614 +4045879558 1926051030 651643514 4115613521 +2405537246 2596521474 +2977509065 3247570734 +4114290895 2779630363 915186737 2779630348 +2905231618 586822669 2610791978 +3488880493 490272007 +821573923 969011722 +1256920042 750933213 +823549944 1043927931 +4258704789 923519923 +2097622208 3108725529 3937051083 +2051103231 1944104062 +1409973490 2937256664 1752964948 4256812029 4240034407 347729965 +3791779699 2837031094 2678146502 2678146518 1779739813 1897367496 1008241178 +399871837 2920518847 +1284548857 2159673342 1579635055 2731408606 +2451107764 2973849689 2973849679 +1776446600 930142749 +3711048071 3519334035 3168677760 +4045613873 3700957341 3411869222 1231295937 3297014540 999402660 1231295958 1231295936 3835178295 1753291767 1217281363 3851955917 +2437683559 567016758 +4116214585 2292968936 +2643863023 3190217873 +1812146045 2247567810 +1186448991 2991409054 315567457 933731100 +2985633181 339793442 +3981701816 1395070907 +1392394922 4100085509 +1492272599 3697537382 +1946048791 2959490864 +1546695854 3467406841 +2038863172 2463955465 +2402257384 3943180309 +789844416 2514532216 2284900251 1381994435 3700945221 1730542406 2284900236 +1476875385 4107449851 +96687404 2732801306 172513395 +3329167687 2815963862 +2254244134 2859820737 +901887515 3463615455 901887499 +3726575137 3419842038 3639034449 +4134335143 2491546848 +2449275991 2498063303 +2556667384 3705554276 +3937883255 4049621730 +3137179160 3970604198 +3969332756 3969332740 +3116610132 3272718895 +3952536164 2610517104 +3791251569 2021316507 1713912669 +3634515438 3851040799 980234331 +2425662026 4094176189 2425662042 +2379125248 4030100991 +1132451251 4114442444 +3653641458 3303811315 +3591339059 761300044 3591339043 761300058 +3673329357 2027343026 +703491187 15333523 +3853811648 1529158483 +3781525654 1758030897 +1286820392 3863631083 +2453426410 233375336 337686355 +796209471 134689003 4101801534 4101801512 +1335598295 687335014 1335598279 +602881174 664559665 +2857062829 3247543122 170584581 170584594 +2781890851 702751260 +4198908205 697866692 +493315065 1120035048 +1830823985 4204741936 +765210839 2749424230 2518943305 1795454548 +2050448895 124805222 +2948981310 4092273310 +4221103520 3006774893 +3673770575 91224654 +389254106 1613047869 +1447379547 705131858 +3525688341 1603692508 +3513662566 348876802 +4205048700 202918951 +2291516076 142381451 +2991994499 1085788202 +882789117 3526364244 +1862454562 2495968358 +2522337020 571690595 +2314471554 2905171125 2035524110 +738776773 2209760352 +3804445433 4065711592 +826694502 4156678551 +1177575559 86504576 +375512305 755945318 +2454301401 586675080 +2365586772 1130425023 +1713975228 3922715775 340688005 3424397168 2396398833 1465646436 2272252080 3922715752 +3407162231 2012306550 2938303465 703757472 3432304731 2622027094 +919839095 919839079 +1990127922 3179728814 +3854518595 3957653287 4011873404 3487879987 4011873376 +1594245515 567881172 +1156254311 2427201923 736900000 1465386492 363890891 1818111934 2481914568 671203097 464367947 1626447224 1547583838 1644216398 3989699507 3448860928 3345954914 3588482506 3558582021 1693005679 2895579780 435943729 3709143074 2045120728 3354819978 3349504321 2962154154 312866637 2514652414 2343493450 2518282534 2459317930 2224449223 4266199377 3108572660 1333833674 1777497149 3416115831 634812059 2899671131 3977906886 1576992841 1842588775 3830527636 1933552959 478367106 3430964000 1174673999 3557056271 3449137895 3048537985 2310109382 1940180618 2487090568 2394867613 3356324976 1064148308 425173888 3718582305 979842336 307239541 3206731323 2115824437 3033022374 2508654259 3742047923 2382755550 3570078550 4084542625 644609576 +589552870 930397697 +2784848645 1391425740 +2498494903 496617258 +931203124 121446536 +2525290294 690708999 +3164796528 2586344413 +2533764011 723348313 +598759490 1438793550 +3581162008 501930971 +2483549466 1811983670 +3557809262 1123549478 2813348826 2607406329 1401986161 3666420274 1123549497 +4153395878 4153395894 +645104107 1926595810 +156049583 1584335493 3298017183 +2507156953 2731269903 412626056 1435385022 +2880451078 1281277815 +1983019974 3929876486 +4237893361 2517349734 +412048780 3158809820 3849982391 +888327971 2101089308 +1361991458 3992136341 +735109333 3469864796 +4057498129 4057498113 +3130758482 351014931 +1713053748 3286300831 +819296435 2467103180 +3539186659 2375938026 3329555143 3122467217 3329555142 4171509340 4171509322 +459249929 545122606 +1290168790 3837303783 2814905138 1810112641 4053624405 2949126108 1474931002 1793335035 1374265266 1495214848 1374265253 301083635 1997302834 2664785501 2063427552 +1761732074 1938754860 +2799675940 2988043288 3591952041 +959953478 3828140679 3112358550 3828140689 1837951034 1488600097 +3713619006 2980027785 +3996191528 2502407900 482257749 +109695286 2163496967 +3451123280 4090638013 +3198122301 3749131166 +2740714516 768457311 2740714500 +1591486680 1392614554 3152377601 1730420119 4105228761 3632986587 421909078 4294245482 2213255286 3436226107 1215089626 1125827122 1810825500 3385718408 1983654401 159952660 925592854 3389973731 3869377641 1007655801 2434488891 1960552098 4022393100 941365647 3018138531 3259266258 1232483455 2550824708 899467666 2637562826 4165028399 981796510 3579721285 4105773899 3272643073 +1167326218 2448802733 +177284793 1535112488 +1894336550 3845952471 3042753382 1894336566 +1548822882 3049530691 +1958155293 3228332119 +1247400663 3774871144 3798395001 +3403702240 678959803 +3339269116 3531892135 +2340229559 1289937670 +563342984 1675657227 +1626148614 3269671976 +98015948 2041497773 +288069315 3880471677 +1730330535 45331424 +969235565 2715341508 +419587579 1506183730 +2289887332 1207338869 1240003266 766919608 +2725536898 1060780195 +1741491191 1590285766 +3408392378 2313155805 +1496272197 4005791009 +4212012029 878434132 +3321709895 4105440982 +956245471 1433452623 +1410367529 732248428 3912363135 +3381032467 1370218490 +2129103686 3840115590 +2828407631 3007341912 +1519885743 2461204474 +4169392236 2744797719 +493528388 2464295455 +655175650 1539465429 972970313 +1586419855 1776216334 +1716734996 2830462528 +2201008343 1555233382 +4127334517 2218854924 +3862681959 2703693945 +1677846437 335521978 +3737478467 3737478483 +904144195 131803219 333134640 +3480202012 2407940740 +1481442398 1597890537 +701714581 1822939804 839421107 +1290378513 616710608 +3503920913 308221110 +821553695 2759836875 893750984 +1766061473 73387015 +3803176321 1540993536 +3355106918 904665729 +1408769391 2660652462 +2696255576 3619864442 817351715 2932171024 +279545451 2439849112 2439849102 2094042009 551192597 2782829172 2439849103 +1630843913 251095608 +431549136 1310303605 +1035431172 691509743 +1623588684 2746279073 +2835015416 4210661485 +283389001 3762497106 +452863341 2795470171 2750235602 +2857684805 2857684821 +2985995647 2793252668 +3900638284 1274266529 +2851626706 1677542533 +1114989814 2268048598 +2797015883 3174260500 +1463010721 1463010737 +3694019354 3067322877 +3351993465 4263678568 +694013255 1705649856 +1729449253 290863843 +2495715376 2639751752 3482964005 2622974130 +1156694870 4123246570 +1131619585 4242451494 +3668892561 3259206656 3668892545 +1179779616 3051759341 +3255096042 1738022813 1062338898 3255096058 +3531008451 3531008467 338820586 +2707933181 2959898664 +3488033944 1396813648 1617361635 +3390157840 506626667 +3761071092 3681835289 +2684390234 2648051653 2751724819 2713246993 484071478 +1785430958 893405945 +2113484859 2320729330 +3500060013 1354718504 +3657558735 78878600 +2034116743 1675218048 +203703982 3407561710 3407561721 3754831775 +3589315422 25150336 667194601 4254028179 +3947407322 3380524962 +1707752039 2757357600 +3122253652 3037465769 2868375064 +2664194814 4190098889 +2524603119 3517562424 +394414425 1528395550 +2517051572 4173165833 +2698112423 3514375670 +600967649 1151700278 +1481275573 2122038349 2990277866 +2910478681 348878223 +3621629457 3807970512 +614349651 953280471 4162282412 2085761709 953280448 +402555586 4030206155 +3093907229 1790636706 +57376682 4145374916 97748764 1051846022 521585173 +130700274 897721843 4066856584 799061932 853656537 +4000863935 644910782 +2060957623 412497158 +3518609880 275657075 275657060 4284452621 +3951535905 2005617488 +2286709914 949890998 +1001286136 3952136571 +2964776421 1767728413 351004538 +904961949 2651619801 2502554372 +2311370501 3853262028 +182392338 2603130042 +1427682871 1063709347 753326224 +1835516962 3830161725 1217900190 3830161706 1835516978 +1798855166 3350571743 +2316432793 4081426376 +4030717622 3233881217 +2707088440 2625262277 +736714603 3725010328 +1665364813 2418967090 +1840750359 776944802 4290509438 +2478864207 3875262798 +3157280366 2919161657 +1809267631 1926427768 +3608116697 560484111 3422948542 1717771400 +4147321791 1269653372 +2478490976 4010063397 +3945827481 3437738885 +4060119570 147636805 147636819 4242829350 627704855 2785000868 87899889 +1950929174 614540721 +1954847716 1354852329 +1502594271 1502594255 +3939911973 3562349882 +1361653876 471392020 2162434783 936855183 +3310828300 3187862327 +2409155638 4201132394 +360245454 2522124989 +1244837245 1255388116 +344650901 344650885 +4044612664 3125822509 +2913112045 1139315204 +851972171 1005692418 +1259546673 1613251888 +1084192611 1678637917 605235792 +4050127691 818552674 +566911205 150525962 +2142330835 2428279739 3073280190 3610892602 +2525206462 2938626079 +2176227668 2255707952 +4205189242 226002973 +105497104 4129062709 +2337716268 2240015681 +3499307229 943553444 2431209475 382725388 575206570 2011769009 2397654257 +3659789053 1670874196 +3529671571 1685529649 1525559127 3680163743 2333344225 +2792458192 3643767954 +4067739719 4107749334 +1477702919 2926230016 2449657362 3328845880 2121549453 2449657363 +2587759804 2344264679 +2246044196 3816658623 +1776250812 1776250796 +1362485761 3637692288 +3153232280 2402332469 2176638635 136097587 639125065 1289905239 2128328121 +1352689742 336423450 2602429869 336423434 +1158765829 2022863207 226328892 +583071872 902246789 +377059260 3235687528 +1264566241 1886972858 +4274292173 3881881619 +2395813067 3989597564 4068195893 +2629445550 2629445566 +1758961752 411745267 +2660980280 3867720251 +3855893408 3096052859 +4224932430 1347763662 3149342927 +2262478467 1783016423 +425238275 268391195 +894751370 2122805037 +1132280373 1931649386 +967475224 16974938 +4169507868 2450590855 +394034612 2791264777 +1873327454 2455580973 +3082129124 382726399 +3150956458 3150956474 +2014267849 3892379461 +722631272 2138902172 3803827349 +75416467 2639809024 +2748268915 2367204087 +1113223184 2510265963 +2424228257 2630755376 +322910057 322910073 +3843998870 1970939255 +3154860865 3920063590 1189128000 4069412534 3197727207 +3801760445 1977028500 +2398927949 33551346 1692167483 +3196878796 3274518049 1629461984 +2621876571 1581029970 +1294615796 1837796377 918522264 2384105899 +3633299556 390317484 +1301437477 528519111 3258672476 +355217719 2341566864 +2246811707 216874226 +3838350073 549412328 +4156546793 1488939365 441641452 +1636912983 3915431481 +2856931604 627745401 +593207103 3896225832 +4189694704 256382915 4288751752 3816653916 256382933 +2080021267 1048714988 +770584915 2700584364 +454295229 2836628898 +1308411316 3069270228 2028681807 +2982394105 3491508200 +511008792 180766157 +407009396 2762186383 +3919720569 2022805576 +931659707 639079268 +3880513223 1057644386 460970343 +2154641883 381493541 245041373 163384486 163384506 96161367 1815966642 +1568095905 3283588982 +1077744747 2191417999 2334598260 2641956182 2334598248 +3460724050 1181955129 +3742258974 2040663849 +1371614339 907612714 +2703084559 2703084575 +218210282 1670298957 +3127008721 3203616377 2023914201 1808513344 597777482 870731592 +2920699652 288029513 288029535 +762497632 843499820 3954480421 +826249869 2365867506 +2874987120 857687637 +558203719 2808981696 +2751509894 3005071851 +2574441742 2647784719 +3107767114 1855019186 3836177787 +3034669499 3034669483 +2918256695 159155856 159155846 705813562 159155857 +2297448659 2481484119 1698866220 +917190527 1768732768 +2787460922 4073036530 3702401209 212848582 1259096933 3333365835 3333365853 1242319327 3702401198 3654797038 +2062421031 3914874921 +2880048255 3148983294 +1450065278 2374683999 +2423735145 853323378 +2416817825 228263093 +2809893973 3428924035 1544181574 +655005004 655005020 +1645565228 2476020823 +3059387232 1888053285 2156495171 3603604126 1297019436 3059387248 1499463723 +3382916516 3493748483 +1855133400 3918329348 +48502349 2009583538 +200790782 3575719391 +1359096016 3477915370 +2815171235 3377327754 +1048714981 1272357498 +429250202 3772830845 +1486216698 1844211869 2452956294 2520066754 +2929504690 3324625694 +33914538 1640342638 1808118846 1808118825 471661967 2582349598 488439573 +1913540749 761020984 3755394936 4114841531 610022386 428396004 +1795427510 197041453 +2589389031 3812941043 +1946251204 2681580233 3331873278 +2916327682 3055980357 2916327698 2787538485 +1444571698 1706712959 2600498788 +869742406 869742422 +1825364281 1593586741 +1602626577 1898628816 +2097220097 3695761633 2420368423 120824454 3382886294 1793239188 20158758 2437146045 20158769 +2195628061 2246849291 1200827896 1986607236 +1322835210 1594584346 3814549619 +2646125587 3756369558 +3826226674 213766029 +3012925552 612300867 +349754508 1565956193 +1817609812 3761600057 757668776 +703575426 3787975343 601186698 703575442 +2131587321 1922180541 +3969167723 3641920372 +2235099873 50959633 +2455589448 1152103640 +1764549180 476033008 +2817820168 2112821211 2817820184 +2889298903 2190670530 +472387295 839870750 +4237138705 3508320438 +287507923 3441568570 +3266105915 4280723355 410567335 406321566 2659736808 410567355 +3808250870 4043533249 +3417271517 3348033730 +1811761545 3959453678 +3585206577 3585206561 +3199225839 512611640 2016357009 512611630 +3177006339 483632060 +3553654413 4264206322 +1320311478 2563034257 +2067658157 284927033 +2313071417 2923199701 +3552136362 4138971024 +2305635298 1551427489 +2631993946 1677043024 +1761449224 1209530421 2998647676 +2231826984 3429085780 2449198333 +1114048649 1114048665 +4166608473 39085326 +2316398306 1237696152 1455565309 +2728688640 361685964 418336035 149894149 2728688656 +3821798133 2401806268 +3416759536 3364045940 +1910858972 673039943 +2671418306 1036538315 1799565941 1036538333 3648423374 +796342549 3992759856 3443808416 +517734349 1632874418 +779381978 3159655587 +100716001 2959160536 +3387480599 4035924518 +1472766423 131515760 +2308265200 2249504195 +3558916656 529641859 +3363906248 3363906264 +1173882736 2507388227 +3580900409 950154664 +3254748771 3359673802 +3335459219 129460092 +1312834851 1378670090 +2946575136 4075288571 +2276459761 2333591398 1550771606 +1752443910 3048508738 +374686699 942464536 +4020697701 2833001708 +1245641850 1245641834 +3148194508 834619169 +556620570 3359161570 1415997931 +1178436540 4202244196 +1839229522 1839229506 1729800954 3850854163 +3505784843 2849279800 +2735544684 1777114253 +3418111235 3159624636 +939835655 3305011731 +1598710385 1931016176 +715368621 3433203780 +653122183 3480158848 +3447373597 2503662242 +2090335094 2090335078 +3442325288 653743083 +869946913 3249903072 +1549362910 1114440959 +3314144175 2801286254 +2951618801 3839744880 +1756842170 2051635665 +1038824354 457328661 +2456763516 2806124516 18626353 +3612852236 186864375 +429847438 429847454 +2222823644 1840751185 +3170323551 3628939656 +2911763581 1535777141 +3664886796 3976922871 +3953690856 3796862251 +2852325057 3088265319 +2238758773 3675120116 3807281801 354078204 +3808324869 1456925489 +1338132762 3099220706 2832798699 +2376989043 2376989027 +3198108511 1980232235 +136502679 336908564 1709364390 2061689481 +1772277314 2370482677 1335232586 2370482659 +3483795215 3069524826 +3065661741 1933391905 +3861785830 3861785846 +2769961979 3814261796 +2837232916 1279108719 +3959049287 3255178198 +2866924881 1383478918 +2815912414 370911337 +3639765226 1872439373 +2476444935 2022283353 3406833171 1692336640 +2975053588 865670969 3077582446 +768774374 3949671421 1865880113 4005275930 142219777 +2170050473 1192361742 +2314964671 4127307454 +2519890276 2071006564 1884646744 1951757211 3581220969 1884646735 +2247115785 3795524152 +1950701808 4180345283 +1294766939 2369244364 +3245297849 2106739337 +4100278601 4100931304 +490475159 490475143 +917813365 1508991501 2474532906 +4230240545 238571254 +2824280582 2938934946 +1118835287 696029071 +138305177 138305161 +3816521998 694954265 +3108707229 1044143844 1312585780 +347799003 2103287748 +935367192 3693476813 +2257439977 3011304815 3124335320 3124335310 4137818702 +2924597588 3201075001 +3491644895 2124938782 +232147019 4080220412 130479285 +2894265373 2939347362 +2513266517 3156728812 +2260265538 1461241333 +3741782549 363750573 757167882 +1241645527 3491268172 +2209851005 3734404363 3608876738 +221640304 4006345972 3677079666 1005777475 3536572615 1926612744 997876761 2185649335 2187116232 3027467211 4179994444 +2824628731 828316350 +1113975495 675158483 +3390811373 2531721116 +163362794 2535493866 +284404591 3756357905 +2679217345 630834134 +907172894 1021772585 +1469564460 1469564476 +2820421051 2106027679 +2818345855 2190101953 +740555860 2997520395 +792647137 1089122592 +3164740665 1549382303 +310380203 846042680 +1856063093 2632051260 +65687744 3923582533 +604260773 1472196282 +4025097146 1034299747 1737074141 1737074122 +2380108255 852271617 +2433544552 3210741437 +4147656448 763270419 +1173974817 930953213 +2087579856 880471356 2087579840 +421024200 1811956055 1324192812 +2705671427 4077632762 2705671443 +3166220703 1688508490 +1745921974 2285372305 +2939821938 1249869925 +4168856769 3955067840 +3032664605 2879663028 +3568929838 1052156666 +2411375426 2228984053 +723159394 614341600 +1852069224 804418219 +1997332944 960985699 +1984834207 3691845697 +1311260172 358198519 485142459 3598485976 +4192323952 1220676969 3463453507 +2887871562 1491380645 +3780499598 2656760153 +3298687048 2460822900 +681986290 1708866189 +25656085 2101789194 +616049347 2431340796 +2525881861 107026906 +2899270110 1376525929 +386104822 1531696594 +171322036 3343202649 +3007596169 3178957240 +2785315114 2358133125 +599496182 3034603141 2201770298 3260270017 1328865235 911020625 1424643274 +907172872 1289307440 +2767483751 729038359 1393582962 4041881209 1393582948 3115565160 1393582963 332507936 +2523899269 1352852839 +2629242313 2629242329 +406861354 406861370 +1944950931 3444549376 +2638412261 1970234234 +1995934256 4240610699 +1996625988 900026024 351557432 2325432125 552888860 2622239497 351557423 351557433 2622239509 2174433540 +1969777884 3614705996 +1308827958 3364381462 +534105267 2005676010 +3761380913 3017956919 1548992726 535136048 +1098565023 3007650120 +210381135 2691896355 +2635420594 4203921715 +684348005 2608837868 +419587582 1556516553 +2756327632 3262011688 +172016880 1946230876 +4037934095 4041460622 14935262 3466166363 3466166348 3490065569 4037934111 +2909027471 2434200795 2367249777 2434200780 2211140888 +957478566 2101823319 957478582 +797077588 797077572 +877460856 877460840 +3701629679 1117896248 +2926819232 3812135487 4044241214 +1878392941 2606605915 2906827652 1374951122 +1284380797 11570388 +3302150496 3632260180 +4294452411 1298861897 1287533438 +133857364 2442126992 3814196271 +1990660149 2899218579 685264439 1101586380 1101586381 1101586394 4261315434 +3800749860 3297815977 +2574589705 1491470712 +2604852980 1582404121 +3157546848 3157546864 +221663307 320909688 +136080500 3980377801 932459086 3980377823 2957996820 1399155532 3980377800 952023705 +2524112297 2145356056 +3322525292 3119197119 +2272821982 548799350 +1175655428 1409843807 +1280106960 2546320939 +1553134202 894678557 +1840750365 3574561460 +629337652 1503688328 +2121922375 1627407574 4087040477 1936472644 3246225689 1579706298 2087471218 +1879019725 475067044 +1439380708 1247107867 +2301487039 1220742012 +2346200379 1615803364 +3926980932 3166201375 +1239631844 885664745 +3499174422 1787117735 +250628017 1998176266 +1045729358 1830759119 +3075319318 2289603696 +507255177 2531510265 563884718 +1051152776 694507787 +1588974406 2395933585 +955017817 582122819 +1600230840 3734941883 +1087657428 3796049071 +3018432528 1220999459 +1270289451 1546960820 +3473110005 2696859309 3659012569 2696859313 +304839339 304839355 +2952616502 1104478993 +3773503823 773519679 +1140609555 2956215109 346374101 849803171 3357498549 2239669950 3144653256 1321210254 +1885328932 3148081641 +4233413206 2406346097 +1439507658 2875825246 +2001652137 2047309080 +3579707267 683762515 +3326014556 1619102485 1629131703 3326014540 +204658150 442353950 695980315 672943292 3273976309 354168543 +492169620 3249885416 +2555087377 3488241872 +3301293272 3301293256 +2933990396 2144667830 +2648650946 2648650962 +3922227893 3297206122 3146552054 +3720284973 1086232516 +182918526 2659356526 +2360144996 2360145012 +2245490417 1257285505 +2536259805 2536259789 +389485330 2645755219 +800892937 3032692300 788301358 428287877 +4185290350 595357487 +4159696266 4159696282 +1883725053 3176620628 +3047665003 1643511650 +179571198 2879031201 +953126950 2495605697 +563681834 235155483 +2147229315 940416712 1459156592 2748207549 +2168403880 512007531 +1794300657 416590721 +1091173525 3243307187 2174849837 2174849850 4156071580 +1591636872 3761233675 +2072563545 4077894623 +1270154425 3874909992 +734668766 3649017901 +1045243242 2104616397 +3679150271 3577652999 4102270076 4138290366 +1049153789 1049153773 +1408769402 2845206301 +3241513336 2673082349 +2895610974 277176297 +3676749335 352140838 +1940156149 14330794 +2075043889 3841115440 +1166158315 2373275205 2978863543 709731169 3265418828 1458044149 774459190 1458044130 +4104542835 3677797799 +3092711852 2982383040 2930174657 +97973221 375517562 +3364677591 2362505062 +3034103689 2592103109 +2769183471 3370807852 +633287988 633287972 +3812217893 3641243194 +849702670 849702686 +3031899597 1229187506 +3830331258 2303272412 1920524373 +1337364563 2128747315 +1291364385 3960850977 4052048696 1264497734 489266953 +3674653734 4054239169 +2886425120 4125024371 +1635608882 726533534 +1510232457 1036802744 +3168357304 3819287408 3453581635 +3106481050 2903177589 +2682427891 2763544972 +1636702040 938612128 +2341749881 862440062 +1151758707 627513565 1916492512 +3560822607 3482550683 +3614916864 3152261339 +3158200811 1092285684 +3901317078 1622168246 +2471004000 992812083 +1366825380 3596057083 2254093180 784508815 2170798116 3826277695 +4198084456 1355751595 +862555933 204229282 +1468859031 1778062256 2252340739 886749577 2252340756 +2998208207 4238693711 2041207594 +2784438292 1477711737 547418984 547419007 +3015579340 3225281335 3456082588 3261893879 +2061941719 1345958758 +292837129 2180022303 2200240952 +2475781134 1810707241 2475781150 +3944380511 2041281928 +3852080461 3544738760 +264239510 786096737 +2857369845 2012430345 +4021783491 345707389 +4293293763 2597123306 +1423297695 1753952120 +4218297521 2136418992 +2267591342 205573861 1782337774 2592100698 322190649 2921244402 +3077609514 4030695949 +1750890434 194020963 +2346470686 1238197823 +638091165 2086724660 +1154814969 1104813328 319007343 3889946590 1416524030 +970038497 3858363958 +3271724383 1543802014 +2098396120 3168957709 +578487983 4138435960 +3209808669 1254276770 +3308207546 1812547139 1376444588 1225446000 585114817 +2730919172 4258820591 +601249277 4124872817 +1052155058 2879324971 +3202576913 2545657172 +3696990342 1781603041 +3892638516 559317919 559317896 1942674137 1881615700 +2766678197 1316492515 2310560230 3913203793 3006629121 4212531487 3058167798 2679667857 +2565152118 648896721 +648226700 1591165303 +2914859531 2346868564 +857966861 1990043045 +1145900306 1224255550 2130242477 +2959332200 1502416575 +183238751 2424608136 +1317351660 2276197271 +1431112544 2823350309 +2689027186 3340023852 +2682691530 3058813235 +320314108 3217488198 +1115872788 3355679097 +1865883209 1556393208 +3858763101 1863649652 +56134643 929320844 +2259819862 682955378 +4128557832 4128557848 +3090613966 3090613982 +4092992235 1939541272 +3775031963 3498595363 3519926788 4120048165 1258396744 1258396767 3056056592 +3698177359 1337224014 +1154958307 258673360 1164196853 +128949988 4018722075 +3191247552 3191247568 +1035637707 2290835695 4155943060 +84287586 1252325973 +800140719 3270175345 +3585399617 2897553216 +1611599574 229923559 +3529080678 2296614295 +222774651 4161384901 +601284922 1231698481 +2749458648 3816106424 559380000 3554151437 +4244968523 455129269 +766248295 281053336 250565528 1288470838 4193556437 1288470825 1359676508 4164236799 281053326 586758015 +4004779837 2246165835 3480616814 41981186 4067070498 +2029354036 2658305487 +2855800843 3464794763 1134025869 145132078 +3796729296 268242531 +742213717 181358768 +2861700968 954413461 +273257674 3786032691 +1073937464 2041313245 4239592493 1488394961 7979450 24757056 4208732883 +937379464 3386472234 +1797202340 75929741 2606323452 1935325914 2507132022 3528829429 1509797981 3524479411 88361622 4280534591 4157278066 1618936201 2359793067 2697374252 3284276561 1108035071 409718783 2604798372 302696157 138957669 1457443884 3288914540 548240511 1578873949 258938550 1305650411 395142550 4285725101 4204794071 2681585224 3925117357 2384528839 694047712 3683356049 +972017704 1552199421 1552199403 +809880616 635462379 +241449845 482974012 +2443681976 48365997 +672230132 124476953 +227100590 4092144830 +1277495632 1277495616 +1402842697 3929627886 +1544820690 3023821497 +3325338858 3325338874 +1985945363 4109947287 1790831340 +3287051277 3287051293 +2478303210 1954682203 +3884940232 3493122672 124198115 +3490068179 1587765939 1705209287 +3809994229 3788664787 2907573146 2907573133 1939800234 1939800252 +3347571387 3588877426 +290394551 273510964 +4068255205 553198876 2971110343 +2508911886 2009056537 2447586959 2447586958 2009056527 +1974375983 827757853 2576086906 +2629635918 194975695 +3548083081 1951850680 +3925643292 1956043783 +364096885 419972447 +96569534 3450487561 +1638613095 664166966 +178161953 100125597 1001319215 1796239200 3751933690 +3129955330 2980134691 +2298149956 2767324420 +679670009 3866782063 +3904763229 2962353493 3221832034 3221832052 +111083591 1544261427 +3201253 1033858083 +3015649262 3823885241 +2946403744 1147355272 +3048434214 795875806 +2820032412 2820032396 +2324925233 1464081958 +3058212095 1838670506 2618289729 +4145114075 700857184 +32316350 3326258198 +3596811346 1081905977 +3354245751 1766600496 +1736457536 2420746011 +3879616205 1176339297 +4144203695 3844047717 58328300 3205218257 530311087 362534907 2506024600 1903016046 2631353269 843845311 2489246978 2307823726 125438776 +1161004800 4028466451 +653792311 2408043142 +2347093665 3687073654 1811709638 +1810130146 964174273 +4128124078 1639655546 +2416835974 2809269122 +2015458481 3249210376 3252119515 1351903619 1013837371 2593391814 2239917806 3663321401 2906025674 652019948 2803596947 2088832442 52737666 4020062027 3833465088 2245149927 344140912 3023658610 3482220153 1736611595 +3231439429 863723626 +2558755793 1264889718 +1159540320 4133577867 753926451 4233833800 +3577830747 2620818985 3724717342 +685671385 685671369 +982034058 982034074 +2708770063 964300440 +593453607 3592913782 +3989829257 197031935 3889915538 +1780765125 1589147075 3026674666 3693918476 +827140255 827140239 3829360459 +2401695220 1314205455 +1292330025 3451600276 +582798600 137752611 +3190697604 3870505439 4112775023 2895412676 +3282673263 3354450362 2049359837 3354450363 3028803265 1814473175 3282673279 3354450348 +400100929 3417403478 +551936103 3312878803 +3715562261 3075293706 +2658422832 2702850965 +2423795278 2983882815 970896190 +2713617858 1626116213 +3720779650 313267101 +3367444260 1927596857 474351039 3591776878 195788477 +602591456 1681230295 +612563249 2871937062 +514629948 2244071793 +2998985426 735647597 +1717089236 4053997241 +2048255931 3950758756 +2362021262 3894656658 +808391190 4283044394 4028201137 +758932352 674226813 2289057069 3054543507 2949510334 +1594347010 1594347026 +929124534 3828485767 +3360908380 1438645511 +944717474 1186961667 +3707536974 2704296399 +2959601749 1730074271 +216711436 216711452 1636689377 1935728928 +1227677754 1227677738 +552207434 442810477 +1880678740 3408574255 +2778596033 2025739712 +113525570 3957921870 +615550069 3680671674 921508906 2705544730 2705544717 1828108115 +3919961697 3609300776 2857460921 2756795178 2852043931 2737850350 2603629396 2100912003 2721072728 2243316361 2756795197 +257244547 2788152618 +2005560659 2292213870 2179602860 +1061216729 1814268040 +691748629 4249112074 +2984494343 651821145 +3146330346 586678349 +1855039635 1855039619 +2077970205 3216032747 +954078638 1083789806 768071727 +469637002 2600406573 830691503 3922800775 +1243292446 320453417 +3264004525 4036289362 +3585999687 3240044758 3240044736 +545710799 56036312 +366559441 3326264701 +2106393128 11554960 +2791330152 1008532355 +4046304933 2102670538 4249588551 1631691619 +2514143200 2327624831 +2312993021 626333995 516354441 2735162182 154029883 769602316 2732196109 2524524606 1113414624 +232707629 46868676 +1484396683 1339839416 +1633490178 2362143365 +2112341655 182608387 8267145 +3602678249 4089479640 +626116600 4035165076 +171817273 1479185576 +3969425953 4112531014 +495037615 819538847 +776918405 1796874316 +1799125368 2510359044 1211316205 +3296033054 1659742783 4213375294 +2083178126 4131857422 89559449 +1580156568 1261988901 +705933532 2638244901 +798362624 3912557573 +283368150 283368134 1823571687 +1378257009 3904230678 3282618864 4064820983 +3248181538 3917527178 +133658208 3405291376 2786606555 3754411649 301964580 2979030264 2115402998 1085853217 1866698347 2793447007 1315643482 2695116681 338495258 2766429470 +1429383615 3720427454 +2615876928 953421450 +2927713880 196454884 +1761626661 1175807609 +1213221735 1030140716 +1597132995 2671059708 +601573046 3544800522 +1508665293 1508665309 +941130665 3508440857 4153885454 +1554097633 3010994486 +2679475227 594631112 +2848949567 2427372065 +1645744902 2982852977 +1786966143 914941121 +415088654 594963307 3496194188 2565794935 +808165363 3775163744 +682735520 2948862181 +3356798499 2092834576 +3910805150 2452277951 +1993468265 1993468281 +61114923 2994987349 +3154367494 4035889666 +2061902172 4227957255 +3502378526 3212589375 2945326654 +1543912301 231416843 1543912317 1523557844 1455049170 1455049157 +2161628977 80200240 +1233399938 3495548042 1025006755 +2446302130 1003624741 +2864435604 1504373743 +1415023301 60107353 +398752705 726585536 202559252 1235446620 +1057828368 1371505443 +2736937003 3013344958 +4131965786 477522810 +1663989633 606304423 +1958223647 1905754570 +2933219901 1995023892 +3894473356 4158509687 +2507723629 3124024452 +687168176 708690691 +3751368003 1096890474 +1260987571 80004570 +2522706739 3894171994 +130754854 4215012901 +2166224145 120518444 +3294784903 3881872677 3723494148 3994262990 3088313451 310545614 685272592 1335437145 2409757631 1420704683 2882642502 2038852516 4209630491 187385703 4275639244 +3305333816 1549190203 +645535037 3475992322 +3971036627 2119192282 2539765590 1844951852 1846089261 1224451671 1980310215 1862866867 1224451648 +1706387941 1706387957 +4139555251 3590345222 +756466972 383273745 +1000302502 2180000343 3826427633 2758202202 3826427622 +675920928 647180132 647180152 +302873595 1715088434 +1358303280 1134466843 +86726931 3423701696 +3650970671 3250894328 3250894318 +2922922741 257846391 602288268 2471800531 19128903 932276138 602288269 602288282 2282248412 +2104949651 1287603955 +539166172 539166156 +1542004639 1325188958 +3902885955 2029082986 +4025147969 4022479936 +919790088 4115041571 +836263449 2426151262 +956797750 2396995369 688948334 4243373585 688948335 1464774686 687962593 688948344 800007446 2713787782 3070916021 2814453524 4243373575 +2079651719 2306725011 3207810009 2845944192 2306724996 +1570075585 323303616 +3053184801 924105930 +1709668324 3755659225 +1223726594 3569100067 +2758430852 1342302585 +407587109 3455640032 1669604652 3151584087 1669604666 3808860765 +2659866501 730931833 +179455630 1688539545 4275741721 2232588690 +1179518044 147905745 +3826430542 1466872025 3995691730 +388257781 388257765 +1605014369 1445885471 +1616600880 1616600864 +2018485284 2304730303 +3272941266 1272146063 3156905696 3964518108 286462916 +826857087 346663400 +3604334683 3604334667 +243208895 306690560 418227061 +4236336579 1118214634 +3041888348 4199727376 3358828753 +360839695 3936134542 +335782369 1366819527 +1846179549 3584690882 +3461915922 3112738674 3559539643 +1078380383 2389432990 +1292841726 4169465353 +2503008297 3371093804 +885447106 1986668251 +971388199 1177591400 +4046655738 2130515413 +576236294 395655799 +3237220540 1477770115 +1973944975 2369727194 +848497011 4172657376 2951411213 276291610 +3722100836 2740772201 +1838687533 3011675602 +3072855076 1014979815 +1026193021 3369870197 3336079042 +3365341113 2126587944 +585668168 2279085734 435910989 2781005874 2788560845 808920065 2708016588 533163620 2160405897 1393056119 4103508976 3779080551 1959544040 +1056193848 113890244 +2689546033 1009584157 +1629890159 1578008760 +2206775398 1983531159 +555611114 2442231341 1426694340 2432896335 +2091949068 1443210977 +3095567707 3499996754 +1803066465 2413702326 +2801400165 2183879040 +2490120765 3814698516 +4246946142 3430927833 4246946126 +2377649348 3703314591 +1331750564 2576028735 +2027560120 4149949869 +1246624493 457930886 3854697220 +2300651128 1462734573 +2653088582 922246967 +533246122 3001949083 +2313591357 3062911870 +4119338180 1229277321 +390208069 255166584 +3820874826 3004504561 3677869680 2436386291 3058083488 +1541976054 2134339542 2392425804 2134339521 2941186762 256179333 3318556474 2773286983 2610534867 +3276460210 1166321107 +3652416552 3716143851 +979172321 4254304695 +726863074 4227332074 364726211 +580427305 3845442151 4281883116 2671835800 +2516598456 654497332 +1836971766 1397474641 +645982195 1002791151 +1335811932 998871937 +2243560316 4292049959 3008726321 1994171286 +3138635274 596699951 +4242867440 210159061 +3619616908 3619616924 +2954516590 2809738553 +179858723 2171188359 +257059255 3585895184 +332105060 2372074623 +2729475239 3268688608 +1103987751 3147022899 3179743584 +687488772 2247177055 598981624 2247177033 +2428153058 1219815982 3084789717 901289981 +3215754247 354558013 +4014435206 862864375 +975433521 3079768614 +3923249439 1041652680 +178558257 4061584422 +2104148107 1683365854 +1886425460 1966406041 +4160667343 889610180 +273306436 3909161993 +2136486578 297376333 +350871599 455862776 +869946940 3702898791 +3052880199 3141255894 2131989587 3141255872 +1635862845 4011030449 +564114455 90734640 +3010424673 1691944255 129873735 4220185990 1580551809 3469355388 76217268 3647755680 +518633076 518633060 +1884853946 1685492078 +4083911043 3041491242 +1456194108 2288155651 3904630764 +1014366320 2927334859 +1145622467 1100943338 +2785203157 728987740 +789729270 831131606 265543751 +1665422858 1830553957 +3799299960 3799299944 +2748621901 884909348 +3777227385 3834256488 +1732810961 3571613875 +430625471 618640962 652853929 652853950 +3316239902 1679918053 1093687145 1076909523 3913305498 3913305485 1356134058 +647719883 647719899 +956946148 2927446249 +3522204937 2260376878 2260376888 +3497604638 2872867010 1618595685 3275529864 959427431 4071167825 717063721 1288712489 2856089404 +2841222338 754563805 +4044490152 4279949072 +20858041 2919640894 +1758013734 447465175 +3876615917 3041374546 3041374533 3242705977 2096752040 2884318994 97887431 +4036792547 2843219274 +1217811714 1563413770 +3811050161 2197787951 +2343713656 3710677513 +40571180 4203481153 2876309056 +1768077781 1768077765 +2675980541 333035074 +220331941 1367699642 252736733 +2000085259 979503059 2624565469 3383980222 1876396540 1136032149 862655204 1147279245 +37792166 3114973425 +1034405045 2738418195 +1456361565 2439277568 +1628256967 1815541357 +3460424780 3540509843 1145909590 +2880184462 1035171730 +2231166913 455136448 +2543816741 3563960650 +284274163 284274147 +706345503 1709489864 +4055193048 3916727062 +824417345 2618227264 +2077234639 2880120859 +969883704 1342967492 960632877 +2738470683 3989687282 2011051323 +4273077065 408084398 +1011560685 1011560701 +2532285670 2167668247 +3413763693 3185950098 +4129187514 4129187498 +814941773 3295865636 1538916091 +3091950584 381351789 +559200391 2452873289 +374289702 4179423335 1152428759 4179423334 4179423345 1134069722 +2711548466 2671199411 +2934977902 1801479468 +32297497 956856846 +496968468 941942399 +1802319532 4107770172 3370979543 238116823 +1074653929 3202927832 +2382892074 2584360582 +3220060727 1527096454 3655470755 1527096464 +100082724 2767409694 +249267833 3700732008 +1212850509 444328996 +1068306675 2194258795 4269635717 1318193525 2894863327 2894863299 +2965005104 2965005088 +1054000466 936157189 +2622010379 292777282 +159963258 3929991491 +1129598589 2058850004 +2501148335 197502002 +2851791982 1678786770 +46126990 3791672473 +2083523849 1111305010 +156012631 4288045800 261520390 1605544909 4203165926 1591653559 +1357625150 1357625134 +4111064376 1139307460 1139307475 4136058669 4291866176 2819181200 2893589105 3158239569 3007240974 3220070031 +214164760 811705563 +27742986 2319961714 +1235174962 398164133 2981391253 254515661 1757463710 3187373334 +428961316 4234891289 1978603336 +2122939452 2971904214 +999495599 2005813358 +3015246675 1042149335 1061174188 +373684985 3837393389 46430191 153753064 3486110922 +100953779 2736748733 216776713 116963895 2056541396 737821658 +2453700324 528990441 +3623979723 133191660 +1899692399 2934129070 +3363081377 3306450128 +1686495942 931686161 105789617 +1052004765 1390180916 +3250572049 32281216 +2184996197 4024542608 +1685493491 430940300 +2971423279 4271202296 +2856941633 118681831 +3891241338 2956024405 +1321629891 3312458492 +1712699491 506612858 +1051045251 2969211889 +1070413747 588164805 +1256280897 2078899933 2078899905 +1289179291 2448679940 3074602350 3337613919 230970405 3337613896 +1810197422 2284356345 +2877520189 2092868831 +2636577806 405554316 +2463549878 2564416166 +3325793816 3325793800 +1468739135 3986552316 +1478634507 3668849614 +35335689 1506375736 +2353329621 3810149216 +374976101 2486012140 +224035542 3682334439 +763495464 3417082603 +4134967136 598434599 +176011967 1122826920 +3380079575 2235705684 +51811057 3448328550 +1468616060 1468616044 3044705148 +2951220412 240554888 801197387 +3917428539 1291240709 +2139158500 2617654271 +1677816390 3024544801 +703137546 3372394657 +3867174183 52378737 +3068915455 698909884 +4225813901 266573042 +3370852817 141279308 +3673485567 3229495143 1445255894 3527214113 3987637817 1744859408 537910556 2527902530 +3872495282 606838349 +292392583 4135018112 +3565841340 1374132465 1374132461 +1792818091 2007356761 2108252652 3652489678 2149197783 1620580708 4064113597 4094236526 2356989728 3010874742 4083209076 1437902662 390520479 912830306 3155570293 4065285411 1957883845 3831348273 1424595817 1375758394 1902331926 3670991338 1110306717 345360174 +1430168696 1430168680 +3287316344 3128965139 +825096290 4130854857 +2821451282 3475490387 3475490373 +1972258134 1693918833 +3917581451 2695225282 3917581467 +15456915 1359788311 +2366243193 2579515742 +2829881395 3131506764 +62138111 3550045032 3281603118 62138095 +1387003119 3349569851 +4271525559 2213145100 3261557362 96374554 2213145104 +1821431037 3841935956 +953134444 953134460 +3235948008 3959727107 2309303339 3559950800 +365337781 2504669715 +3835411359 2150128456 +1355032711 4247365337 +2169459754 3118562843 +2943507862 4226388894 856872070 +434941764 3930557621 +4041805345 1608596982 +2146113799 448502873 1712875008 +522831730 2160392307 +2042912800 1754582424 +2965164489 2224361477 +1658204784 334351973 2042321266 2059098888 2814646219 +1211193617 3064935878 +413626621 3432439380 443437195 1400889826 +3727410238 2968845930 +108614280 3103583261 +1595838080 1025135507 +2200699628 3511264791 +1629518620 3217240708 +3076718690 316250691 2560749101 +2033759767 1516202780 +1871643814 2620132337 +3875418485 388487996 +2028864424 112181611 +2053593843 1084366944 +3688848291 3186049464 351261972 3551145609 3281863050 +2069330746 736694973 +1175185668 3472258553 +2479446354 1842000378 4160199699 +3420349474 286761365 +3950155186 3250206029 3950155170 +3737447596 1543541441 +569741353 3721506268 2660364440 1016487095 +3744011785 1454223416 +105328532 1980753401 +2754286644 2748370393 +1634545469 2615237890 +2229953788 956102823 +3046939816 2374671467 +3024458526 3884357673 +545628662 3538596289 +3817594315 213793423 +344062077 3315215572 +1368930808 3790042447 +1337802868 1977820233 2604577480 1587970740 2561249044 3125376797 2604577503 4209800857 +355096115 2225451596 +1626326598 1637379486 3748995127 3872551618 +811160079 2582587889 +831566173 831566157 +4000979647 691542696 +4288048427 2228083380 +3047254152 1897183156 3672810336 3047254168 1897183139 +2335040298 4083690386 +1260607569 2577663878 +2025452082 1863591387 +1947632232 3846399644 3509654677 661604779 +408652179 672402657 +2218658299 2218658283 +1764536241 1113101232 +1907860828 1612271559 +322280732 3440690119 +1839421941 3788023270 +3705348596 2096574536 +143620528 702320661 +395117433 3720319786 3698334537 2348578658 2348578686 2199003324 +2974539047 1097671776 +3218201644 593336663 +3280630457 3280630441 +197129042 1532222445 +1076330280 1465511824 +1281774684 75465271 1505057740 +2824163897 2687846704 112870539 3516917768 +3731791437 1965241138 +72702090 2789877020 283143189 +147932931 3832727996 +1465855324 828337681 3392816336 +2230885636 1465855327 2253909708 +150554370 1360596747 +4198397101 3223165488 +2036069824 3418611027 +3060351983 381022510 2337290985 2516231825 4167744300 +3790226426 2647196317 +3576827104 2110407859 2378849731 3576827120 +546522145 3011464071 +3859336623 536854840 +2138480340 2075920304 2030049795 +582392917 420519750 +4053158227 2727701946 +110285827 1545846954 +3843319647 4263426718 4263426696 +216358519 1054083309 +4113057808 4268323107 +1545134653 942417428 +2465657012 247262041 +498717070 1501880966 +2526657819 788836754 +3557511432 3587215243 +1231271106 3841709880 +822663281 2716645872 +69540066 467067901 +2689830202 2642891357 +2182963579 971906141 +1205348095 407200638 +4018622139 3439390834 +3417507031 3417507015 +3937063015 1851684217 +1188599503 1925877297 +1608480827 2271900392 +2889895684 758932319 +3473717492 1200183073 +3501034956 1295398952 +2398068282 2804122882 +4049059633 2507983296 326211923 2507983297 2944108855 505543206 +4069638660 3748949065 +2302442415 3107370094 +1247378182 3098976378 39868753 282896993 +249744984 3809253861 +2605265377 1429833014 +3461475911 213289284 301603286 +141041061 3773213370 3307127517 2405617763 3773213356 3307127498 +3065688493 1424339794 +2503483310 125430781 +1962600115 4013945376 +2679048439 2684246900 +3571382719 3657639870 +3691113974 1292474961 2367544790 +2222443949 899204946 +2724468448 2207253171 +1464296161 3427044807 +2850181223 3594818102 +1373979315 4080512567 4080512544 2666004428 1250524109 +1161844334 1917325113 +1343893478 4281952023 +309618727 876606838 +4210045167 2403535814 +4012728614 2859462359 +82653256 157483339 +2497105597 187134868 +1390611080 57250845 +2196478860 2196478876 +1282182089 400559470 +3850643233 1427884870 +1241406874 359487869 +253172430 2405380687 +2689106668 1042684311 +3686729731 4038696106 +143159628 3133823671 878378964 1061206703 1990260511 +3545345927 2560225062 +48640667 1321116767 +1294545091 2577919076 +1262552486 492561473 492561495 2393404657 775560538 +724230086 3128837303 +486113205 2046802609 187333603 2778440102 1103360172 2711329613 486113189 +2667835933 1882596258 +297663955 3239482156 +746425090 195154997 +2545447089 2287560358 +2995895656 2715436931 +2030237784 3618435739 +557338096 1000517827 +1783087200 2935215916 +2632015297 597652209 597652198 3083245270 4183947574 2148248935 +4119503163 3292254180 +1495763687 1077914038 +2246811706 200096605 +3327725726 3694471337 +1809719852 2660701734 +3891487306 3891487322 +1542106337 1281763078 +3254143037 2478028802 +2885104015 1159922702 1159922713 687978898 +1960844737 3184449238 +2828103732 2828103716 2163443903 +3253864778 2583994235 4031188658 +2786809091 1186943216 +2990341823 3754491196 175141160 158363538 3754491179 3851798389 +1820408334 3714999311 +338020337 2548901476 +1503656372 3403028057 +2661748024 3110977088 +3328430950 3363595171 +282907887 1704072300 357049573 +1698191559 2533486515 +3461935226 4278763842 1342345227 +2935475311 3742814904 +2827738052 405468575 +2723113587 1429437431 1240359181 4127494924 +730055587 594344330 +1383569394 3292803571 +3351692686 199818905 +4050514939 1784830512 +1407769335 244363974 +788154505 2097164206 2097164216 +2247115787 2635017016 3829079362 283833845 +3695753100 1904399638 +2582145590 2128556807 +210369495 3375334041 2260982009 2311027334 3477785655 +1308664917 775807226 537047498 996103667 +3506470414 734747666 +1496816021 126272924 +3949299570 47462515 +3253763044 831719423 2667134928 +122361654 1760621811 +2434302931 2391188544 1016563002 3889623085 +2137826889 744553554 +672911446 1478009441 3352410802 617070535 511008128 509441846 2227326170 69380998 509441825 2553057002 310293505 3084933688 509441847 2043213671 +2492452254 2492452238 +1273101671 3686918454 +3404500896 3686346860 +285824940 2109014977 +455645146 455645130 +6299916 2740192737 +2262383834 2262383818 301642221 +534280630 4011223718 +2607116881 4055037328 +3736369371 3495163038 238277199 3495163039 389275771 1897545924 2452231337 372498149 3495163016 27943346 +2018408305 1962728470 +2061437344 2287024748 219948773 +3305865973 3305865957 +3263068327 3400341714 +915983063 3381088368 +3134713453 2397853074 +3035506897 2750038288 +1764742507 2150206350 +3014489943 823320048 +812361121 3933590960 812361137 +2764774691 2394873372 +3386590556 539897799 +4108931697 1368878733 +3511050262 1758719222 2278113959 1758719201 2426924074 2278113969 +3435169943 4121230217 +2910664154 2562258339 +2480213471 1539108491 2480213455 +384957243 1508802020 +2471393888 1149936933 +2904500513 446931853 +2264540252 3620158663 2109717269 2258946065 +3586272504 3586272488 +1023232511 29064318 +3631494869 2482131292 967491955 813037434 +388653704 2909225379 +215527955 1277187066 +1455092460 3770580988 2504660503 +2683144711 4200074565 3061167961 +2954303655 3680227040 +3435406105 1908621384 +899862459 4282145979 +404202871 377195508 +559216116 727393591 3232195609 621034388 1824468751 2348616908 604256782 1240933471 +1080671500 244202784 1920244193 2016113425 3876067164 +3868005594 3390559037 +989610954 1734446107 2043101798 265008884 2175531537 +4098760655 1430916000 1699357936 2131009905 2131009889 +1414473300 211375663 +2214099094 3297573217 +1139127018 1867374917 +592382983 1295338290 +2990171765 116345386 +2669035184 537177859 +3039434014 1329544745 1329544767 4287561022 +318839105 821977261 +581531706 581531690 +1233795695 872308241 +3437628937 2535987256 +884964924 896769879 3324729840 884964908 +1728893507 2083454844 +3659582371 2113585003 77631882 +2722285511 1965473476 +4252528664 4252528648 +4020106712 4020106696 +2214018973 1530471476 +639333796 2704945449 +141095377 1726665661 238332934 +1342460928 4140842003 +1917172486 4190471089 1917172502 2026281286 +3941957839 1950887812 +1770684805 2852774988 +2841140075 18344290 +739918150 214107009 +2587015523 633643854 +4035304300 246967063 +3857183310 975335631 +1318825129 1745931790 +1293058112 2485118163 4080345627 2377029368 +4069376529 3861414096 +755175435 3872538946 +307451898 2014507734 +3929127131 3224584878 3073586335 +1637932323 3543932444 +183738726 2743538561 +1694481961 3805711769 +4161717072 918702584 +1526911744 2238911800 +2464381537 2094729197 +3246097629 1920083938 +2718468299 3731838868 +1542912687 1959567726 +3567093452 2147169057 +2773935448 2773935432 +594633782 25215249 886408490 3424046467 +2989900022 2171093831 2989900006 +1287028771 1287028787 +904700260 1934471747 4273986459 36486271 4206875992 4206875983 1199706217 1626522980 +2138231349 2138231333 +3055578783 1410212958 +2542659505 2341208759 +2059138837 2846267396 356601439 +407950051 2031868577 +840109618 720940247 +2477386568 3162333771 +33843278 2062562009 +303900667 3891857576 +613277804 4092306168 +2057227522 167557667 +4163100001 24477622 +611056181 854645196 +1554892734 2744217631 +2266166163 721418775 903180396 +838959575 590131010 +2467988435 1706919212 +2325107168 1682680441 2325107184 +1272982796 2112285153 +2303002054 2795225617 +318077080 318077064 +3339869335 3889822120 +1315862852 3152602624 +305097038 4001892306 2034066649 2034066638 +2959512583 3095070486 +2185118609 561779528 +1107054287 4106664863 2803914434 3015907625 2497795706 1627219383 1357445181 2455848591 3992094627 2956421155 149239596 951985233 1428914101 3915542011 +1686287464 2161484831 +1925799669 2993405995 2818603946 +3127272882 1325395538 +3336837309 3591565698 2178035637 3591565716 +10448566 2969258119 +3700665853 964355394 +2462984372 3465155407 +3358026122 2685084717 +4228928839 4228928855 +3637065751 2758864788 +2132721584 3446129155 +67050318 104949465 +2149855370 1123576109 +734398765 3648068098 1440399289 458372334 334705646 364933572 3445338699 +1612275746 1777489301 +2556489926 1655786006 3130535855 1011061915 4245497095 2795177889 67973123 +826596913 3228157734 +390368833 4234893158 +478739952 1301979823 +2521078682 2521078666 671150973 +2622936219 3081809938 +1166440570 3970934795 +4106616488 1766788113 3154344632 2977574843 2977574828 +3793607758 1124191961 +494910783 494910767 +3003594602 639297374 +480847998 480847982 +169628525 580974427 +1351360679 1939302134 1939302112 4086536825 3612799652 +1095151642 1656048767 +3639860737 416582960 +2348051227 1824824196 +3495807548 1067801703 +390944381 733947614 +508538821 16577002 +2015149726 145566015 566214927 3007320745 3007320766 +3362697011 3107835205 +730483818 3290247590 +247004879 1514210865 +363003029 2761137820 +1190660367 3346416270 +3699240435 3415219894 109146341 92368740 1475500163 +1040385699 1103327882 +3903810313 738665093 +471139891 1746453082 +497944506 2742219310 +3942078134 4180761298 447871109 +1914461682 4148942733 +3493807259 1448173726 +11628371 192560064 +2644533296 4194196380 1400335253 +1875512029 29736642 +2581314023 468035232 1427279668 3939218047 3931451113 +887895361 3501194430 +2875068464 1904592933 1947635890 +12115245 1342451140 +787719750 797884471 +2560801799 2775084307 1328414464 +1402211068 2383235751 +3217661702 4033173118 +104076582 3266403466 +2392326038 256334129 +2713116753 3823312784 +3039560306 2789726565 +4022506363 1302718559 +1410588435 1137208301 +2206771967 254095208 +1755935636 1455485433 +1833420885 1560305116 831759610 +3398054867 2886194263 2861536556 +140139060 707877460 +3127462435 1808407312 686476397 2529146122 151714205 +3522894857 2538414638 +22558004 1373356249 +3452511126 2259258592 +1309698323 423814791 +4007521070 1786079662 895039865 2310517874 1786079673 +4178551807 312420990 +3495972656 547185309 933013653 +2839518988 2066178039 +1056354541 4200173113 +60854290 3399984813 1829308734 3351432261 +2448712131 2260067818 +375072528 1098808867 +2937766655 2519928897 +2885766386 1454440158 2920799885 2920799898 3087802611 +2938340652 3773473879 +4040961460 337432788 3734762063 3363734025 3363734047 2821108792 +1064935238 1064935254 +939591456 1225864187 1235105651 +3671414057 1674269567 2798981006 +2443965302 561585985 +916966912 134188072 3209274091 +690551682 3048155774 +2521261497 1264919102 +1970447154 360114085 +1600135592 650634691 +1700782598 2616250209 +1176283332 873117194 +3713514514 3514232126 3116413626 3116413613 2199720019 +2684390231 2043797753 +1236048695 834164633 +3701554476 4063126293 +635971185 1147904769 494175206 494175216 +356075474 3109848173 +3451087766 1735548199 +300305176 1114522803 +946036998 1365568726 91161210 671854407 +2970133843 2970133827 +2085408615 334135094 +1348368169 2914358680 +2797027910 2756416145 +413647944 404356427 +2709679385 1498529374 +420219398 2908263277 2377463 +360389680 13459331 +3063851269 2428775452 +141074131 263325228 +3183484400 2775523523 +3773358863 496857240 +4143258899 1179167667 +2469440392 856770564 +2686757528 2981662043 +1106595676 824962503 +125200901 641355907 79473329 3705968361 3295208908 +2214389301 4229850492 +3627424844 2838399927 +2209857980 2209857964 +2563746951 367827094 +1025448730 2657605403 +1655031144 1977716611 +1025382091 3133807608 +3063051630 3599686703 +1463569 875030992 +673827073 1622541102 +3957001793 3957001809 +3235006518 2493469010 1926963739 49878624 1221395474 1943741345 +1738492143 3159167227 +2819366321 1007861158 +2748719448 1108770180 +1389639001 3171941128 +1658376883 1314107354 +3520237659 2843295556 +2455489178 8384637 +3168146071 569770189 1755720052 224292189 1755720035 1718976496 2749145159 1702198890 +2106747801 1182753224 +1137458336 561716168 1642669420 1137458352 1642669435 +1183365333 3728406364 +3459163613 1886329570 +3487870491 2851756526 +2733536745 4241582926 +4068932064 20004479 +3876457635 1579017372 89088986 +1814702282 3209624115 +98688123 3180205476 3180205490 2397630149 +1045706698 504146837 +2757275476 2536792924 1178157082 194773295 471209299 33147434 194773305 150590777 1989533321 +1324239574 1309848993 +4116761658 2170650443 +2813538570 150068325 +3711925505 984358094 +2077829888 73211372 +1550777120 2609733240 1559312024 2289190892 2289190907 +671290804 2967153231 +2233567526 3345474457 813463166 84391213 1876698522 1196825270 872261513 +4113057798 1250935569 +2187138085 1569109562 +3732880531 3732880515 +315205652 334984063 +413081316 12865240 1694374695 4240722044 2793251071 3234581386 3234581404 2302433847 2160563875 1425932809 2171347916 3203941462 483493511 1308489466 3571266616 3234581405 +3859808939 3593745186 +2574004569 3729895198 412527678 689137039 412527657 +3014723728 2278632188 1873836725 +3047451664 30809379 +2741714096 4056975619 +3847113925 3208829452 +2342250959 2507215054 +1217654304 3848794861 +954375880 1421866187 +3244700532 3890413455 +76049173 935367196 +1545063880 2523169507 +931151730 543502659 +3850824393 476289646 +3888350854 3006735490 +3828461425 2872520432 2872520422 +286274786 2879217642 3196272579 +3286577302 4157307953 +2833838708 2165775008 +3302487138 3302487154 +4131662523 1750025316 +2560739151 2511126862 +1314946858 3003747370 +146099153 2501882154 +4228182618 4147791413 4147791394 365527979 +141720797 3375399124 +545000553 2353498456 +81738868 527182489 +3399804339 463944909 3029702860 327125280 327125303 +1060974068 725518072 24012974 +648355930 2697599222 804384189 618210357 +608023392 1340389419 +283428151 3787071085 3331452490 2476779670 1326802452 810721853 1326802435 3348230096 +3944818675 2726901088 +3944126943 2973672486 +429609584 3487447004 1659334027 2614868744 3487446987 +3617526944 258832371 +2508523455 527118760 559867430 2867295767 +857242587 1425834817 1250621892 2277329574 +1865146753 2199125504 +2617751169 556027136 1109744038 3062862364 1260742612 1289088423 +170530697 2495939826 2302872760 1741251999 +976778727 2380372640 +3028279808 3028279824 +3003377456 1583076530 2487810952 2487810964 +107437810 470933567 1546535752 1965976228 +3696137600 1337284755 +3465963777 935808128 +529561437 2195537749 +4101508827 520649352 +1128968488 378855933 +1480437638 865017215 +891946639 393924300 +531621544 4090262936 +1209192094 328942271 +770892157 3567998852 +3501749398 3043186038 677349415 2976075541 +4274791114 3296701851 +555348150 3520458375 +4170858381 3889302244 +501220121 547676254 +2568461203 2468997228 +2078647342 2078647358 +1479780363 1479780379 +2004632018 2239282484 958194333 +1858503633 864125446 +1864289397 1864289381 +3222851045 1275862906 +513163868 2190112472 2190112465 2190112455 +1444990989 1121278523 +3772150370 3694895049 +4206028277 1297033720 +511314732 639604289 +3120527836 2838287687 1612390390 +2495193249 744499043 2700189904 +4193222376 1543817021 +2031877813 1544681212 +4228928843 1709496726 414598402 414598421 +3137894546 5623237 +4203005160 1191311677 +2433466654 118912586 +3085942863 3969483992 +636001052 588461470 4141464565 4004369699 +597770899 3506725120 +1931257262 4250779914 +1004391887 2935564262 +2485957697 2204090966 +887883844 2475754249 +2573475082 1869543654 1392158834 2191111867 +1844624222 1931277545 +3749080005 2355865356 +1556635431 913164896 3553443998 1230473567 248878387 1213695929 210445783 248878372 +1798463053 506681253 +2122366562 670599448 +2301352217 151437896 +1430141379 1868715064 +3459158155 508398274 +339446835 2553644109 1520620448 213759066 +1781180599 3158618839 3626473478 +2317996642 73381441 +244357039 99980524 +343793514 3689750981 +2945704691 1489912972 +2383499508 2571268111 +1662541831 106900224 +2686091224 2233864348 +550368674 1178185237 +2317052202 2468777229 +3699305671 3805199702 +1761208940 34642305 +1915292243 3412512448 +1045215167 3519365537 +3055155649 2922344177 1810115286 +1855173562 3199162005 +2981022013 3356595252 +983127064 1465868763 +986931590 1434770978 +1101067370 3126903515 +375014170 1243062763 +651188171 517996341 +787347009 1014431590 +2043452020 3765345480 3765345503 2199317780 +1294133331 1806621888 3237198522 1689178534 +2085454265 1728263720 +1680791045 3401253660 1680791061 3460178493 +1333568099 2217976284 +4127495187 328715927 2715579117 1546983916 328715904 1546983930 +264531767 154866577 +3053417348 86169823 +1270823984 3847384260 +3635941857 589616788 +2919847799 1874112592 695307747 +3055899271 678903157 +1977832665 1843302792 +3548731000 2674033868 3470110469 +1145492666 2928218390 +3073683566 3589389615 +194522049 3778684500 3601074429 +2193905228 624924791 +4084881051 3702089800 +2441486513 3341121190 +1675631225 2875756002 4057855211 +1603455465 3261298501 +4175142108 3528004588 +2569014587 1215615986 +1222212383 1049723985 +1092339700 806998775 +551237065 907861560 86891731 +1127449821 2803509236 +1723732765 3661108898 +965940359 696864896 +3449258239 3716870871 +1876006041 2683887998 2293053775 +419587577 1472628456 +3232169889 3890506358 +3757640506 3991245939 1005795861 3056638486 3738863766 1005795843 4217555290 1005795842 377682109 +2594670046 1404550262 +3521072127 1636082302 +1203596994 2973064053 1509874891 1999999874 1509874909 1129535182 +2042322044 502437681 +1894705416 1879938096 2749583344 3491288971 1227729521 874212387 +2968387930 3769376939 +2429182836 1654296463 +3062997673 272830478 +3756113137 46945073 +2405264511 789695486 789695464 17038891 +3672517056 1481881939 +3396343055 2029862405 3178309262 +1469960063 2560268587 1819124968 +4240722021 2396423302 788654131 +1625975061 2785242140 +722279066 1604378731 +1978677434 1663651037 +3768533984 2058869171 +3452907098 3361791788 3687113269 4211269657 1462106045 1448627726 2649112460 2498113872 +3047539844 3047539860 +3822971416 4046513741 3461841883 +658248188 3213905841 +3550707113 3426949401 +2315792560 4209288469 +1298081855 3132325867 1049131521 197942056 +2692928670 1274328255 +555476790 1424816657 +1415778316 2774204837 +564314516 2268511215 +1052677308 2642711655 +2049553648 1067963861 +2748202968 3048112411 +216636781 3233993348 +3556880817 1873459631 +3281571481 2190293726 +367277103 2772313582 +1479063360 1479063376 +3999713772 936369815 +1887137108 1716329263 1147263679 3137426612 +1577278396 3142150375 +3758309392 3038632227 +670221486 2435554809 1072164082 1990827833 +2484491209 3894797678 +3339083247 1040572206 3560856122 +925633865 2465743289 593029614 +610088561 2948379632 +3791779697 2806328416 974685936 4224137869 +4120120713 3158236142 +1543073147 3077605928 2285070789 1151817892 3077605951 +4010081846 2061250321 +1196116070 2709715073 +1526405878 3133362902 793473351 +272688753 4146768544 +799269738 2167498449 +3254918338 726877539 +2412648534 3133605881 +3255696909 2298932836 669605221 2298932850 +4178813263 1759965006 +1722087338 3825506881 +1871178416 803845896 +2470564194 849124693 +2595981899 3761943572 +1316969431 2158958915 2982321993 1769837424 2158958932 +644743904 2945040196 2067658157 2815962642 292438043 +40523957 1047996956 +1507687529 3769293144 +3318803779 2202616615 2867167356 +2975990893 2857170834 +3264270204 3560844583 +2310544709 299242394 +3131107821 3360708948 3092267026 3131107837 +2098154213 482395930 3289572979 +3692596473 1940253672 +291267414 3051864609 +2271177331 2385810202 +1447975391 3159849502 +498752694 3289041558 +2102879202 848444611 +765081550 2546325849 +3511097359 3842649073 +991463549 2225003714 1644081931 2225003732 2283111778 +569464419 3958845659 +4012733382 324853766 1250771127 +56713006 1638399407 770686880 2706807795 958986646 1924613594 1328739834 2975249725 53692324 1437067994 +3133378788 3856471807 +1523026692 3961509705 +150457471 2635525118 +2057308589 1381168382 +2694220828 2694220812 +3685818650 4057406461 +3465686554 1834638992 +3667153499 1920836946 +2981803415 1609292966 +1701152461 1809003684 +2188788349 3337236667 4029339070 +3714733770 4096257630 +2059419094 312563697 +3932283484 1586777040 834513681 +1287403199 2336894632 +3178944353 2841710006 +546324379 3725861124 +3116800491 1587825890 +1809427011 2754192295 +402209431 1415003056 1415003046 +1390867392 2898481729 +1091138930 45972237 +1692946158 63029402 +1714908649 1714908665 +843442124 1192802485 129715251 +2958750804 4079919151 191248831 115532212 +3102617356 1032551772 720637943 +1825490857 3561517849 4068757272 +1251699163 1833919154 +989686520 2715490195 +1925945782 1820522897 +3270675584 4028806993 +2732681021 2782233876 438333512 +3483877479 1276371510 +229105486 4294745799 3428091219 4294745808 345006301 3907108011 2901678326 3310647900 4228768186 977488721 3443820505 3478424078 3443820495 3770350142 454195131 4058106585 +2817739563 1300852203 +3099091317 1061251882 +779242663 3820420786 +3811008651 1363072380 +1544644041 2405792100 2950808248 2556790715 +1590096018 1147293198 +3255786674 215864410 +776258086 1712056108 +3131778479 456198497 3635085318 +2983532338 611550117 +2273510154 906982453 +2878891741 4259966434 +943836456 3080058347 +3858890147 3089254282 +599159506 171360389 +3223590714 3226671093 3000012866 +3458326503 1439476416 +3139127359 3404905278 +1291338254 2120862607 +4087146065 3506344326 +1801980064 3032847347 +681720090 291496939 +1291135982 408582254 334768047 +1397982631 1711755065 +1709780830 1156792702 3423965439 3423965417 +3538484417 3318080448 +856985319 1348269494 3163342073 3297563027 576105188 +2196524337 924257821 857147350 +2304148450 2304148466 624014821 +335699466 2329760101 1767717766 +2875241167 2875241183 +1537777345 192014784 +3465236570 2135915965 +844609888 2685981221 +1759744513 3320668464 +512205851 713512580 +4126346322 2140955909 +368339299 4072793820 +1783331999 4090834526 +4266294205 205572738 +3809405219 2474181148 +2695766260 2040574240 +3710710037 494721965 +2998089447 1786353952 +416417808 581087541 +3368635590 3672365985 +2825215486 361952991 +4036068215 1780036482 1595482713 2020305614 +2949077735 350508787 3515703526 2576520595 +2168801162 168795707 +575396500 2439583481 +463225776 654216725 +2864676423 3427178820 956117021 4036481146 +4137107818 2585524699 +2164056468 593561832 2719423481 2719423471 +1667237084 1277666887 +3505200469 2229633517 709170060 3505200453 977611978 977611996 +866090672 1736798664 +4209577294 1100419660 +1277904557 2501919314 +4074404100 1374454111 +2993359464 3131890819 +602061481 652990488 +3563712039 2311186294 +3234845011 3659957690 +1727360122 2388247581 +4129399492 989018761 +1654036530 355931186 1695651493 1695651506 2462970875 +132328848 4204837301 +2612706867 1509517914 939783581 4020393399 2612706851 1241075978 4020393376 +1329889873 433661328 +3615390737 656604010 +3067625436 3067625420 +1515551761 1196555114 1167216336 +3016271851 4024456930 +2218531922 1137356026 2090898707 +249516784 1502580675 +46873652 2582627801 +3340227971 3984923965 3984923946 3752504814 +1522961339 2710435698 +534263516 4024223029 +3802524283 566349608 +2622256558 3126673647 +405947230 3531311732 1556492321 +3193158181 3268282412 +4215349640 3525918871 925785279 2633760958 +2679830903 3931551302 +2362670941 4223477131 +1425547014 3365459575 +1588276967 4001027488 +643371055 2369026542 +1328358668 323219499 2953925096 +1650287504 165708856 +3774942342 3131487991 +3771447953 1907798608 +4228638672 579445499 1202418887 +3641442416 729409805 +2597618828 2523730080 +1709780806 3021302561 +30672742 1187489175 +245109662 2645746089 +391277397 3230239963 +794785033 2621783342 +1105921469 4123402379 2432174044 1795635045 3854087961 1661564020 3965984250 2651411510 1362222742 3463172456 587738258 +2356609325 1429151387 4273530258 1280760260 +250804184 1618749709 +61269616 800899651 +1898305890 2157262165 +1171899123 2812293281 3689178519 626438774 2121610894 781520311 1324490010 1989718733 3777861245 220388437 +3346707873 2804673632 +3251270263 3251270247 +442633797 3801003133 +1122815542 4073871382 3945434612 3962212234 4073871361 670922511 2429067015 +1343469382 1426686753 +219869860 1912055961 +3946057211 2946101061 +1924408153 3935544606 +4026936540 1654733191 3048775249 1654733200 +1238588637 4245013220 +2158380005 2937550041 +3359448913 497355015 +4286369793 240373553 846950806 +1409175054 1196744707 +1334295065 2056078078 1269429576 +2340412139 2235932642 +1745680586 2523637243 +2213560571 1668827583 2922793764 2922793778 +2215462834 2464668979 +3410055983 3410055999 919997502 449674363 +1208505684 822090664 +3665076873 2124150472 1855708600 3665076889 +1571995399 2271393814 +2099008278 3210909665 +565611367 2036167456 +1976362838 2398479905 +1267856337 3351433744 +581428127 759911240 +3046415109 3723495622 +3391567852 889367211 +2859798877 3007993186 2684643650 +4055803505 97716877 +3753129651 2774647351 +3359361210 1978827609 +2897176657 1162504182 +2201701351 2594558467 4065079283 604844179 1102377958 1345694707 3292445210 2259923655 2594558495 930983834 2102951072 +3102743675 2633815460 +774200830 2731734751 +1526045930 1314446149 +4233655871 3704828853 3300424504 3860887471 +646177705 1251959576 +242206217 4233417979 3270819896 +2725310029 3229382136 +3451801562 3164058667 +148262463 2997753323 2650971137 2997753340 677195048 +2687239233 1716171350 1570159985 +1168321241 1168321225 +870011816 1246015851 +2032210347 1510920253 +2443445021 811172209 +2474054162 1923826525 2469983621 127334587 2913570418 3320522600 +411309338 2985113579 57607925 57607906 3334343990 +4009089262 453279407 +142826181 4067707167 +4067886482 1130218693 +1120770320 4284840557 +232240566 131137190 +1074756958 4086634626 +2230036053 3080041210 +2010145233 2342711650 +4138284981 739156755 +3526448027 3241948453 +1115070275 3820795498 +3120707857 1430095520 +86425439 37106691 3328558512 +3208730754 99226126 2415869085 2514375861 +2659969852 2659969836 +3206265199 1201990062 +9944560 3739222211 +3783705190 1831077527 +951587972 3452455881 +189537812 1312513268 431348073 +1350216042 454603227 +3445692740 2480588319 +3863153002 869229057 735008118 2826399070 +1444512064 230741598 +3852787281 3549034896 +33907842 2960996515 +3057641347 1821398163 1771664170 +3931388816 1922679715 +4135276823 3968809225 +2273600024 1835428827 +2152004318 1788131561 +742427435 1679923022 +314764126 3559796478 1708744063 +147007502 37626265 +2751205549 3536732242 +2127869949 2782765908 +3182588316 1005115527 +1914977399 638267216 +2178344251 2689260530 +74960172 882375767 +1272521197 3493936336 +3546942291 3546942275 +4236227939 838285253 3541695188 105417066 3758787274 +3266680725 417177482 +3840645352 1565440720 1189197099 3528478467 +2114299852 4141942241 +2017894596 1260209561 1260209555 +2389008814 4144578293 4185271618 4095231161 +2281844933 3765618202 +3064020892 467083911 1688955472 +3273599003 1158423172 +242770534 1007746993 +3014672046 1220061938 +1109123319 3448959843 +1735871726 3469613753 +2679048308 3565833871 +2643597043 2232709732 +478524756 981234479 +1149011337 1493579438 +2589716160 3199785029 +4107376168 2381275371 +1564592507 1234185380 2259707001 +1437941914 2253697643 +1908492607 2897021163 +559096408 559096392 +2146621348 2146621364 +1439732022 1297389585 +36309730 1160394255 1244602837 2452762855 +786320151 310901296 807652727 +3002700296 2969877812 3336626845 +2718784603 1980261202 +2605685720 1179794379 2605685704 +2145826620 115028759 +976827903 2802843752 +3148693450 3394566773 +1357492323 3269503964 +2568369189 586421818 +2558056480 641481331 1592634233 +719460012 78985532 770289857 681008320 1240191557 132202455 +1333620186 4235456061 2002341238 2508189109 +3975797083 3137580095 +206722348 2442925121 +1492657500 1789054919 +1560656356 716693977 599724222 +3393109885 3807908962 +3843600350 2212289129 +467341242 37823530 +1099892639 1207905745 +2840809150 4247642078 2840809134 +412890627 1562616570 1591052051 +2861139110 477876545 +1093417984 2560783365 +2627028610 2627028626 +1568866659 2554015434 +859322560 859322576 +2351170976 1018485484 +2323114662 1867407857 3547214938 2697356097 +174261775 1759676814 +83126084 280924191 +331630697 4034921978 2264792398 +445062711 2805961379 4189360272 +1037521348 1037521364 2999971000 502642569 +3652858442 1726603186 +2614581634 3590449077 +3998737366 1011646899 +3159743250 1291688983 +1884016509 1475585141 1146593730 +2779650935 1209351248 +788154507 2130719426 788154523 2130719444 +1461713875 4200164666 4200164652 +2985212358 3771626167 4040068081 3771626145 2985212374 +3340184517 1929608223 +2334233256 3382937832 759814220 1550612305 2241567201 +2677142043 3916640200 1304436882 1304436869 +3542378360 2469241287 +1736957840 1736957824 +2848285955 3877621267 +3387836915 3368049549 3575540108 +1088790084 1562529071 +558404573 1111540971 +296495856 1190397003 +911988013 911988029 +4020458688 1256277087 +384196497 1915374314 +1045497781 290610449 1437106640 +1764172152 10072045 +1490765079 4163748665 +2724987900 2886354353 +3188676217 2871337064 +29709106 3823172646 +2191198673 1796240400 +2037390330 628886155 +2460893851 3278715547 +4058103039 3311175016 3311175038 +86002544 2178335043 +1063765726 1152763570 +4062769812 4062769796 +714885722 3879560305 1990532592 +290372405 1945154666 +1081540880 2337713187 +1301308701 3013821204 +3435474854 4259426033 +3950296395 4089838850 4089838868 3741465525 3568133743 3568133752 +2824955866 3948313661 +3695376850 2406434195 +2714155008 2882775045 +1930076786 2344466803 +2209172744 1372603293 +770197251 2300744432 +3711018067 2284170938 +1706724597 328895130 +1061333453 1943883570 1659981220 +2239525982 3125592487 3019019180 +2320458626 1022993845 +2176302728 1849290613 +72599718 3071426138 +1450529862 1622387255 1909781638 +463237126 2845365841 +4198027948 3758906327 3758906305 1953788096 1351765308 2473829591 +4283802716 1339145415 +1801167175 2910340889 +1494909482 1857742875 +385371354 3005965493 48298795 742761078 2957995146 +2298932862 870936671 2298932846 +3081000342 3184358726 1861894347 3484242930 2539429495 2914171697 1459491951 1356289812 1373067434 2539429473 +2149203890 1532118323 +1023582993 384630944 +3495833161 1296227566 3581169631 +1679171996 718727303 +2338450358 1312510210 +3583567958 2511716209 +205321803 2398599170 +2956858766 4290506393 3989440066 +2325617260 2325617276 +3311215291 1822272626 2007319429 +2509636546 1026026083 +259731422 607521626 +2612667917 856286834 856286820 +4178769667 467327420 2508505840 +2921289537 2985412710 +680104546 3723737469 +1823710475 228109368 +3797159483 3300391144 +1874923353 904597496 791788073 1874923337 +3104066162 1387541138 +1616542779 3916534002 +205315692 3368988032 +3659652367 1917779608 +585826549 3975315882 +2970533969 188268432 +2671464330 878589499 +247808335 2407911256 +2275546456 3693582733 +1035098047 879258508 +1459295369 3604396782 1983992760 1474987167 +124163440 377306965 +2360360063 4168039400 +1501055986 1994044382 3401392914 3395259891 2272032154 2272032141 +3181345721 722447128 3181345705 +1503250531 360510665 1129861235 +3752273383 4213222070 +1598110408 3148843229 +443257458 156731770 +1358537601 2656145062 +4204668915 2046354330 +4005914887 3888403968 +218971451 3336004594 +3963325329 3843120417 1449101655 3843120438 1924969798 +3683920581 1716364201 +802251318 2090703633 +4140466397 4140466381 +1311974249 2474694504 1311974265 +377271384 3418269036 +133857360 3402885307 2627814616 3747085795 +1022351415 613506694 +1291608096 1787701932 374116237 974345282 2342713219 2664043579 2735432926 2477820784 2956309954 2541692983 3931248111 3242396282 834182071 +60360623 1808499948 +1570065713 2198373422 +4036896695 2146993414 +1988066023 1907259817 +2783593509 1422476858 +3016605975 602339110 +3501337608 2424000669 +373152571 143381438 +164076574 3565247550 2201666367 +2286619590 1411614881 +2664194806 2664194790 +2381968150 2290694113 +2211396443 3661262930 +752706588 3585827536 752706572 +879590872 1694969519 +3235975930 2656036821 +79084015 1520874286 +2222535898 2222535882 +898560850 2718501395 +2592231538 2904859493 +1340022992 1340022976 +306748317 1699543092 +2261410016 278298789 +1464092721 3622821677 +3402097563 2194642707 4291482362 +777320489 379832342 415410322 +4134581543 4192000804 1914415994 1154136505 4192000819 +24583476 2189621455 +1986983060 78316783 +3049618232 1575024955 +2543933622 1761519239 +338519073 3832848352 +3796251183 1669398510 +794307236 734732351 +2424016391 2038469910 +1998082412 4148708903 3880267031 +758892303 1142578328 +2771832423 3282417252 +1315909496 4043815419 +1502488385 2607245345 1740725830 +962591559 3249266259 2568523968 +476446677 2512462064 2308029532 2039587596 476446661 +3996282352 2872504359 3876701457 2606597143 2872504369 1652957978 2872504358 447461978 938703119 +400832349 4181927778 3333881685 +3563191758 876782697 3563191774 608340815 +2586573520 709273896 +511377520 822334278 +2358820759 3950353062 +3689981124 4292042911 +816059244 1415934163 +117311707 3706187972 +2679141169 3467179398 2479183408 2169783607 3316030934 +2854542451 672349687 1258752268 +1822439811 3101747994 +1374370408 662872890 +4178518627 1465797959 +2300639180 2867205665 +3359609505 3709064054 +1198807139 647852870 +401083020 2756217583 +3126621211 546847397 1819705800 1819705823 2055915140 +1294264694 3877340369 +586960655 1783073627 573600920 +2899766597 483423271 +1823258672 2080274904 +3920830349 1912253156 +1971702506 3953028699 +1371452063 2641840418 1311977566 1311977545 +766255847 3438997942 +612172544 2511618764 1892399365 +4085176602 1789903851 +2182098261 343366851 +1970645112 1614296315 +3530080125 1278355273 +2771028559 1358412376 +3821769467 3716213672 +2918194542 1056855087 +174612497 3022366888 938962980 2626868537 1270449569 870866776 1934572230 2626868517 741131917 1897351895 549484005 3216350825 204870649 2686814508 1270449590 1048938687 +514953717 1183368380 +1801921103 1650131544 +2669180098 2603635421 +3850471585 2971930591 3957986656 280688148 +4098144721 4098144705 +922719289 4243126793 1990458671 +1276931564 4031021478 +1809790251 1832472920 +4197303249 2802532880 +1412685398 1412685382 3337041206 +2183101913 2509638824 +2792797437 165603924 +501608120 3371617211 +1163825569 590071292 1223201012 +4083259735 2040816614 2515355509 +2045615220 2167903664 1186196242 49395512 3864890335 2785088060 681943883 2966217813 1930567735 2074914481 3781937276 1959292949 1562519676 1779371671 1386814272 4087391345 84694474 3788489330 1143568170 1076247135 4033484183 1861185971 3204131771 +1253471522 3208275093 +1743563644 361886759 +905010219 3520816981 1128353880 1128353871 368318388 +620194765 4269716388 +1064273310 2930188734 +287631207 2990012275 +887131993 203242024 +3207235831 3874856134 +3265085460 1904992111 +4080291622 22583489 +479056414 479056398 +4209405675 290500841 531032337 2234879838 3821050869 3821050850 3787514131 3878394934 +962676269 3406845729 +3093037896 2161715787 +2203442882 1357171933 +586469102 2367342152 708810516 4091694397 +3275476818 2837929477 +3162046602 3162046618 +3173287247 259906382 +2178761523 2723203404 +1719624408 1719624392 +1068986222 3150211635 +3016854469 3994562026 805729219 +3444263607 3739903637 20403470 4059554125 3834027536 102431512 1304968335 +2701664964 1198499247 +2529250763 2529250779 +853184127 2366525950 +2816180886 3566113319 +3547341610 504010323 59202330 59202317 +3386429258 3739232160 +4196988897 1649183933 +827792779 2699387064 +1450005713 337870403 3743188230 1071999073 +3349937245 2965259874 +419587560 1187408939 +248038024 722631967 +913830074 4200487829 +4058285108 4058285092 +188217501 2158609044 +509801348 1095594640 +1079096784 2731063851 +2428832136 1848508701 +4074981363 1321878412 +3962069380 1200718536 1200718559 +3187980590 1838386314 +742445542 2416602369 +1623366244 1319716223 1086175332 +2690944698 944549597 +2774125197 3343592818 904085692 2291914622 443891172 2324721151 1588477371 443891186 443891173 3646544882 +85174765 3817895223 +1212524992 2242525523 +929087805 1648382590 +2151678582 1522786247 2841200214 +4268802515 1585520428 +3463453534 1484461289 +1386009405 1239451924 1316466210 1854200139 +1864058866 2966514941 +1760635662 1753963662 1753963673 1715800850 1101448975 +3422779451 103705772 237801665 +1536814557 273773300 +1575559852 2181141719 +885034330 3658144034 3658144053 3725199350 1696498859 +3623894982 3462685857 +3155765351 3155765367 +1499758943 406300830 +1665415529 1665415545 +1287595372 1021831447 +1548992715 584613780 +1898982457 390538773 658980661 1807887654 1742052770 +3613571581 225102164 +3902108810 2907075885 +3891559897 3891559881 3690138793 +3718736709 864935322 +41143531 2952597263 3343619572 +1470780642 1410629610 1470780658 +3846186665 2365381646 +3346756161 1213520960 +3452598408 2109455901 1686259297 2109455900 2109455883 +2836092263 2888242532 799304825 2211934518 +3780082010 2434899686 +4030661927 1513430134 +2887485350 2676003564 +994503359 3178100097 +36973338 2451560957 +1567079368 3528235979 +2907828917 3870346406 3461491009 +2105480305 3892089972 +2065530567 2523829078 +2438547048 2438547064 +1003721947 152261842 +2437991898 2620657213 +1488589728 4260123757 +868260981 712090040 +4008074264 294600100 748878285 +142613432 142613416 +3890590341 3464887456 +3298640682 884356275 +2745900801 351811120 +3170797182 2850478129 +3068256298 261349901 +2551532494 931550553 3078114126 931550543 +2901567997 2758183360 +73963297 868340493 2375814908 2919094448 +2182016567 4102094982 +2291024458 1106401901 +2579112702 1965314246 4261746121 3238801189 +1263225745 411563344 +4269838883 3871815522 3677678551 +1726326030 159569167 +3877785483 1711486914 +3521180080 3402139204 +4186972130 3219271875 +294447947 3956696834 +4049515109 1561515258 +3535731166 3535731150 +3977770425 3977770409 +3789965187 545428266 1770899312 3826472125 +4074613335 2851284720 2043038659 205665554 +1915336620 2835105985 +2899615959 3921228400 +2082334601 614946207 +181800931 4059759178 +1067563757 412697348 +2658833003 2011371243 +3303008428 854040097 +3805724659 4027669907 1852548278 +2673116478 269336713 +1777361901 1347112155 4094813764 2942386280 2083355935 3338057337 4094813765 4094813778 +1785209445 3247175266 +1012019462 131461754 +1130305634 734143562 2908991338 1760376118 1890804291 +2524302839 459745379 3530767312 +1695625155 2072649597 +2983284273 2366992333 +4264190914 4264190930 +3714400137 3806353298 3539750221 +3820682559 3554663658 +2454338926 3101602863 +1625125191 3281605334 +3034356208 616006927 +1966840799 1966840783 1540769486 1809211422 +1682404204 2227281295 +659505509 1187246586 +1879201958 4189162817 +1741720223 2698418507 2698418524 3888737313 +845259093 845259077 +4110234133 3214268170 +3896518910 2600503263 +2032219764 612014280 +2018247885 749440690 +1179046097 1920645382 +2488321840 2488321824 +2306915123 3395885750 +3069810800 3571772875 +1489376113 90337672 2926240104 1412888973 4132257196 3194214401 1261890397 818977510 +1701255407 1611208748 2420916270 3024555409 1557814096 +1885094360 177009409 +2281250672 1644776668 2100067669 +3201940550 3066257975 +1075037583 1847590936 +465967557 957508586 +4105688408 3133307123 +343161252 3606494505 +425304427 3834018991 +2750882763 265160167 1879206588 +1801687390 2597942143 1129369854 +1771842991 254941932 +2563289121 2541878352 3516936675 2541878353 2767012854 1302982535 2541878342 +1617255390 2643435107 2643435135 +1322448279 985809181 +596330181 3108005907 +2053463639 76776166 +252193511 2845419251 2430306720 +863274284 832148032 +3793969835 4081164094 1793586947 +230995363 75772560 +2184619464 1945851619 +2123359314 2391043333 +1492749943 2279294288 +1124986808 1499793988 1190157997 1190158011 +4256986798 4256986814 +2117632655 1106609944 +4151670601 4151670617 364701583 1100528558 +2727913212 4065255079 +3152950235 3002835410 +3851386258 4023328721 4074941637 4074941658 3138372214 1373639749 1058638986 1477231797 147081305 886446909 1477231779 3508759758 +1836353007 3984379195 +3023019253 2616464828 +2345288382 2017457118 +1103456509 2261010004 +409822246 2548316007 +3552734793 2752748792 +2230316142 670488553 1392421997 2312041747 3748081397 1808999493 1495089768 14882556 2446748113 3485328037 1257792905 2615155977 4162127859 4026087614 3309648820 29988538 48658150 1066565151 3925362415 3948617066 2172710252 3908288216 2810701932 +3951172425 3719416693 +2898913495 218441821 +571999841 215091872 +1186084924 2257487473 +3265085450 458907911 1737215917 3155690341 3905122694 +152852375 4003324582 +320694355 1783315130 +3476029873 2235747757 601950730 +4163316529 2020800696 +1530337032 2679718283 +556921697 3141210512 +3179796508 2027500551 +791418845 527012084 +542049459 3315450482 +2907054993 1449786704 +4257315857 2111550898 2291551952 2472655995 +2089773635 2089773651 +2496061027 2496061043 +1335853530 3512398730 +904527209 939355631 +2110216085 829773655 1588192812 +2848812928 1885717325 +1830237432 3012059757 213053828 +828436563 2834310358 3356097777 4226562477 +3024296224 3770586604 3852504421 +750608595 3886770431 +2130441002 278907661 +548835311 247720593 +3503222683 3044862245 658909512 658909535 1354969348 +3264402210 699833432 +1240794974 206953178 +4273002196 3026327199 4273002180 +3665483378 1633654131 +3123684289 3657353408 1428222589 1538476720 +1932100904 2443560945 +568526987 3460744120 +3821050851 1798661706 +3462213846 3066909802 2998132977 942345142 2998132967 942345121 +3874718256 4014689675 +3279482870 1448189509 1004647954 +1170786260 1396504872 2937230009 +1586408724 371753087 +3161309555 331843596 +2997684627 1113546605 +2852939706 1804028381 +4116215271 4198918643 2885055391 +3788662915 2236864213 +2102912031 1885084872 +2532477603 3329113041 846717238 +1260382455 976993478 2081045347 976993488 +1440670715 2265395908 685827117 +3374061655 3996799206 +3505092942 2457380649 +2804368426 2962192514 +334020521 842453268 2803834908 +3906215156 2045350937 +1387791877 3134264369 +2103022646 696061970 +4131007937 1586890432 +386216135 1954271641 +3626721910 3259760593 +3284141637 306801770 +4114646328 1284618020 +4194541374 3518213769 +4022991838 2230516218 +1683925134 2399360921 +960719328 85961651 +1463649350 2614573601 +2246344108 1924257217 +2559698704 1326804348 1034862133 +1134039339 3101920600 +4005073005 965434244 4005073021 +1235944558 421348601 3153451570 1714944303 +2993367363 565310581 +3572692913 3950767024 +4221191663 47978286 +373432413 2923794498 +3733794412 4057955712 3292533761 +2219697038 3567073433 +3523358235 2316551564 2758703938 +3360974148 65772880 +4045961761 737042403 286250566 286250577 2818055559 286250576 3283632630 +3858334713 1562960276 2766956733 +1974123269 1086613708 +3387158812 1184663564 1990014919 3990130439 +486773176 156790325 +1731979569 3802654547 +1723234625 4064338240 +138146206 1157062555 2489146303 +3187127929 2111119092 1568769630 3335046639 2247377000 +2543848287 2360864663 2164487583 4162163674 +1508966436 1692633507 +296360240 262029872 +2396870563 2305881482 +3134873400 1573119277 +929285918 1343386687 +2855290860 3163383548 3590404247 +2498437277 186930996 +3653283851 839091572 +1976871349 851912682 +1728876212 160447721 +2978663003 3632041298 +1727146882 2436529589 +1455123273 3523863544 +4281093959 4190162134 +3188676198 423826353 2552562327 2552562305 +3183504764 837573159 +1262392067 1988193706 +1550111659 2335436121 4270871502 498677300 +125119951 4152518682 3158958333 +23262414 2777170269 3954412624 1311524572 77344118 1428967891 +1666793115 8228370 +1132603078 1835551494 1835551505 199428535 199428513 4130877882 +43338710 3875955185 +2952071770 1612979747 +3078821525 2427475866 +687158734 1208202063 +2668049890 1424729133 +1063923382 54258838 +2948028417 2661255583 +2917894353 2596823302 +793931247 1841499960 +3126451551 3355256267 +1297598923 1297598939 +1797202360 3679702645 3587327669 2282492891 978094269 2999430263 1894994184 1466642223 +2737621987 3263493706 +3768821466 3982950518 4129497443 +1353985054 698446633 +1837717647 4264978702 +637735560 1596416885 +2069966666 2214424941 +33334725 3854103820 +2569261339 2585635216 +3463324949 2119665193 1168799548 1588240008 2119665214 3540922687 1185577154 +3588182575 3717095406 +1288448468 1288448452 +1834653131 4036611714 649734453 1444950776 +2072378746 2562004546 +1314025851 3335038130 +2353526114 927418709 +3816539294 3117843647 +1103840848 1300364988 1135463442 3808407541 +402493741 2509823693 +1832822584 832650555 +2313922190 1008924155 2885104025 +3674203314 1926562853 +1765541793 1249903222 +2277596406 2875545425 +1323179179 1474145332 2247497167 +3868117119 1908776936 +46022614 46022598 +1416836874 4217349293 +2665944867 2970955792 +2299106517 2290451820 +34448749 3494431278 +1060287305 1422809017 +209802811 3936009970 +167682648 3430845939 +3590718450 2537352602 2604463065 3715642867 3715642853 1429979922 +3807948110 2385660110 2608386511 +3789098413 164321615 1488617163 2546887077 1911261876 2666548908 2446221398 76714297 3672444014 2446221377 1928039498 210935239 +3593604720 2001294283 2697771587 +261499456 3378807493 +3508489464 1053745784 +166943699 456735831 2098826540 +3542249993 1748599854 1054042399 1082856569 1082856558 +2842519903 690005770 +2915729643 2958353167 2160652788 +861904280 861904264 +2503903115 3323595950 +455214148 4203525897 +2209965299 1339681434 +3369668363 951234114 +2724907684 1822900367 +3271572199 3724036551 +2856360066 2242909347 +43602428 324800423 +3336491038 3602414516 +4144952813 2335164498 +2172739879 95154294 +649200149 1583540073 +3528906317 3176697778 2324164347 +507218887 2843005648 +3834622740 2507142761 +1089132160 2981079941 +3909669390 2245319566 717611328 759517 2043988154 2795177658 3863457275 2029513592 2163734546 2245319577 4284030583 3873614873 2146956940 +1792450671 3495603116 +2358555326 614982622 2358555310 +734278082 560414548 +1906245023 2309898193 +4182307624 3659320567 +2897851931 3324677516 +2331502339 197365565 +3028595262 1793365919 +3562612366 3596071311 +1583052095 2296452331 +1114749531 4094188882 +1276499637 481378112 +1426086682 2479077030 +940144952 1860817723 +3595496746 2528724370 2285852955 +2446624591 2446624607 +2173909250 2494029706 4240621109 4294035457 +4021352489 2090248334 +430321556 4103923184 +3715581105 1405166246 +4081162499 2151277156 +2229914734 2852966713 +3298640674 633518141 1755688686 2777722517 +865807990 3007980497 +951198116 1299273853 +3741299138 456836344 +1107723038 1107723022 +1240142421 2272082852 2400036918 2018503683 465818976 1722127157 1216720507 1018730953 3639765962 2732437117 3280947826 1555715439 1839401543 3962855522 3308263668 305826238 1495386948 2997722900 2612921596 2775193103 3242801933 94831169 864839983 3944034696 611661596 1227309014 3840715836 3318951165 312590589 2386780667 2884716241 2669165967 3990454683 2815103287 2611453110 2850199796 2782751524 2245585080 2795929577 2807852240 +3602234268 1210730064 2618709649 +1844122137 4181482217 +257243386 489206173 +1247433908 3224590159 +870140730 3792792565 +3072442485 3206674474 +3927488444 1089027303 +3854683651 2846945776 1534016573 +2510648375 1202510004 +2936080910 2359481359 +3205856390 1423116001 71156375 383704890 +1345270243 2045225168 +2143362456 3036780109 +4125866368 2887130445 +3290095337 2484239449 2672617678 +2902906202 84724302 +2788706115 3986173564 +2115305013 2953588092 +298048051 709918298 +1943138209 1435502534 +2173487348 3835713551 +3294784920 3417726339 +1272725015 2192948774 +3542816506 1725246347 +817375011 956196083 +60274337 1221885814 +1138994643 2474862823 +2973122041 4256831966 +1777809145 1777809129 +88101153 1698674422 +2149581088 2498346476 3529622885 +2130558458 2542799573 +1311567991 1311567975 +1229943615 2803002430 +2503946707 3313200954 +805162279 36418340 +1598710383 1897460910 +380224465 2118074896 +406510281 50429805 1142254995 623719606 223175310 3908688843 884500751 +854845535 567550911 +376685790 318294204 +3076224777 307241326 2918998830 2013716511 +3522006706 3604239963 +2580010632 2643900427 +694176267 764710740 +3919203784 2246603211 +418458788 3631837848 3886630441 +3101687216 3097254915 3005543691 2755110600 +3936249584 1932665236 +2102594765 381494948 +3165268050 1373468947 1373468946 1373468933 +2299455166 1381929441 2155166998 +637612526 3252787641 +3270949819 2775156580 +3346521540 3346521556 +3239994812 3239994796 +1597052947 707993325 +4129656732 537934407 +3419593834 3155114154 +1964298273 2046499921 1891869686 +1845909427 3606836618 1845909411 +399914213 1798653036 +3004524947 2109026924 1346265111 +2403307078 2908481602 +2362494890 1454827661 +1078264318 715268809 +3608275497 2906823054 +2865355329 2167138627 2622456688 +217363101 2608286364 +3560503857 1819832099 2409965523 4286288062 4093489453 4269510440 +955560098 1657643453 +2105218682 46424605 +40615114 2577019373 +1644513521 1062327142 332384641 +3114105254 3386640615 +3366414501 2223618988 +2079274182 2798586118 3750761399 +1483001198 907716555 2146348398 1267678366 1058715118 2096015539 2494522415 1208773242 +1569167717 2708896236 +2971986033 2971986017 +2069794572 1104883703 +2847301340 102192209 +2939820495 2809569486 +3020399837 2389567682 +3624627739 4032760799 889083012 +2114749716 2176155257 +3267348161 1424351680 +3559027628 2654738391 +3563178020 3822949320 +3660652572 1286307536 2538966033 +385474485 4180138771 +496843337 3884105966 +1787442316 3184672929 +2875244290 3410800675 +2534912146 1816851909 +980763275 2711083538 98864559 980763291 2442641602 +3427046501 4109736684 +3183383904 319104549 +1236158324 1236158308 175149512 +1336805330 3804190542 +1702327172 1057675465 +1322004190 4140895465 +3428155197 3885452564 +354044135 526435254 +810231624 2736485493 +93251406 882635218 3379827406 3312716957 3379827417 834482170 234233807 +3262297033 2873855032 +1804990642 253132851 +326968443 2449422642 +2726994691 2726994707 +2760918043 706426514 +3193250543 1481089455 3657234570 +3692840548 585925208 3833778025 +1623650886 2670683169 +4280351094 384349393 +3356370075 2302910468 +1135750198 3237588339 3346766097 +1089994651 1089994635 +2377999635 67078039 +4048288124 4048288108 +2082731646 3936159817 +82057576 454295211 +2381720610 2381720626 +4215502142 4051579806 +3571074547 110894490 +1849957256 3262462604 +3078819154 894302213 +2966758570 2966758586 159954829 +1492850611 4292731597 +1168088142 3896708815 +3695849803 1100823353 4205271244 +2354075635 2354075619 +359985212 51785339 +2509888268 2368984055 +2451847319 2785351088 +1845644672 2912944275 +3130882728 1843926653 +172339704 599206253 +957628457 495658924 +2806605300 1284210457 +2444618419 341866444 3755775543 +4016353931 2224068949 +1077895542 2579918023 +416253884 228574564 3277917252 3586543391 867404012 3400707313 138821488 138821479 138821489 2006310640 +1436054695 1227491282 +2737721386 1581877990 +996498227 324005009 +570045449 2246044216 +2840934596 2542382009 +1197725230 1633733807 +3852938512 2620072811 +3278282153 1057820927 1076925135 +2471996731 823763790 1222827551 1406117465 +2929338947 1592084518 2297467841 +3311175011 329644764 3393841223 +3898963170 3115778005 +3194178662 927724452 +170791023 2006978983 +1633482152 478337475 +1089607867 4162645618 +3751228138 3842319963 +2060029091 2471316487 2949408972 2471316496 2932631350 2832323025 +742404088 742404072 +3863153006 3917994041 +2396854099 957069242 +2719588651 1453823772 +1696689956 1696689972 +1735426948 1511983327 +2957610808 3420221319 +1269422336 476093189 +314773375 2606881067 135357672 +832188911 79469368 +1692152415 485894041 +568330205 1967936762 2371655337 +3895124658 3691237529 +3885613343 1532425180 +2912486420 1541499769 +306559043 113316220 +1510606597 3267955931 +137383582 3340752525 +1935713849 937268702 +3201961102 4282499983 +2076769838 2686340977 191373945 2887271253 2837977174 +653358315 958074356 +3356977464 363639360 886743867 1630461907 +3937023720 1374973739 +550303848 389675164 2286123669 +1157783155 364556044 +777627907 3322737 +1994730361 2747494248 +337686355 2665753295 1957904419 +2821004235 2104148098 +582464550 4226617930 +3638248962 1179690507 +45220021 3384968282 +1200412461 2989938792 3668557433 +3724384067 3107266154 +1542244739 3623978018 +411372125 4134490228 +979836574 3474907838 2387948223 +4128421905 3532103072 +3200022408 3400542987 +2716491836 2800907884 +3776730577 815470608 +3122525038 1797666361 +2717547556 558984361 +263455353 938783304 +2556374000 3722016839 3453102812 +3717789583 1724757528 3990202331 +685853137 732378128 +3831618954 2211159269 +458387856 2462631331 +566805418 3641443469 +1249026103 1226229609 2395727028 1769092752 +1472628472 629569659 +1813304280 1813304264 +689931512 3030274669 +1523602159 2715148859 +1610183603 3367051994 3367051980 +264764863 410128764 249761271 +465863189 1688749914 650204333 650204346 844008755 3411592970 +1190095425 1190095441 +384054712 3242234029 +2583243673 4232028616 +3171561739 1144677621 +1442203377 1135717734 +2828261372 1287448727 2828261356 +2412172934 2124555249 +1809847295 91074987 3502209640 +1462799231 3512841515 +258666752 1163485971 +3083852171 3878909396 +2174570457 3819221662 +3581801318 3021218152 +1715681315 517037852 +3591312633 455099010 4072539112 +530309438 2146109542 +3196936298 836733969 3909089976 2197270459 3674203306 2197270444 2803795540 1653524173 1499488732 746206293 4173528207 +527528974 527528990 +3401329568 4030213243 +936995901 675636226 +2522618578 2231253125 +3080957659 4054598354 +1225732435 1441441196 +2152256894 2878968234 +2136546888 2777400163 268742972 3242896221 +3054543507 3824760370 174704538 1535652851 1653096199 +2214696941 1302998539 +1474477730 1474477746 +3693899852 2720208002 +4213383160 3549713555 1347113851 +2242498462 139580841 2764960066 +3612585166 1515281945 +3765285005 2637861860 +2366979682 2054239299 +811041375 2646847695 +2673027537 4187790320 +3267917057 2197586541 2692829572 +1125666970 3776926654 +13361914 13361898 +870936661 226219484 +3730621644 2932377991 2452003996 +1179461987 242755292 +3466923118 3151139119 +1642471963 1642471947 +666480229 3998058746 +3163286883 1965426846 1865982303 4156891950 860271306 +532477229 2806623230 594933198 +1283911768 2811399140 2811399155 76851360 3496761997 +2823779291 3490931154 +3684812698 1504524157 +3829240472 3829240456 +2557318257 1702931942 +2975744848 2271475427 +2608435156 1208942911 +1459295371 2017547970 836733813 584822712 +2982848975 409257208 +1464895807 2999455272 +150777940 150777924 +4175012609 1101656912 +2205478672 18110012 +4053839995 1492716411 +2731839753 1570787640 4198730462 2438974318 2438974329 1570787630 2108653087 +2778374787 1474632304 896390204 1474632295 +3593408505 1608268745 622208254 +1221263361 2559639936 +2257996696 1989738587 1989738572 1490122737 +2060895985 1360735600 +215527942 1059077985 +2585356594 686060754 2347889883 +1606075384 2977952065 2565769845 +2833788681 2536034956 2817859876 1426123705 +1951191216 475368205 2611920805 +1180601768 1874616191 +3318059859 2835803066 +3224178820 1737087932 +1392227883 3443508660 +102684987 2913156072 +20357478 2811625114 +2282486199 3789167376 +687871006 2837424950 +1671157979 2841010386 +967229123 3512206851 +1601055119 1220731453 739977690 +2688111957 1306032634 +970177044 474869103 +3778090165 625180588 3778090149 +1962188647 2216095520 +3497660754 2183742469 +72722689 3554217088 +1106314040 2234430280 +562070412 2917586850 2968230955 +3710315677 3242621730 +2968537932 1092588469 +3819887091 2138781559 +1845683963 697408818 2637852110 +759664723 2594714277 +1278274855 403002486 +765355577 2015435785 +2567999065 1309677086 +3741324126 1797160191 +19322018 1914747658 +2698054188 1427309377 +2862340538 1297596381 +4149826723 699763997 3318555828 +62379073 459481686 +60781439 855822590 +1494072382 863486920 +4032037090 832839390 1756046680 909992917 +2935681779 1745646746 +1611339584 1611339600 +2109386624 1826768531 +1255985499 403521823 882741828 882741842 +2037564869 1260754184 4105000204 3989860803 3579995608 1188886506 4006638425 +2154989390 2185953231 +1175488608 2886119219 +1705357301 1606018445 4174642858 +2430059488 144187067 +2435788094 907500803 766912736 3410245769 530888717 2456097851 957833694 3410245791 2607096414 +2623036207 3876570235 +2579112681 508140279 1794944156 3909416152 +1645634953 4064401070 195359726 +891128274 1870656915 +1544067643 3176926206 +2150301520 330296035 +1144471282 1144471266 +138692954 1568635051 +395999305 356525230 +3201960272 3241978083 +2076254190 1682541689 +1184212294 1582649089 +3474191080 3418437909 +947294084 1100736708 1722019039 1561182319 +4217802980 4108718296 2792756969 +1944891684 4077509243 3221987881 770060651 2868525081 264751896 997892382 264751887 1014669988 880449038 +3938318460 84814631 +841261363 3594413446 +1704619272 4195984285 +3607756299 2411391810 +140968448 2452871628 +1820666677 178455676 +461022055 1123685235 2836347680 +482984546 2029841578 3171523027 236256389 2953413964 +752709225 1665292238 +4092564254 539269161 +774362522 2773701211 1851128693 3072473134 1119175037 1119175019 2421224118 +2730398077 1098464446 +3611318779 309366162 +1104309078 286062570 3860924983 +2251892466 1039683315 +2108638553 3617710121 2108638537 +790024428 4091709948 3603178496 216720257 3603178519 +3559027624 2587627883 2587627900 1121918577 +3346412207 2113939450 +1313584792 876764197 +2040076325 283362235 +1844366160 1738715855 1601539004 1668649464 1592397557 +4294870368 4294870384 +277094716 3850384615 +1283910642 1785032179 +310084088 4292185423 +573380858 573380842 +3793393318 1056894449 +3409837811 4090714444 3851966597 +378753655 15388998 +3115115929 3828183006 +366398242 2660796142 +3265101188 3790378719 +4033355394 2008556873 3410134398 +4275330190 3058545551 +2631429092 3434207231 +1774281039 3396087630 +548222199 3864896334 667065679 +760517460 2173595839 +3290873116 2369448451 1119183606 +195898518 195898502 +1776047719 215745590 +3735032743 486469622 +1620782015 1620781999 +3544842882 1016133277 +1447511458 1949474307 +900426507 2279178818 +262891733 2144733002 +2208988741 1990501500 +2022912833 1789766804 +3721979558 3799193431 +1865994603 2171710306 972089240 +876748932 876748948 3357093833 +3432309746 308652818 +1830085501 32823394 887234004 1015962635 +2109199363 1215653872 3106419346 1146935323 +2653556986 4130912669 +2650770044 3043348459 466023172 4227659172 3610293922 1672446229 1396093247 3010565691 1672446210 3047477006 +3369479592 254947330 1695091289 3186281335 3509182315 +270723610 2163640043 +548940915 3840794570 548940899 +1906364384 3223797171 +3920451469 1759564530 +3761007243 1894496450 +339206226 2470516639 1333264025 2935638632 3355079108 +1687341711 2535121115 3793018648 4275778252 219221309 3793018638 4275778266 1493628785 47921432 +396647528 876838549 +3546449190 448644746 746603822 604629303 1655964057 3905281624 1077012725 2102157257 2633363046 1206953417 2181611914 661035177 1736386031 2829792900 2894332539 5337114 763432373 352936900 2281747459 3324727351 480694284 2052605731 1636625794 1842161833 3217339040 1388560684 596009482 2314161616 3062583882 79086816 529327715 1528719639 1539590537 694095935 3156843134 2488494386 1948302220 2274498200 3522909367 997916218 1987921660 8092937 3106240787 2477761422 3749733153 1845000526 2782907845 2025441234 342449368 1345219701 768246281 3689143030 1149448269 427022533 2238910184 3782627201 2028823410 3106723558 396127596 4000403046 1055541778 1776803274 3064734658 1389414295 1870929668 1778434597 2897098000 1065449813 3401087143 3497326981 4260339692 4183327245 1865931260 3493724723 1327279200 4029201152 683001677 3049664562 2141275091 428633870 3895443598 821212129 2579991115 939413624 1488529239 2174247644 250336576 1660078208 3897439332 2552417496 2631836832 2102406600 2149294451 1722668755 2198227194 1205174825 441849945 805033649 3062032056 1918996056 193396284 669908320 3900232041 1642089110 1897713821 76735625 335385099 3364595526 419570602 783371746 3126151069 2593131387 1781856660 548626525 3271040118 3180664641 4026087767 748344208 574904931 4211630407 2831412935 3505404687 3138025310 3403990390 509373624 3828795291 1076034995 3260612413 2247018548 2577746234 1924250489 1169530215 680419311 2561010793 1991449963 1899237202 2711981346 1814049303 387120161 4177201975 2050636046 3010697068 347266260 707159446 2352327824 1659353538 600367531 2022279912 615561462 3097202639 1090551779 1987891738 1526371071 3300687741 1340406620 3697000678 2555311588 3836628472 2101263728 1406548655 4135447823 1517082093 2264671895 2661233747 1163775445 3312008690 1059764261 1231875876 2206765500 1102385418 1544471164 550064710 2165215134 2885685099 3300048350 1073133070 1045815451 3681063125 2692823504 3981029836 1130036776 2760609256 1351874053 2818625738 359696906 2787634502 +2542573125 2379250794 +2219129070 140627321 +935539293 625494123 +1186983875 589721596 +3607354143 2584867294 1262457546 +2053697121 3264165213 +1017653397 1853464365 297263754 +1104501748 2531246351 +3196272597 3181214794 +864362753 16335755 +1605899457 1875422144 +734528818 501231013 +358540875 4014094200 +1879140744 3142948423 516731360 3293071905 +3069915219 735194519 +3999474335 3748065628 +1153343021 4008331909 1695744210 +3054634396 460458380 +1132050647 1132050631 +2820914325 1161944732 +2631898556 2952312551 +4206326122 415730139 +1572007144 1756033323 +1825872788 3870353913 +1731105504 1313945253 +1569928727 3549470638 +2521579026 2886055507 3657377218 +2223636346 4154768845 +2526096163 2069849095 2433541277 696707100 +1048213063 1848004947 1848004932 2714251712 +3024247428 1215593929 +1050357256 2342238177 2521396892 2521396875 +1413548474 1549946827 +3382563612 2138264839 +664099428 3021818751 +553496680 3133569338 +2554677356 1470661997 554762775 +3538666126 2072412174 2535671183 +873392184 226306562 2858745787 2439998116 2439998136 +3881566892 1281036819 +1813979944 1509515626 1114921397 3387542115 1195489421 1849320174 2797905705 +454057066 79788763 1469343429 +2356128085 1757909212 2758069491 3156798970 +2548489938 1976261106 +1402598081 2051315395 +2049886300 3013961927 +3088253492 4193023961 +3850196290 2253207285 +1996660379 4095716868 +1530605944 3637150227 +999355768 999355752 +3727450829 2631901684 3727450845 +689689024 2109738741 3263304405 3747052103 1188990860 3244685176 3647348034 1188990875 3227907554 +1296337988 4169321352 +3529809027 3076678186 +19096194 1286869685 +2769572490 1761472301 +705271269 954572428 3796228025 +3677124874 2181063794 285379259 +390566418 763382022 +2424604364 1285567265 +4286853672 644852308 +3337105636 3337105652 +4055841793 753452624 +2663563526 4069907553 +162260614 2573824198 3214664951 +258248930 3993970022 +2755538299 3260587763 +3708744995 3728273233 +3183823164 4187113831 +2280108879 1086276942 +1945482683 2629803634 +3493924765 3493924749 3562680725 1936430114 +2909065359 2226409742 +1904398211 871148330 +2607441257 3603539662 +2043264870 3301059330 +3568998132 1199474464 +3923683715 3508664688 1023641046 +281368869 2343261484 +328415277 4257312466 +4073461777 4073461761 +1852137392 2039849493 +2404506541 1255985476 +3757381116 2328992689 +19088455 293895126 +1977381747 2853132822 3519840951 3239018054 +3062883273 1377415027 +2894619464 2348754160 +2215511573 4145255196 +182517036 1278118977 +2782172628 4097865512 +3372711211 1695471960 +481863976 1588742635 +2736391497 801307054 +4275882924 3004656779 +3017032879 3324518264 +2660963832 3028979328 +149691780 149691796 +4162709200 3013721972 +3542052663 2440827782 +3834482366 3834482350 +733502702 3241822905 +2341773932 654028823 +1125567317 4058126044 +2627813671 3101266038 +3108573980 491530705 +1911704687 3480113848 +2179923770 2179923754 +882508043 3647972436 3647972418 +4066723372 4258345275 3747259324 2065130296 +3849559880 2097397341 +1519865502 1519865486 +1595610156 3818963287 +1865786086 1865786102 +3633013936 2473558293 763900956 +4021561100 1806043506 +1123549886 711741705 +1280745983 727778408 +1298217928 2551258077 +562398419 2553288748 +1231994995 1832817421 +1787658434 1556146518 25085194 350129426 2126623075 +160944735 54822667 2597761377 2614538999 54822684 2030054280 +2899967509 2694415194 808123164 3718852794 558752051 +1508495026 1024483877 +313182130 177914455 +911394187 1864276747 +2715777109 667577820 +4054554156 4054554172 +1668943421 3592710676 +3220844163 3184358291 +1045251857 614916038 +4245722888 1570081962 4234964877 +1937295423 1937295407 +814152693 1501471420 +3252630193 1288453403 +2260452955 3238713563 +3435047693 1562854770 +3824319876 2588825628 +4052020879 3118983920 1260618609 +294878521 3828228258 +2205712701 710869713 2911556427 867398420 +1047642153 1980858510 1804427161 +2392023295 1370115336 +1448371155 3118015802 +1160091844 2378238904 +300839579 3579734532 +3092496998 2447050391 +1489926887 3020650934 +3463453524 1932125519 1316685103 2874822324 +3418367383 1450912934 +1019951224 36916784 +2786980618 2602938877 2786980634 +2805868842 1893387533 +4055365926 2862429889 +1860846156 3947193440 +4168291175 2808978977 +16618156 992863447 +2565823509 2957667123 3587044618 1029200956 3457757799 2637741754 2637741741 +858456000 4278480283 4278480268 2768400760 +767301422 756579695 +4266081878 2686919025 +742708784 3764202883 +1796216620 2291414972 +827589035 981109151 +1147382667 2333657205 +3383579290 366545015 +3952305506 990419285 +1180016583 1219057305 1808881362 +763101317 2049282237 523555162 +3988993499 2628534139 +1000366844 367835057 3648770727 +2882363833 760272424 +3801502728 3131459741 +620918992 316944227 +1445599582 2316774747 +4131594938 1706011339 4027047486 +2631349196 2408280567 +549581742 2500450305 1062378214 +3850008047 784836398 784836408 +211852855 400101510 +2912028717 2200225338 1776475859 +2639590077 1773805442 +325333960 1321042909 +3649797952 2171498946 +2213092699 49886788 +3292151509 3165710684 +754458034 3212207902 1414462797 2090254117 +1940829666 2587436769 1140990615 2587436790 3462481155 3479106244 1157768237 3321389507 2953267665 1684724870 +3527374028 3320110369 +3876301554 2841516773 +518557726 3789039875 3675337368 2796741637 +3247613399 2027713347 2430275952 2027713364 2073979496 1193747577 +1897074665 3926002638 4194444520 792237401 1897074681 +3484464790 480929655 +1747246819 3156057552 +591708513 2751624692 3862719392 2677194055 656248710 2693971677 +1865187125 940327036 +1774895915 1774895931 +1741519846 1316621057 +811160082 47177534 3001235629 +2677675387 2677675371 3129987250 1798978098 3129987236 +3074351092 1811582233 +2344574523 98289896 +503875671 2658050278 +3205890658 859320411 +2067060760 4242020772 204484045 +1907155734 1312773861 +2228984047 347193390 +2789705638 38258417 +500620729 3611107208 2837120431 +1848291051 1479629794 +3198583420 2619304241 +476445067 2219811445 +3123225832 4126906685 +34988318 1622380604 +209304782 1906587737 +2660934834 2403930971 +3987676810 3031241517 +1837244184 2077684429 +2207839603 2630509594 +2398694007 2398693991 2302531910 +2655297169 3070598736 +2841692992 3814716869 2841693008 +1499386855 2538050742 +4105824010 1252439227 +784126946 745692782 +3474272694 4149709613 3602315519 2006436760 1591144957 3284540401 423510666 1094259206 4260723357 4070702162 726034907 477305859 474695074 1799054009 2886842024 2736889694 2820439071 1988838287 643582884 1819780573 2209014866 2173962920 1175201598 1201241711 2737176036 4040871009 1405084890 4272991710 230078424 1923753808 3831299977 2811727271 +1874305584 1874305568 +47095506 1027867781 +3749360390 1907380561 +3939759623 2997636374 +1861450458 2202690877 +46939720 420268364 +2981785663 1540649010 +1650761263 325387246 +999495585 2186592775 1770926688 2698604486 +900426505 2245623608 +473603677 3444001890 +2498649107 2252009964 +3245050729 3680948421 +3364893298 3482936890 +478295662 1325117241 +2129503317 3657225471 +3137702707 3434101069 2629443930 2089426618 4261568390 +724869717 1490783196 +2388585281 1617712982 +837332474 2312418261 640702497 2454833253 3703070376 2239426287 1013713908 229868529 1361185151 979696927 2932151612 1226022046 3461996478 2478744779 1655282438 1315881654 859378589 2381199844 +1076272181 835184508 +3445436238 3445436254 +639252447 793854481 +1438029974 2332681509 2865242034 +4249231354 2705178038 2942588573 +4290426733 4293836932 +68094605 3306607424 1518862145 +3432981630 2626056790 +2208961856 2227139525 +2312856007 1814166439 +84145879 3158152294 +4048093900 11978396 +3205564324 1808729919 +1121894607 634800870 +2889615733 2541937468 +3433662951 2879846842 +2731861549 3026047620 3026047634 +2146428054 2465080712 2011083520 3111770299 +1999435004 2546313383 +3342899731 2914153130 3182595052 3342899715 +2147222090 3283589755 +664990184 1300418603 +3424204310 1638933681 +1309406653 3425924299 +3089243860 2069342271 +758352647 4071293529 +804525758 504112668 923553128 274586283 +3565746969 2896382046 +3708249857 4087817856 +632842286 2404122745 +1979471557 4236958887 2355327229 2168231962 +3739280088 3020233243 +566824203 1724093948 +1329112867 3032920678 +430111535 451634284 +2147131743 2147131727 +964362375 60937366 +1459642487 1821891408 +501498069 3813805916 +3511050248 3152179504 +833874475 1765384610 +170608211 3344094625 +622482140 4156791759 523784644 +1309026150 1729678513 +2060405014 1783631271 +2961389632 2897845801 3550814561 +400597768 400597784 +1290538746 387220465 2485903830 +3912203026 2217017142 +2524568085 2534567085 4140977930 +2622035993 3567831714 3634942185 +642623913 621225240 4114748686 +3802484833 1425064859 +4015365356 1102963444 +3335565733 3700127434 +3683679862 444011473 +3179856435 50985376 +1979355549 1450392116 +779431835 3178885381 3178885394 +1703058508 412879799 +916035939 1456240348 2145328199 +702982483 1226608044 +1740407550 1740407534 +3494152991 3248999900 +1703604709 3199912826 3121500426 +2100658877 1895229841 +1422647300 1164494063 +4080281644 963659994 +350499480 2067506509 +230656911 942693324 +3312203994 2740813611 +1776558954 4156824504 658965970 472104923 2714640814 +721840587 266072027 852963275 811341166 +1720650381 1036813390 +1169685843 1489947287 +110476340 2444707279 +1713486679 872245614 +1394162524 750285255 +213030134 1670646218 52976833 4078993233 +3650219424 1868089751 548999923 548999916 +858043206 3368433441 +2192480891 601691746 1228013375 2192480875 +2860002271 2543080438 +1661773116 1772580975 +3046753622 923903601 +4251109394 973119149 +676264218 2387747837 +1238904007 764357572 1182770585 105807190 +483247163 3824933307 3936360126 +1207437976 3816336731 +4150786556 1957595047 +1983763133 3763519362 +490832544 2921374195 +1748237552 2429365896 4191628739 582821451 +342638128 2540202396 1449518485 +1575589198 863111850 +2866879909 3877242619 1129235659 4013901608 2588478115 1675683044 4164965580 +449800592 3909738856 +1483421133 808893234 3729156475 2302617595 959891832 2604938132 4257591716 +1340751408 1340751392 +1081939867 535570706 +1396439893 1805046515 +3950833236 4044631196 516045191 1673995119 +4095253860 1797088060 +1186174934 582485479 +705483374 1298575386 +1936716100 1936716116 +3956593646 3880527026 +2138894883 3568381194 +2341572359 3219847187 +3813923921 3564471828 +2887694773 2307155276 +3761278343 929716868 +3796037876 593580047 +859981402 190103485 +3662841676 4180023324 +4021158852 1488121529 +2142933539 1636715406 +1561069237 787386108 +900465177 2529643848 +3568722231 277876148 +2928351332 687301993 +755621120 4066228205 3867600659 +1889166820 1688890840 2343308180 1688890831 1889166836 +1826037485 1134931716 +639198306 201644925 1543046723 +4110006980 1763771017 +2789144726 1819769207 +1278056172 729242135 3619984769 1241549820 +1382809842 832811674 +2933500053 3687259949 3584320138 +2837276512 387881375 +214532909 1312391122 +3279597401 320997640 1016355369 +1434233413 114339965 +1117420157 1840629620 690551695 +569741346 2542921109 +115612805 1765041926 2419516175 115612821 2419516191 1578689868 1578689882 2066812093 +3672625772 118278707 +1862363128 2805371435 1862363112 +2789151996 2974681255 +2224179885 2224179901 +836219627 1636739060 +2204709539 2609736854 1117038703 1117038707 1124412698 +2057915554 2057915570 +3587162073 1113536432 +3278303735 2450450384 +3477207988 2130324180 4175379545 +2231398656 1605493509 2852675788 +756626032 2505857800 1856661077 +2836145357 3944607410 +2819889655 2393169862 +1607251443 1607251427 +3615080825 3692428876 +297015354 3755839253 3904788374 +3396170517 437186221 +1059672754 2814360155 +1300529908 4221183503 4221183512 3316901013 +3720658310 4037512197 2812451834 470786001 2729859553 +2056316710 3403870822 404480215 +931038223 1797907352 +1461078943 3071871838 +3041513630 20146345 +2250345155 2311715440 3091031392 3925950054 1043230419 1950364372 974738720 3775274523 670642906 3533577681 3140123562 1404297822 1258353153 272680305 1203246458 2704656527 2572340353 380513074 418942767 +3002900815 3323709338 +1574820101 2759089469 +135616799 135616783 +767686914 1015381014 +15522486 4291590273 +3548197810 2685952314 +1593369006 801850607 +3142848686 3012370734 +414777972 207756911 2297775304 2297775327 3474023700 1597955225 +1481955309 2631223515 4203735556 2190309970 +3800227459 386156586 +2548019606 2871299879 +1564030836 890391439 +219509185 2704658268 +678300434 3314358714 3314358701 1681723966 3074125139 +2372043795 2769676780 +4269215479 2355924688 +1988913584 1326080021 +1907860805 1226386316 +438581972 3884786728 +3624699564 665399255 208931132 3350724823 +3969712601 1412032648 +222024317 3906370254 +1567788923 2432892673 +3716139498 2586499931 +3431966136 2921449323 4233408580 3431966120 +240660554 1120079269 +1359535337 1359535353 +305508702 143013609 +1227241592 2248564169 +2600059556 1903884440 2603444265 +2651247724 3286276563 +942264339 2923104576 +2354068279 1687058356 +2394871180 1114254199 +3592605138 721449998 3939107215 +4068516754 1384218309 +991980476 1880867687 +2428707840 2909419400 +1906500685 1849052581 812475698 +3449347651 3936740202 531109799 1119548844 4150369201 978673027 2404269745 1102771222 1253769798 +1936282413 428024987 +4204817507 2879701597 +2970106222 502425657 +1761131619 1870539729 +267919539 3600513484 +2424961232 1629337147 +1282911700 848644332 +1299433048 2166123046 +1172500226 50268670 +3159500396 3780279297 +3688848309 3583860202 817551181 3583860220 +297947169 162254727 +2688400028 3710698385 +2386804876 2158500961 +2787022946 3827950147 +1005467180 1005467196 +2039755471 2782216753 +4227012055 1990943078 +1111605506 1333974563 +1958112541 3626878114 4060908309 +3198388017 1994510806 +48238948 3691899760 +4058103010 2824624085 3546165991 +24412717 2003365060 +1473817091 4236317309 +670046310 1156999297 +1374056553 1455617358 +2328300847 2790899950 +2298037572 125593604 +2376895020 849183553 +2810564306 2309264531 +678300416 2772128005 +1271979405 3872179442 +2118208878 785179705 +2928745849 3360434128 +3521180072 1083975700 +871673579 3039779810 +2432623601 843109478 +4160359526 77414902 558086577 3097974682 3298919553 +2314910925 4167768626 +2080977492 2524592688 +315850361 2029424201 468719742 +1659373046 2839634503 +931325116 521016295 +1304341597 3809672277 3809672258 211327542 3236112487 2130761131 3223934562 +2309252485 3088462636 +1643460435 2282100666 +1816974453 1578618707 4059198506 179101197 3711406246 179101210 +146043249 621712614 +2200833155 75346474 +396989123 49416444 +3235511385 396392043 1558319061 338932312 +2947011220 2690114025 +1376390721 1967171869 +3166247271 366246259 +4260567295 3299891582 +3560188645 1921267283 +3338369777 882789249 4047161975 882789270 786598246 +669946630 569848145 +2752059950 3310953326 +2962000612 3510543584 +1864221928 1992662736 3252443907 +3654337943 2057768102 +611927674 3336400765 +77564704 3372046316 4158351000 3372046331 1730675557 +3392290972 3910907281 +1308629455 2569576664 +1583074126 3632335833 +3014269496 3449087003 2748283403 1253275844 902972846 1253275859 214386221 2976484672 +1987924479 2252870782 +922830132 1776821663 +4037699328 3695191301 +2959991587 3757871114 +1477962407 569429156 +1537797225 3018598734 +2440161619 3160283711 +199412941 2198365874 +3288878962 3453191206 +3023735552 642239362 153950967 4151184249 3089682713 +683581082 3188960381 +585226816 696947411 +3034164467 602889357 +1227533416 645549699 +2712683835 3279748068 +2459855789 2086895954 +2912847924 2224056793 +1588161761 3853936160 +4237122913 4085907360 +1006388607 1623291244 1839750906 1344627140 1174640384 3743025329 3621917069 728836819 4208161024 3436512466 485133608 235622684 +189212955 3691361668 3691361682 +1745743458 804144213 +831965486 1046393721 +3280696766 2458540553 +3322451802 3290623489 3579505894 3590113253 428229303 +1979625709 842337311 1352760132 +4277213547 228301077 1771150489 2396417934 +3246488553 2278952920 +3252368275 3205640314 +105679407 427657198 +1148292464 4125099016 396777611 +889223498 3160209222 3116298107 3801284274 3801284261 +588134704 3891194121 +3278388089 370515838 +1542192605 2441126626 +350857168 350857152 +2176778127 1967060504 +3720551018 3715126482 2216858843 3335228326 +3347684748 1772472766 1968723183 2023646356 +3517850820 1551529903 +3413360066 3413360082 +2093077627 3760291236 +3692052257 1744937809 3692052273 +266941259 1461436162 +3286171917 1695459172 +354611701 354611685 990045372 +3762755520 2465875355 +4009185045 2217342518 3989513861 3817850229 1778244654 691786008 3279624981 834948008 10336024 3072688893 2414488023 326757925 2475165302 791727363 2226044105 3527690351 392005414 +802346940 82418919 +1556453132 1556453148 +1176592001 2361080666 +1663398396 267546545 +3724104503 2824425379 2824425396 2793275280 +501498048 3461475923 +4273568928 4273568944 +2706968881 808849456 +3676531077 2109676620 +2428473616 819210109 +944708476 1736661296 545801265 +541292449 988860358 +240043163 553615364 +1505393924 2493321960 1008282105 +2000382736 3263793717 +1078822779 1585682675 +636229853 208239810 2410357748 +1863362421 1278713123 +2417737310 3386239102 967618047 +175769379 2702785564 +2315033294 3372069455 +735809138 1080995678 +682962852 178991652 +3856802201 4241217345 3412051872 4188618845 1411216737 4266877123 838000534 904125248 821222896 2586929995 114026261 114026242 +391470786 3482511768 3417330473 +101947873 1910193462 +1051769469 3981838178 +1337454785 1066401750 3853499889 +893167242 1484401467 +3185864684 3667669143 +1492850614 3376829319 3376829329 +3205406113 3392603143 2019517894 +1928390923 4231978050 +2742386554 3422006557 +1974016163 1046400391 3995061908 153090333 1046400400 3694250140 +3493981406 3049775465 +4033705299 3798900804 108310976 865480877 3478106554 +3766350881 2269597695 +48452288 1272661075 +80963692 80568855 +2200012319 2675163223 3968511400 3525962839 3875556176 +3829354885 3836571036 3568129114 3568129100 3829354901 +813665892 3167561577 +3293179246 1552819998 +493005610 2724082565 +4166102530 3935628597 +400832321 3712154454 +3884438790 1229408674 2089933570 +3132810970 3459868971 +1245939007 659210814 +3449960947 733669506 +2253621211 2075597704 +2608479727 3895149948 +4189031777 4189031793 +2169866069 870501502 3423255039 +2890477880 1122625477 1865972525 1863993920 456645388 1122625491 1900364728 1585296936 1122625476 3715695033 +4090246513 4000870968 111796699 +2435504823 3510428468 +2550147460 1340204060 +1763129377 2425183231 +2001603984 1001824545 +2728463011 2793651850 2976185523 +2522093292 2455770519 +2144112573 3959834242 +1061897859 3615514215 645922876 +3687632891 2736056940 +2208696846 1291899801 +1843320123 818523122 +3609179774 619464799 +3345197859 3535135750 +1418032507 2300047524 +2362881201 1681403385 721632740 +2922665273 2273714974 +152258572 1045839904 1045839927 1431988961 518312028 +718093903 2954434126 +3586981524 632603385 +3972276248 3502147021 3502147035 +1086650822 3155505825 +3577237093 190818137 +3587440140 2082268727 +75740 1025599030 +2854826966 2655405751 2588295253 2655405750 3034356199 +3461475930 1435966467 620378027 3773145653 3773145634 209221075 2826203894 +3636110151 1959725248 4071873817 +275346014 3561126095 +4020555995 4174906956 +3361508332 1706057127 1702614784 3361508348 +1929831590 2121410566 1242269169 2417982422 1396164177 +632267486 767239718 +1218510356 1950726527 +2907588782 2151442937 +2765171123 1561404730 +3912920998 175697638 +2007030100 3761448639 92010676 2788564783 +2468701905 1313165415 +237731506 7893541 +1821970719 334885832 +121140795 2564955890 +1006042218 1068950681 1142817491 605859092 3857308895 +1530283049 3876553614 +2542399803 3374759908 +1653524183 4257416294 +3270586702 800103897 +2407302161 35326383 1434859652 4060341968 +311390406 4258170785 +3591134525 846645012 +3915383900 3190217937 674077968 +327284468 2845295129 1978042004 2845295119 317099359 +4274826059 1731307266 +3877147545 1689278920 +3511370073 1890860094 +3950274027 2470211828 +164515831 2628287092 +65252289 347957914 +868007275 3709742946 +1018286052 382265304 449375771 2688865893 +2966194847 4043192392 +1868916971 3211661675 3309661026 +1281379822 966444745 763325038 1281379838 +1633644343 1855114146 3004600341 1855114164 +4256959959 906604630 4256959943 +4104433053 3158134324 +2829715404 2316068321 +1993065550 252869832 1355155151 1976550553 4139562969 +568888960 1800135940 +51560684 3615611388 3111752727 3263542167 +3569190837 2094195532 +3507803241 2362073415 +769236253 652394955 +3029989362 1278476698 1080119795 +694544304 2140532491 2047947976 +2590490685 2570917124 +841739464 3274030813 +3040755492 1962763711 +2705455854 1787531698 +992667089 992667073 +1124442035 587973284 +3442090101 1850808380 +2148764501 2283053050 +1764283036 1683274627 +3607575883 3412426013 +3751258018 2646402069 +3136904809 3213860686 3709323225 +3589297537 475304113 1247189526 +320896571 368175336 +946222299 2749707474 +1242156975 1014100088 +3497376228 3819430361 +1547729586 1547729570 +989328929 4116215264 +2829336049 1804436080 +714719330 1913248323 +3791251886 3791251902 +2104463404 2586349240 +1021799417 3645831400 +3355645784 443608811 +701297167 3887661094 +755252263 3098884658 +2252506177 1701672573 +4076793899 2991854517 3645972342 2991854498 +2210754226 567099955 +2007385018 2007385002 +3045847118 2693186510 424364761 424364751 +3650035499 2806911138 +4127351949 3536079332 +123780066 2135409859 +199178854 375975575 +1057618266 2528348349 +1055585038 1699387000 +818320962 818320978 +1066825683 1348037677 242726976 462910310 +1805515430 126544805 +917504475 4061326276 +2198157870 1866110575 +129014525 134472452 129014509 +3017595793 2123496173 +4103328024 4185275045 +3713823618 4203337123 +804766024 3406120029 +3239662664 2467069222 3047760034 2669536023 +1854682158 884352121 +346818970 346818954 +3802366176 672277897 +1870991807 1299902376 +1874694626 3379340995 +825946741 2258840589 +2418659671 2418659655 +992181898 2732602171 +2640490223 2640490239 +3356259910 1392895633 3981704250 4032037115 832450593 +1030272978 2956031099 2230840958 +3318607845 1211147628 +1328667814 2699469798 +3162276413 3063708542 +2001201746 2001201730 +797082949 1414794307 4086661994 +1293740577 2240057824 +3992878841 2910201153 +2838551066 1910986493 +2101242975 2286197128 +2590398515 2703351675 403948903 +429773613 129566597 2155048914 +2602352048 3863209672 +1325110254 1325110270 +3523666920 2295907901 +578444997 1810151658 +296737140 1272140175 +833386149 2734766121 +51556056 2628562547 3250606831 +327868474 4255054667 +1145625070 1823412665 +3097865707 2547042530 +3538097960 3682441027 +1191071357 1062571714 +248533604 3052516223 +2579151645 502566562 502566580 +265951356 102178343 +3679332664 1946870573 +3162541378 6184693 +361026778 446635679 +1205454348 1890126445 +2989431176 136655133 +764442902 3307351542 +996610877 2760228625 +3037806345 321272615 +3803539178 4131829061 +3742320896 621800197 +343494103 3045546836 +2653706050 1103977717 +628020422 2785466202 +136717769 2855882296 +4216504451 642059818 +4043225585 1468718696 +3409426140 4189508487 +3836207468 1726734204 2451630231 1615322391 +831678718 2374950110 2786206751 +4086304920 3113922775 +748352154 3781091445 3521898621 618953303 +2986278107 258477266 +128709603 851087730 +1615760470 4054248295 +2283063965 1154389431 +920351925 3916268051 +797050696 3503173872 +3852828342 363838615 +995975182 3423538257 +2838244781 4253804370 +3574494135 482355462 +347910221 4060711218 +3707825478 1509995921 1075696464 +962855075 1754789254 +2105997562 2105997546 +883015386 3105417142 +2194193392 3991803634 4109246962 +2288832185 1082892463 +2371634972 2755916049 +3251880084 3025676537 3754459112 +934479103 2916146558 1559520833 130845372 +3312209140 2589394152 +2276664114 3064151770 3506464691 +146994219 4125515700 +2394788653 3782127570 +871924266 4197771277 +2201736561 137429232 +3000168222 2685299775 +1255871508 3940588400 +1367632335 4256462077 307889178 +3976526614 886522801 +2626501260 823813620 +1614670277 1182204186 +1667587775 932456104 +3097091689 2391068437 +2256810242 303721870 +2088815063 3585981798 +2983363974 579092624 +4160050180 1530085961 +633600444 797057767 +213336245 3111836924 +2325107197 2830973835 664998228 2813602530 +3856428912 3609499439 +3511677607 3511677623 +1036032906 3927556102 3459484389 +877107479 2378191113 +3449437479 3503178870 +3074636791 1977050566 +4120189709 2797180260 +629307171 2835828740 2995752976 1910646941 794921994 +65576577 2821817600 2821817631 +1276280510 2132641033 +1390736375 2837036660 +25257407 3600479446 +2901479063 3598317488 1526790178 2130502142 1375791619 1375791636 +3489032639 3489032623 +3567717154 4109803429 3567717170 +3410348124 3604152593 4215822284 1059761616 +3012429291 3281072284 737305237 1156083727 2475905250 +4013884294 640846839 +2312488170 1820000038 3850697805 +1406681980 1607778608 2037529649 1406681964 +1323668934 585784702 +1169433331 3396348000 +1021480036 2018480590 2880668622 3717937240 3717937231 2135923934 3227749071 2152701540 +1059577399 2730676368 +4276494105 2356381593 2020259457 1493729126 +1043511670 1608119495 +269206205 4286812034 +321214585 1333851668 +4038582353 636723190 +3239458960 2247821987 +10052150 662018833 +3439832339 3591730426 +3702678575 2614343160 +706536382 159024137 2344398122 4275956202 +3247363000 1809271469 +2385291995 2874210002 +1129420937 3372551141 154853113 2188582830 1159960050 +3408700084 2336498009 +1649625889 2235141968 +2003273874 2314993093 +2100067678 2126135145 1798542597 3878801578 3399528577 1795775231 2641066893 2126135166 824815718 +945532667 3798510459 +788336570 2992619979 +1525089659 3327835693 +3378066754 963565283 +3142532008 2243619179 +3836952784 3593406307 +4066607808 1386665029 +2822354873 1772915081 2346465342 2822354857 +2465087365 3524132428 +803374168 2963945895 +3297932693 126818716 +2113484839 1985176950 +3135568588 3625013572 +3217711763 2503176813 +4048771014 3415172103 2042263318 +347831881 4280396492 +3572964923 2080675570 +1193060977 2690920379 3461327128 2293198023 1942861649 135414354 386238837 871792794 2102791693 2877102521 +1405579223 3119845232 +476237281 2424969504 3642615495 3211112454 +3105510613 3105510597 +2182740125 1809997620 +3016972767 4105599518 +2146428045 3833418188 275486799 3414269891 +785406144 1912321619 +2496482658 2841862130 506987242 165246823 +4290739651 1567816170 +1255985488 2012348860 698188021 +2771570300 2331708711 +892307389 1993518740 +2012747847 579745728 +85409562 1794720104 +1150005001 3696183327 +956465404 2421590820 +1987837816 4247988717 +999154628 2866435972 +3645270030 399887887 +2732356723 3557511450 +315618048 2347463992 +545926995 2357755820 +705544154 228918333 +1292651689 4082937368 +2653751771 1851352255 +3223126968 632085179 +3335953247 1658230430 +2087722853 360999306 963941283 +3684759108 2237678340 40086815 3421070639 3270072089 +2496069277 2496069261 +1877315003 1877314987 724059263 +683904370 2648156794 +3948430757 552968890 +1351698270 850614505 +1753075763 104380343 1753075747 +825463151 384472024 367694402 3397623461 1915927995 +3538131763 3585393935 2284167023 2507837443 2219179996 +2919897417 1122356718 +3058665964 3946192535 +467092026 2717239588 +3601047585 76878816 +2319052004 4218342607 +2262738558 3454603978 2341103004 +333896353 3424807632 +1804096603 2728184644 +1626772272 3559502997 2460436124 +3759668452 2848135913 +5120089 3556568094 3576148777 +1319436498 246769019 +1112381425 1361457264 +667786123 866900930 +4115105576 1201259499 +150616551 2802306547 +54558464 512224517 +915073072 2197822799 +27407983 3679924666 +252047950 4099698895 +3560295980 711761728 3484058433 +755495653 600967715 +628333985 2516657270 +1146026025 2974853262 +1140146303 1459636165 2048165864 +1883479540 2926683929 +3025183206 3236879617 +519038170 823601782 2376418091 640203938 309967941 1520656524 +1028325855 3079412705 4217766539 4217766556 +3513978612 2887813657 +609914743 2497973031 3218317097 3580986868 2978994246 +4281207868 1201685707 +4055922079 2896960562 +2878594215 1427836595 2878594231 +27423257 140558229 +688029492 3270393551 +3153708206 2206768943 +1784503415 1392283720 2085198563 1274840409 2749299373 3891826512 +1910716501 2645667274 146052333 +1966548915 1022399700 +1733781097 395720536 +581833742 2785645071 +706345502 1692712233 +93120275 686386753 +2569789786 549335214 742766191 +2555556543 4266547409 2555556527 +1950706144 3719115963 +1915662495 193998684 +501883843 1067167767 +703242708 3137561384 3495739577 4216010292 3137561407 +3212457877 40206236 +2579177231 2424344254 3972917902 +2587996814 615459353 3636413768 +1902586843 1617562066 2330812296 3585560549 +4034505049 3901069086 +4067627374 421818425 +3337886244 3988145148 2010897433 3357244232 1447372479 +137069347 4286541834 +2713714124 390745057 2331341600 1832683553 390745056 1729318812 1005419243 390745079 +1184918815 3674963915 +1626243831 2904992542 +1912275013 2543920411 +1860913912 2489779300 +4279542474 1467761659 +2759241826 1222093379 +1224523223 3268430676 +4246804825 3558532872 +2702775650 4201580462 4236028245 3141432445 +3582963320 2838472443 +770208075 4140038475 +70575323 1031291038 +3480987016 2259270836 665163037 +785307412 3281818735 +3438099632 1232505091 +1491935493 1980294460 +262381863 3314987126 +4290541161 4272842584 +2755069054 10228297 +1476621995 4145868124 1152428757 +1785143512 1482208283 +843311093 592371098 +1079191705 229021054 +3902820441 2371779614 +2722016835 3158797360 +793640952 2115693082 +798006729 2846385006 +3101301356 1800902679 +2671065364 4217859006 +4259658237 1257616497 +768462235 3053103890 2640442149 2107324232 +3579612388 3966190174 2223864297 +47503823 1142087896 1142087886 +2749177894 454663105 +2625531475 2625531459 +1779889105 1681760118 +2034792347 2283030802 +832892989 3198378449 +82429666 2205041131 +4210859175 1385287332 +359188095 359188079 +4083819049 1494468238 +2996145912 2996145896 +3197266991 3204103532 +2842186542 2999587247 588895854 2999587246 3711627631 +4030755051 1102510374 544326114 1475994579 +1476089336 3481095418 +1324600028 633886801 +4240077475 829458693 2233677723 2522918038 2133012021 +1093671717 1093671733 +4017622881 4017622897 +3594798947 2960941258 +2604238723 3734000426 +1676453178 2273843805 +2022796589 4193181124 +1577748240 445816355 +3011708676 2604927839 3038626799 1657891652 +435795130 2652340445 +3509679205 3050978042 +1474603661 3925375986 +955733696 1834848325 +1057937099 3255360495 257696148 +3530878999 1823257211 +2095275986 1810880403 +3533732680 2166544933 +2197825255 2197825271 +3566589950 2783118559 +3145079047 3128203190 +1731178839 1731178823 +2956366918 2884332065 +3091600524 3902873761 +3178931689 823340494 +1780595451 2100469317 +896838973 1672263426 +165159450 723149361 165159434 +2148009228 617202999 +773180229 1307505772 +3019959377 3343900838 +125060957 420239202 +3796042550 1702555014 727762357 3497007954 1702759953 +1682109558 3383132852 622838095 +1238902827 102957739 +283793868 283793884 +3018729263 1860677358 +2410350969 2073858398 +120310802 1542602821 +2888620548 245052489 +3529026398 2140521718 +1921787096 714997787 +965640539 214855967 4132807236 +2061855937 1148166189 3904448196 +2097822575 1176211384 +3108012285 1139241442 2643136066 +3423965430 2799286486 1005794119 +1050961300 2337193639 83923735 3171239676 818669551 +1445079179 2439701432 +3461477959 545902930 2331280389 +4201285333 2613848118 2714513828 1758981793 1483875624 614256070 +1936289866 1867926949 +2499359714 3451123434 1716300995 +2260366308 4219760639 +4282425821 3483928576 +2136500224 2136500240 +2924555905 1016332807 +3824723183 3262351992 +74498145 2007967376 +1211267329 1667993172 +914512722 557171219 +3902276163 4046734001 +1503176654 1748043609 +4270870474 2267912941 +175817034 3376301933 +1236588056 531433435 +395770099 363456140 +2949843921 1139724157 1844486612 +537947370 1663186726 +2197611687 3676041974 +68736753 1679449446 +1831961621 4193447196 +620077106 3766125531 +3053417349 102947404 +4098797334 2916982705 +1020717330 3629180741 +2744167608 884991419 +3892946314 3509557293 +3779675199 3847647038 +2465696164 2741473596 +2924487413 1248922193 +2589953179 2674546692 +3597460837 3162279760 4067237356 1632405905 955553187 +2960819893 2246184682 +4125783470 1570453550 3457630447 +2408309798 1185481474 1041218594 +1742237883 3175425874 +3918772621 3618017916 +4092051487 349401310 +1170013526 1860889633 +2087349743 283702587 3398111032 216592095 +2423834944 3271509823 +3590959761 1463114806 +3613559675 2689303180 823611013 +3179497845 935648013 +4086329992 2525804415 3605254580 4100213789 +2528549528 2316716384 3648347469 2697060403 +918318031 4187862744 +4187265654 2224044481 +4157175312 572840739 +2988304093 634298883 +2641357267 2855081786 +1531884540 3102037415 +3948740723 4133991692 +4046274935 557715014 +321085803 1573255064 +20081384 2734818332 3480252693 +649307484 1221414855 +246955974 4060898465 +1055588617 586912935 +1468725554 2116420813 +3126085976 2863625627 +3719419099 3692474504 2579616485 3656520914 +2644121705 4034282092 +1297521847 1297521831 +3815253394 2398299347 +964654770 900192819 +1479476311 2164798914 +2140772103 4168124761 +4271156187 4271156171 +1848224103 2711587187 +2620484072 1912846620 +2347546884 1235698015 +3852063984 1630156227 +3576235849 3604920517 +884014905 1839979806 +2732758596 2930937097 +3889334500 1365166287 +3897635284 3551818536 488783782 3484708076 2345758895 +1622009937 1638721505 2193930118 +289880667 1568608101 +3375000983 1154122928 +2552531635 881219525 +3545858787 316465616 +800893278 2214502143 +1234948952 642881749 +3260686114 366936707 +4205462646 269075921 +337177453 272276635 +1152037749 982442487 1131631884 +3922597342 3983305855 +4145995034 2755333859 +628191948 1710888839 +2323594709 3679344202 +609482813 3828865844 1831847956 +3534573867 1564168429 2640185111 853784862 960996173 1396392243 1547390828 +292771849 2173933112 +3041414332 483445745 +113712953 3142234492 +1754486889 2835145984 +3298086847 744426625 2156409707 2156409724 893585832 +2697695744 544658949 +4191663931 2308272612 +2427401465 3167773672 +2266227909 1766924812 +2176302749 2490238632 +672666323 1501444195 +1102543690 1419169957 +2983708864 3065054789 +102472151 1079077946 1953705328 +1314386615 467121277 371964707 192091664 +3822903917 565735812 +820441171 1390814423 1317819052 +3595293571 3697145660 +2479702788 2284345756 2454996854 +512071114 788036725 +3549985125 2114394618 +993175388 2361226695 +3253635982 3253635998 +3312075752 2924013117 +1179508047 4220740440 +2380181866 94955448 +550741381 841846860 +4286973584 523852011 +2058731879 2468312352 +1198285956 4087495647 +356793978 1358258469 +1526405875 743140492 1186717815 +991694226 131702129 +3552831956 3238144000 +878965649 173567302 +4057610521 3548897886 +1695864540 4224597072 4287320413 4224597063 +2835291041 2862120544 +3590448249 1576708712 +1188154854 3438876465 +3416391811 733389348 +1719783182 2740490577 +2347875838 1267603145 3201663282 3484287263 +919794385 4141825213 521420550 +3157574688 1729150579 +2565279163 2565279147 +4209699060 249261204 +4159652424 686219956 +1510318864 1193642364 473971385 3336548917 +165955314 2220601061 +3242260451 3616396246 +441901825 2009553558 +296721756 863287249 +3328756045 2750735410 +1949269504 3273272888 1250342363 +1724623662 311957167 1752771001 10385775 1772024946 1752770990 +1206343461 1445867322 798255808 1206343477 1714309244 +3175303819 2347659794 3962951087 3175303835 +247754141 1798470069 3473391490 +3747399262 4245439999 4245439977 +3588300902 392560769 +3944527465 596041678 +3750150773 1445207612 +2413916361 1222937710 +3744981662 49921727 +4148440735 3681344860 576092193 3746915400 +3197199557 3286344218 +1774133900 3926217692 +1421177647 2292470513 +3655697146 3733051349 +1017950097 349724998 +2989732163 3395292266 +1152416339 2421407424 1035446189 1959825580 +2709238971 4038951524 +3403910832 2285107918 2492044372 4276726167 3669901532 1144354183 2704728401 569813487 3852568711 947226700 3785110499 1455467294 1740168843 828005383 +1079293377 619915734 +968789190 4181463994 2514448133 2901908385 +3030669349 3030669365 +3876943024 1992732949 +405279418 3239410397 +1509110757 2128261498 +1562719987 2492825754 +920016791 3932938918 +3596504538 1349815869 +1896400215 3987429230 +3954257302 2649408295 +3258547843 1132603452 1132603434 +1088958419 4205588567 +2888561759 2386196764 +3796885503 1119723112 +1688486367 1301525022 +1530415503 559563325 +2504720025 2504720009 2651769544 +97853065 3078558136 +953346234 1032776982 1004409749 +3754891490 889465795 +3565529855 1355213709 +3449863612 2628932200 +3731917335 1462079892 +4202477381 3557295484 +3849175262 4100284162 3802787582 670100230 164011391 3802787561 3340495287 +4050693445 1499513740 +2339002611 2832589763 +4277195300 869098312 2031799977 1311986713 +1729274345 726983118 +3147443683 917912668 +715868213 1621273450 +365678888 2010792445 +193091754 1389987520 +1897692335 3201845102 +2056969638 2815093825 4019479898 2071071985 +3204813172 700709273 +1121420333 3502022789 +2760825173 1039762398 +547628639 2265429605 +4082892504 2641986797 +880242371 1526947068 +2973557046 1968152339 2900306501 +3056564886 3234642396 +2900617347 1072977621 2191831388 +266156025 4064222455 +3971614690 2329569475 +2140254220 3901200403 +3089483457 3027761936 3089483473 +2086817923 1371848234 +2307645547 3106410136 +2221179047 81159559 +2933490074 3664184701 +2143490098 2072604555 3329945864 +3593077522 908252485 +617592324 385321711 +1218880365 3411231876 +1185641055 4168520033 3107007639 +2449416667 2946649042 +4225879210 3027886815 779431821 +1536771060 642119961 +1304351577 3014598206 +3043339533 2618256228 +793308270 3721146681 +358035909 3998175072 +2963450541 1606721906 +4079669956 3750352312 +2223407134 3183193897 +1752516909 4166282628 +4157349878 206983249 +725217763 4040190160 +1106707961 3424395721 3424395742 3504236286 +30630847 2663777704 +3151721360 1249307573 +2367493281 3318184288 3318184310 2367493297 +3797703406 1164125350 3927097198 +3953343106 1945442997 +3718362329 2587138984 +1283811555 1493441884 +3031819963 895105124 +3409505635 188780615 1302180572 +770373852 3885138767 1722869127 4120317260 619037265 2185850522 1722869136 +1625873403 2308066354 +492668619 3492744174 +1043961401 2628242462 4027093807 +1047711477 1136380842 +2455453981 3855456959 +3898406933 4212411624 3262849225 2843408745 +2017095845 3909047212 +282923721 3498214635 +835617589 3081046733 2635631722 +872010372 1447454175 +1073529895 3790129504 +3506524272 1964089411 +3664757967 4164707414 +1717536422 3462461271 +1833385053 112593986 +2094340950 2094340934 +1092624432 1793334172 3046288259 +3076084908 1302350551 +3984966964 3108672606 +1296247701 1296247685 +2291551963 3751682770 +634342413 2455025778 +3994495738 619693585 +836637465 2102809622 +330141757 4066849570 +683616809 356235903 +4206472295 780986745 4028548196 424306230 +4278490800 3703219248 +1879696557 457852187 +866695537 3281775856 +2227851180 3329983719 2227851196 +2877798000 1990472259 +2306773234 1681796325 +1836263444 1615337327 +2939723307 18939316 +1871517727 2228833436 +1951066907 1106989256 +3500900236 167364983 +2549941669 3897549484 +1061853204 2059184317 +999976950 3390980167 +10751028 1559554798 +1879637959 623552086 +3678141159 107739561 +2715029660 4283320610 +1891176848 56010147 3773583188 1693849960 4133936125 4133936107 3294368057 +573047182 1392145049 +2886717789 2348625822 +2926492379 2926492363 +4067158447 438399690 +1519516728 3419409453 +3709319775 2269818652 +2724812206 1506926841 +162887932 2470190223 1885456858 983409318 +929049812 6721977 +514875277 514875293 +1110975328 2091013469 1052772537 2657071155 +2952060663 4118478534 +966271024 2216434588 3665472405 +29229910 402308629 +4040072700 3707821991 +244020417 2793982912 +635367796 933327967 +636751260 1837014971 +2916308310 4189017703 1980040246 +65875642 20147990 2600520085 3898642141 +4249989577 1790858847 298695214 2426068856 +973428026 2422549085 +3551753473 1791605706 4037713467 2981126712 2739298403 1791605725 2997904334 +1503368266 732880966 +1144194917 3265628300 1379803804 +3105793992 2383948003 +862334183 3656388345 1696364772 3503861686 +3699300048 2904606288 2904606284 +3527382691 2635735690 +1608358317 2530798418 +3346334967 3346334951 4097233104 +1147664805 1420689082 +1710642517 3620230364 +1494130401 561537722 +1838958803 1450471767 1450471744 2737874733 +2501059043 1002772679 2417907804 824733405 3712352161 1002772678 1002772688 +247754129 3493362502 +3747399250 1314004763 4044108562 4044108549 +1178085816 1114221741 +1102874016 830491160 +1672459423 3915520306 +1363149336 13880367 +3007742166 242656641 +453236251 2580657096 +1351969052 949448647 +3491496128 1544891973 978835084 +4126111262 1656604201 +2622707473 1846673091 1923267668 +1583726009 613873986 +2473502771 1244842060 +755067550 2000344745 +1287197721 2879787983 +2141140875 1923379138 +3163520771 3638882748 +1368130365 2624133396 +3967126426 1017411132 +35148805 1363952588 +2790224056 2265870779 +604178003 63108268 +4165765047 2462849935 +3754530373 2404880026 +1771812923 2065892594 +1229840901 1788530124 +1702812656 3065264835 +3582149215 3844712677 +1365856753 432799344 +529379832 2752457083 +403830474 2923921389 +2243413210 1514857277 +3189460222 3189460206 +2883279476 4266615951 +752917849 4271354632 +12314146 12314162 +2737219427 1516624455 +3625670760 3625670776 +1015938857 2089332110 +548798708 1921220623 +921684843 3866966370 +3468987933 1769464740 2624305058 +819135574 1749666593 +4104525465 1835966479 3310333379 2619964656 4125690228 +82057581 538183300 +2119101436 681911464 +2988781493 629807612 +3655095995 3655095979 +3802607844 1525764068 +3978209786 2875856106 1267259075 +3954596373 3475593958 +3411932619 4025085570 +3531679364 3311120239 +2828635045 2976041669 77769697 3904441036 +3711244291 3639853397 +604732470 2630973487 +3304141922 1773499989 1892082603 1773499970 +2132413630 3661481869 +1250825547 2829813021 +3406954191 2982099681 +2670259611 2670259595 +4156823829 515079196 +4260953058 1408040701 +1653992757 1971605288 3243411653 1728342652 +1836381671 3539397107 908008096 +1693539013 2901533722 +3688665189 651860762 +1579055522 3422124565 +3964384569 875448510 +3302397045 2158796301 1389081642 +3758368428 1384702145 +2877274793 2877274809 +3074566028 3306351520 +863734873 3392409231 +326458236 865238 +4196263299 1074810154 +3142928396 4081085175 3479715895 2117783644 +3204454255 472179640 +2511511724 1412624087 +2388037562 3427025373 +2738166655 3763742187 2829555560 +2098482410 2565134118 3505722445 1288637253 +755902917 2991309082 +149168049 2954748848 +1847535201 168256482 3211112782 +2981283949 196249946 +3698955899 2389173170 +3743369843 2973905690 +1069825663 4282654763 3773719016 1848950465 4282654780 +2313922206 1616942393 3153545897 +3428952170 666640077 +2702633570 2702633586 +310681685 2792897786 +1229836233 780015992 +337403374 2527583673 +3927034724 3724750441 +3525138432 3291580421 +1227850385 920103990 +2171410652 2596151889 +3523919645 3523919629 213265685 +1120367366 637145719 1068175686 +3118608181 1662713868 +3890156846 841897839 +2228962448 1684509657 3039620789 3938174716 4055618029 3503901289 +889999641 2607000158 +1499662368 3605383795 +2672121252 3750501884 +3851349696 2816963739 +3963300320 3508733123 3963300336 +2131939850 2131939866 +3030982760 1755308692 3460170685 +1296810636 417431201 2820158428 417431223 3422181216 977486455 +826333297 4195662320 +1341154838 3983586471 +999958029 2020594224 3204961120 +2468575523 1686985668 +1602527059 2965819322 +4249697592 4170669883 +4246757731 3707326172 +116963894 2905606163 +3108013062 2794444129 +2452687281 2971490390 +2499624351 698876254 +1701369537 1695158720 +469011347 3992408599 2499262586 +1482225794 594342806 +2585685657 1298287465 921180894 1298287464 +2159284970 2239350349 +3431757981 2653019956 +2866785870 1277125849 +1550051550 1330091369 +3294426721 2136464032 +3154178058 4286177211 +3018729272 2011675949 2011675963 +672600041 89000910 +4157679269 179503888 +3820459919 151229976 +2958734780 3880265841 +1276788422 2471547326 +4237777428 3057831281 +2087355573 3913356240 +3978407670 2604975206 +1938547382 2604000401 3705061505 3508211978 +2225550343 3661031190 +2203760785 1490062416 +1579818521 2798667518 1431134536 3452043727 +2275350463 1047683496 +1008443305 3432543963 +1332296290 3728175990 +1180886645 1118882346 +1097360006 1978850965 +89592046 3494079399 +1782260250 2035214702 1427549922 +259809960 147803773 +273471667 1543053772 +3790928887 3517964138 4248893386 2479886485 3904992243 1115987709 2535073167 59018625 1681761669 40732492 2356870785 3730376702 3512265817 2501645105 2338531502 782747882 3664206036 +920416167 67355638 +759231232 3959211825 +362868796 1213869671 +3787142402 2148510987 +4110008313 2385058776 +3028485331 4106469997 +2030143122 300269882 +2218985958 524137227 +1442919135 1122178334 +1658047787 3194747554 +1977826995 1203483610 +828002003 2217350714 +196796553 3110840 +3365729110 3365729094 +332836627 2778915200 +2174400144 3046476028 2174400128 +1995248907 1110974548 +4222453014 613895396 +995171700 3568393615 +325509296 1869950107 +2935241199 1500984110 128292410 +3600925185 3785648022 +2542921091 4064122215 +911989968 1654430581 +2479880329 2479880345 +237285185 381762442 +2803020837 1396093106 1671509110 3724605495 3738709974 3610378138 1436858478 3650312349 3957738767 2324857714 2487036842 2356473643 74494396 +2067448226 2067448242 +1314152078 1012375954 734428185 3704674713 +3150035465 2599935032 +2717327832 3490334477 +2323034207 1707038854 +419041877 3663491197 1015354563 4252617361 357417692 2796215260 +171989440 1915867000 397039515 3813493075 +39890429 39890413 +1815029975 624773744 +1593170866 789109043 +593272260 1858886537 +4073164030 3425602658 +1096641234 3088001157 +2973185915 1961645732 +509755330 509755346 +4049649894 3780094487 +2232988729 980882370 +3133823668 3230452047 +3698622846 2910531721 +2738276640 2738276656 +917758378 3341565581 +884901108 2892548936 4226501657 +2129288071 2194400930 +768478294 4189100309 2925000011 328036239 1901947751 3075998580 2975332838 3708818230 656460246 328036248 1628369534 3826261555 1901947761 +121441327 490102124 +3231530209 411489824 +745611705 3572166837 +1277250134 778569073 +2469623169 989985280 +4128219519 2002631467 3650829032 +3741904815 3390132334 +3186098153 3186098169 +1525593120 861442076 +3963581490 434367141 +2006839848 1973695723 +3586064004 2594218355 4289374687 599818528 +745111248 830706510 3876509556 +4162324245 2731746844 2730853427 1550115258 499974550 +1166269208 928100064 2257708749 2762888371 2762888356 +3930705907 4086985965 110793470 +1671336262 4241555426 +3131053345 3908856134 +1551720799 4167059614 +3742608976 3656038037 2080073717 +2539935906 4109862659 +3459593600 3984631144 +3022764842 1944213685 +3361125242 4245404757 +2966823220 3701057364 +2908544799 3672823787 2035290871 +1081334721 2334021430 +1411490211 2486901789 +1124248498 2186230605 +100312205 4136700388 +4222867643 4145950308 +788382798 1199310543 +899924583 3567110771 3620407328 +3689981127 47408470 +2196782961 2057823254 2991971319 2057823233 +1026490529 4059954559 +3284303777 1156916960 401629943 3425626720 +122223872 2011580179 +2944079686 975171473 +2531643545 3290138133 +2912442011 3246593573 +2556668788 2556668772 +2420570517 3944091571 +4112354884 2602027806 +3687804369 2471614444 +2842334932 2261479353 +2165821036 2759455767 +1542670634 3925617933 +2407143956 4046916985 +620918999 434387558 +225914899 1168158202 +789838649 945628725 +1442487791 2153853008 1216782126 3548251281 1676453164 +1467374659 4065541482 +3583099355 889812905 +3658697478 515285765 +2178633980 3410072752 3464776369 +1809251494 112998607 +910646433 3886791878 +2600226129 1278064272 +839905751 430052921 4084772194 2786702694 3933773652 973115721 +3862947524 3301690382 +1218121196 2036843905 371901812 3608361155 2975598181 3440584960 3440584983 941025921 1447189226 2974246758 2991024380 +240668248 3317230763 3702294480 2502333440 3978072354 3629979499 3332157990 1014835567 3529313812 3629979516 1887565953 1904343575 3753448872 +1815396146 2299067315 +254786793 2937849388 2557961563 349115687 3142785073 +3403723790 1841000985 +3158319827 446661933 +4261978233 1620352638 +3866480462 3803790030 427120591 +3541161369 3725803486 +8930982 1608261094 +1733591791 789361397 +2802768584 3294783709 +341067329 1074093532 341067345 +3915779420 3349612504 +4246946115 3246373994 404076336 1678884861 +2990861050 2625496989 +589340479 3019503232 +2621130296 892765395 +1648703287 1614823343 +2637015382 2870483936 +3736523396 3008838511 3008838520 500000201 +2622834876 2815824876 +658176560 1271629213 +4148372552 1806217200 2259819851 +2685186439 2063300480 +409734025 4212533432 +3294765642 1887173243 +1320947231 285883102 +3587347320 310257147 +4110988444 1488212369 +141120212 298673071 +3357389677 1942058116 +1116243353 1441419230 +1970532373 1713468090 +2989626542 852921849 +1104715387 587299748 +1079165064 3393525259 +1676994445 3884483300 +3455860979 924466828 +1549447587 96838538 +3577432878 3663157625 +3877831221 287078762 +158042391 3947417401 2476615828 1259351326 3947417382 846652299 2476615810 3824796853 2119779887 757842765 1259351304 3222774025 2091663850 +527600212 3578774063 +782046699 1279885538 +1986603667 3650259200 +4216747635 471627546 +2650666387 1237948012 +1792730924 3441160897 +2651689135 2119877486 +3707022155 3046245486 +1838826956 1440473121 +871306592 559851059 +1037322272 422162414 +1085743512 2018107981 +2243599249 365094224 +1986447878 1775241079 +1345904046 2505302063 +715909127 715909143 +1364687209 2559498969 +2301119404 2448358593 +1827801783 939974150 +96569520 3215600899 1226681609 1970760852 +2596726740 2065625785 +2148657337 1429297960 +3941927463 1082245825 +693340264 1988082612 +1943818787 3813459396 +1477534975 3770004922 3197508223 +3299581667 3299581683 +1919057719 273292815 +1093282253 2547047800 +3051921411 1614013610 +921040985 921040969 1180650302 1299873247 +3395103363 329903146 813621872 295753149 +1651386230 1190622132 +2173328626 470331102 +53333998 465419374 +3104187051 381488853 2053094095 2053094104 4020802356 +4268717873 3128468015 +1708365755 119004004 +3245221326 1315275599 +1597688635 3511906393 3747208223 +1730091871 505147923 4198124313 2468865308 3675515912 1740816951 2820570702 1064373709 43773675 2112053472 1204212686 3939323181 1744248547 1941739713 3221560477 2948653830 3259804380 1107632136 3207093727 3425664627 +3325355888 1967674709 +3705092597 4073684890 +100102970 2673811036 1452510660 2576749791 2116067683 3052893061 1219638456 2811959225 2219924375 2880688401 2562995277 3527471874 639559961 2293217871 +1000565101 1377707986 +3370266000 3423451555 +1051061537 3029736889 +3367529350 2152809441 +85022125 2873789956 +1970157466 1988200317 +26907175 995786788 +2882031005 655545195 +1493897814 2630253514 +1325386265 1144756117 +1615221973 1139819898 +1193234471 491466080 +1074256567 3689014068 +845120342 2723922030 +635264242 2637962770 551190235 3887827525 968071698 2834984603 1230614238 2834984602 2834984589 +3292444205 4231970759 +3410557444 3410557460 +2298578772 23595321 +1036340805 851702890 +1912794449 3415971462 +3823012367 3442458188 +1332085435 1332085419 +1314533220 3075825508 +2046212743 354733971 +2238514239 2277329523 876289411 876289439 +306031893 3424090140 +963350793 1834307886 +3199028617 802895597 3963042637 +3321859234 340974142 1397383957 +1374812232 3442506904 2505316804 +3345210834 2971537534 277315211 1146096237 +1897207871 1127557950 2042015261 2461474336 +3173142387 2698340599 805507596 805507610 2040462436 2580897222 +3122127152 597130883 +2052385060 3081438121 +1675093274 2112838961 +182152238 1164659833 +4212009937 139393542 +1457579115 789025890 +1461743555 102156711 +755834707 1847950450 1580927815 +2210511141 2875707079 1207601756 257810147 +2824385968 3814223132 3747112655 1899851606 3014001685 +3572494126 1707150777 1672840559 566943858 +1308385741 3293013590 520506852 2760268109 1615693050 2946420015 1811148183 +1051163230 1051163214 +1233974985 4170730817 +3302772464 3603973059 +2963878441 2493456793 2963878457 +3942160422 2982447985 +1388408360 1585304575 +4099824867 2475440476 +2727499304 2377790503 +3718115971 2237721191 1654965308 +1073913631 1411776988 +887318924 887318940 +1801961561 1834208286 3661867579 954880830 +374399646 4050142910 3210002111 +683972255 715621707 +2666994966 4285349287 777309267 1426246065 1426246054 +1953309156 734812671 +2866812674 1474584331 +3114452730 1569373141 +716049239 1996210390 716049223 +1976730809 3129259389 688561822 +291734506 1333959250 +3585070558 365333481 +785977020 3754257392 +177358693 2479841949 155608058 +1103414908 79983911 2397907756 727381591 2990832679 +1250174982 1410007415 +30449962 1010077696 +896498426 410949533 +1282657815 2363782548 1900899878 700635145 +987520589 2712345767 3794033874 +3035047309 2395836658 +3202370048 2064940549 +3837552957 1994929204 +3957741392 2879091427 +3899611259 832175455 +654350581 1525729706 +128760335 602465678 +1079545969 3161154022 +2129249279 3372190334 +3885898999 949325684 +1617363905 3812331971 1384941808 +898386874 3659001366 +2929484959 183519777 +3372408681 678932686 +1274385525 1321725917 2875429632 +3166197516 3279796389 1676258220 +2823963109 3119391004 +1345666104 2077084731 +816589889 2714757392 +2036632204 2772834935 +3528107872 1829282113 +3174978686 1730085471 3033578398 +3789236702 1510133593 3789236686 +2209279600 2892054835 2209279584 3795923932 +272602933 4220401809 +1836078291 1738694106 2746494131 +1296831744 2932150035 +1853330138 881520266 3384482467 +3907601245 70585186 +1219588002 1219588018 +2388269216 3084174323 +4028711654 3931918359 +3883527765 2185313005 2185313018 2091254771 +1557190890 129612034 4208748815 2835722794 +368252785 3877629412 4272809702 +1548866376 2808525350 +2269903716 2269903732 +927239454 3919197497 +3847415773 592383028 +2646223155 2646223139 +1022884167 1096641238 +623383745 1058581440 +4116111546 1496235391 +3375160336 3375160320 +2344183029 3923373482 +638371917 857690404 +994895891 2655666816 +2180686968 361818363 +1779095370 957409659 +289796374 1192920487 +3208262372 846389084 3969785065 1709671128 +3201690918 2428785345 +1841436078 1988632815 +852268304 135178293 +4270041529 1648635432 +2149018284 1356655831 +2373681928 3245294987 +3723327521 2111052790 +22518379 2280134260 +3300333791 2335975198 +1925170575 853803022 +3695513256 1335825527 +2608110552 2714297203 +490996601 490996585 1895770296 +2276019438 1173750126 2105809583 +2330304504 2330304488 +1846956769 774142006 +4242396167 454378756 406112022 +3385340219 3777331186 +3261829848 239706240 +2978603485 334163394 +2783016262 4077367610 +25588067 3383000778 +1667413969 1270417853 +2922763539 1371434220 +4144016385 3608069504 +976431630 976431646 +3859473013 2552397372 +1927276118 746035559 +1652020597 2261405030 2091412899 +4052324924 998966277 +1197498207 129522698 +2272936279 2624904176 +3016029380 3272429727 +22922865 2543805424 +2125062530 3882745781 +1537782062 1537782078 +2693147435 2196780878 1848053721 +2753905674 1890196411 +297738275 2481994849 3522879750 +501498063 3713140174 +3122470611 3470231084 +2317498466 3588145731 4037791594 +4024174243 979268224 +4037106677 3271803580 +2308814275 1715806698 +4225763157 3601566410 +1902927101 3575870603 1824304629 +3598317488 745570059 +193751069 604903537 +3825517002 407871960 754918498 492553996 +1593816637 1228196149 +1658597170 2618367837 3758302346 2687552151 2795891056 +1799191699 2820280819 +2079343159 1379417222 +3285674425 1211009950 +1369129902 1369129918 +2069152512 2243035852 644806931 644806917 +334927940 4198291256 1924970756 4198291247 2972824329 +2855945214 2855945198 +3006498783 866187402 +3718381140 2727833707 +1166581792 3049248446 +1965626887 1991093526 +2660349524 4083287609 +3643473629 1456591554 +3912548829 3943503268 3912548813 +2666725976 444198387 +496762692 725679016 2418677305 +1069689721 1069689705 +756864668 803041077 492659039 1102294091 803041058 1707107330 2612140292 +2891200685 3957827858 +2184769380 1671486079 1060623183 701996900 +3060076940 717964173 +3774290230 3433006836 1120475926 1526509575 4188293868 1221141605 3047121600 3449784458 1120475905 +1292281633 1652103392 +2787568930 2974239893 +3923047008 3090310338 +3437105278 4287886943 3035420574 +3882686910 911520570 +3018886575 934183377 +1170318901 81307004 +2496369145 671190494 +1261800458 4006031219 +1374387967 1374387951 +278150719 2295260211 1886858326 4051821142 +1012494059 576749838 +951405580 95544352 1365685985 +715321250 3229563907 +446819907 803869546 +1389823556 2494952751 +1361044668 1899303911 +3620241380 2493600767 2493600745 1878029540 +261215437 1334967972 +282832062 2697898196 552098538 2910113665 +875836100 4062964383 +3789238351 4148593047 +668196085 2810500540 +1768581209 1266828318 +3980192700 2850541992 +1901192174 3575633074 +414833039 2718326808 +1977455627 2530217282 3246719371 +4053065760 2887800695 +1420852567 2832551910 +1047692005 860098156 +1148166078 2959410666 +1696536621 3749462415 1029866142 3084217670 2708230657 3643902308 1768481108 2695526261 1090826152 2386771917 4037996885 1250130589 3875494325 2550601673 2826827950 2693520903 2215720908 3974136589 2509442650 3860237620 3316505444 1900587826 558115750 433170229 2770766153 2781162530 3004357642 3162130344 3503672898 2730001060 3677490486 795276205 172112128 1541720590 2687781408 2932467815 208777360 3739291871 1244392088 191421275 1360909304 +2638796014 2275881657 +2557690437 1114722970 +522698239 148269995 +3454730517 2467394054 +209602299 546619304 +3762164918 2323357171 3762164902 +1824793149 1975641620 +3924026836 96652463 +1052820237 2459601723 +2348051795 4220052807 +4290781117 3177647778 1483863700 +3307714203 4169430536 +2900063896 3044782427 +4128810389 4258048394 +468224839 1342466098 222338132 1342918787 2721125656 2917503130 398352961 632496559 3693177858 160280774 2525615201 +539220596 850912043 +2081810186 2346792330 +3187370855 2311728198 +921647386 2492916715 +3592597571 1536915836 +1852061057 2560322138 +494789232 50606127 +1680832074 3910634945 +4020442631 2477474035 +66156653 1805191834 2498872563 +395594018 3560337646 1081024661 4059049533 +3157084742 2169236513 +61411109 2899891862 +2177525365 3332327996 +2107314567 2667745639 +602287861 2019290026 +2773807542 4206395783 +1761284827 228416562 507424466 +2368394470 584250929 +4014889563 324549956 +844370763 4249069116 +737500869 3864505840 +2539594184 314715595 +4235375182 3999732942 3062804697 832591321 843672274 +132390424 2216386523 +1381534081 576747030 +2890893305 976424168 +3243191863 2259009670 +798994601 486671385 +452940606 3186625161 +3460331100 1986220492 +3051617435 4041648146 +2894439997 1864764623 +1712615875 1966020092 +1247496600 1957669855 +3242797554 1759743639 +4080129550 103651178 +1133524163 3997140282 3251667923 +819759479 3451237465 1647076944 +3680590098 1492212594 3129219003 +309421626 4155408127 1115942237 2445160854 +2083022474 3944995740 3346870057 +1926959270 1276442599 +2070493660 1460082764 +854661458 848856270 2206915589 +3717386751 1380556732 3441464424 +2476693502 4034246061 +1093402435 1517221016 2394224661 3678590570 +1009065789 2744572450 1855397195 +3118286997 744047260 +613006626 613006642 +3219098127 2207825499 +2030143133 442951970 442951988 2142340715 2986410114 +1402687235 2692571580 +4244938536 1984334827 1984334845 +2233482169 1253966888 +692822072 2412736211 +2327211855 2888907086 +1582653018 3663955883 +3824210564 1478190537 +1332418967 1332418951 +2871002844 1063963719 +2913006854 3268766114 +3342745359 3053274264 +144677853 1883397355 +1625185788 3572932529 +3286726052 1921443795 +3674095972 4112509412 +1579363223 1639259274 +902330528 1575582488 +3925545234 2012782187 381670056 +1127038878 1580934591 +1775537628 2155943268 +1175180230 741067697 +423267546 3000476853 +2243560304 3180020205 4090718531 156659454 +133850825 1479528056 +1369464223 1000483496 +2795296808 2162712635 2795296824 +3126621207 3580664226 1988804646 754809353 3429665684 +2052280215 673598118 +3797865917 407533698 +900546435 2287566694 +2119415048 1403721780 3854957469 +914494025 1436700334 1436700345 +3999346074 1238045539 1238045557 161856182 3707423101 +3405414318 911671023 +3195451576 2032761683 2363804077 +1095274935 2084397840 +4034963002 3565530443 +3277671739 3534618856 4220048955 703945221 3336606692 +3672131912 3608370251 +3096553136 3096553120 +2586919585 1958501127 +126773440 2771314259 +4281551370 3351088571 +1863602164 3506035993 +278707193 1896717460 1921455376 +2902526737 399879933 1772383174 1772383184 +311873964 2820666048 4016837057 +993229984 2411881837 +1792605549 1792605565 4233585240 +718932804 4205159248 +4245209607 1539928320 +525420777 905299672 +1423563979 1576440724 +4112276732 2396111532 3618005169 1859565019 +994121809 2558084998 +165945672 3659555915 +1267183016 2392219517 +3304230845 2779129640 2255319107 2224774363 +3163290450 3061040026 576496147 1331790182 +1089505650 1074573082 2896715379 +2728631138 1770888003 +1329084369 2256526854 +2345062445 3409579193 674238905 1629147886 +1431061656 3742366541 +2223440662 33867767 +2352663664 2457239370 785301219 97902422 2933424839 +1291546776 3640238055 +4257770440 3182072495 +1375669062 1518255905 +643589738 602064329 +435551339 3188034190 +858372524 917457345 +695073302 3425789439 +1889521533 2187830370 +2335861606 2465665431 +2779024529 1619347877 +364879849 631815128 +4095045953 4095045969 +2012240901 712643041 +184857890 914651709 +136502658 1357034421 +1556109655 1495672247 +862166357 1501120755 +1999200832 3796620300 3592792773 +12806684 1335888391 +3251457605 772537014 +2134009016 1310394195 +268580745 3162336423 +363693895 1730933952 +2766214176 3017494402 1500785392 +3094686742 1987339953 +2124824292 2062575740 74742567 +2754039830 2833426917 4132061170 +513485770 3061760710 +3262255805 3599990658 +724464030 724464014 +2521490284 333716519 +2745092653 97801874 +1886410478 2925337465 4007188655 +1631296586 2072140197 +4258494722 2514976291 2514976309 +3998137036 4059041591 +1241289821 3583872628 +373684960 4029279923 +2648791508 1572890800 +610301458 3515994761 3608374078 1440341587 2029583533 2029583546 +2353639031 2840280308 +2599439467 1397247074 +298229704 4155509578 3282929629 3700195231 344481392 3878478051 3878478068 +1630673313 1177946749 +916287090 857250829 +1319393913 1169845352 +831376987 1564203332 +1655497848 3458967789 +4159394755 4000536131 +2784058606 687164079 +1205774833 344295034 +283004345 4037676958 +352465980 1316502129 +3973673654 4019552045 +2145598911 297415585 +1558856289 2781249184 +3773555400 3679846603 +319549864 1499477443 +1166229832 3047146589 3047146571 +3156582669 3156582685 1162426482 +620919002 484720445 +956879794 2061844787 2967842391 2061844773 2073934110 2850399053 555780511 +2850177447 2146441851 +3612120245 2727221482 +713590977 967708570 +3331796597 352199210 +189776920 3868307931 +515409759 2918237212 +2955492671 1517003009 3080199420 +1399565327 1635769230 +3657467209 2010239463 +3168239752 3477034525 +3596782067 3642012900 3725077466 3273361790 474548357 2024935530 1194787639 1144925899 765748522 957979276 2960708895 1688820479 3055442966 2244887514 1235734853 2662982386 567188103 2310418564 2006939058 430085149 2993274010 2427142245 1893260762 2760027176 1948401051 1698611697 2775993947 736915729 205662881 4163077095 4114726233 1331107295 1713204021 3428730370 3404596537 1558087225 2126188372 3359613450 615600563 1576004322 2598663889 2061369412 501714973 1844868853 702220748 1254802535 4034442068 865315832 1212856287 1496418429 3589408914 1278260029 +1486980241 3784210410 +1455871656 1392772027 1455871672 +2740964820 3138023208 +3329860791 3469851956 2454362345 +27234918 4097013399 +3826745861 369208794 +1979355545 1383281608 +2219442859 1915572817 3992360092 +3068762155 49557509 3987336280 3987336271 +2992661573 314431628 +1680964768 1680964784 +3679911768 2717120397 +3508189299 96631264 +1721144282 1493876779 +4100875295 1923584834 +2088108108 3172048567 +2396447647 1558869366 +2979231857 4230388208 +2622292805 246362474 +971280156 3995731409 +4225879216 1857818948 880097539 +1805132916 4037845747 +3560949951 2309908284 2309908267 2123779880 1515345003 1269101941 2107002258 +2226860414 1049935051 +4250329483 1579530831 +793052947 3562667533 +3436966801 255880527 +18312249 1739081007 4041170359 3986723358 1416809449 515153460 4041170344 +1739891855 3495890190 +3876306137 2423933320 +2671691849 4174727928 +1242054738 3707584773 +1144001727 2768868772 +2230885632 4261887576 +1659687933 2196185108 +1277364711 2267021 +1282898567 3876971136 +1605905193 3622564248 +82192530 3186137047 947546270 1832425652 2332975584 4117824340 367583668 3427582210 +261039657 2807632536 +2952223003 3290459870 +3633060224 1425099140 1686906003 99908313 +544253289 2052351054 +353552143 24511419 +490107807 1789733451 2760879905 1789733468 +280331616 2814604799 +2631182818 3301404355 +2026568292 106679947 +2859843457 3629938710 3629938688 +1500636737 1827958640 +1253515480 1984476173 +4182665752 571285248 4173782145 +3877197848 579901860 +4150585968 4150585952 +715345894 366699237 +857541379 857541395 +3099374997 1712445834 +1392353354 570293683 +2024534148 2024534164 +1661313252 3319547647 +2529455846 1027249175 +797961199 2094858690 +110894493 2690576277 79863348 79863330 +3442008997 2623429818 +1888724791 4256023476 3601388649 +3361895377 937008335 684253636 2205552378 65354692 1297875238 3967975880 967600428 2188417762 3785278290 3740606036 2335115271 2218121488 1036443146 4249883361 1998276049 760303239 178480682 1938109724 1967326710 2066563754 856784056 638205276 1768399277 2951573822 3840250910 2339636696 1222053079 2548946304 2424385539 1296727433 3598051923 2117850667 1249568902 285718147 2742685435 3232401551 1050728469 2319080390 2451551291 1467346698 1634302732 3300166852 1132705350 712176092 1029997597 1027824881 2542296324 3978864317 2442191144 4203974203 3921649166 1804427057 3602248074 1014578060 3040854043 163988215 2912099428 2259472086 2290180178 497075633 2604922700 1780889151 985282809 69167803 4070823215 3056204384 3326930240 4262237912 1263521913 4932019 3580308028 3518528125 1493606766 1838242348 1111441218 1631527051 3800568179 440915812 3830665389 2686797992 3165297814 1714299458 1143221916 3989196483 4110830095 153910577 962552596 2409738871 3303721863 1009914156 3108632951 1726539779 1326231401 4254829252 3597517273 4102851585 75686088 1061651682 2021189452 361653529 3627254186 4225938448 2281189861 3273158302 3059236323 3581591387 18925605 3105353998 4122741168 2555065969 3437894379 193881553 3997112968 2962758928 158596568 2232715262 4017121650 238578836 3909048981 4016247279 4047027126 3635204466 1297930559 2946578363 506261634 3502554216 1414475858 3544414495 89567936 4077028306 3659736383 2594417156 3364369242 1989682410 1436977401 3210181797 3097737055 2511148690 479989114 607004262 2232938149 2872825319 3940590672 1621681214 1046419610 3188950791 4067871516 1029827628 3482307778 2964907411 3995108060 3636934672 2557925055 +1421414184 2242846608 +3316116 3819422713 +426310234 3331097771 +2217377315 1092541366 +3828939942 3954555201 +2903559812 4118092233 +4193985858 3361449699 +364038707 3955606934 +1181838864 4103095075 +879407 905139322 +1501753104 156637974 106672135 +3281233674 1547584101 +1849002568 1711182320 3326652253 +1055067165 1055067149 +3164532647 3241535822 +4249412588 2780744833 1817964311 +1409567885 3485762020 72912882 2408076219 +3720209122 3418738910 4092340693 2791820649 +3348817568 3638103539 +2352551848 3707816916 3697189456 4045610256 1709194621 2471937448 +688029478 3420740301 3035506881 +3421953363 1755212204 +2925289787 3060600818 +1222307216 1084488117 +2296567012 2296567028 +2605425350 1041317303 +3682205595 470638852 +2309809307 1445715986 +3684454147 3121635772 2747914983 +3785735734 1546182538 252495873 1844080401 +3485272124 1072493543 +2336470433 2896860512 +4064119693 99933217 +4138307950 1991711225 +569741354 2677142029 +3078826251 4000947266 +2410640468 506348824 +841100560 4224512053 +3356583978 493287949 +317621280 3984195173 +98688102 252214410 4118287523 443936170 2827875457 +36478603 4148008130 +32320403 4247843328 3723449709 2606471276 4247843351 +4078473299 3784841645 +2805513486 712650878 +3297507871 2270871262 3420936719 2044573118 +116079759 1934644504 +1974270266 1576747670 +2504138959 2992640795 3323569624 +14519009 3833047956 2380384225 2481049925 1013127663 +900286381 645649746 +4027952619 3709913314 +2239044935 2359532313 +1412943994 213113962 3727860035 +2916919985 1667282096 +3169920964 866228639 326845316 3496260271 +3451737535 2685270974 +3281571463 2988902848 +529740964 3636378255 +248515337 2460630047 2812859758 +606302819 1356012870 +3494802718 2026202783 +3338201987 3168452412 +1471390252 1766754868 +2522003626 3192044805 +1158253988 1320369039 1376385343 3374103588 +2824624065 1977674599 1748237553 3395167446 +3012429303 84287587 2677236678 84287604 650303145 +288909535 2274520974 +1261484727 347467280 +2391264204 359259348 +1119169056 590434405 +2247038082 2247038098 +2909693557 3842359322 +1246224657 64974518 +2432261277 1319356034 +1711995332 1732718473 1732718495 +143696503 514540190 +2696379150 248952591 +1078590935 192584038 +2681506912 532841560 4221106995 919821115 +581531711 1078874091 3486010152 +2846608145 2750218367 3530289508 2505992374 1604887511 2505992353 712027078 +2638337401 128126312 +70801150 2729505247 +2386201087 616830891 +575923263 749509611 +1731288636 2931251303 +4210283191 3302274576 +2579006202 4151717771 1093524950 +3071715051 598262772 +1815984429 306914685 +3635239589 3185947066 +747084466 2176533083 +2697718793 704942638 1395793518 +3760737944 2004072795 +555786628 2858304201 +431815247 3548252750 3548252760 1080704410 +2476629415 156069366 +3208235151 3750584689 +4129999648 2774385509 +3968146473 2123060376 +1271256338 1517185875 +3813544371 2529509547 +2854662764 1189797911 2881399953 +34644333 3817316991 2905480846 2905480850 +270653334 4215693617 +269961602 3601381301 +977898383 1355199000 +4085158527 2814542986 +1403782116 1403782132 +141966771 86188236 +2795323039 1436062594 +1520115097 2745317502 992974792 +3309497952 3309497968 +2750054796 2519330657 +3587196841 1105190655 +1021908719 3009824300 +3581161995 283821908 283821890 +312826232 4200917508 3528185837 +31810107 924426994 +1220205683 4045998362 +2617528411 3855246850 +3197026894 1220272335 +3278824203 2995743316 +3726374807 3726374791 +2529833489 636268029 +1602566743 4025523822 +988321340 988321324 +1815099801 3907693512 +1996506518 3949824817 +1192812530 2899388813 1415712734 +3123514730 2129403341 +1318440076 1104216183 +3475150525 2877285374 3256322299 +1552827297 1425307232 852917190 1403954695 +3996546248 1015277516 +567630724 3147785539 +2302211332 143140164 +921684847 369989234 +1912245071 3161017678 +4059554132 2478139500 1027061551 +766413938 3452747861 3452747843 +3681545519 592355359 +2366767990 2304471761 +4045428621 2516708897 1289089514 4267500135 3543689249 1272311892 +3011246949 1183828979 1489115789 +770917455 2767489112 +361051194 1341786901 +3490989554 2634080223 +459646997 906467612 +2991559050 2162524085 +13880367 1678718549 2113890077 3549109626 +4078414078 1938390299 +3163386841 3163386825 +1181401728 1511010181 +2133052027 2690105252 +184097117 838578516 +2267256056 3036906107 +3601780017 640484390 +2130727477 3149459930 +3568266077 834418530 +3934711104 3722958604 +3880648530 1908993555 +3691113962 1091143501 +3247923162 2742562741 1965634422 2605442109 2742562723 1948856784 2899929699 +1256845064 4131604893 +2891580713 2058755982 +2835258599 4023451574 +2234583696 1010016419 +1140609538 1968697238 3385474529 2376244915 1789973532 3598105882 685897804 3711727104 3756795521 2986471541 2631998597 4107172511 2271467668 2195969220 2051537201 1584332875 +2842616124 4119630193 +829209521 3614267990 +1544460409 1677330024 +3756100546 2476913742 +3485201336 3168840379 +4272047371 3832721492 +894665881 1789152034 +1834484399 3498850680 +3710461583 3562991322 +710249219 2824564900 +1837946486 1122253398 +1193803254 3277483457 +2532477607 1188054262 +4221848717 2963571172 +1140874389 1140874373 +2124863159 396624409 +3122809520 3019608835 +3641143954 951671763 +2751949797 4098845959 +1162048008 3600594736 2786172195 2786172212 1036412410 288129693 986464944 2719061719 +3315928523 3990140546 +3160742111 3054463823 +4132106772 2437072684 3625945687 +3322815514 2301263557 3993514659 657342433 2678943888 2829942476 +4252493446 2579496497 4252493462 +3673940000 3665941093 +3970679494 1482923425 +3676022097 1032142480 +1527675438 2850986354 +1987741580 1987741596 +3920606281 681103096 +3008105009 1907624752 +2353988210 1382078835 +550626970 3624332726 +2085973680 1786593027 +4254282238 750236361 +1217924624 3190910059 +2974607837 4213722167 +3012307231 1465097162 +1132153035 101947266 +2064926100 3547408715 +3795985430 2406886027 +2539524369 3503508457 +3683994963 3496492017 649873878 +142511759 86997309 +3908992499 3914169207 3147842956 4007368589 +1090530465 10030278 3236899683 4098244982 10030288 +997501276 2065606628 +3829279151 3829279167 +894874036 2876882521 +571835192 2462811015 +2180285025 4108926624 1846524522 414749057 1846524540 +4239568089 2081690639 +1620151938 1604412042 +775671402 775671418 +1560787222 2827484564 +3762449379 3952072266 +4255135496 1261871499 +3978567391 3978567375 786209054 +387818353 2978883981 +736797147 2635384200 +2685157478 1497981057 +2435788092 3376690535 +474036140 648717249 +1299372547 4006425276 +3777502437 3198568455 +1383417985 1383418001 +1832212557 1351606706 +191251320 1778136571 +532275196 561149540 +2376119382 428301034 +564869654 378302641 +3650859039 1745353419 4203079841 830200886 1745353436 2937471176 +2992355562 143808338 +597579378 2218923365 +742324299 1035835759 4062240276 +465824232 2640918571 +1671391981 3237303044 +191431367 2341495049 +3949051196 3336365415 +2546910432 3665816741 +2807001664 2719013587 +4187179937 2212499040 +197096828 1035694124 +3406650510 872985497 +552194009 2836542088 +3887033981 908783316 +1567656585 1547703798 2593357625 +1630887568 2533612707 +1773557293 2585084980 +1409927386 1409927370 +295109217 2614376592 +4084244180 931801151 +2643020558 3123739801 +3364895002 1234291445 +2538275262 3910385161 +3452521222 2833160789 +2904669478 4067913774 1152297630 +3381445759 509548092 +601686855 3425045978 +3614532005 3430725292 +3967604401 1944481088 +2097161073 1667226289 1708419094 +2493424698 2359317945 +2050370352 1932306829 +2220499250 2346860965 +2612711294 2769593161 +3863902646 1759505439 +2957387860 2175176104 +1760691500 1627268183 4044558935 +1325188932 2616045577 +3423557954 2119764811 +796359818 3659212779 +2614058581 1554490499 346829126 +2252160443 2130670718 3455559282 +3801463780 2511783935 +1706352567 2330310937 +108451647 2759569024 +710258487 3689075590 +2073666800 2195629532 +1854372583 552695524 +3635328801 1007306998 +3400014130 3400014114 +2810808161 3409610955 +2972846382 1900132271 +2059997441 1267057792 +3679342053 558145388 +546153555 2014181590 +2329570380 684367457 +3596571953 2836601904 +4063048668 4063048652 +3835468840 1184289207 176804605 546547472 2163244620 +1064039449 382536936 +1765109831 66771780 +4175277052 3237330353 +4121667822 2872766137 +2080688959 755514519 +2678369520 1077689813 +243472880 1191316316 3361854677 +450664579 2347846324 +1984935983 1853813240 +2858505267 1782025306 +771376890 1526578059 +2887558011 1813338802 +4068299517 2899616123 +659790087 793055763 4019840512 +827535097 913502921 827535081 +2180686956 160486935 +3850009205 3148599689 +807080137 1195899707 +4160726465 678555350 +1446370097 3888647728 +1334136580 853238623 1607762756 +1678035595 4270512322 +1827427803 1393240018 +4293106517 676169436 +1654377300 3224821428 +2851073660 11824423 +1442918881 1155630368 +174801192 3663384917 +593974579 56771744 +4225394646 4206664353 +1755669859 4281634711 +2811425824 1893558509 +4086583191 158943910 +4177265127 3737417209 +3104042929 163809197 +3311562529 3035051584 3627322310 +450094755 3734246045 +1970936982 2235236401 +485961311 4162715550 +2955444551 1444800281 +4015181218 1633269251 +1318365200 3291516975 +3577978575 2768814362 +3317887343 408427948 +2319545134 3808979593 2769826233 2769826222 3328426274 2319545150 2536073627 +1342646617 3361104958 3361104937 1342646601 +2689102955 470339796 3823149410 3803957003 3171894397 +1821216048 985125003 985125020 315966101 2422681928 +436529315 2562341002 +855373041 866293606 +3942572957 3946718594 2599601515 2353025076 +2120973540 3879049983 +3525563098 2825186603 +3215321296 3075864052 2184019811 +1494015825 1884698358 +2966367387 3391880681 +671121718 785082375 +2017488051 7019980 +810490887 327753472 +3776464770 3776464786 +3465358303 121376769 +3519077793 3550274656 +1749800270 777892057 2103495129 +2118513311 1729949768 +107994253 2937598450 +2582146684 3303402791 +1939444901 2680487852 +3351269913 4063468265 2361474398 +3207921539 2205039402 +1277989259 1136260280 +1829588238 3293138575 +2476530591 2554188363 4276992840 +701040063 2255752104 +3119340181 766452026 +1944249793 791654080 +2120468520 521410283 +911157735 2570993139 1704916640 +1078157326 3705903564 +3046134866 607436058 +3622148447 956373786 +3150906022 1289825089 +3712095986 3712095970 +1319679621 1486312268 +1016182206 512331863 +3395151899 2899600004 +214741096 2715153044 2360286544 +2123359322 2525264299 +2510472969 2554286894 +670465849 3612071471 +179509062 502113057 569016070 2629314362 1410854801 2626192823 +241706498 2951992629 +2571286941 1695345538 +2797829171 3099362394 +1484655297 458516454 +2834051496 3825467968 +1425445008 1344639651 1076197779 1425444992 +591424097 3015502424 +3132155733 964438748 +727249040 3439506101 +311637662 311637646 +3675876244 2510161344 +1251613227 3322666223 +2507773981 1802139042 +3856191648 357993055 +2030019168 2747528792 4261110075 +2084284121 3903643049 1793566622 +2417273824 2401453741 25707076 2777824984 +2413354682 2961963413 +1492449545 200910523 1598463712 2499901554 2499901541 +669807264 2033742323 +2891652605 3152765455 +3099345138 3260693747 +1772949703 577857878 +1797666113 3995456854 +754458047 2308363198 1081028988 3673643974 1882523038 2002393007 1458908663 +655194505 3891075999 53891768 +3419647884 1782405495 +1909304775 3989344342 +3271218842 2084765662 +3095930937 3075953086 1551216137 +1115329288 157820469 3505530756 157820451 2935321995 936796720 1899246815 +1708489478 1427155553 +1326407871 875908286 +2220115125 94906620 +2604026385 2779938721 +1236991020 1236991036 +3759360215 2505812592 +150421438 776316394 880185985 507874474 3677968387 +1388740364 1517944823 +3514873992 467394224 +968262634 1737333317 +1942221290 3971558950 +536735500 3324690231 1757368289 1757368311 +2092074242 3170027542 +2717660144 4026909379 +1835874777 2618304681 468848798 2618304702 +4225713563 461017874 +3451067182 3451067198 +2253003129 69519087 1961175598 +1924043135 131009278 +2294192682 1846325261 +3564645081 4262067727 +504780906 1730200274 +1705800591 2642012696 +3851014521 3851014505 +451100895 3940407708 +141377892 2818437247 +902452124 1208786512 +1850470830 1850470846 +3783688837 1706743937 1409547884 +2717644505 3634730910 +2010142433 1568617167 +704671216 246223061 +183716403 603445409 +1552920288 1102388802 +402398195 130385177 +3646940591 3774255726 +1006263968 1829312379 +3434583562 3434583578 +2511862319 4279106427 3751729144 +1410592442 719411566 +773132024 2194489867 4134888584 +3596782048 3872089411 +59956716 903313687 +1606562368 4273281733 +569137301 1448169274 2448811187 +240291914 1379167653 +1069159783 1096013171 3102716192 +969271395 1435292636 +1135750193 3262877990 +2811125097 773655630 +4008229268 2891719673 +2633584851 4017765434 +623905040 1118568356 +2102309257 183766835 1296672864 +1145698961 3252872225 +718803170 3056257969 +303763970 2191350051 2191350069 +3581845722 4032247613 +428931266 2641730182 +4247072911 277573902 +860871838 1689799849 +4272937000 2700227233 1971782288 382813931 3899834435 2055643821 286446583 1955004682 +903445197 2455523492 +1602094517 140704746 +3622608624 355195284 +2735981133 994925490 +3723962684 2820008295 +433441452 2510164929 +3945934 751350617 +3030273434 4013173099 +183639517 405078772 +2801326338 3686637109 243265821 2860922766 +3957480365 39211346 +966431197 2330300971 916659669 916659650 2337513186 +3862649423 3862649439 +2330981842 486241251 865890064 218340073 3824346464 4059456900 336869623 1740716656 281497788 2806720261 4126103560 1497695433 902919530 3830082438 4107960710 2613888134 2428795845 1871070136 2767316073 4034880843 2126688976 3566031215 2114138588 4011274279 4001621878 3248958809 4239633058 1179089254 938359210 +4047385637 3924563500 +1613353662 4182910985 +369692094 1849729545 +351324890 3507442987 +3822156652 247810839 1100288640 +3103965903 240692174 1771470527 +4157351551 1337833153 252856380 2751723778 876674613 +3084369362 1634749748 3930133149 +2241028825 537172872 +2923886288 475267880 +2905849841 4237596822 +2491373625 3250085384 +163349579 49546607 2663662100 2789291260 49546616 3090057397 +1056721457 1360969611 2366293862 1232635211 4062164448 2962243427 526698900 +4223154111 2239136897 +210243846 116907846 3224554615 +4245462468 517757855 +2538267892 518417433 +1632274157 357721860 357721874 626163796 1632274173 +1832221391 2070764081 +92186127 3042929048 557007000 489896539 +482398310 2844266647 +3742492789 1974004999 3921796668 3974415601 2654007356 2899347627 +1734688104 744467115 +3652860940 1326996083 +2865530758 1710839799 +4225648803 51346832 2873428253 569137290 +599818528 784219629 +57846506 2623028702 1468206683 1405573212 3612045903 4243154046 3628823509 +2818721851 3063395570 +4025734949 3789270842 +998782486 1787411142 164672247 +210208006 2886103889 +1849008470 3563911793 +1603645522 1021721598 +1748447796 637033096 1122240473 +2648755038 3873449215 +2557100548 666011152 +1971747776 2636867140 +3631084257 2517981238 +1851430754 3062242734 446451541 +3720284971 1052677282 +4007353751 4157436014 3410646194 378387321 4157436025 2271739566 4157436015 3479926994 +3838979823 3463516144 +3502798071 2727354566 +2471897469 4188003851 +3767136959 942219966 +3582963314 2737806693 +1429082799 4138957009 +1455589018 775545981 +1124419990 116514632 +2875193682 701652215 +3958953886 3958953870 +721700779 3296889879 +1226162836 4089203302 2705411823 3469691820 +3385709540 2466549759 +2755022889 3922484389 +382866995 941975380 +2361220515 2361220531 +1262069510 2176976817 1262069526 +3801590615 197310960 +1882652975 880663148 +1615061237 4124799402 2145067452 +2911367005 2315112308 +33843295 394847750 4271344869 310516577 2347781534 +3009784288 2691134651 +3524202125 984868836 984868850 +1138514133 576711020 +4093995181 3515074642 2066235612 3160283719 +3922272712 3483381195 +513661699 897566122 +2984009604 619956338 1357911739 +2638466046 2411339999 +2351354399 894233803 +3218815161 3330756661 +2090432189 872529333 3801475970 +606548828 2386945031 +1235679082 1865939411 +200390992 2992275112 +277864976 578871075 +1953412813 1528865842 +3015567299 4259119536 +1053296548 1933742024 +241932875 2336230255 +3233462420 4193292527 +2287691843 1119073831 +3858788148 3260652000 268341523 3361317751 3361317728 251563917 1654422924 +333721876 1681474159 +95103103 1802551294 +2690654500 2605984703 +1583537434 1730088674 2946633707 +2252556849 2364394278 +3277530740 4236085401 +2627475593 3957502111 +4065982653 1084395906 +1754560175 194950401 +1813240691 1333692583 +343137258 476262747 +4287566055 1720319219 892836768 +2322335881 1896968110 +1904356820 1201610136 1759760169 +3068670189 2155640705 +3224055733 956045820 +3791275973 2180971290 +918512977 2120953057 2152496774 2152496784 +4131327634 927199187 +3889740233 2718292652 +2174131229 488096162 +3278007287 1898175580 402540642 3569421372 2681732783 3717994302 2029085731 2810187913 979245923 1420819387 4272946560 3192213565 3740960983 3142148330 28774612 1116961100 87538646 1062362133 3426830016 1018360690 1437796316 1038061454 1937467535 4108522893 3345947183 3035143274 3774510073 2616068483 2002083236 1906311840 4089829682 3489232589 +570468038 657852610 +3469516850 4289299405 +720389460 491035438 1090537849 +931713586 2657281203 +150930717 1182076084 +4156352801 526581472 +35709067 3837885122 +1023848229 243232842 +1052382174 2632795775 +130349114 2542366485 +1866250568 2932099119 1687661652 +3098349068 3295485175 +2290703038 2923026697 +3031899593 1162077038 2011104825 +545814785 2091261990 2091262001 +590170150 994098022 2252903383 1643190490 994098033 +3959691387 927903038 +2280857823 3234275659 +2241064921 551719560 +3204647597 2631560936 739613319 2511330809 +924353059 3734297866 +3418616861 3799599522 +3073096727 3073096711 +4036611737 1528838878 +2015370833 1804581264 +2458425179 1441541560 +3273486724 2874782431 +2926928992 46990117 +3469446312 846097515 +3618168692 3805784703 3802720712 3618168676 +184238111 1753608414 +1784320308 1891006292 2693960911 2680181151 +3768245392 3768245376 +1176431502 1863078158 4037857423 +3849489115 240162514 +1349874560 686084755 +1856741183 3250999036 +1632274149 223500908 +2065644247 229641644 4213598916 1210703787 1600247028 +4246518202 775446475 +3094784422 147656791 +829477252 33523165 +882740616 1543884061 +684905264 1944220803 +3492818385 87735876 +423722095 823583416 4278642604 +808288749 338499291 3299051524 2674865234 +2814386268 782770124 +1761916030 3496485449 +1627509897 1054970808 +663931335 222721389 +1721609668 2885920952 +186137561 186137545 +4003785212 3055423971 +1300706169 2228619112 +3971483421 3266523828 +106778505 88007420 +2539427016 801514864 3045476359 309353955 247346909 +2504321617 1283251600 1283251590 +1985173669 3929312172 +2737622684 168759633 +2627118497 4272512007 +2019940567 2019940551 +1950594434 2291579811 +3394080926 370845887 +2702867725 2525983858 +186865508 3970077311 +1356217970 3007597939 +4223792976 2366284461 1035378468 +3189653636 3449786313 +1985994640 3907841973 +2036507442 1212606373 +1891532913 3510275329 +3151258203 2670961150 +2019065852 2280198214 +4058254906 67265867 +1712181421 706583450 4221524091 2083232806 1694969281 1426415473 3945202367 2381955903 2443778044 +3942738441 4231654446 +16121743 3570266060 3001852963 1340898799 +680919989 2569524714 +227489663 1539748695 +647628784 3027926723 +673914600 3107603732 601990973 +3424222988 69987676 +3358426200 2007455387 +221061481 775769058 +2610755122 706187429 +3195709309 1477814723 1477814740 +3220060710 1241876929 +3483437669 4123745674 +3744835012 2189977339 +2733608624 2120090964 +4168260792 796272835 +3584093118 1607812318 173218847 +456001163 1416907988 +3808826167 1756527119 +1857634248 3807410839 +4081206762 3679719250 +1965198574 1399052966 1399052975 3962647361 +1929880416 1963339827 +3253763054 2891208383 719727140 999495609 +3215717794 1572056597 +952543623 3887914902 +714414305 3921029664 +47633832 540170109 +3041449928 620005820 1984289013 318008650 1195506464 1984289012 3041449944 1984288995 +1440249126 2760127030 +2923322534 2517051970 +378085160 3328628983 +2536807799 4153230324 +45137984 2084480197 +1868208398 3541189906 607484569 1503588633 +2131347352 820738144 +3951121311 1536598849 +2226114636 751101879 +892194610 726525854 +1121215975 459041462 +4267904843 3123331509 +304679405 1047133266 +1404944715 515328258 +1348885139 1348885123 606115180 1263221015 1263220992 3806455229 +3184223068 575546184 +2566820181 3222245443 2566820165 3444971002 +2066870878 1302366719 +2057456642 259893027 +3852674115 3268547964 +1184415699 4118149413 2746351702 +2292743296 2705063315 +1210262175 791081308 776962142 +3423404523 595199220 +2472219078 3193764535 +3561005246 1436058078 3753708319 +4132721744 4132721728 +4283865186 4283865202 +1463489600 2449531077 +1671009200 813209800 +2105071030 3111076362 +1078799173 1084060217 +235231999 292437864 +3738903820 3741012471 +1481443297 1534096124 +623022061 1538969544 +3296273192 2277539063 +1610348015 144975672 +1881161093 2537426963 +4218350588 1851957979 1835180357 1472537791 2633934764 3416096167 1472537768 1995105316 2688966354 971824551 +2200930705 349540176 +1194035299 2845839475 +3247634044 876618331 634484644 +87096722 87096706 +1435377945 3351124552 3742796664 1116175029 +1837274237 3784294612 +163818561 2704431829 +853821231 1281101550 +2640046188 227683064 +1404388672 1404388688 +60805609 3815253838 +1838556849 421030867 3038927799 392707392 +2196182293 650522634 +1010385577 1998843928 +1362131299 243334224 +2272850189 1348695908 +2269564462 578196079 +115612815 1746466072 4148810956 1865416049 1746466062 1463132492 +3306496497 916195032 3515482566 +41349432 423476013 +4062733414 2151009125 +261115801 3025076815 +107897163 1791174941 +467251937 1029402262 +1128374796 3964803304 3980211499 +2451751576 2451751560 +4217051640 2825511291 +3431589954 1058578421 +3003753712 2982784099 4134473308 +4163366497 4163366513 +49290427 3665982703 +1972153216 2356279955 +1099533298 1099533282 +1080827596 909409057 909409079 +1119391655 3278757463 +4070949693 938629378 +3566849998 2082611535 +2820641333 3736283498 +2407302164 4110674799 +3589818018 3589818034 +1422870693 3081595641 +1655283919 537404878 +2459011277 2283428530 +319830067 2446679991 898136140 +4278270016 4278270032 +2162434761 2955068024 +1842704898 3153363503 47842075 +3990401262 1858204570 +2471184857 3095740574 +3616693049 2489686696 +1108991616 2872964024 +76217542 3972787127 +4165218327 3931616304 +423947261 3296690004 +827054084 2657422943 +1843136442 2472659587 +626898653 120659793 +3784267632 659965149 +3964636751 1346176593 +3692071142 1222782908 2134989557 +3433536307 2752841094 +1108617807 3222075546 +3250738878 3270413577 +2915940590 509496697 +3834538752 3425857811 +1280898333 3901117186 +3154460542 2051208009 +710896935 2054574899 3677934688 3059917241 3677934710 2054574884 +1425283158 306335591 +2972953589 3914838698 +2081483974 346340257 +1057618270 2595458814 2595458793 +399650390 351667510 +2335212257 2751917318 +1581051444 2380987353 +4094433788 2052112867 +830842212 892482622 +1268766844 2292304689 +592080015 4284523724 +2167538080 28872435 +1599125 3163977313 +2439954425 2135756399 +180757713 3337352464 +346254594 2080285981 +163634211 3595107600 +4276845616 3844396939 3658036808 +462741183 710583998 +2447383677 550295764 +2112735001 1448111199 +2966332289 1856933552 +798740280 709309755 +4142918634 2779799899 3060362278 +2775930703 4167327802 +3616173326 40833405 +1503277932 3324651000 +3449980152 2933346939 +1151354716 1682986439 +249761384 3788406932 3614420413 +592386998 1267244935 +3538127720 3538127736 +3843527398 210845697 3274422322 1544443229 2861080775 2604810514 +1211314962 3130615123 +3523802165 3169344659 +2329008068 1280747935 +506185756 2599158801 +2741149593 3443604958 +2321226310 789186618 +239464012 4052456991 3014872276 3289784759 +1417243563 1693369967 +3868259145 2821772987 +290209913 1706496812 +1636284083 1000643546 +1076996695 1697588976 +3813661420 3266683272 +3266501408 2676945765 2466850811 +1306549556 3306480413 +1207113081 3165310312 +3181537989 3181538005 +2948597238 2705941073 +1848531449 1811391208 +3382400684 4049373889 +3980964183 3765382118 +3135321813 3994173559 4283001964 1360681886 1219468932 3511174014 1433054870 +3682947253 2483353107 +3803176325 1608104012 +1580295543 761680169 3200432710 2626374644 +2060357551 36450424 908668317 +4228144879 2850124334 +4228531424 331941805 +4231298352 762114440 +3171898590 2099419497 +949947056 1051937291 +1884567734 938361610 +788864246 4211906385 +1670811015 1291897728 +2738039855 411995640 +136262870 1722199991 +1637080319 1101497748 200614588 2596595070 3906711105 +3622869958 3049601207 +774516778 774516794 +2244634912 3181608293 +642598218 2510558075 +3089254302 2079767977 3832329150 +3090973417 4030862552 +4136872201 863181112 +3436417681 34585168 +390375819 739698132 +2944860614 3267713722 +2682867119 2068145086 2682867135 +1941849214 197457064 +2231166936 1748151072 841021723 4142403443 +904668243 3070831066 +1949405325 1996918244 +2328010608 2377043164 3764452693 +515301875 2576777056 +78646050 2200012437 +3070905749 3124240778 +4193914797 2070075397 833006930 +1326512724 3442354629 +394802086 2680574705 +3264106422 4228348817 +3704879752 1474763138 +2544845188 882122694 +270949171 848804512 +3942614491 3409950660 +118013408 2246125233 2681573048 3882593371 1984121334 +3082704173 1839207890 +549447345 1058547878 +3484985020 3148773873 +3251884156 2624664359 +1109312325 1533896090 +2400259486 1656220094 3319289497 2400259470 +2208642516 286506159 +3508406944 3528112613 +3853521416 3853521432 +2452245317 3938564476 +2922968943 2997715886 +199270222 10143705 +4277989246 4073691181 +890891141 483246682 2984833981 +2882941958 2285102455 +63442326 1213500398 1213500402 +1854682340 282426340 +181381383 2737999642 +3045764993 1246906399 +81520440 3727490363 2625310272 3767571411 +1945478670 2578737177 +3631072959 3393078571 +2108570827 2756293533 +1976104149 1079602012 1079601994 +3741908378 3039246717 +1491474384 844688445 2130437140 3924895979 3258416227 844688427 50703912 +240879435 4091374005 +3989375143 803348704 +2435929338 3349846657 3882443312 4033441900 +2047227353 4039558302 +1502488403 4022691052 3115573201 +1785143492 544330680 544330671 405157508 1146655903 +3552293496 3363435259 +4264241467 1492248562 +511941233 2049712112 +3838999220 2069291352 +3721577713 3721577697 3224348033 +1409636436 2557086767 +107426268 3603842704 4034100561 +162764828 4066298276 +4175156294 3458674760 28521867 135211553 +1899703880 3068416885 +1199370847 3903949704 +1425740144 926708565 +4274292520 710182723 +1359844965 2278256803 +2812349215 1791128813 +3743574126 347949305 +2748171778 3740185891 1436009770 +4279723345 3805576838 +2512002219 1593516322 +1456044236 3536568055 +4211212792 3317019264 +496433260 3960249468 +2944703665 4274170534 +2314708746 987493563 +2703072080 4053499619 +3110848094 2712240173 3816365450 +674643027 614748352 +1190675099 1190675083 +1634767043 2997768871 2422219051 1112443517 2997768880 657711868 3374775528 +2003179731 3367572538 +2719588663 1700317574 +1840051425 3076892858 +3378179845 2201903933 4280698074 +1654987395 3437804604 3462419047 +3385354993 2541771120 +2889097245 856591796 +3522204958 1907611183 677677067 2505746004 2612706857 1559850779 +244111925 2771171802 +2537895237 2537895253 +1630353887 3643939336 +3340348694 2204858791 +1853816626 602651557 +3100836489 2100100526 +3504877993 3543723278 +1025018773 3265510300 +4003137688 906921805 +996178684 1960942257 +831719401 4084560856 +2829025110 4089855521 +28893974 2244824362 +546574920 3271676183 +3580651647 2950115979 +1765546879 681527550 +2418541887 771768894 +1336978934 2220747212 3908165881 411060293 +342960050 3760291123 +1424942965 689331516 431627235 3509886464 3487315422 +1459702498 4089545665 +1652951887 1745079630 +730527265 2898359776 +664293926 569103729 +3975138559 4236227966 +3826762045 3826762029 +3489275785 4022314158 +747978416 3415532319 2797905988 +1642733758 1642733742 +765271716 1918319679 +2929382417 4005287632 +715545936 1944380661 1716809148 +288411030 1543940567 858379873 +991729541 1096419639 2610703599 1656990617 +692288519 4231806742 +1674048753 1482477933 3869265738 +4235013550 3303583790 +1453394677 1417953212 +2044378911 1292575196 +3718889150 2956412191 +2444891739 783326270 3270586706 3430934044 2382588791 +749439762 1678503237 +495834024 776221053 +1342686925 3376280754 +2612706877 1677294100 1677294082 +3392994151 3253792314 +1565513933 2981251762 +2775410055 3427725971 4063679360 +2832823811 3511994044 +802301523 2597475500 +3198115305 1995477838 3231327167 4259370446 +3169397234 3598943131 +640079176 591280991 +3608819987 4229592372 2974275820 +4108167748 4108167764 +2381604676 2449523188 +2288047923 3815949658 +156821631 905314302 +2170994605 1639955780 +2013279709 3310668532 +1009665320 3839286763 +2592002270 329436521 +3433136495 2893359889 +1568572889 120370334 +2177124116 1543234671 +1834716776 2401316267 +1057555874 1000767165 +1830566384 3010409692 +1416017517 126298271 652917956 +1376812177 105002550 +1514956992 3863537235 +3937229523 3239870487 +3995680877 1475373956 +2641269621 1242702122 +1001542822 1795081633 +2595812149 3324435562 +3844388409 4056603582 1616374793 +3653164693 1551393930 +1942338524 1942338508 +4042397909 572331850 +1178627429 4234950124 +1334085125 849279436 +2232204466 621612083 +4143114116 1878906991 +3238501593 3086739848 +2827612785 3257444336 +3284501771 4150630631 +3041922677 530042195 +1203471954 349016093 +1394226367 2436958398 +1907145645 295920645 2683007314 +1595493958 4208343095 +3552576719 642224600 +1588813350 3082535270 1469811418 979187159 3082535281 +1033914996 2002072729 +2520274131 1303218234 +1079050509 1283762020 +1430969164 2748196215 446870556 2430023863 +4205386734 1574255794 4152879214 2251749295 +893313524 4023077438 +153310258 2493352613 +512806180 572708516 +3741090921 1887727950 +2867606338 3738336169 +913968201 1937496238 +648255453 2965132721 +2229900671 4126817217 +3385093111 2217684903 3723623600 1040487139 3656513140 1443149993 +1012603662 2069810329 +17028381 828125954 +1768149967 3141299505 +1983105686 2844256807 2575814881 133536630 1983105670 +4047406907 2293170597 754132317 2747895745 2391643052 +2139704427 73610327 3849236459 4158360085 4186295166 2643219385 3620196334 807619682 999381656 +1843022278 3030524577 +1153207475 3133736992 +1914716968 2861343573 +4046116193 124643232 +1955529156 1955529172 +809369564 4224653900 +833830287 1870986015 +2318006249 2080444827 +4174787870 3610615337 4234676810 +2278577525 1106675516 +1850660388 1850660404 +531354531 2122197386 +2735291242 294160347 +1958258449 2469100006 +969120087 1172988912 +1195316451 2871856965 +2635502475 3582608322 +2653742670 2730990507 +2004552188 2004552172 1931099388 +1341167078 3183212823 3320389414 +798221601 647937721 +693597136 1924116088 +1340093273 384881928 +2022486891 2022486907 +2259074134 1316649841 +1461680071 3985215062 +2225607229 294958612 +3837861588 4026763183 +3476190653 3916388482 +3794906172 1345462887 +1776818899 1776818883 +4154633076 1420879892 2740295112 1226041241 2740295135 +3008488158 669524841 +1107781555 2762489548 +305594919 1035618489 +1980026634 3384257139 3549555885 1528256134 3384257125 +3728905315 3184265476 +2741803751 3165149555 +4113541892 4262082399 +3709165067 329452354 +852138974 277683956 1354402989 3568013473 +2405559701 1277755804 +1432292777 228753688 +2222336597 335230716 +1496363863 3198833126 1894105545 +148727580 859055782 +2665248596 2700278539 +55451387 788186404 +3280090602 1965465470 +935078676 1133804672 +3397210318 2437297231 +755139944 1123549867 +4194562891 3384348085 2032569464 3744988930 +680289976 2365961124 +3307833978 3230240854 3623611221 3664051741 +4047366011 4047365995 +1288767088 1561141827 3501001675 +1169097452 117745152 2659293569 +119656676 507238143 +1181292363 2221525801 577743636 998676917 1237995640 526480414 +2891133011 3819239853 +4148874720 717363123 +2431936515 2431936531 +716736458 2130309413 +329696317 747039746 +2062312044 3995004951 +2257135519 1760124744 +453617262 4264623919 +2526046334 1457756621 587291921 2780813344 503265272 2929018697 +2730870848 2524510238 4174888832 437103131 2103065811 3782109578 369992671 +2658066055 465800814 +1534336050 1534336034 +2970831602 3009346277 +1601721041 779327072 +2692737470 1734145558 +723308810 2240052338 3898413755 +1955648606 1955648590 +3627910716 4104954343 +10498222 2855051759 +3051602865 3051602849 +4108915227 1018241179 +1507311175 3047197142 +3507949272 4283194893 +735141550 2828536825 +471072859 2517995099 +2875068478 953284598 99597503 953284586 +2060108780 959605888 +325791173 1723410012 325791189 +1568483996 3356103569 +4150546619 770381412 +1111201395 3554888932 +693914066 3997709715 +1286875134 3181049055 +2837392412 1477603335 +3807176234 4264453779 +3875830635 1470814026 +4240027533 1699699442 +58339479 274365872 +4056550439 2776245544 +3554180074 3554180090 3215741522 +4260040001 3980095089 4131093652 4194688342 +2577488844 4052085972 +545699027 118401082 +1173618750 1308852666 +563890484 2338638239 +725457633 1586427335 3112352002 3067462918 4076523552 +1740146668 863893655 +4104832510 4104832494 +457156741 1781942618 +2978896044 3757855169 +1113688418 1113688434 +587453299 3946613984 +4029179844 2794320568 618018868 4029179860 +4078148340 1909115660 +2586082416 393208899 +3065151725 729926469 2281764114 +3087856334 2321693273 +61182968 1683875987 +1145210619 110297023 +2378466999 480481995 455925571 71071088 1988754440 +1297663399 3184301737 +3282415440 1305672437 2868524103 2082543096 1410813298 1612027259 +880376070 2728140305 +2394597837 2094615972 2094615986 +1559513206 3398308305 +96327093 3201788924 +1035110355 4077637946 +1864151157 1596573739 1596573756 +2602988923 3096113330 649646655 3096113316 +3256050189 2441304690 +613979815 1127557366 +2759213680 1468746732 +4174191503 4256870250 +1128937222 3803296890 +1032159820 623648170 +1147464939 3844288280 +3253615946 2483714925 +3280074695 103751321 +912300891 4111765586 +754067196 2296254631 +3467381041 475210689 +2873702052 367934878 +2550053604 704656639 +781694118 4275134807 +122646455 3745513507 957144336 +621019735 2622467824 +539544261 330087907 +2381972443 1536430546 +1432570273 206366838 +2859405191 2859405207 +198453490 2432464101 +2817850868 1252765183 +657398899 573163802 +4140615385 1566377864 +2051037321 132071547 3634863864 +88810719 877333256 +3208176173 864816347 +1509628247 1422449242 4249412582 +324864894 346014797 413125257 3296855332 4185462623 +3853260265 1994816984 +1048759608 3907183556 2682851117 3907183571 +3588839495 1004411469 +229255688 2329946763 +3066394486 2312651585 +737332842 2570776781 +1931000981 3152868484 +3093511164 1819159335 +4269801430 722989750 2038414823 +3732674462 4048400154 +3187317940 3313807193 +2388540413 1312236770 +3787395450 3634773055 2644186939 57517368 3653796637 3970679515 +243825347 2748924138 +1339227591 3950862048 50992845 756932761 3934084442 +4003486131 1500329164 +819815885 247519663 +1796887335 2712017245 +3619255289 2448527592 +988252627 2373842732 +2544363709 323125154 +879663296 1243248211 +2163690821 1246667674 +2588046012 2588045996 +477878650 1626177386 +3000374564 2869118911 +3117406124 774931400 +1632949252 1015661129 +224929182 3102947263 3856712126 +4185298923 3940569624 +681330477 453249988 +1036346016 3719971315 +1566731527 150053376 +3993581833 3322454149 +1844024643 2239114022 +3101939285 1672112092 1407515635 2940297978 +358184307 2980994385 1670381302 +2382568075 1365986677 +1832295269 1832295285 +3498607448 2665923468 +1221578651 1221578635 +254581602 1161337685 +3320683692 1091412673 +2644982561 3137797958 +2890893287 3895512051 674427040 674427062 +878471966 2340200489 +415530325 1381059804 1610342906 1610342893 2306533619 +435426778 2084230563 +3464867072 3360029915 +3268060362 3087152582 3124352549 +2043647357 1053316052 +2755093719 1513340528 +3322963512 3833975104 786474180 786474195 64023085 +3988727634 331886573 +98253933 2770345860 +4250269897 1074207859 3528961568 1231201393 +2384596260 4118972175 +1721571138 3410730229 +2702792980 2934389359 3472952447 3013387764 +2485762065 2683739574 +1074881199 2570840679 +3513900267 2705245684 3385958159 +81520431 3494192085 466452950 3576491758 +330449608 1048622487 +1028925995 4243836504 +1141004031 2120819114 +3584353609 2610229752 +1727053189 2449102938 +1254700684 3265139383 +261546465 1803916576 +770234568 1116198076 1986662768 +3698489054 3730085118 3861979007 +354516674 96111477 +1808736011 3419731964 +2614949657 1977154632 +1076191823 1239007832 2580344987 +3384509926 2016659713 +247851172 3851237929 +227597403 3054166866 1331135845 +3522592345 1821192311 +1664427260 682178727 +321775448 321775432 +3902086558 696416681 +1464531787 2769867886 +1050357252 1050357268 +2364129253 2854014730 +1043505813 2125852828 +778745390 778745406 +209795820 2607792535 +4029996442 3174619499 +1024075036 1898562572 1309707207 +3485017710 1853325103 +3958508264 2882887870 568794474 1917549759 +2294523261 2294523245 +3733844620 3849638504 +3091925188 3223535559 +3530829142 2732809830 2732809841 +2090953939 2784281277 +525910289 3445011927 +4016048317 2435694996 +851374417 865460880 +4228928840 364265547 1393101552 +989599318 1236675894 +314468886 2546008231 +479619901 1212614196 +550095033 1453783848 +2978247286 1540044353 +1542557520 3623874493 +2862382176 3039155288 +1038419261 2894544660 +3554767344 2078694595 +2032491962 3547467907 +1157105116 1852913991 +631345326 1754483513 +2135040573 321912395 1595039951 65738036 +1340684251 2804084178 +192769394 1082012442 2289257075 +3981212625 3355600758 +744598597 1370653290 +1188183004 1188182988 +1985750000 1707813784 3604324443 +1166784539 2515718802 201139877 +2383694301 1269706430 +562966105 735245832 +48836296 2663185048 +3254251404 3847100791 +3318582480 848604003 +2094615984 2284858883 +653911161 3578946632 +1840750340 1182921540 1428167663 3155120991 +2679053740 212579784 +2474128135 799816723 758666240 +994768697 2416127656 +3997750242 547313454 4272262357 2711394045 +3862796182 150315303 +3489087969 1128052022 +3345207713 3860445649 2200109174 +2747837652 3540610868 +3960046192 32499659 +1105268228 3033141776 +1384727956 3315469545 +4269447719 3339569203 3254823776 +1911843121 2495715376 +255735977 255735993 +212848593 2781338465 3385075206 +3475479639 3475479623 +3203283097 3203283081 14689641 704846024 704846046 +692288517 4198251468 +4138352674 3618143549 +3089150352 1802995107 +66281512 1612734187 +118671136 1116698483 +1271961313 2657505646 389488902 2685382939 979207222 2640728024 399690183 +341664616 341664632 +1216491179 3488577332 2314774232 3488577314 2759365333 +1509821223 3738251090 +3633438463 3970042750 3349473670 3944215740 1420127047 749487169 +469823212 3950194230 +3614767894 1126646705 +3963227889 1976631169 3496314214 +238596935 601001241 +2065826666 107943018 1082875853 1413086918 +783816315 113992612 1244016535 1378735340 +4138024783 614171005 +752643674 847770358 +1015154829 3451090418 +766771309 3118605586 1599908763 +1459022108 45152017 +3055366631 2532675232 +904320825 325373630 +2281213371 3343326578 +1473443328 2414236834 +659592045 3592970692 3987700911 +2874863775 1596508766 +505015299 1446633591 +183991054 1383749648 1065256314 2056881359 245931467 551391476 3735827766 1164140546 2210529299 3436766894 481208578 2981720476 1934181848 3946398855 4118412520 2678176793 1542370271 2594040539 4184009217 762604586 1183773275 3688083204 732157421 2894239008 2369143315 2317822369 3660255085 3430224419 2403159322 448826212 3571149534 3317747760 1316455700 3535206219 1420549872 2685473269 +3263063119 2079844440 +3309749737 2003406296 +1241125191 3148427968 727376979 +890589713 2710581446 +2414302376 2762792819 +1219487290 223417169 +3912918765 1960517970 1960517957 334497554 1960517956 955604511 +575138932 1798912665 +1805384294 3431673495 +1514219690 3197305741 +2783547910 884006775 +1142081602 482691876 1021902738 1804681205 +1047572111 594851547 +1979680981 2521065290 +2261217849 2261217833 +3533831796 1083260702 +1597772170 4140247306 +441827940 441827956 +2345128538 104220110 +357340507 3801030212 +892395209 1134003551 +2941305393 2941305377 +1332948781 1062421444 +1118165995 4255856143 +2780052125 2568279189 +3281894081 2991390144 +2287875197 3516998729 +887647212 903996552 +2980136512 3772880595 +1566582170 3319012573 +1481170154 1644043090 3836986459 +1767893068 771403703 +854292983 531693510 +3615495741 2744920354 +415309122 3479889554 +2293707368 2690931115 +2720506012 3473095043 +1743173133 2637207154 +2625805434 3477184618 3256372547 1261950550 +3938417263 4201495726 +1357605049 3746610863 +1486440134 1495558918 1061841335 +3252564437 574105547 +2711071631 2711071647 +3138562007 3545318740 +1794571427 1433501478 +3873917819 4179350194 +137390767 957423610 +602061738 3478096230 669871245 +3067366093 659707941 +651665016 2641262331 +576801108 1931898671 +1627196150 1627196134 +2413832893 4133110985 969512958 +1320145548 1791521377 +3627936433 444101808 +3981939597 3981939613 +647618424 1010485741 +2368054244 373358591 174457060 4048739279 +3591297752 1378518475 26465807 1616540658 2339343139 3042663136 1410669244 2940258457 1598491454 3193241938 2899301792 2978430970 1199732866 1421108949 3149784132 4173253749 484513010 926537039 71409590 3520545904 1525030718 2730193739 2024148360 189020829 3808778429 2282890489 3966177826 3302233951 621844471 2209516653 1617396418 618322084 3949165785 1977756145 3989117270 2750162700 1134572352 2921286344 732931152 148333515 307867359 2229025472 122154527 2821237020 1694280168 2956936130 3030014271 302908981 4024323365 2668836363 807514511 3965360261 776116068 2808474566 1022261730 3804415043 1298238783 4158490111 858323383 597036885 3283948353 999474287 1727005523 2507930821 1983748874 2920340430 175699433 894028324 2834064495 1096760938 4123905824 1014923980 2982972254 2329784052 2833122846 549007064 3854292979 2798485678 2935688762 3500957335 1445863848 1125906460 2070172796 3669301170 3122329466 1057703293 2803069588 426415227 3372223988 1727276341 187424624 +3067480318 3780464243 +2426033964 3472308823 +757774884 4159849892 +2962497701 2653905836 +852196302 3293832537 4166488194 1165223785 +3752430060 539237349 3752430076 +1146638614 168412662 2902959527 +653760495 4061271141 +4104292644 1071506367 +1342898500 1163066911 +2422346286 2019729017 +3529152217 3653062078 4254824328 +3789762248 1889713691 4245260276 3789762264 +2719684435 3923780566 +833850070 3514430881 +1550452411 904435812 +2271237155 3462981923 +1878865855 3568141441 +3101013127 3964278780 +2353250835 1048714071 +3303344737 1722122385 +1781534337 4163876263 +3303948804 118615135 +2526096170 2138092434 814150427 +2939371591 346959830 +3375430179 3675899164 +2925285580 1760974583 +3954598487 1729941232 +3543536746 3894551245 +2657090961 3793496912 +4265194928 1453419804 +988520452 3303859807 +3566432683 4133501858 +1423855362 1461633670 +2899665584 2129486347 +2218655430 4086829473 1731885744 2203028657 +265550128 2878133576 2584878219 447825557 +2481589357 1992622802 +702332366 1842328403 +1269725539 2527670298 +4164135668 2626564320 4153499999 +671144579 2086140988 +2900942681 323043907 +2264722174 2116414943 +1189004816 753067133 640528596 +486294889 1314948431 +3445870251 4280178466 +1140327495 1181662166 +4011303602 3567976658 3197448605 3355749913 379917707 47851022 3818797926 4172217084 1105287820 2020087532 4027705547 2772370164 3375805769 1784558600 2866051377 509052307 410623162 2761441746 3882286399 3757784759 1516553746 1906173521 2039377176 3129579222 1681261611 2357374648 3366926353 1588582100 181983703 1584960119 427039276 1839953090 3775256758 1380196834 3040135683 346710166 2330980761 232771868 360024411 533749588 1652353059 +1002183 3742545728 +1592504582 841676386 +2806113269 1724094327 +2968151490 1123954787 +32710437 918161196 +4183275370 976665029 +1737311018 1188967123 2600712768 1355408863 +287169303 1118535225 +750133231 3580009922 +1112465110 942197489 +845698065 1504692333 2879602267 1215766226 2629337988 +629700926 2436710459 +507999863 779641383 +2329849018 158126085 2377530458 +1854190260 2885619487 +2650808357 172373352 +311024867 3786543639 +2116519459 2116519475 +744843933 3194049131 +1302621631 4174955432 +3483249801 1958735716 +3633701511 2062785174 +161206871 2001477350 +1958808641 216418902 +1850379650 559727541 +2873809482 162876040 +4146280420 4033936383 +741018733 741018749 +2832816301 2066126930 +2029723204 3075515657 +2120858895 2120858911 +3658238879 1884469066 +2535039044 2101542174 +621031469 1922553554 +2319785206 2319785190 +286957791 295741141 +4064174367 1999823838 +3596563535 1771573914 +1387690326 229052906 +791386996 2363491784 +1192109763 2655454460 +824108339 3485257637 +3738375255 317903842 +1448761564 3426345553 3491710352 +1035501258 4084176891 +2567341772 1082684060 847412448 847412471 2974167841 +539776054 292583877 3687354631 62672406 3600651558 2356728202 4225670290 62672385 446413662 2381765535 +2222618190 324706833 +548799683 1099529962 +824623764 290393716 +840879466 2421866437 +3079915573 577787866 +831370052 3004395101 +2444662009 3721639413 +2520675753 2607583346 +2651885581 3856477857 +2869461810 819458964 908650901 472432790 3928435761 1202998567 1219776189 3613898140 1885767603 3928435750 +561516571 388070879 +172043855 1939596888 +2642218600 1407036861 +3667711290 1591978571 +2119769916 2062502888 +3736304083 1737017146 +726992272 3336028579 3131437035 1413649768 +1597369475 1692619324 +869258128 3259428712 +176772503 3578530068 +2629783514 2603267133 +769543233 468258023 1978796608 +884909225 21947501 1860025190 1310866949 1310866962 1843247552 1691340443 +1547053326 927113497 +4199078915 62019772 +3909416140 2664258871 +4281395023 150741326 +3779170675 3676011232 +4080765827 1773969194 2929344701 +3386602055 3832189535 +2205642598 2205642614 +8582729 1477634015 +1796216621 4243347140 1496097769 3325879386 204770257 1599830570 +2915957796 3208899775 +2249646947 2290566474 1200529635 +371443220 1979023743 +2599511992 3168879187 +2899982264 3548755629 +3539830262 4039062998 1745593546 4039062977 454681169 +1032410473 3996399087 +433197628 3786585191 +2192052918 3729158294 1687516295 +494735089 2555117462 +1774958088 442335523 +662338639 1041799820 +3259262825 984533592 +2598485832 425729629 +1126357133 1020978660 +4265609882 4265609866 +1149011356 4059740255 638699012 +2616227970 3373489291 3768087054 +2020575700 1804990639 +631750777 3812140860 995734901 +2129973351 1382296390 2743634035 2129973367 +3206135410 204827661 +2840145979 3107384562 +3115628248 2707381823 +2352746029 4018819268 +3186283089 1235817872 +3158775148 3488004353 +1766491565 1833987908 +677946777 901558216 +2202515722 4054688883 3881427226 +300619272 3271287075 +4096844488 821362909 +2028392875 4267446324 +1971621064 755308003 +2490074198 3311552852 +3204979220 3451981177 +2285624646 1180804770 3426578033 2285624662 3634847210 2341283217 +4032594042 3307131202 +2236166038 2962306324 +2155010942 2999945033 +787110912 3673084933 +2378372266 2133883141 +4271642750 1304071753 +3842558919 3842558935 +754148472 34917241 992422125 2924285440 195390739 +954176464 1475719285 +3269749334 1745396001 +1426246064 2204336131 +530397439 952634891 +2180005326 1529957209 +2538495435 4227060859 1215118072 +3615763850 3782968838 +1436713414 34317410 +1890316673 3752668694 +3167835271 3297251478 +2093139886 346052335 +2285441382 1586184647 3910329774 1709194746 3621151617 +1059981240 762717869 1040114259 824222144 +3027658010 811673597 +727756699 3828642066 1116596552 +2665643897 2665643881 +1026264082 2562785965 +1578689868 2232696672 3153961500 +1302351170 2069755538 +2689273830 1009387265 +1036207283 503216815 +1902586845 1651117300 +1333406665 1333406681 42714169 +3961084506 99171243 4125696621 4180209186 3961084490 +3341545205 3687826150 +2597933305 2930435294 +3505579403 2036292034 +1696467111 3578240758 +377334187 1462148459 +714186428 3349497324 4258770535 +3943537270 2087331793 +2965023121 2806183578 +2835982965 1594645385 +3736963895 1079681551 +1942956953 3851569688 +1493989538 3500271363 +3228507528 2303882282 +2704866404 817189247 +763502529 2462745447 2516780273 1691876544 2516780262 +2295564836 2298640041 +1072928526 2550245518 +551708464 4100485251 +2890553369 1376300894 +2645334375 3225468030 4239067647 +496700045 95976946 +2435624841 2282570492 535932345 307778744 2400013806 +3687297585 1065614305 +3027904056 1414146619 +3459371891 18512387 +484121463 3823909958 +332632155 2433498962 +2892829450 2041903277 +2806190017 4028760460 +2302043493 4151029898 +2251028258 4078079018 1496713859 +3802703038 1887301178 +759946903 4019793289 +2386637964 1104966992 +2337006193 3111483366 +2575211249 2471356784 +4193862237 2660663874 +2307435290 3690463030 3117190389 +1101025461 3416347724 73338108 +403932538 1622875915 +3635738631 736260886 +2610689448 4200187616 +4202728429 1983387348 +2493371985 1165517190 +3937016669 3071811313 1735938119 2655887385 1351189314 +4106180532 3915721363 +4256805175 2723281286 386653603 +3478433742 1579175769 3216977746 +4063275140 1083980740 +1461912531 3319078388 +439186769 330956299 3487825509 666581128 +549819690 3238646029 +2547168042 716180237 +4233764723 3034546700 +174172459 2214782287 2193444532 +22211827 1732534836 +2850703975 3805487158 844862066 911972512 +3775507428 363471833 +1002699706 2110579921 +4289118438 2217387742 +1859928587 2092238589 1003722653 3961963158 3492678891 3488143321 474115193 +1938144572 1065203052 +4028212810 960373466 +3800287116 561193335 +2529748365 3946929380 +694685814 2765220295 +3035506902 2833926385 +765934210 2061889478 +4080126033 677271440 +911524523 846099252 +390477394 4119298821 +3559635401 3386210158 +798241257 425950294 3477770695 +1538772721 1398457712 +1962112705 3695440320 +510167237 2492986090 +115612828 1964575111 +3538233675 1237319956 692169788 +3696553660 2601746023 +360849023 4287009809 +440665471 277004074 2617758135 +1919761420 433802332 +289878636 1846747521 +1107054288 3023442674 3757342208 3423643689 3830459399 +1071190312 2793734995 +4138290340 3426654427 4138290356 +101342388 101342372 +3044700220 3044700204 +1217490142 451830121 +1561599817 3686507449 +4241542518 2700089162 +1637171538 4025865242 +2789705661 2025667275 +1536795949 1608451538 +793184049 4188849190 3185178323 884474091 2971635258 2971635245 3150608318 3133830696 +1784711363 2840267440 +1553327009 1626691168 +3875804067 239976583 +696603795 4024705900 +4186391735 2263952400 +4196264744 1022564626 3949440180 3949440168 +790280100 411175460 +3669787483 429998879 2982332484 +3746332139 1886009570 +187254328 3388574267 +1041258009 2733457128 +2047036337 3291490214 +3940872247 2010035362 411318121 +2058859395 2058859411 +1173882739 2557721114 +3254748774 3410006657 +3371749615 1320216622 +4076797456 2540303139 +2105880055 4101343330 +2260655090 276053491 3657270682 +3796510841 1906722889 +2133760046 1683591279 +937059657 2691324334 +3876946912 3876946928 +2913275296 4208227059 +2451198320 1869493059 +1858556929 1690910102 +3597571177 4178813262 4178813272 +2956257420 577130187 +821918334 2454933897 +2072646685 4102246854 918784007 +1373765896 4006059915 +3491942978 3906010602 +2708603239 3560677746 2346657381 +3088555676 830370852 +1867648696 907788627 +3675508719 1511398458 +2014141388 1012087942 2614222899 +3604433256 2632486589 +3362708677 4248332029 4248332010 4290784963 +3583567964 2612381895 +329833569 349444220 +2948295010 3218794602 3218794621 101115203 1018799022 +3639292813 3163902076 1242404980 +1640187333 1189474755 3974199274 +1101148284 4237882928 3461501745 +318626459 2157912594 2157912580 +1586829516 2964719905 +1033033749 157196550 +2626560362 1189422456 +827008102 395493474 +3913862152 1167667357 +551970792 1216765904 +137450391 3930011394 +456183484 2312466919 +2585334580 3380165337 +2405138394 2265596989 +2246811698 65875621 +1048213075 2915583162 +1256251474 838934789 +450850548 1102817807 +791107813 791107829 +3062409835 3290711650 +2900544547 127599495 +3129853705 3056620344 +2238622598 1274544595 +3065242338 3633333692 4239115337 +3065596624 3125204779 +3834432714 4140146297 +2318156170 229321773 +679382364 456689617 +2725871486 265363149 3557816070 3236126496 2631936716 3236126519 +343723489 561518880 +1337050641 1337050625 +3362787803 1668029394 2988822694 +2746615429 2798518369 +2507967889 3826441040 +603456760 671032396 3523756421 +814935633 3092058176 +491753127 3409809654 +1839229530 3985075133 +1860846155 3854982146 +177170467 3267424028 +4144599353 2106834697 4144599337 +2428239328 3086002099 +1585324518 1129208386 +3613809442 3752693803 +2420571742 2420571726 +953581103 3098066238 953581119 +3110839962 777790457 +1977437080 1228708332 +190964067 994454727 +3034155520 2993962515 +878673121 1601140497 3363974087 1601140486 +971685721 2038751883 +3651801355 435568686 +2065486946 1423495549 +1936173599 565829529 +2183640722 2183640706 +2220522305 2220522321 +541169942 4142977178 +2930758136 4169099789 +2308466389 1999480698 2362757491 1877598556 +144264201 2454893102 +1848972861 3130130964 +1427391162 2878340482 +385642770 1183903661 +1099785168 2440531222 +3027726850 436762922 626441485 +3238878043 1124520018 +712672779 3923837762 +1876133858 1162373867 +3069688114 4005389309 +393230734 477917169 +2307364438 4226657590 3597773159 +1593516341 3126150780 +2509818902 2508801713 +1458040396 454828471 +2187865730 3422631587 +2332610651 1604245535 984403125 2332610635 1604245512 +2777472442 1012446230 +1409918278 2435788065 2435788087 3292802438 +1046416593 1501981791 +754594037 754594021 +2577362109 2465738123 +3432861660 692884624 1353419340 692884615 +3488601426 2827800595 +71368901 3447503555 +2092404178 653541765 +2053780437 2318374986 +3773044836 1772593764 +4216150908 206281008 382141489 +1165958654 174743817 +1500584009 369703655 917064135 +3893214431 2950212865 +1559310663 2528154304 +2568893517 1468814628 +2049426706 2387864921 +2412413073 3972555846 +1470489065 3810697678 +1624745301 3363390666 +319101151 3490064158 +559719511 50255299 50255316 3688281318 3688281328 1430805705 +1700385579 1808801615 3077008564 +2446365518 4099645145 +1943995153 1561354422 +2571914876 1637632374 1068188711 +3635317109 2411881258 +3976307105 687081926 +1258146211 3149054682 1886737331 +927663994 1825175914 2538221635 +508301469 1321084734 +3781245182 2927095906 +2742644588 2860305492 +3464923252 3464923236 +1515968342 2492726375 +3581136314 3581136298 +3155029402 2508323510 +1338368237 2172720388 +3408715578 295921738 2217957603 295921757 +1398369453 1339161874 +2917419231 2917419215 +4121363443 3538733098 +1059065879 3226222978 +1442309961 2883093215 +2744149585 4054269036 +1134183747 3201194800 +4060210107 3019472740 +3874652998 3874653014 +2187563354 2187563338 +6705291 739298004 +38145162 507886907 +33152714 2654774881 +3139202327 2764028720 +3321757117 1150491810 +576099876 3663247384 843995817 +2921090351 1222342011 +1072436581 3788564182 +1338407535 74628280 74628270 +419724144 419724128 +3482902911 2977529793 +725233387 3088007439 4153924596 +4048345245 2029584180 +2152340911 2746006126 +4016995404 4016995420 +2869412016 3979629845 +1617661103 2018408302 +3342933073 3160011727 4236219280 +465500886 460344525 2208620273 596305313 1051820650 +140386846 135942697 +3639568697 2085473488 +142517571 255438908 2724079733 3404163923 +3222608402 2309403947 1941227331 526534176 1620605999 4082916494 +4106523519 132706858 +2331539207 3424870422 +2530689589 3577833510 +1845529043 4258854700 +3375362854 3699098817 +1018286064 2078955203 +2469917087 1611750750 +447811518 3267086345 +1222579922 1391801010 2332322683 +3514111594 2609426629 +3493532567 1677711014 +3679315640 4087493563 +4076793895 4076793911 +2942007549 167736916 +3542539567 3384478678 3362550855 +2461708317 417545652 3485074965 3388288747 417545634 +1975326669 1975326685 +189620511 3661861834 3461858209 1650566893 +1570159853 3686164293 1095461138 +2527963355 1489301221 3569034409 +2376261722 1365716413 +712616739 4072399888 +296021142 1554018353 +3782672341 3362023546 +3667153097 3766168696 +3009315965 786555252 1099933904 1100343695 4122183435 +3596687107 4282084950 +2909451365 1677327084 +61244855 192153140 +1077270456 55784004 +419046889 1254737640 419046905 1501338457 +399999769 2705547358 990950377 +1316893351 2150913203 1316893367 +96814848 361678085 +286003550 3736526794 +3590285341 4262520244 +1864398091 1982973810 +4093562586 4095713597 +2620182181 2139704748 +1723870442 2027002580 3440241490 3507351937 +3450256476 699788683 +3817508237 2329300436 +3850800137 1540256312 +724734915 3281951722 +848546375 3852955094 +1748316774 1748316790 +2292066127 1610080600 +814385054 135495081 +815237344 2082597805 2141327569 +415787963 3196163954 +1979102283 2175907192 2135478592 1019910325 4267561492 +2653897120 2653897136 3026479107 +3882586085 1942489379 861111660 +279216865 335153215 +1031129549 2372709796 +4013670898 248768557 +1467405406 581824126 235950079 +2593718035 628470144 +710258472 1584529296 +3387261312 1414192261 +2727528809 1444089934 +1127552693 3825371738 +3185455393 248374598 96949984 438942343 +1964946622 492209929 +441648705 311070577 +1768605812 1729728153 3862657759 2761451284 +4140765610 4084077820 +879249230 3458744281 +2280626376 1318995419 +3957038878 1757117503 +3281863063 2274246822 +3189343908 2229951640 3861836841 +1815876876 4123284769 +1369276916 3195046412 +2240608047 3343247953 +546569448 821502251 +2803865689 4100623171 +559195349 1296005962 +2377649370 4072422205 +3050012874 3475023450 +3574046800 673638571 +3458008757 749833962 +1178751817 3814340261 +163884002 1117426901 +3573431030 2135649397 +2831256898 1547199913 +3950184334 2346962190 2346962191 1184616078 873784463 +2651818785 4084729056 +3055617340 4059774311 +1096978182 3617691715 499228547 +588153842 567916019 +1785541934 3085612921 4118725561 1768972914 +1073499060 4015946469 +2850904434 1792933645 +3867227738 3835308597 +2846750105 3050938312 +1777050056 3105611676 2247077323 3367599095 +2145750710 1314088482 +969279044 918281481 +46255368 1279455285 +2603588572 670194503 +1897848999 2735190692 +2366199762 3618979731 +918238842 2729886219 +154322719 2582607304 +34826016 1686853491 +2137864229 970432842 3597213817 4218211688 3479770489 +3169727843 3169727859 3455978204 3455978186 +2827875477 727881907 3404876589 3404876602 3967288970 +1628989664 2344471483 +1881458655 997193813 655635023 +2312711494 3442668945 +2348854491 2707246811 +1151655007 2137101834 +733947678 3594326978 +1203380748 682207776 4127430881 +1094700208 1735342339 +807837213 3922388898 +276587037 276587021 +1411289363 148018070 +1410770564 3819446729 +2080021274 2460060514 1166158333 2539801865 +3908950385 949832944 +2320820771 3870070044 +551716181 2764146684 1487475111 +4108078353 2386016928 +3755122100 2110301196 +668268050 3326041683 +2211758017 1223285974 +281306938 3778278933 +588251400 4294409415 +299972089 960487797 +3890191804 3238350567 +564590504 1137814467 +1836942080 3353921832 +1234097642 3051011917 +3623167037 3091916596 +2059679784 1793353469 +1429232415 1199578570 1487856877 +657259503 2456373101 4066457976 +4033430462 867542038 +250858975 1758270984 +1369216686 1654540382 3565052718 +2010189725 991663156 +2277198277 1893015820 +286220648 2341112724 1127634621 +2800902293 390345972 3934951723 2775273485 475656124 742231577 1807502004 139711620 3063688274 4073518647 3888583853 822735625 257581063 2704827031 2204744453 2788618736 2427869147 230889537 3332754487 1157647941 1278960210 +384054709 3191901162 3191901180 384054693 +939406527 2956875556 +3862453465 805777098 +2659531517 2176564213 2294012994 +3228941791 3629770270 +1648507104 2386528435 +1591612147 1251464332 +3499074505 529136686 +3134684497 1916421776 +1189879979 1354198306 +699899969 1381017831 +3037089464 864682308 +447936588 1404886945 +553944517 3206452506 +1376380610 4102821085 +2684964621 2593625701 4222054770 +4251558870 3276597735 +704111044 3577243529 +266590554 566034150 +2003898490 2164060189 +2635209088 2635209104 +3202579373 2600940415 1997510848 2666446514 4171122804 333240298 3194784577 154147380 622382940 2394085278 2813071963 669329921 +63898880 4276412165 +332463829 1423181254 +4074215150 929208495 +1608882302 2849218463 +814397690 1684091293 +4242129629 2250078293 +3919609584 4063393867 +2649697484 1757605590 +3029145280 3620373758 +2861227337 3019608494 +4179694364 1021585872 1259410705 +2302679582 770252073 +3097652583 1116728676 +2466053584 876842595 +3633870133 755008124 +2195759305 3499957368 +4086717925 1521864556 +1298552294 1488248614 3189324055 +1630653782 870513588 +3311562542 1644271360 2428972670 2465052233 +2721342213 2735158119 4256626492 +1647774149 249974183 3485785084 +3045263923 4031319642 +1459295380 1928459263 1205408884 1928459240 2168546543 +2663410692 3974761055 +3263886415 2411632718 +2226473855 2836187093 +1444643762 3731870554 1062228275 +1051328721 4096635699 +2023039248 2023039232 +2604439994 1502719125 +639022240 2512279539 +2214344977 3860404704 +2494842303 1092142155 706256919 +3003868449 2434808134 243078806 1103361671 4226822880 +1494377630 2394593449 +2542921098 220753414 +4008055961 2220974440 +1902942552 3858064781 +2187326578 2936917861 +4017303584 307544677 +992270687 2574411292 +874143293 874143277 +2052330047 3512252734 +3567914859 1223644558 +146435454 146435438 +2265802619 3687191614 +2431299500 2431299516 +272576861 1837515696 +1545017875 423481604 +2147245989 4234269916 +484799488 2100665363 +6120944 1379617104 +951891521 2450712662 +518867289 143292168 +145332009 2267064703 +1460016619 3918823650 +1786985030 4069833783 +311074437 311074453 +3744522684 368270055 +3676841187 3811709276 +2217805466 2004160038 +3253716393 2821966079 +1735537586 2328322341 +3739658123 1880735700 +278154863 2289531064 +1173601937 2947874374 +2809893983 3559069980 +235190758 4151354625 +3750918648 3952476539 +3079938608 775016835 +2951968188 24042864 1856258796 24042855 3091355377 225374276 +1298728708 1160995272 +3607241402 430746122 1022730531 +2950632150 1613020598 2989139697 +4040540602 1393757661 +3809003708 584318951 +3099632542 3997913225 +1080140171 3609035950 +1175426254 4104078930 3957996633 +290528093 2678985588 +441419474 441419458 +3082971049 4027133720 +2927338924 1308813015 +1023663980 2031662871 +3558025967 3375142446 +1844679040 2523794579 +3482429618 1951174707 1200029786 +3208994056 1893269556 +1645506803 3894156102 +919185265 2960299760 +2131614022 1221396769 +3367047374 1832785999 +2359775330 3445852739 +1250046401 200561366 +3450791759 3376805586 +562948413 1814463390 +2502564941 878666849 +3334482468 3334482484 +61552510 1149786975 +538328791 1510272112 +2821271710 1456965801 +1228854727 350914646 +543867114 4060983387 +4157859862 3148920033 +1010667564 3175950388 +3576993284 2781358175 +3066982516 989529743 +1083959805 2993772884 +897214507 2049915992 1521613730 +1664360736 2406145531 +3986680528 3804144995 +1047817530 2336748107 +189723984 491531509 +2752585043 2752585027 +912750856 17814508 +426117394 228607813 +891839831 891839815 +1762384553 672989103 1184936535 +1441593838 1108183753 1441593854 +3310603570 3800889549 +2925952163 777401482 +2383789643 1160826735 4147810324 +786427725 394638884 +897197176 2806474989 +1040385700 3738054046 +3400154724 2471967311 1845507967 +1513974493 3872923348 3998623019 976783279 +547596752 832852579 832852597 1084585000 +2335032240 2439457564 3372944917 +218115673 3494442504 +307349101 1136352644 +3974908189 2801519966 +3841922712 361795917 +3618666209 1808475190 +3328340158 612557171 1024696042 3186385730 8261533 126709906 447405128 3854862710 2545889785 2215325954 815957508 2625419630 +4160260017 2478692051 +725983570 1889334291 +3045188033 2088133334 3294467825 +2845904437 1228803532 +3206296809 3261549272 +1008218472 4232564047 +39101940 2671853327 +2564470114 38504789 +1935919311 1964318158 +4071123062 4071123046 +2737033525 107107946 +3034889241 3709082440 +460530119 640969881 +2092152974 1439065615 +1845273961 2532087359 +3897815738 3730496278 +2658326035 1582287085 +1626969906 1406195993 +3803010198 1557925601 1826367537 3803010182 +3121135379 4005874412 +826600687 1477248080 +4253949542 2360990337 +2005182377 2005182393 +565391023 565391039 +1750408076 1445003191 +3143668478 190218362 +4009198143 4009198127 +1482059875 3306852984 2673144724 +2622035975 3150948909 235983638 3209445411 3209445439 +4181559753 618653560 +3490519485 1100973204 +304720414 192269685 3046559017 2198500546 +2669654706 551957781 2669654690 +337789266 65852435 +1743618084 650491327 525475971 3797440420 1433004074 4224777987 +3311428662 3971858705 +1974000326 4275070369 +395640835 472148220 579798197 +1278290867 2758265548 +418678465 166732224 435174160 166732246 +3305794900 2204769081 2204769071 +1056854793 861714222 +929230239 3485208904 +2426591684 3139091195 +3733029231 3034497464 +756576864 1568410917 +468272697 691637160 +660297433 660297417 +951516605 85029012 +1814279342 3964745865 +805082753 195095808 +1748056409 1585268510 +513637094 401111041 +1748605304 1672116838 +1723615091 761559568 +4081428574 1420299241 +3361895390 2576855367 322689143 3517935097 3216532839 155805902 426615374 330885210 3246153709 3197465940 3305703839 2626725695 2085634612 3717333193 +3910684921 3930552296 +1348428135 3978712352 +2322559724 2322559740 +275008636 2274261091 +3888616604 2066674055 +3088145836 3088145852 +3722336539 2495317865 +3197218919 1168258303 3034779433 2639883625 1717088822 1453949570 1050814968 +2328714533 2789843258 +3404876592 2876005507 +1952412325 2920613752 +720902786 647084707 +3599718437 3903308332 +3172836529 1722434224 +804135856 2839028717 +2422788736 3763300733 +1091173516 1530069932 4005072993 794898908 2554724517 4005073015 +1501889391 1533306808 +214746322 2288830829 +2115107059 1766516378 +3139735084 1013610277 +3863431670 3863431654 +873420100 2821533096 1752456249 +3048393576 1886794941 +2315503522 3711979462 +863385121 1537514976 +4147728657 767677989 +3188988105 1776473125 +2063449150 3681506697 +3578734090 3583566267 +862302526 648627806 581517325 655754399 +3912321847 3196313705 +3079372545 3921647142 +1788254767 4213216469 +2990484983 2423610310 +2370686148 897144960 +1392296812 178625153 +30637919 2592758997 1056014985 3641885666 1056015006 +2885800571 520818457 +2030497300 326264317 2582169967 +3183560441 1642034597 +1384456335 2257738334 1384456351 +2967590577 612694192 +1425547016 3399014795 +2524510924 2893205303 +2385472792 1369516181 +4166319416 634036027 +1120104621 390721139 +1773089032 1924836400 +1762021320 485464029 +1638547158 2003945889 +2430173167 2677213428 +2362210498 1742870901 +2515602069 1070975063 2366787884 +3580996406 379780353 +3246543984 3365013980 271248469 +278529288 63096880 +4151570570 423847923 +4127878749 3989950161 +51611345 2830973702 +3894355538 3137950469 +3780911490 3922049165 1174978474 +523818520 1048119259 +2487991534 176290577 +753102551 138367989 +229980226 900170315 +179137924 1392731871 +3626851571 1114198668 1875191747 +2554839904 1951066668 418943013 +2970331279 2970331295 +4065648162 1725782425 +3929031092 1166194207 +1406626254 2401314695 +484720431 2857334520 2857334510 +1378323858 1339334714 3863207123 +1074203604 2669125295 +2652623953 919550863 3610952196 +2591019616 2346651949 +2780381251 1869481409 +943832791 587166506 +3336533779 617116410 +1156772401 1081260829 +3010424697 2177259406 +724250437 972777868 +144579021 2652882491 3936040315 2173949032 4257303685 +4068782394 14876235 2958446594 +139571701 1966430454 +4177255292 3785467952 1105074481 +2836262206 1592555679 +2923832174 2273508334 +430311247 1748147596 +536039879 2261675126 +990507803 195670916 +342354919 110648480 +10385763 618689403 2287323826 +882107975 1576354116 +3830269761 2938714214 +1375485826 2663250845 +1132327489 3065441040 +1739168193 4043115222 +2631450969 1110990600 +1640152470 2073064231 2875541110 +3417944181 1069643324 +4089853832 3624211376 382967477 2753746684 +3776211112 4213227627 +2794084037 4039546892 +62607302 2782827703 +3107265700 849090089 +4092585765 665378618 +3515854210 1731077027 +1168456401 1650434733 +1091328283 1363104165 2171618706 3790936018 1354595566 +2782465915 680700693 +157933841 2630971062 +4254370745 1559592328 +1729424836 166874015 +1828257892 3149090364 4026244479 2181012068 840485977 840485967 +3194255659 3811229346 +922362082 1841415125 +2160398536 2160398552 +269139991 1475109936 +1733232550 1198066263 +95729973 813665916 +3787193958 1394867110 1461977602 3237051031 +2575971226 377129333 +2314496530 2314496514 +1175837090 3841028779 +1172323000 3086774189 +3505459084 2004580705 +4077694381 3209799186 +2321653577 1535450450 +1936185920 478812224 +2917234829 2819074616 2947837816 +2733488926 2423416234 +1599567245 2746092786 405387706 459148 3364894533 1434952487 2766241470 2550624484 3164186303 3599781203 1007775096 459163 +3322498724 1688652863 +2512075739 2428451282 +3582185143 87879772 230916300 298026776 298046101 3533891727 628365582 +2291759344 3245670987 +350351530 2309872539 +1607574440 584438920 2131009917 +1157105106 1898529562 1685137807 2971955821 58574974 1685137811 +3056601178 664610219 +3379042386 1356738549 3379042370 +2802829630 3604815454 2802829614 +850003221 3601203210 +4044767463 291397099 +4260567291 3232781106 +2662608770 1470548387 +2222661548 970120129 +4270880000 2338792010 +2806523277 3818069220 +4238455706 1284356962 +1327088756 1998116575 +1818218476 3255509005 2262061207 +2608381033 2608381049 +1156435565 1673763630 +2546287399 1668434391 +2049927741 2510568962 2475531573 +2307188858 4130994205 +3424196641 1982516328 4230904441 3369896643 1111065902 4130238717 3238829562 1094288280 +2010588447 113258401 2385311708 +1031571554 755675733 +2992605615 3106592507 2070265464 +3637598663 1267881256 +1375980889 3258327131 +3179672079 2859034188 +3448910490 925214845 +892028363 513303288 +3615295688 3932433930 +3591297730 2565335776 3887000193 1449501123 3430241733 3340982957 +249367505 568122391 922327558 1252475298 +1236469069 1372674084 +3629824439 1305631513 +2498140652 818386199 +1294699905 4237279744 +1841382150 1492531322 +1297161999 736703463 +2744094732 1704970273 +2800491076 162355465 1155737912 +1044875260 387766704 110825905 +2715062174 1155283902 1604195753 1604195775 +2755196500 3651913273 2152953780 +2301618284 2301618300 +2409182610 2707368734 553962973 4253190189 295315522 689281274 +3545711325 2405319156 +2519034768 3974648739 +3246909765 3235144921 3117701593 +1291297905 3682429459 +2414670673 2414670657 +1774686832 4113270357 +166755798 2073434087 +4220840327 2456526720 +3790928889 2854747006 2721481976 1735046839 1986683778 2508060684 1944585406 2203675242 3356754261 2050709543 1076919263 135818368 3802999230 2939595263 124540004 877854549 3658797971 1783831699 2539666362 552952994 1115433978 78373698 1703477293 502685661 502426423 3642434459 1761673789 319759691 3047614599 2460770979 3610264374 3308963410 +2668552807 3492340479 +1326073928 3039807828 +1682041153 1452283914 +559705983 1754290020 +183749641 1920877428 183749657 +2301466230 1757666257 +667422313 2733600162 +3156792848 1145633571 +1279195983 1279195999 +2579875752 3415533792 +2245691879 1697160691 2651264672 +1463515920 1654831669 2066424188 +922411226 1727002429 +2905433937 4017726608 +3827512693 2557290300 +3655657470 22623433 3395892578 1674950441 4268636937 594427581 3765000222 +2420224118 2372454865 +4131366751 87325342 +1223820266 32840275 +1793461568 3829392888 2284248005 439088923 +476576773 3165764556 +2484516947 1925458618 +2004973738 3402691469 +42530054 570254150 60405879 +3070034592 1799773051 2957713907 4039895320 +2421875393 48907677 +1819895620 119377951 +3253909190 387299745 +449800595 732247631 2072533428 +3484893844 1405850472 +674905527 179250960 +2361481317 2653238919 +3746501714 3746501698 +1409653137 3587227472 +4084561839 4041959544 +364773009 3407330896 +84528736 1333975640 +1580053320 1580053336 +2475646780 4258344091 +429330591 3889113672 +3228251196 1347747824 616774257 +3198954919 1655588787 +684987115 819578877 +1590810169 161090590 +2143690692 3271496954 +647583765 3630541084 +4207409570 4207409586 +136702072 2224610753 +365094210 2211374837 +2017641958 3732854146 +2955203685 2935642860 +4257735041 3122637283 +273469165 2515123986 +3178362091 627346914 +945105329 3012384941 +1138063785 1138063801 +3932209 2406763814 +1257696459 1790304760 +3102545703 3381988659 1144746592 +2840639229 2265976926 4099336424 2265976898 +2248324219 529544901 +2440291950 171308793 +178614465 2127578601 +2688564027 2149400050 +90634809 3745570607 3122390952 +2766887182 3202536538 +1054504616 2582170237 +436960873 1763180376 +3986833952 340813548 +1592872761 2933896872 +1934242503 1154346816 +4175850432 2461769541 +2365387885 1865736404 2365387901 +1491038637 1265624573 2495607620 +2263895789 1498169106 +2847890530 2587782741 +1880118792 1907846795 +1277793153 1718825984 +1035686953 1380124822 1457880199 +3976526616 920078043 +1408025555 504685655 +397405103 4176479342 +1422724860 2060359335 +2736785582 2037230063 +2065840438 2514555181 1270430487 3751929994 1268253990 +4023985555 4229856256 +3439299082 3210151404 1772903781 +2199984193 2920885855 +4175828403 151208312 3852749942 292516220 464154098 +465723821 3818919007 3082675227 +2391813992 3573194941 +1310958242 1421242181 +2244623509 844979868 +701080535 2674715504 +523828015 231445391 +3084446946 2223794011 1683073176 +3035506907 2917814468 1328180965 2917814482 +1218700288 1218700304 +1771912955 1032463666 +537626577 321859607 1126616592 +2035392564 796864975 +3988324933 1820514668 2134807194 1974577987 3917531261 3917531242 +2137906211 3169946396 +3375933558 976302545 +1770250653 3716362091 +595412790 339155463 +1150993454 1150993470 +279322866 716886669 +2130570631 4040517449 +1952795507 2926954010 +2993598570 1312798427 +3363913314 91567171 +1552370919 1290967268 +2140041584 1027380035 +2079170466 3099483054 +3253558469 229181964 +327125302 3888447505 +597833742 643710479 +1023767721 2737268750 3096880664 +3260043165 2171425844 +2262738554 123114404 75582741 2945758546 1868144257 845748578 4290789961 605092991 2029736268 1858171568 2621879972 1932955168 2920184842 1037531809 697416563 3663272925 3723853379 1446310848 3547366717 3164175025 4104691893 2681270118 2594490119 3570258008 4045512254 3141543356 75515306 3119367333 242151799 2491339198 2679910045 3952503609 1363052349 1512591749 3496523265 3983472041 2634469405 1033066448 3016860555 2432626073 3104098822 1590614676 2394129658 454975594 640678931 3547318688 1406292490 1218330915 2738195577 19880829 1508224436 504250048 1503196869 912939986 1051765426 2262801858 1886336987 3003054748 3540191902 2404887678 2166762424 867747860 3534915135 3005537834 1589101472 3021330446 1296546226 322949748 1174557193 3991201293 2462537605 1090240380 2049333301 1378738757 853728129 3966365637 1414332895 361586160 2574578752 1754229737 3541495276 2769465959 3286478833 1466269748 997322992 1302864926 496418059 307399676 2985993125 1394066575 1525432708 1526199653 1888382603 3204506717 63330157 41808406 +1571872280 2006618080 +4064222179 3302526299 +270936824 1679139963 +496433273 1905728495 +404259984 3769300844 +2152221545 1523496536 +2088537293 3972622898 +2781867843 3780295555 +1229102436 3084764287 +360114111 2301546942 +3634946332 3994998796 1069787088 1069787079 769285905 +3753670329 2002376879 2440043374 +1825972583 3155596576 +2753239329 2881231499 +3265985674 4247489851 +484281572 1422183145 +2568710967 2568710951 +1375646200 3169403031 +3197322422 3084200593 +2146806001 3021571119 +1714646434 2230687253 +4092993983 3413581736 +1757664902 1917498615 +3018000606 85227241 +1549051963 3045187589 +3784038055 2720444096 3055741152 +1866624983 272256323 4237692784 473587767 +713590985 1640093253 +2409508267 3238126644 167394767 +3091291151 501476238 +489158372 3387533567 +1326613361 3627778924 +1438514858 2753029517 +3609169874 2401242221 +1807087898 2843157501 +3728410436 1798594095 1865704571 +2397327506 1936374965 2397327490 3022953274 +1788257480 2468701917 +3401137605 3401137621 +3623875309 2894220090 +2439630125 378404292 +1172685574 2503596805 2570707270 824686714 2570707281 246547063 +3619263356 3619263340 +3862876350 817505211 +2092215363 2473274748 +1024033052 3081062352 +1318200126 1318200110 +2431715713 2893149718 +3973759274 555432338 +2882552044 1691759489 +1303941475 3163348682 +1964891401 1728247096 +2086469268 1516552943 +360770861 1481064313 4153642676 3415133266 542308520 3846325561 4136865070 542308543 441642843 +3592739770 3590710749 +100953769 570045464 +3685836522 3259302477 +3247278434 2034897773 +233229177 1532120958 +458980924 1292351591 +2181566537 701346580 2120040765 +4278114708 4281369583 +3781091427 727399370 +855238000 2942578499 +4278271509 3292688570 +225914911 2196882082 1369489630 501146457 1369489609 +3444551562 3444551578 +435303918 3326797241 +2685853980 1146672758 +2541806448 3783926082 +1707366262 2853547729 +3986645409 3001462880 +1109788148 2169943112 366698265 +2081483977 396673144 +2794643493 2347322745 +1284419604 3147283327 +4222973046 685312065 +323092301 3444994969 +60419182 111832302 424620335 +1974095760 3407560611 +905489181 326459060 +917072445 1236418050 +756417688 2443787085 +4244303365 1141158348 +328460388 903271785 +471850993 471850977 +665017154 2821236981 +555844041 4039069560 386942559 +3076662174 1300107711 +1300803958 501846759 +1943742940 1040377159 4136569233 +1055587176 1944700093 +2394607395 3066822775 +3269475442 749410842 956245875 +3319023533 439145796 +3151970255 2406576846 +709780167 1617264448 +2625455565 909441780 2625455581 +3240574888 3100194173 +380608934 1551595585 +384769586 1282181306 +1626428526 166193465 3339982073 2541701682 +2303943998 2027661090 +3497008765 613000459 2994604898 +261654464 737712745 +1552253443 724905573 +66943867 3272172196 +1717762285 1191967656 1343428153 +3494511101 1078418165 +2346581847 3429900835 +3867419607 3104074608 +1308011207 2186205014 +3129936027 3304745544 +985566827 3841602164 +2183498026 1894677775 4188412574 2658920126 1911455381 +4182318193 3742877158 +3773158715 1154395122 +136723591 2260981957 +1540693176 3364388691 +418703872 1233935891 +3121646662 2972640837 836009612 +2428990579 1832097271 1560039692 +3193666321 726505633 3137518534 +735576732 3883544651 2701925255 3122617122 +4081117262 4103269693 +3000605374 3000605358 +4024022868 2304713258 3887831353 22163052 +4178557497 1287792552 +1328448724 2050693551 604601919 +4291060967 2389799154 +1523249192 3372193877 3210530268 +2595929250 3151906283 +3773578329 1826816030 +3572630183 3757714678 +3294272269 3592929893 +2432292548 4249687711 +3958080407 267821052 1820124931 2797438089 +3697499156 74052473 +2735299944 3075093841 +2591907660 2591907676 +1202045139 2632879162 730240611 +1788792682 1107329997 +934340076 313896806 +4233382917 1035185115 +2439856559 2650695278 +2298916164 4186096137 +1347784664 3903054624 +3424172078 2028597359 +4065926441 490663173 2051119428 3795300256 473885567 725703984 608106517 2873681816 +1936154190 3992117710 1936154206 +1798710373 725306092 +3523198249 3465994408 3523198265 +2440291803 1015009147 3564296132 +3975436551 3975436567 +1438015112 1981206539 +2080634140 222752676 +2961381909 3565221951 +3120314557 4240019998 +2497236958 2497236942 +2409024943 3110455918 +292890774 292890758 +3568892437 4096896796 +4071262802 1417133843 +1981968299 2562315490 +3410006686 2493959849 +1933331799 1933331783 +3082990383 3082990399 +2543455181 3483967585 +2824644239 2684903045 +1963783765 2556938186 +3838204552 2889909259 +2339129065 4026934350 +4175850458 2897987627 379329442 +1477001172 3669852212 +4051108877 727408740 +1826817314 3973270077 +3302281670 869166609 +1042424054 2637894111 +3332240977 3016664566 +3801408206 1103313497 1103313486 423043154 2120288847 +2113582126 2141824115 +3527175278 1662955823 +3771356674 3766838563 3766838581 +1796741849 1878147998 +1588184651 1346578452 +2948129763 1023150852 +1617751913 4002955480 +583266707 583266691 +985125021 207447860 +1576249308 2995856951 1576249292 +1835302942 1709974283 +2705631910 2232984407 +3936762129 1957418448 +1942058113 1289534454 +1124728747 3345337813 868055586 2806472664 +2702341104 2148303573 +3582051275 3863427202 +2742538402 2742538418 +736169736 457877899 +3445520890 1169818781 +1470280164 3642624511 +2512002209 1968088319 1178372836 1425740128 +3036160559 3036160575 +318736795 296225095 2929285531 +2144217543 2214981828 +2054666163 1292610358 +3790984244 3925675471 +1110868610 1110868626 +1938316237 2896724900 +2262738545 2155147625 +995666256 3163719925 +1588999379 3956615212 +657755174 3768819569 +2850460603 821727076 200040069 +2350200703 503886273 +2399659541 1047474972 +3069670146 160042019 +1084938224 3169971907 3425681829 +2257885428 3488401423 +396486599 1581678355 845866240 2760276261 +3154386515 1299954874 +3033561548 3868957615 +3679293370 4112073163 +1376093744 280753347 1301576176 4143983471 +1187118584 1533201773 +2824794094 4218663865 +1529007125 2361869596 +3253615940 2383049247 +261163412 2301980927 +260817546 4179397093 +1786954618 635025675 +1863391004 104713680 4092027153 +807847414 588199532 +657741570 3110402101 +3478178548 1405321567 2444927636 1405321544 1345289753 +885849211 2522624296 +2381256360 392211051 +2843333336 1075994512 2250010531 2730945037 +2953991405 3021465956 3487026584 3148788184 +1213652395 1213652411 +3044494066 2630548211 +708537634 2275799613 +2026263318 1410135904 +2637062674 3661101899 1064013630 4293314746 4293314733 +1854070929 2298971216 +704239412 1213056719 +3963542068 452034521 +3500773360 2011565018 +478219834 292572406 +649873922 1019953874 +2894890128 837751271 825536188 +10194755 2598017533 +4121503897 1777112425 4121503881 1380640990 +4118127068 2769958535 +521985333 521985317 +1818118168 2251753907 +3681644176 762134078 +206603310 1096816602 +2999471260 2464272932 +3199077578 4127072763 +1444916602 4226018463 +586823056 2682409397 1715904508 +1610759349 2946627435 +2564830710 2666852945 +1407420890 1238858113 +586911690 1546060528 1059503224 1585999903 +3255786679 2386988095 1757580964 +1646346454 700114610 +3943288095 4290124647 +685403308 2021297856 +182168278 4100224531 +1607215763 3176360324 1687226989 +3667441270 2489793489 +1168732353 3924967015 +518605541 2386617978 +3994655897 3994655881 +2028234754 2286131211 +2519983811 917783786 +4089350786 921963189 +1861109255 1861109271 +2032312925 243636340 +7101427 2643771290 +3106473335 3115824458 +3361895376 3436919010 1051330243 2495060053 1540783338 689362059 3012434642 4149482122 1141078733 2308636918 3611672983 3245151079 1877438043 2180254684 3960048321 2766092590 3643594775 3590169503 186647481 557527486 242380564 2949460482 1257349439 25653020 1895591371 2327121526 3064928587 1288792554 1045477953 464469588 2542898248 2715510016 4140331064 2593452469 3913462456 1331355622 2259542846 3947720285 4286182270 662277020 2917911389 2170620471 3892676940 2764551569 3820562302 4187735440 1837989314 4006952340 1709851588 2225011209 3708346802 540143063 2092140600 2620600981 2538231321 2766516084 1118194895 3441421383 4211677829 1059937745 3495376994 2807612683 3533303256 1067492792 1575248190 3365266553 4052832615 2436589039 1487436505 3484201340 3430992094 2561740975 3853162192 4219936253 454071420 1490671436 2016071960 473028707 2753692646 607693271 3926475166 3196466219 3314368203 1069873073 643977603 3474797443 737405733 3913865852 494800394 4128002409 513693153 4253261924 3305896328 948153502 +865921535 1939438913 +3612789307 681591202 950033124 141497599 3612789291 +3584428295 1533031958 +1374228434 3286493075 3286493061 +1489228879 1489228895 +1330303452 2932366663 +1365441410 3267216210 3067198266 2698112419 +811160083 798766074 2911509741 3739597952 493586692 +3133072359 3133072375 +1595870922 1658902042 366545522 424858490 2948671919 313318836 2443243585 1258062044 1843698669 747835420 3119673175 1558432394 32043183 3225434059 1731885437 902094435 2891160790 1565770368 3419741486 1471674381 556379223 3671702671 2093385673 +2310430078 1209347401 +4013995884 249609985 +1041796413 4255536898 +3611072326 442639137 +3031047098 1885743459 566863325 +116726672 116726656 +2934118837 30393690 +2176153498 2057401265 +471072837 2021420172 1172239978 3723760963 764600506 1172239997 2021420186 +587363775 1268428327 3365751164 +4258203872 4258203888 +1939345275 2683111753 +323805189 106183740 +2359499854 2999291599 +1238286134 1719075345 +1615231764 4273471080 2733883513 +3765048060 1123803815 +3056308376 2205274673 +1164331333 2231719820 2231719834 23652221 +2698112417 3315283408 +3937259658 229066502 +1768333972 1973792372 +3745649894 2651562851 1658598950 2075350298 1527178753 1527178775 +2968705266 2152432890 +1939062184 1078649301 +874806180 3111035711 +3128469036 3085801303 +3237416826 1055743243 447313986 +764474926 3912469113 +2286494865 472158278 +693263136 2910103547 +242945604 773284008 3335339311 2047691524 +2780737379 677077853 +257277147 4277685444 +706055280 576009712 +2185324162 2398379701 +1033936248 2077746157 +1420449763 2533361438 +1132603099 555081625 2308723359 551758532 +1223219991 4212705940 3717260582 2787419913 +725889310 978932287 +2845183225 4030098430 +3679584950 4162471057 +3048898299 2901915560 +1937751204 1981150783 +3645791519 895260638 +1649625900 4112471617 +1375836638 2461528041 +465863192 3461925851 +489856641 489856657 +3862821529 210861790 +3396421228 475126807 +4546775 1367795644 3544786516 3125089865 1144484454 +4118104046 2050880633 +2335811567 449011000 +779171342 3226568119 2893628434 2236473241 +3880258372 1516878879 +117755091 1092309805 +1133051498 2990725331 2346225734 +2274693953 2964148054 1993598065 +3235049223 2467186710 +2264722160 1881528277 1881528259 +272624076 272624092 +734009320 734009336 +496050158 2306170057 496050174 +3556964258 1669256094 +2209263150 223839709 +1049401519 3204563142 1049401535 +1166857241 2511463255 +1713152588 185826743 +3057706663 2401966326 +3250526958 452929122 1822940729 +1966942665 1553063749 +3863153010 1726167581 3485522658 3985104506 +1110831347 3554256480 +3709620114 2097903091 2777760453 1436447438 1894306013 +40500653 767001682 2044352347 +2108070964 21489113 +3079578908 1063098896 3010005969 4219159564 +3071254007 1738373219 613788624 1526881961 1738373236 +809975443 2200397866 321961239 809975427 +3787708770 917564254 +4107677396 3890522878 1355954239 1093384121 184102345 3471082414 +1196523274 2383141490 1330314427 +281406408 798108637 +2884121527 3347955151 2738899257 2884121511 3075499043 3075499060 +915273183 3229224478 +3646404052 3527972648 2637959732 4178787513 3527972671 +1588207316 2568988713 +486624106 2921524862 +3507395553 1792511083 +1041892332 2935237783 +49948644 2556757531 3230560750 +2273914170 4058672814 1389068833 +1529438855 2917658626 +3460339520 4021164485 1245991928 336761115 4021164499 +2390661315 340425450 +816470799 2871875726 +1099907986 3330760389 +1689531571 4162051223 +1242326833 3263590950 +1953254396 1115397543 +1058153188 764210431 +906318014 2334437854 +58983494 3434816646 +1293954576 1988806798 2500151440 659634851 1660758377 4095397992 659634868 +2923362598 366761073 +1026137111 1334888318 +2672496218 489134013 +3959463604 955897167 +3321091754 1269041938 3321091770 1222307227 +2708977076 3815967311 +842224004 2328449759 +1339579312 220220325 +757140968 4077446205 +1296346062 1296346078 +821450074 362062721 700474934 +1265410563 3204647612 +3186696193 60121472 +2688649153 136885462 +3415659485 1534035179 +306842944 3874061429 3666601464 1781528347 +3138573227 376960524 4108262686 3716448107 842063139 2391174864 675667184 12090868 927670234 +3621039039 2194300328 +3276729436 3276729420 +450280109 2363182279 +952379270 1871352918 4216723911 3804903393 +642667724 424639777 4179753696 +195117120 2671893471 2055823754 +490832550 3022039895 490832566 +1207437982 3917002409 1207437966 +2084658452 2934277753 2934277743 +2841510139 2583399204 +2716479580 1068114119 +1041796408 4171648813 +2927531833 1343237547 +1033050818 2962431843 +3602004313 1388946149 +3367827019 2021051851 +3883686158 4287445646 +917779549 2190984276 +1397495691 2882080706 1666063042 1250162942 +1167494801 486698576 +639252444 1334188762 +3498872532 408918079 +3259014461 146245396 +273625210 2168848141 +1595870928 534183097 298595313 3086688682 3745049840 3150147170 1027833686 3339068430 3700857633 2295980315 1621212786 2201344758 1832377410 3497021638 3099943522 +3147417906 2232924595 +2658023323 58655419 +48637286 978158776 1012957449 3218722360 3576531915 1438084790 1470105085 1617655464 172165346 1445484250 4263792101 658696655 472569783 1494110897 4055394638 1327792954 2889323812 475274376 3326828274 1451959081 3399834981 726547527 1123726924 2665029053 2904391865 +2317872087 1053868855 600827282 +223175324 2362588039 +380762421 101484963 +1117457001 1125213006 +546787660 546787676 +199711129 2395516521 1446120414 +3674916885 2750417580 +15240634 672603083 +3262749441 381751846 +307314628 744359259 +3462342609 2966138374 +2765561821 272026356 2174745048 +1578822369 553452033 +1106888212 2708865242 +4065425976 11550220 +107249925 1069499709 355932890 +2730598545 1851174999 +2157330990 2592747129 +2529136940 2073135191 +2962096429 3257394565 3257394578 478927314 4243332763 +1813979954 1738187356 1787656380 2504650709 2817109596 710982972 2277905761 +2777345278 2545095625 +1339784591 1166452760 +2514561756 2209202150 +3142934536 2060991285 +4254720793 2822748367 +2980717701 3184096259 +1118119473 452665127 +3793989376 900070447 +935233953 2801742278 801449991 1643292790 1643292768 +2300712921 2300712905 +3656507641 332052847 +3495382058 1064689182 +3474457165 3549143566 3474457181 +3029517253 134885146 +3729377104 3370051499 +3856459160 3856459144 +258588095 3492464663 +466206339 1933345332 +932589338 2520756469 2520756450 3845761846 2607556075 +1876384527 520378510 +2491680141 1490336996 +1583781891 1610982708 +3447120357 1462082426 +245611728 1858315303 3686939516 +2099156945 3358129670 +1377680469 2580511196 +3322237300 2632430123 +2369895269 3740354467 +1700780924 1709319217 +507424454 1655513527 227283718 +2870208033 2870208049 +2628786526 121106153 +2595929256 1006042237 3805247683 360543248 1006042219 +739320568 739320552 +1023449487 2532424721 +2597543888 2059385683 +1313142858 574303302 +2610969994 2269175853 +3840523624 3821327072 +1511161449 874315598 +96569509 189776914 2796511771 3031047084 +3735541782 1224615158 +701951096 701951080 +1443574518 2352717798 +2554671901 3522131618 +3986211275 3986211291 +3614772282 1732394845 +627008841 506229240 1844926894 +660730776 2536667213 +743488135 537841555 +2364764230 2188702653 +2882871498 500988090 500988070 +4235407951 1993383089 +946222291 2615486522 +3400485588 3857894319 +3972202086 788724646 +4135450838 3706524598 3729701095 +1538688910 3998704783 3481878105 3336071194 +390851986 1049033925 +2857914164 1560587983 +2458095463 3396040467 +350499477 2017173660 +1261510521 3612642174 2701494511 +2491488920 1597824333 +2876894458 3941600651 +2907150753 1373030413 +654158041 2153621513 +3685846464 1507896205 +3910171583 3208232828 +658512384 1679617127 1728182844 +2164208875 1968268542 +2303074074 166768592 +3556165996 427758871 +1105359520 1467642355 +1712181417 3182557471 1979947402 2818236343 1456705727 2642317315 +3491239191 2900964134 +2310987999 2087416033 +1564341066 310771053 +3561198417 2002839696 +835685311 835685295 414770286 +2100658862 3376199673 +3079978441 3657146820 3357983599 3357983608 +1170971054 2374167791 +667055236 2888295516 +2160158758 1467509213 +3577091944 203872427 +1548386057 1380317998 2989123950 +4135097905 819228464 +640736498 487739953 +1461385025 1618164544 +1833363908 499479395 +3898529794 2178650887 +3145376441 3675138366 +733306957 4221209919 2263034276 +860383396 1593621033 +227888985 3138119944 +3497879082 1600640027 +241204826 461135133 1321629371 +4221527754 3857633275 +1425547010 2676991773 +3562307525 100999948 +4078414070 4170995172 25834096 +522219858 1376936965 +3137945895 3911798202 +395920247 3891355696 +1004379782 1004379798 +3242824534 2362627873 3242824518 +2546998776 4104072571 +3424806684 1982353671 +1282332855 4236039401 +2633977183 3414791627 +3248307815 831077430 +995517118 654143753 +985347093 3468973754 +960271808 3663707461 +45963258 1242660491 +1648533369 400618072 1648533353 +685355595 685355611 +3523359058 2263025406 3950224389 +4193642934 2544477650 +3922656923 2883243524 +1116575729 3210621078 +1932523436 8578007 +3996624521 3996624537 +536721565 3276112514 +4147735538 560262629 +1353124472 1861581549 +3901292227 2138993882 +4029792843 1767169026 +3432482261 3884428874 +1164120100 547013145 +1001040233 3113061080 +691062360 1346347592 +169501155 3397916746 +1887936376 3457738700 2642414061 +3943072148 611132156 2006165759 2403204079 +1630356257 457223414 +3901139480 2516509868 +4012402217 3003403903 1033074073 1033074062 +559794872 4220882513 +1506588238 1803358953 2686248286 +26974190 1978674105 +950436410 4220080384 +1758873063 1935249107 +1291608097 3952343928 2088608120 1905475950 +2465433646 1256990884 2204065907 3419650887 3880448497 +1941115393 439248143 2516756468 +1356691232 1759192059 +3192784451 3620985706 +2605158117 1453716076 +930669513 743353992 4256513081 930669529 +3209399741 964056909 964056913 +702390040 4292965069 +1693469063 1833156480 +1250867014 1869385617 +290397132 193511991 +2307314711 2520768550 +3768944427 2040853327 +1918388394 3274362131 +3963189060 1307595899 +3501450074 3845056171 +3701706488 1299845243 +896875189 3700124394 +223301154 223301170 +603380008 3315063275 +3145668041 1964225334 4061088615 +2839055919 2839055935 +334986079 3449239176 +3275671448 604919077 +964940702 2503772046 +1061091450 3636761706 4247914819 +1289541570 1289541586 +3714408096 2683049851 +1312407476 4147120609 +4222524000 2480735525 +1529957190 3566829374 +3935913430 3306575264 +1669280599 4164800998 +540546908 1166179532 +2579112682 3926193741 612354806 +3255178185 2055072814 +361068699 2395081765 +2432633106 1400588101 +1991374827 1991374843 +3627839806 2770748575 2770748553 +3776517558 276639121 +1412696381 1899549749 3404368642 +2532270197 370166284 +695721737 990995637 +1409330216 329364547 +1526405857 2593080582 441143328 +1213078859 2422714059 506997122 +1741413430 927831301 +1031739429 1944879453 4094886458 +2480317337 1407420894 +2243226194 3452755717 +3991296613 3869265132 +2357944428 3807777396 +3229264522 2333767469 +723119486 1473305929 +132056371 2534747980 +617196174 2272761513 617196190 +1540443185 212145216 +1207028361 3399603640 +209204951 3752762809 +3121223901 3135579106 +4062152354 3085190401 +1416344624 1416344608 +2666994970 1493356541 174935778 +2523298876 4283798129 +534553475 4084302704 +3520933452 2872041911 +5378495 1830729686 3993065686 +2945320798 338003586 +551063413 703190314 622498060 4173895763 622498074 1959941623 703190332 +1583751567 3690979788 +4012522380 1959468961 +150265217 1107318950 +3196134146 3849938908 3880393781 1084903785 +2541146249 4178200487 +3205453824 3307702291 3307702276 727244377 +856850751 2770433598 +2839776107 2839776123 +3126499021 698049714 +1746389650 1869865939 +1515930434 3707766109 +3154884104 3154884120 +3946707036 2928539847 +3664653313 3664653329 +2257778210 4216944533 +3757475287 2481191906 +334612418 2783209528 +491289716 3220329771 +2710991110 526237377 +416516066 4143900885 4143900866 1533420331 +2068026216 2068026232 +1876283916 4266968581 +200459800 2922030288 +698333907 217097803 +4094682811 4027070564 1089521022 +1916379318 2437687459 925822535 2360146205 2527438901 +1662513674 414326525 1799292274 1662513690 +1524101778 2482166739 +3814341262 688821965 +3154083068 2006708235 3951347656 4013015207 +1267729904 575000778 1261288111 +1509517914 4054810146 4255280043 +3796810265 4188885803 +493098233 1032651767 +3976033203 3384374518 +488666325 488666309 +1129379337 1904432608 +1737238832 564444531 1737238816 +1517612440 4262594139 +2796451975 2030943620 +3014001689 2386402537 3612891704 3014001673 +952994011 1183740114 +484162018 461025607 +3939536291 1229911964 +1256432726 979088241 +886529039 1040575374 +4061233053 3895992725 3631905131 2928403490 +3156793463 2873934662 +15971148 3416473761 +2968209916 3381230698 1913291075 +2473283918 1609629145 +4155922008 1084187123 +1110327088 1590524035 +2535295127 2221077506 +4261267606 480057315 +1613214956 3411650560 1250021249 +2760452478 4082437032 +4262375583 2418018888 +1257581599 519337182 +3712530751 848951530 4267242753 2558238270 848951548 +1861061426 1235466253 2445424400 +3941927461 3825454342 +1988984200 837501376 +18239732 2854318105 +1934683238 2935063440 3999540353 2544306156 3668284261 +23617943 2055206146 +2957772154 28090141 +694734852 872379977 +950492553 2281640135 +4044955655 564097298 +3496930978 281646543 3496930994 +3589623066 2087772691 462356213 3945291773 3239146806 +147394214 2055343959 +3665050080 3053487276 +268248285 1310684904 +2242350643 1558422944 +2353744946 1855328218 210301619 +278836424 758130636 +2226753736 3089033931 +2121086562 1743559747 +3818251024 1425306147 +2311312862 3175722089 +1936652060 3551461639 +3621538279 3066582688 +1982512026 3102893648 2672120701 3212406621 +3716485802 2764941061 287673805 1652318619 3300121962 +482984568 1598936586 3382518523 1807952416 1238669312 1331559187 +3264611873 1136018000 +3682753981 3557468648 3682753965 +4003544696 1292471082 +2055590474 715786861 +709480002 3927246941 +3700702103 3562655398 +2932735895 3309918892 +2353237412 2353237428 +349462741 1597951255 468398444 +3275701114 3599409437 +905481416 149590090 2027927827 1486422784 +3415784860 494042247 +706610637 440607154 +1340081284 1101470687 +290550907 3191496114 +299852425 2879921592 +3026487036 4131421863 +1724381634 831512522 2395876451 +3393843602 4100403125 3393843586 +4292212021 4073783932 +3747818937 1646328360 +2166692518 1226702723 2964409909 +2610752322 1200858565 3940171922 +2888016019 2400569196 +1629755511 1900255313 +3996309154 2617762069 +3751485101 2922465860 2308439826 +1976327856 3443596960 548998933 +4185527112 53238347 +3698720717 283612452 +3789204099 3018151357 +4214100480 1071381509 +2180834071 3088678192 +2120999253 1490270410 +4226121314 3130750788 +773405189 2528531916 +2513691397 3978458922 +1538349277 2597371074 +3157175090 1870102437 +3186505455 1338009147 3976231470 3976231480 +554292262 2372806513 +4034184503 4115599779 3201463696 +123477641 520360376 +1220035808 4198184041 +1708225667 3950326140 3417991733 +3810823991 3381490566 +8161698 2834277035 +980763283 2576862586 +3516496491 4129306767 1604040308 +2378104431 1141591189 +1281792485 713311084 +3474928791 2701819924 +2306939309 591096644 +2650038381 347327364 +3541103394 2828680942 +3791510378 461602258 748709851 +484028575 2310221660 +198596654 198596670 +819152786 4264774590 +2996379256 2668295931 +1193898597 1799296236 +1965318953 2437421464 +2638028323 2638028339 +690507785 3547725368 12940063 280961646 +3093065954 461747157 +2487259404 2058563895 +4023596176 427540131 +962370091 2370065455 +699338998 3486517818 +3631763879 1818790368 +1089994645 3680982940 +801116028 801116012 +1525013566 1544193002 +1318666522 2551796271 2495604601 +1354832838 3858675895 +2822281666 1494887672 +1396874746 3940745924 +728834567 279729639 642464438 1779994908 3966586912 +2495963432 1522004459 +2593206670 3767599769 323421977 2880598674 +2900457215 636375934 +1613896371 568330202 +3295150997 3300762524 +586884299 1998641647 +3947664221 1779991211 4040762692 816873313 3331062644 1775610399 4032609090 +3006146560 564728099 3006146576 +1133716560 71830716 2963417589 +1570026519 267715306 145987149 218024852 +1158771263 4185315624 +3917812066 270433944 +1445907764 3404137608 +943931533 943931549 +2331378628 2236083584 +2988869894 2024387710 2024387703 +3458566913 2249839232 +1645800362 389741709 +3709734967 1297319558 +2041342565 2041342581 +300426054 2342950613 2718905532 2895241698 +1993380346 72731787 +1498273167 250404086 4171403943 3062116465 +1924691198 2556760073 +202451451 3053573228 +2477112665 3337163528 1055463464 1055463465 3337163550 +1458701793 3221176608 +2646232704 1115268356 +2538495445 3067686515 3162895981 3162895994 90027594 +867128745 100915470 +2538699123 3962675959 2822909964 +3108593455 3716208376 +407207062 1410047329 +733204531 733204515 +254258828 1099585500 +518154586 2136586806 +569741347 3743369855 2559698698 322453492 +1186202704 2300521530 +4290905941 2051037321 4232798136 +499049278 293583497 +1054164208 3652945365 +2493950141 187194548 +2397799393 3720387360 +1276898866 599780342 +1419049792 2129240056 +2832777067 4025845134 +4035353149 4293647361 839480812 3219438116 4062651979 170937634 3773091348 +1810283585 490363456 +222851866 3502523344 +1695012383 1837076700 +3691113979 1376363058 +709209643 3065064884 +2307748902 2947405783 +1384456338 2039629253 +2639225487 1123565662 1425716257 855123726 1420135116 211386167 2639225503 855123736 1420135131 +755466318 818871001 +1150907473 2149644695 1318198150 906056673 +2625203240 2066039531 +3333536808 4056625899 +1029377516 2186734231 +3603463774 2074013161 2586880105 1568367490 +372348473 1633668126 +2176385529 657893544 792599272 3357415502 2336391871 +1139825127 3827797736 1631251940 3185720825 3663562422 +3483931942 207801025 +772898024 2657783226 +2659597054 2337201609 +2313483495 4201482144 +3607840028 3096833992 +1971202116 790882564 +4129233023 1044422231 +1697955723 1391222372 92502104 1374444766 390185321 +1466244674 3593380330 +400112729 3824812040 +3894900669 857833090 +2646563589 1497123020 +1168851104 1284946931 +1857160508 2118008177 +2585513477 899976295 3399473724 +3490628505 540928478 +734595284 3245925817 +4224723798 4224723782 +420889530 940350941 +102519877 3813763690 +2235648432 1975975939 +3594239715 588087132 +3850699354 3398858190 +1178088955 835299141 +1317818819 1776596476 1776596458 +3259746994 2404390437 +3046294683 113987621 +1498984195 2845540778 +949576054 2406771921 +2629634090 3885226509 +4281835972 2021140971 +1188756334 3145700334 +553360475 618514171 +3062997980 1128592199 +485085749 3105220970 +2625996289 1731326848 +2646224389 2035625776 +2168064644 1255744851 4066282944 +548201233 2166977478 +1508844048 3743116980 +674269390 1023816245 2499555137 1860351416 +64375879 3654100322 +3810104659 3561361850 +4142481885 2385686260 557877488 3150532034 637739563 2948803953 +3280410880 2284166123 +1026018601 1856501646 +431168391 4227093888 +562078672 2374099061 +1452551264 2873219877 +247754120 3342363933 +3419769766 3419769782 +371998574 1437063727 +33914559 3502852054 +786195228 3289846767 +1217490130 250498693 +879471916 879471932 +2428012625 1716029430 +3629896975 136574912 +2694206638 2057784825 +3886060874 3955950445 +1223933059 1521599018 +3088828110 3871260239 +1241730737 875880614 +1033346472 1996307492 +1527070187 897476632 876640482 3645106332 3892824725 2065185131 +1363629962 1363629978 +379021751 3653390313 +1713262595 1771455463 1771455472 1903120957 3300390076 +2826490377 1060283438 +1905622152 1448282653 28896180 +3999223014 637931009 2792012676 2114269407 2808790298 4069010993 +65214543 2255158961 +2332492704 3193526112 +1204665743 869721112 +3688848288 3231530227 +2934008266 383355131 4084376370 +228499173 1437868652 +29459053 815812996 +1574287045 4232827132 265600684 190435508 2745748135 +1334943573 2537411292 +3274733034 3420838994 793354075 +1325044172 544441377 +121430492 121430476 +1359717400 1359717384 +4209480307 1837861644 +3375138266 532727202 2333521451 +3120062091 1291637981 +41216275 4044024058 +2056577457 2841594278 +2128517585 524779541 4199614427 2821866100 841839576 1399299478 +2501706999 3014578384 +1717590365 2259463531 +4273021306 3773027414 +2897648370 2897648354 +128818107 3217030270 1497004617 +449147916 819310327 +1908884846 2091769803 +1559560186 4218297557 +3031047083 315199010 +3362559644 519116689 +3581432088 610773197 +859639601 859639585 +4074631661 575490177 +3271689252 1326765593 2228022540 1326765592 +2998311780 1589337945 +903401418 2387548923 +2026947119 2396572303 +1829175086 3489903993 +3980634539 270442329 1207048654 +3538296029 752689365 3711922146 +3110386208 4187029605 +2495263527 1223165536 +2306157280 3527237051 +681797611 681797627 +2672683798 3718845361 +1155888455 3157761750 +13766716 2259652209 +2661025080 2547371786 +3395471531 1149363508 +4172050906 1706068838 +1963004764 1963004748 +2315961017 133204286 2980575669 +1125482345 1515933913 +2129650423 7631734 1549307611 3626903417 +3846424512 1786672539 +3474272696 2697950399 2486185742 1908885897 1134962153 2435317315 839534659 484252655 2040816461 805708228 2924728107 3502024698 2939252865 649487240 3788788005 2649249535 +3975456318 1292747593 +4268231887 2371100721 1288448462 3177570060 +626089974 67797706 +1293895240 2956698443 +3901379014 3619601057 +600546105 2458213054 +589824259 1526306730 +3580700494 1221910489 +2384566088 3749124643 +2238264770 986424270 273251293 3332350051 273251274 +1215193142 1002534151 +3286662349 3210028897 +731404341 82798554 +4259796545 4096575583 +1201119069 4094713928 279961460 +3936288137 1209743621 +2544179516 4108761447 +484720419 2656003100 1392154640 2656003082 +1376093746 3117735572 3007495149 2741084566 3367067430 3367067441 2621609917 3880225505 2604832295 +574103055 574103071 +4026828071 3781885861 1755130674 +2262738538 1146713256 3053086856 73108647 +3633751362 3203664642 +3537600614 1435181185 +2391663988 483933600 +3423306386 3165831558 +2998928804 138993983 +604498486 1783157761 +1398779755 263058830 +3907219822 202084409 +2068423233 1441426496 +2318910614 381363553 +3446087908 802580880 3540186812 3799591287 903246576 2734301930 3733466531 903246567 4202254141 4219031747 537946556 +677430578 744887071 677430562 +3210765375 2210254654 2345475050 +1325562855 3755930311 +1121844083 794725024 3001878986 1356098228 962501219 794725047 233969222 3885248531 1596556897 250746844 337941302 +3798691845 2860338218 +1984105876 3213778927 +3554194514 2252375286 +3895217088 1035681605 1925486988 +3381779011 4175507761 +1645531691 2445728162 805877327 2445728180 +920318130 2522830102 2477454612 2497460029 2480682407 3457348006 +127452403 3632132426 127452387 +987102346 2385662963 +2595458805 2108296124 +1840750346 3255786683 533529825 959380069 +1821999966 1403636991 +1377574187 2999220559 1565848149 2999220568 +4236516323 1995964314 +178297612 3889911345 3335787511 +2418541877 603992700 +47127858 2118174939 +1017973720 2270090099 2270090084 1550427405 +2292854894 2448047407 +939818889 1991351801 +2856602627 209954986 +3941584269 3941584285 +1767351258 2579239842 2935418923 +2724217241 586033762 +518722054 2987220855 +3966141409 107060022 +870404554 193760115 563995424 +3416670046 807322459 +3482016264 3227433611 +1750879825 2588887439 +2473566832 2517829579 +1984339375 3095549684 3021287889 1517947643 3760863864 +3362269519 3405317976 +3837451295 824739016 +3816526402 518417482 1569144291 +2970538166 1425430581 +1159631723 920841675 +3601791549 1967414926 1853861154 1853861173 352160917 3675997771 846458370 +3723536381 1591243604 +2232851688 495997771 +3742000665 3575548784 +2289017599 3334313854 +1694182056 2674140797 +1411263668 1411263652 +678027748 2715568591 +2478056750 1506654346 +92131712 621857939 +3511535921 3324699585 3511535905 +1368095404 1406551025 +826123382 1620357621 +1510965325 578794387 +1427092820 1002074927 +4187622299 2769435840 4225249819 4225249799 2769435868 +3525723582 4103924898 +3789965206 3267800103 864203057 +209214508 3447265623 +2784664430 297284590 3078794799 +4184073122 977229845 +3379273173 1495985779 +3885975409 280852208 +2111482870 87857921 2111482854 +3081809933 3564658546 +2428810554 531188317 +3934711118 3993666205 +365576285 719401387 2623189058 +3550173581 2861431012 +3691113976 2863912576 1326030203 3642938003 +831016438 4019370574 +1823133059 2481030460 +3633568093 3321131349 +1376792443 2860170930 +2912956282 3442130205 +1676865915 3530695844 +3890019651 1631031574 +1250024473 1668119368 +878673149 1867629122 1490392770 +910569119 3793823010 259744841 2822692600 259744862 +3693750097 2712794750 +741610854 2153365858 +1537967319 1146987081 +3039196720 1535905173 +3706148579 1024513478 +3060243824 291961547 +3338594649 2622052104 +106238172 3555297873 +3718116810 462287046 293605171 3214404954 +788190650 2933814237 +1127485196 3606294519 +2462355023 2869280603 +4123030622 1006055401 +3010050208 1793538434 +770221992 622491578 +4157633596 3997823763 +3837707461 2123271933 +3974324531 485622618 +1694787392 1173260755 +296624087 2887524208 +236963787 117267086 +3332809218 3440000751 +266707128 3800379356 +241631843 3106483536 3106483527 254329308 +4219100321 546753252 +639560154 2329135523 +3557977462 1325551825 +4033555282 3400872467 +1472398133 1560153194 +1480180118 1276647750 2182998647 +2976837686 2482804220 241788103 2389068310 2007239617 2321957813 2976837670 +1386189573 3371455363 +949187882 2644839826 975270171 +1395209101 1994139378 244403954 2799501499 +3599652075 2903485940 +348684608 4154685395 +144192194 3795925375 +2873593733 648474202 +2562413029 1407314796 +1048038748 2996324295 +1584649847 660249926 +925429251 285580739 +3169727865 1730256201 +1154614720 3810249100 +1989189378 2137995662 337389323 +311561675 2031119086 +1960650763 52824404 +3207806720 1844810555 3274094904 +1332948773 928200506 1375727690 3588059363 1375727709 +1465514963 1437035820 +4117615451 2898848338 813373787 +1492838377 4227535822 +896940722 3676202533 +3441026372 600042015 +4214764067 2625039626 +4101324268 2758859009 +3568129107 3421314476 534494885 +1015465094 863424649 +4079319055 3539730328 +1041796391 3886429280 178549555 3886429302 +1308742426 3873395179 1552807138 +1532741265 1265078305 +1994328173 2384085892 +869744874 2245734477 +1984421301 3894543338 +3336411495 1977122102 +2973252195 1585703360 1512574524 3473497492 +3960842265 15021623 +2406350534 2418545057 +65933676 952801431 +2976223133 3756069940 +2128159701 1724723910 +1731105533 1800496212 1800496194 +576941097 4246411571 +1161543851 3947712769 +630293675 809430222 +1507069291 4125393143 +2149688319 3002188203 +4290569885 10182804 +248952742 937282583 +3713838330 1818630161 +3342205313 453271040 +3731603835 2661389490 +1862543971 2393806151 1862543987 +2434885187 3130260348 +2646555179 2927451736 +1299925908 364806911 +786118405 3356990682 +2162762919 2838857355 +3179090160 3838440515 +4075998128 4075998112 +1283648977 676362790 1125933072 981209623 +278406195 2035048582 +3066950820 1666679003 +677946783 1002223966 +3669168884 555316727 +168486165 3827736604 +3238617853 1465267851 +25868579 2422305308 +2909353421 3382686130 1588619643 409254706 3382686116 +2255987907 1901616874 +354830571 1649011480 +667839301 4008893850 3260209533 +828545374 473394921 +2896732254 1532135306 1434803489 729052131 +1211669695 1881063614 +4092670816 1689509939 +228304626 1577570021 +4189680857 4050803625 4159893918 183020559 4050803646 +1370208482 1934887875 +775837761 1769946617 +1623205710 2625494991 +1018286076 2280286641 +1621995179 3697932066 +28431135 3387906504 +49623588 3422416575 +3371320652 3019679155 +4086917406 2558556735 +647971768 2584247876 2226625197 +3893924178 2964112389 +405927353 537524104 +2692024820 2352917263 +3807649339 2169214692 +1701152466 1892891795 +274099345 1225582662 +4203667619 1397330205 +3563512600 1979154139 +1227892502 4064950570 +819251823 1308273838 +2303007587 2060065994 +1451139629 3230920325 1448692946 +3791026790 1111021478 +2183095756 1711010807 +3352468702 1479334687 2531070889 654701336 +713950560 1569879603 +1247621798 3065428830 +1502179174 4230658933 1473154754 +4112236655 1236266680 +4175357200 3605174307 +4199567390 711860031 +4202853117 1482359874 +475455235 2680230325 +896768138 896768154 +2210490023 276076790 +3551758371 1721716490 +1539958397 4225095380 +3913117956 800647497 +1520773196 4261310391 +1669149710 2887315993 +540243086 540243102 +2328373919 984037707 +767883725 1000265083 +674845771 674845787 +3108013081 3108013065 +755259616 3185043621 +438619293 3303938868 +2364283319 3684818921 +798083285 657119596 3078563676 +1197385582 3355546169 +900674203 499952132 +65061947 204123815 +2219219138 4246894947 +2840109350 2740301527 +118835662 4102238031 +1816447198 1816447182 +357838092 970735942 +1089416192 4195423181 +1421808150 2127132849 +1164331341 1601675259 830257829 830257842 2365940772 +714408712 3047167540 +2525881887 3239846091 893237921 +1091733504 1881937925 +2227292501 1376776412 2227292485 +1435759384 2949685859 +748350709 753075626 +1834455315 869884140 +2050967431 3939824141 +1482363727 2150402444 2150402458 1717527886 1612488061 2886895537 +375623795 2254930701 +3082129217 2805907568 3083399235 +542521197 1421426834 +1623745905 3430396134 4147838455 +378455372 439164791 +3675322809 2495159870 +1157937128 2389541437 +3703808950 771399233 +4171017000 2258726891 +2548559594 1825602885 +2654381825 1728249392 +1337808056 1057775021 +2951618812 4024298663 +3583861860 505983036 2865039743 +1642560638 2640902751 +1214302458 3769759083 784348546 3091202082 +3720284984 1270786363 +716092908 487088791 2625741052 892539159 +2525010832 2701293035 +2586747913 408917614 +4025723406 3398743065 +223758958 1675434651 +2146428052 460567058 3244983012 1186391102 2515111096 3371243674 +2852513491 2051694124 +868785302 174866021 +1370636868 3751694623 +988001750 3770259617 +1109573649 766794448 +2642105895 1367011667 1249568351 +54326108 1962088903 +2942307208 3965254321 976084093 4096301550 1128746368 3831033371 +3548125661 3740526037 +2558957887 1256400110 2558957871 +134318147 152491559 +2041237304 2041237288 +1647814729 1647814745 +2147132341 747615722 +2335975177 2936963294 951153464 3320475679 1834504558 +1369625573 2978872513 +278347579 1494780402 +2353889445 2197914554 4116864477 +3661262925 2769729970 +3897954794 2843620187 +3381058057 1481200968 3381058073 +3850582782 3689694729 +367277113 2940089768 +3310077974 2890660529 +861150560 761937445 +1858628104 1837034141 1837034123 +2976672490 4282341701 +2369992000 2697778131 +930252890 767127452 +3030005376 3468938131 +2051223805 506885124 844084817 +670874355 3856288922 +344030985 2311272479 +1241207389 3550652532 2333020738 +2636406119 3359333747 +1174164782 266345787 2586710580 330670045 715126373 +301478231 2696260582 1097967366 4194155959 +3844726243 2749910090 +1022884169 1130196472 +2623699893 3821205338 +660910343 2344086020 +2731463669 1083681468 +3365654006 1626215235 +1501609199 3567873070 +2688293601 530468896 +2210275631 3693738604 +1722950437 3480048442 +3532521349 4203298387 +3025153112 842387099 +2979038587 25305266 +4275690221 657760884 +723300535 3781798196 +4905294 3285456345 +1553857140 2609777550 +836059592 836059608 +2009409997 1482739108 +3724213625 3944547682 +604842424 2025368749 +4043281637 2525573784 +2512250255 1223712777 +1814119734 1906460714 +1884177972 2516025449 +1230642000 3369664245 +2250448634 404673474 +3898845990 1846477878 +2406434200 1680510555 +2212922173 3772815618 +1757445366 963414802 3708073799 +2680533386 2596638949 +592194478 1055441647 +2711413563 2767828452 +2003146546 653067187 +3122566183 623065462 +2138171381 2505057980 2955727498 2505057955 +3131940080 3131940064 +3280489527 3495799395 565438925 2874511722 +3920957385 2970081656 +421312264 2419335563 +113691833 113691817 +1206455460 3621709375 +3911794347 3069028130 +735533936 2936634255 2110245152 4126630364 +3537445728 1272098853 +1742370613 2984880234 +1673205527 377837872 +409065297 2467229181 3699651848 +1339919822 2232560014 2277915471 +2072103214 3984029614 2605691759 +1599307840 3692902838 +1632683909 3072988748 +3618953207 4245045876 +2490392449 770070528 +155405488 1156692227 +4225556576 4225556592 +2855459292 1667640967 3389846855 3338205260 +743555316 743555300 +2928589879 28461702 +856160807 1959405618 +3017468340 3583895119 +3142325966 2798118489 +1193233384 1193233400 +3143398825 2609723672 +2196419406 2196419422 2337455822 +1425547021 3482902884 +3216975372 3533722739 +2157479567 347864334 1201179157 +56689483 3388087416 +1479582207 3549365374 +546223914 1238272149 +2711774758 563479333 +2523525524 2523525508 +382960850 1555138925 3237615251 312016254 +4038053141 4038053125 +1050595638 172200705 +514192847 2892134334 +1873724406 1873724390 +1934151767 2379543735 +3709471837 1828812386 +1308167642 913386870 +1953553598 2113478089 +4201855531 1852084660 2787209557 +2764007233 2545743335 1094211686 2588904278 +3522279670 389395046 1228284119 +984968231 658631204 +3569451916 2023888232 +817574998 1701149473 +788695187 1548094438 2482831226 +4106107473 2272430582 +3598549118 630277705 +877335472 36699651 +1786790119 2397449120 +620900844 779392663 +2042900144 1607827203 +2530052405 2988078538 +2778211260 1786790119 +2035355296 2593785331 +1811878506 4017277135 +1586028008 3111474237 +307207603 2253734092 +115612811 1679355604 1679355586 +322350696 2803142059 +457238436 1330330939 +528522889 544838072 +1789723258 1377313621 +3030690466 20487427 +3418738103 2627245168 +4143783341 2104866638 +3365930707 1799427185 4018757462 2669891885 2800401964 4018757463 +4010107085 309813938 +3772467097 2452731336 +445063244 3429397088 +2391690174 671169567 +3544845578 2259294322 2811397819 +1205559966 1144440489 +1458042146 708429095 +961378570 3616105586 1056279227 +3401436464 1489633941 +820796136 3742621972 3960675133 +1317459712 2655286533 +1449061725 1244276040 1416604002 +1783315129 225276200 +168466775 363809494 168466759 +1753129572 1327251033 +3083000871 609435987 +4102095040 1237636748 2803117637 1237636763 1374141560 1898319295 +713880800 2547687896 +374932120 804161587 +2528985568 737063859 +2241916788 2500295112 +4085380176 3302150503 +2756400946 3566879674 +2460485810 3044302925 +602493658 3940735669 3792987254 3940735650 1649241387 +3144097033 206746926 +235191040 405803172 2081340109 +2352409759 877535777 495504220 +1068604504 302716901 +2094615993 3634171785 1125472830 +3684525925 499762170 +984868862 1463163833 984868846 +1938497898 3570539799 +1130554922 2059493971 2424007542 +2394856861 1393696308 +1440810990 1133905738 +1750188127 2545014152 +1418502633 2109890944 +1155844497 842515693 +1142701589 1142701573 +540906645 1441851036 +2180708820 1403484969 +659763085 232893170 1962138340 +2110325089 2204417932 1684876215 1684876192 +2381059681 3416734390 +3849433784 4181586544 +3117657590 4255489473 +842681698 1942475093 +1492045113 955060414 +3089254301 2062990370 1262293355 3026856322 2062990388 3026856341 +3471003565 1557556548 +3573278365 4245548213 2104647810 +3084965786 439078243 +3212071541 2385382415 +4120315657 2780828462 +3907408540 1049889671 +2523598674 1394024412 652533982 +2247115798 551139370 +4015881450 1840495442 +1896414602 2334603645 1896414618 +4105806610 1379644755 +3972419488 1546606835 +4252570948 3931380783 +637737767 4259561056 +1291364386 1299230101 +3599674070 966388896 +709844437 2179921530 +119377925 1216991516 119377941 3670830141 +2866459932 3711671248 306912017 3522425868 3711671239 +206750392 4003747395 1294828144 508069805 +1102081037 1251532827 +2744676087 1096102242 +2290916891 1500157297 +3446508571 2121502340 +1733176380 3919366852 +3713778029 3832643226 +3074444728 842684589 +1576499082 1804571454 +1416588421 1885853018 +3455295558 1020928134 2089111095 +2287305115 966461202 +1206646798 1182236175 +3544052123 629364493 +1701742059 289483161 4235641362 922546190 +1584105384 4245732308 1262914941 1782181136 4245732291 +3419882714 3261751385 4145280206 +2118998630 969232001 +2147878441 4006569374 +2692790324 3735157209 +3801463787 2629227252 2815301135 +1751973569 1822325745 613747158 +4014110142 1671387679 +3141458477 4042355922 +3802775977 2050743576 +2758948870 1293901607 3855495521 +782961780 3947141775 +91693974 2499746913 814548273 +2320281545 2110515256 +4023440969 3468776686 +4116997722 2802655165 2534213229 4116997706 +2164901806 4270316079 +2729528051 1631050 2729528035 +3811680664 2928525107 +1447490012 2848927861 +1306203751 1673812186 +4075853181 4075853165 +2312974179 1781635274 +1435114352 1435114336 +2987436613 1280425559 +1673069179 1911172169 +4194951118 325336914 +4087699425 1850300214 3547613713 +3515145687 2871605616 +873476010 2846788613 +298473785 4100766889 +3326357682 3478693925 +149168034 2703084565 +3661061867 2261250328 +2785220712 917936771 +2376234167 1058445151 +339290401 4143693536 +3971920999 2852064356 +734442306 734442322 +3689981120 3115787709 2299699922 1347763673 4224932435 +3290046376 3593429164 +3276557602 2468179093 +3446031942 2650841143 +2570818029 633780228 +3571754233 485471230 +3291122092 2186320780 268989765 +4073020226 1856940259 +1170512754 1182839909 +3313152624 972666441 1718409992 2185009099 2185009116 1344726595 2302452429 +2183906282 1079709054 +3800138100 3800138084 +3172822723 1898812541 +1370514997 2746008211 +3985038299 3985038283 +629619300 2011229033 +3913497991 1680673928 +2166182959 1881900536 +2509059226 122277474 +1366389224 496390187 +3510239625 3516395513 3880807096 3880807086 +4051271392 37927603 +776093305 1263032446 +4037435879 3438032838 4037435895 3169590966 +3127462433 533014097 533014086 3479506311 2495590902 +2196445508 2196445524 +238066390 746831601 +135344188 135344172 +1195942277 3159770188 +469075641 3162707240 +25852832 1559690363 +1815073948 4111769256 +1788442266 1771418731 +4078421052 53133526 3528298737 +2786855656 1713711915 +2429576078 2248980623 +3624370175 51445180 +3718445727 562466728 +1255449011 1255448995 +3620769517 797018450 +4200921691 2281053508 +1012901836 3600098849 +4131229692 4139210884 +2727878397 4068001876 +1006701009 1006700993 +396474685 1058407458 +2463196968 1202021355 +248098171 3262912676 +3301820249 686870792 +2118461803 836776802 +438590641 259547990 2563897094 3627936432 915287479 +3715670991 1944706776 1361694235 +378464804 2239441944 2801440425 +1883673636 752084504 752084495 3810210985 760939349 3810211007 3141943004 4136182692 +2177117083 4171676193 +674427050 4063288219 4063288205 +196120125 2750409218 +996972848 2011937931 +1103672509 1274316180 +4195427686 251518879 +217960714 2106593965 +1635483158 2338815153 +593561833 2596341464 +1163178360 2622709741 +2084046585 3471432559 +4142838309 3860245322 +757755093 1937803753 +3244877499 3832661374 488236361 +1581779455 1785183336 +1297650536 2338590083 +691154259 754801082 +2592033795 1291297127 +1225605621 4108244156 +2390309376 1222004243 +4293782907 2075724328 +4083264475 161137487 504230286 +1092129276 1974325169 +473720868 2534928575 +1338969280 1219332845 3453599301 109036172 1659966021 +742366280 1279763041 +2925244974 2824437359 +3735781945 3237871550 +1199916357 1701592103 2620801916 +2891280162 1820193429 +3338311967 1535052744 +1505743918 3156736697 +2694081172 1571014383 +3933491983 1835607130 605995160 1953050444 605995150 952287526 +883297303 4167370790 +1008413475 3250907146 +3122581074 3399069434 +593263016 1385399165 +499228782 1171230009 +3993389709 1088904164 +2733572804 3588326840 1111579273 +1873749928 2025549181 +304882630 1635537057 +589357415 3015890217 3015890230 +3047254144 1830257043 +2643810541 2843501381 4279958802 +1199301192 1199301208 +1016609467 3655511143 1976322237 3887343726 868035587 1976322218 1019034172 +567182017 2683823517 +2691836855 1253757200 +1474561468 919499500 401934055 2813980007 +281496701 281496685 +2621783328 553597285 +3242266932 491442568 +2756705968 1240323571 2756705952 +1400306125 827014564 +1426246075 2388889970 +4216525213 1086634548 +293021309 4220622548 +712719800 2550278331 +4193169358 994725721 +1497720475 591431186 +3879956254 757591081 +3951982084 3577989215 +2729918203 561521970 +294755215 294755231 +131232253 1296658772 +1608253006 894522585 +1348304556 118417367 +1813307865 1155797161 1155797182 4259285150 1726520079 +3783706467 1781260490 +3391840289 1665684448 +2396451946 2602452574 +1297235509 1036697050 1036697037 3984059754 +1253310527 3629933352 +825478633 1569531352 +713590982 3136245687 +89821651 1083412268 +1497496271 3090447642 +3391089100 890902496 +378645869 4099146372 +686639542 2128610770 +1079889184 2038065659 +1011580649 4214389829 +1001425931 922113635 +3118817583 3541564654 +2859245150 2801618409 +2450240056 2773030208 +3586064000 923778539 785506152 4222264211 +1134501135 2189082264 +1559931132 3021342380 +144192213 2485597133 1886612147 +1998130355 795803084 1998130339 795803098 +2992276431 2474475214 +3100999629 3306696612 3306696626 +3994710923 3719311722 +1971176459 803173877 +3030095007 4074876175 +2993606144 3832433171 +152144021 3684303516 +2562262699 2562262715 +352006026 2439763501 +3362976138 3362976154 +1600630133 4274499741 +1586622560 2083086125 +3000074254 2797411693 +1779513140 3636881311 +2601290756 1072124143 +4112725176 2657877421 285235027 2657877435 1550569664 +2597506456 648071987 +241458779 488694110 +62136963 675504103 +1747635945 3831740632 +2016892626 287157395 +884203148 2200393335 +531765694 854632039 +3283113944 3868870925 +848909036 2472380801 +4115959272 2082393091 +1504332198 3440504897 1504332214 +2496334176 2610938405 +1203314135 4014801246 +2750891552 1044604005 +2934841186 3269158741 +3201477129 1856089134 +1942179023 192014808 +148409537 289388636 2873730305 2523380208 3952970214 2523380198 2027454035 2917503958 827552359 2523380209 3007951283 1263770455 +1376601282 3974315363 +2683801829 1333744675 +3019815632 4055618420 +3118906241 3573573286 +1309459092 2451460585 +1157105119 1903246878 +2558355108 2976420927 +2145088110 3027575609 +3201189941 4201568204 +3556682287 3907381230 +543843561 2226232176 +1000911452 1183893191 +3400875626 2236694733 +3339169830 1998212055 +313078804 1952250735 +2099822560 2246539963 +1688251719 2951792342 +1034329856 223104275 +7588303 2672318746 +3685181481 2527061119 3365881742 +989328944 72912259 +1267393832 3967620436 +1864531481 206340446 +3583658434 36208590 2146611165 65150069 +1588703231 3116281276 +129142016 1584258252 +2025871160 1321815332 +1597343186 3389156098 +4176357950 485261193 +2128831230 3186939337 +2499383309 633100882 +897159064 897159048 +2090801877 58146140 +1986739146 2584097952 +986148808 986148824 +192453957 1407161228 +2756012749 1715937444 +4289538146 1259968686 1023950699 +288814858 596042925 +577094169 577094153 +3485631703 1562026991 +3008336623 893668920 +4177763732 2494631919 +2773906225 3820599853 +1918633210 14407051 +2358010384 1358847779 +3387223024 3387223008 +4161017115 4063474937 3445361214 +3715411886 1298312889 +4291278776 3672642116 1600534189 +2573251721 2573251737 +1880655056 2482608879 +4020355065 882980094 +3333983988 2036596512 +1059680994 394513898 1346361795 +2524018952 2843406348 +365815112 2420597365 +4292604743 2900668979 +1401360656 665298813 +3342841036 3342841052 +754898691 168010471 754898707 +820419172 4260427352 +2880397068 2169614135 +3636114278 1339901082 1843280039 1843280038 2481482135 +2269212262 2923359142 2923359153 1375783553 2820083098 +2447768883 3758987084 23407776 +2455269035 1834542798 +467227241 1116358341 +1727821616 1332715651 +3474843344 3856847676 +3911386282 2887800731 +1380121221 74473292 +3906333447 2411789334 +2440092037 3673985469 +1372922494 1372922478 +2420377675 1712918036 +642799368 642799384 +1250658863 477367163 2292877304 +2425553240 2967294743 +1683497737 1515275295 +4229071497 1512275374 +1706068639 1361826576 4268330705 +712324657 126111526 +2463617148 2713414200 +1169040710 4146375991 +1306130669 2065882386 +3483184206 577552089 4147138987 +2569819407 801760910 +1144332688 4209604333 +1533259005 3672724034 +2484044639 2396537826 3802827873 +2838832435 2443808602 +2387304372 3030886489 +553004041 803791436 +3875565770 1873907181 +1565872622 3679451577 +1953642312 361922907 +18694975 2970880080 +3290414402 3568963421 +3527332612 1734111225 +1964537091 1090766625 447406918 +2507957195 4221667001 +119078987 3041090400 +329935533 329935549 +1957787912 1957787928 +3947727943 4122472383 3920279321 1030382268 1183211664 2752638707 2892709898 3457822602 3476857391 450887119 +2776340567 3690523092 +1039943826 2171269689 +2598070156 1399062903 +718756313 3332401903 2333422396 2708744991 3996426165 415582984 220644275 218262519 3214618018 3042783955 2431236329 1132451055 +263423724 298240535 +4037789989 57517370 +1134111366 2131334084 +1701504539 1538737119 3259513988 +346079962 1260532854 +3345657202 2247483734 +4233668157 2089660930 253012555 +1090265016 82177723 +1644097455 4082323576 +3573072338 2653477608 +3552390352 583895907 +485077731 1726258012 +3634187661 1402206437 +4163881440 2470103973 +3168918094 2777327833 +2869610261 4051018170 +957317147 3483266504 +1649189544 138592405 +1136270266 1224736405 1475978699 3925073430 +4079653511 811100051 1392814720 +4243648250 692597661 +2377701180 1442501489 +3897263451 3560772895 +3751632336 3569004131 +2062562159 3236296378 +1937185734 1749743802 +4229412649 641949776 728818327 2097680357 +1081682780 3669967313 +1983149913 1838670088 +183363105 2424382032 +3412541014 3412540998 +4041325402 4041325386 +762011040 537158387 +2474128129 2426143271 448472444 658000512 +2706853646 2553220932 +2458521858 972657159 +3252630194 1719075333 1381510604 +3647782099 3647782083 3460040023 +2745489973 939832209 1519369999 597868266 3515056502 +1976849916 4139215693 +1610577822 3173600694 +4272708424 827568715 +2658136615 127856216 2436510569 +3635949589 3462814429 +595441583 2380802168 +4131575567 3166428016 +98123687 3690935286 +1578948966 674260634 +3658468291 2149285732 +1686725210 2655376317 +3621153748 50150719 +1958575886 886942685 3561947919 1197592718 +2082590201 2029019415 +681832901 3841981857 +3154083069 4029792852 +3014477967 2201164483 +416759158 2092988991 +2715903393 2865930006 2216914374 1339005959 1993538656 +547496506 2570838365 +1636284077 401959454 899977796 2900294495 3289536274 3579186473 1499453285 401959432 3289536260 2164050715 +1029439655 3378107058 +1786713262 1410174457 +545814786 1954158478 +1930104204 172009926 +2441310794 1542253165 +1910284655 1910284671 +3200537768 4145103979 +3638404124 3638404108 +3887952072 2537065181 +3101971587 848831811 +1942801688 1206752933 +3790244927 3812280126 +400914186 2397868645 +162439579 3639109380 +4053432079 4053432095 +99806591 3855607612 +3756820742 2472354387 +2646883475 4008401772 +2802215165 3936590306 +317167955 362175930 2021125323 +1673654407 1027208580 +1018051664 1238688939 +1898626500 2637644375 +2702165512 1357384407 +616275031 1975607538 +3206465505 61027258 +4111777436 117885625 +68229483 3908464536 +2071139489 1089962803 2620449888 +655450194 1001101113 +141147452 923087089 +304520597 3066318875 989762776 +195534886 2539575746 +3574299840 1437183071 +2115230193 1782584944 +307388611 267032723 +3023820175 1227960334 +1996079356 2731700566 +1223169502 2472170329 1223169486 +1739893306 1739893290 +1711890553 432201335 +2224982764 236154369 +1846086561 3644673632 +2467434830 3547413977 +2435788091 3359912946 +751452363 1751864824 +3837995763 2807756617 2338969027 1030384148 2338969055 +3684525939 734648858 +2190866322 2268023538 2678200891 +3226036602 3327418946 +3494912470 3290776551 +431007820 3172528055 +2909310643 2588526403 +1221138697 294196793 997954414 +3891205804 3378557143 +3665182373 3986447257 +563302636 800992640 +1476043010 2173400629 +1806345040 789668432 +2089263428 518065120 +345307630 1418031535 +2184114815 3579669957 2127557692 +902310731 4112262914 +4160195518 414252041 +2971454076 1280491815 +3223305771 2633522612 +2976043128 1120970288 2777257224 +1255576241 3006223425 +1209748996 2264649801 +1912202842 3060106861 +3664279987 3879681312 +3004367659 300809378 +2459628709 1861164972 +301898672 3709698441 +1577441249 1577441265 +1948807068 1739037047 1948807052 +3861377758 1025769931 +2894163489 2040126435 +344128794 1681158123 +889419832 3146317660 +67815149 2494657705 3678359003 3544138049 2182250821 2182250834 413791648 3695136609 +4159064063 1048794750 +965703891 2399123635 +960970293 1999675256 +3394137603 2088185532 +1909334865 3488432173 2021759120 3471654551 973282038 +2347114446 3643223162 +1179643763 584446490 +3217519671 1898767209 +3315226816 3522803269 +3732628460 1510858360 +3877373381 577176946 560399340 +3464700443 862892164 +3217233320 2283476843 +3722471647 658839326 +1921720318 578302085 +4100264406 4100264390 +1410983323 4291064594 +2457746772 2302952628 +3450718346 3450718362 +1616280430 170333177 +3764972955 1687416580 +1236358345 1236358361 +3399577242 2518752381 +3993182359 4166100789 3271445506 +2874199796 2754988569 +3661044946 1455578771 653975930 +2041086769 2802127604 3504066013 +2460157762 2916575581 +833732755 4006849706 +1251762764 3224288701 1156202780 714376311 714376288 3224288673 +2418023063 2039077808 +3140382190 3140382206 +2529582834 2529582818 125845658 +1384576349 1198801268 +3072706310 1450724983 +698855019 4260860536 +3640468294 3699279649 +2066950927 9226392 +2823460092 3915942065 +3417484947 1565653587 3852578070 3844872970 3749996454 3345331821 4197202993 3852578048 3883495574 3463352493 2205100609 3364111222 1028182394 1377709444 322272482 +1040998194 3749305253 +755139945 1181662156 1140327512 +2822208094 1406006865 760586742 +2710353932 1552268023 +1188991946 1516414701 +2476996930 2904646371 +1599820062 3092812525 +485437875 3559961888 +2349310876 201756295 +3083316888 1160176310 2085295155 588457312 3881294171 2018184679 +468056158 1316199361 +2066302944 3254527411 +3684437025 3618052086 +408207428 3577621211 4092280623 +4192327334 1949838823 +154603459 429812144 +823150424 2237479653 +2301451520 4066993925 +3112680223 799773150 +868256711 1058802262 2569282244 2717940377 +1732308313 1584384062 +1061300396 1093011159 +3049472491 224445666 +236198447 1487222776 +2804329627 3168909330 +2529210415 2153077240 +3013311135 1299384650 +4175876238 4175876254 +3763204578 4239640277 +1253255016 2572872199 3362327068 +797057762 1338244586 2883381699 +4004470293 1307414700 +81139322 386228747 +164875437 627782738 +2102589702 2102589718 +378274759 1164571200 +2766356395 3521290200 1019034164 3653995989 +976672778 3809145265 221930389 +3537865628 1767207279 +3721174608 4187657640 +2777479227 3622487282 +2342552732 1773191569 +3453961655 3447373574 +1099934900 3912032079 3912032089 +3630982288 2592204541 +3104982745 818251656 +3876782724 534419908 +828134999 3719490231 +1394317641 494030318 +1979073810 1284558301 +1312574456 552310637 +2396864366 1414191673 +2388085779 1765099136 +2475652948 2665011513 +1700951855 1130127494 +3275333887 2690287292 +2235487758 2711036946 +795661133 4115702331 1760518898 +2841977322 1521897208 +2076769851 2293830149 409482994 +1919227888 2231836999 +626207847 686745142 +2247244618 642995565 +725077803 1105729621 1442085720 869998754 +1820524171 2585704436 +234382695 657093221 +4208270900 3275668635 +1771298637 3883310922 531820003 +1797202342 3989160895 1401455874 3237637423 2577944434 4108804510 305827392 1019475500 4283992177 3530533114 293991356 2961416742 731540941 1512097575 1137332588 3392152995 279501708 2456825476 3375432028 774691351 1227535180 3618499543 570699448 2916191837 3960174147 2186120901 1738454542 3610453262 4215411242 +892837423 2601113425 +1545563852 3863586039 +1936911231 1021884660 +1920206347 1920206363 +4172003822 2024629506 +1861791875 3726956656 +1972468995 4003758397 +540173058 2754560182 +1972922963 1911513260 +553661832 3634134448 +3813669847 914405716 +3637624053 737824136 3801696009 4204358867 2124294361 3226129208 3036494490 3704252028 4221136489 1153763713 2540218289 2072563544 1194096060 3600133337 180353968 +333721868 252694816 3003388764 +3355241887 3748939 1915359560 +2516862703 398174766 +1286604798 2313262526 +3994735578 2923135019 +1102431153 572723119 +3411240673 1526624518 3398810055 +110345309 1544981570 +3897407590 408504471 +975659353 975659337 +3227592879 728926459 +3535440027 4084462057 1775364702 +1963303461 1558069292 +766903328 1256126715 +553676939 177813839 +2030005960 250221356 +3032643226 3207665089 +3194279825 1237277008 +55200009 1607755295 4200383198 871511547 2874688376 +552874522 624751153 4201307883 +4152474917 1269050954 +2731657389 4248758340 +3346543647 1919718561 +1090978528 426163160 +881902531 2195991530 3887953862 2518862885 2499672949 1583766523 +1842253007 2871503310 +1450729017 1484542903 +3455022487 1274919470 +3317803797 3659829705 +1080827604 1805767988 +3498430944 900193467 +4069164669 1293006548 +2281417698 586736120 2598843721 +3451804042 3713296026 1171421427 +2654896714 1718033005 +941130684 177692903 +381173630 1108079455 +3827081983 1349146812 +1287042079 3801976030 +1919630993 3531733591 +4126258197 2244958438 3306058233 2743218995 1082031370 2434717357 2434717370 +224713619 269479621 +3872908187 3872908171 +1777651959 3278173382 +612256472 2432225175 3525814899 +2033045098 2733262758 +73374701 3227509934 +2709086679 942957295 +2556732706 409996709 2556732722 +1792910408 1366044656 +855482125 4008470116 +254194084 2112464191 +979485843 3891114775 +1886792573 1886792557 +4230034723 189179402 +3670250602 2068268602 3502661331 +1989534722 721163785 +778704577 3523334592 +3421218938 2113550347 +1705723578 3332396765 +1857172491 1300753730 +3175527589 4198614888 +3468649024 3074927315 +308817248 1509912115 +588987485 2699036286 +1355426541 4198139205 37591515 4198139218 457282322 +4111219062 3175045267 1364317526 3604780416 943617223 4007443274 1464983205 3990665652 450985388 1991795837 1364317505 +1557190898 576923812 157483336 +2880451088 1449053987 +1338407527 4235374646 +3189309426 861596147 +703051685 2630228140 +2235583931 2717626457 2134531428 2900427880 2907661518 +2925886555 1721330267 +2074364463 2333789051 +2179507727 2377259414 +1637535705 2192372331 2822680232 2822680233 3465499919 2822680254 2142581406 +2157545236 1650986111 +2684300706 2684300722 +1569574588 37515761 +2720847920 2090357653 +3308977584 735927317 +1012302615 1703287981 4053655306 +2187610525 197008913 +773278880 1548922687 +2688824917 2575237018 +2439551970 3383583957 +1389855356 3846334759 +4027417547 384816971 +66464701 1695950851 +3172341381 4208236221 784692058 +1036791764 2150803339 +2461932945 2454227792 +4039946570 3696844614 +2022490911 3835111902 +3696912521 548211127 +4139966867 130620026 +3571075548 4020389191 +4276123389 945508436 +306662749 1933179676 +2416618282 2416618298 3108385682 2263115926 +2884556872 752139637 +21799991 2283772823 +3195717115 3594889778 +1019224411 1114181919 4252271172 +2999199911 298581728 +1041944217 1563638487 +2538506399 3483439688 +573184467 2620992064 +3548842598 1529079729 3566191002 +1492181599 1647598472 +3095850463 1533572638 +4243399605 3729733116 3769753434 2281228051 +2016098349 1493790418 +2172551053 1730333426 +1732939871 4183901576 +2838680757 268753148 +3644029738 1433078272 +2052913027 861518970 +2207474352 879050184 +3137508026 2892942723 +503911369 290071928 +3901698953 1566403474 +3115227042 599474118 +82155155 1215039866 +1944816498 3306795332 1034779565 +3521100793 3164262273 2978108924 1756669952 1756669975 +2726462935 1091431753 +2327506504 2890210141 +3599255786 2727004251 +3232290381 1348947559 +476257160 939808523 +4026772472 4026772456 +1333513930 3924199405 +294742357 3967856108 +681939344 577201901 +2842250005 2842249989 3317772828 +51458849 4111695094 +2652198236 932536273 +3691681138 1576872850 +3891245820 3151885484 +2104156198 690553700 +1024881345 3948324288 +3408054643 3408054627 +469075624 2877487723 3186108823 1368863356 +1419300601 406948994 +1400796770 84758622 +3686979466 2109296173 +2966203972 2520143113 +770819537 614098950 +3079076544 2843524179 +3663125679 2703876588 1706911598 4209288913 +2281478360 3936656411 +2568872518 1342911543 +1600738940 2933073201 +1166158311 1390933686 1390933664 +3669717090 3071404629 +1738222312 21269309 +2291262046 879220040 +2067024547 3906838301 +414342283 1808248514 +635004791 205381712 +3959273808 3496655093 +2560245838 2295544527 +1563952237 2329281281 +2257932366 3538400466 2501845966 722299599 +2132901807 828845218 3681774579 2648517983 209225287 541048283 3941973196 1348084558 1112192384 1729791290 2303522621 3758298005 772796876 245522580 3344542881 3712761942 5003772 2671741547 974430617 1835578831 2166978237 2493567749 2686793473 3445335583 239667096 2540423508 1711645445 +3573126815 241468764 1580462113 +1654417220 3672422364 +1130776096 973104243 +4288705609 298614958 2996244206 298614969 3905999327 +2619435373 1015048539 +459156337 2252235504 +1409022452 1409022436 +3784948939 3279264185 +3810981383 2639613184 +1127752955 3428988708 +2651811484 1850417031 +481454999 1966832777 +4042411942 4084425310 +371795455 3787903102 +3819214810 1469327285 +3018729266 1911010227 1911010213 +362988384 1866043429 +3854851520 77659876 314047373 +1841248646 2162457553 +4267421407 747206642 +2528892328 4054931316 +2052482462 872544163 +405468570 584979750 +3306937766 4041075777 +3639142059 2850029358 +4177477255 2161077888 +4040514319 1624568369 +630350152 1836000349 +1585749429 2143568892 +2092788985 1049778818 +1004585113 3687788766 +1078139114 1077458757 +2798995397 1723857676 +78759307 4007262658 +3172876543 3047182696 +2626062397 495706187 +1111095147 2889907554 +814860918 2218020438 3951146951 +3034356201 480653144 +3393365109 1570714726 +1747567771 2495643652 +473743293 815912596 +1009316794 1853337035 +1105185123 4069051472 +2898673266 1846824293 +3749280097 3899459472 +874614838 874614822 +2924562620 636846055 +1580700277 2726351462 3329986090 +794785038 2705671439 3221538924 3859523691 4010522265 2574969006 2271813231 2705671449 575846674 +1868007236 2328490015 1172108430 1379426333 +3534478022 1787389361 +654105974 3591413969 +538586730 578050578 2359831939 2339153190 +3344770521 2963444872 2963444894 3298854671 +4166548137 2622035982 932024345 +1200372219 3843779240 +2751235363 643988259 +3811643624 670992131 +87888022 3575716903 +1858350039 682399395 +748702532 2220260383 +699223498 1708225787 +160537203 2201363212 +118945451 3559280418 +4241898326 1530882161 +1687621055 2935988604 +3707478495 3224042465 3206533662 3877085852 +3336732345 3073630440 +83526851 3354805316 +1506765441 1312013828 +1575968943 1369441772 +1189809554 2714128235 1186227604 1376635398 +1811676622 3417344847 4125838681 3024947538 418047079 +2862536946 2316272869 +3213246462 2119613663 +348438384 3935451947 +947478296 2827705056 +1873643543 2352464633 +1520147081 947119925 +3284207924 1558281423 +2388242051 3942185846 +3944694049 3156045562 +2631570846 623948201 1854534466 +3757446194 3002210266 3757446178 +3933491988 689883247 +1028286265 3760686345 3038805694 +3334071631 3645009819 +3289202725 3008031069 2599246791 3319527994 +2490079332 365812781 605787992 2148637380 +3673725463 3673725447 +1000873015 4073963682 +3252570726 829237158 +3635372241 1052005494 1052005473 2984952599 3977603334 +3382898426 553752991 +3462233567 3157075486 +890975458 4233244465 +1058201669 826909991 3609777788 +4086085566 2630086857 3411432098 +1381318289 758218320 1944704590 758218319 3508300940 364175537 +525869612 2764502848 2210253633 +399109723 1595942431 3454155076 +3963841341 3963841325 +3392989508 3853391483 2716022303 202204082 3786281007 +774588780 1109612412 438605079 680956055 +2690614419 157135738 +2745803278 2987007001 +1805912423 4095704677 +965639712 1002150660 3754268568 +226713388 226713404 +3690734311 3990511332 +3753162238 662339295 +3957741380 2677760009 +2752744236 1992562241 +1438400787 2587356477 1438400771 +2654811898 2588060611 +4213457027 3708915260 +898728031 3003979144 +3580918861 2281285042 +1958807321 3839765576 +230169053 1976612596 +1275628489 2322867848 1275628505 850469945 +1951824834 3861172835 +1944561648 1705860821 +1169877330 1383475766 +1238235054 3711756025 +3961238072 3885600301 3283800260 +2643488612 689656655 +127330806 3901902407 3488073686 266304673 3488073670 +427023695 1617257294 +85974897 2183970544 +450517661 3804013858 +1133775944 321085812 2853131613 +3960992794 3283436797 +3522953505 994831587 606614864 +3777174795 1967568980 +689283147 1574812853 +3605971125 1244480602 +1739737385 3447650861 +2587627884 948923649 +3892753235 400236503 2508999596 +501498062 3696362585 +1922632346 3573983839 +3689488807 3780706167 +4190673696 993128568 +2670419693 2118545170 +3373565271 3796756454 +1062789211 4255583144 +85755 4245640484 +4032191583 4032191567 +2196957798 2316809794 +463823272 2414638759 3752797652 760789885 +450334498 1666601603 +665174228 1039044015 +929624370 1815327155 +1177437359 701898606 +1974831422 374922847 173591402 3016243149 +3708166795 2074632404 +2347875817 915273166 915273176 +3617702688 2510470367 +1004691552 1004691568 +2548415427 2548415443 +1656254080 1145985627 +1081251855 2105705931 +2244866799 4174834577 +3905715331 3030890609 +2878147445 137982822 +1102644334 839899698 +3991781591 1438201417 +708648586 699614693 +1141270990 1638504793 3826814809 +484720440 1932436932 +2995687379 3916196154 +3162913590 4249826833 +99046285 3626534628 +3970324423 3405204275 +199866224 199866208 +2410814629 3000872583 +2467017854 4184678985 +4223910738 2786383070 2804709907 1725847462 1258227485 2516843073 +2744073504 2552322540 2591897957 +464453441 3581662038 +2086268726 4153643537 +1609081335 4063688656 +4154309229 978090386 +2245346814 2898079433 +2424543082 3824523717 +3164169759 3604193500 +12467554 2373624131 +1242508699 820300548 +54804855 102729716 102729699 2608008784 +217209235 4102226540 +2712805358 2036876217 +3671904290 2879104405 +3505715677 3466942196 +1772357712 2044565240 +3872456064 3674148997 +4043508523 4036186046 391311918 +1264829725 826081687 292201714 +2277525373 1743314018 +3048063118 2391154575 +2976555987 501212460 +3608856689 1466176768 +1214253438 1831792991 +865274644 1148874863 +2710331699 1799477126 +1022882728 2723451243 +2559024962 956940618 +2394046880 1117605605 +1882021943 1796015977 +1600141153 4078340976 +1463005284 2617965657 2858331497 +280026764 3530446455 +3724431435 3724431451 +1767036564 1634192121 +1501463000 393492851 +2191988358 1297096913 +863238193 2486838410 +1487411778 1996108874 1487411794 +3457949029 3678553580 +3528332760 3907805979 +80740472 1409466490 +1896364039 3156232467 3156232452 4109414745 4142936832 +2570047925 1126940947 +3594116879 1697094490 +968131635 1332775840 +2764040840 2764040856 +3219719295 2696238652 +3887240675 2703357020 +2384312489 4270017550 +4205459707 2499261220 +551558350 474088537 248454738 +3835261262 4285893529 +2652623952 735523519 831610404 902773219 +1567034453 1580755420 +827277669 79950316 +3678276257 2076515024 +4143900874 2638771698 +2595458792 1890187051 +4167554631 1383485910 +3098309892 4014556490 +2736807147 3069330914 4083425048 +3511374054 1603295745 +1902059556 2058490895 +2400308290 2334668381 +557441265 1058872166 +1704332921 929270645 +1933469146 1161451069 +3204214145 677405184 +1841847971 2084272925 +2272037524 3286116089 +3136529591 76303366 +1383246585 3938707311 +1576412746 4065175110 +1861826470 1440663458 +2500295106 1822121949 2411040718 +2951945749 280517386 +2635651292 2638333329 +36135022 3523005743 +3278539285 3048693532 430611629 2780251596 3278539269 +3048406084 1287855903 +3221531245 2029768914 +557844246 1842030513 +26985889 1498729937 691543158 +3041549602 2575168485 +3677492826 1775841213 +428297452 469636992 3672202733 469637015 2110184452 +2781654763 3475357976 +1029324674 3921329528 +2703143181 2958079844 +4275450017 3425602912 393745671 +1791584493 3428762587 +525714933 3244764549 +2384566092 382136173 760726027 458336679 +2751517396 21750713 +4202948901 2192049452 +184316322 3982942723 +3608931479 187046471 938832294 +373700915 1133251418 +2625281491 4024449857 4259336561 834833965 671511340 935499653 +2735910360 55000803 +3840774793 3942493624 +4011882722 1697361048 +2111003186 771671652 +3137928627 573006028 +26863957 3662303452 +429826669 3250172292 +1559707888 1183065159 +705245935 1369414291 +4107010978 4280924163 2980883626 +1775183296 3933470047 +1050421093 4107404268 +1990712788 2655138991 +1262317944 3921256443 +2664804574 3898961257 +1073579144 1142399517 +3084029087 4285750856 +4068882522 871037067 +1525556891 3219572242 +3735640631 36513672 +1126454868 4239616959 +3310944524 588849463 1034748764 +3805869327 2397282651 +3224778005 2857734172 +3940963754 1381533057 1922620045 4262176614 27271685 +1897421206 2673149735 +334279819 334279835 +3321005662 4207511017 +1714544933 3943363165 +585638309 585638325 +3781646377 304645319 +2220507073 1718756803 +792599292 2054708586 577813571 +3259510944 2007272421 +3944325624 3181618820 291109243 +725723759 1995306682 3788136450 +2740111174 1632613175 +58669521 1380451344 +2801485348 26176169 +854951500 854951516 +2361988950 2336593441 +1644317000 2439800419 +1627715432 584153277 +2386213098 2097764179 +3658308246 1394266026 3641023025 3335628053 2082442613 1598338048 3402738529 +2062561999 4166609434 2114600581 1461713880 4284052763 +2634382699 2594467700 3839587215 +670728484 3305799439 590176643 +4093184208 3775455075 +255895411 1765240323 +569741356 423440698 659357073 2710697303 +2551741751 824545264 +872093896 2621965021 +3339674873 1446769640 +3583344584 3583344600 +4092024429 669805336 +3737684712 3594096577 +178665764 3886805951 +1496588157 895251573 682160139 3926757826 895251554 +2910694399 1906476385 +3169920966 3169920982 +2819663042 1412652405 +2054780383 2889125406 +3287792673 2684168182 +2829372666 1748709827 1706710822 2829372650 1748709826 1748709845 +3206488519 2768383040 +1419571830 3990337089 +3713678856 2649652016 1779187324 2091075893 +1404158641 2504855479 +2858179305 409148632 +2845464848 234501155 +2849442307 1320779930 +3429459589 1324114778 +3921656223 2547070302 +629876568 377689255 +83408288 3302018248 +3302383150 192299641 +3608184567 3372681570 +2870452389 2857906636 +3092441081 595799294 +2306114730 208459661 +2211866245 2969208657 3386207478 +1790255591 2671834596 +930602370 930602386 +1070690623 1070690607 +175762348 703463383 971905255 175762364 +1562318824 2817877524 2146607677 +915895270 3597366017 +2481284786 913044633 +2817544700 1906029489 2300305328 1161398700 +103597653 2551401459 +2848751499 3622619074 +924353075 4002739788 +1903672654 3816072146 +3361366912 3863650963 +3653796615 3718661142 +4283642039 2801119238 +2717733724 1573534151 +263295655 4194743474 +837433215 2891916215 +4131955407 2903255037 +2452948910 3895102962 +693940456 238600912 82476331 4196607747 +3545532338 1857714010 1611767091 +4284833086 1986895634 +1853515558 279994583 +2562713791 890987710 +3974020004 2258723647 1184445314 213271287 +137765368 3596292736 1129588371 +3533477756 2873779756 +3575207049 2076113657 4292875182 +438894161 2139642246 +1671554122 3318079922 1671554138 +1513666293 4232577980 +3653766483 420284887 +381910776 3451969659 2144096640 +2465367140 3126326939 +3382603772 2018640295 +1534132970 395422454 +1238071674 337731434 +845556594 3369493619 +2013027277 1448553064 +3694108970 3276752358 +1133143113 1897128629 +4106380182 3027191051 +3329930264 2334753229 3747042724 2334753243 3747042739 2405319136 +2544814444 874976535 +1887518814 676736874 +4225879229 2376663989 1098206612 +1212639747 3450335683 +1942626132 3852035903 +1174347151 3050780543 +1493870672 1493870656 +1436856813 3208910852 +3026803808 1641835315 +4014710319 2613552871 +1415354396 1052407052 +2086309746 828712205 +4035956388 1449282623 633201807 3920945072 2545689091 1323616036 +4033189460 3287000633 +211248149 3880946972 +117172597 117172581 +3983407375 3542028952 4058662220 42262818 +2128517570 2702837670 2575791349 1436366251 228234074 4158710820 461470752 3516295993 1765759400 2054524414 +6110861 2865576379 +2331513630 3800438847 +2874523250 704302451 2295426074 2295426061 684375902 +4129403342 4129403358 +254839477 2657770218 +3895093724 3895093708 +1358339547 806645857 +386283154 125373302 3502761946 254801845 +1665693923 3910911943 +1185773815 974482630 +2287875824 2622520259 +2853711155 4144965452 +3696110289 2685232912 +942843996 3552512209 +47396922 3605113030 188526497 +3709426130 1509778152 +3001951676 1759864551 +438565817 3752150078 1328180638 +3082884320 3504625580 619961509 +2440728398 2440728414 +1645582464 3892253075 +3227345953 2551622535 4093943776 424136774 424136784 470609379 +2869319159 2934915779 +2749995389 1240432244 +4216956937 2062301806 +3565903443 1212445613 2848146112 3932519610 +2477809007 1033070544 +2888715451 711194015 +2232434716 2150515036 245652050 +2622887041 2625783552 +428886070 1948364049 +2285147052 381974487 2554889431 1464260668 +113114604 3797948536 +3680722394 929873451 +2326626287 1042310436 +3304735335 3692581024 440855539 +4029046747 1592101467 +2179701245 2195941716 +3009672108 1564997286 2725700823 +3763607842 1180930197 +3510702370 4003500150 136200487 +635971174 309621387 +313123722 313123738 +3305501719 2350977106 +3395391284 1403682719 +3575933336 3575933320 +1606126369 2675689722 +2880123780 1947045536 +2335975193 3447715838 1219595336 +3760597247 2799441137 3675425128 +1726923754 1109383749 +1339035035 1339035019 +2107549287 666891318 +4136226310 552555383 +3479426776 1378563588 +3552278633 3552278649 +1093044646 1053013237 900378689 +305853630 1892632329 +1329616990 541793257 541793279 +821759337 3729448475 +832135317 3527998039 1243191084 +3116298092 3549619991 +479761574 2855403863 +4218918900 2271188552 3510908185 +749191188 2562810448 +1321221561 2779646123 2079827234 +2345262912 2530513346 +3648859837 498410475 +2116686137 1726496520 +3171577437 1608035633 +4193506377 3285659374 +1391991777 3855527441 2106843958 1391991793 +3254480187 2580345828 +3268141894 3975595838 +3953297825 2443640715 +796389833 653014942 +3704777027 800019111 +605118384 4145686300 2002362901 +1141294023 3485131417 748755652 +3656790381 1812170162 +4253063365 3597696524 +2036863402 3369324187 +136502665 133311481 1474477752 1474477742 +3069010013 3347822449 2448541424 481867312 2969751618 2961937201 +449766795 139880623 449766811 +1309935537 2592611248 +1972851625 60218629 +2573447934 2758004233 781425353 +2986411938 675647439 1982332194 432004748 4279285380 573703749 1570937661 3585799804 491744814 2555596971 1111867502 3651077141 2555596989 2622707465 +1043509683 1043509667 +909955840 1639983365 +2839562847 2978853898 +1692152392 682961065 2861950460 122270885 265988273 2713058301 3499516860 1004262671 3847377361 1969997100 525597635 35831988 4173652537 609627088 1260761913 2236417497 +3687280413 401861300 +300889316 529548000 +2285987223 1030396163 368241840 +1748018964 4211368792 784075369 +3481153490 1973766021 +4198421222 280660074 +238082589 1944542114 +579798197 928065613 472148202 +3521548370 3220517139 +2844515675 1110275666 1110275653 3699853350 +3272966861 1610741883 2999078962 3890014386 +2140428644 2140428660 +2506401970 1111721992 +2384501589 3363534532 +3856161419 3136906680 +4108539544 4016044081 +111424771 2004841404 +2411363900 2123675751 +4136540 3210529489 +1487382881 4042236832 +994869697 443564758 +3993009118 2294480489 +1045877349 2276275450 +75377353 1398851935 649419566 3684522616 +2790598386 3389804261 +3894316747 857393556 +2392739508 1761754143 3471889774 +1849902821 2028509804 +33843289 2247115784 +3134857773 1382272210 +3317475021 351966372 +522835249 2871250880 +2984536504 4185986116 3264375981 +3631512373 4099798140 +3303804338 1958590238 +3599004681 3145902638 +2231796383 138387550 +1910192063 4212703678 +1874221999 2333234296 +1808507459 3317386941 1901517658 +210150051 678555835 +2957762553 2154927358 +93982924 516560609 +2897877198 3069512793 +568296755 2245963610 +31609742 2236188815 +806466991 1751601053 +940952003 1776827175 +3094750532 2784799263 +1190758202 4107264093 +4137875746 1687040149 +443891169 2274388278 1288368880 +169100632 1770594412 1795975397 +4253830340 3424965037 +3132557616 889496155 505640579 1733655480 +3372482931 3830335500 +2072915422 1590834303 +3132226663 2638498706 +942359206 303688513 +2478868911 1192803960 +2900652498 3443879038 3566517869 3566517882 482964125 4255067539 +1853614233 2249140446 +851182377 2280708750 +4268052560 628365483 +3174472087 1945356454 +1902586826 1332342509 1332342522 1941528563 +2340229561 1323492904 +2635941788 4044864135 +1104101274 444888419 +3671202620 3032538983 +1490919781 1239749114 +3965072212 3720070270 +2962159585 3524278048 +1146708951 1874340710 +3074566035 3492332674 1493055439 2452019626 +3050083427 3982888784 +1971188745 1971188761 +1709022317 3326808773 3369942930 +4097053668 1375424480 +1268273021 1841629316 1268273005 +3574680442 3828994333 +4136589821 2930275042 +1167157278 2716264233 +760418862 760418878 +1606880982 274931698 +1165685215 258962059 1066058248 +740442968 164992741 +2434302933 1638158451 3532360826 1050118236 +1307471505 1307471489 +1988730237 4151911029 +4184114672 2302597315 +1348013472 1162141307 +3714082778 1489206333 +637293730 2266490301 +1537693513 3738016697 2710459103 3738016686 2439931886 +551776864 551776880 +492230926 863584358 +650983420 650983404 +4206414406 4206414422 +3486392512 2726297176 3753829225 +878562872 540036292 2813043245 +434387579 477142847 1028132786 +3713543125 1933411367 1015757054 1691773823 1015757033 1913445634 1422671649 4015302073 1896668028 1732957531 1255555736 +2958875314 3031597658 1412187699 +522604349 522604333 +597691098 1350849186 4008777003 +4069735460 29863081 1985269272 +3944193143 1226603340 1529988639 4129128483 +2296633521 799940272 +587363749 3965508298 +3886037236 3886037220 +309091064 4170396781 +1418011555 2962692508 +824364395 3726855619 990336277 1023493007 1023493016 +2749356699 2489655826 +262266944 3688105171 +3218556579 154905488 +3623199780 464610495 +3808711773 3167800948 +324803555 1560274506 +4078994498 4264571875 +85625662 230338655 1187590793 643539093 533055778 +2533180106 2058363885 +2753842614 2021617106 4032549531 4049327137 2191122834 344911840 +2953388491 4134510319 +485980447 1484221387 +677660468 3386644185 +2664785479 2664785495 +4078512754 3683607390 580768115 +3927204731 4179139250 +3113209100 46845239 +2838287710 1404428418 +3643925484 3582577793 2834099968 +2681043734 2792932263 +2993533665 1157602566 +880119472 1158651669 +1106269893 2455279635 +2691525352 866345669 +2612667904 638177811 3779898751 2158696692 +3378109553 3939191041 +2177152411 2177152395 +1138343880 1259781762 4135817285 2444360901 +1764265656 1121495995 +1549259601 2940315782 1784433377 +1679574742 1646322438 +3864774112 145813676 2188935077 2188935091 +1894218165 3497130259 +2367535786 3486308763 +757010757 1290284954 +2952568125 1202423572 +1155403696 485725780 2996004847 2979227209 +1748630426 4265474876 1748243638 836997475 3963477706 2907116413 836997493 +432163406 1437969881 +2017613150 2926338815 +2707933152 4252988120 +1295070542 3531008473 +2287910495 203796382 +3341072465 3486394246 +1097439723 792959151 +3395153154 3876610729 +4201193867 3196046804 +1735139224 3746819380 +1017467274 37706811 +3221844225 1339876502 +2187065824 3174649387 +4244968524 2852939548 2600399777 2690221687 2600399799 +681338193 1060339344 +432898371 3783425130 +2641598647 655786766 2350978703 +1183531492 4047026687 +1978677426 1529430053 +302344014 2894176211 +2628292864 2640069395 +1766457744 1333818805 +2263813052 642742503 1075536743 406533356 +1647462672 3158823524 1302893768 +4100044013 3406650759 +3418515060 923224217 964118728 +47465277 2972047618 +4225208927 3545983902 +509916355 3556316839 2609417980 +2844960702 4187185374 +225703074 3110634922 3481934595 +2136291900 397300844 +2468323260 2582810860 +2892228400 1149680267 +1359523221 631849372 +2035237927 3578495524 +4038320866 729398318 +3464961377 2142453686 +2787755749 2528488970 +3958290835 4224590458 +395900945 3634090711 +788124803 1984531004 +2911188330 2461210075 +2755474947 2405172906 +3005574985 2321923335 +1584757457 2213566214 +3024081211 4218839026 +2180686970 3355223843 +3422168765 3620404116 +3904761576 1258231595 +4033942527 1865002637 2129047978 +695427957 2479252921 +3833985882 418033323 +2109121380 2978914556 +1891980362 3325942349 +1047721456 4284154390 1056516291 +926219448 2691290541 +1811117609 1383925145 +3161866892 975880823 +1648011410 948482874 +4106688843 2934405250 +628500783 3983882106 +503124358 4080145350 3143800311 +3278007276 7099073 365437508 2721162691 3110306441 1746596184 3706408870 3982778792 3634148689 +1956759374 3903635407 3903635417 +1148816398 4180289149 +820439791 4202950526 +1387127624 1127387235 1903928560 1874643531 +3691113983 1443473534 3191580002 2684556043 +2936865955 880692380 +511134764 567077207 +1569951691 441146525 +1672328027 1165056068 +1291010762 2002935487 2933597886 +3388342186 664022893 +1820180329 2224918734 +566685909 19734346 +1474065360 24948480 +965032211 2679691514 +3715629454 588404505 +1744366187 1053368220 +404992452 3182156435 +755139966 1492657481 +1998788237 2889705956 +3685991909 3238037356 +2482715384 4153687994 +1514560589 1774406948 +3901035989 3733020252 +1133465206 719250962 +427379767 575613801 +4256428893 2156075861 +3848825812 668941608 4150378169 +2852413573 3184485810 +1929572042 1754542130 3617449979 3617449965 +1713924591 3231630126 +1585438911 3389795434 3877635969 +3145376443 3708693618 +2437734607 2332419534 +1736119949 809963983 +2510192460 3565315233 +585102304 585102320 +3913863263 3913863247 +1932401091 295742845 +3774483407 359057563 +4086281606 3313583098 4047159777 3061798865 +3003027591 2515970808 +3034155531 3178516290 +808585681 938864267 +4182854377 495936155 786221144 +557213611 102705589 +2894265351 719498515 2570239744 +714195174 3360601988 +626111997 3164699970 +325381510 232909303 +915273160 2843339211 +1178823052 1364351568 2659617629 +1354159655 919805792 +2005836055 4196214123 +1423051845 87556470 +1359585434 740807275 +3117276446 2635273769 +2593253940 2276700111 +557303588 403689743 +3303948812 252836087 +682923966 719245513 +2594871214 3298634297 +1722808086 3171022769 +2814764842 1183508251 +142580005 2245924140 +1654001615 1693579110 +3078450736 290792589 173349259 1220511051 1694571592 175404419 +2550121713 950208368 +1132416979 1340624960 1419293741 1340624983 342534444 +797895152 301618447 +1922478451 1212521184 3594082330 +3515034119 3631950102 +1512189685 1512189669 +906833950 885178175 +3717341066 3717341082 +1115811070 2961707977 +874988001 4207719712 +140022751 40945694 +657866382 2234211342 1214544271 +1136928535 4181915266 +461625170 2727081491 +1797013796 1977044416 +2838070456 73133485 +1086777965 2279919904 422589921 +941973894 3906504183 +702395175 251725430 +2439194593 3222783798 +2290090875 1552251570 +101277894 545463138 +804603129 2015073256 +329729111 1196463344 +1102938934 1008768618 1102938918 +4106958077 1491364436 +3522203306 3522203322 +1983618405 2228798956 2228798970 457156765 +4244968526 2633955033 +620465779 2868985612 +2899085042 4160253669 +277214532 1189157407 +1369765083 1369765067 +1086937950 177140015 +2901479055 3464096526 2385568625 +758666252 1001148151 +3969152096 4195977608 +3843602738 2596914395 +497695054 16266713 +2522038960 1427241731 456907826 473685448 289120933 5128715 +760270301 2298072233 2096740802 +2899771817 3212287256 +2115347729 1914268536 3252607191 1510328236 +148753653 3928597948 +941895830 4143479847 +1876771628 1876771644 +1709365388 1599441651 +2329848992 1489640236 844590375 3350389694 1140113920 1604213328 3098805359 219894628 119339940 2650456518 1689857891 119441278 2081873309 2746215897 2871465911 491500494 2741165934 2905124655 1311455709 3821667173 +2149178889 2981660728 +1968322951 930123648 +3950371657 4143273695 +1252616857 3933972329 +1979391070 1094678143 +2096639644 1454464913 +496806085 1480135420 +2248871947 2568554002 3745043431 +1934133887 3300871211 4197582334 +636350563 2095888499 +3707053921 2589370510 +2356101325 4111348023 +1257005447 696012420 +2046617525 2046617509 +698431857 610430464 +3115689331 473935584 +3510149504 3693493381 +2001654945 4095964541 +2530756577 1467557664 +3797274850 4183058034 +3425987699 3917920538 +1131452561 3141545030 +3381075118 3987875321 +1116874583 677351636 +2755760624 2201533635 +1812751339 1812751355 +1730608164 251770332 +1086951538 1086951522 +3624251334 2999907170 3606295734 2645510103 +3082971044 2175965732 1344841407 677946776 677946767 3943245609 +2171787067 1609165930 +1364920392 1515063627 +4247021770 1246819821 +3052366877 2229744034 +1828623779 1744900752 +2402069607 3394463286 +364954737 462450945 529561437 2943696358 +1167882656 894662387 +2422684504 2860673947 +4085153298 3424273581 +157671935 1793205569 3395470462 +3504273849 2281905726 +2662051866 529242594 +638177800 3916800651 3916800669 +2336574050 2685671491 +535476855 236005603 +4242564503 3634469122 +4197947789 1298588347 640553490 1921431780 +2448332352 4204168915 +1537494241 614794806 +4050500177 1622953350 +3893649946 3893649930 +1423150292 1423150276 +414777969 414777953 +1269794047 609115496 +2980620216 1261019045 1929471176 +797477111 1194580835 3404700880 +1550427393 2068758656 +1405197177 3463607112 +1670617537 3862391748 1446471469 +1123583311 3157908312 +3845375798 1184397590 109222407 +4231911205 978956090 +1687547976 2684961099 +1528383463 4182374393 +1985445382 1371235169 +1362021917 3920525236 +6513554 779468485 +1223820281 3455860990 +1771672025 364943496 +1131844546 95073157 1131844562 +4146066736 927922837 +2295150035 772520762 +2986017370 2284106685 +2898340339 241435484 +900893204 2618252655 +561858452 1041741876 3551270092 3568047693 2681100666 2681100653 3116037378 3103026558 2119163070 3400271507 806017949 4171687243 +52614567 2530629110 +3195325976 2133325565 +1005475397 258489450 +1786106188 2680053716 +1980137014 37269255 +3695376839 2221880406 +4074777195 3252864636 +536369070 32638713 4278250041 3780312562 +1920018183 806375443 +356876796 1114399655 2020319143 +2130534796 3638905201 +1466990875 3633252773 +381919140 2046054207 +798687670 2802037127 +1611456863 3903435318 +494458439 2889437654 +2151310199 3611785699 +3589315418 600084157 +3584891893 1417872060 +1220724850 827234542 +1363048709 3277192509 +3780569025 351067810 381077564 2093929687 2093929664 +2039816285 3267490402 +2870067618 2870067634 +4254809910 2285815590 2285416727 +2483457191 2907663072 +2875961421 663128356 +2466629010 601094761 +300828606 3141189946 +1068559892 3660549127 +2241833366 2241833350 +818940642 3112247747 +1709026793 1157154247 +271607697 221448518 271607681 223844641 +2737219432 1790933584 +4136930245 4040689420 +127330803 1548116721 2627331798 +419587573 1405518012 2222751888 309682940 +2612008899 3644155882 +2485076077 1797237840 +2800167690 2293089950 +2388746091 2020743957 +2459593412 2367033993 +457893937 669746480 +1613086377 1613086393 +1041796390 3869651649 4138093585 +1848424331 1848424347 +1115430291 1013091948 +3016482760 3522250699 +462089417 534867771 +2613819466 2343771245 +2069599315 4294941146 +346695080 802768765 +4068299992 3934699047 +1800873082 1949199389 +1688935902 1465910377 +3569002413 2396386651 +3625937422 3739119694 +489451601 489451585 +2700680221 2832804657 +2797142795 2151664212 +1750206413 95314529 +3570975164 3443063537 +419972228 3959675871 +3066711793 3380297600 2977580400 +2087219281 3053367265 2087219265 227383527 3053367286 +1931998934 2863093354 4256317857 +3793653360 2499360708 +1435068694 92447393 1559895672 1302725472 781664289 1787335709 95428466 932662849 3868023930 3291492416 +415109860 3049153240 +3727134697 2577422623 2294786944 2255801101 2183873453 2705820632 +1450471752 1632523348 +2949882942 137072009 +2239341197 3832862181 +3866467794 2636607877 +2746380753 3192882235 +986441612 3725765537 3725765559 344066780 +1490910641 2511134118 +2282943781 1524099372 +2184949851 1593220946 +3825738155 2748121140 263672271 +1621466659 1232301221 1169426348 +3541022959 4134713402 817897528 +2247695425 2284162842 1601422619 +2050724738 304839345 2892409446 3516811286 3416145558 2804307213 +252597685 1754328060 +3360302712 3360302696 +1623606022 2622382407 +2775339802 3073119708 +1934366623 533278536 +3781216405 1616626314 +2042375090 1734659630 +212096122 949794623 +2782375128 2115231228 +1717972513 2767473596 +1520263815 3823265469 4186947008 4119836563 750918272 +2475295491 1162001834 +1297102962 659086195 +1949060372 1376723071 +1249415511 2462895078 +106718562 66738014 +247486024 1856558991 +3810285813 2057308604 +1693412960 1156235557 +747123584 2590577285 +4123640409 3021022526 +2739606678 2771478567 +3936969489 2040984528 +986003779 3346605180 +3881766864 942056509 3281544994 +4192873331 3735184922 2124847558 +3636242732 1560170583 +1907798612 1452980793 +4064192853 4064192837 +1973087017 1272983960 +868245241 1893040638 +3031291205 2997271450 3000525247 +3430939368 1605366375 +3075867365 2439423932 3075867381 +243743624 1012744112 333857443 1726134027 +730470840 1114012845 +1776715490 2623342582 +2966000956 2304109937 +2183260878 223966773 2731224822 2841944665 +2591330180 2587607161 +2695435846 808325153 +954173469 2766357922 +3718081156 1657712095 +1693636719 1218290618 +1388740377 1736053855 +2601865372 2601865356 +2930783938 3244700533 2930783954 +3277306882 2946042891 +1855624689 4257111702 +128714691 633872806 537720897 +3697780777 755908331 905545614 539867288 +63951176 3850967936 1210479681 +2845405548 1754107159 +4118913590 3336915990 +2753812099 2096323475 +1715176501 1826858909 2874920482 2858142876 +454930479 1990129711 +1462265204 3991692820 +298771980 1593032400 +1907860808 1678280643 1276719179 682041955 2818407152 +284538737 332377504 +1533448761 4009894187 4231211017 490536168 460861374 4231211038 1483368239 411572072 +94661178 466827595 +3991879266 1169835874 +3355437433 1356630398 +594216222 2227523854 +366110865 3946486864 +475577454 3155016953 3155016943 +1614492581 2402207964 +1420408272 3541469233 +3148700674 3867206311 +1465889651 4272389644 +3136768297 2085104536 865898638 56217471 +1909619396 679970798 +3676475857 4226621357 +3839897542 317404343 +4031680239 984285742 +1463815698 1809196613 +2785071052 284156743 +4169745583 4011269998 +355361342 3360939849 +2842310815 634060200 +2442835585 2442835601 +2049348921 1641213211 543318814 +3418920395 2546192002 +717188136 2405332052 +1113588215 1948456902 +1241130662 2229160441 +1885479020 629851603 3967118138 +2328372152 3918290500 2328372136 +87423279 1660372206 +2804546575 907529112 +2037548296 2725144628 +1132416974 258646351 +3994492006 878818433 +879968676 1221988248 896554281 +4152250902 2983934119 +1034613584 2394026923 +4176806194 1249070299 +362893673 1978869848 +2652929956 2893053337 +1885328929 1486656081 +2241916775 3324414585 3277381430 2766618468 3277381409 3277381408 2917617042 +1691471036 671889810 1028199301 1302679912 1302679935 3867737188 1044976923 +611655663 1398883640 1398883630 +3485456257 2120542445 +3246069818 2736718318 +3615800572 1106608295 +3956176561 1386286422 +2275949756 3813956412 +1799865207 1492694086 +344706353 2299790374 +4011208476 633644487 28226060 +3222633996 1842703585 +4215807856 42564949 +4225146238 4040813897 +1504737215 4023157160 +1944859771 226010909 +109978473 950435903 3133259352 1291752664 1291752654 1185921893 214192155 4024727048 +2890049381 2448262138 +2587229645 2676425473 +138844231 1310832576 +2823281808 1656102652 2032154293 +3227674443 2607182755 1517426896 3277008263 2103994357 3973370309 1577710306 3055830531 1154981991 53081635 2862958030 244541087 1384344977 2925473711 110143474 3078549894 2442872891 3872639648 1814705783 3400184522 3204187341 3834952152 1417455454 1015643329 4128483801 1214102788 2030245761 244503945 3166947814 815316139 1680288412 1852812735 793937237 61960994 1366961500 +1615701002 3023656189 +3118488772 1613891743 4156780472 +1683681380 1864926863 1683681396 +642225477 2276457370 +1461063232 1471704773 +2950429608 1746123135 +762654225 2692187334 +1232686119 1314441764 178119383 +851846305 653021877 +651244025 636696636 +159249640 3645409579 +3389791717 3454085564 807757588 +2961325279 86717835 3154498312 +837133204 592222952 592222975 545292793 3868064116 3686536755 +4065619381 1150849349 +3390009098 1997949598 1579684670 1291434037 +3215056658 2033566824 +1184883925 3744104260 +1442208229 936346476 +73930603 1524424052 +13749919 3913827422 +1509620369 24896545 303173207 2539175060 24896566 924348998 4067365380 2270468005 168952253 3417362120 319950829 +4232623387 3964961791 +2975928336 1948330216 +572332569 3436189022 +688716478 810378637 2521932858 +1194891369 2019936063 +1942210457 4065373648 +1642690501 2489317866 +2521164491 1846614498 +2324193804 548559073 +3658112883 2975089164 +4084517330 4084517314 +4191945725 1381648194 3860737269 +1840270520 2443667852 4031721285 +459714819 631809962 +3536538755 1493791274 +3950618140 4282807495 +2798884360 278420054 2740478260 2673367767 1495336572 2740478261 3477404615 +3289149415 2910760953 2067526628 2257856694 +4139649606 3005885473 +2957615550 1105829385 +173048384 173048400 580383771 580383756 346710440 +313126220 1527474133 +2676774464 1777059539 +1474198382 1474198398 +1706133956 3665551263 +3910337974 2666659217 +1705850703 1588465998 +1156788428 3667411425 +999316752 2429141415 +3639705561 1252843176 +2487625915 1628354126 +986221609 58818607 2092537835 +3648519992 1929047265 +2268341719 2133470526 +2413322557 2929791764 +3431206195 652265306 +3846096115 3570403980 +335383282 1780595429 +2726873739 3875874335 +3900607088 1865674307 +4127495184 1496651043 +1706394981 2176908780 +442047847 3284981184 +3381362948 1251744073 +3906906335 1971574536 1133709537 +4043876135 1365915034 +1785813205 1701762908 +2210190787 2681771196 625246709 +2232326211 2232326227 +1588250658 3501212989 +3356135601 3613092279 +2390570630 1935884486 +1309566447 1309566463 +3326851648 822121720 +1642300463 2268608849 +3476020818 2052782853 289125886 2956541677 +1225711286 1438655277 +1472633707 3260858767 2561059188 +1078519400 2596451773 +1675500648 2661726141 +1190942382 583631556 1252306090 1557089511 1802001305 1749812773 942386543 1459229237 3277795656 2258995351 719581536 474362393 419943284 389637151 1566846405 3633644958 293311974 206503331 2542349057 4032160367 1402136971 3978282023 605070621 +1619218107 2847207524 +1945880197 442073946 +2488371018 3327654253 +966733551 1367744044 +564178686 3992156617 +706362920 3486942080 +4001428302 3845595404 +2372226509 1312463246 +2985174046 958342206 +3188024455 1345096083 +1586491942 43659735 +472630489 837214615 +2512002215 1526405878 +117917763 3757217328 1400291690 +1558458321 1558458305 +2766236242 2569255422 +1892232860 682909575 +1401484278 38501735 +3531975842 3514902697 454878618 3129017472 421139844 2069696670 421139859 1584493336 +103752050 775005811 +571463043 2755986791 +2032401027 916675644 +2120016439 2120016423 +2332917845 3287796211 +1966007000 1966006984 +3684564556 340937531 +621654000 1133312660 +1914674041 2499423404 +2888978563 2563359827 +2927075926 2686097697 +3644070843 2819073906 +92919329 2329317958 +3009540938 2905734509 +2343812381 150123700 +3704529922 2019751283 +1268076885 1268076869 +2777397501 1463655188 +310854122 351060827 351060813 +3041506053 1745146060 +1474431615 2813641002 +3064031751 3117014503 +1577467533 4034449893 2429843442 +2803020863 3515209879 +390605513 328125157 +859945675 355788687 +1478527016 3811989227 +1447226143 3663202446 1447226127 +2158805351 4143215904 +3480399539 2947611168 +1682640859 3173643716 2433608155 870786002 +3958299107 2502907613 +1645839031 623429136 +2370298256 1545219051 +3778158532 1172832671 1172832649 +426716992 2647380420 +2446406774 39163345 +1792818097 2955459941 305214550 2333350413 1984270569 +3231529557 2357384156 +2740440059 3006155944 +1161126334 2970148383 +3774835696 571927253 +689010368 2399944025 +1690110202 2408915357 +3993578475 2375582869 2742035170 +3163128124 141980017 +584049636 2974007295 +288680072 2655653387 +2304041254 1587488711 +2862503139 2050990410 +4276922146 3794627487 +3397714685 3429086274 +2061920568 2061920552 +366201034 644158957 +3174632954 1795659478 33807061 33807043 2164671255 1929880428 +933813700 1658133385 +3301266470 274048881 +367738668 485481559 +2451160140 3991039585 +834063657 2603777831 +695025525 2885346620 +528997718 4175523431 4175523451 +441416022 4241291463 +3589315421 650417012 +3748853533 2955227944 +2130719452 973713297 +2147666886 2147666902 +2402922238 1976465887 +3710295718 46020070 +3673288056 3361054227 +2869841338 25451467 +960661018 358965218 1035541227 +181800928 4009426355 +2368245792 2368245808 +2864087122 665170171 +1934572247 3703267468 1710723662 4050801231 +2627498946 2077878749 +2722093297 1535279984 +3227922322 4216329715 +592980117 952623754 +4159410809 291422814 +3069097666 3150558069 +2875412706 3406552061 2941801411 1523119662 +2213176165 2387271306 +1524384026 1683419024 582646781 2228952995 2526089973 1700196662 +671305537 4158254567 +2438855017 3896068069 +3205830788 2661153688 +3246669219 1177356188 3140669469 +3718866527 2458054829 2265070346 +2553780120 1386069708 +531501618 2155169243 +3685719962 1969297145 +3373230031 1399337499 1379953368 +2987747329 1488107904 +3195612795 2177938216 +1214616323 4209405354 +758828160 3012554117 +3987329499 4250229714 +2026442212 142663145 +1028836767 676966750 +3982240529 645253280 3346318295 728421363 +3847072284 356698648 +2739606658 2435926197 +1824492742 4153056183 +404885745 367910836 +1437519272 3252773889 2318253921 +3057382683 830632914 +1532290002 1389157675 2560795525 4092383870 4075606248 3674701933 +2260337932 2260337948 +1371314233 274177545 1371314217 +464230239 1432555890 +667599447 1551180738 1315392117 +3202054220 351308407 +1970961917 3973338434 +1734019284 2286871983 +819104931 1493932098 +73180723 73180707 3533340087 +917173314 2517212765 1360954357 +3553356690 4021770174 +1784079167 560804604 4108141313 +2858857762 1638868117 +3078090476 3184336257 +1906632381 219329534 +351272979 147856876 +69392189 3218658562 72831522 3180594507 +3034155541 3346292508 3346292483 +894822412 37505761 +2653974631 895767929 +4037438631 1052265470 +4252656748 235095171 1940657672 4059087664 3575963939 +1769765520 2666852515 +2032430232 1280766797 +3331675861 1914155356 +1093103711 2121816936 +1242517823 3575440958 +136072712 3431913099 +2011358164 2303358271 +1846759819 2732504239 3063966325 2732504248 +2345745616 3932339043 +1726991342 4185786297 +638723973 3294959860 +1183934905 2323155849 +3409243015 1800324480 +3329347969 256946181 +2993857949 2456092143 1747761044 +3616370565 668036761 +2164530668 91953815 +1527791362 2314347009 1402956006 +3790977371 282249796 +2849011320 487155937 +162226824 557427888 +2251786217 2249594181 +2067052656 1677613123 +33360576 3780635731 +3794600822 648799040 3356012353 +3063676918 1838411847 +3631708715 4011151778 +107507108 2505907087 +971134510 1296935545 +1779614532 239630895 +2820325326 1880879449 +1101025440 4015975397 +2706786952 1168740287 +2417124177 2310262180 +3036943539 2825688538 3036943523 +2619698593 2782574022 +2293907049 2788179800 3958613976 +1649916725 85701756 +1252660063 3904667294 +2775169709 1726222848 +2176302730 318374150 3851394145 3191927597 +1316685117 3366534932 +2394749439 2994572392 +3440253582 1493010971 +2200242987 636592531 +995418776 98320739 2403727702 +676703257 1884914942 281975759 +690643504 42808280 +91257726 236087113 +3396872021 270920412 +95511939 2034421034 +220369565 1248644404 +3144406097 2699234557 +346001113 1345183646 +1241275254 2385476594 +4078414052 1722248127 2092861636 1423610200 1537490041 1099321388 621035893 2074079758 2244897453 386111850 2323087397 +2278213127 3409296662 +3124374296 1100076763 93660324 1100076749 +2254649260 976266177 +1257517582 2602515353 4245490552 67966604 +4223955005 2470227988 +3559027620 3559027636 +2098384405 2098384389 +3157599030 1886721139 +4044960614 4037798273 +3384567542 2308314449 +3818303963 306664840 +2697352257 2955402313 +1169316269 1679602738 +593795245 1683773522 +3641492315 506018386 3135681228 722176347 +3842046430 1586059391 +358592091 10451282 +142598774 3159107158 3612442567 +3015242219 3015242235 +2211520599 3644188902 +618288870 29575206 3921071127 +1588557224 4087243846 3679975426 1348031351 +2244144121 2329508094 +631105029 1016142284 +1095257201 902845936 +369152450 3805317822 +2431146995 3870778577 446275981 +1018220633 3814194184 +241337063 597147379 2350125472 +3915388795 3712284338 +1594728651 3721244604 +1187817302 4207690061 +2136330419 655854028 +1574613904 2221297131 +4109762681 4109762665 +211852861 4136784459 500767252 4274254114 +3399342906 813702237 +2859245142 2667397489 +1549227305 1549227321 +1478740607 1062716926 +253337369 3730142280 +3884065704 2465050026 +1780149898 640178650 633585843 2456126266 2456126253 +9054077 1450977748 1450977730 +397867741 839707124 3042196712 +609160599 1643892990 437554978 +2323640151 2323640135 +2249624827 560299003 +1165206143 2916883951 +1092976269 721834292 1092976285 +2743208118 464762503 +1365623840 1127464549 +1111751522 3003431747 +2731491982 3662005657 +113805161 380447320 +133319694 133319710 +568246189 2765009239 +3801284275 1617359834 +3681854491 1527742892 3695069861 +3268044684 1364116614 +1763008785 2502487713 2108149190 +1712587395 880800810 +1420157692 4046335143 +305950373 2647522250 +468680326 2039661189 +2687686093 1984827489 +1122642443 703159161 3455277045 +4187882713 4073810856 +177566443 1525032216 +4059634331 2250564100 +178844878 2516148313 +344367412 2213528783 +1548386049 868052703 2308459161 1246097046 2821423892 2182518321 +3062698252 1813108215 +603763925 4274105203 +383948580 383948596 +1794563061 2669545386 +987311817 1826924152 +2451389106 3053676069 +2825616118 389189959 3415913153 +2043714640 270987591 +1237673927 3905052225 +2061667899 2913330930 +821787865 4108683656 +2745840423 3421406816 +4002201112 2676965339 +1111148203 455014556 +1250825557 2997589194 +1723249904 1469304268 1107992139 +2543730003 18516410 +2881295219 2768000193 +2440489002 674200091 +45467464 2351478365 18289763 +2277311494 2977794631 +2030536103 769091062 1304645433 169172900 +1159347641 3449782152 +568608513 1736023590 1736023601 1532741248 2424161063 +1806389280 2662277733 +4288650599 3477391670 +3969070415 2539700123 +169732405 571874940 +2356426504 586326411 +2663712290 3212065590 +2784592457 3640606382 +3429459614 1482582718 1743555263 +2787273400 1076756397 +3643810549 2756776090 +4218297524 2285865224 +3436813297 3128153216 +999495595 1938702882 +2009981537 1863719046 +2147809138 4191258739 +2841644767 2167892254 +2288167641 2354246558 +2213176174 402294329 +765381098 2939048018 +3531050780 4116042252 +4092564231 153383958 +3598062030 4197094845 +550290838 3729952374 +1348716110 2869529049 +1518414999 2887647592 1034750813 +955585358 4157432793 +787077014 1594258034 +1933773889 3012315712 +121608982 121608966 +1380371409 483211105 1450367494 +152547109 1967699756 +754935566 318371983 +2512002229 1761292522 +1535968377 1535968361 +1902197390 168766873 +108646768 2714022741 +3672926179 2233961034 +2230399408 4155586563 +1293975415 3405841028 +882221942 2659145912 +141376970 976373086 +82057586 622071411 622071397 +2255228359 1662627926 +238310780 846947888 3559662385 +286732020 3682527769 +2933990384 3857512763 302491958 3892961011 3672468109 950124990 1619669021 4246638897 +1046899104 4271348332 3677898469 3652326936 +3552295293 1247714914 +3522204951 2495263526 1525162674 +299768677 3658955744 +413731524 3170932093 3539912540 1813229978 1742824003 3170932074 3170932092 65753639 2199115207 3981109356 +2848820041 2542945262 +958420548 837274889 +370102482 594556269 +3832553747 1576387443 2313516045 1558359578 +1442015453 724440052 +694780549 3055056716 +2281094958 2281094974 +1374289777 3835143169 1683824358 +4277143115 1579916981 621303672 2665080834 +877954908 3172013511 +3138702761 717209880 +3702454481 1891399404 +757924290 3335530443 +2156845990 115590743 +2629126013 778013140 +2632216837 10349260 +3375137005 4018921017 431443394 2651780370 3817589573 +1632090926 1374398831 +2918885379 1285729025 2693077565 2498124774 2498124775 3835067580 +2232434715 1294190656 942304990 4199287324 3909972876 3128341846 2435914292 1576383596 149620895 +3076709258 2285883681 +1424334443 276324980 +515398595 523793386 +2540898333 2085547632 964631729 +4276986679 2266492816 +1475299146 2695986341 +3171426010 1841860907 +2418391885 3676325857 +3663682418 907867237 +2831773930 3443704485 +3835746593 171298528 +1052044092 2881949415 4073607025 +3194338096 3928337539 +1397767800 2672973563 +1365256396 3865065783 +2581502626 3681381653 +991729557 2499207858 169044716 3377109538 2596861962 2482998927 +1794097315 4201398428 +1572224276 2581735033 +2985174025 585284152 +1287358066 1026860389 +2008834542 1804478905 +540806305 3639078086 +193266567 692764818 2460820933 692764819 692764804 3324682108 2841939328 1321914329 +2891680186 236572637 +1106665760 4141540716 +1251655039 4036513534 +614569867 895586242 +2951413496 4006919541 +29028476 893948711 +2923581030 3629829041 +882971090 2609837173 1958067442 2771541626 2771541613 1190991822 882971074 +2564580525 1341291588 +685836413 3611319508 +941779100 4197100935 +1992908357 1992908373 +3317386919 3281835744 +1936885690 1666591825 +163976574 3771979103 +1736283410 1287509277 +874212405 1009473404 +4279897184 1767168812 4127292197 +929959728 1916922005 +4208942341 360868934 1654971987 1017010233 575697441 1274429137 2909218176 4070534860 3472590710 786598254 904041581 1085253508 1085253523 +2903844403 2873827916 +1549260214 340094343 +3307827681 1094599990 +1012487972 614739391 +33458293 2561724458 +2630566087 2599876950 +2941672554 1861450459 1861450445 +3522371750 666658135 +3152406625 3152406641 +3529054699 4286171625 3736842846 3585844238 222547170 +1578716325 3358102883 3335759788 +3994420261 2789952860 +506082520 4214137956 1416704013 +2512002235 427617151 +3975647589 1188620352 +1099892624 3291015075 +3629915489 2864623943 4194451382 +1381876097 714579456 +3970652087 1220220166 +1177592405 3573092077 3549400010 +3269389973 558683437 1509004426 +1044952794 3866614077 +3134597416 1193462251 +673527866 4122319695 +977025281 1128186992 +21538531 3898521436 +2169539810 1942865877 +543796677 2847818835 900863216 +1013534168 2801395044 4056255245 +373509135 451984270 +1798317754 1798317738 +3863957419 970615330 +115807577 918985480 25178511 1487286334 +1566811544 2868470565 +2098407586 2267608835 +534711123 4171733052 +2052644951 223680060 +37456702 878677355 3250336415 +2304310811 3280734210 +449085587 1980026624 326384749 +1306184401 3456550954 +4043022059 1192963042 1124677013 +3972793503 1680557662 4162823004 1338255905 +975906749 3100501801 +3874609695 3726784161 +4082895005 3068235572 +387143862 1839344850 +2846251122 3052948626 1645600094 +3340760888 2941398317 +1102004585 2447368910 +2653559461 1629417315 +3293038787 1034177191 3221293820 +2094037164 22770135 +4070834287 2818400273 +970965697 447429412 +792152975 3809210904 2211322843 +2554681252 1529627907 +12047353 12047337 +3016623551 3427994558 1320900988 3336822401 +3161661740 3577559127 +3821747001 2819947189 3223768363 3070018256 +1184537514 1792547950 +4019946982 399755521 +3758472286 117934057 117934078 1153258703 +3243109192 2510905949 +2507683371 2000504226 +1739683890 1851799205 +3197576187 49128498 +2827845433 2411677374 +463303977 214741887 2715774872 +2729590942 678783883 2729590926 +3539617656 2550039035 +1431910252 3346153217 +3529934105 1348699720 +1113887162 1045522379 +4145575585 4266941997 2625814368 +2582297733 2365459419 +1911900681 1847823416 +1591718614 807831271 +3876855276 2964003457 +1015892808 2590868043 +1941562044 1941562028 +3865268736 2094049755 +2540817858 707192931 +4240057516 741014999 +923408234 70265142 +2428617066 1258518989 +3985186999 2782822416 +962491092 3776845292 +2563272962 1595232105 +4106699987 682711098 +1149353324 1144860929 +2394360426 337994957 +517691510 1779141697 517691494 +1459295375 3001388251 +3042820774 1082391015 +2025110069 2563651825 1130822297 +778613087 1842296990 +1540382952 762730243 +1805316308 954801593 +3729872357 375347642 +1763383640 3450398107 +2228142759 3095162089 3095162102 +3113672069 4178775609 +2244366598 2637270113 +527833640 2934648043 +3112144392 806426915 +1468762093 919559465 4124845300 +3505706086 862962087 +3483743595 3147395807 +1652349877 3213745642 +1556026196 1422617913 +1924200553 4120317262 3939103193 +1897837184 2471690117 +3857168074 3857168090 +2128702739 664194966 +1597918496 3959711124 +934547508 3832906191 +227597404 4146476295 3070944455 3070944465 +3345515178 2475012493 +1487004227 3386322794 +656752894 1618888802 2644856799 +3093394647 4226690127 3763690068 +3363683437 3363683453 +2104694722 1043228277 +1844616153 595154018 +3783195083 3320003220 +3366599486 570114718 570114697 1382817455 +115540425 3545530468 +3060499007 1782450494 +3740644496 1492367100 1492367083 2293422696 2362130101 +3790928883 965903487 +2795180669 3932430178 +41041995 420880751 +1233242097 1233242081 +322922785 1842511606 2878070036 +1250093753 85426472 +3679975336 3345656771 4084915563 +964285103 935117215 +2853578128 1324421617 2583685830 3907562746 2583685841 1797243639 +460773953 3604016348 +636857067 2898005986 +2948789753 3844182494 482034448 +3528991126 3065831207 +2756672348 85930449 +808409170 808409154 +3280140539 3528835496 +1380343498 1531948017 +2634776534 2634776518 +949025650 2117850227 +2155233325 1730610884 +1894969160 1894969176 +2430023862 1464812298 +1431134559 2815445150 +1800519447 3703983764 +620918996 384054703 +3252448984 100826637 +1602495231 1543706472 +370866405 3598135306 +2970777050 2584708651 +1137277997 3811474116 +3403910828 2165283973 3808669094 2829266990 4085208317 4104565369 2619056747 3382208960 1214048943 3977078940 326006153 1430153400 616784571 3324032562 3922945059 3784755108 2735926231 +2197925433 1133328523 1579787272 +951943168 1381007379 +1997702998 3358264423 +3962863237 3962863253 +3660403420 1623969671 +3790207187 1041686913 +1863520413 2013472546 +3438632609 1195636576 +164837986 3368340999 +3657309616 3821016349 3821016348 3674782741 +1270319149 1048986770 +727136596 1136692491 2387558191 +1903569957 3255270963 +1815652714 1773193982 +1069965618 2538275237 +3011090928 1211737690 1696367887 +1691080008 3469655936 +2507150835 832901370 +3013325726 3199336361 +397714101 397714085 +3289314292 3289314276 +2598876137 3284154328 +3869254836 3885289759 +3510591794 850701531 +1119101337 2593186760 +386984227 1923023370 +2237340765 1265477236 +3944016542 3944016526 +519063641 222422024 +3894722636 3453669575 +1869331340 4070063457 +1812436383 2934999368 +891505047 1493620805 +2622163348 2652902383 +3912841405 441390539 1744588725 1744588706 +374060689 2855298640 2199484403 1410847629 1511513321 2829037022 2855298630 2812259400 +4232368852 4099400623 +4134792743 528476000 +1299383275 2162204174 +3314864463 1749391518 3314864479 +812361133 3866480466 +841759743 4204950142 +3508979891 4077777356 +4017956183 4017956167 +27873074 1845258142 2453618366 1828480520 2247920996 1704151757 +2268543484 2688605104 +3592645997 1004770651 +2781174054 2781174070 +30926974 3673414370 810971017 1692597833 +3624862611 2600632038 +2628076799 2536217960 +2880558979 3421913909 +3237838557 1719684808 2886645218 +1677294098 1941645907 +3688850754 1655465717 +790607354 686520477 +2013589530 1369890865 1302780386 163969259 +1213822950 3403136769 +516902960 946854318 +2701565549 3932906898 +2799791493 970942540 +4087484497 3642732422 +2614487303 1488836118 +213485531 931994527 +823523300 2544065375 3248524649 +1009772141 2035248338 +1792949114 1299350595 +672807694 3047792003 2997937989 2745058500 +2718778017 3152012128 +3287367549 1580110946 +909089264 1022317763 +2002025824 3425590175 +1889100575 1828870561 +2640918577 3986906080 2640918561 +349902193 1172488422 +3592098582 3592098566 +2069214312 184622849 +3023458606 1213415353 +2398101872 4165803740 +4292064088 2255632160 338583762 1416275740 +2075637008 3526494243 +2115231563 304502894 +1295529143 1182465030 +2963725461 2880257674 +3555329254 2753406513 +3663931178 554902124 +3121690005 146928698 +3078661816 900208965 +554704681 554704697 +2879270067 3362478138 +3019947759 4181727154 +1515776525 723265893 +1336556030 1727613641 +1262713639 4278093517 +2296217299 317697772 +782361817 782361801 +3272159952 3615161699 +59878942 1332564237 +2054078636 295111860 +2550569279 2439200296 +3392354225 4288719792 +2232546472 591668331 +899405975 4216714662 +1082104959 3544862641 +798494839 1667361616 +543408794 2534103147 +2587130988 748674561 +1960421796 2921512512 +2505797241 3192201698 +3435139183 3243892408 +656448043 791527000 791526991 656448059 3276976546 +3130156504 2356564749 +955005230 3386770297 +1075522615 795302494 254372325 24875300 2710656619 1051367239 4180490212 581128213 +3695376846 2339323737 +2609713728 3873139945 +3713514507 2082276692 +3047127606 2713409042 +261349909 2597119772 +522478739 2571785068 3154203415 +432422633 471650646 2081753287 +368724980 368724964 +3657737707 542191842 +3471823561 2357777016 +4138655257 1850188126 +3345363388 3306551664 +261795065 2306755560 +2834346373 2577515539 1040963053 847905536 +1722905982 660337993 +2111010819 384167100 +2952953547 3740113282 +4203950869 2327407132 +2015851100 2182678215 +886079811 1731951740 +1455721113 350045852 1716916614 +3686729746 326051386 4290360389 882922641 +618347520 3789107239 594253900 360948684 85947397 +3077599822 335802575 +1858249239 485815689 627416126 217662382 +3531894813 2667169282 +536868186 1213261592 +4193875332 129236681 +1144009053 3034428788 +4058103036 3260842151 +3129279893 879217052 +923171712 523528851 +3125468138 769143131 +414493455 4083763352 3334293339 +940077831 1011684352 +2591242115 2591242131 +450608392 1340773259 +59703228 1444713703 +3680401449 139777934 +1540370706 2596093779 +2258020191 1042905736 +1896763154 193362259 +3513340838 1717334769 176742838 3197302618 +320997658 4236253922 949244907 +1022154744 2094349482 +788695194 2600274557 +3234336504 3755114880 +2885552600 1717666856 +4096948265 1346839750 +3126621202 1904916549 274737850 +1849005772 812649696 1247568673 +3499635815 3332013600 +4070329199 1527431096 +1305207613 3036068098 +3026942906 3380633219 +3542802045 3917233858 +4010867278 3000753614 +3860934367 1573014241 +446026416 997425617 +1689241753 163098552 +750967615 1139141355 3049202728 +2905885728 3294818712 +1659730004 323245948 +1688955681 2597954784 567799366 835255551 +809418443 3183892884 +3111534975 1993443282 2010220904 +614682492 3805590371 +680742898 1634277786 2677071838 +2992511242 3558959789 2879063154 3558959803 +1251880618 553874843 +2179147364 3123103038 +599273722 3906418133 +1425893462 894748885 +1906659751 33396371 +3811862612 1876872616 4286594105 +651116086 1312747271 +1337802859 2192573973 1260940952 4058802292 +3919900643 62822087 +2350240342 3872949743 1440405294 2579311922 +663965511 3130849271 2462143044 343032089 2462143058 2481310934 +2079767982 1512890354 +2616121796 1023463305 3074713988 2437330095 +2072974539 808341579 +3482032623 2814595896 +2334622168 3878774555 +3705874540 2890811732 +2918683524 1623013599 +1129420931 2087917116 +1972815172 1616415263 +3669806701 3292067218 +409431155 973098487 3721378060 +2530126310 290282975 +2077906515 1270211760 +3940446759 1167464126 3353748563 3039712538 2723262143 +3440521171 2795587898 +2237372029 3257531964 +866359205 1813876323 +2664689472 1201775059 +2591528001 1799250518 +1107244062 3893888382 +1368545825 2321801718 +2947559582 3769320617 +854897349 395833499 +802671583 532010702 802671567 +620919000 2269516833 1011886970 451165211 1498053189 +3601948435 205040364 +790720946 3209560862 +3371227172 234291982 +1625601812 2041743703 502296365 2041743680 3573492780 519073971 +3840942598 1812303713 +1559783395 3493454826 1559783411 +2001973076 750584111 +2877189595 817502217 +4127495185 3348289953 1513428678 +3115309744 3115309728 +2679691517 2746918184 361134379 3778256073 +4032872350 105751977 +3326275807 4200673032 +1147665873 1690812951 +4254643573 372847658 598063699 2892343082 638393869 2382767898 2382767885 +380963399 827724098 +3965345690 3965345674 +279958501 1398006720 +3865660187 2359705970 +1061378659 979119436 +1631538760 2830416546 1540713751 +4001906842 444445309 +437238913 3528183729 +1415563500 4169117607 +2090175133 3161011508 +174596292 987419576 2876323460 987419567 +4116884316 5632838 972589947 1298375413 3175322277 +971523564 346428055 40837399 +4074651125 1222346922 +4278351637 1977703628 4278351621 +484720416 2605670259 +3045877115 1191428274 +4257791579 3334254287 +216170628 3432009673 +2518582590 2416689289 +700710894 2911626169 +1735663004 652648780 +917250737 3661769551 +2837289649 3935995046 +1029221506 3353534345 +179082878 1269885001 +3801162557 3883563266 3615121348 3801162541 +327284453 2593630828 +1334517178 4060072907 3232616578 +86778637 830156132 +3607117854 1189388350 2472865599 +469075636 3078819151 +4228144872 2732681003 +1212193352 95608651 +3528976753 2439281894 +2611221322 1296719213 +3368274754 179295145 +1913216492 4252104983 +1586200189 2247802820 1725677809 +138692957 3068983921 +887492847 3981234235 892119096 +2461936022 2539353895 +2240511080 2727663531 +4159737765 4105314483 +368527606 368527590 +1952939752 653051709 +2313922181 2734105420 +1457417575 656816438 +2403015219 2903129690 +227374055 1018000566 +173795691 173795707 +1745699375 2019066746 4225708014 3981900061 961340241 2019066732 +2273637604 3488988132 2969900239 +1857906672 722998343 1143643868 +3802019458 3310951438 +3506213888 496083000 1126218715 +454811103 921190044 +1401567579 3717745220 +2586677428 1773849433 +2422306422 1899520016 +2658014101 2963604012 +730560266 2525783213 +2334246899 4180525978 +2345435693 2345435709 +3850471592 4075429995 3666941573 +3876411542 450681185 +3837376660 392764670 +2165156686 1490708667 +3739192852 3991710063 +1654336158 3628340927 +3169920970 611508122 694795251 966894317 966894330 +1844725610 3406678469 3584735910 2173463501 +2597563164 3610664209 +1066414382 1040018297 +1653992742 1476678337 2222388595 1743352698 +4220868777 651422745 +2465080028 2440504988 +2204815863 3626534864 +3387158784 2173450165 1448599756 1566629688 1448599771 +2318983727 3331067886 +3798825192 1914243903 3312226301 +3167809474 4276711029 +2485597814 2948250577 +2381665081 2989621928 +381871780 1806616732 2026968105 +2990843826 1410596133 +3783914564 1345029897 1032164152 +4108509805 3995758994 +1742382307 3389510608 +653482689 3577203815 +1953368163 2759279078 +1733781093 4184930633 +2582709190 476639393 +3630337304 2515969553 2354756953 1782301075 3637824746 3387625958 +3252897755 3945585544 +1898313566 2093246719 +1201146964 140208175 +1107325169 3618753382 3350311456 1107325153 +2776101112 2650555420 +2672735031 3553914546 +144627504 3255615619 +3684220148 2325332808 2775675929 +146466594 3761887875 +2574964713 3340344654 +2919206335 2960778746 +1481441373 3746681903 3011211348 +2640821615 961492398 +1373914457 1129917214 +323509664 323509680 +2038263853 100035265 +231632802 4079155370 1576647683 +2579503475 3822142199 2087194636 +3061033794 3061033810 +1259658829 2128212772 +3561051193 1264627468 1540855208 +4236471450 484701821 +3392212544 2335796933 +2030143125 308731018 1607537626 308731036 2179804461 +1056325264 814995790 +977121950 682202815 +110554687 3050342007 +323608143 695238890 +2183094411 2383540988 2326127187 3170296331 622905265 +4053502064 3352807509 +4269841247 57972382 +4099107721 663251438 +3208028778 1828826317 +869801685 1916307804 +4179393439 3335953246 +1967786118 697002721 +3250008622 560201327 +2967436100 3016690697 +3092812525 544164635 +1940387013 3597029914 +1587007239 4026198038 +3602195488 522706547 +1251344286 1251344270 +3148382821 190468556 +861689762 3774230638 349728034 3404144811 +1788384679 1966314976 +1474997403 1136176735 23967748 +1077318889 4276906712 +3478454363 3184496466 +942564851 1001556194 287084429 3510255562 142844768 1678409114 +3141318327 1500000791 +2274059332 2758727455 +930024056 2440594195 3150805755 +3248307831 2217827074 2025074654 1099519302 2897863721 +1457932482 549008590 +4257560076 2306086113 +3190038914 742156367 +1094436820 2233176761 +196568684 3719707649 +1332853292 3249950551 +3427590721 3725077590 +2014206478 211272719 +3316696688 986053948 +3067846101 2113222266 +1683533999 682214097 +3725180997 104027459 +3048840034 1966054229 +457281831 245279749 1781257457 1454948904 +2812244252 1192963684 +1484464678 1876345281 1043194485 3927124930 +1309239516 4102870407 +826756446 4047424255 +1749526934 3201300263 2288128630 +2966256138 1568087469 +878407342 435108847 +387623488 2667184837 +264810472 3236751933 +4140308198 1660685335 3922135078 +1550117724 2820002172 +2491219110 1723971905 +3053943092 1585437537 2459985307 +1855708581 3294489274 3294489260 +1301823063 2108302064 +3593185313 3746149457 1203350518 +1254828546 475867659 +2925188393 2717749134 +1808986901 3524569628 +2828081070 3168659129 877870578 1361553966 174606063 1361553977 +1963255855 1706656248 +3568359536 3568359520 +3904368355 1015877450 +4051707271 1870639763 +1286172087 1706538758 +465868256 2792884419 465868272 +2679865714 3413927707 +3476740978 2879878259 +3125767956 1594612847 +2291135512 445552036 2291135496 312295885 +570625095 1789998852 1789998867 1306266624 1289489018 15890157 +3345210837 1370450967 1605337629 3025630828 341012860 2069603879 3584405107 3025630842 3073783388 +2790199589 4084727098 +3159771014 30578679 +1711630072 2457933947 +1707766967 1707766951 +1594841718 455829457 +2794320234 2608007629 +2846718933 2393962611 308827175 4045008988 4013476732 3587523693 3587523706 +1486600888 891744187 +258791635 765423203 +2617597755 3889968071 3614763492 2383224763 +318626453 696093000 2057246876 +1053300433 3838671039 +754697922 3330340043 2455364469 +2180920008 1797910731 +3973871601 3490762864 +431339096 2786968051 +542242324 542242308 +2660844507 2252722629 +3293926950 4289006909 779563738 945200599 +2781002350 2051531995 2781002366 +1225232184 2891417267 +176223069 3858701154 +2696894477 3079358322 +913782314 3886695437 +315581098 2322102035 +1237486921 1715759598 3954360761 +2163954590 3442122665 +2650217362 1040213701 +4214223414 3447987201 +32710450 1136270245 +3155098118 576155729 +3346707882 4030431762 2955672219 2955672205 3224114141 3346707898 +3958969539 3980309574 +3600479430 817940753 +536490220 1121649537 536490236 +1436433552 1221837417 +499448759 2484617478 +4052011378 3613062489 +2755532677 314508876 +1605214561 4283763616 +1264536551 823144420 +3709407087 763373498 +1613804993 3267932560 +460145249 460145265 +132390429 2300274612 2300274594 +2479056498 584460413 1411497172 +3311555960 1375749651 +4125213491 1164331354 +2194762412 3474109399 +1705189089 3771309088 +1503281588 2747837652 +660848241 4136434454 +4128327824 3680035777 533424892 2386769512 978246213 533424875 3979688629 +4238659078 3178255223 +1713790541 1615293081 +421981031 4282684214 +1982355490 595770773 +62107458 2894663914 2894663926 +2347759487 202112795 +1372244434 2235358069 +3863344299 3349140485 +3293926956 1045866327 +1017955743 586881352 +643901664 2719255483 +2436367521 1009731936 +3787147184 164747797 +685833336 3526193403 +3336377427 83596634 3983984435 1627848364 202437923 +2509132988 722428913 +1557136823 1685685812 +1942831248 2596065746 2713509074 +533529829 4106138746 +4138837013 2962064179 +1627676920 2984552059 3504864337 775041936 2984552044 +3675388874 1626508129 +747346579 2999211372 +1062736046 1705132537 +47965202 2524824122 2452097093 2145962129 +3332246562 3332246578 +2757796130 3283109419 +2349115844 257492153 +3041712509 3841613780 +2753458809 3572380798 +3970443700 1027661343 +1324162799 776450616 +1892251307 4172458709 +3610340662 4174310417 +1406655443 3496851501 1324465239 3486453050 1324465216 +1662066668 3757392023 +2210949892 2021685056 +3789304320 2376250899 +3385851631 665144070 +2550239375 3916868190 2550239391 +2546459974 3083627921 +367415 1070815110 +2755535971 4040378314 +2436518691 932420765 +2722722806 1872858183 +3439738323 2120461280 +1839762207 3209888200 +261639767 261639751 +4272820702 3389399145 +2680972437 599938716 +82414381 2807237656 +3888525168 2193938063 +2914220646 3616124545 +2742537469 1187880436 +1214674414 3256206411 +132367685 764525280 +3841261736 2374372546 2832564149 340696672 2146853641 271671305 3513423936 2593571596 3685816491 3399071653 595110441 +637045637 1262723660 +3019650929 3339405040 +2082699935 1564150091 182061128 +2063327160 2575681987 +301312823 2092730246 +4176710434 4129751970 1266040875 +4014774056 3717329917 3985771835 3717329899 4014774072 +102355867 1741028126 +480560338 3915503251 +1147089549 786207716 +3072006772 1856052447 +1188886506 743814887 +2214617521 2107230640 +3571925789 1158588084 +752876010 2392222555 +2540484431 3555300273 +2336531434 655231309 +2953635362 809145130 3813896174 1179535235 809145149 +3231529554 1350464127 206383145 2349086708 +4053818946 2708759011 +2873365237 2435438506 786333837 786333850 3627720403 +3328834861 2245627332 +187506916 2164170724 +761176023 1123393382 +433122122 3991037307 +957435761 715993868 +1639352990 1885091519 +3305116881 4028679430 +1242339675 1242339659 +2664194801 3971989872 +3973738386 3973738370 +214367779 936213465 2659179780 1078071562 +2021291833 3788091070 +1817786651 2876564868 +3743758848 3743758864 +2391422788 2811559967 +3705058949 721507148 +1412309586 3600811795 +621569911 2404589027 3381059664 +3559413541 545337132 +943908780 1028830167 +2100484684 2100484700 +345387667 4218527098 +3491957118 623374687 +1478698775 3595995440 +3466665200 1723811403 +2804732463 1519312878 +2310693351 3884772325 +982567911 418446496 +2956598106 3044603245 2956598090 +89325 4229515890 +3993009107 2109926714 +2430732385 1959997600 +2835825822 3506651549 3555508986 +3331829475 3331829491 +3405326000 1862321675 +3278968108 2104454208 +1923249530 4022267677 +401396138 1406013069 +3217866296 1072308704 659518011 252755141 2833267153 3493566784 252755155 +3834718307 482174753 +1321911700 1321911684 +786279427 1995503258 +1508966434 4265738244 1558588056 1258301933 3542962206 +2176777446 2015510876 3481483445 1385311977 1655137410 631774731 +3261998303 4066642696 +657540854 2828186951 +2026305549 2026305565 +1514346003 4281278592 +3089246834 203536397 +1869031586 3005181955 3460590446 +2673861768 256742325 +3767409958 3078232177 +1988275254 456355904 +2155328532 370301228 +3471459521 3205351108 70025261 858867520 2076851136 +1626722168 170603895 +558342094 2703540046 834703695 +2886051729 2735447 +2164056454 2484536801 +293799003 1303676735 +1602178557 1382532436 +3608201357 1120327679 476820964 3304328050 384083899 2945412068 2945412082 +4134239013 271768364 +521668643 2046953744 +335938601 2927135896 +2299765749 3203078844 +3331207431 2740398642 +1621444750 310015513 +2768926953 968664654 +246680693 2841784561 2507041340 +729891687 3816626998 +976667078 1781729953 +2232809485 3880970098 +1727326326 2307518929 +3684134404 3009556575 +3371990339 2826514538 +2381582033 1211323152 649313559 +1823166907 3434195314 +4268951037 2350017876 +872028118 1713613051 +1310376099 2535276693 +3605717422 2990507065 +688510645 3784721914 1468676115 +2691341011 1569293899 +1303899552 98559970 +3314245677 2794714011 +3681047299 1094137027 3495919335 1748676028 3495919344 1077359421 +3218895127 2506332425 520488742 108875924 +4166964777 2272999970 945478565 1896342999 642458264 3527892786 +1449322257 246529990 +3570697191 3736981425 +4018247795 2080570650 +3516176719 3449736007 +2514375850 1323153669 +1933322183 3645586227 +3315575652 2119880319 +499880546 3304378465 +2503482284 2911587543 2471727041 2911587520 +3264066256 1786844968 2650111804 2650111787 353402229 +141041059 2165955207 2165955216 3739658140 362115101 3739658122 +2261372572 3251307646 3417325447 +1954373443 4252946458 +537425405 2556020619 +2797278698 2211582932 1946256001 +3898742114 879208789 +4287668431 2768156526 +3002603308 3002603324 +2992400261 1282864716 +1492657494 3544077345 1688389233 +2110738202 794170554 +2821342423 2821342407 +77101692 319101528 +3045496637 4292875522 +3996567048 138002059 +3703916843 3046256290 +2063993204 2648908767 +3939768123 1064588637 +227588345 4084501726 +582218571 624891746 +1345320185 2707171550 +1769870700 2105260289 +216338401 764935991 +3005055959 3463875440 +3014195903 3014195887 +803420431 2491516251 1907544728 +2651263147 1881095458 +1278002194 4235765843 +3940963771 2207839602 +3572939836 2087342712 +704846031 2233771057 +3686729750 3832007095 2291423361 62503601 747723018 +3943777831 3783471933 47343367 4140979251 858877792 2016948246 +1663880677 2622065930 +362386919 2117896691 362386935 +3279884818 2329868475 +3724841427 1219182950 +553152040 253061364 +3053417354 186835501 +3417686100 52282415 +2156533338 2156533322 +3642027808 2282070613 992729186 +305607095 1675838214 +1260888987 3932589316 +1534588611 3235476732 +1738303685 329175786 +2666780962 1052928606 3018172635 1541329055 +55957194 4045758049 +2384672972 2373085495 +2497863194 2263152629 +1774138589 934051153 +2987436517 1184287004 +1567656587 589754073 1655826821 465003342 1764509138 +1605336635 4105619401 +785115416 3612422239 +3548065957 1291816394 +2392228822 121378487 +2149085024 108483635 +4009325305 1524559477 3941038608 +300058574 3131550454 3215438531 +2201111043 3287005971 +1308516699 1114406395 +2272618174 215914402 +2794207017 1471862168 +3168088163 2384866909 575015760 575015751 1008558666 2401644515 +1974971306 4196613261 +409062991 2969028184 +3232540082 2894788262 +1261659412 359135359 1978146425 3978361523 2275551732 +2537958763 2537958779 +3590448229 1869137821 +2495263540 1441274575 +2437330985 2578501066 3474395442 +47396925 1256790837 2944501762 +3991709816 2219462917 +1452482219 1010754667 +892783376 3577850403 +4110717577 1060285870 1060285871 2176672900 +559984719 2172548833 +471961822 651627881 +4052193721 4050282038 +421864466 1901885081 9465230 +717438638 4284197881 +3781770186 1041068742 +604034117 67755898 +3456275787 2568029442 +1243252186 1555833030 +491685368 1375546003 +2970365703 3173910528 +920763787 4032651714 +2439807259 147799442 +2127175511 4012856806 +302454384 2541329373 +2943314227 1600297818 +1532170739 2300507021 +1241369391 2844187374 +2571725957 868489219 1742655920 +716074066 2731375853 965539573 +1866283294 4182807455 +2540894927 436585371 +2679068394 2505973738 +415113724 1797653415 +2110325093 1751986668 +2979313418 2622345843 +3383642125 2321247346 +10027755 3688863732 +130927356 1159486179 +580380223 3045420522 +403653483 403653499 +1558335792 1749405333 +1844194041 63415784 +4200460701 1920483823 2716263316 +2342894646 199706897 +2219904252 1684432561 +1816824416 3646412083 +2831422327 2831422311 +4054628935 3119070678 +2281778606 894777120 +2438282971 983639116 +3821426380 3830369504 +65941833 2029491704 +3450413576 1839648035 +3909723624 3909723640 +1759173383 394710038 +1187111019 1187111035 +2534086156 757448247 757448224 260581980 3530798305 +2215729829 3986599779 +765167825 4003511392 +3679434741 3125226893 863934122 +2497437686 1277268049 +3009408289 801349352 801349375 3114266105 +1511579414 3945213863 +613365412 829621311 +3423250061 3133308280 +2258373373 842468341 +299722220 272571922 193426071 3241813151 +2004777233 3283338912 +2444891718 2324282862 1658047805 2918256673 +2657877412 1833143332 134236469 3567088276 3245550488 3245550479 134236457 +3261240649 1244725742 +1350047761 1163539159 630453018 4124835254 +408127713 746617398 +2036464841 3728797806 +2808421843 1194187242 +2579112685 3976526596 +2935181732 1554327588 +4027787659 2032821698 +3185431016 1750832327 +3476113155 3214043411 +1816302221 4190942180 +1632993241 311968392 +3936596669 2932627874 +2795065936 1438423394 +2035544200 2267260445 +2775080570 1373336558 +3062910195 1421959799 1479090828 +800141664 1095547064 +3416617954 3416617970 +3885466074 1837197867 +38225623 1832158310 +703728707 2611280432 +254794639 1448520346 3229022897 1462524049 1642979223 +2626501086 1347557481 +1528030670 777175897 +2057227527 3257503373 +745876588 1752493569 1568790652 1752493591 1897048983 +2658632696 1847902061 +2127901583 4126834181 +2044720810 2240892301 +542628086 3762981713 +1635218780 3406675911 +3332383242 2497122223 2513899829 +2998478222 2998478238 3883277977 +195729534 2308660730 +1673794571 413896002 +3775968119 3293217872 +3947517655 2612245598 +4058194775 529572336 +3524177671 471911098 +2214733482 2036522381 +2797344759 2025792707 +1122699078 2982040164 1476028160 587850124 +3409392137 1687016569 4041458734 +3682546759 3493809110 +330586420 1860393375 +1073499070 574816792 +3132421912 48298701 +2766297486 508754585 +2956598110 681315710 3380155647 +712619502 3415827897 +24295446 4243850486 1570228903 +3433496608 1256534629 +120453486 2965393821 +741282956 4110601765 +3346108092 3015946727 +2091997976 1664247500 1313723249 1664247515 +1565071125 4010759690 +1135678486 2623522610 +1299800906 1075268973 +3670409346 1635263645 +3878447745 4193988006 +1775339691 1071260980 +137491248 379704469 +3172341393 986023494 +3124335302 1684986946 +1297644023 3108503494 +2530347169 4001646800 +1120770286 396869295 +2779889488 651176700 +32502917 1681012405 +1751284004 4234593529 +1680727340 3761450049 +3540424120 830283859 +3854518612 2125615 +182426728 2483022188 +4054778925 2743309019 +1842745459 1526457612 +475160925 998186473 +2110956855 1234834832 +3924159360 3924159376 +1917884064 2497519091 +4285751549 2135793593 +1651117294 1651117310 +2636037308 4143386604 +1169392535 952632589 3315088048 +388142691 3463626204 +974212628 2708900201 +3823975535 2029561772 +2476525659 4074350949 +1894606114 1188342333 +2969649015 469166150 +4209405692 4106270385 4234123440 +3895186431 3895186415 +785779496 1114352469 +2934817887 2402981729 +3012291871 3292940254 3265462219 3292940232 +1064595303 1064595319 +3160889129 3215865240 +3182617483 3732296076 +1846018326 1285141927 +2117004337 3571306800 +217804600 1502696915 +3376944644 2149676337 +675362840 2683668492 +2822903056 390354541 +1291927207 3757416694 +2758147819 2758147835 +1239796079 3283884472 +4047882133 1708732316 +1165011208 3000183843 +1040840644 1840318857 1840318879 523252612 917635759 +3033665122 3938882941 +4192173709 3889444836 +3818582744 619465243 +2128951310 3520508302 3503767055 +3936965825 1213843501 +1376946216 1529632508 +678296896 383988834 +3110772474 863130581 3705160605 +3556247882 817696435 +1175803282 732025225 +4152681794 3895781109 +367634403 1909679002 +863087448 2968993508 +1187353671 2953341910 +1168212294 4066732422 3812524343 +3334198119 3334198135 +2417826152 2417826168 +3580520170 3296965970 3766485595 +1921470221 1476489586 +3114016189 3417193634 2724187064 +829793760 3157532595 +529130993 939927626 +3534706533 252089324 +1986633144 1995139141 +3896655200 3896655216 +682041973 1947942460 +2341507041 2879275537 2509406006 +1684188708 727196351 +1620722297 2699358814 +2993241499 1990982404 +2754421026 2500536469 +630988537 767869416 +1928994686 2109707081 +3889212390 3548289815 +1385834282 850110235 +631920617 875062232 +2473138268 3191307155 1785813201 781240268 1938057317 2858796672 1047549676 2454898208 1938057331 1785813191 +947304735 947304719 +396340197 715144483 3333041415 +2982561754 3038977085 +2590349710 1338152078 +380438903 2070515683 380438887 +1003014171 3387749832 +1159172670 348902946 +2854093935 1494529564 +2843199156 2072890713 +462084679 2978436420 +473746400 1792566971 +2602383490 2969564341 +3559127987 2812623578 +3920903823 1927005915 1975417624 +1558984909 53160709 32815308 2816480895 2236147512 32815323 1310496404 +2659463395 441073616 +4215341596 4215341580 +3950628042 2059231739 +1428054371 1641238236 +400832351 4215483038 +1015846297 3931078600 +1764473254 903168087 +3852985095 2387239958 +601671762 3991349311 601671746 +3931713597 151769890 +2835938890 769322566 2473823154 2473823141 1317836277 1663585915 +49770124 1012132015 789184522 1686552534 366186002 3645243051 2886074239 1736955249 1406280650 2547307365 2357665171 1206255766 2486893880 4198441872 2297258887 1647733533 1065256742 3754642879 2496243733 3335189476 960411215 1975139133 2138834476 3796808283 2127331254 808705444 383317947 3831653087 913957829 655329431 2080911689 2284756512 636585704 883807032 3860133127 3531929247 1890832211 1267922600 1091597914 2770072207 145351597 +137141555 1704771980 289109836 1822215351 289109829 +3794777801 3659316856 +549863213 314921860 +4155170397 2294775362 +472972489 706605166 +3203584559 2736821115 +623770065 1482703878 +1235500294 4086042721 +3757555166 1641329641 +1188178571 781170104 +584123602 2701825669 +2903344853 326616954 +1905002644 1399947493 +2487350865 1075990349 3033973135 +2916292814 2953011289 +816289597 583340653 +2126257072 840930837 +4015841154 1362352546 1362352565 +516196033 4250223601 +2803444897 2350039587 +618090576 1260431434 3356962378 +3335630409 1159027950 +1974993565 3987479842 +3840257503 881899016 +3347571386 4147944834 3572099787 +3141658122 3535610299 +296162199 1762326275 +3305715198 11791326 1501444383 +1727659689 1865938710 3297502215 +1958575880 1515381733 +1540596819 3777736378 +1737469920 3878804915 +178651858 1104210987 3797804520 +679057713 3899402288 +386628010 4044392077 +986705520 1503862220 +654872974 1207784506 +2767941301 1825523452 +3559775382 2586984487 +1501353883 2055694596 +3778763638 108067537 +3681748225 3681748241 +2895084555 95968757 +3843593512 4284309514 +4090195970 3410055971 2958466194 2958466190 +4207876067 3338843034 +452981838 3112892505 +1005502773 2379884138 +3846483837 1746944468 +2700110980 3732591583 +3111504522 2987752233 +775871424 2364796741 +2815789092 1495617727 +3134331678 1683316810 +3716225891 3716225907 +1938318296 1060498291 +527012083 3313702698 1548104579 +1363760911 91491470 2445254897 766497612 +209481667 1793323004 +699400856 2429055306 +1297417057 3104690237 +2924855505 1171128944 +331726574 239833263 +3179933084 1823948292 678862920 +966808029 1988025794 +3523795367 3584611236 +164398909 2017261519 2496692788 +3930263514 2710697021 +2886094060 2205066691 +713017982 2376197146 +4026418837 1354145674 2575115821 1648958602 1125641517 1125641530 1319149235 +1514913141 2587574058 4114902797 +427938317 878553714 +1221009055 54893764 2424393034 +3227975829 1998973578 +156858682 4226566645 +2175251860 2936199161 +2949542049 2949542065 +738843513 3431235454 +2073194541 2073194557 +2955325774 3380422519 3819193321 2954070188 3444711378 2765852766 2598968793 2885283033 +2564970295 1708389283 3813624720 1708389300 239545964 +2917234816 3135730764 972075411 +3353973134 1118839430 +1177265463 2914325894 +2821166561 1785444368 +1632500142 1739547694 +1061976180 425827993 +264063318 486175345 +2101111420 4205197100 1652473905 1049136432 +4009989749 4009989733 +127040177 669954390 +1115698138 536814498 2312216637 +2042696752 1093676956 +153057861 153057877 +2957166456 2580024698 +114569847 3500553119 +605526634 387383753 +2462655865 2342911336 +2610357722 4260790085 +2962353492 1236835119 +245660030 2330673503 +2860540330 3721119550 +3670212636 3443547847 +2190651089 1575564048 +378486182 696126551 +82770752 70616531 +4025815565 296996738 3814518543 994442036 1532309936 2182895946 1761472741 3570714381 3784089102 2101913471 2381487043 2055029526 2868536040 922733741 3046113259 1287077717 1614752397 3515680613 1935840088 2669314105 1464400423 1279844883 3392514603 2772374324 307676452 1255785060 1802197099 818479080 537992797 1640408092 1815241651 2098918664 3745520152 1711155741 1953683981 2008338867 2642312161 +2846801092 1680392601 +3765248255 1254814078 +3108946568 1056717853 +2840560447 3341524030 +3050387662 1384022095 +297587270 842990647 +2763957716 740232367 +971724884 189216620 +3792056793 2831186056 +98553779 3817327309 +1277795067 3766417700 +2235670954 1835488136 +1124042271 2537562846 +1655547677 1952322210 3524744469 +630054987 630055003 1767380482 +610890361 2111412070 +1388012806 1124075617 +2457603411 2855826418 +1355328469 3034313837 1355328453 +3972711059 436855040 +1402584801 2080865312 +4161050444 3141151927 +944382557 4189329524 +1054748185 3677624091 +3825999510 3585609569 2371815162 3585609590 2232683745 3825999494 2501125671 +3344413738 3344413754 +1900250255 3757800652 +344758252 1163077789 +3762260198 1412212980 +2817527219 300257498 +2812482059 1716343673 1100065070 +1035713096 1988509524 +2834516711 2515921037 +3807091903 4159160488 +4269860611 1543774209 335295206 +3921307409 24133584 +444181915 1217153810 +3503193752 2671141939 +1853758798 1049108943 +1504078172 2096618439 +664488457 755739769 1651870766 +3171191697 1367498038 +923408563 1474617818 +2982338359 2864430004 +832724495 832180632 +419587558 353000058 1153853697 +2533948590 1898300911 3860511889 +3464545 3023601590 +998957613 3902934212 +3748938179 2257316775 2265155068 2533596986 3748938195 +2792427814 22465556 +2313922203 3103213074 +2049276930 998036073 +2838327012 914723071 +226966023 1390434582 1999379219 1390434560 +2067864477 2759751732 +1718021018 3456426859 +1687258370 3864824762 +1109316284 3531980273 +1789955078 4193021303 +483575857 1522388463 +2534697691 2955163346 +3614459340 4055752737 +3637286496 3637286512 +2238270648 3576704837 +757618302 2491426889 +1958607858 3511059758 +3806742829 1569010116 179137938 1569010130 656488091 +409474044 1742173617 +1607858351 2362866545 +3907867251 546884378 +3676680856 1300436289 1317213911 950828988 +4286440974 3930117138 2942439321 +128940385 2754126588 +821935154 1366246053 3844472781 +642767393 44121479 +917212064 2953628915 +323080705 1369282454 286630192 +427459797 4041153354 4041153372 +1538208456 483193053 +1608419254 2002677142 2706350983 +2563629347 3238136327 2937678364 +684366436 2599488361 +3790377021 4278730808 +502228959 520617441 +1062704812 1796390848 1658990785 +3940973371 1656339154 +3394668282 1623489493 +2418353291 374882041 3126999925 +3653070617 3653070601 +794661060 988136377 +1670393772 1670393788 +567975915 1160104003 +1961815895 1120378970 1797440998 +1762361469 3659220180 +702628045 1893678642 3130589860 2956483604 1029949362 2811011707 2092495727 +1775811599 3311482865 1621246028 2939161486 +1241275696 1195661108 +3134895954 2018416133 1991655405 2281982206 +68988347 3470228494 +2091266849 1520598240 +1283910625 1499812640 +3151587025 2110573153 2285689606 +1134983656 3145689372 +1682791751 1682791767 +4079816064 1340883091 +3466345588 3771469513 +2318416334 1475018585 +2398712426 2091850957 +991729538 1017802188 4211068682 3633093839 2696730263 3563388623 2606223932 1197291628 1239649376 762137146 4279439572 2980150969 3189634819 1653017822 404988975 3235546211 1221899166 1236111631 3809509024 868601850 4114120775 1536662893 984987079 1784851573 2320381715 +1205910052 1254426281 +181627893 1595145041 +2465798910 1545960927 +3318277586 759286149 +3292892193 444307424 +1828136881 246128650 +1885031838 2896964031 +2778403716 924825801 +3960746637 818648036 +1632356937 1934586104 +31689089 1910301862 +3260504525 3162660274 +1642212447 1980488072 +170584523 170584539 +2872489715 3481721975 2049048716 +3509920753 2067815827 +354611704 355205760 1040378235 +1714403304 2349270531 +2878242394 1800464299 +2552085406 878502034 2144815017 2144815038 2552085390 +1124547870 3427735808 +472071661 472071677 +4011589816 555033005 +3508354786 3149560317 +555295164 3599768295 1945216748 3050989927 +1492657493 2738604538 1671611612 +543475005 408609796 +1414192660 1360895220 +1599403903 1599403887 +1014544497 2735364592 +1785519899 2757965714 +2167251782 3380816292 +220545001 2594413518 +855528056 2910533880 +4041126849 2405823428 25411373 +1060924406 2183001159 +2604030225 1737373136 +3722042070 2468822790 1330693559 1330693537 2207374324 +1660335973 2095799445 +3067837660 3629758796 943655303 3078983249 943655312 +3201983881 2148070393 4207793838 +3792753752 2964340746 +4029153163 2583119810 877007544 2623104117 +1234722777 3017728648 +849946852 2756402943 +2771405415 1912938537 +1912465798 4172717559 +304707697 138975728 +1902586820 1231676831 1231676809 297027737 +3556793872 173472100 2999456454 +1453582726 3926433249 +1727849648 2970989579 +4078414068 2882726448 3317745590 1572167960 1900635317 3614018018 4032124538 2611400555 +4280501358 310688047 +909345456 909345440 +2182261683 736214816 +1304280842 1806941357 +4003738959 4219464536 +1988328796 1988328780 +483531300 2166060775 +2080394622 2994339167 2994339145 +4161783899 3688392530 +2553334066 3335305637 +3312956931 3732113066 +151670624 2127450111 +181933899 2179885326 +1245471849 1244039999 +3517127558 3608161745 +1834489468 2645255473 +255674057 3329650296 +3664169014 850709898 +2567254995 3056637242 +4222563465 3184505784 +3079822201 1952841576 +702447511 2151864998 +201810461 211776436 +3608417628 2569180679 +3140253287 234775606 +2033655020 3183642519 +3538241391 3354602170 2110538461 +2535444840 1326884541 +1905795787 2190542831 2642331028 +501622353 1649299856 +1733350422 2873309806 215214122 2873309810 3596976353 3124616881 +2531436217 1070363966 +726770188 3690561043 +2354415584 3399804339 +3716687002 3766248034 1464966763 +3208609848 1224136749 +1578716323 3302204572 1848383126 1458741544 +3529054697 2310451033 2193007702 +3821219709 155435458 +2423516131 1501327258 +767474150 3913196801 +715767183 3090507800 +2476225123 523618931 +1812581861 3628717648 +1432129261 2366432731 1303707410 1710065989 +2169525339 2145123359 +705993360 3463401635 +3284078524 1139626314 +1157521423 1949989210 +3741076078 2664364793 +1878822428 1720956423 +1881090440 3811586163 1396363359 319083007 2033225924 3677747985 3615673202 1172887744 18876057 3113420570 630511698 4063170521 2339380560 2596125247 2843965780 276174818 3392992308 411875306 3351511956 4262415014 2205349393 2377196230 399612660 80497385 1526326179 4215170161 1700856051 3159632599 1945220552 1460254417 3829491733 210102808 2167990270 4195366914 1792239684 2320820058 166598783 1126067344 708041839 1934117804 1002038046 3208104096 528448351 3400319178 2636695453 2325833299 1387234277 1937152369 3017828435 2042097999 2649281572 3271343619 3253094506 641911800 4067334331 +3007403069 1826069524 +3326118588 3550111207 +4004656352 2131390847 +1352555864 1095561627 +1464224588 1618925300 +3629691614 1906414441 +997522967 2955673126 +2380391565 3885681138 +812235121 2040458774 +768809075 2521791770 +320739672 1885463963 +1538406395 2548972869 +886896429 1691950020 +3061874770 1098887418 2655650067 +3928471024 1116692466 +2613142626 503004649 +2461653318 3746662370 +653008709 2327132556 +2382030217 2571556954 +3130311308 3130311324 +1454417605 1024886796 +249939260 263487267 +4259963710 235704220 +1163785908 3874184527 +2780805454 4231104027 +925753163 1573933628 +2283496987 1579269266 +1164966343 1350844627 642141542 1164966359 +1966548923 1087605618 +566829221 2414330171 +2569696310 1406464273 +3837477685 1204472938 +335699462 3588891002 4208161873 +1850673583 1433157230 +353938468 3051235870 376421903 +1279896323 452474282 +1443450774 4030371498 +617813908 617813892 +2394008751 1353897838 +1428413113 3228651816 +1913144312 1353779328 +992967819 992967835 +4138352171 2030034338 +3782628990 1800022089 +2095611572 1442805081 +3328340150 2752123138 380313879 4280349167 4138351632 2924346033 325073422 2377288928 4212240757 3072991708 1693980844 111722573 4141029772 845134474 518514724 3436333836 3874388514 36218648 2248916889 2346341013 2215240481 338638552 238765612 3702797128 +1653219871 472433448 +2008712744 4240447479 +4066096645 4066096661 +860806498 656834883 656834901 860806514 925276773 +503353987 3186009130 +754209736 2898790698 +2808134977 3831537254 +2930052742 1470817219 +3369570813 677040450 +3692609657 4093050472 +422100761 422100745 +2875847098 2445772747 +3518150226 1851065093 +103895135 513901982 +2258121516 2321713510 228101719 +723973410 2977097257 2464181997 +3080432428 1827224252 +2465828546 391165240 +2349271704 1190599008 +737500867 2440198598 3176448305 3681479861 833270967 1030496295 +189994989 3234769412 +1658227528 3753722452 +3651626219 2374229474 +2787450258 3654221246 3111432237 3228875575 510495941 3397171956 1928234461 +2311744134 1873129726 +2589301599 1894124271 1405326996 +4188433197 867131282 +3380144355 3361322960 +4275450040 1333900115 3255805120 3811488187 +2541178958 3201526479 +1424204711 1230675958 +1245483943 2161433382 +3177145553 4258137732 +3745314655 1052717426 +3329538375 2965351126 +2382384334 1484318809 +2038010121 3204873759 +385334582 1576983569 +2783589712 1218670799 +253406989 1038990930 +2533528594 3406764115 +1906646469 3245543402 +1015695653 1118123443 +3229689386 108832389 +1453487598 1337959865 +1509517890 3852617187 +2197287787 2538877300 +73670547 3569597745 460884886 56942087 4234466035 +439585654 4223123786 +1159505733 3449522694 +1124746200 359702304 +2305186858 852844398 +2455231958 911357937 +1299693652 1199817775 +3808951482 529717469 +531871132 897175632 2212947089 +3358056981 734586634 +3278161935 2795958168 +2765615722 3085880273 535619190 +4128768348 4163003525 +1982962978 840588437 +1045839051 898599311 +3453961645 2358859083 2257186456 3279597380 1016355390 +2060294598 1018946234 4129846801 +2769223664 3332171477 +3464430492 2918362769 +981880180 3521578953 +1880082080 148221427 +2966734540 720696097 +860064734 2634388231 2438278761 1209545193 2700662786 2782702494 3306771039 +830046032 843279075 +3143398826 2626501275 3854520487 2185850067 2626501261 2626501274 +917813949 454170143 +1733723748 2152776280 288722793 +1086781395 2467228717 2824616000 3426230586 +2159815260 1930769168 +2558194130 3683298707 +3825378902 1349468394 1177278823 3725016353 +2858012038 785592262 2858012054 +84166718 599636361 +669341589 1661525916 +3479589017 1036011104 +287937569 628371424 +3787928556 1486273665 +3515904947 2573607642 +4054139433 2418484888 +1649598437 2910221690 +2827445100 1891711639 3105981185 3712808316 +186073511 13853497 +1784320297 2509407128 +3115392059 1574523501 +3707687584 2502273795 3707687600 +15157325 3105280306 +3223064475 3223064459 +1807837163 2356582114 2356582132 +930172928 1654249435 +3029925414 1389140739 1926763969 1528300970 +2014206466 334975401 2014206482 9941283 9941301 +1351525878 2177327327 +1405826840 15186651 +2587794088 2022536811 +3836024482 1221797230 1120081517 2447548693 2864936893 +937494469 265371204 265371219 1330430519 2135389632 675535533 +2013048779 2915613844 654367983 +1954424492 244768961 345893180 +760672439 231598371 383578128 +3320945504 4216821811 +2741227476 2913159051 +3597072893 1256874096 3305755187 +799531673 976308519 2208469298 134928674 +4181501143 2806121033 +952323234 14918665 +2401674707 1480229913 3557367868 +4268999993 3376380072 +2635129009 4069635750 +4018247143 4026464928 +692918486 2837525430 3663599847 +2149283483 909876418 2149283467 +839509229 839509245 +1385631643 26954078 +3727795700 3848617877 3156754200 3156754191 +2614356154 144137419 +2196869164 3425849788 +681395847 1989543574 +921945650 3015770277 +2575931148 3214460897 +219853137 2215991542 +875442140 11884369 +2121778877 3549289364 +1696536630 548085477 1774011839 4197240472 2189973393 2903613230 3885661507 +2202773841 1297817364 +3540929395 3540929379 +2800603222 914323255 +1719941334 941979879 +4011303584 1096592863 2914083076 +3426617111 3422543056 1087161389 +3462933041 519727920 +1228910493 218747266 +2959251323 56028553 3365323838 2271262661 +60199044 179254212 705003487 +1711565007 1743846872 +101578577 3640415376 +1710201343 1710201327 +2478849757 3320206357 +2053022582 3659516234 +4123030592 502726860 +4051090464 3701108987 +3992197225 1809073983 +3519515717 2183254156 +2144071868 2144071852 +3120645327 2667532760 +715147297 2805803414 1465865286 1461417863 995199968 +2012162219 1479790805 +1966564704 1294538126 +1894116114 3421572421 +173086898 2783666002 1971779592 2070671451 +1844863437 3889952178 +4083308189 3523945256 +1281722610 3185642879 +3405166917 2198265270 +3905443237 408867500 +3370734401 2286817110 +1107138580 4130760559 +1425651074 1192803253 +1629366148 1719153887 3925700804 +1679481404 3527773297 +3330801673 2434272824 +3991232800 2685920613 +1794530597 2262081850 +336878340 3130085702 2351791269 +677709111 677709095 +1920092244 2112347193 +2726139987 96537792 +1901123267 4065177585 +287413451 287413467 +2201360972 441517921 3660277175 +4205135643 2905534340 +2418391887 979754318 +47544320 1980491795 +758471883 2860437357 +2467497585 968983318 +717588558 2734002905 +718443097 3609507911 1137602274 3262931464 +1796161553 2583812816 +1520147385 3147345839 +72461203 1603344492 +1280398208 2751885957 +517421835 2547118658 +3289744695 3839931801 +4238973932 2998363904 2868933761 2868933783 +3292870395 2861515743 +4223249935 1438587461 2283522578 1414332814 +2683800369 4097799616 +2535377983 612075304 +167600309 1860123900 +1890396666 1519981707 +2246119847 1749993952 336055219 +1847131777 3529024768 +41371602 41371586 +862630419 1316044489 1316044501 2764931850 +3984589868 210145623 +1115037018 4193268907 +1440303497 2939975662 +1422862936 3973469683 +2209337010 4290929189 4290929203 +2714304519 3060468502 +2212280020 1752420281 +2676510316 102735255 +2738523741 1378753634 +430014218 430014234 +94870064 383236508 +3529319444 1636091479 897456940 +1078739208 1078739224 +2080021278 4061588338 1790424761 4069060107 1233268777 3992053019 +1848291058 3322806853 2840387496 1597073125 +1661298632 2843893707 3040667875 +4275265276 582911655 +2094336285 2690472098 351438613 +1019557690 3832934493 +3326600184 455860091 +592529454 2719518383 +3060076933 2786759756 3259228931 +4146280430 4009059438 4201712569 3744428210 4201712559 +3171650942 544493507 389004617 +708863858 4116895859 +709555590 1684663811 +299150779 3413927016 +288497154 288497170 +1972288663 1951161141 +2504403504 2722377800 +2722299084 997455137 +2161833180 1998184780 +2342438891 3052713698 +2742605853 1950102964 +914405714 514046981 +2906075075 632032826 +2563562211 1525457373 3072063952 1836880714 +3570370944 2192929939 +1718431447 1304994883 +333535325 88311874 +972000323 4110425529 +2691306765 2482971492 +2390502266 1639437787 1214608765 +2751147120 244834706 2489775189 173972955 2489775171 4145195032 +801976349 1560460706 +811314731 1206973007 1263742388 +1947998819 475804104 +2236278130 1189556837 +1413181505 3666982486 +3419031372 460209313 +2300019849 2300019865 +1887767176 1668670640 +18974574 3643211769 +1912245058 2410132835 2942908661 1190959824 +2682636634 2682636618 +819802358 3795063633 +1967558679 3038041136 +3017615074 16818685 +3895326202 654770901 +419505263 2420542274 +3914327131 2747562834 3914327115 +1035993869 1111805298 +1727495182 630737423 +2374264602 3782102507 +1914548088 2032212608 +2509264675 508972627 +1706068629 2850695324 +3564141121 4141664579 1508320112 4069585099 +1611208752 1582371715 +3313880204 2107703415 +56336496 2763823579 +1052776442 3261447837 +4184593072 1421650709 +1834220977 582708289 3426246054 +1230543970 1230543986 +1149968290 2298661909 +3821765850 1935811389 +4260567282 3081782501 494701210 3081782515 +1808017578 959032595 +2427900176 3754630197 +4178813253 1592188826 +3558329649 309855280 +1638196672 1989520723 +2100446581 2334349116 +3276947697 1803303792 +1007178362 1420555075 +2912035357 1651230741 1510716322 +499792940 291289409 +1784576541 321881539 +263112007 4146106070 +4172236177 2603394870 +1697219081 1230484536 +41148689 3102673867 859317786 859317773 4153764723 1736543176 +1129934857 248208952 +3335490919 1606129952 +2452092334 3100944907 +3569125307 2680793956 +829693654 2784930230 659632559 +1018207457 1795618358 +1016305194 2253743117 +1410592434 224444965 +1902586819 1110003156 2683237245 +1376977784 2884531707 +793501842 4765239 +1830707234 2165153826 +1005470958 3030764450 +2564634886 2564634902 +988835905 1268713840 +2062990379 3177854900 +595437421 3221038351 +523293450 601634994 +3507079432 442988445 +979836570 2320837739 789900386 +565650860 3209711063 +3213773889 3456240192 +728418800 3957930827 +2263372108 4087319392 2880961185 +954096365 101365764 +1989085190 788890029 +1442107710 2389009545 +1203806036 3986119871 +1159744972 2682985463 +2038164191 487767326 +446142993 446142977 +3677977908 1333795033 +2228626435 538620092 +283821917 721948501 4271363938 +4097859232 3948191952 1572804475 2765872408 1572804460 559216101 1287987729 +2800836210 1073196403 +1583042024 1197706261 +2544134838 1842609297 +4029629308 2523348007 +3578297703 3578297719 +2400800691 1272990413 +3120527819 2553068162 +149168032 2669529317 1625505900 2669529331 +1550098265 1550098249 +165831335 1416171065 +1039661784 1700782619 +4174756835 2608252508 +784711200 3242871923 +4169528809 1257565016 +2154687556 2762986847 +1666670630 2290899927 +1593885064 372287773 +1288170726 3350318630 3300519447 +1771595673 465231104 +2938374624 3899085031 1825979808 1078514635 2313024595 4136016454 2367816133 +1764265658 520600428 1675641317 +3307710157 711693490 2036012069 +2041321798 3488336183 +2223243559 234818912 +344499447 1243328710 +2006501280 822880379 +3547567713 1708452998 +1402679714 1062150659 2796988269 567152238 2895284925 +3136365740 4120689367 +1985270443 2983894741 +3818950378 1069611611 +2182831265 1913835872 +1476971733 1792701276 +2261049955 2331009482 +1687793650 3385227661 1687793634 +2109909670 2675090241 +456978444 3682347063 +302589192 1818577803 +2563515234 3948655445 +2174661917 3024201195 +2930783964 3680918609 +4225879201 628433248 1915909654 2146617607 +160397304 160397288 +3493924761 1869319646 +1244066431 453147512 +3554430516 3083803599 +4270027270 3578570833 3578570822 4270027286 +2871867337 1019254879 +2590017436 2255483463 +4193798078 1071181855 +2220632548 2220632564 +3495317472 2050460332 +552719071 3148805406 +2014694653 3348864501 122794562 +1187973353 3668061848 +4089475828 2884957711 +3982939578 1927443403 +3912705857 3831910941 +2325699716 393989916 +1024033025 385225878 3143788593 +2276413811 201144332 +1715369806 1976772761 +2200273938 1266349170 +1737572148 1034321615 +1584007644 4209565328 2095940945 +2135950648 2734176059 +4140877553 2074684774 +3823545498 1579267687 +2539196572 3416925008 3990198416 3416925009 3711247761 +1107951120 96138037 +4234469189 2546694554 +2849448792 3047990157 +2759177766 3138605786 189644225 +375066949 194485023 +3261229689 1447577428 2028585574 3234040063 3459022611 3085632562 931353231 1646839583 2871460575 2801713086 3895295438 66682480 1655075103 1289032640 2455940527 2146521191 54459720 662784648 1396656206 4079071294 3923826044 1987686167 731249307 918633477 3567172107 1011540089 3124272661 704601890 2600000691 3085364469 1426562011 3876844651 4229189427 1355562289 1017751961 985490697 983061667 4134597112 3009593803 2702139210 1457200496 3614688923 +411466782 3115672361 +393398234 1262878621 +1642714649 2371935088 +2780947944 3790490064 +735366715 1621659515 +2129964872 590343755 +508890930 508890914 +3816520823 3303324387 2456088400 +851084655 1604283613 838179002 +1542989588 3503331276 +127360050 356911509 127360034 +2571249206 2032281361 +3467930021 1222710371 +704287748 293130216 1599641849 +3646924403 1547349498 +386628006 2281310438 3977281623 +2128171210 2048536059 +742459081 1935519342 +2927901099 1697040418 +2599613974 2599613958 +2993555348 2000023023 +3518099915 3860832898 +2329670434 3042502698 3124739715 +3589315400 298086987 +864237186 2961280129 +1501841157 2010192921 +2753141500 3678355300 492086439 +2006108632 3847421821 1822954869 +2766840899 3020640816 +2810410383 1123160078 +986658965 4002828734 1847539078 4179716031 +3315374743 1226135060 +2653331338 2160928301 +3331487933 974622645 1435767170 +794855293 301287874 +3968521709 1267647506 +3638738478 2599510649 +3194286696 552180139 1584431082 1450210128 2361197699 1433432522 +901757938 901757922 +3658655824 2606691829 2340237500 +3825999518 2635346601 +4257986152 4021298621 +2187416322 1094036515 1094036533 +2267242903 1915942164 +1267712621 1615794564 +1753640274 4074759674 +3333383229 3845072674 +3505578758 3172976898 +3985640766 1854778108 +3903531709 585573539 +2628975681 2991425984 +448982283 448982299 +380846681 355562014 +2959451426 3791850917 +1588783792 3282531075 +1357572371 1959586028 +1214559264 2928589621 2202626050 +2899853141 176845805 1835774666 +1067182163 1970191034 +1351829881 1351829865 +1070148036 766295945 1878099128 +3694972940 271485332 3039758391 +292689098 1083619821 +311783328 3778984165 +1274118180 2972498111 +1899613811 2969566988 +4164404028 3563172337 +1529383010 3805196885 +2398890134 2398890118 +1565180141 2411517940 +2073964653 117848964 +3089254296 1979102299 +982411557 3831855993 +4114919919 785832236 +2086683453 1929420322 +1899051148 3162244215 +3352521774 2832695154 +3319491571 2179817700 1802170245 4060041613 +2855858198 4236006900 3662950305 +1809542848 2322552915 +577395223 3854295427 1147916848 81910793 +3012291863 2458856579 3158719280 +186665919 3337642113 3772125052 1121402302 +3845318077 2350885012 +675330096 4021449628 +2361080980 515923193 +3431363317 819452497 886562957 3970365354 +4127937441 4107576928 +35326393 160452136 +3252157801 2528599615 +3780641049 3599350344 +1070262140 3899287601 +3930688201 2596633191 +554344309 2025391420 +1194888141 3942912946 +3745649891 1476845898 +807691154 2256823853 +3262790748 580818192 +2570367016 1441877757 +1548332986 4033589909 +1788191057 1147498893 1306641066 +2628268506 1992718891 +539756665 508647016 +1306135833 801827616 3093951457 +1534224682 521899282 +2068354825 2949792121 474333998 +2304353926 1227700002 +920305101 660130226 +770199257 498343816 +700710900 3012291855 +2869021889 3047432269 +1876575880 2821965236 2627536925 +3027629360 1169226389 +2979035187 854564768 +2373199234 802622371 +3771362539 3383326178 +1343997569 2629401878 +453738485 2283433660 +2816904506 2816904490 +3661855144 3661855160 +888182757 1655900377 +3953420182 2312048945 +2986411948 3818853313 +3782352997 352936842 +3285862354 580849555 +3826640359 4118342304 +4094718319 2766311854 +1978364265 178489432 +707659465 707659481 +2617436387 2073337173 +3126032340 2550081833 +3041996546 1892483125 +1491520612 1465106815 +3084925274 4103432784 +2978769440 1516950856 +785114335 785114319 +1511605868 2445628800 1103748097 +4061233039 2693516814 +2442030980 747396077 2805566687 +177310760 3217921109 1705791738 +3784203462 3642493857 +2139101624 1856535739 +236319825 2106563472 +2020815452 4183312071 +1543143390 2572628313 +888379200 2608273861 +996116459 1086381366 +4026421418 2002320269 +50665834 721879501 2382880143 +3188535119 1940398846 +3425459165 1188338914 +2773073395 638977434 +4091341654 2225103717 4050620530 +3909416138 2630703597 +1034314140 2834016391 +2688418285 782043154 +1276939139 268396699 +1611045695 1768317992 +1631750944 1977112557 +3511705587 4237766006 402428113 1272892813 +1189472877 149948818 +1677662736 791500907 +125571378 4199485875 +2398775663 1003622842 +3635765412 3170665384 3381076521 1661371211 +2398564005 3021893036 +1310988368 1389512163 +2857701120 2231969951 +3675501277 4217462903 +3521072108 1317307543 +1402325090 1402325106 +464163565 900345077 +4233364414 4131513353 +4239115542 1435263026 +3691436731 4143083902 +1679534209 2393419540 1239668029 +4227760439 3903154566 +3828991605 3153291818 +4063315820 2945675009 +141077240 240129035 +3304095888 3304095872 +2517308558 3245431705 +211592869 1852233863 +1865697014 88847697 +1318592872 561813181 +338203685 3772855859 +2080625361 184868624 +4142725476 278299618 +4134943491 1390213634 +3590377474 3985675406 +329000422 1575959158 301551642 3924242215 +1702261375 947273214 +4034194663 4034194679 +3531651365 2242082092 +2835734417 2772365638 +2392161272 1834100603 +2600274541 1767336324 +129366374 3283998486 +3912967481 4167945508 3912967465 +634377346 137070755 +3412200125 1120825781 3898009474 +1334583063 1351938342 +1890455885 2936355890 +2046991004 2046990988 +2668310414 4265140556 +2290976398 2588402713 3995861902 +790955556 1550100505 +3673485565 1892980002 2661028971 592925000 1504678956 722376058 354186722 2358831183 334607905 352677255 3043931204 2634583831 3179093904 1537209686 +3220060717 1359320260 +1546588076 3390417879 +3258878231 3748777766 +3583646405 1814220001 +2049254184 728190203 543730744 +3926166936 4247447131 +2681568135 605123968 +3919776249 1247581861 +1317307532 647800951 +1460326794 2416434235 +1077798998 1776784800 +3285634609 2082903856 +1387526156 1251160103 +1996942048 4171532856 1071890099 1869443804 1251455960 1162596423 948247995 +2163222113 710842019 176946310 3272119206 2791855175 176946320 +3019091731 3019091715 +1059444201 1368374734 +4181315421 759322434 3003215732 +1274830490 1823399573 1209006325 2982996276 2391635357 2126574551 3002820049 1398187822 709099851 4081373131 2214169808 3390130299 4210871915 3994779106 1029768501 87876661 1581484273 1766700951 2882078912 4026782563 1257802961 2064355331 +676558600 1946528309 +2374682523 3309420872 +3217039166 2888590430 426847903 +2012229122 829103758 +3799664610 1753163989 +3809929552 3179094097 +918970388 918970372 +1388829349 4120719795 +638654449 4149660023 +321841193 2580702335 1540847768 +2761407024 2312725787 2078824859 +774542552 3433905300 4256902551 3187080392 2031486052 2031486067 1451973152 2231914509 204031129 +3419033988 953963119 1400787679 +2216809947 2216809931 +3788770917 3298820490 +2920713552 1568699619 +2225033302 483096433 +1545060746 336470245 +1010309627 3898231464 137196357 3343967794 +1671778352 222116739 +1161280136 2126160907 +3322596770 3322596786 +1829755623 2532678048 +2538780923 873169320 +1815748050 830271877 +3189517182 3189517166 +2287325721 3088694622 +248618584 1260382707 +3002230743 2325313392 1507534063 +3752759963 3134245380 +336724170 1918326589 336724186 +1592003109 1592003125 +1989057277 1431575522 2675833922 +2701574131 2524525482 +126382534 2982884337 126382550 +3979156841 2606177998 +929335552 3670055912 3095804123 929335568 +2337830006 3165913589 +4018286110 669948223 +2186406841 2509010659 3340788902 +2423038084 3741364191 +11824445 1493694228 +1211928712 1072435795 +209781977 2283446686 +4080541316 2128739053 1385654127 4080541332 +2139231538 3923284910 +3583567954 493824201 1947359469 2444605701 1610589182 +204457796 204457812 +1273010803 2718399077 +3407043062 3334157093 +1663359623 2583954070 +3696085861 863449068 +220710694 2441400935 +1137255594 726468869 765831955 +2688884615 3553665408 +1873678453 1141106748 +1419569930 3420912571 +1189050241 315170838 +2386026806 3249218305 +2033243486 635429631 +1627825576 1702283133 +2435709954 2372122403 +2016693295 1767108078 +2139994524 1746612359 +517584828 1287404775 +3680183532 3934614963 +482245968 2413774069 +4054868815 3349960024 +2720562277 2864435962 +3141168941 2186959003 3476651026 726467474 726467461 +328455631 2805611296 +2632096124 2030086820 +364746225 712182374 +2835094130 1927000926 1994236261 2447714317 +3581462208 3539481207 +1520619647 760100840 +232688792 1808213207 +3028323670 1674381958 2881986740 +141041087 2707370347 +2819427391 2460877820 1038501377 +2754161247 1557241611 1557241628 2482207073 3419255688 +1889323314 2026944955 +4235464413 1202939362 +1393137625 3370503205 +776458547 235819866 +2074466931 420930316 +3751052366 412316061 +3920699639 3920699623 +3362817781 2116318140 +1775590683 3524791436 +1869493302 2692493575 +1543860463 2901094444 +558191596 2320309975 +1340886354 1340886338 +722305013 3141562026 +3712143650 2890448646 +507691546 2534800355 +1383943057 2945000317 3521306068 +1326752696 897432237 +4227012039 1722501206 +2282451675 84266692 +1915833715 3533878319 4164395075 +3727825689 4071164905 +650811568 3982525737 +3524612162 4186789877 3162593885 +3708958740 3227157375 3227157352 2742221556 397297529 +4098230923 356686018 +3472735292 359617127 +2320004317 3046118187 +180996040 3465033216 +3227279937 1513704304 +2224441470 2224441454 +3078557557 1376081187 +3499654172 3701606420 +3466278103 357838438 +1263123781 2372422046 +4007743424 2129345932 3434122053 +936175493 292179900 +3115226487 3302312528 +1502626262 3291938389 +2366191540 1639685151 +3107728244 3718570912 +3152398330 3300511371 +3723423096 2484772357 +1290947518 3748477961 +2530967988 2530967972 +1515095495 1515095511 +3371531250 1282547187 +3913665513 568328142 +2193155096 3775861211 +4235247260 1852805776 3880550737 +1558763219 361377338 +2870011756 3080474391 202399383 1524801916 +3465661396 58973871 +2115746398 3819332073 2115746382 +1255512557 3141619716 +1963673192 1660778627 +2484880263 3285450884 2497351641 2944290198 +398752719 961472206 961472217 1243065810 +2874115681 254839456 +1683471976 1579204011 +1800194399 1110693387 1222705288 +2053195378 421651813 +3278351917 1774063840 +3028117866 2339172813 +774482120 3117875178 +1031287625 3192903608 1336972987 +785738129 785738113 +975514 3159117922 1259913654 3159117941 2976823403 +3245934702 4287120678 +3978062011 4273528434 +2156803510 1053327014 4099459991 +819645729 2470407815 +1336915118 1336915134 +1255982474 1670051899 +1020274795 649044084 +1954576028 2765104268 326039879 37402503 +4021653322 2765132141 +3564418470 431617111 +3651557399 3084692528 +2239559454 1102644265 +333716512 1880639077 1880639091 3677802732 3744913224 2094781346 262577687 2874467915 +1648106821 3919713178 +1331527878 3056711585 +4210516462 3378385660 4288924138 +3922942342 1013291974 2645945847 +302656752 1443151317 +375461545 3102792206 +3041050807 3467000098 +555719985 709023680 +4196997233 2844708932 +3912349515 3912349531 +2619890596 2005418815 +3095468416 4080739475 +1698482740 3350442633 +1424383935 2963030890 +2192870602 3115974195 2462788186 +2234201589 2550526122 +2730173433 785936328 +3871817114 4014449506 3852859755 +3642465875 427441338 +1887186518 1769795953 +3806742818 1787964970 1384456323 +495914003 2603614693 +516665963 3853114996 +351203922 2199941869 +1906909190 4080888183 +1497845085 1497845069 +721548848 3826683267 +2304049625 2304049609 +540133025 1666528976 +4066130713 2335190014 +2584094903 783423504 +2049622513 3031187703 1112493680 1674251030 +3976966968 2587187155 +143561157 143561173 +3812280121 598011829 4001865384 +2019273327 2964603869 3601843642 +2008364015 1631633720 +1234752493 3365248516 +3081331067 2594469028 +2999360825 2916461321 2916461342 2812903614 4215185455 +2026927854 1444646830 +3132488523 1845222091 +2666003981 1144326068 2666003997 +1245705252 112022697 +1270061925 3632454870 +2908043296 2462156979 1976032223 2767730912 1959254585 2462156964 +1947400481 2177101137 3671994102 +3958092472 3958092456 +3437882364 3277839783 +23666145 1427932749 +15384018 1890145949 1578791110 +1421403434 2299576589 +1604122312 1276673227 +265771325 1214006307 +3223891452 2081022887 +3267470568 2127993149 +1163003871 4012001998 3300573366 1163003855 +2946817538 2708471325 +123513380 3613322265 +1120645058 1120645074 +2924609480 857057227 +3602958609 268867254 +3620251909 3051492058 +2337607848 1308000464 2219295249 +1765212620 1838666785 +3486497504 67317413 +2709294545 135479302 +4186142365 1727248674 +2339274475 1777454050 +1680581011 1135565420 +1481016329 121390 +2389857835 1761453474 +10645621 1879540060 +495217764 3681984873 +2302367614 3717879632 +736632232 433437732 +2769286714 3562511637 +3775021060 982173257 +3354075029 1688661549 1277343626 +1492170246 149850977 +3583523248 3248906324 +1982336601 3807793449 1510905374 +2323499833 1023863464 +1758354789 32529808 +2421500061 3540971316 +2403673829 4205840321 +2607915685 1491274170 2808631242 +3173060729 873262696 +2748967986 1373885906 4261504670 +4285250178 3625283229 +1360607282 3702748837 +1663585898 851092086 +3651077127 2622707478 +3127202645 3127202629 +41559126 1259727649 +806268852 1528731737 +3253962534 2019410135 +3306413264 3942693163 1662227372 +462530079 1284962977 2070717116 4127461786 4087413749 1482547667 2569396444 +3817996199 2392715522 +941947476 824604052 +3908786024 3072264784 +776410098 3951852941 +690116531 2168933175 1947209420 +2176302733 3681596883 2193255834 3242260452 +924919548 472191153 +138236154 2372951224 +1921694183 3239690190 929212064 929212086 +4235337126 4042797699 +691594090 3530466856 +664789475 3942635728 +2591662208 2910300563 +2663169339 505275378 +778223562 1407215 +766226802 766226786 +194384965 2814454396 +3237358266 235485985 +203248781 203248797 +2860869996 2860870012 +2227416417 2024037265 +148750453 647341009 +1543973897 637639307 1843656399 3897184814 +3976449475 3757894122 2535741350 +1167731134 1336915487 +2209670051 594829237 +4132166212 4104710456 4251490569 +2231357513 2813649646 +2209740888 3329134361 +212954731 4252430839 3999498261 1716572788 4252430827 1716572770 2235255960 +2656607173 175978252 +2862397443 2545265852 +1223165536 1287347186 3421791547 625084709 3421791532 +2112510436 3636296572 +100953780 2269421431 774160924 754599247 +2846435557 3284953898 +333343284 1303495187 +2400930232 4294249659 +3044494411 98569583 4123859476 +1868960153 906826312 +2209349053 185364628 +4169053949 410112651 +778183685 159298508 +3559775509 1554041947 +2929607657 4011427263 +1174164774 864197603 +4964761 1971803774 +3492413850 1110574947 2546049226 +234183197 1891668046 +2221420552 2013502603 +1349319433 2760847150 +1673190154 153538733 +1058586272 2094462756 +582411849 574097339 +3439691577 475005432 +2156845987 2156846003 +2387711542 1081046791 +3817508839 438339744 +1483432138 4211695099 +2782158968 3489974547 +2575078355 1616568946 +2486017860 3626284600 2071399641 3334522372 2278668297 3626284591 +3233561419 3008452372 +2665859098 1035600125 +1352436524 577711975 1172310080 1352436540 +486042194 1110616813 +32033354 1182152613 +847412449 1684706848 +3487407627 1155517268 +1385061146 1124187381 +467378055 1529396371 1639719296 +790589832 1745905827 +4056653404 4056653388 +615978436 2419540873 +2664196888 332175067 +2677492612 3138575481 +3894903648 3593719845 +2649100504 1764525083 +4276918833 2167976503 +955913501 3691587695 3467590836 2418460139 +116774992 2576081085 1949485460 2576081067 3283458511 4164719528 1157858787 +1480355611 35841924 +764539981 163812644 +3137180741 4029984950 +659396717 2001827118 +2357644937 3241615790 +82192523 2717261010 54158690 957728383 4046755361 2332760611 1172014025 2600430365 1167469992 3776888193 3088452062 1303709467 +3258452934 2218428599 +2045899951 2799972216 +2385376708 3715491916 +2811137754 2811137738 +69661556 4249960335 +2744762133 2684866058 +2773296078 1621437266 +356876798 3274622378 3274622390 2524013854 392450914 2053874399 2524013833 +18965716 3441655666 835499035 2610018736 2226083636 1019067080 1504351815 3651342603 2674351679 2610018735 2523353091 +2613421705 3240438200 +3822873403 2309030149 +644018997 2056458643 2730810492 2783378138 +3962682355 3310018458 +2279609391 2716116332 +2362485898 914332987 +1562630899 1676838602 +2050474892 4056470881 +1585112189 947237058 +1946736748 520699004 367833623 751142274 183583164 2224830359 4235092683 +2321452040 499626337 +3349711658 2018710285 +2419863268 4072526057 +301537827 1847862556 +2858179299 308482890 +3291824451 584432764 +2733153845 2838564220 +788695193 2583496904 +4225500228 3210393375 +2022835020 208882433 +3911090447 1512179455 +3906187164 557675143 +2152095422 1616060572 +1806627811 1734995541 +2030576046 804953514 +1658597163 1259372223 1734043345 3966274225 2875320704 3003727687 704749533 3403955795 528140194 1247744060 2621698870 3366070547 1923582643 1603030811 1744326844 1734947240 3076393773 1254501427 3993889052 1107918840 1154538972 2263850380 1933024174 3032953864 3811017970 +4226443704 685191674 +279420912 2614690123 +207999583 207999567 +1665825843 2168554586 +1118485205 3351518556 +2118091456 2531010715 +1615029359 3613331372 +2736497505 1115922208 +2507188347 2440412479 +1192378748 1572673063 +3673378737 2854751830 1577481126 +3619942440 3513978612 +1579050312 1910075485 +917927453 269259631 2589604884 +3563437454 47937170 +806108846 3351925998 3779111215 +2599050739 3522291084 +613952832 2546943480 +1501665281 3892464010 +1295529145 1216020264 +1359585437 1572317845 791140130 +2288062599 1539185600 742764371 936182934 +2343055293 3610615477 2343055277 +143159626 3100268397 +3686729729 4005140864 +679424859 457037892 +2814660661 3712751440 +2612667931 1091173522 +934539464 934539480 2017725149 807213556 +25950764 3506081623 +373373161 1529236671 +4188621007 1505721115 4188621023 +1012487971 597961756 +3184179240 3995068157 3644366932 +4082566175 821787870 3823464139 821787848 +4032605894 2279215879 +2824841822 1821979135 +905727635 2402267500 +3350190691 3350190707 +1337382066 785437747 +1833968893 304757332 +3898097181 1759985792 +413670164 3835863161 +2803115186 3542342733 +316338646 462937962 +2190769833 2514791579 +1911483038 3842608830 4179318463 +17866688 1613265524 +3196316649 3534512078 +2890225239 2284251888 +22131434 4254901837 +3690767696 2662874357 +117280184 3106281645 +2401725114 2401725098 +3726106121 2828175416 +1817181814 4159542225 +3041547454 570648351 +917555545 1900869384 +2284196649 1540742292 +1175736877 2130533572 +2888811175 2963827424 +321655514 786608396 +4087734426 2248332814 74905625 +754277918 3829606697 +2582169981 3329568724 +1899427058 1932117645 +1430259829 2832027708 +4162487074 870615094 +2778158409 4131078648 +3439848009 3948749472 +2594032706 4287903325 +3741173492 4253037072 +1716300995 3461205671 3451123452 +2868852762 1381890190 +1840408716 272422364 +3039699071 1634062891 3063752680 +1833282576 346938677 +1457022627 3253848976 696636189 1504285322 +748425261 4099869398 2373179719 +2938839811 232240129 +995418757 3953170266 +3680030649 1583531493 +1757509337 3247314846 +1527508447 851932702 +639670425 172585621 373917054 +41361090 3989432014 2743430005 3456634077 +1026989751 2424393944 443930345 +4172941312 2363136005 3239923660 +2269730028 3832590231 +3068334622 91587895 +270006375 3339593865 +1027454791 2067135059 2938602688 +3366042783 1819810652 +2420272206 1720745689 +740573977 1335954758 +3327776756 4084756884 +3758034060 1236195511 +3059557673 1033994126 +189850351 1798369836 +2884838223 1512771226 3536791521 1512771210 +683001555 3911712300 +2353361402 2509562582 429829354 2646662851 +1566670062 1538041778 +1538827849 2897069294 +1278574042 345931189 +897968353 1756921223 +3603678071 3603678055 +4134662599 3160382550 +2301918665 1121196639 +432340002 3004754325 +3699390238 1914105663 +810643588 2486443977 +3331487929 1368656702 +398025450 294268771 1121367629 430197030 2466320709 +4047805689 1956220265 3672445150 +1293328865 4191165968 +3221038387 3221038371 +748050513 2175600528 +1441338910 1441338894 +2550877038 3452938034 +2113659264 2110162267 +1471213169 4213580023 4011174678 +2548166813 579893908 +3851909964 3111590049 2541471072 +625349593 2253471390 +577280437 3752458236 +333445044 4254265433 +2229183302 2714980187 918063425 2232024031 3573424208 889690133 1848767779 1859838961 748872190 498759051 4122076030 442704858 2667284251 3033113060 1494528326 +2387081366 2437698599 +1947831546 4120765375 +3015443307 3894751082 +1499326814 215375593 +958122664 2394949227 +4093953261 1811483319 +3899220653 3899220669 4204389138 4204389125 1187603403 +3398752551 257022048 +877593502 177220930 +4089095310 1276457497 3562917262 406856594 1276457487 +1246664621 3901994523 +3536470474 3536470490 +1638465203 3010740882 +1827308039 1999938308 +991822834 37762533 +2670829331 2670829315 +2355947959 2021329460 3719368655 +602061473 602061489 518769504 +2305653965 2509647123 +3019867255 1039372281 +3987254457 978299957 3649562430 +519712592 332954357 +3497008755 2474635034 +458921811 3706900243 3382358300 +3620806062 709292078 +2689561857 1578446998 2975562790 1338303079 973209698 1578446976 3742252327 +83115681 1837012854 3494406266 +3453752784 3782628981 +1635362289 1669347942 +2848487284 3130264464 +891203299 2075389392 3592535517 +260694484 1242464441 +4172611877 2851130668 +3156080272 3253389565 +2124361994 3738700934 +4131076526 4131076542 +3369129266 1388289459 +2077543373 1825562742 3170685860 939607950 867958507 3221467431 +549161519 3057289198 +66505516 1487272928 +3184521409 2944457136 +1138474344 1138474360 +1343399949 4107736946 +4209591491 232304116 +4265137895 444222902 +2446209676 1002532535 +1839387779 2180029101 441748010 +1730785855 3901364732 +2096464526 2096464542 1149011353 +547889894 2329496515 +3579259851 2738483348 +4161520679 3433068381 1654373631 1306516183 1306516171 3438847927 1651508486 3539513604 1583412282 2023838957 1986075136 1104775197 3539513619 1969297530 +590108363 701276546 +462458556 1086861636 +3998419607 3444131331 3283725232 +3508530558 3007503689 +1307439334 1781627010 +1376093735 1169305462 +454721902 308902859 +2005239180 2623362268 +2292135027 2241827098 +463376374 2375045057 +820272988 1401036231 +383098364 3997676455 +2437351633 3134255495 +1850417031 1306803347 658678144 +2635359918 423478322 +1724516072 4076301571 +1654132341 953366179 +4089028981 574171946 +2621830223 1361025112 +2586378958 922518813 4028246606 1489258362 509660740 1690589775 +3266719212 1892305537 +3043116843 3031828642 +4243206178 1185531285 +2958313988 2799714040 2561705033 +2345677354 2345677370 +2425572400 3353407381 +512241688 512241672 +1674404959 2069168520 +2342134422 4118981075 +1374228421 2628451287 27331936 3307843766 3068384012 +1700219361 650415121 1768508726 +1829852670 2957663945 +2973472616 2478864403 +2999196871 3696313694 +1138610724 1502773294 2305317467 +3864568404 1902024617 +3324325712 1015642851 +3789169616 1652719820 +2053433204 3886016979 +2391690152 302061931 +3687131255 252987124 1851700048 +1781581273 780165724 +2059100166 377730938 +3858729124 1907246372 +3320388695 2455209161 +630902371 2511529436 +765729345 3394487142 +1802289747 3118284916 +1362458859 2707725080 +201386697 1928268127 +499943884 254262835 +295418875 3005803556 +267057863 4252084690 +2292650746 419618717 +2135800515 2135800531 +3258827417 3258827401 +3049033097 2698170040 +3236838335 1980239272 +1155545423 883337649 +2342320843 2468269460 +98688101 435347347 2990034304 2811097836 +1928146308 453021295 +582537032 2552580480 +3470172266 407784133 98469581 1916128678 +3408435185 2767270038 +2533902208 2021153613 +3117378150 210978726 +1298507600 654729973 +3192123950 3002482287 +2105380309 3477475869 46179962 +1169121047 1265430146 +3724379055 622218350 1367779741 +677341712 1087252604 2654205749 +2813064262 2813064278 +970507753 3233664384 +64684699 625962383 +1397161789 1438895380 +2871934413 2885796219 604308274 +2491703734 1277491435 +2445703556 4285614815 +3154800794 1511990730 3559231075 +2845845669 2887777196 +656825994 3203282002 3285062558 782631306 3711332045 +4152152513 1518219968 4122126695 +1678892162 169746595 +3498813184 1776125644 +1334037890 2927395765 +1248491011 3058725949 +414435152 1440032756 +3936923821 613300628 +4251087069 2179175618 +907575451 3281155076 3281155090 +1885919142 2595925206 +206603308 2394952023 +2129791201 3087268384 +438333528 579341285 3089892257 +1329084362 2139083515 +932548993 24382998 +4123437524 1142074175 +4024012826 2910705899 +3518930641 1311504 +3234282923 614863924 +1810871400 1595577987 1272646812 1595578005 +3334482491 3747338830 +3200459416 3845092685 381003827 +3180047760 3180047744 +3584710980 2565931064 2670364169 +2452172763 4057355730 +3727240516 771617839 +3200832464 639987811 +837178362 2274767499 +2726817253 1172942090 +2444936463 2363804465 +195075228 3923151249 +912228379 3008801426 3580784095 3008801412 +3433216970 3995967227 +932246024 4141554997 +3465714474 1523204877 +3999904511 1671817404 +184857898 2187931931 +2652661587 2703940081 2257187798 +1705507546 3782206763 +2677021721 1222392670 +4025748415 2083421608 +817495399 3738828132 +4076409829 2020490433 +2592471756 3461592615 4106559868 +3950860471 1834133510 +2323583174 3423037367 +4118817827 2613410570 +3645673139 3330581453 +2000561510 4196137649 +3463859619 2805741450 +2906323627 1591253812 +3922305002 3922305018 +1378973202 3371114885 +640747486 640747470 +1739582552 1266280420 2448494221 +191659269 13160154 +895450747 3707593925 +3951003924 3452226169 +1236301690 1482018340 +3601576898 278604234 3143667150 2991323747 278604253 +2941733980 3885521360 +3446435665 2641461911 3592963830 3592963809 +2589487485 1715113604 2589487469 3763738229 +4003805930 2551955021 +4177084796 1818367527 +3054403760 3148263453 +3088010504 2550951988 +3498207580 2571885521 +1771298642 2244513285 +3588658214 3757782999 +2191013708 3785297057 +955580356 1840161183 +4085576122 3106784386 340297675 +3618095057 2947492496 +1492267152 2504159907 +1989622460 276605553 +1827584239 1491712044 2112023953 1791828024 +2457406225 2777443280 +2023391930 2503723723 +3236171059 3657484108 +1436478128 2032890645 +3979284960 1092166565 +2639227143 2869057024 +3686665427 2278869460 2981431869 565564759 3207475244 2602636077 2619413683 565564736 +391254179 391254195 +1338921253 3335109932 +2235578858 1808087542 +2412316384 2412316400 +484720423 2991555462 2723113590 484720439 +3585582046 1310127743 +2998439465 2173160078 +1786227398 373737136 +3640116198 3640116214 +648091126 1366640086 3314913863 +913698486 1906755729 +3609832734 3566962217 +941130678 77027207 +1096770378 858344818 +3988173052 3988173036 +2661431076 3713846719 +1005078802 2637524998 136915037 +3255550547 3414354106 +1204290788 3045250423 +2738725297 2869266854 3753357377 +3778571426 760711606 +2901386274 2901386290 +3329747228 2206068679 +2987220859 3054318946 2987220843 +2516843099 2516843083 +640581382 556922465 +4139361838 93674271 2487261817 2487261806 +1334561511 806388422 433473252 433473267 1334561527 +1184628600 564854789 +4183325736 2924180203 +4256415278 11985370 +2429440576 1165452019 +951209292 2360323745 +2981615645 3781768628 +3270586688 565217235 +492035526 492035542 +792834235 3600850814 +4013884293 624069210 +3012429290 417721413 3478404822 3012429306 3990401267 1586078951 +34223440 2249321699 +1038099505 2564356390 +1655916149 3577211452 +2008526536 374976100 +240668236 1256109267 +1024775036 2747853863 +1680893244 4096744807 +200384356 828238463 +804521872 1725021103 +658912286 658912270 +1980302702 1043565606 +3338775149 3904950468 +704176301 3217666116 +243905833 671824332 +3976850802 2560674405 +823687351 8783878 +2388568742 3305546583 +650592092 2119011024 4288860177 +1344183985 1543870516 +1360958486 3374522023 +733229933 967636100 +3952244034 511149917 +17566582 4272243018 +2521117623 1173383440 +3013564408 1721913245 569369338 +4276494107 2564707864 3641626990 3020102528 423903241 2975208274 2200424784 265788936 1131218552 25583801 2069714666 3626415809 566453592 2069605320 +4157769850 2590824477 +1010474002 56254083 +3361152271 1881325208 +295741913 2565562526 131190891 1404318479 1485379752 +758477600 2449855127 +2195353311 3073095563 +79917143 3601455344 +883709727 57835560 +2020052470 2164554321 +3724069376 2468582784 +1100156967 403907802 276587615 465383590 2462423647 394030931 +3521737766 2558646231 +2327405136 3900930731 +1641555321 659184700 1915112565 +4089940735 1278140 883533889 3256864638 +3571061481 4232824014 +547500909 3696692692 1055064517 547500925 +96347138 2301211677 +3956557564 3806151556 +973708431 3961615630 +2329849017 912667697 3894191583 +2587865053 2940328162 +3076288367 4188202257 +716963448 3186726651 +33878098 4247405045 +1989404462 3637833081 +761229794 1329612501 +3143423882 3704837126 +350037133 1696631268 +3271394302 4078356703 +1337134808 1323327003 +3557488062 2336283145 +1924426866 2448976230 +4228240292 1630284585 +2758037219 2900897628 +3724732689 2408900048 +782623560 2884276340 3072641629 +606199530 3411143259 +1753791379 574572666 +2927551194 1872073846 +240667150 1227856465 2728203161 +188847918 3494691438 3880711599 +4173533340 924001671 +2706542701 1643731858 +4078681419 4289395970 +1056850177 3201583677 +3061262343 3061262359 +2325086562 2351181141 +257553126 278487041 +403854444 1356523009 +1386750535 1705899456 +2330587332 1917191296 +2820856232 303662561 +405501021 1359021122 +2753585295 492158755 3992453390 +1384637097 2498351118 +2013957871 3885957681 +3000540636 3000540620 +1699046878 1245666409 +941841321 2715083670 145312530 +3413745623 662085478 +2344206902 728546055 +2617052177 2690252496 +570908921 2325587966 +16429547 745734763 +2545920538 4239967997 +1277696988 3206798161 +1149380702 2671616207 921013225 921013246 +1349923668 1349923652 +939278102 2442786176 +1475879886 1235246415 1235246425 +3411284685 3797522618 +684823007 782781409 +3078215727 325285958 +3106955235 1780937290 +2796465988 2835212319 +1524304658 1715607981 416443717 +907554203 3272592132 +1328300192 1118419955 +810052964 830179684 +2737391249 1794774608 +1626778252 1533160412 +2001524063 1274069514 +3877973656 2005424475 +2408043156 2261810927 +691683131 565283304 +3430595985 2798612099 618213207 1624301366 +1012323298 3736046787 +2860458269 2199986356 +3738957909 2376671484 +40439838 2651653901 +1664453641 910914104 +2145500439 1734126374 +1034405914 689963243 +1436074516 806847928 +288664061 288664045 +3169727841 3422422944 3422422966 +1768140350 636177289 +1877681781 2486005996 1877681765 +113419315 3613949004 1702603703 +3178424613 1625621804 +565824453 3699099404 +2929652 480846735 +3787395424 2375139999 3217578547 3513473620 +584491545 2423941865 584491529 +2832946623 3260096122 +1050353259 334106645 +4120902370 2062652906 2362962371 +604828614 1174953990 2254684343 +4225353902 634841593 +3127225628 3127225612 +1153541299 4023797210 +2552223403 2552223419 +3983665237 525385155 +1376527329 169638710 +217184497 1374348144 +2259943877 2259943893 +1946070482 1995397754 1810604435 +2129552395 1403689934 +1300529912 4288294011 +250391729 2495693156 +3499193193 3187191384 +1933284878 1959606287 +3475674305 433915949 +1530096892 687851184 2381615281 +3648007343 4071338491 +4106847232 1497025555 2089757659 2255220792 +3114038879 3269377377 +720902797 831638500 +3078498386 2580263857 +2460059734 709468007 +2009569269 3358723482 2218014396 918656467 +4201059436 1217974396 +180194253 3530809712 1556645202 830775393 3010188576 4275207850 3698585895 +2994931060 2017564047 2017564057 +1399103264 1734770540 +529592338 529592322 +2942699420 963455093 +1951620397 68295272 +4217383479 4061677794 +3639268460 3630048279 +1326750003 131803318 +1102934894 3946624569 +3248307826 1015631205 +1523699011 3884313455 +3333536826 63655755 +1543154780 766280976 1543154764 +3006498763 3843998850 +891355240 4251996316 4203397781 +668790469 2244730892 +1437885154 3190596598 +2585641475 2681760437 +472919014 1171593995 +657990389 1905855057 +530192902 281061543 +1119092188 3280335495 +4268154508 133191265 +586410938 3220968907 +742008521 1753943672 +3613134493 2733310260 +689010396 3179713424 2189302865 +2010045583 2803012827 698692888 +1465578333 3777829748 +3927049967 1767959086 +3569943322 309322219 +3273882026 500950546 3671623323 +1468995873 988615565 1345701604 +3328340155 2210486399 1807492282 2114455061 1592577228 3331964580 4248750983 985445537 4212313846 2778955946 3870109868 905193862 3319553797 3890372223 4115435448 1713650286 1906140541 2874968685 3530841722 4047085483 3590107374 802717564 2866499170 +326319088 2389138133 +269386116 357945028 +1323797628 870560305 2994874151 2626628908 +2142933547 1035213218 +3504483952 1141840451 +1419666342 3679903297 +787819829 787819813 +802865000 3550226209 +1183059849 2330227896 +672807700 191723545 2638098462 +2198249693 544160756 +3780413710 3759729294 3323183375 +3694332420 2824389705 +1799685423 212281582 +68626093 494002770 +2393477864 3999258900 3999258883 +497359266 497359282 +3418838928 1523505059 +1836136398 389732697 +3639453073 3639453057 +1465685263 1394622796 2512299672 +743629716 676313460 +2107033488 1146890165 +4052290200 3535514957 +801495666 2792808819 +959931074 3559946101 +996419937 3812109436 +4096032751 1959340737 +598981625 753985768 +3041660250 1569589329 292063222 +3807413271 1470099494 +4292144470 186407990 305241713 +1055588629 764825400 3167777784 3885893032 3578224577 68166038 3220839267 2808113135 +387721383 4231674532 139722486 2110263353 +4054787288 3023316044 +4098648603 1998481352 +1462457951 699247388 +3646009059 4271263562 +4231906063 2556017461 2674401114 +2655850889 604602350 +2721392496 3383563605 +2790452103 667555883 667555895 +4098713617 2038029262 2799358671 +2264413286 3736763543 +425001008 190053277 +1213128071 3678912083 33108160 +1936551823 1145478680 +4187194026 2369171867 +1562881256 2687633676 +505914760 6919453 +1031025429 338357690 +1153634926 3033266429 2628186138 +3594389860 1754157832 +2512002213 1492850604 +214654518 1512394503 +2686306938 2296757789 2028315853 +1115692179 1649396480 +3242837561 1965784094 +1349703103 1673952168 +3603419336 2804201840 +3145838618 1193818347 +1572321251 1798732380 +4191163294 4191163278 +260050338 144012803 +1439033965 1938819474 +2557218743 2557218727 +2115720794 3741904829 +3934695663 1242176006 554207278 +92989068 92989084 +318260872 189245127 +554141484 1649847996 +3044895483 1348633535 2943314212 +4202229845 3687650118 +546757897 1730868943 546757913 1447622510 +1871361149 473274123 341450946 3420557666 3420557685 +1096399427 591411068 +1791573082 1959395773 +703305713 4007669862 +3493752601 3049221397 +3344836295 2687961942 +2926131030 1782350311 +2429294521 2856933438 +4026898671 3289094188 +2848014410 2247902278 +2304584601 3601572318 +1070534713 842834394 1931138590 1931138569 2267107631 +2483916122 1800766647 +3320043951 883928686 +1295863186 696327379 +1088170653 3080131892 618022018 1164677739 +2403424581 3521279850 +4184950271 2882483132 +2904900205 4272394651 +1782522450 2472740627 +688029493 3287171196 +275930154 3181186790 +4178386651 3936850628 +571696003 1818638460 663070517 +1288157422 1994935662 2057524823 1994935673 3801365426 3429375663 +2980460666 581625885 581625858 +3412681962 723903314 +2237775160 819781421 +2085390500 1350244905 +2268872413 2711971574 +238811926 2121024433 +2959320795 2279582404 +2057246544 805091243 +3644079752 2924117429 +1183934894 3303628025 +1365100714 3581104273 3614197430 +1014244756 1965415002 982312979 3688911900 1965414988 1956665912 1143950983 664495071 +1576708735 1889166824 +3145458244 1745170719 +952840737 2296375776 +4288891240 2999235459 2999235477 3591147179 59919843 881389648 10924956 +711744881 2396795414 +4199495494 1353974583 +3126446229 3801366330 +3418875932 3887227921 +2682332334 1567407599 +4065623401 3825298520 3635469887 1010663118 +3137919593 3622818648 +3625590653 2921304532 +1546935993 3748732222 +3857152048 2600878132 2962699165 459420547 2962699147 521144904 +4230168529 3162338822 +4277097697 868392502 +3720284991 1388229672 1388229694 +2536923837 3348983700 +4145546603 1708164962 641423030 1708164981 +2590360134 1412486199 +1805035115 3374840436 3374840418 +382960838 3036283809 +3381215340 2547441559 +3521963271 2129431062 +1512654744 2264642637 +205661008 2619184885 +2287947261 1052078607 +425285918 626647337 +848798835 3798755139 1651983863 732258061 1651983840 784678763 193123682 +2981997897 2129846702 +891583793 891583777 3648066598 +2598786932 839852488 1285270425 +3308891088 2636685355 +2905611332 3871112991 +2292979645 2292979629 +179369464 2528165708 3935514240 +2963936630 3170032903 2445265094 2445265105 +1534299519 2211546923 1978121960 +3023771448 4043672891 +3310720042 402059295 150295956 +204105345 2814336256 +3112777633 3591147462 +2334233267 1177667610 4139802785 942578194 1198540322 1953822467 1805595506 3694850890 3008913849 4291542627 1027189447 1913998290 4037449997 3479454149 2656076994 2215415164 3791630797 1372597934 1889879180 749548361 870463253 1659425826 263562856 1936837607 440941053 2732664778 333952931 2717746156 1494695282 3622979272 585551935 2090402513 75113907 3993286440 423718140 42087201 516266495 3237781089 696243709 4181329474 295296432 4049253855 3209839812 2875717502 3222231247 1893633657 1601301248 2562126691 2026560386 3884282754 340386748 533134061 4170714102 1694693594 2268559753 2343439361 830489552 2965772063 +1143243696 4118498837 +1110169840 453411285 +2255159233 1534106816 +1019034149 3800407967 10251521 3269625900 +2557690116 3493394652 +974661434 1041085973 +3781291631 1789502303 +2543493003 3378047326 +2159927609 2220902692 +1449000046 1676960057 +1225168174 593287023 438772654 +1324093627 4171126372 +1922787673 3282491144 +2180686971 2835258609 412151218 2749044058 +2874908479 3911742 +2401244992 2931690207 1625204874 +3509918455 1301902032 +4049526954 2723916685 2996264186 827270419 +3540478232 1387656386 3717119627 +3895163815 863224070 3895163831 +1849474660 4071769188 +2935493900 2089361889 +1331886191 1741493934 +978500534 1235641122 +2870214621 763087074 +1658203308 3408407205 +2200175330 513764230 +1315157394 2020443582 +3591283068 1963472423 +3403521272 1390287483 +1183407418 1176748261 3254384267 3254384284 3023623622 1144898141 2060397810 1383413729 1144898123 3867089709 2490936840 +1375617206 3376406151 +2187576134 3183381306 +2117884135 2684351392 +4233027658 2049643643 +3746472999 3746473015 +1576336782 1990928025 +118803939 146807882 +3741750289 3756319944 +1700225864 3499182667 +579128298 3169727646 +727677745 3382583 +644196418 1016997450 +356778844 3661055716 +1853861154 352160899 +800007452 1975356368 750218001 +1216166549 2988652682 +1647354044 3877463400 +2515823570 3787832211 +3476818659 512041820 +966010699 920455243 3496155630 +4228833187 1852444042 2120885978 +3809643595 923618671 3153780917 923618680 3241335316 +2052661823 3645958440 +380399713 309651616 +1476622000 3342277064 657269639 +3522592323 3522592339 +1527243565 2053808068 +393494817 218269408 +3047824435 768238682 +1568688889 206270174 +3810541667 4005911516 +522739471 462267534 +686852888 3695714019 +3558941698 2585587363 +1385173888 2026812037 +717745589 230372348 +795988063 254477726 +1944448838 1692567431 +467674276 2245635625 +2259051250 2309604114 +3702350068 439945055 439945032 4240217236 1492099097 +324968578 2155101197 +845323975 406844246 +3870837051 3870837035 +1989941149 2323679144 +4073749179 4180751474 +1270851115 1773311394 +3153572686 888095705 +671489653 3941611533 1990324778 +131072005 1366296524 1366296539 2758165560 +2619868526 1090554927 877143346 1090554937 +2309972590 4277625906 +2810267759 528811704 +2897134419 4100565364 +2630182623 1119580060 +2404975602 2602644979 +668247925 683908394 +1929794160 455799028 2059483101 +161338654 3710127164 1284029737 +3478193594 2529719706 378274781 +2679232192 620040275 +910127602 1474322405 +2448712503 4206374790 +1756056420 698855039 +2195711355 2195711339 +1003857119 273845022 +3353850604 3457857551 +3894439498 3037568635 +1315324729 2751189694 +3351043795 898619652 +1066080066 1240833251 +141966781 1449483445 +1636280834 2324734243 +1938394785 4154867398 +604735489 393273988 2223852909 +1211717018 1279377789 +849629863 1605246198 +3030487926 3329736535 +442891447 1166857222 +2724569449 519909736 2724569465 +1923604442 1480942653 +665689800 1332180641 +286274798 3397604025 +502816723 1547723821 +1370075718 3559105591 +2046935480 2525394924 +2810410389 1528704497 1635930736 +1628710304 1924610789 +2285003812 2957724976 +1452316482 2275286243 +2133244265 2465587288 +2061651905 1721042332 +1259207770 1163300086 2164539837 +923682738 1533687643 +496884094 494756169 +3020770471 401582838 +4167805778 2453712767 +3790984771 4177546108 +1573983711 2401594910 +3591297731 2641813368 4291006610 3334360205 3729034598 457876174 1858570924 3549775041 3773509472 1366159614 797343275 1543249281 2902795607 2758111928 3160168444 25373076 2843573105 4284083243 3664692820 3991409341 377555323 853064676 158086457 503261682 56160067 592535169 3685352146 3718451013 973424382 3607797228 3445474591 2100738117 3892862168 3102907762 3274536217 183942764 3556503539 1136446930 1031999082 1292311655 2822435105 668303904 2545678260 4089625120 878711399 2754749205 750209396 1810688799 4168022794 3799969371 3187013142 2196934731 687657479 2047242741 398585685 1084089785 1897431049 619059432 2635993572 992937422 4233558390 996307235 333665631 2080476110 831176348 1360912398 1962722409 162664977 1743205897 2501061632 91116617 37525629 326514933 853389165 1533878824 2559501574 1635385294 3982039187 2115127242 801815670 1378945280 4168874549 2619056013 3310051010 1740125866 2222603274 3616161066 3657612292 2415148683 3198455600 32795027 652531766 1432909428 2149034361 2984508729 2016702819 1080248083 2039546939 627663726 3333597919 322533452 2531377015 1264189690 3833425929 4106529006 466794005 3187824504 3839658227 1749868134 221646219 4282888976 1542706199 3964161518 1576365009 2139663857 2691971935 1772386614 1519175746 4226802330 60455006 202091304 3786152227 1573311624 2973236627 101983540 584051421 2288588695 4045013760 3741061354 4056900476 1697028616 3346955252 1626765073 1173934933 3659911180 3244071816 3417207632 2677478107 2232893293 3522985963 3289359935 2662339726 1610808398 2875979820 3187720011 944945518 2893471223 666058310 3158461272 1315550473 3009941911 1967799023 4147844808 828992738 2424666674 1977440677 2144929581 3884186076 +2150160570 1229586638 +826042826 1276807419 +1127043982 3682919994 +2978983479 3157213318 +110989456 603076152 +3210896819 2087386223 3422308035 3018209217 3362830323 3942105045 1328722845 +1004232780 712426836 754492207 +1575123013 2562600573 1575123029 1103393267 2562600554 +3659582389 2180103232 +4165757280 1078583845 1498349612 +3656173089 817620448 +1486356890 290096491 +145972757 3344767772 +498583144 184019487 +2242266583 1002434918 +743918581 3261895356 +2345451094 2791035277 +1747690031 732975086 +1069965604 2303388585 +1384886759 771340996 +840639794 3898506273 +3880456068 580729807 3207179828 +700498518 275901799 +3131936498 1311961229 +3068815953 2167309499 +2272119393 2272119409 +158359334 3552258662 31836375 +1903621218 4372042 +3652492647 2123662457 +1757880376 695711789 +3047030877 2629074530 1153077867 +3761590033 82540496 +973899154 973899138 +2931836339 1853483318 +3866366271 1297158396 +2551154869 359937276 +2647478550 2215039219 +3197405490 1941052185 +2997143291 3277312991 +2810721517 2825605380 +3591297740 368167895 1824232459 3227246528 3580723156 975437125 1670935965 3798796049 3860457374 3125392185 2463263446 3323858565 3173101855 2621867200 1423087087 1938714531 2498019309 2294091525 659861617 3116954884 2040305756 2070687195 2254074476 1971286687 2312570299 1777196168 4085649166 4215781690 1313207650 3994727914 2588922 3576806503 87520273 2282077318 3908053285 237646568 1033075820 860360254 469891528 4068998376 3488036763 2139647688 +633482284 770570955 +1208381890 399521742 1230968797 +1515376748 690155415 +785736047 785736063 +3107361572 942001960 3761230364 4289902020 3035210153 +3210568374 3772409631 514986770 4127351953 3473232557 3435413633 2214301962 2946850392 1391810113 99062842 4184935334 +3371741930 236509942 +689585300 904041046 2605776512 3108455936 2415634509 +600493352 3696033325 +698027564 2870431575 +2596269014 1914716657 +3438416763 4032190755 +4194630323 1222027212 +2150975721 510389078 3168913095 +3883764381 3686589971 1078508741 1078508754 3099279986 952732891 1635206054 +2035829203 3238713943 +2643495897 3817612951 +3331077505 3331077521 +2754518883 3630491868 +3448606770 121288008 1395391001 +916239567 3350241742 +3331075979 1111343791 2571334773 2218540883 3695659968 430888916 1111343800 +3718081600 2567545538 3576483895 1286075496 342212523 +3595990902 3760066257 +4179756972 61899685 +907172880 786885923 +2836561617 15633687 +1141126485 130924464 +3089974448 2671976707 +3864406508 3861490515 +2818097216 2900579682 +868450574 2328111375 +780946476 1927014743 +1775733713 1867586054 +1662981397 3593648061 4099219445 313184741 2639355421 2693659891 3690737674 1564967705 3944498586 4129090560 717523997 3568489192 920196272 +1181470501 1513721949 11999034 +4058067143 953414503 3917321107 494740735 +2940919963 2380239876 +3944252754 1771692058 +3877197840 1417686050 +482868916 3486595871 2606107604 47576409 +1233985609 1928428045 +1903236319 2952572129 3144301488 2853293451 3155662911 1946409736 +2666547243 2823298126 +1685057540 540464735 +1383462388 3283234585 +2060929097 1683059886 +997737013 3545250172 +3830898352 4028710428 +2790224035 680060295 1913540764 +3568928836 1732896480 +3798791449 2662276959 +3420829686 4037056593 +3186505471 4244673406 4244673384 2951220412 2790001639 +1602681357 1510053966 +3044769644 1312339607 +1917541771 731095224 +639959061 3923191896 +1728516443 2334151236 +2842715160 1744600935 +2567435715 172488436 +2787933726 2787933710 +4268759005 922401899 2099147544 +2413920278 2516361905 +2129756258 942479957 +2154312744 1275730667 +334575481 3719975806 +1885067978 2219761354 +1233629367 1498196276 2006659078 +1758326007 2656165731 4079749328 +22296506 3820477482 +3532262558 3676763656 +3861181124 4217435576 271198857 +172097922 2817023925 +556286856 2244119220 3127004957 2244119203 2049087408 +1993742806 3909790695 +3458689098 1093348028 2047121353 2047121374 706565109 3287668990 689787503 +3706971245 1089509266 +3736415143 3412751795 1043576800 +2823281818 2199930475 +1417163595 1144569620 +1952033996 330896097 +2909218151 3606013284 +1091173522 4105738707 +2524909775 3104273880 +2136848123 2576986046 +2065709529 2897940616 +2436304948 3450765775 +2645035079 2747386373 1399534418 +2653335863 3586186676 +4148708654 969806450 4125867118 1090016175 +3354033458 3894613427 +1722153795 3662318197 +2890168576 2888646360 4199951597 1691990672 +2639016870 1425368977 +2100503508 1954099096 1974777129 +4078434609 3753723942 +2444891730 3119588101 +2511125069 3957933874 +820186195 75928026 +1427750590 3807498185 +3471532821 732577947 +725875580 1528707885 +1758073273 2070092243 +1038514281 1038514297 +3835359690 2851316094 +2193088947 2005451018 +2353397838 540179161 +1946173655 1946173639 1936069232 +3070685081 3102420446 +2317078660 3989389279 +3470714703 4159054158 +2971254991 537965324 +2707014736 1347422691 +2992004278 1945367185 268880534 1945367175 +98835188 974548495 974548505 +4054483536 4099388075 +3845118746 289806990 3830835691 +2278381966 2278381982 +3386257059 4239878941 +1003962070 165145329 +2824703899 3372599647 1667228473 3372599624 2789806340 1445316901 3271406190 +4093513320 2163256765 +377565939 1009493379 +2104647810 920611342 +978511592 2988217552 +3209866091 2586040674 +1241535342 1966145330 +1751937362 1656997630 1640220008 +676540713 2750833560 +1378821626 1513670813 +3618070366 3665502441 +2671262191 2491626296 +2790240095 779162270 +1189730263 2032060262 +1511039777 3912289526 +433536783 341047395 +1018223256 1982833887 2435246574 1849835950 +53328361 827472357 +149824975 3722806488 +1614871667 4182599948 +3151900171 4045940024 3384965954 +3587761277 560967874 +2570487275 466931956 +2590028704 2788869363 2788869349 +3170246192 2995929922 +1374610121 1374610137 +2978736629 1950436540 +1371472228 1371472244 +3365908517 4167191084 +3456592173 2374212568 2192216530 +2990569759 1309447654 3128863710 3015696215 3559180559 1821108926 2475551299 +2869948105 320136824 +323682613 2484266602 +2857711241 2904873400 +2792567581 609842850 +1449183129 2472162782 +104110255 1942772590 +500254647 3077679895 +4247049393 838521520 +3398813028 1304804479 +2035409256 1676007101 +2124023114 4140044839 +2272053762 251716553 +3104899090 2871367354 1740840019 +170810389 3938413363 +17764684 84167520 4139268769 +3925669845 775562332 +2628499412 1985110713 +4185717283 3804087562 +3309984571 3473776114 +2800178087 520936882 +1552510756 3495556543 +504948456 3257097196 +2817408532 3681876329 +2358963149 618738596 +3517268383 2787528030 +858757500 267296295 1168312103 +201439167 2193841020 +802554275 4041511836 +2602527814 2021093921 +1234627784 2694233803 +2525947853 531550233 +2733294520 1222620608 +4231806729 30550382 +1557224951 345435078 +841109398 3458998805 +2259234729 2773878542 +118623165 3731389058 +4157609185 3224987892 +3790299493 2445216925 +1625823809 4291979389 +1997571777 1820410864 +3730360437 3730360421 +124812093 3008866569 1543444792 +2095073202 970503454 311179085 +3629626444 897394272 3725644705 +3532798407 1127281750 +4120078875 2987395218 +156800381 863196098 3230456418 +4072743495 1219350835 1118685143 3783437018 3800214624 +1298552309 2132623315 3440988330 +2348914505 2944477166 +1204051327 2032086782 +1919821014 2137464759 +2109455539 2710179290 +2694924155 1491306162 +2763578556 184777713 +619555222 2820791777 619555206 +2573754772 324115439 +2253309923 2392188940 2641108388 +1986633487 2001036440 +3089254295 1962324656 +2309420564 670339455 +2522992819 2063196428 +1745277782 415150193 +186865517 4121075858 +147634158 3324813492 +4001100197 1450048571 1853991345 1282272355 36858959 1735031637 3445623732 36858968 3277881049 2753436915 1630001651 2568760390 3377469905 3159200997 1044952778 1112063254 303916716 36858958 3837532570 1017069246 +2614869269 4183676467 946243514 +3471966747 3471966731 +2723166857 3951851131 223094200 393127583 +875323874 3857030262 +2831023171 2831023187 +3508419987 2128958487 3315265132 +4150546604 1827604928 518717121 518717143 426391356 1827604951 +1480859524 2000526559 +2390660037 373464844 +311832444 3279155727 343672740 +285449528 11566884 +2847917684 2900715673 +4134712137 1066417144 +3744732166 3744732182 +1670400831 4213601320 +2164467113 3465478425 +4165820722 332399013 +107485829 727726762 2598485850 727726781 2598485836 +2529585427 1834445050 +1218422491 777235154 +709166097 3080655662 +3743448515 2559211252 +695539425 3345880790 +2021070870 3969242154 +1664655957 2267515868 +1448316774 1267383703 +763502543 1926763214 +1433709088 3207401211 +1104216165 17014508 +2253528883 2789678426 +2538887506 3308077367 3064784173 3085745918 1588472491 2345180165 45558169 533574125 367796383 3068968296 3488408772 +2626218671 2626218687 +2868596292 2153777924 +4087601009 4226557680 +2452692427 3998344852 +685253562 104873437 +2531832136 3629061195 +3488953806 3488953822 +4097827160 3633298843 +2413338966 1214853175 +3679035593 4259847278 +1552997291 2696043755 3821553122 +1390613204 3502488617 +2218655450 462774374 +2834815729 4012747120 +3453915869 1895925442 +2976388926 206170419 +1998971610 1789140285 +621253397 1609337354 +923367348 1474785369 4177258909 1474785359 3126189087 +1971202112 899243205 +1653524191 96669982 +1286027480 2201910299 +4051279676 607970023 +4197761928 2162363043 +1802812811 3016122836 +1908993673 2823782840 +2687476391 2833913927 +4157233958 965573825 +3945736899 1156801907 475893177 3882934977 3095727114 +4105841402 991012747 +2345210529 2928169824 +2340022539 2615794772 +1196431412 1355460744 1997937113 +1714764160 1707705477 +3716982434 1718243594 +448721667 496536992 +3097190562 1050222357 +3682049968 760242709 +758133137 3017672528 +3007667363 3643856028 +3947315795 3022874810 +1956165233 3480662784 +3263493717 2945943878 2354038748 +134496802 2046927010 +300166616 36973324 36973339 +157345810 1876356662 +3254748773 3393229036 +2185039594 2185039610 +2080869602 3010012355 +1448049968 1738752139 +1678223791 1901912518 +1284824110 1523789820 9472150 4134832560 +3178640075 202503554 +2372772295 161360083 1788193856 +3806320611 3806320627 +582503625 877432635 2227260728 616754829 2227260729 582503641 1318712335 2227260718 +1952012307 1000711674 +2086516624 2086516608 +2741586828 2420682656 3401706849 +1549914950 2455440262 +4079046133 2993535164 +3276982879 2433047287 1114518214 +2686710548 2359919936 +1275923134 3162275583 +254580836 2142381144 2142381135 2704614271 2858754660 +3157852498 2679968773 +2009404445 2747246797 +3788474591 1488221982 +4162902974 1003879274 +4066406360 1401608051 +942817988 991894153 +2795048650 217204731 +2183889918 3900754143 +1659729995 1647027341 +1161855888 1162917204 +3020244399 3653038828 +1187154599 636837779 +3145793757 152329186 +2253632410 1075842993 +4098308721 4246798310 +2748393723 1967616447 +219962846 2175255657 +3829766288 3280378322 +536882223 2403700206 +1881090432 2380407742 2610188962 +3953411781 3097192474 +2551341593 2675714793 2112908638 +2211528248 2211528232 +1957123119 941484984 +2297455263 829112392 +1798471286 914166737 +1144898119 3292065510 3023623616 3099001491 1970830675 2037941120 1649895589 1144898135 +618182899 4096468634 +946996381 3543184606 +1444580623 2597064324 +1071665311 1336594268 1336594251 534408737 757000776 3595875012 +3841929322 3887675085 +3955408892 928595905 1733743025 1588337072 449430444 +3202285677 3859655556 +3271027425 3443965984 +3302306468 2141108265 +735511302 1638736199 +2516626944 976446939 +2113106097 4147799728 +2838544913 1757511888 +3984053105 2894739447 1151458022 +2058170570 3903049211 +3763462883 65547082 +3490644854 1877721984 +2712272067 2680475965 29548250 +1258078470 4135461498 2696154950 2696154961 300145783 +120310804 1566586728 1576158073 +1898311639 2031609170 +32710435 884605962 +1018817220 3355356681 346383102 +2296293775 3376881926 246607317 1662174518 +433878060 4185895608 +3512085460 1588002479 +3414317152 3109111896 +3486430213 660956122 +4060227785 3261478008 +1816249177 3297150216 +2475836408 1195442043 +755100272 1241779779 +528903908 2225115369 +2191654703 3557078766 +1451706488 1542844691 +699154911 2032906760 +2055504134 3835108449 +703746480 703746464 +2694551176 1559099403 +2592172345 1924703400 +3718139108 3291679487 +1742104743 3742945337 +2666425740 3176559479 +2325509740 2689494039 +2772308921 3652783166 +917256630 917256614 +2412089482 3103655909 +733947650 1294537102 2701258525 3756681269 +3146811053 4051960388 +3182799841 2247988022 +3669952102 4147266470 4147266481 1838533194 3669952118 +1335120306 1713921111 +2863502160 1388163664 +2773083189 1750220650 +2248404467 2712464235 +2089288524 1444753591 +602901286 3088583895 +1052677300 2047088463 108702805 2047088472 +3038961750 2011368818 +2396515655 619349718 +2579479025 3922828576 2579479009 +1157105100 1584472119 +4201314522 275103549 +1772741744 3329399893 +3031693984 2838391003 +3319141975 3683828425 +1895391530 43250957 +4111841141 2528996536 70395323 1437928951 1177537852 +1679733307 3612513010 1051774469 3674029288 +1623311601 1107887974 1513530753 839446048 1623311585 +2130922488 3929053028 +1099001695 1661907041 +2311780824 321384736 +3613274582 3746067441 +3291946956 3291946972 +3283473239 1849405926 +1423751757 3706393508 +58791588 674669609 +2574793805 3846630692 +2164769662 2637741897 +3109297997 3622090124 +475701340 3075447057 +4053719609 2517731240 +2838226669 1025279748 +2018005450 1765264165 +1727529893 3178085548 +2055570950 3618561095 +399738458 3690758059 3690758077 +2696535916 1889187585 +2720573603 1766907270 +4205895140 2903614937 +3519803864 4191092835 +3757586739 3334605644 +180892745 1110068974 +3611710532 666281759 +1852290190 716222266 +75052272 2815499851 +3963450777 2109743070 +3297139928 931407899 +919194299 4205454436 +1512700355 3004444138 +3727654420 1576570455 +3751519174 3751519190 +2849344212 3843360717 +2123025612 8414519 +3400893273 3636280149 +2113407088 2493570507 +424764911 3391321902 +739820235 905618818 +1276295002 3056547587 +1115012118 3042383527 +2490002401 2223493920 +652461924 2626871935 +634822758 1522708996 +4140523410 3335745158 +1039661787 318260872 1751115474 +490080713 3306252142 +387804825 1964851028 +3263005140 2700269108 +700718949 616393722 +2524295823 3267560765 +1161237917 2461468194 +1430220641 2480690592 +266576819 4158842573 +1664913057 397594493 +3896708268 1301082817 +1311705784 3423461307 +4052471358 2098572169 +2620067319 3469147078 +2228201141 2228201125 3353571068 +2834457519 749727961 +1755009733 1755009749 3417361661 +1442514837 4012699530 +2390360610 1813076867 +3637726339 3617681973 +2991281059 3808886928 +2781686263 2641257129 +1198727823 2681159642 3786510994 155150105 155150094 +2340986420 1205184159 +1393140647 3007294899 1596760032 +1409066900 3401305593 +691394950 5885946 +4003061900 2698453344 3090664609 +635710524 2233645041 +1712961748 1712961732 +245955349 2585851308 +3425741719 1556077684 +2379670002 3044189662 +3850119301 1517692819 +3195145670 2475404961 +1506634521 2002753630 +1457867415 3821372931 1643408304 +2029583547 720755314 +1169722196 360928559 +1448296478 233807913 +2385074539 907527010 +3645607765 1727177418 3656795130 +1773041406 608166409 +1662302421 2386512236 +86709858 2228501589 +3384797321 1587130094 +3556751000 1401712973 +4061023628 2558792567 +2449733952 1005173983 +2989457845 4267017754 +4155372131 1238667722 +1000266928 1040593332 129264669 +501739358 1914556649 +2028218949 4284834105 +3497284784 1870799816 3195184156 3195184139 3609284867 +3049530703 181989848 +1157470750 1980083716 3501360109 +4265768492 1855981377 +1932113243 2779283026 +1820955535 3941515739 +3640210695 3640210711 +4160359545 3617694312 +1019204533 2881640211 +3568446 683464798 2478271135 +4294209109 1120513994 +2732382663 682284096 +2198365559 3174545990 +1278694106 1944187435 2544908706 +2669767158 2006568519 +3787768144 3976704162 +2013778521 256074840 +663690590 2641221933 +985864769 985864785 +2298661919 3462878408 +1169582362 1169582346 +932335908 2673195936 +179385626 4009138173 +4178726001 3412503287 2295223792 1121007894 +1558555380 412311880 831266329 +4214287461 4214287477 +2262738556 4229237813 3648246995 2106824935 525202954 2664291892 1896661984 2583128791 3096219023 2196845738 1228359360 3145776341 2630747449 2426997430 2474829287 544435500 1887857223 3510964929 322385 1568739878 1756128893 3033782337 4176784892 969411965 2543945861 3248354696 1974906189 3934058210 99990110 2289831136 1202457059 2567195086 1077746216 +4281689470 1057932617 +723247129 4125214558 +2627161629 3434121028 +1553702374 3537362921 +2100946101 795365907 +3620162506 2025606893 +180311129 1144113182 +2694411083 3620368828 +3448398963 3944175087 +2786941486 2922706553 +1583673672 1777553013 +1440915097 3435113175 +3249548586 307697947 +2031927333 2767676352 3773688803 1504078154 1386634832 3443685932 +1399964047 3943937038 +1966838421 3077839148 +2166921058 3034992469 +2559935989 677503164 +3476155271 2714101906 +989328950 1349894166 173577991 +4088115377 1212622512 +3068675342 4255429913 +1437225420 2803811383 +2644340858 2803974466 +4185519754 1157569339 +799687584 4249879660 +4201798493 2399517220 +3288627914 3288627930 +2846611166 4152573823 +446819925 1105866716 +1542004614 905748449 +2866844327 2414602131 +676677287 624834784 +2506827226 4256196002 296523325 +2976366472 3461514013 +1346818813 3819308683 +204054403 1834360387 +936944457 856230904 +3038080407 3157385492 +200768676 1080561184 226173920 638525471 2563934289 680070506 3655593615 2423031052 4280990975 429326866 557678400 1531071396 4234108279 3166608434 1367782840 160750666 1200395507 1103519537 3956559896 1215309330 2118762211 3366322602 2090457927 516475575 1144798171 297481122 3781526224 1123310311 2651482430 3784832326 516574231 1909649260 981440423 2283447939 3212400792 3862643498 2037036310 2190363375 1239092862 3931231182 238445578 2850485902 165098082 3249085598 178459802 4164405475 1686058807 911731933 3087382522 1166499285 2998297124 2107225796 1767941213 1542040725 2291874379 616335424 1572209376 2894989480 4245499098 1958371719 438940648 2743733958 3448595642 1781803545 1241150521 4190806674 11147012 1781742519 2088119593 735639951 1908672531 698375564 2965504126 1385535052 2332620459 3573037460 4246736522 2147239197 3830674427 3986585644 +1438378985 3755237326 +166217848 279581947 +3820638004 2991238863 2778538324 173766447 2224111519 +2610986689 1830640125 +1500410963 53850519 +2196091515 3577404795 +1103327888 1675796143 +263738173 4230678786 +2109286323 2789378115 +4254204840 284356084 +741243878 1932331777 +1112012230 3593485571 +4078692439 200196326 +3989116760 2772680589 +181311655 1247217788 +3361895391 1209411322 1568407273 4228891137 87729259 3806915445 673907229 2443376819 915335760 1258629931 2043694792 3695378204 2800806552 440387582 71641301 3952973577 492785073 892698550 2580714864 2977488679 212509729 4133174956 1306346132 2041378305 242625449 646320200 463410825 3999129254 228745851 4227491718 2148105512 1356887057 186965326 3718799608 +2800074782 2800074766 +1220964189 3982577524 +3085354862 3997954617 +3965410899 1725267116 +2579273558 1507998833 +1346012119 3280114743 +3675419629 3064624722 +322973330 2376645646 +1105495155 767328524 +3444741264 3372211893 +813738602 1070620278 +4036690923 1265062601 +862160719 883818840 +2274850396 1681877531 3480179416 +2290276845 3539800068 +2196309175 3963624756 +2181609870 4226610318 169725711 +2624350981 1652703018 +3203283091 604180332 604180346 +1976060530 1883105572 +981522847 2932670556 +3726823701 1930805766 +2665137436 778324743 +3132921201 3132921185 +1306575788 1154746305 +3502113262 2094686778 +3572669926 535728385 +671569733 3458440993 2735964384 +2442550668 1565630299 +3248391632 2626463349 +1080676477 1006266383 2055798762 +1778151000 2999923623 +3734196163 318024102 +1296658766 1296658782 +2317136399 3887996927 +2993662723 844273392 +3392273288 463699888 3966698147 3568236299 +2260132500 2783358703 +1615204657 64341181 +2870212116 2409460095 +3916629699 1125360874 +3267023306 1444430061 +1816824419 2530536040 4180389482 3749022813 3125540176 +3249092091 3630168612 +917782318 1270838639 +3311175038 782640479 +1582955480 1680612604 +3938342705 3131261488 +3778206747 1477896297 1475815902 +597623011 426348486 +2420969687 5341798 +1232919977 2069879205 +3462613017 2667894266 +2722459777 2954535856 +3669717100 3239180823 +757720456 2107767989 +3552144803 1167305360 +1986631655 1329209526 +3006570630 876065649 922368754 +1015938867 2257108314 +1297588472 3102893691 +2663759172 2219897069 +734864490 734864506 +3724668349 3316325579 +2099019768 3957158779 +111846665 2275527982 +4067982485 4042527532 +3532049990 2956376097 +4265366001 1923906177 703921766 +1348885134 3536876946 2403260441 522227097 +982656121 2903468648 +3160502676 2353010921 +1349894166 3288995425 2810830598 +4219251550 3750305129 +1119946324 1776088633 +3307918994 3395134414 +1018286074 488136686 2669815549 +2564780558 3049294873 +3792759990 2888555159 +918250549 1576976252 +3043163477 1063938291 3755265226 +2316499011 3040959741 2665271676 +3774151268 4076719643 +3263952629 1844725628 3984754817 928367548 +2442229032 1341877739 +2615334965 2340280759 +3130156506 1867097525 +1026461194 2128563078 +1497357753 1062084510 +13246747 1496456580 +1906236978 253216933 +2124824290 1102380501 +3336251292 2801752711 +121179762 3503406451 +2892258154 3422283725 +3582283696 3504108053 3758593820 +3891142034 4107355119 +1034536808 2051336363 +4031465698 3732505318 +2838047086 2877059577 667529522 +2239525973 2011898332 +3379010353 1058623023 +555360329 624304252 +3323671793 3453245286 +1802319540 1044722463 1044722440 3505200463 2078634964 +1213998462 1168940757 +1665355994 2450247286 3319269557 +1001985006 860135534 4066009007 +2435426643 3616902586 2601872557 +844615976 1748910589 +744049603 1899910013 2475836394 1262552496 +1069839597 3659980613 1329860882 +1700123731 1963567296 +1853861168 1265512487 +2404506533 1121764524 +2819489745 1761964237 +242096313 1884351294 +2462377746 4018374206 +1110387552 2976398496 +3603159065 793587528 +3929834051 4263786 3798687792 3907701501 +1097460225 1257732390 4206583702 +1955714932 1424094546 +1372757789 1987120386 +777802152 2740226923 777802168 2740226941 +4008709587 4142252844 +3207676255 1502210184 +1102917864 4139230996 1691614525 +1333783419 2707403442 +843052479 843052463 +3639827742 874984138 +3017096009 1161870590 2957516718 1701584607 +1693660097 1693660113 +1224853820 701483377 +1394796305 1394796289 +4119009854 3143782303 +1292891293 2329264235 +743656085 2380173613 +1845777276 2899274801 2182528601 +3693602967 2271499284 +787463902 3244914537 +3354736391 1541074482 +357720479 1502464092 2955438369 +708255670 3726951809 +1641219178 326051178 +4197514784 3094577915 +2142735054 3689906767 +2479435605 4206199498 +2435094347 3348769538 +3224533492 2205547280 +3734858775 2295408688 2437038996 +1194370019 4103208522 +306359064 1053183791 +1407411489 2042116432 +3643196932 3295367154 2957844795 +3400917799 31834131 +4283152689 355764272 +87840393 3977170158 +3440598281 3732632888 +34164999 275681931 +2313594872 2694257811 +2078021916 141926343 +1528140077 1851913618 +281984879 281984895 +1296636124 2249335377 +2689494029 2689494045 +2165334106 2261233085 +3405090783 1603370014 +3068563165 3613390249 3388138978 3412058837 +1737809835 2146285252 2129507646 1531804271 +3082363910 1047770465 +894302239 894302223 +132459909 132459925 +2030053718 3510702695 +3668420960 2515509811 +4182122832 3402718558 +2129062256 3744121688 +1463097273 3129403785 +3799224163 3739924700 +755139949 1207437956 +3858076768 1637389093 +3132010917 2929293002 +607628102 570467217 +755139951 1240993198 +3189892124 1801066503 265544391 2007742732 +1261745338 502825181 +379787038 2815714242 3233637439 +3826860527 46320430 +750382457 3786462590 +1977943316 2877750905 +3687386021 2726122668 +127813777 2402040912 +1572687 1959192920 +2448968935 2967539638 +2874557048 818586349 +779783954 1268207758 +3653930414 2279409903 +865385789 918032750 +2497527443 2497527427 +2369464465 2369464449 +3469184914 2993254971 +1823900352 3262830379 531312360 +64009664 3247316307 +3018051170 2123257194 1898855086 2123257213 2443043907 +2010024713 2010024729 +2583445425 421020602 556086494 +2406414082 3450787893 +879242759 2264954134 +1563761525 1563761509 +3418570361 348933726 +2822563964 3902171455 +2149276021 2149276005 +2531674112 266639684 266639704 +103694792 2194771403 +29804669 1223531714 +2058968021 114004042 +2222496943 954115950 +2180820090 449020957 +626111993 3097589480 +2368677610 725238349 1589012229 725238354 +1339553327 3757607928 +547973496 3383720467 +1433390456 4144002043 +1873282030 1104200522 +1877086556 2095141831 +712036935 1443499332 +78196667 290857842 +82747592 2342984395 +4106898502 2692092471 +3735265485 425255257 +2322140720 325146005 +4132727767 2649080678 +2715368899 1510950832 3220191613 2348562922 +1913736863 809419870 +1766397947 2036234408 +107105812 549513583 +358872278 2186964199 +3558736708 1768274479 +779357532 2091976647 +4081808379 247910725 +1739085028 1987238884 +2026575062 4256287975 +2589394581 1156227716 +3255186631 918885718 2017489860 3683909017 +3080005502 1761298079 +1180267722 2295519739 +2082836300 3139474593 +1886573126 2752948989 +3173367579 499405550 +4040378325 4053406794 +3121066087 1092268598 +2514981439 982202686 +809378691 4003776701 +2557040034 2412891651 1783058090 +1666953883 73017874 3874501220 1070235642 2730887880 1133557819 2559661587 73017869 4263471474 490651289 +839123612 3980273804 +4104300698 88376949 +1261973910 4285927217 +262868751 4228417777 +965495530 3306305875 3306305874 3306305861 2393914810 2178543181 3936764198 +1909418953 4068912494 +3615921797 3615921813 +4100825929 4179996078 +3688089798 303545606 303545617 3563392951 912828346 +3001811526 1349410185 +3335738748 2058326567 +2506360073 1400790894 +2589022047 1292667528 +3485852585 3085801736 +1153432349 4020488450 +4137218331 4007118559 1304661380 +3774404897 1220398838 2026687825 +602640744 4090881707 +4142156650 325236699 1590159014 +982066676 434552591 +2748577271 3719050182 +2937414485 4088094410 1623603181 +2822342730 1948263845 +3992407408 344189631 +2898952049 1942396656 +1624630182 3422370545 +1504960546 1504960562 +1251959567 2343747419 2421761265 2280190104 2343747404 +2958707606 874839345 +2902504381 354087554 +3430614862 866942927 +877086184 875760701 +3776480862 4292076123 +2913120487 1042054076 +701307417 3873445192 +3520320333 2641732132 +250935893 3768980426 +3191901181 2090622804 +3548005391 3081960784 4168688529 +2019549900 1257375543 +1727120197 801239421 1402365338 +810748230 3758502279 +1983225216 4025215160 2523328645 +3290380367 2000795291 203793496 +4210083293 3859249890 +1984435583 1412669197 3721219882 +3413610381 3661036274 +2183019153 2183019137 +1579091911 4057546326 +4198434768 2010777575 +3042733107 3688805303 3011400794 +4260340430 924918746 +580677308 2372342084 +2385751962 2034353913 +2131226319 3363631054 +4025015602 2203093197 2203093210 +3113455609 474719464 +1347290880 1792345363 +1188676724 122943105 4165519274 1489687702 3448384072 1388213986 3059231893 2241420678 1748568810 4076645308 387436582 2618626209 2228042232 3888961034 3128054472 2745184738 3838109768 1311650580 157111338 4264341178 +3780250662 3660128193 +2308175374 2716620825 +2694499306 3182362957 +419046892 3313762583 1036628609 3313762560 +1745295361 1700484913 3291138454 +1057201893 3439283286 +3847821714 2638430405 +3694784541 2193534116 +2514343883 90850552 +1592933164 1592933180 +858644683 1547231124 +2243319214 738779385 +1326819206 85374974 +724493567 1499047603 4250080158 2372553311 +739538738 205229778 748073691 +1080995678 2226438505 +2625806167 2503002307 2045371849 2503002324 +2319714757 1847288076 +4292555493 3321035292 +3499657688 1760657765 2569974252 +907910817 3516970848 +859897669 4099004826 +62503606 2472602769 +1145423280 4046716188 +4072187140 4072187156 +1424864978 2218183813 +3347099093 60446872 +3384279688 2814239139 +1260022149 1375758417 +1529797629 1777052043 3050179599 2277789524 4228433140 +2052747021 2841432434 +26985917 2040145077 1161316482 +2835540770 832054915 +328185203 38813408 +1873499773 1203316436 +1718033006 267252389 2965261049 1852984370 2723060537 +1699093027 1699093043 +187831540 2480339993 +3212409398 2721800977 +2251063873 2098446699 +789434157 1069360082 789434173 +1857915736 2892127131 +4022396011 3618083938 +2408239389 344404130 +2514922957 3340999076 +3654205561 1467523166 +561692412 2956633767 +1058894940 3076402375 +2147681108 3636346159 +2728346285 3346187026 +1392613087 2323677470 +2334233272 1986077992 546258338 4002650538 2470857873 599702286 2161073586 1700166335 1702833074 2771705515 261315126 +902911769 965779874 +2212426181 1983056438 +1783007931 260180351 +2286070028 2364546551 +1801097916 999014595 3147103728 +2229366540 2524595571 +267268722 3947621832 +32425708 4142081409 +1366457382 2557153126 1564045271 +2360511632 219367075 +2035397592 3550354701 +3381215356 1488611542 +1150379656 2028234763 +2910051956 2171023513 +3279263911 1495224041 +1988896851 4054022828 +830605942 3431200330 1035777645 1706457041 +3774444401 3774444385 +445691840 2446410579 +574509612 337337153 +885213135 3985609235 +2025533337 2813062622 +1553894100 3933510923 2710866873 2700443016 366474280 2710866863 +1270111047 1944826070 +877861668 2471311097 +644056252 644056236 +631259210 2235905133 3176219718 +348057562 3976539846 348057546 +1417211052 2731282884 +24295433 1352119864 +2608433252 1650038348 +2247115789 3776189298 3776189285 3862634610 2327336507 +2645579540 1352209519 +2629447065 1750431331 +1352336860 2702719633 3221895495 +2758464995 3073291338 +2563887188 3863671855 +3743791359 1197619582 +4001634462 1877618878 1915055295 +603764600 4237813146 +2774592549 1452569949 2090057274 +3302289515 2068683862 +4165225185 1584657670 +1533950268 1593052391 +1222949647 2333330522 +551272868 1576129833 +41530964 3866610600 +2280840381 3226566018 +3497078170 2052441146 +2568252528 3478069466 +4259401846 531737031 +2180834055 1866399902 2683857924 2820236310 +783535415 3013509758 +3767264802 2654685059 +3299135171 3181884854 +3328340159 205839645 1583335546 4177011330 2940859934 274695366 1108580148 3969993872 2934260790 606701491 46196379 2605173664 2010437262 1994749342 1568958162 1826046323 1038420972 3187275167 1008960438 673045268 755335093 674866241 1398533140 4116190572 1215882254 2024574958 2467829922 3021301488 3146275126 1273611645 1186082269 2619064770 1322670033 33917103 185833432 3998984198 3001330423 892437786 827636706 3705947723 257385845 3319026607 3857463577 130890945 +823232721 261775622 +1761622661 3495698252 +3175901050 4120547395 +868974830 2495960441 +1690233647 1350854225 +1294615790 2920003961 2697533621 1737130671 2631408867 3994822658 3580560186 4097308776 2920003950 1737130681 829822045 662045826 2648186489 829822026 +456755405 2828163762 +605906155 3309690338 +355473818 4105719165 +4012551616 1076856133 +1550850361 1550850345 +2427260168 3362489227 +235597482 1455389286 3308631451 244114194 244114181 +1667785598 4216627017 +4252920561 4278344038 +425567405 3873404990 +3992493257 4231893965 3759296313 3825854820 +3978831550 1417467810 +1961074560 2186548883 +1765141471 2128760840 +1179217052 3491225424 2729588364 3491225415 +2212567708 928834439 +1852867068 1393517489 +2864414946 2804671445 +2803369597 2278700756 +1867629134 3166561742 2343887055 1867629150 +3101251023 561878991 +3796787549 2657305954 +2148439428 452288201 +809035441 2483889605 +438603456 3884759109 +1210278405 2494778842 +2001969354 2728795643 +746821640 1400363281 +4124548996 1736264220 +3443192976 2748251811 +4062578210 1406904195 +815934068 55104657 +2772498030 2470702886 +2177435577 142026792 +1981186864 359695509 +3107499493 2033827706 +3094010719 2939639432 +1971202117 973458755 +2781220289 558603418 +2055042150 1189007258 +3338155595 2000947054 +2892161388 3416841473 +489099649 3483801255 +366144286 2030575657 +3349737615 3723669784 +1779851841 3149496039 +2292419047 7476896 +4221541109 3543746701 289468330 +1936069243 615454642 +4238672138 3250627259 +3413732785 2004245568 +1804990640 2942756892 +2825987072 2694296179 +4108521690 1782928265 +2263672446 1916046330 +1506183715 3112786695 1988850972 +1812128716 3126239712 3565984289 +1391209794 1391209810 +4180805171 2917064119 +555091678 4088188799 +4280933163 2340605261 +3477499711 3477499695 +2082103334 2206555073 +1921794443 2446638585 +2416662333 867422772 +2885137830 1559426135 +2432498365 4215191444 +779431818 2893665851 +2920169425 2920169409 +2727875455 631799082 +3966658246 1552502071 1881463830 3436088070 3436088071 707722038 4287842338 607056314 4157327799 2049240016 1737055888 3436088081 3810823558 2217016213 2650109457 +2406456720 2784905195 +2886807364 924501551 +1389100206 3899357250 +2179910616 1659561243 +3289621677 90536883 +2058047430 3786314913 +1199608018 1230342158 +1030825410 871033802 2065592419 +909772310 1935119547 +361775564 1612591073 +3671021452 6738273 +2166437829 206228236 +1150975253 3592636346 +2032309039 3765285614 +3669811616 4149686003 +49286328 1474561467 +3798554939 3798554923 +3776918500 450646100 +324243749 2441968954 +1397139136 1397139152 +4173473811 2896500218 +3526064703 781522666 426864958 2948235265 +899731232 82459628 2351304549 +420403336 4200521227 +954180404 3155028687 +2373787401 3304577848 +3007240980 1072881775 695674942 676816075 +2640968886 2212024967 +359388556 1153510241 +57636751 2882545612 3040722082 4063228693 +1602929513 3497107032 +249209989 1277088938 +1129710788 3295248521 +3323077844 2712018472 2727344549 2727344569 +4155637648 2100645795 +924730409 2838987672 +445257061 3567181981 +526881437 2878598292 2916969711 +1580559166 1739627706 2397967173 1571851538 2337890058 1794958643 1811736265 +861072992 730677555 +2229183308 1680082849 1039315222 2197011339 646273303 1423025848 370559968 2191404760 67486475 2256038729 1810430355 3387688266 731475336 1520332417 3262331742 3609864122 2498609810 255920736 3148492622 1721867430 697378050 2563319283 4036227506 3843906799 757767167 2329331964 3735655359 3883939551 1604779505 3730914361 4055939755 92896819 3609913428 4008181010 1649496111 1614749035 2428488269 3607826519 785485232 +1542004613 888970828 +2034690730 2493737371 +795629498 1636702667 2132767254 +595313707 114675636 +4146492862 3482016287 +3845680976 668416739 +871609242 1386455597 871609226 +3028643227 3028643211 +360114104 1238864670 756695488 1238864649 4293326089 1048670680 3784555832 2926082866 2168372578 931227337 2627912275 2184103611 1166114015 2560801799 +2150935689 1542167470 +3326970463 1937571595 +2852337 2415203219 +2329319986 3251944613 +2633266927 64436782 +4031603165 651235060 +2899012910 2228468665 204655218 22149295 +2219732086 3178544593 +3529581751 63257890 +4199463790 4219030973 +2263313938 3825603390 +556119362 1885099765 +1834442774 915161777 +513234654 104709993 +3166977798 787428961 +1078984756 358616190 +1668569838 2116756665 +3364004970 2177101522 262722267 +2763396207 4064886715 3114412728 +2753304537 1606905103 +2931252594 2946605850 2091391603 +1353715148 1061708861 +3749534797 525880612 +1315329889 3424357814 +1910693792 1180837924 +894712417 1419241120 +1526436666 4174186577 +1885967037 2578790818 +2898316819 109340666 +3854982175 3594716382 +1472657167 4185291160 +2541428827 3520327506 +1510133592 2833884314 +380362303 1172710908 +2404543326 4240377087 +2856898203 3708453918 +3782781485 502523076 +2908512168 2422904171 +3660133281 1841490896 +1127702429 1513298283 +2910906569 3941495918 +1229824876 4283171450 +4294820786 2838497566 +2600908316 663793159 +2593931486 1106910591 +3260069402 4279151339 +115612807 1612245142 1612245120 +1050488605 2926652084 +3474100841 2251693017 1664908110 +517424869 2473455939 1946782710 1152585066 +3596496934 3638551398 +11768777 2129754631 +4089878397 3171869531 +115878057 2289566222 +3436850113 4275564774 1688818482 1839957944 +17272971 1734244525 842789459 3440544687 +2553654075 1200013573 487808510 +715895084 1481107521 +2381582031 1522970892 1522970907 1287566897 1177767896 +1133483450 1787258365 +4045502237 481802217 +1178698584 2634453978 +2594258452 3034577256 2144647545 3101687755 +2158958914 3584344821 +997540886 2946117297 +2284306190 1759252750 1618350223 +1558160523 3473940498 1558160539 +1134766150 3218630199 +457041723 494076402 +3449551403 3616199092 +2188351034 1975111517 +2863933648 486010925 +630503953 975235270 +1761653592 2753188763 +2627118517 2693258515 +671984544 2911186149 +2921669941 1501139580 +2068371479 715926576 +4211011349 1739196845 877813258 +317186072 2546474060 +3287776280 3738525092 3695715512 2229439864 2526566861 +2824084033 4236493680 +2736361867 1279270356 +2291232325 1866848946 +3704802889 2119658158 +59202316 184218093 2585023479 +2624322180 3145231931 +668104084 3154306579 193998842 +1696536635 711083383 1125457291 2700662424 3679116676 1562945608 4105913360 256643300 2117506772 +2517707171 3758394250 +1141506357 1354753660 +2727474900 3217526703 +119723187 4006925786 +1553327010 191091189 1643468821 +4216018311 2830525060 +1170149382 3519428983 +953790076 326025631 1435957122 1906741299 4220377434 +3098332209 4187037377 3909447974 4254147869 +951196081 2645354582 +859750316 4033646785 +2960540400 3123404739 +908344489 202862616 +858059379 4129925900 +3850471586 3974764309 +2230076917 888283306 +599837526 3936774689 +2332088215 1767072422 +3069301594 1487910571 +345088045 2386503378 +778892684 2709949281 +4062717421 573813764 +2509952014 2428228111 +1023247013 2819926458 +1507355492 3551596137 +1818289026 512107939 +2477682555 4137254578 +3563540448 1050852787 +3235832413 3775210068 +1057333687 1057333671 +2185029780 2581733625 +3508313096 3559380771 940155019 +3789606187 3478173598 +3867944836 3845613384 +1927290710 751916135 4102544950 +1422848631 2032471491 +2893989662 2845013033 +4181648780 3926088567 +3634488768 1382335372 3336351045 +3080228385 3080228401 +109758244 2116883620 +1452021322 2290554477 +3063065150 1422223199 +2257370303 2391613608 +3627484910 1285548217 +3872876837 2713696842 +3284881966 1729257071 +1134580693 1248065628 1700781164 +1575559843 2030143114 +2651894835 3517942571 +3703556507 485121810 +500011074 748296181 +1800640167 2456696474 +2108613844 2924624303 +1779003546 2262581867 +3454335005 1605388011 3395390978 1014142388 +302285214 4212657065 +4162168958 135806537 135806559 +77466003 1009919510 2266501034 1362249521 +222383857 4132061078 +3178931703 458473571 1058227152 +2285173189 2427201022 +181570651 1685254980 +2514090955 3240589778 2514090971 +2317812000 2607203685 130596347 +1654015789 1603406788 +2417860850 1706971789 +1259369408 3940955987 +2985067815 1045797984 +1381715967 2763976296 +723590853 3659498691 +792764053 4156138652 +1743963216 4079684067 +1804662699 3531316 +531184087 2925923686 +4173363479 2919145264 +375927732 4194919503 +27813603 2132408156 +2690117138 816395451 24875838 +3729314335 195217118 +1736928738 4219908578 1705885931 3349443886 +2135104361 3215205966 +3727817291 2026479384 3792058281 +533744781 2716369394 +3915146737 1299479152 +2769465612 3395535922 1699479991 1704838653 +2216080012 4115172852 +628519976 2923478083 +148630901 1731645244 +4010955899 3099412799 3571121572 +3657309626 2659192648 49720347 1767517757 +4049665792 1028562637 +4172967021 4202213252 +3281727368 1967903517 +2931607683 2519705130 +1335098055 217302870 +3865586341 1526407596 +1799635364 847286835 +2721986810 2721986794 +1435711156 1790909785 +908721584 1518269707 +2200012295 1662519020 826841162 1848921483 2118419217 336070233 2523848982 1192053957 3272812524 2681165141 1637363095 2037428076 2940517847 4238663204 3000780335 3883882767 1743108867 622691692 +935353266 1976588581 +114295519 124611466 +1856802424 2459674387 +1591620288 399107141 +460994854 2678690919 +639461710 98259450 +3915504462 3003923407 +2760484955 1605633860 +831303625 3380132199 +4087533975 1759358510 +360783379 1802528919 3956728045 3980548076 +3203283100 2107505292 +72482728 1964340605 +2694838740 2950056121 +1747089506 1346601557 4288412559 2638614397 1747089522 +625860953 312065800 +937659152 3619271019 187951651 +3147742892 115747031 +276971925 2450341276 +3814145883 3601882911 1029225540 +260514275 3176732880 +1092129255 1621995190 +1341498641 380616160 +2003659098 4102195340 3951196752 241601507 +3768824203 769004718 +569230999 760766979 +2297004602 222955779 +161877773 526538354 +3225040002 497068213 +4292621648 844760491 +1588038201 1588038185 +980005773 2170922724 2768621298 2151841979 +4079829798 4131435713 +4232896005 204098691 +3854518601 4112539128 +1773788745 3097029874 +2214015728 2921672643 +3882714319 543691224 +1536247238 3954235041 +760301630 322971441 2499066262 +134976457 1933157743 +3766020130 2373675913 +2227781095 4023153334 1020856825 517501412 +1338840132 1514605438 +2824718894 967132783 +1553488411 1194948863 +2560042901 50737137 3015538800 +3833257264 3714724483 533759864 590192796 3714724501 +1530135570 2766301253 +16461889 3429692992 3429693014 +478199943 1705972864 +1318135524 2457876735 +3918010246 3155397073 +367647068 3676384209 +2399250741 1419599484 +4264625019 2720561828 +1749487467 2790544792 +768075642 1860865262 +3874816987 2086130485 2450413839 3790794456 2100793520 2910348450 1521291541 3353876711 3617679375 2434459250 3984556491 46593815 3508121774 444182398 420569525 1276114131 2552697263 +735492001 2751664758 +1549647372 3491538487 +3741919013 2662508636 +1282120021 2724356316 +2291308175 2291308191 +4211383274 306278733 +360684163 3372721597 +3280972367 707336782 +1358303273 2722487294 +3515296582 499719991 +895671587 765599260 +2475068676 269342813 +3940155186 3878468531 +3845761363 751144378 +2684175322 3048329277 +984838717 2601720308 +1574088178 4225460702 +858719109 550801017 +1529007417 2965967016 +1378209841 2189868335 +3364618321 3605441450 90472336 +1604679180 4178582740 2641941751 +3793789906 3412190085 +2589484494 3341304655 +373866898 2525536181 373866882 +1617082235 1357115982 +931665379 3665371082 3355962077 3372739683 +3890756055 3918728550 +2251351215 359082476 +280167051 3535293871 +2804000551 1090134646 +2581089914 2843970077 +1821741213 2356324130 +3236160220 2193498183 +2194930627 927576671 3065336810 +290550899 3057275162 +1309307772 3639561007 +3691113981 1409918292 +729235773 2847650562 +1541142538 1541142554 +3082735342 794804399 +3188397405 779357524 779357525 +2783215386 1085543933 +1278352420 2789122035 383929504 +4289068402 3830315631 +655054340 2061002847 +687565744 868910613 +1777813229 3443834964 1777813245 +128378275 3015867818 +2973925745 2092025072 +1578300870 3721979553 +3225090627 3755472746 +3198231774 4121758079 +4072926888 3530601076 3144215695 +352965125 594910682 +1875899491 1734195164 +2681421405 3868396187 +2608005402 3490364413 +1632274166 508720465 47095510 508720455 +1722199326 1722199310 +1103922892 613053084 +860606161 1406153597 1923677463 3511251574 +706695791 706695807 +2428813849 4273835336 +1482005489 2523334142 463588115 2461183738 2461183725 2506556520 +1875275711 1875275695 +3380859606 277145329 +2258309492 2258309476 +4063289254 3908047447 +3857035074 714269923 +4117064468 1655148655 +3518889221 857034451 +2751913450 23495762 +2650322884 3609117359 +3202521575 1039558144 1706575548 +1342807806 473417914 4247079390 4247079369 2509604975 +3634531135 2745972320 +4136901500 2804368423 +3499356386 988034005 +2784377176 2593932676 +499759313 3045978384 +591413803 4265190991 2837981620 +3553756093 815522434 +797050699 347175682 2959396526 +2843539821 2349046107 +341199311 3207521306 1092592482 1251739605 1556545329 3207521292 3207521307 3537252568 3274631768 +224988335 3411998584 +1454166343 3104666326 +3764378290 3555557965 2785134110 +2064670364 1455746968 2767464243 834154592 3844390195 +1849007471 3982939566 +1959165792 3390339483 +875048815 2319625144 2157192465 +3460582355 2290310458 +1509898115 1848129383 +429535311 2629438542 +2461773900 3072157542 +3474642481 35736877 +1460837696 1460837712 +3435584330 1571098934 +2595475816 1029471124 4044531389 +1536043637 2513229354 +3096763962 4167745222 +2689852613 1907827946 688988684 3220745962 2606925612 2490468035 +2668978558 3970464073 +408571315 153637068 +1130393657 1238411688 4051383838 2027450671 +548658145 1095790097 1545806646 +3553008761 3036273758 +949156580 245469467 +3827307840 1171810036 +524460473 4007958078 +3152266094 898410041 +3091256715 2567973314 +2582833695 2358068044 2880819179 1433586472 +340385564 1775752657 +2027519912 744190915 3865310571 +1512698371 4077386428 +1603659219 1274596154 +1840750362 2572591349 3524228605 +951701809 3175754710 +3276152326 2803709009 +3318244225 2940181671 +2910987010 3188935435 3390266878 1130308162 +1506583548 1506583532 +3171043009 1268081088 +2989463359 1447521368 3296295765 +3010259235 2047622963 +4257315847 2123775766 +1812550982 3590544785 +3918010257 3518005437 842589640 +1862355686 948013119 +1427509885 1858017986 +3278584717 785301220 +1102828983 833711888 +1381078180 513020988 +1295476345 121000062 +1402080773 3893787369 +2008729737 3796084684 +231145632 2957144309 +3889197381 3609997379 +3575323986 3417253893 +887277679 887277695 +2244628796 3593071395 +1221384235 2422156376 +2271264993 240106352 2271265009 +1366825403 2667294847 2667294824 2667294846 20840048 4212162916 3291928137 1212194949 +1820082796 865898519 +696753776 3497945667 +3626473490 1261461822 1481925715 +3979775609 3856812136 +2313027992 2692514381 +3307911541 3307911525 +3231687582 1175391554 +99800104 2235824875 +2012686233 4184873365 +2207653571 3897715946 +1258078468 266590536 266590559 +3868156237 3868156253 +2672137680 2324354659 +3598203841 1350088551 +2443876066 3450053854 831227331 3248722410 +2262539277 1488365668 +3224392623 991149166 1238336465 2014425324 +3652558535 2937457561 2612456915 2612456900 2145973056 +3165233279 2114430974 +3713603822 1787145051 +3084806524 4011855409 +200975816 1566529251 +4151128177 2931866880 +3475133080 2869429581 +2720758377 819953397 +2942067407 1439851312 2165002801 +1966024899 1966024915 +939129411 812175281 +3191927602 1273859802 236286878 2990462899 +428180050 428180034 +1089994641 3613872464 +3342101100 2416911489 +3239963732 3314414015 +2503496501 2334874317 480967786 +2746312521 2092304616 +102339884 2624235008 +3331336351 871363166 +1656227143 2930790080 +1270586553 4049057576 +864194003 2649087533 +3919055448 307775629 +357573757 2789198223 +141061641 2319371449 +1634338096 2505369479 +2968146691 2968146707 +2245459684 762261199 +741807249 1876016243 3484966139 +2566853680 2644389788 160221077 +2902516633 3792062590 +239658232 239658216 +1098789376 430487059 430487045 +687381769 2287940914 +4129502807 3496905456 3104751450 3496905446 +1496923541 169603466 +944056740 2994616207 +659063156 1260636559 +1892719212 2103781579 +3697620933 3092695820 +544778379 3725732391 3286588796 +2209258504 1407164555 +2695687486 3476658177 1467535210 489587661 +2477618973 2534572724 +3040929046 2389550582 3707782567 +74436364 74436380 +1645359736 3668275963 +4102001139 3620913548 +378753649 4209690598 3851988737 191196407 3851988758 +2573110953 1229745207 +984894281 3000140775 +237322625 3315998230 +2356616540 1083235856 2072197073 +4011322281 195558158 +2880394272 1715521787 +1381411028 1919665583 +3594607938 2330316515 +2123121041 3351983942 +3836022406 1943006109 1990908102 1976949985 1241339642 3528441279 1990908113 +863453718 448596145 +2230316150 1576746866 639711572 1583280803 3516102022 2805741850 1015358187 3861238781 2487655376 2374922294 767319765 999767520 207275222 828670488 615800924 1983965940 3188318168 1805540284 2177408687 2685831327 1767537869 2245946194 1760817983 2401674164 +2397302942 2733152956 +2721206451 2721206435 +2502965005 3890653554 +2720259740 2063901009 +3182509649 3182509633 +430280954 1503869341 +2674703263 2536201054 977315658 +671101525 2673743148 +1075418879 1075418863 +250428390 1213731416 +1434500641 3131788790 +1076356398 1076356414 +4233914420 284655775 +3613257883 2749482002 +2670868939 3552212718 +2457988416 1641731852 3800595397 +1759619762 3443504677 +3812680338 1361357779 699446462 1102109316 682668840 2411363642 2411363629 +2727427593 3124019321 +908864165 3968278970 +509561868 1013703735 +1258980465 2773499694 2458811887 +1396813661 2841511500 +257012258 1067150229 +3883244335 2367900408 +4117049751 368037422 +1213962337 1227940022 +3328587061 1487998157 2279981674 +2964131070 510358495 510358473 +2185009091 3361925098 +954936662 2411502646 +2608349075 1363940474 +1086365742 490481785 +1450667957 3540310506 +1475570309 2711882428 +2337468381 546275236 2337468365 1410182101 +1375566584 168334459 948021139 +3339839207 1211006396 +3526606847 3866574440 +1326034422 1379713281 1326034406 +266301812 3505449492 +3682766160 1065622973 3120222356 1040489128 +2750883065 386872296 386872318 +4019431501 1920069924 +998628167 1821543263 +3302832466 977353733 +2547461122 1933442058 163202851 +54804860 3442211387 +1305009115 1311906244 +3193437475 3347283484 +2505468987 1376542948 +1046194209 2063184976 +1938874355 3759180684 +361964780 1204459543 +2970313219 1130800624 3085650602 1417254973 +2350274185 271202744 +674553415 2453268950 +1228115770 1228115754 +2226186528 3938105195 +2191081129 596839387 +240396889 3883837960 +1336537358 349768978 +2605815528 758213152 +3288665412 335463760 +1704944998 1609342871 +1548006311 3878080480 +2559014332 2559014316 +3011275977 1440694382 +3962234544 2005477123 +3909668460 1155331095 +4171143156 1437152527 +4059774304 1317117477 3138122811 +3735172115 2354575866 +1709780819 3239411642 662495947 +1602974809 1108674191 +1506824061 3756859842 +1256367213 2371727963 +3335021873 511134758 511134768 +113639858 1538566963 +3346622293 1495116483 +1452289736 217687243 +1298552299 4137582748 1581372053 +2314226292 2571449497 +693723013 87525308 4067077351 1449180419 +727272015 2358245966 +2226946375 3665487655 +1447883210 2770379003 +1547271597 3721590290 +3101939267 1370114922 +2447213216 1711762564 +3326122131 526034688 3461455099 526034711 2863673196 2778154093 1048027256 +895406086 172063073 2618439249 +596767809 1338219408 3066441073 596767825 +3312325179 122073842 +3757477029 908027834 +3142755597 1890051578 +1960758542 2422895888 2757600465 1721124484 146591001 3291921338 +3021183698 1289533587 +1965206443 1298000847 +1465346273 1603934752 +2584049850 815598813 +4241337266 2848278821 +1156039613 3819097803 +2890038804 378120057 +2889970206 1225172287 +145177630 3175326505 +2687119797 3313537791 +3871030619 3720318216 +905748468 4257209951 704711060 +932279163 2072168520 1943763737 +3098437921 3683614454 +2183276485 2697239322 +663695792 4134221845 +3480784335 1774664910 +1032225988 2663579807 +1934133863 3794919456 +596147652 3017669535 +534929370 3066833742 +2910165444 2030793903 +995278335 1360697665 1648433278 +2172246360 718349723 +1311904685 3225713682 +1961125552 3012404995 +3467717848 3137691132 +991663154 4188833868 1067891577 +242011041 3504987261 +1127773867 2095238946 +2709414005 1750172761 2190708865 2495041638 +2421743232 1629483054 1350322779 +1578450338 3178235395 +3442322212 2526172440 585394601 +1792022593 3563778417 1721118294 +658543313 236312182 +1071111272 946010167 +1039661771 3000016879 1482673556 +4078209570 1983730225 +2502444074 4167257613 +847126436 546033449 +3078933030 3547999962 +725580765 3601478737 +2892256224 1106250149 +2181871860 2919704581 2767585139 +650519885 650519901 +3813291522 3813291538 +340969815 1431499750 1100350164 3729012079 3712234441 +3329963300 2549393321 +398921883 157230084 3301290591 3301290568 2772538405 169997678 +4041755528 4041755544 +1205335155 1610094048 +611829099 611829115 +1264997040 3707866568 +1585787755 917500258 +3607976735 3592753856 2835771841 +1668360207 2426441510 2585923470 3509606929 2585923480 2426441521 2278256666 +3245983794 1572793293 +1564210369 2254588864 +318522343 3391022262 +1642670324 369850383 +3901930099 3499544845 +1617831035 2558892351 1617831019 +992370932 292200473 +584940784 3534466499 +3698947621 3043561290 +1709699322 1340929474 +889478103 4188385986 +1077483151 2833154830 +2723113579 3101718189 3993273972 +3635765415 3431409398 +3095941583 3373996741 +228993911 3318514164 +3291379081 1332041875 +1348476826 1854709942 3177250449 +2162573170 1551229029 +1305517222 1305517238 +558076768 2634700787 706951864 2170618231 2634700772 3848674297 3982895251 3239752864 3865451935 2802476940 1371578718 +381580254 866077404 1031271142 3964061162 4284136031 3546906546 1800439850 3863395433 3960555274 1562564371 1579341993 3714682714 3714682701 +2901546097 1122649949 +442020088 1235668356 +3813694789 1962086522 478335891 +3137180893 1106033705 2175622942 +399132704 426165748 +240138048 213594380 +2480485063 282501586 +1883370689 204693990 +2667587517 171871892 +1684636345 3407399208 +2075119059 2075119043 +2664982349 1537908260 +3955519867 2705237165 +725337779 725337763 +2976579573 2336144696 +3046710856 3032789308 1707852661 +1918668897 1799971399 2391242385 2391242374 1756842166 +1016304503 1330891983 +4415893 4279410076 +3510459535 4137036706 +1690685576 728188427 +754599247 4148956044 4148956059 486218584 +585816639 2146158027 +3324902426 342088931 +2228230173 815134132 +3930236759 502099449 +2167357757 2590225154 +1078071573 308739002 +3240252872 3507292619 +648322875 270969330 +4181862864 4181862848 +1669736607 1261564510 +1912291393 183946051 2788055408 +436119620 803398409 +3479050607 3397240251 +2389512442 3411902810 +1934871585 3186128966 +3318244251 3318244235 4118072594 +3456417718 125422481 +3670837018 2314776061 +2170205519 4039863118 4181523889 1748630412 +659025139 3376022170 +515317816 1944514259 +2512002234 3601279254 1845180637 +3739480668 1020692177 +1661863606 2769588366 +4128776129 1468597478 +1739125427 2186993184 +794352370 920165960 +1927928185 1045406795 1065345352 +3612295605 2797891580 +1456751671 2130721687 +3000005763 19360298 +986373911 2757570860 3372205434 2757570864 +2845559317 2086526138 +3109276823 4044150804 +3212690757 1042465642 +2741289158 4254824375 +2797860610 18562845 +1155688842 1782381231 +261725999 1555526370 +2613106903 1612537428 +2044629473 3498100742 127321264 +4044879758 1458191641 +4100278608 4196088253 +959380083 2012496666 +676288762 1659919195 +3648770745 1420270750 +2186449297 3103467344 +2933346924 2834743297 +288733881 3499422014 +2785367602 2355540133 +939254906 939254890 +537515450 695956427 +1326262863 1086653595 +347462083 347462099 +2965782192 4162105109 +4173693626 4173693610 +3990730512 2215063075 +1817827367 3072996900 +3231530215 512155574 +3315575653 2136657914 +2039848912 915051619 +2330849636 412287103 +694730523 1557620129 1715420812 +1566831642 719504270 +313627801 769188200 +1548196488 3434628125 +3779205121 2618018176 +1196450766 294460761 +178631545 1004111742 +3697126363 3262482884 3262482898 +1482796456 3385089917 +3255013840 1000245877 +860064723 4112826624 3321475324 3340628609 3304697702 4112826647 2064588161 4280602819 +1362905805 1277754983 320397372 +2478485931 1239796082 1486119384 2478485947 3523946629 1486119375 +2370782661 2169337834 +2997491853 3468994020 +1345462904 3068936932 +3397658815 2366383272 +2516204946 3911110701 +2282745396 4000671849 +2266219078 3208385158 +2322521272 2760209837 +2858440639 1858778385 +3515931905 3893094550 +3145176166 4102434714 848331185 +2901686502 712348161 +1874165678 2293759727 +4031650151 929957481 2985426230 1851460020 762840985 2479175822 +3514061682 471810901 3898509594 3514061666 +2509812427 2875987950 +463842104 3184298299 +1618342812 1705928055 3534831184 1618342796 +968102769 1812060182 1199217382 2733701111 +23935907 3790922140 +3548584121 3841938078 +1196522388 3645213167 +105884925 3966587458 +3585082353 1427518576 +3784128236 4249712023 +568608524 1717295095 +1392895622 944366839 +4071281926 2225226566 +2976924246 2847436135 +699569569 1159826559 +2519516461 2507826628 +3212824002 942729333 +83082568 1600160496 +860719472 662791049 3816586055 326315440 1481702364 679568687 1313926164 +1681504753 3084891760 +3336118397 3336118381 +3069344183 1509034793 1070870074 4192975933 1729074792 2085896899 2712209276 800732662 +2300445172 2300445156 +3126200247 208545030 +294076506 4058664381 1298757878 2128102453 +1056876056 402729788 +205533948 1158693543 +952697820 952697804 +1110239783 1404345206 +1209263616 1209263632 +918390310 1650083601 +3636378271 3580381532 +688626745 195574722 +739843544 1597388147 +2177435573 74916348 +387217942 1799106737 +332398181 1971432596 +3349757804 276592256 3349757820 +2926379845 3184472426 +1298042717 3017086786 +3143410760 987143517 +679361987 2437364093 +634745273 2570048393 +940144951 2685727698 2534729123 1844040080 +2466053593 1027841160 +162787602 1480884037 +3633207046 3994222199 +3098871001 1219339971 +3289712854 1367517682 +4265227907 3097743420 +2458808269 2201616306 +3075141481 1470511730 +2714026208 2293997747 +2565744253 3325808744 1004967646 1004967618 +2943775791 2534702267 +296900598 3519051857 +3641410543 2619388216 +2981498215 680991008 +2659708639 1862076680 +1552181818 3732093259 +1610789760 380020556 2755695237 +1381213332 766252281 +1615496537 3998214942 +3132810679 2559534627 2872549136 +1121772822 3304225271 +4062290450 1143736493 +2698367879 1860681689 +142591072 3240239909 767382316 +4049317974 1230411623 3662698294 +543801421 1400486194 +1776042303 971817195 3837441576 +826078076 4277357607 +3137327621 1706532300 +880551971 501847137 928196870 +4266948717 3085132217 +631724124 227379148 +1733684684 2017810465 +2595755689 25592831 +4255912489 1166867250 +1912497406 1903754207 +248069534 3961756073 +689640983 1439759747 +1601365157 3873304506 +1055588609 2083261058 1468517927 718252034 2553753800 2221761542 +1977558233 1732706696 +4246785059 2499779409 +1908730899 738173420 +3037843808 1795988019 +3826072422 2005401767 +2164705091 1621864060 +792827602 910191749 641749877 +875708972 1461594967 1702762304 +3600441320 3600441336 +905350575 2720074360 +3638037841 2904356486 +3416016296 788637565 +2184949839 1391889486 +2669817620 1247102734 +2666946388 2446856505 +1184193 1885423334 +3713191038 2389046153 +3651288526 1751599961 +231884317 3741605812 +3284984387 2239003585 +1859188446 1859188430 +2542720766 2735161887 +449020935 449020951 875197715 +778007410 1916976243 1376692493 1916976229 1916976242 +3204750215 3339720836 +2139828801 487738845 +3740669582 4291490831 +2951900859 4190145265 3989589967 1312086600 484825605 2292348944 2224406093 179145655 1709471101 703610401 813166588 4201259258 72908850 2065824412 750408279 2867075147 2400957480 2332830750 +4249341926 2651604759 +2639857713 3827819824 +3808046916 2480433183 +3901430736 304732712 +314800316 2955810919 1169625063 2242782188 +3055649026 4131182859 +1078856347 2174407205 +3588805909 3851536195 +3137397868 3462895127 +2202522070 2148488174 +788471874 1033881571 +3570617978 1465814943 +3771241787 3101251582 +744049622 2794611175 644884915 2794611174 2759453287 2794611185 +1313863857 4175724208 +237969112 56466061 +3590448250 2210031391 2104514014 467590766 1593486365 +2116385354 3741287021 +2960298394 4103411573 +3489819240 3687678397 +2541108802 1150198094 +3589525714 3173561709 +2462348420 2403560415 +2061636587 823012888 +3759651375 2470846430 +1914975064 4026781664 2663540334 2214656213 461383452 494938670 2414444319 2663540345 +4138770132 738854831 +2553820269 1495042706 +1138340188 442246500 +2740045634 1539091701 +3907183935 813173728 +3096301098 621976501 2973469703 +3240252879 4103589915 +1646156113 3334904464 +1491035212 921808631 2761158877 1677095648 +2641904327 2874220374 +3985420804 4168891487 +3034523137 4238677286 +3101939276 1521113527 +3204415928 3204415912 +1892027391 2261049982 +1797182565 109599468 +2207033775 3312393838 +735712262 4211677777 +2536753688 512173019 +1312906847 2414317448 294056715 +2106798614 3656748742 1416236791 +2304461033 2006457237 +484132247 70159545 +1935731849 3045872377 4022914207 3045872366 714365870 3045872376 3286670459 +3022256401 3069473651 +4009185032 1871253076 +3538634339 1801440732 +3446492577 68236406 +3209747300 2420727401 +1452154905 1522304862 +4135729199 4135729215 +640484394 1121816077 +2716696420 1827070799 +3288412918 1879863398 3853724375 +781441769 527374434 +371071760 106873195 +2391966798 3983667410 +3206135362 1828135711 +2597429844 4050021767 156425984 +2601220678 4056683158 2782275642 1837533841 +339446846 398312841 +1419586364 1869287271 +414369211 716502237 +153240381 2649741570 +701433309 2917546740 +1905948465 120168998 +2965681889 836806527 648799264 985159530 311966394 +2380440713 249003527 +3773146984 1791570757 +635104766 635104750 +3103204542 2323967115 +2285552679 3178897081 +32062756 687005885 +1963011819 1963011835 +2224037325 2078206372 +1244198947 3783171850 +2416609071 4019375854 +2380962055 959713796 +3672944498 526934782 +1966849907 942604 +3835390972 304962992 3702193585 +119430892 3696179898 730425427 +2684390236 1284996305 2649285109 +2916456000 3879438021 +3297443153 3083650704 +2086739220 3772827257 +3881564025 2932249448 +663626761 850876790 +798168635 2372026622 +4080782841 844998318 455747695 +484119041 1843222422 +2376815569 1910046561 2560230451 +3895167309 1961097892 +142521209 3631515496 +2921163832 1347509307 +262664823 4284293364 +3496857789 2028077135 2097063860 +1933076097 3804847360 +1897015678 3532378697 +33662603 3013160130 +2400794799 4088675182 +1359911072 972702707 +710896954 1298087574 +2304647482 2033077835 +4247030938 176766253 4247030922 +3836142130 296725437 335254934 185367334 279947815 +1250621903 667369678 +2148662972 1481900519 +1360607291 2107257599 3853747428 +495250559 495250543 +2115709536 1159080236 +708725065 3373096440 +4128475140 1195108085 +820439783 3800287670 +2042987340 1073087194 +342364218 1506904907 +1975889336 506493092 +242095709 1468626516 3582124971 +3715172327 99503076 +1583600169 107659672 +1158447431 3477787716 +777536537 234042184 +1226124739 3478587882 +366183226 2516030557 +1757429211 1334560229 +469770093 3163934642 +3669536694 113023879 +1622336895 3097446142 +3727825690 3806374379 313228514 +4287007172 3033460651 1287866914 341697721 341697711 +1521292667 964219058 +3802624803 3802624819 4036640796 +3080629528 2958729788 +1106772266 57267469 +2822943410 2466205235 +2333367619 873386108 +637586621 2791315081 +3059472156 781426961 1667665360 +1798271787 3870444706 +2100067676 2480409763 309227152 +3340916687 5839153 1242577624 +3807751711 4153671074 +1298148015 2715790075 +2546380259 3502488668 +1130923654 1812402375 +1060033297 2276869072 +3403404652 3403404668 +1220823120 1220823104 +2997017963 2707591028 +1127958099 1127958083 +1198341830 1111827207 +2585437423 2263983150 +2692351170 3402916555 +522387886 2988156153 +4047201838 4001487471 +2583496926 1196750206 3384702697 +133930237 4059950580 2598057099 +668026227 561009676 +1384314713 1766449726 858875791 +2287370839 4147064550 +735988896 1290909051 2935136243 831166232 95913351 1070149788 +2311526039 2070450096 +2496564349 3921784561 +3608707572 3446495436 +4213281340 2446931047 +2125032658 917917331 +211356080 2229944341 +937060303 3151063758 +1881090460 189486196 2943602931 +1546983904 2564580524 127384485 127384499 1546983920 +100720322 1728564426 +2864708461 960023684 3169673119 1567617025 44319930 2433429339 960023698 2074299924 2791967173 3365794336 2791967186 2450206945 2106045888 2299208385 +1989667481 1989667465 +1202995264 1426907660 549528773 +4235163437 2423823314 +3163670569 41818264 +2359415649 3614256183 +916808563 2036043290 +1416914913 4042523847 +119917413 2776575980 +366146370 2041637382 +3903317952 2530371960 5362515 +1134700121 3510787592 +352870028 2821510775 +2043981835 3570475330 +345088047 2420058616 191828347 +3359698982 3359698998 +3248157197 1407437856 3555396211 +2254557515 2205325935 +2042579853 891547378 +483588858 1830293461 +3653796614 3701883489 +1445269271 2822694107 2822694087 +2426316748 1975658039 +57826380 3950777523 +3138343356 891136743 +1650619048 2298117739 +1413182039 43553027 +388257785 1731624168 +3512304943 2541585489 +4191827116 3528199508 +1566877109 3127958524 +3680291302 2719308826 +263512460 2042978598 +3009675796 2054112633 +3168601223 3638372755 3605930112 +2400210490 1890264395 +2268010710 3738383265 +1560023008 1346931416 +449108927 3806719393 +2332079722 2148356293 +3296354130 2661551635 +4114885490 3133015542 1904547953 1002949462 2693740007 1904547942 +1360536149 4261284828 +3090730814 2039256159 2039256137 +2463533340 3551445924 803425412 +3490666283 3005626530 +739475186 3571323922 +4067327156 1475235673 +3960108696 93564286 +2697050279 3086331638 +1070269548 1100104704 4164436865 +3272225437 2307361922 +3476251652 1105628015 3476251668 +3110824569 1561893992 +919417593 1040662014 +2907623920 3997205323 3272899797 +1061420128 4161162035 +1000028913 3328035184 +1476296189 1476296173 +258314408 3840063604 +3919824817 2111003568 +3611577599 3750049150 +1914166549 4266633132 +2105084581 3020027850 +1176126120 3201920707 +2042174584 846062867 +1896568756 2886162244 +3302514046 3027009668 +3017488403 890848748 +2881908931 1444359171 +888129628 2977458375 +3711087920 1938110603 +4003099659 2820975938 +3237545490 2284588218 +684708544 4280861765 +725336147 1756792282 +3488828369 2718818796 +632848361 1248943064 +3323339975 3507441049 2603213764 2614879574 +379674449 4043902096 +2363280797 1553444386 +1947376932 3712835497 164468495 +2181009415 1099129092 +1249456445 3786458575 +660867037 3749208308 +2024443742 1384100095 +2631824185 2145145781 +342364198 1171352513 +1017587938 1562729429 +364247064 1165331931 +1626657964 2869748540 +662321162 4023996305 +1649352724 3985356797 1021684607 2978148718 3599728495 +2971771375 1725253947 +3022585114 1084370658 +3982709130 1297708413 3982709146 +3997731651 1597192828 +1941265019 2709352370 +2781027667 2091288291 +1320262616 1784528124 +517424895 88151984 239673044 476500748 2627248484 +1363247247 2031968536 +2142829211 2872214020 +43768457 2757297592 +1677267471 216106572 +3732979331 3349932074 +1813817370 1260167421 +1900495263 2210244700 +2380062975 1370894718 +3951963601 2714902544 +3813098402 3317299111 1798273027 +942237669 1311673722 +1227925277 1419186868 +496077353 2849716622 +189885193 3660283704 +1545161114 2513362283 +3934244991 3934244975 +433562272 1316291059 +3467325891 712994618 3467325907 +3477010139 1265707873 454990552 1223204428 +3059739248 4021439687 +2780741900 2679914950 995855009 605771717 +2154375026 4291919117 +2474128143 1606422363 892887192 +957505733 2632865306 +2113945905 2559450048 2338758694 2210373431 2559450049 +4189694688 2203442619 288748504 4282908339 +1214179840 3279028684 +1293058117 2569006234 +248575417 155251010 +3287699959 201673827 1942161360 +3949917 3152097634 +2160770293 1142831770 +3312331140 1349212895 +435348405 2388424170 +2883733819 2989240891 +2708900916 1637791192 +970924266 71356506 +342658677 2346985708 342658661 +888608158 888608142 +2038181501 3960512958 +797560159 2201771281 +2073428038 4195570838 +369000390 1705190561 +3927243741 2423293809 2423293805 +931228893 931228877 +2915289202 213353997 +4041407989 710265002 +1749526940 3301965959 +2486648019 636796972 +1540910721 381023488 +839148607 4226404136 +563171842 4071854621 +3746695439 2636399256 +2168335948 2168335964 +79029201 995467792 +3464805579 3858051976 +2162793022 767414166 767414153 +2555813703 2264736339 +3272966854 3772571041 4041012977 3272966870 +40676151 1201171952 +1274363758 1358308146 +1690613489 1254090625 +1811382982 2414752336 +3665583414 2765750038 3665583398 +505547979 1398736437 +3557642496 4111481503 +500478266 2485538818 802356811 +1146762298 3556783965 +3005964981 3259785962 +3096989553 3023467542 +435413918 331193546 +3551811950 3547537903 +3560547875 102225671 968919324 +1404419231 1712844382 +1884654172 849923793 +4277873959 2355631222 +1911275797 1797321756 +657857413 3461915562 +1033037262 3158295385 +3180296688 1490875587 +2791569823 778702454 +2652519458 88910229 +1677177338 2170589360 +118013410 3971730398 2369323456 1412581333 1989789133 841130954 2751876518 178030528 3814949927 3892324999 2949822100 1512705663 1824259855 215955139 782326212 +2957502774 3073646609 +1477415960 3095798235 +157230101 2355216497 +3066325837 70576692 +768737999 2355180081 +2664315432 3550278211 +2878752352 2106640684 +412990250 3930956571 +2033535616 1323583379 +210146390 3495575514 +1831576488 1075195306 +3914061874 1800033055 +1566296495 2793307758 +3485333996 4094717591 +3237521007 1859912209 +3672376714 3672376730 +4212446473 3961761657 1254841646 +1291608103 3125705383 3017378701 1474183868 3040507733 +905094588 2835015399 +1063313078 595658739 +730935852 3247569751 +1912202843 3345326418 +685934940 1914186257 +3330247108 1518265519 +663793181 1438776932 3532338197 663793165 +2040585335 2040585319 +2213176164 1783129935 +134694437 134694453 +3510702382 2540571503 2540571513 3510702398 +4129348976 3854341955 +2220168656 135941652 569464419 3823835709 +1643782967 3553535472 1582250179 +3555425839 3401032686 +3172552177 57136768 +1104965229 453105028 +3935298640 2037568248 +2619624376 1130939987 2233676475 1130939972 +3579402526 4188490303 +603654866 2747498362 1982990483 +2180285027 2368908615 4142481866 +1972844865 1578049878 1741781617 +691635777 646862934 +191513541 191513557 +2568131760 2822770947 +1583624191 2750751402 +3524897393 3524897377 +378208525 2312284004 +3493585884 2856825681 966583884 +3933181570 255945889 +2331132057 1415295198 +1823627324 1220595031 +2000710716 1517877233 +2074726040 2940780406 2244080565 2785382461 1639089114 +2842757502 988934473 +1454970177 461577685 2576135782 +2330981844 2034454309 1532662005 2871513589 221086371 832672327 3613474310 2208855429 2969735123 1583605321 4213949334 2762464026 2891195962 2967945403 1970437576 3123442712 3961138341 2123628751 3389945231 1830313094 2935961451 2701129002 2909344606 1934377630 1388719330 834200549 333384300 3270775303 80053002 828937245 1751291679 3295703204 +4262043537 2417987873 2049323334 +3984685866 2534273402 42798739 1310819205 2990426154 3255540237 215278363 3988268006 +4090114824 3478017437 +1974971301 82770774 324736419 2688513463 620934502 4112725164 +1400016467 2958429370 +3669098494 1073550111 +16061802 344868805 +533014092 2494886753 1331382711 +1633607821 3579543012 +178549559 4158742406 +3452565254 4210024055 +3992462080 1446480036 4198597944 +3120398952 840190397 +3278085648 2781991733 +3198115308 3198115324 +4282910020 576735775 +2315590695 2081862347 147921444 2081862359 +3863919646 3863919630 +2174353958 2174353974 +3971819560 3586537213 +989328941 22579396 4163382213 4032782994 +462550522 3658151103 +40922659 1861532134 +1888219615 3546837660 +2798711860 3471863247 3984026671 3768481876 2642209928 2642209951 +1814316910 2361901049 +1156091850 1142577915 +1289608997 2057445450 +805915396 2728466249 +1640317121 2038968317 +3257586537 1277347022 3734900799 +3544824313 2517615336 +3412719363 1362346726 +3180068059 1046416594 +1725791892 1725791876 +476178034 538822003 +1591945161 871314923 +4091345810 1994393299 +206405965 206405981 +4225887684 3951159480 +838673866 2072149229 +3410187576 855582509 1957342163 +3127962901 1014446010 +3940056269 4142872187 +3589850308 2594029727 +3286607647 2853454735 +1115606765 2071578948 +644876537 2069766142 1801324248 644876521 +1038644978 1727217381 +2795422152 334171595 +1832753526 3847370071 +1908671113 2693791160 2368884303 +797057789 3336377428 +814607450 3379237291 +3348940565 1355638282 +460103610 3693093506 3858723275 +4133614434 1560416280 +2158546641 3135282180 +3901479691 522834498 +1483004789 2613410108 +3689981142 52187242 +1427152837 2922087180 +112239825 1494447376 +2637830782 901934409 +2466216460 1949114615 +304220036 1267857528 +2900117299 3154991591 +4117931299 2256139786 +1357055954 660950931 +1263672134 1394234170 +3497012850 973691930 786014393 1175023342 +2346219948 2871954239 +3325020728 893081147 +4174941258 2422771764 3532565098 1497419745 +1630923895 2128822096 +1876506959 2082458470 +4029907376 3507824643 +3257228660 349314457 1606719432 +2464702228 1473096815 +3641253583 2019262414 +3266680705 3199247025 81625110 +1482703877 613094362 +1926840294 1281022247 +2347932149 1139301564 +2286022135 1992924121 +3985434726 2996515946 1652020597 2404906406 1688529219 1523701911 42060698 2404906417 +1697537989 2201160284 +3842253055 2197118864 +1495725178 3528645661 +3351846716 4107824625 +413321254 3997242305 +25326759 123577078 +3522204952 2028638341 +3879581196 304452833 +1908144996 2885283850 1861009023 +3712314575 3796844593 +1029950812 695542992 +2852458109 586534594 +2759247222 2583150004 +4124956718 241142746 +1028128093 3579042146 +4069865874 3100126253 +2543875997 1318865972 +1164389456 3759101116 2439692789 +4575271 4575287 +3068256299 278127522 +657570279 2127252979 +261899575 2827709966 1635663897 +515536882 1552454766 +424425393 2001247372 1397649527 1798256214 2405190173 2556188749 +1231878120 1889945109 1790989084 +3979808600 3316459419 4208627725 2962567184 +2039656472 2045457883 +1285465051 3554514846 +1018726622 1098100809 +1611195080 4126998731 +936064648 2632432967 +1015786761 3068703263 256927454 +2905441983 2905441967 +2079686908 1016811180 1042414247 1042414256 +4278493765 3108729484 +2817375817 2755824888 +4060072355 1244721361 +2810049879 2997753801 +1999692547 2767543722 +2346490776 3572208736 +1495833349 1154142538 1561316516 +3743789416 1423006595 +4294408088 763077818 1000207331 1873708324 2324776013 1672376912 +3716984801 2776162080 +1612425355 2649155445 +1026182485 2660744412 +1668801134 200299257 +3551176839 1186921129 +3871526596 637019027 145456768 +1089027322 690683275 1504518594 +33369635 169516806 +2939846909 3591966292 +879523147 879523163 3787243090 +1732711072 625404781 +585646483 1286137123 +3337697177 3334112712 +1890714860 1890714876 +1081734286 234617753 +3715054699 18619490 +498206751 2627317921 +454454702 4238547438 +2019325419 1687003380 +4048521241 4180885320 +1687698893 3028222756 +2061407106 3980513389 +880449673 4254216351 3517972603 +915309435 4097369490 4203827270 +1193580929 2141038080 +4200885799 227339449 821935155 1394173792 +653792318 2525486495 142076962 2531385694 479472316 2531385673 2485297609 4219776888 +956252135 3388163044 +1139476704 677396607 2945985965 1906106085 2554291044 3887287802 3717717959 +1302351286 3915011473 +3840257483 3550282940 546346626 +4289364484 609693211 +3783708392 3518330115 4013406013 +1053719794 4049473246 +677590519 3981891248 +3901234572 1040241079 +569445860 3175437785 +1870679110 3783568529 +3299891582 530375007 +4183593399 2899767860 +2099147746 1165702909 +3480619236 2060451561 +337741025 2445553184 +1301842500 2935822648 1797368073 +299539372 3340963777 +216012733 685848949 29712011 +2356718350 2997592243 +2266274391 4235130608 +2399039913 415979926 +1522961335 2643325190 +1146187156 2747692287 +1089810998 2055338022 3958070295 244046730 +4131748177 6158992 +3762071300 2820489579 +4056576199 1756334400 +658878941 2948005602 +3791779703 1075351622 +677320092 699335825 +3207156949 3272641372 +1026817685 3990471836 +755139942 1089994625 +2790493691 3498607140 +177692898 2387444693 +3062030626 3062030642 +3751761742 1681329315 +543854592 130068485 +1897464647 1365256406 +4172917061 3510990746 +1829329045 985035420 +378594108 3256203111 87022020 +3387674159 221615086 +1027138709 4284130008 +552188211 3917826231 2259923789 3917826208 +1243055546 1560773597 +792632499 2040846797 +90351586 305957629 +2989227465 1373018719 3750684206 +1315329905 3692799728 +3212569711 1480491274 3864975291 3212569727 +3400329198 1050017970 +1100772206 2959874280 +1113894527 58634750 +2078955222 4146831777 +3156806327 3573512937 3952860678 4133393204 +3221137403 295900466 3027668731 +1280707497 2495753920 3564395288 2602322687 2167101198 +1151180680 2351047435 +3969415568 67591587 +2959313915 2813680690 +4095304580 3354896607 2480845935 +3682513509 4171778905 +714810296 4179053424 85417540 3392748205 +3239632096 3239632112 +1869572122 2254495979 +3575629722 453457789 +1983608524 3952870177 +2633829776 2992396725 +1890474124 3352103667 +2241009315 1147403152 +3109445102 2881327794 +3458250963 2038493422 205593903 3482016286 1350759482 +447593776 1556840604 +2922865937 2922865921 +1434107444 1083876948 +2497472461 2270320793 1417167758 +539201289 2700749614 +3572964908 1829011265 +1733130721 4122422973 873360899 1182546542 1165768920 982350875 +705997170 2961620581 +1345330471 1656611958 +193250825 1507164083 100730289 268506482 268506469 2463635425 11192198 721666094 376550843 4289381856 +3401804413 3401804397 +2726801943 4070398512 +3737361094 998828553 1944888766 +384709023 3086490945 +4081497864 3840848252 508226101 +844019171 844019187 +2303975924 588034831 +1799016321 1318365206 1799016337 +4135514084 3990070249 +4255356653 3027516891 +1591486671 3163612719 2408335613 910003955 +1562088061 258448084 +861895517 730071432 1387127618 1011823476 802847403 +2972542782 679052937 +4052294951 4052294967 +1924727314 2872984133 +3400883402 1160728114 3850441211 +1493605345 107438902 +197472510 2238455775 +2918599693 3887708260 +1712910817 1017550989 +2161671952 1752810859 +1875172018 3529151790 +2056059936 825929964 +923367331 1189565834 +141191372 1506697638 1045418773 4166510397 95680595 +149146290 2962757157 +3389344734 3830869631 +701447115 2621120660 +449020943 818471822 +1306024077 2718530533 412313074 680754996 1306024093 +926445373 718740756 +1128120498 3166213970 +3522204950 2478485937 +2930130210 1994261500 +3808283984 2777298147 +3306095804 3923936359 +3382458694 2800625953 +1416729283 3708560560 +1427555896 2156130624 +1395736224 2525337061 +2466361219 3982192496 4003941162 1624427709 +3893425720 2327026235 +3245964568 2856316109 +3691601487 677858444 +3203584561 3376472870 +3596313081 1792752382 +4174428100 1436549834 +1947471040 3301751903 +1015708036 1343851624 +631105044 1854988648 4245233144 +3598808257 1858784214 +2483530223 4145054520 +989338461 831722356 +2449757646 2865959769 +723021641 544681976 +4254518243 392361564 +4294062832 3662032835 +1489781304 2428882416 +1777032557 1777032573 +1778070155 1634767060 +2780885177 888639996 +2397665649 2834775272 3845447979 +2075637016 3660715227 +3127069656 4166484586 1112565005 3814966182 1212410240 1905202021 1905202035 2099115808 691767276 1905202020 1112565019 3903820439 +1102883374 3657708529 4087638008 +3288237695 2440800316 +1919762868 3590221391 +2351183287 1409322768 +2058118191 902919532 +4229119073 860359840 +493481223 1421877782 +247772746 857867186 +3383972899 2587009873 +3666251347 2542356209 +3461859533 2704349874 +2158809378 2987210901 +2826763243 666931956 +1794699099 3235957842 +1920594323 1068696001 +837691290 870864747 +3961034203 1043716510 +2138325961 1829156206 +496154193 172187571 2175886816 +1137193298 585158941 +784661809 1389836246 +323408056 276468141 +904243691 3280633058 +3824484119 3225988394 4217584646 2984370530 555276474 2413162433 1062173092 3204341627 3025959908 +352528945 3184110785 1157327654 +535837925 741334124 +1206466509 19060644 +3031343603 1642656140 +1948091291 1996375333 +1803391017 646295438 +125249185 125249201 +4108804736 138416019 +4284850530 4217102442 +417659131 2340929960 3904882757 +796209468 4051468647 2550121703 4106269036 +3331738712 3250014180 4137299597 +489436791 489436775 +3423548817 3857061664 2772457303 +3857857476 3226736031 +1025042003 2167575724 +1470361459 104859872 +2637041900 2462934017 +1334683477 2432592579 +84988648 793522106 +3522204956 2579151623 +903598744 1628210523 +2433625984 828428800 +2012879995 3911079803 +2789287082 3623870143 +3791779683 739799242 +3195176683 2753255704 +21814037 553443850 +1286818932 843143823 +2244475111 2160907190 +1141162571 3558962030 +3750188453 2265698988 +749109171 1032565536 +1538123111 2507421767 +3126621213 2089470388 +97741297 483378800 +388005119 1730463073 +1447046811 2521760051 +2778285045 3329423827 +727930992 3177461845 +991576978 2623037125 +1855896112 1407130005 2637514123 +3163134318 1113437147 +1034502021 1034502037 +1122586346 4095792886 1061632589 +3693235391 3693235375 +2566576896 3538338067 3820968050 +3392777195 3302855772 +2652623955 953106092 +872377967 1243273390 +3805148714 1243473989 2277475646 876250130 +3213233309 486923060 +372806191 705568760 +3154606429 1556352372 +451830131 451830115 +3826121741 251906162 +3339315346 3868794323 +2523590385 1559495296 3944747952 +3076457186 203152893 +2902407992 3513586298 +1645826808 3369942931 +1923247588 1923247604 +3863382915 3863382931 +4227481203 558652675 1849060266 +1969494292 3767761519 +155254189 1045387076 +3264075356 2705879761 +2444891735 3203476198 +102969273 3251440949 +3879482981 3879482997 +707084049 1772242886 +4149142481 3745454727 +1972996648 1972996664 +2157170293 3719168554 +4249625251 1641711260 +4246841742 592041530 +1517038979 3679167804 +1507785623 2156471632 +3578443219 3002370839 +1330782396 1754229868 4243680176 +3410780109 3732793279 2996549499 4036293924 4036293938 4036293925 3594178482 +1875480935 1355133299 +403405647 689118542 +2653959692 300225783 +2604612101 2994599509 +850684510 1235060610 +2944099649 1147114644 +27757537 670301635 +1919298691 1919298707 +3933089503 3933456648 +1474431606 3470161873 +1060948803 1951617328 +3398922842 912845421 +2263444764 2263444748 +208658325 208658309 +279626909 3654517556 +3564970013 2650377634 +1331886184 533297813 1624050621 1624050603 +1150764940 1717639797 118125445 1236076139 +4181640606 4224784319 +2381062210 3334253130 2897659875 +1010222319 3408831547 3107456056 +2373197894 26122821 +2089129637 3852485475 +14801342 3322759330 +3256571586 3256571602 +1415862636 1415862652 +1273365844 3474613040 1886885515 +1907860827 1595493970 +905195293 1955786731 802499368 +2321574140 3519366321 +1574157714 1179872453 +1214361678 1214361694 +690028822 1438746794 +4185673056 2687153721 +353131910 2826385911 +2734246387 2171562394 2734246371 +3484744793 1498931221 2737827646 +840052856 1252150523 +1715785568 2697778732 1582461989 +784837166 2220540079 +1899909150 1662525225 +756994953 2863775347 1704731286 +1931634330 3643245693 +3593406327 2735259728 +1840750352 3356452387 +967422669 2468640932 +1627162064 2105976437 +2723211418 3426535029 3275536479 +2477143676 2736488196 2535156784 3936863537 +3212108926 3033644401 3808670294 +3224292486 2729821895 +824674178 3508086433 +118855939 704634794 +580958875 3236192805 +3777971246 1999226312 +1110593652 945406056 4142023391 2838800015 806942955 3676651284 +1910815426 219283299 +3053729623 4257751234 +2631723434 2579748507 +4156992494 4223707055 +445706435 1642769021 +87789092 2440846149 +2908153389 4155495044 +275940196 1212470889 +3854269832 774282507 +1897815568 583930659 +3711018073 2384836638 3814774569 +199376316 57727724 1898393319 +3343101631 1854674593 +905727620 2549030331 +423071617 863430656 +3427090760 3641033803 +2626410970 3890362805 +3175711875 2109446709 +1639984536 3527410290 +1492991486 346592969 +1448201839 1372059822 +2853741053 1313274594 +1947917999 390539778 +3595967866 3817891595 +1516967340 2439409141 1210854685 107229254 369573363 +2299535680 284708673 +1501104019 1820781690 +3944194848 909495155 +469625012 3300217679 +471008476 233875025 +3596782051 2190080009 +3513273528 1597031853 +3453265777 3453265761 +1549100514 1399069592 +3859325737 3600710297 1217976718 +4161785554 3187554659 1390580883 +3018720470 228196279 228196257 544050438 363961585 3027726442 +3255104835 2966296682 +2535063300 1661263768 +1731270716 2924029543 +3137688777 845445240 +1099846305 4012903175 1157800657 1157800646 3557561206 +2470441845 1118585148 +1964527421 2453978370 +802936460 3809656424 +942499473 3220255043 2973495887 1516143112 1750835049 2790550628 2973495897 2973495896 7894608 +3018051176 2543709611 1292592433 +241233231 4053111630 +2313489370 2313489354 +715256306 250601459 +1399898053 3448098489 +456685776 3931944235 +1695231922 42277970 2394251099 +3999737080 3924657228 +3823172487 1110177152 +732767176 2307871691 +159542394 1917895691 +3040087375 2414932824 +3477254581 4210933756 +4071868053 3417685929 +1297849800 2402902475 +3573129281 3573129297 +392837864 850271347 +1683090977 4132989521 234479094 +908596637 2510541577 +1286184820 3865069432 2084961887 395342382 3145181641 +2859714117 3749917366 +3832075844 3113802027 +2418541881 671103166 2418541865 671103144 +3691113959 1040810678 +868454151 2212112406 +3706883973 1456991820 +3023785290 3267097266 +3155906102 3487881238 1425809159 +2128913386 2884503885 +241695557 2783897981 4071656858 +2681758507 3663277912 +219711386 3991072190 +3606474213 1257176940 +2725726444 2244922085 4249637405 +2703312762 560170251 +2895441325 3752343887 438774452 +596815889 1748260257 283847366 +2968450991 2664318971 +571253745 2330334320 +2991026144 1848039225 +2863055724 277193495 +3821383866 2629966723 +3453961647 3313152622 +4213382512 635987047 +2465202815 418800424 478484682 77733895 422562124 363818554 2942693592 1519589586 1908680150 1995818741 3695742025 3645764908 3680168483 3524162403 1765931147 1746848566 24738018 2867009255 280379804 2354905343 1722776828 1661356336 3802408620 2187587409 3907562319 687234316 1989573508 720860473 3183250821 2989030049 +1314806497 1065947168 +358487007 2182694920 +3229870956 2393052517 +4252769651 321901069 +661815906 2068004949 +3294044462 2956610796 +3777565130 1034354925 +1857587449 1709759689 +2240436842 2731300050 +3282531100 398559687 +203346432 344233477 1371023821 +3681575329 1620477556 +1335912117 243379964 243379946 1335912101 +688029487 3186505454 +4197816678 1214282625 +1166992920 2296301932 +1180822876 673753041 +1772772535 1772772519 +348531384 1811234733 2536235712 3522131767 3074399435 +108500380 4103123015 +3924961792 1211637253 +3939315231 6331850 +2133030046 3268449449 +1955380422 2964788368 3823992533 1459373355 1220607522 3823992514 1862036209 1476150961 1428183522 +1056459039 1307360202 3785472929 +1660922299 2474127716 +1951103873 2480106518 +503308797 919650644 +2642465778 3821905395 +2185516380 1114810060 +2777638972 4253099240 +676744292 3822731625 +1917895695 69510030 +2201862520 305631213 +3923410535 2314533920 +1416919633 1878052292 +244622825 348004524 +2085608656 2176359285 +2158240516 3540662684 +1562832197 3913778074 +3707108608 1888194048 +791850663 3992297181 +2017284173 2466552229 +2091818296 2128707373 +2446870297 3312965784 +1848392259 2996811644 +4198030626 2113462826 159652995 +1098206601 2494107310 +2597342194 2816970227 +2646840413 3391252435 +1486978782 1198447871 +3675799056 3675799040 +1051164915 4053474329 +33454210 2778182819 +997209819 997209803 1822841554 +1358718585 3449134136 2088622599 4256522955 2967943741 4109564265 762807723 3911098310 3959553793 3157954846 221961450 1910678809 112070608 4261221266 3084045204 96504615 64819624 1330334732 1986781967 4119034111 3773417035 2626178833 1633489826 1654094761 3646045108 +1877513957 1180815400 +3401572486 2754092810 +272319036 3377022065 +2004243031 1715707622 +48709420 3188224599 +3234308213 323608847 +2408043153 3341843489 3341843488 2211478086 +868381268 3474586169 +39955388 4109112084 2076268775 188834109 +1047472011 3556458452 +874020212 1988984216 968669151 +2687263132 3236977745 +1377468590 680377145 +3331957356 3331957372 +4058103023 3042733102 +3998095272 3898754416 +1939282138 3504086827 +2004304946 1119902387 +3489107684 972374933 +1766835574 772731745 2046536483 417355091 520710918 3365720285 1447507348 +2565431304 3210882187 +3576397294 2109086318 +1340892403 3290622618 +743754754 3413976885 +3466757772 3587821153 +2744646630 1849789207 +3375160348 174454941 3449716743 +779431831 779431815 +503180263 2262061197 498752694 3455860968 1818218468 1223820281 +3904499436 1219698071 +2157530270 3948843074 +2135818254 1976178191 +2606111876 2884257927 +450314384 2111768471 1363467351 2879722676 1604017306 348243683 3235784121 153565460 3828959031 3391462079 +2904625247 2775399538 3926705544 +1151890862 1835051499 +1365074243 1493179498 +3747399251 4060886202 +4033430433 380991094 +1887331903 2836629325 +2917516339 4088650842 +3968430180 968277080 3227250025 +768823814 699015031 +1307337176 3098279326 29259629 2822066945 3690914556 4126419366 2394770472 29259633 3690914539 2838844567 1958552363 +2316597839 1802024519 1557590486 +837674823 777628228 +2057832206 3670617981 +3826417997 1445039140 +1119051254 3293579622 457493975 +3400067906 1240094965 +971050988 599653120 155979905 +1073615412 759839368 +493598130 4279611515 +888970841 2495963454 3555925262 2795132047 3266135560 +3833139918 2023266905 +2023914872 1607173101 +3224486505 4149545806 +2796823196 592389448 +593310910 1773799199 +1758364483 1075356284 +2105416971 2559031380 +3361186913 3271017632 +2663573611 2663573627 +3376395160 3806798131 +4257315862 2375440049 +1624017850 469759453 +1889812302 2435132111 +460770732 1925588024 +668473805 2251333042 +1832405694 2912790793 +3824247988 107483400 +875214900 3120613304 1396701647 1874566025 3870707871 636937300 +3044956812 3211894552 +2529270606 3909609177 983588071 2697427919 +1669000238 3363949679 +1807865437 1095510936 342051113 +2831801730 935834549 +2145367364 491730948 +3263036781 2926646284 427686855 +3097324039 2798512406 +1474431592 1316740227 1440643920 3235275179 +3184756707 3184756723 +2991763479 3475715120 +1314293422 2345124594 +3439294126 1680331769 +4098303425 1291873984 +3939824649 3057396280 +2053125619 2557799834 +2023807722 3476594253 +3351404600 3351404584 +1550534738 2333847475 +3744547651 2643255932 +542174357 3774021207 +1945871518 1945871502 +1984435577 2893663592 +3659489334 874789399 +4082772467 2541113916 +1614845624 3099686512 +1741461187 893962406 +2166236908 2797758999 +3446978706 1233282750 +2255739173 2255739189 +1751985344 601715283 +2273897138 243889715 +3138630572 4189598090 2801806303 1277633718 +681338178 3286955850 +4263991139 980222663 +3984426586 2687957557 3582065398 +3800244192 1171667980 +3919652761 1639011799 +1806025022 3018798239 +3031885133 3370842148 +3216923443 195662170 +67294714 1249302685 5621932 3701950373 3289834197 4009570006 +2631182831 3519513390 +3307523794 235299529 2334640880 4288968660 +2947719800 1268898579 +1885939954 1938365082 3884676325 3884676339 +2242700733 232801460 +579525052 1558700596 +784277724 1927330385 +2312599837 456370356 +2171486509 3141611100 +4153221645 37675712 4159136193 +637236326 2445851445 +794605356 3136576087 +1547258547 1266611744 +1658454466 1658454482 +364748207 2018052858 +402966400 3037256524 1334185605 +1013311761 627959238 +3412422882 313570261 +2144602308 4274637961 +3709991824 2894005173 1089656299 +3049669576 4011635659 1194271988 +3155609223 2665121430 +3518953542 1973474849 3060449675 +1220359063 3428718356 +586905484 2648519009 +3906077898 2533373477 +1449054001 675293744 +2831999202 1965001292 3362137646 2823973893 1991654254 2626028501 704113661 4273998796 +643148024 1356398189 +2848101671 1683016822 +1061446144 2561033747 +2594397973 1192808944 +1508897532 2284764327 +3513158412 2624240439 2959926241 +1807555664 1907280632 +1166463402 700709734 2693463570 2693463557 2626353078 616821649 2790585280 490475163 +1219689840 3306251741 +1413500586 1262212493 +15378864 560537621 +4215921434 2940463595 +987764668 1791319281 +518979978 1010789435 +925199595 925199611 +3140990124 1689348823 +2044597497 3059339173 +2102702985 3579224248 +1688660503 1604688309 3845922690 +1694626533 1706527343 +2533444912 1871737160 +2758603678 1971552703 +3371059272 1035861347 +3786980029 315488130 +2841603521 1637423403 +252277712 252277696 +3686665431 3274585702 +2853883943 4013272438 +428154308 462380496 +3988774754 1672330541 +1389746524 2942323455 +689286204 3980687383 1802516455 +4045396935 666852107 +1339675877 2565481580 +2349639283 3941205786 +1889291637 378103994 3908780627 +2730783615 496753980 +512409128 3433785132 +3868197302 962612394 +3050396113 160457734 +424581441 2982664817 +4068051981 88633281 +3985562940 612323559 870729063 +3766144415 5353822 +1682606993 1228430646 4291070295 1228430625 1918481734 +4079112507 4194689010 +2663382979 2435373479 2873073660 +3808860739 2791626602 +3570419223 3570419207 +1121454857 2299917860 1125736238 9605708 +1367678719 833619009 +2076572084 2359825999 +3172275572 1565059116 +3436587997 897140693 373543582 3577919920 3054088235 3456751089 3070865841 305283603 897140674 +1517069756 1873226198 +283711600 3814584233 2113417834 +880427984 1819852924 +4122057069 3503286969 +64512457 3869378696 3600936814 +2313202645 2410935405 3786309724 +372287550 3792503374 3146214110 748214687 +1606851573 2454552439 +3162034005 120480458 +3287171178 143718010 3658442445 2520061331 +3784526486 2967366183 +3101095270 1617186711 +616710501 2202700195 +1758932966 4039141143 +4283434724 3472546047 +4058103025 3076288358 +1175550859 3632626644 +2010702443 766632078 +3840645354 3840645370 +1814908192 1800431980 +4013222393 556180936 +1636950040 2963523035 +3302383147 141966754 +2473688211 1561340672 +2557690125 3690951995 175073138 3747600485 3747600498 289426644 +2522394288 1816967092 1879019037 +2998132971 2998132987 +714848061 1344369940 +3946936513 420550592 +1048925299 3739480346 +2206711734 813067218 +748702537 2304148472 +275262022 435850273 +762771902 535820650 +4011233806 251173774 1854401551 +3966377711 437170744 +4085355615 4085355599 +2841949734 1763946018 +3635437691 2561139122 +2169484650 1130230950 +864929498 2627628725 +735229748 4109034007 +3411279730 3032139976 +1362542479 1747947032 +1527866427 472728409 3024160031 911280206 +1690188548 86906873 +2289574326 2333938065 +4272597037 3246285957 329694930 +3121664621 1434141074 +1891256878 2739062393 +2513730723 2155885706 +2606249878 568295729 +2671272686 2479078575 +2869177058 865930684 65621065 +196964106 2234895547 +1400404853 4146748684 +4227940476 4227940460 +1038756525 614542930 +2364538318 2882308934 +1210556409 3010415582 +3570413680 1941717077 1941717059 +2316460126 3102585846 +1129575420 3970770352 3970770343 1129575404 +3596055398 2796091559 50294518 +2309694101 1674979642 +3327273976 529531008 +2615654681 3115281103 2261279326 +1089409695 215172129 1261199708 +2476514138 3112734379 +7895563 3366461250 +4233116929 4233116945 +3129804389 3346739335 +1974133116 3845655647 +2555360929 3422332614 +760140792 1259843451 +2407595747 136756679 3406905180 +2491375269 3517082570 +1955455902 425546175 +493868351 2517414462 +3479902462 131224607 +2726307644 1459143532 +946078132 2185000456 +3461857428 2092659422 +2806960157 398140930 +1711775468 2315201943 +3307883549 3889758722 +2335481290 3990119666 +2210797254 2800289481 +828197919 961715767 +1163860872 2747086172 3166197515 3023005495 +1279299600 438020328 +1397931638 1501868212 +3317188451 2753061066 +3391376708 2066063903 +3000846761 995816728 +1522961343 2777546174 +1094678453 1869006620 +3165724061 2815532596 +1831027167 697844380 +794635984 338121967 +2911508837 2506488300 +2475371811 1725838854 +2866546257 2866546241 +1362591465 3277637848 +722912298 4275490331 +3667574911 2482164929 +1609153412 2163355871 +3825635673 3825635657 +1548166363 2406776990 +1010731405 1936892468 +715534774 3651158417 +2086374665 40849951 +2788576396 863666273 +3428266626 3428266642 +2276878712 1989361952 +432204669 181974484 +407097440 1726454100 +2006554757 716761277 +3033478978 550967627 +2193155078 2668322192 1804364369 +1941191697 901418704 +3251187141 4024279037 3568504090 +1260382445 3513994762 3497217140 3944913287 +2423506767 3041050958 +2110325104 285280733 1936540483 +1761519243 3554684098 +659763100 2213802631 +316137751 1988211513 +2016200614 3565046359 +3515500546 2970384413 +2835527990 1162448913 +844723294 2698129407 +2772926244 1401759167 +27867783 610738838 +2720261660 1518550545 +4111680578 1562290377 1615049848 +1966055975 2700886902 +2858217322 2588730317 +3167172447 2359044766 +4285946697 3198042030 +2751512188 2838224177 +3600510152 3600510168 +2585912241 1858781760 +302374081 2451409382 +1835252193 352165174 +3744259580 204021681 +1127315291 568255570 +3411587288 4104021019 +1464730837 3078883888 +2338107349 938003530 +1627006853 785135180 +1481421992 2831180907 +2550839492 4277873583 +403254469 2607905306 +1360957423 2719782190 +2610761861 2270503100 +676562552 4085034733 3570766601 910645447 +355078764 3174760449 +3509033718 1812191506 2048477240 1745081046 2183831033 3769986764 928575815 +3036247031 2827107938 +571951781 2151007060 +1090846624 4208879859 +3893831684 761126940 +3163189759 3438376040 135937980 2201713794 +1044515513 233880172 3136741672 3085662289 +1220963200 274414213 +3011857348 3494867036 +2621720500 3868535816 +692825818 3693363517 +3261538614 1046038535 +1832593235 1193207724 +3460121663 2804218859 3916590888 +2388537446 3581838338 +3374163999 791170859 3098519774 +1993065556 90176184 +907172877 2340249147 736553074 +251410941 2484029762 +3026443804 355902993 +3986567820 68251296 +2973984626 3265129341 +3984778011 754564 +1463096619 736441119 +4175850460 2931542855 +3403505262 3403505278 +828945784 1070967789 +1467414420 417185785 +2070604724 4249947215 +2450711458 2512148483 +1896963105 1128825338 +1566127077 3631001964 +943049478 2192480887 276160881 +3652108525 2602153220 +3553498572 963399713 +3626744521 366414446 +3731201010 200572389 +2349639273 1349366043 1582321624 1582321614 2085609791 3773429592 +1440876358 2026992439 +1304415330 1825932157 +559053586 2262285637 +3541456104 875014443 +2512850620 2512850604 +3018669190 3296085729 +3919304254 4266804127 +3138857625 511184584 +2974607762 3758056057 403178600 +3380127344 2565734979 +3597516216 199000583 +1607230319 1036027822 +41667870 115598911 +2317812016 2875645589 +2892582849 717786304 +4089279209 2077272766 +1849278060 1161817983 195118550 833702797 4179885556 1678819840 801278459 4041655297 1011256705 1011256727 4041655319 1076797052 2831884152 +1929469057 2351210240 +1647934133 4198442783 +4086595443 3854869004 +845485157 3122600684 +4077267180 170531622 +2759171854 2759171870 +1952439409 1952439393 +2633330945 392225920 +4022674667 1582898658 +2477217210 711717853 +3659441067 154904098 +2480729739 3517691565 3382337788 +3370946644 3145151935 +294703954 2400916454 +1137086558 261440511 +1713314250 3999703160 156022163 +812160387 2420767082 365572163 348794557 3080936746 1378600304 +2317023353 1768659016 3782551144 2286099439 1768659038 +1011129235 1929439340 +979136630 1735287873 +148712364 4057919412 +3801309425 2667682672 +264019955 2910678368 +1104122208 4190231077 +2334233273 2133839052 +2146428035 4164452704 3425370975 +496301349 2184586845 2184586826 3061705018 3140776675 +1881528286 1771229801 +1709663745 1816499072 +3170601729 1574613181 +370935342 4229806713 +1188857829 2079137958 4169965668 4169965683 4265799200 1128842253 1821303191 +3855138823 1877479698 +2554672841 1748180283 3071362872 +975832062 2384742601 2034002274 2719921929 +1088952062 727462345 +480054969 2609643019 +3759595251 2726773856 +867117893 2713787788 +3036389445 756894860 +2822976029 1490634353 +2895251094 1071668775 +1734360075 1613488952 3346957634 924884469 +3309553373 3569214366 1669798187 +4226527567 3808960334 +2821844270 4103626607 +1030565041 1675451056 +305456972 3700961327 +531826269 679200692 +904161780 4262836319 +3556089335 2728897478 +2615160882 2404357082 2481708723 560157342 +1570752494 1351072687 +2325950905 4159129128 +3210299512 1296050162 1779952327 1847062788 1420847820 2978813165 3399915350 1847062789 +3644534275 507073008 +2851504451 3520607050 4253475237 +3264694643 2431906551 3341328396 +2274884706 2158565453 +1009455615 3066909800 +2113632820 2262917081 +543288495 2837944174 3441401105 +160570234 2332115211 3724108866 +321509436 1725916785 +24583475 3369721385 3897095454 2172843853 2172843866 +670935675 4161050649 +120134174 1672748329 +329210171 517568498 +377785227 1279511938 2030303947 1549430850 653493515 +666881995 1576279188 +433618456 1460875187 +1642938925 1642938941 +4105918896 2180362524 91066761 1214539288 2180362507 4105918880 +3973971017 3269019833 +42698259 1782911127 346296300 +1210615405 2849826907 +1884016507 1113038514 +1244093839 2063086139 +1313267039 2559474846 3945812450 2559474825 +522790296 1073405159 +1414734259 1910377690 +3919149965 1392436320 +1179805286 431436417 +226944456 1382387863 +1863386453 1024983615 +677411939 677411955 +1993092012 3806715095 +4088101227 1733680045 +748427714 3825385313 +1880152561 1307557363 +3689377607 2220115430 3689377623 +732859138 3318010915 +3291229940 3314412047 +3154040852 103688047 +2950466842 4063371261 +991135952 3485491043 +3102647882 912840230 +1450371637 1450371621 +268902908 1900328484 +1148613079 1127599662 +3153598281 3480654559 814524398 1533828025 1533828014 +2422312881 3994766501 +4126346333 2325509748 +3497561945 2261362952 +2609612626 3099071599 +3316735663 1329411052 +2210234905 367807230 +1686420848 2627279580 2901817173 +4235638735 4235638751 +470714392 335628709 +2023155695 2840266104 +1900027399 1324303638 +4258487653 4173071866 +2720248618 1748175634 +889359240 4211189515 +4219819023 31675288 +3302063592 1737286765 147630735 1908920394 2059918954 +4174552865 4174552881 +3154356093 1992337876 +2976062170 419644715 2334515893 +2653726092 2353568631 +91235031 1720113254 +2216927467 1478691179 +3746699185 811079232 +607100570 2672913506 2432085099 +3492273406 2898322399 +2653375423 4081325714 +2771502817 3999011872 +2445040795 3627585064 +1628451169 763214783 +449085570 2773896373 +3823931684 2960829199 +2148210914 2831715886 +3680950176 48591091 +2886150108 3602240076 +2841351029 559798075 +410950647 3055601833 +841899683 2690941831 2717842076 +785866776 789149898 84322168 2015374398 +3560498414 59794095 +473969916 177070468 +3936103612 265972711 +1230600565 3973722940 +2842336125 181227618 +3108998811 1396538898 +1990888022 611829095 +756146402 3575972821 +1015746073 4008883966 4008883945 1743204702 1543000527 +1848591401 1295020197 +2723113582 4043606831 +182833479 3783402980 1634113677 1858630358 +1273442445 166817266 +7745818 3557772267 +3549532224 3404902924 1311118533 +3031047095 516530448 +3097107501 3348781778 +860834180 880541738 +1648371062 553318609 +516590991 516591007 +4226003841 1676811953 +221221427 3449113015 4108527180 3449112992 +471825850 524890261 +342288211 1895704485 +2247491072 2247491088 +4087325259 4087325275 +4049624599 297016870 +1661765735 1673188166 1661765751 +1875510923 4054611193 2248690882 2511761781 +3305873565 3867781762 +3111669806 644233337 +3988767487 3988767471 +2041023108 113184223 +3716369561 3716369545 +3914000105 703168718 +65203257 1463410088 +3922300889 1256943273 +1655550405 477026572 +568684214 809167878 +2175750583 1627080681 2420621820 485908391 +3406968717 1173168161 +4116794916 1814954687 +206779786 4043130939 +2546179685 2927759754 +2513841214 392804703 +511962964 2933071491 1571930416 +199327131 199327115 +559719503 3538616972 3554060366 3991601841 3538616987 3554060376 +162488697 3088478568 +361818349 3760106756 +1925997334 1224985898 +1749432741 3414998700 +789308725 2068305131 +3009076713 1091261902 +158634431 2709614526 +2311477348 2511364318 +1833845435 3442674788 +1849236472 2078738285 +311620083 810738053 +3858593408 2382465939 +3053417360 287501219 +1566818529 2289091366 +3454901023 4158046625 +544957432 1719920412 +1992380700 240299793 +1610293965 3847735474 1610293981 +435387163 4115319698 +1845134605 2183298133 2604651350 778007396 +4170948786 3503144601 +2884445902 1951667791 +2727595671 2242787238 +2308364379 4084635474 +1773693888 2625485196 1773693904 +400087069 3754525823 +2131469081 2796671998 +3172731442 3844344997 +1740628555 2651929602 +1268038145 4230008704 +3572800763 1224791109 +3427526234 3427526218 +1225051546 2358225277 +3168613662 1849335359 +697300545 2929764416 +1221180501 3935533532 +4232289897 2097936414 +3141432427 777077858 283525653 2944010012 1575928472 +1552591510 1145735729 +3685547132 3896418864 +728392832 1351106637 326973732 +2039735926 3654536135 +1818035820 1818035836 +4202146637 4202146653 +161780663 2941502499 +1957568088 102352027 +2775887044 3583164837 +1378619067 1867016069 +3681913694 3813453015 2830374502 +725110995 3701947450 2269362519 +1486526612 130066179 +3865047094 524241409 +2040258078 1073319230 2388568361 1577348671 +1644097610 2376586209 +3318607849 1278258136 +471072839 2598631800 2054975433 920753477 +2997831448 4109738149 +1356005546 4012918034 +3828491799 803638659 1374811696 +415486111 2604755550 +4003225516 844339878 2053340113 458454646 +2215599199 1745946017 +3418166974 688758264 +1490627910 602031393 +3182082644 293236649 +2716049986 2716050002 +350499479 467840515 2050728870 +1078147812 232109289 +1559247418 2814083331 +2681564599 1409005328 +423059619 2785690291 +3165141123 1844681252 +33843292 2297448647 +1197045343 2966771592 +3321008449 403256876 2840330590 2590033236 3226984229 2654519195 1130929816 1381713390 469708140 +16777618 2738758340 367277101 +1548992710 500725665 +1408134764 2354566167 +2025678507 3173556020 +1264046882 1264046898 +2209527781 928480634 2562361098 4002988729 +2618341393 1476120644 +3713977759 2539253869 +2387062850 2934618717 +1048413705 3478543020 +461824969 509121902 +2875983128 4077651149 +1921028961 2707947958 +1461718913 1461718929 +1391335182 2597210895 +3706216320 3065497092 +769122248 4074063837 +3713929249 2618516458 +3331574386 4238841941 3331574370 +392750984 1646557963 +2816179169 3536915974 +4280057014 2363327047 2858607086 3399759789 +869126522 117490443 +518494416 577819947 +384680504 3642189280 +3534573886 3130089739 +236380178 391018157 +2970969707 800078452 +2997947255 3283422288 +3816411319 3485700112 +4193369568 3639727737 +2799230829 342341764 +2992915789 2029429823 3888191140 1293186043 +3906331412 2629073008 +1195606637 2621854084 +1569853684 1725307611 +1996017522 1634846571 1549142545 +603931749 3781548177 +3762119406 4003642543 +617102218 1922312946 1899346491 +3178931680 672341939 +2390357200 1565561131 +536490208 920318131 3368456761 920318116 +3386598981 1598278762 +590719509 1899674810 +4246177263 2083393822 +33399987 2414600247 +1865780180 3578463647 4151349124 2923519295 2923519272 1865780164 +446000250 250584386 1396294667 +1857202723 39524140 +3517878322 1204616869 +3046782982 3888525687 1409277510 +3477559085 71074015 1529359236 +2832320790 319552993 3628043687 +3844991418 1303084181 +81277606 320596454 1180154711 +3261829566 3444993567 +1928689069 4184728880 +2953847607 1456776688 +2339070792 3255650891 +3557906866 3557906850 +3618433416 2737765628 3846611125 +1711155359 773452360 +3367853499 348951678 +2346304085 1016539313 +357720451 330268970 +3900425889 2614734688 +3551101229 1624660434 +1084141055 1084141039 +3612748283 4154725938 3744211781 +2897151529 1605110309 +956694633 3648666073 +2701768760 1949779652 +545294250 545294266 +1010036666 2143445469 +2505561250 2505561266 +333196943 3564320475 1326568618 +2931829153 3112274016 +675694986 1810741766 +203242030 362709870 1501616498 856871087 +991013677 701528018 +2869515570 2899427546 1907432883 +1485878637 2336206171 3637353092 +3926264210 3926264194 +1929060993 1165272497 +4246190260 3307307922 18956512 1674447051 3065950154 1949169448 605882412 +4106476490 441646843 +897012943 721053452 +1712910837 2923750570 2877606238 4235456849 2923750588 +860967910 860967926 +660538563 1623446483 +908178619 4061102692 +623324449 668285690 +858386031 1236380090 +1016921689 3813458238 +2271204738 606860248 705857513 +56624740 3022655337 +484720446 3108998815 1463649374 3108998793 +345305858 1752861749 +670315416 2104309851 +931963045 392225708 +604946742 1543232806 +1780196852 408137464 +203220825 3439943736 +1625767683 3388103729 +4019679202 3643970301 2868374498 +437248645 2348914508 +1272940042 2755654037 1428155313 2061500845 +5687018 3308721477 615290150 +2028165533 3940946484 +123821222 1145362753 +3606691842 4210339869 +2361751839 3118312392 +3968430243 4284240010 +3558924899 3873891617 986272861 656805190 +1435653525 1247590812 +1753089724 3967947760 +4024910545 2672818861 +878415612 827025174 +980886844 1684517352 +4141237419 1045305634 +419386147 2096095242 +921064780 2239590940 3096987319 +3270586694 665882935 +3356707328 4133322259 +137213667 3270960988 +1284431630 2464752399 +3360492295 150382600 +3363390081 400797952 +4261716150 2538143377 +3989324327 2701658297 +3894038244 3894038260 +3461415840 1770566885 +1832144972 895117217 +3899558987 2716786869 +430695940 3492230300 +3504820741 2357610627 +3349052120 4182883360 377184795 +1183930960 1724984309 +3102786055 704737558 +517610638 2338343826 +2656634256 3595172583 3592667580 +3779205129 2752239160 +739964970 447203461 +1714788291 2841503740 +3757640224 143814965 +638793569 1363160502 +1821136490 3365005942 +3646535558 588634618 +4157379640 1326273585 +527297057 2600964576 +1155389713 865216161 3474116083 865216182 865216160 1797045719 +3380461059 2183553520 +3388934776 1317569299 +2564407217 1338557370 +272699101 1936352738 +3175725372 1744333302 154122873 2365511939 154122853 +763798247 1621679858 +3299341893 3647516300 +1653439681 1653439697 +2310066282 2310066298 +1225949305 3537589218 1312506934 608815267 3537589237 1295729296 4176729835 +3028888927 2465361032 +1570448997 3493694012 1570449013 2595805597 +1913801200 3114056541 2194302147 +3613559657 2385885179 427909654 3355554260 2474387020 75644755 3924422021 306849491 +3755710583 4276896719 +863075690 1705536973 118435166 3659850143 +2505526234 3265785247 +2123517237 2123517221 +4173103488 3808961883 +160193223 3472025430 +1560164711 57579876 +1787917472 1787917488 +365889413 3655915098 +3752216359 949125049 +2319107915 1669119783 1925984806 +3221013054 2707183326 +1396569904 982261891 +365197492 4165600079 +1202021364 828392031 +2430186911 2780358984 +956797751 1269927860 +3901147758 2050009913 +1023888504 2323472635 +819135832 832680616 3381411452 515661591 +2145704875 4244590902 +791037372 4114597607 +932179266 77447005 +1398925433 3156276862 +4032349157 1086087532 +1110646122 2692173261 +911976236 3432678465 +4028392941 3920917531 +2732433039 4058028814 +2942764148 2650744622 +1472833648 2725521493 +3478922627 4044295484 +1252365337 1252365321 +4124955400 338900363 +1635930731 3945250420 +3786015702 2744029905 +2506830301 283406891 +3251709407 4215184926 +2651804830 1881289919 +4278996898 576805909 +1931635016 1931635032 +2307621558 3219058954 4109328534 1017037969 4109328513 +2109719637 1239552476 +1041685429 1929108988 +2395577886 3848530239 +3320479471 4278937714 1619652140 +3419255688 989690548 +3124231990 1546043911 +1992439501 3233563812 +568608522 1683739821 +2260757927 3354172918 +2680936897 216288998 +245818861 2229354158 +4122803788 612651425 +3250208530 171002181 +866154192 362482037 +3845443916 505772727 +97812873 1000189773 100036601 3062360750 13328179 100036590 401021024 2262070175 +1243038453 1482502284 +1893266533 176732908 +3447910053 706588076 +1989840858 2404414507 +2708031607 2411533126 +3416365175 1038702706 +1664046545 4102297616 +3165623784 2990871555 +64038662 138440289 +3600345579 2634544143 2634544152 3851366037 3182968052 +2267482387 1556330989 3581102316 4156479270 4034644864 +3746197284 1103542543 +2823426796 3634088328 +1174164775 3460279162 152663234 2086087995 3761634698 3323961548 +1925178861 2032285778 +241470908 1392505239 3180219116 +3176246294 934158130 +739992160 3474709811 +4195366433 2679370320 +1268821274 670072829 +761229793 1312834871 743092060 1848443428 1312834848 +1655262428 1423632 +191730449 243172304 +1804157741 1981071323 +2053872993 4224266567 +3959009495 2083195992 +3972901822 2244303881 +4138655501 1648959858 +2599205935 296500718 +110181266 3902850757 +304730891 165066142 +2850180205 2442697637 +3206858846 1156017129 +9663369 1897849016 +3908282147 3908282163 +2641720855 4142458416 +3545814579 2374513619 +1508277831 3436759488 +2220588858 2517190731 +670935679 1934845438 +1513638188 849031255 +3864489390 1235331311 +1691935127 105833726 +76049175 968922406 +360217812 2828023336 +2350701604 1174892056 2728934308 +4054173627 586771300 +1569290406 3848858967 +1117065332 3462888268 +3955536002 2829180067 +549119851 1471954479 +2212719318 400348598 1030470861 1963011825 3685634666 400348577 +2221228366 1205839749 2856516815 441864146 +2839117975 4236602800 +1222135981 1502019652 4249348379 1099268357 1099268370 +3870086077 1290174440 +1747251184 1382340493 +1521227753 2783552462 +1439197054 1855764860 +141320587 3449654722 +1272994139 3442256452 +2793248142 1726221081 +3000421876 2301148255 +2818262972 747760881 +1907424861 1453354082 +3927628167 3509901253 +2085103663 3567822872 +1500773639 3633795606 +1305667173 3892359418 +1602939000 774321052 2645311201 2662088823 774321035 1141939464 +2635176077 3909401586 +1766360685 707501458 +1627458460 2234390096 1353008785 2234390087 3031092108 +1800594996 1646037600 +3425646397 3073028660 2352383951 +1691743699 2412903212 +4083752955 696080420 +4042249035 2492047106 +1920813996 3352034496 +725823165 2121151793 +2521218826 1578405503 +3201537248 4074145229 +249052139 1467104354 +403353355 3822161492 +2302872764 1770684396 +168879544 1171776053 +3477572532 27323481 +1431520491 1024818658 +4275230743 1021979686 +3784896258 2222626360 +1477970038 2600828134 +1784753180 2465755143 +2204789678 2391245551 +4123481313 3385499168 +1140025947 1395682642 +54812030 2728340809 +596265253 2245892701 +1417869936 2049982019 +3922112709 826695990 +2216428199 3905332137 +1645649586 463196723 +2036347984 2209974184 +1103893248 2487347461 +2586966656 1017993093 2095195682 3755488432 +3244630855 3107358934 +2207434879 2668732392 +1152716512 151415475 +903165570 2103606391 +1430957086 1653404479 +2676675038 1825661789 +3634896791 3634896775 +993026722 605922219 +3198960070 4012608161 +1953669537 4050940022 +3307802486 388078422 3584251591 +2536002507 3212568724 +2878537858 2590624949 +2834457525 1786426296 1464645683 1425861105 3903413669 2303185523 4005814776 314958297 3722429192 4003816123 3391118989 1464971610 2872405794 +1705267202 3415653348 +1678009779 4215021882 2498730921 969453982 636229837 636229850 2007694854 +3285092436 2451610671 +2682765835 3302389570 +4070064908 28419335 +3532243278 725444782 +1208420854 1494527569 +4031379146 3028711474 242188283 +4231018773 350870538 +435139423 861363870 +3907115264 2609421075 +1504935899 278021586 +845556580 1342976868 +3285468277 3285468261 +1295528246 74427686 2558103690 +1325784541 1128022772 +3925264237 1226552773 3162239122 +2307791804 1090057063 +3759910205 2137200693 +3802278790 1263174625 +248477758 248477742 +620588114 2364638483 +1948540621 1948540637 +1075117075 4094218746 +1585615291 2190174564 +1947391127 1352968614 +832837942 3351123125 2118036800 2090786083 1532211217 +3158829294 2841378158 +162938002 1894854553 +3086475375 439773182 3086475391 +3164122292 2555895631 +171220728 2874192256 1447521171 148258939 +3018166175 3512801118 +1509325750 1509325734 +4226621979 179305190 2974593170 2974593157 +42048537 1682449500 +2213536623 2879727291 +1991412483 4095580989 +4204609017 720966530 +1648902527 918493950 +700710888 2810960427 +1904437058 3315517789 +2092415229 3829511156 1041406739 +393537174 393537158 +1098326966 3297589137 +34616083 3424781696 +295564815 388387857 +50327996 1961462503 +3765715793 2818963600 +3733906376 586191837 +2095070236 3050701059 +2247800604 38825415 +25950294 3310874481 +2440857388 682557375 856214103 +3999072635 3077133490 +3947192735 2372755221 +2720578966 2973451894 +632973619 2540936012 +2881967284 237997669 1112880904 +3961760936 691661012 3961760952 +3709040463 1420087630 +1681896575 3089335868 +2352876615 2174289643 +801052282 2748342795 +3160872834 407503285 +346166580 3975553876 +1251470835 1613469068 +3464667369 10702552 +3187903387 3130311954 +1214766808 3548630555 +865857796 1115449695 +137809866 370506035 +820835072 375301772 +3144607501 479574386 +2301040327 1654558131 +400818853 1089481146 +3292258613 1049720163 2773262118 +3525985508 3163190015 +3302383139 7745802 3591327495 7745820 +4066228200 1904771645 +1197886568 3456780203 +3013364597 3163860051 +704508274 169629453 +633203346 4227351493 +3526763098 2722559523 +1670673209 3761122405 4180562869 +243457160 2663788028 +1804511524 3646311076 +1533641309 1533641293 +1661611729 2406599672 +3186505461 4076897212 +1050264112 3154948501 2633731484 +152259669 2657167818 +3317887354 3420594973 +1639302199 3492501949 +4257371262 4257371246 +2761130264 637096160 +602061759 1022201278 +490957097 2145232857 1844821084 202748057 975080344 4109500373 2165540996 +3117666676 4235377039 +2111542482 2527074683 +1816864650 2380864608 +2732146538 2334622149 1042768550 3321811917 +1865561935 1527583064 +1154807305 4167832863 +2772768453 3005537647 1969616620 1913165241 +4198169588 2200532681 3945503304 3945503327 3738870041 3935960468 +4271270601 2270638519 +1382597769 2750152618 +3102935253 1470646131 +2437489069 1572178584 +1239236312 2177401583 +1209320933 4221453578 +1164772014 3425681646 +1951444231 2258257427 570450432 +2632919218 299925594 +4223377587 2163227680 +2886262803 3841506810 +1452709055 235677886 +2308727405 4077133049 +3887432762 3971943949 736811778 3887432746 +3030927295 602468776 +2049013721 2368850114 480816089 2309586790 +3509778772 2153924265 +2148450196 725063161 +3787414556 486076918 +1814767825 418464016 +2616485213 3736834420 790169771 54910274 +3186505465 4144007656 +614334910 478509906 +1910640678 1826581441 +1983618404 2212021353 +3888912699 558610413 +2002797048 3834108283 +2824401731 2991590740 71493117 +3456518073 216197160 +73948593 2413218881 +1409856018 2844891309 +4169660674 1839954966 +3888644549 2540341488 +806236672 2790831635 +3356133757 2916216418 +1308148625 2162378483 +1542645773 3429059684 +2249941743 203210286 +4234693784 4029715291 +870867110 1923794929 +1689704865 1020834224 752392310 1689704881 +2419319087 816545016 816545006 +1112202217 1155018702 +2932117558 1433339143 +2232315536 3048997116 95947957 +1734105986 946081186 +1968874098 1184409659 799914341 799914354 +4132992916 393055999 +1268081102 3391682383 +187121695 1558579915 2915692744 +3107425619 3851630765 +1004387406 2349821657 +1254108376 2344907500 +2467856230 4119891358 +355543845 2171005754 +3927474960 428045672 2823346258 2840123880 497248619 1017940229 2492879395 +3784978168 498593901 +1957249291 2843799608 +4282220400 1037016387 +2521243661 2667017316 +315712934 4137669863 +241970934 3692239928 +972094060 2723821591 +2069844700 319778897 +3006276895 868904904 +2944193948 2944193932 +2285118091 4111622338 +1857866729 3176064395 +2959449939 1531046871 +2603519519 458240280 +408970816 2946853431 +1591486670 3642088396 +2488663074 3607174818 3534788907 +4055647544 4055647528 +3780954477 839980676 +2491723568 3527716291 +1472110600 2763232682 +4263723757 2803868123 3107282245 4269955858 +3042733103 2944290286 +653564109 700341390 +1649658189 652606836 1038498469 1649658205 384164914 +1206685844 1160531715 +1063843186 1144676965 +4141678687 2828035339 4243035528 +2634394659 2829208848 +3213446729 3458612472 +1698521333 1698521317 +1260458203 961432712 +2137747312 1490836107 35338760 +1535514619 2706811602 +3614169279 3720754344 +3594659435 2087806997 +3747359274 3356909581 +3713864277 3818061562 3464747996 +1434342182 2478587505 +2891994439 2728804054 +1880375574 1786721782 2246210983 +1969954868 195277273 3163380820 +3122990559 3881096712 +1785007938 3534281806 +564258190 2145148569 +3412464700 1840372337 +3973074428 3354051495 +1593516348 3243594097 3243594087 +3142242755 2580035050 +1632883531 2180357917 +4270630580 1904878344 1802136921 +3200694109 2949818228 +994480577 994480593 +2656360848 3482484149 +3911985150 2517169506 1915146718 3072817951 +4268448150 2128953975 +800103902 4043867241 +267138215 1195845284 2736755769 3084313334 976930164 3902969257 +2651192553 361100787 +1500370090 3720942755 +3128598825 3087774607 2673976356 3087774616 +910833274 677017411 +391169609 4247266552 +2925675657 229761966 +2006799436 2907261600 +710147802 2174926521 +4049334793 3609133413 +923397328 1956629365 +2879269558 581322902 3757915271 +1105668710 2674468450 +2509365871 3819402414 +3768252169 1327492604 +1324190080 3220141189 +2618593585 1090712093 +4000089577 1037487576 +1369951580 3043560976 +1678636985 989657150 +4163829396 1174061807 +423924948 2864057896 +3879472154 216928532 3947457985 +1885615968 2403237420 +1878006916 1878006932 +4002488821 2694817690 3947561939 1733607799 2205709500 2694817676 +1794548479 1631754088 +1167402248 940614792 +683146107 2705641083 +1141764423 1760744150 +96557371 1662829298 +2016807834 4293271906 4293271925 3057435830 +3306196282 3306196266 +706510031 1798822015 +831194724 1641746281 +2650795750 3432947750 +1955540858 4150770955 +3688848317 613066260 3718081172 1684091273 +4018040164 717521240 +2416419768 1678156139 1402461764 2416419752 +2099536420 3287901209 +1242134606 3672662735 +1407605945 3433297704 3433297726 +2361477529 613162622 +3826204086 3120440721 +556559855 260437137 670109486 +2921937429 2713767085 +1427623376 731841826 +851865174 1147122033 +3428566874 3640181701 3994158582 +3387943232 2148479771 +3787591395 3503609289 +2243991437 3159446244 +4011712563 1557376069 2668097612 2101359403 2000693669 +642804790 3891929013 +1109565630 2850826379 +3391589498 3057787933 +1159889133 3260085508 +105525708 2629936691 +1515480171 2648314978 +372565974 3940227766 +495348404 781842767 +2124178310 2863169943 +620918994 2101061735 2101061751 350499461 1636245619 2615817030 3313050814 +4098478086 3899995718 2519890295 +3922605225 489048563 +2297907071 474320126 +565464277 4063952250 +1324137471 1034678910 +3166738586 1038874210 3174054507 3174054525 +1733157935 1742815558 1586253702 +556133560 3870533051 +2206112185 3108765224 +2298182772 912084703 +3680388440 2254858468 +434290453 1144674746 +2382196688 769493377 +1548659628 4225253335 +1036092472 3872517255 +2845737001 879239054 +4099328318 1593581129 +1790365987 550189578 +2715903403 3503468501 3945944 2161314850 +2630323966 3425049033 +3177829844 1089976104 26975417 +2650742142 916155721 +4117905714 2497487269 +3180253436 1674771633 +2850124339 2699478618 +1523262246 4150102053 +3465818635 1672988984 +2347875810 2741540681 2674430186 2696534164 2791873527 +3480279700 581441273 +1447625218 2196425991 +336293962 2177386326 +3960623776 1087902195 +941589070 2811896025 +3065379243 1266157602 +742024388 742024404 +479934587 2203707826 +3360825434 3360825418 +296452674 1394179724 3380678053 318639605 1370465572 2241771449 1370465586 3572494142 1555397216 1370465587 +3447624491 644013912 +1698038817 1526242012 +3378428778 1780549586 +4062551726 3868920992 +999524491 1413477058 +3257889347 460312624 +973444417 2546595136 +3757782625 4185299638 +795234843 795234827 +2917814485 2784069221 2621052178 420397368 977969530 3027394825 472128185 2631745372 3010617203 +733670695 733670711 +3955931284 3290468591 +297572486 1910774497 +4186662723 427003516 +3547956597 173766426 +3869826675 2396401434 +3620276163 3620276179 2222412090 +4150779458 4150779474 +4158907309 3075656709 3904858450 +2866924866 1131814645 +2212719327 2114010377 2664782690 1809767253 2114010398 +465527052 3125134839 +614249432 2058296603 +1497951016 447255440 +2750677668 3173001279 +321487817 653037531 +2926466068 2880330617 +3734409044 3137577273 +2749901475 2843418250 +1249015968 2133640605 +571464474 371145973 +3822833888 494105531 +2449745868 2827658785 +1393007657 3724203150 +4278772035 3187317884 +3048872539 1861713220 +18394647 257359092 1322414704 1305637098 257359075 1419541469 +3883447197 3883447181 +338320697 4155556030 +3286449997 2654079969 +914673902 3239372463 +1307404745 1975355256 1975355239 593093006 1141198351 +527303982 905188281 +1528548776 683239495 +2566555334 2556570039 +1227016316 2646711079 +1872748138 1852094661 581640411 +1214565140 179023983 +2770572695 1091586307 1829297251 817930681 677305625 2382658736 +2897228708 2103528255 +1311260165 1797946494 109407853 +3764404472 3838363805 1029758340 1631471231 2019501952 1616839098 1029758355 2002724346 +3624947841 2992723031 +4289132597 858718609 +985247632 38756277 +2068653699 2641600554 +924854104 1386224371 +2366250659 302395571 +2198159783 3896924662 +15099444 2662523865 +278476403 2486220549 +1665358005 4161053930 164833232 +3401271432 1907625258 +1476204009 2260143039 +1540910725 1719316138 448133964 +2001291161 559893630 +3235859848 663162123 +297121408 1628326803 +2454287650 2454287666 +916740347 2951800901 1027449996 4290253618 +2663306679 1439888361 +2013078599 23242777 +1712693978 4229511930 +1550521891 1371457296 +83325350 1091606234 4273673790 4097088297 939575390 790874700 754390954 1592564128 3265285523 1510708930 618734571 75356985 1083122104 3122094581 2680037250 1460816036 1627271409 4203861330 3378832246 3055744931 1217666614 3948828255 3217935253 3082311699 2793311642 2305794883 2704234098 3922734074 423341901 1842193394 1891698271 571004341 1077372795 2491033671 2251957313 1547494864 4187572896 696651002 207517290 530205748 3228149235 2094434078 3904609909 265555009 2524908575 4052328685 1866964120 1268831384 63525692 94580896 2268011822 4085008805 1707864172 2465738335 1856596170 2363639633 971480831 173680166 3452168275 1928329759 3378059905 3813230993 545490723 2544016063 3054043981 1683336390 721894397 4027128994 1781018424 606347450 2440720915 529412571 709790245 3765917441 1123682424 3175156223 3480892354 3310083706 111307782 4020767695 3758099754 900666600 580308164 3456524239 1036117391 3995290663 568933020 925169798 867668643 522027779 302438810 3220821160 478303860 3518231778 4059774047 +829358312 1969980113 587719630 865723256 966388987 2572154753 +31529410 1615361848 +2800359673 3146076136 +3294948053 335006573 +635036192 2717852162 +4288932434 3238649605 +1617982249 1850815372 +1803797161 511043583 +3886429280 178549541 +1676286130 756271990 +483048430 882014785 1092999078 +4033688570 4033688554 +3561983449 1048227656 3122795144 +3357917328 3981411945 3357917312 +781907360 4260408051 2799502971 3204127256 +1990190231 296926754 +4179001686 2945060897 +68211343 1670074631 +1678954214 1872475159 +644975465 3988682318 +1670246053 3359338704 +3525549698 2170690502 +3188676214 2821004241 2821004231 +1088986618 674279581 +3369627022 3132389017 3132388998 +537988929 3151692639 +3334262399 1001853297 4023857212 3906413866 1513689598 +2660741320 1829165556 1892371165 +1136868419 4015512956 +3752458922 2020164247 +4256385684 4256385668 +3555150487 1940246921 +3751636409 3184769598 307113865 3184769576 +2252134366 3062914558 801624703 2284198914 3062914537 +1414234875 3596244332 +2593637935 1041278843 +1724822543 1236596826 +1700517463 3868355302 +543422760 3574483284 +1788551816 1513577483 157633697 +2212184090 3937249781 +669348946 540417285 +1217892422 2358779447 +2708574882 995215617 +2933153297 789623734 +1428764375 3837258819 732350537 3873526896 3837258836 +760827234 3314864469 3314864451 +2360076568 2325737691 +2285196579 1942822023 +1118071762 3008973199 1974272372 3912659711 +1660198880 1660198896 +952557044 1427072783 +1145289049 3483158280 +2834498593 216428614 +2402329330 1536197370 +3638973213 2408896162 +2061824253 2640056637 3269321909 2640056636 4008895349 2029579560 2640056619 +2378983375 267200272 130509521 +761586551 2632049903 +3370626722 3870812437 +3953081708 1471000833 124626071 +1190660355 3145084860 +772335428 3154382879 +1894431105 3366950065 1115817494 +4184108190 924253353 +3668338543 1130975480 +3657558737 1099785169 33859344 3348574487 861072993 861073014 +456568907 571966978 +369976243 3378984736 +238374455 2498371728 +1858896337 4099988854 +3445148221 120428751 658898228 +1401080161 1364661575 +587257463 326804724 +825732070 2177138655 +489886730 23628717 +875527320 2534052388 3200328525 1049001824 2892762073 2534052403 +3689874129 3689874113 +1914242263 1952620134 1952620144 +3952430601 3842627640 +3078205224 4237212651 +2672158540 3078492513 1014324128 3078492535 +966410915 3729590151 1356261020 +927647269 800451642 +1076618033 1269272022 +2750686051 2085860554 +283747269 1691143948 +2276800094 4494847 +3778377333 525029388 +1388829351 4154275062 +4260763045 344554186 +4144033270 3430324817 +2476668907 2476668923 +1219100131 1184541770 +4180372780 1923944636 +1504580471 1553419049 1919977589 2308614644 2752029766 327225848 +1504407538 450968051 +2995954663 64488630 489417721 2903459812 +289422539 1390917707 +1691250087 1475780086 +3907386482 2429938234 +3199225847 2170190435 646832592 646832582 +45965525 2172129139 +2930514280 1350697877 +707806431 2660220129 +2435624837 240668236 4009973693 509110172 2435624853 +428910305 532067360 +2693788162 3298425123 +2924653717 19246748 +3080466350 3928256346 +3770123154 1390681811 +1236135905 3721436960 +1054768593 3376418832 +2580796945 964295878 +2148464445 2674946594 +4159848168 978913085 +3407094962 1656079411 +1420094792 2275510356 +3923818766 985878803 +2361269629 206072788 +3155039317 1596588490 +19033768 2922083447 +394749442 1110033949 +3736679667 3833869453 +1977779132 1557546456 +1416560169 2616708494 +2981776752 944236373 +3176063241 204226862 +2053036339 3595561804 +2109722025 2952784153 +4029334792 2575342063 458501012 +2785512527 2900484174 +3593953922 675747353 +1884338284 97985163 991056392 +647694401 118357568 +3185010828 3185010844 +1863325424 3327400899 +1157412918 3486907655 +2275415558 2265099105 +1038944608 3693462053 +3802049526 1911802838 +787308537 403377118 +1787789298 12110234 +1610705906 3538590681 +2191571638 2874366102 +1750765421 1029225938 +4075414048 2251225189 +1794600779 3457968238 +69603690 3015549893 +2324995876 1274447295 +1435255591 970332466 +3768121761 68417543 835778656 +1286371455 1781000747 +3248952794 3020383805 +1544871012 2871074744 +39130269 1223652148 +803895281 1595592806 +2823140749 1924975858 +1393187765 2405291866 +420439640 3409845380 +1880167093 341106705 +3054714311 993947849 +3657558749 235190772 +2837228316 2173010375 +620918988 249833783 +3116675554 1386481365 +2104325492 3880773007 +2707136984 3678390029 3678390043 +2009545426 2890370461 +1907860822 1511605873 +4208437112 4208437096 +1745233783 951066704 +545710815 2040407550 +2730373404 4081932240 +3550738006 2166147441 +1013119164 3419246577 3315177584 +2046595225 2912332459 +267114655 859150172 +2741790036 2544075577 +1273243000 4029086715 +2787592505 3933484830 2457944573 +190391405 1247041412 +112917421 1513580167 +4208835526 2169895172 +564099618 3353429821 +415813957 3114446698 +373196153 3811727989 +3496884932 2411691449 2411691448 3783688841 57862696 +218594051 1404495591 +2556130622 920562271 +2621845162 634100135 2621845178 +177589976 177589960 +820554870 3596914683 3635672468 2660193819 16822855 3397011881 1520580105 241852954 +3028323802 3238530467 +803194891 1749543234 +308755791 1490728551 +9927567 2104984078 +739625875 4182734970 3826946583 4182734956 +2901885605 2901885621 +2365453189 3005731592 +1849766983 3617934272 +243392346 812817085 +840109605 4177478714 +3011708697 3646019561 2688815928 3011708681 2957257822 +3896952724 2570028404 +1425740154 1094484747 1425740138 +1397284216 1397284200 +1653743855 453630008 3363790892 +4174135843 277987379 +726572511 2335768202 3032003373 +1351982913 478786390 1271226004 +3725402592 3729239212 1856787365 +482309691 3604363781 +287760066 2087938456 3257969525 3614995945 1181442140 +3094981455 3062410584 +3958288713 2982221304 +3737886519 3469900724 +2766117405 1715866764 105906880 2892103682 2835323828 +2089225105 2576823632 +1007782049 2888809409 +2666432206 2666432222 +1545134634 623642651 +1847248585 748569516 +77979774 2176025314 +2027482968 2508244877 +3189765661 3151085967 +3088151442 3088151426 +3423122663 414500790 +2788414837 3229096531 +708963110 2881825985 +595693769 2918640750 +3889987601 3080365494 +172101034 3890434950 +3096052198 703231713 +3272225436 3718133900 +3599414672 1281085859 +3218769978 1057256285 +3725982467 2677679530 +1196465685 1196465669 +3387872661 2012887434 +2610839868 2610839852 +2660992920 1188459597 +103313850 3084956783 +9757097 2472492312 +3053550830 2936123758 +3634080574 990810783 +1935892749 1528625253 2797131067 +1091845190 3101352481 +2160225264 2718952131 +515987396 1054160848 +2326932053 2876810186 +1737576389 2468844010 +24156225 423588209 2235543126 +249833790 2938956937 +1319202053 3441336012 +2981724182 3348747073 +1993412087 35191750 1770403695 +2876062119 2213659104 +3790398831 3479107756 +3153545919 830776733 2773133993 2773134014 189491616 +2141971541 1352167875 +874545584 3207342101 +732216658 2034784945 +3715483841 1634404288 +3225942420 931729112 2743020404 312336617 1162732527 1757464960 312336639 +1542093169 753774102 +394682714 3426143522 1653293227 +4051216976 1895046133 +1562189260 792064852 +3847263979 3906835444 +2094316167 860501701 +2852108573 1398060802 +2405275165 1837150710 3444789172 +1010224654 3628490777 +3833688356 3129356675 +3914326830 2726835021 +3239411633 2782397360 +3876358768 683535957 +1046310223 2852615067 2081624910 +3708323808 3563972019 +3466416865 3335011590 581531680 +433341366 1243773962 3055065254 +2066481865 1559425849 +1287591633 1287591617 +794785037 2688893810 2762014706 2688893796 3205049445 3205049458 4086214971 +2774505821 3737097292 +1303197594 2965319010 3786311531 +2219140434 1180933626 2336129043 +2087986835 2111355244 +269423407 1991979758 +1985783432 896345525 +1672004889 4222502472 +2305112602 1683650301 +245134706 444030046 1644722957 3949705874 +598897462 2659517718 1743478279 +1054419832 508610179 +4242266754 2417556149 +1010212616 1010212632 +1917700622 2639170909 +2814877026 3047439466 +1292547827 930798688 +1365897773 1724405268 +3428950947 1622448522 +3442522714 1572166589 +1919328850 1771144979 +1087728666 3522411406 +2941224560 2140113867 +1467012694 3058610681 +3661495796 2207696655 +3498964093 3840013816 +3990365295 443547806 1222756703 +797849182 3783982411 797849166 +1572733771 1572733787 +3426451684 2127321838 4204562203 +1736538450 1133498875 +2329954733 1276377924 +4039481325 4094568964 +3053417359 270723598 +1945781494 3835992116 +2750784609 30976657 2092025014 +1579808846 3706514642 +4099788522 2578233933 +3089904292 2442377279 +3640868830 2115865193 +1774230028 2251456759 +219280817 1145423280 +374055852 3306334167 +3228718357 781901754 +2871957578 2871957594 +3004689564 3004689548 +2899276908 1989428759 +2112012065 408429393 1290985718 +2700157198 3410238738 +548606673 4161561742 1256627983 +3190417797 3591035823 +3956071182 953109373 3629365211 +1746779074 2832110197 +2452137454 66925999 +2565062703 3716647406 +2253607439 2791687771 2217356696 +3853491320 4085802244 +2570223140 924508184 1316786857 +3367444270 642127225 +3996875638 2107857607 +705268916 3775430479 +1943660512 1943660528 +2537512434 96673700 +3883449973 348155064 +1459102246 245219777 +3568775683 3747855018 +607100562 2297864133 +3072260477 3267542996 +3197267003 998269170 2400749310 +1751115476 586702777 3321802815 3321802792 +2225470695 3092062134 +174360438 3527491281 3283473217 38114634 +754173325 3159668257 +2802875011 2180045884 +3501178465 3853038240 +2185850067 2627745110 +2920767795 3213617997 +3151806283 3409025273 +55613851 3538013970 +2350607694 3710718425 4092787371 +2825759369 2265498039 +2977552218 3813552949 +3252912246 881432534 760018392 3004887525 838418636 3640812985 1166717232 2330153740 1515027850 +1901959650 1482243797 +2729277553 2729277537 +145239900 4240608711 +3212267065 2024293406 +3874600455 1525741316 +1002875057 3410071360 +3691597680 3534228803 +900631993 3365162889 986257982 +2903751172 2047726665 +3697062704 367924355 +4136247741 3631422612 +1351861796 2468137380 +3526494271 599980862 +1325179743 2039931477 +4120468755 1634221975 3010299116 +1585886364 3565202906 +2458049909 2300612378 +931139681 1427568262 4281328199 +2038121394 2184549211 1431763026 +1739120931 4141156880 +164691021 1474498811 +3906269409 1748447776 +991239040 2184858245 +3113990030 3189896345 +232926250 84641293 +3343381671 1564877536 +2611875081 950770812 469665080 +3078236915 3360791706 +238331189 4164900822 2447381116 1723234375 +358468166 3903155255 +3220163450 1191354081 +3058644028 984562289 +830476232 698077428 +2136466248 3210398292 3210398283 +346537498 2729114832 3793197733 +4049897693 3728962548 +4196039320 4196039304 +3471622983 95906006 +3386718529 138486102 +745512820 2914415150 +2774061069 1473217650 +3446943372 3303918263 +1553327022 1844800249 +1988250609 1372150547 +1429148369 3300915507 +3941072030 1216101923 1115983424 2566661478 1098658604 1083067949 1439033965 4272683841 2260672280 988733313 1115983447 1115983446 700221248 2246388467 212603249 +3019345986 3019346002 +3636889729 3246973696 +1593386037 1593386021 +1317212036 475098313 +257107065 2564975208 +2712063933 915998338 +2031226712 2003321572 4016973709 +296384816 4284270229 +409482998 1645118801 +3440783298 2616012405 +2958813303 2958813287 +1336502955 2745713368 +1116620068 1116620084 +2132082644 2519724351 40812596 +1915422497 1280158534 +4041287866 3966966987 +769346556 741907889 +252407064 3338452187 +2668799873 4192741635 452871653 4054365777 3610873910 2601376283 1756800279 1078213877 2774517280 1850952202 2985708195 422422246 2021930520 1662792064 2489630671 3090298797 1232734764 2851359202 3511870859 1028518300 +1763867655 2286501654 +1298332019 2410038797 1171173388 +1172263862 226246529 +402493738 3995829531 +2313922187 2834771138 +3672534759 2143327648 +1346240043 2090278306 +3749144078 2154730392 903752429 +662746301 3969680770 +2697162531 916976668 +388353987 864423914 +3127958573 2896861906 2727458962 1132677019 +241706803 1858889399 3774199116 +1399457539 1399457555 +2210666037 864113299 +362703999 2271529982 +4243147586 3165620919 3164745799 1564262369 589168692 2812415776 3164745819 +4214552983 191162534 +1385459734 363623086 401815148 3502112047 3430451193 234350322 3502112057 +3202627243 742526754 +2537623218 2537623202 +316469670 2484355302 1473275991 +655937149 151850690 +12799322 2373108925 +2825697183 3257208670 +2439191928 3986836997 +3874017029 2003870088 +3153232285 1180768642 1757976678 912697998 4090541571 +2260265547 1528159087 1612239892 +978932761 4087309128 +3041888335 3140719694 +450314397 2775912901 538181937 4281021226 +1284714031 3132208120 +3734655842 3471917909 +575515798 591975850 +4177785292 745627616 3442844727 3442844705 +3737642391 3549763860 +100515535 1030971352 +1820853019 4112311186 +2640585541 3328921962 +2457794377 1400776901 +3420288504 3852514669 +2794789843 3785324589 +992128307 1251387226 +3882184603 3752767762 +2878481471 2712984572 +1853861160 796935520 +347069534 2356614842 +2726108815 3719463438 +2528965195 2405717235 +3471622978 12017909 +2731835652 2779565561 +228630477 228630493 +1206483069 1206483053 +2396089176 732691341 +953280470 1215297009 +3444899134 2060101791 +931736713 2944754661 +2414464255 4090607574 +3051373662 3051373646 +188989956 3215617097 +550592859 2247905544 +3438228093 4196745058 1017308047 1884333546 +4223442801 3136224998 742081537 +3932124338 2789520435 +335636737 2134396054 +599207460 1566417577 +3148066947 4121884538 3853442620 3853442602 3148066963 +3177323201 3798998486 +1784174953 3524575320 +3962439021 22029266 +3403519379 680529345 +379165081 379165065 +3947637536 1537449388 +194042150 1527109313 556872817 1535087578 +3387142948 4117954985 +689734014 351181193 253469642 +3056337951 3863641310 +2825472396 2847852407 +3654167332 1097258264 +3508038947 1282657820 1984787975 +3969383524 1181100111 +1418479554 3762281930 3671389795 +1413584442 3711925597 +3541006208 3243843219 +648355917 1865781345 2016779905 3177743616 +3106212448 3960026796 +2068441515 3227179042 +2837885147 585656530 +709944582 2606682961 +3910069747 3581973900 +1040385715 1371769818 1739707702 2092037713 2472572322 2472572350 2195001888 2137104886 1928504337 1739707690 1598941133 +2006216520 2259365469 +825901338 1176437983 +3701730858 2148527131 +2962096417 34223430 277595872 35367559 +3176380563 3547514646 +3334441325 132597701 +3979654348 2887520288 905485623 +132886949 1667968099 +1787784375 2894333130 219202868 +2487239582 1442704706 +439885795 693776970 +1182656530 1182656514 +1819952484 587209039 +1101761735 672046400 +601120700 3512355957 +4095935845 3089202682 +2995349541 2995349557 +2629077447 1999955008 +1329140086 1554410839 3305636682 +3566878761 1825389615 +82653252 2211524408 90372873 +3278282159 1618954141 1016728314 2893361617 +3418020897 3418020913 +89406513 2493169968 +867777946 110885227 +3673615871 858549586 +2590164573 1719551083 +966669569 2519217626 +2834345758 3580372777 +2400462708 2400462692 +707967437 987397540 +2433792336 2907945187 +189986661 3270630307 +3789122102 3208786705 +4093939960 456144507 +3473566608 3473566592 514377195 +3525619441 3545014166 +590773498 3203261930 2078040515 2078040533 2333594097 1757855115 988027862 2078040514 +1319694564 2162128667 +105704904 3004846539 3329151151 3004846548 +2238833459 1566737056 +1976235135 192410637 3334522410 +149716789 1095516266 +938548961 2170480913 4052982838 +1097474388 1309833017 +1667967303 2955787332 +1914223895 142409885 +3734596990 3917962569 +3538490968 2796262961 +4068530119 2132285091 +2667637200 314077878 +3543369912 840972731 +4012364208 998162738 +3124817126 3848576282 1481821745 439676417 1481821734 439676439 +3545563115 346618383 3545563131 +1734551236 2232813193 +2906345244 3495790865 +3183648221 2522776308 +1491671749 4243051754 2162841795 +4075162657 3080604704 1365884426 3487980188 +1708574552 2837172109 +546869357 1765882297 1789779496 +3757543435 2621790008 +1591384677 2225577123 +968989367 968989351 +1558702086 1192378721 +835496280 3173946756 +1443528708 1183129033 108013986 2825879305 1864162494 +2480004705 3402658961 341906102 +2604808320 3913216403 +1006388601 2785287357 2457323544 +3843527399 552468659 +3651571769 1065244169 +2281250677 2183955754 +3512670043 4088513618 +1229262711 1564622480 1039344381 1547844874 2193626179 +4043920219 3433969746 +3240619465 2659820644 +4116352177 4002118320 +3091261919 1792158347 +2659448218 2659448202 +2498620528 2498620512 +3918228337 393880294 +185123666 2966125061 +3553638498 352964459 +3514382707 939483872 +3313048249 1675240606 +247810824 3753745955 +1932993690 2806209574 +3268555249 2716114534 +3471751524 634247295 +3492376942 1558837753 +1364308581 1755043066 +1353586735 823136750 +833842393 376723848 +2959707762 2937175066 673922419 +3747399253 3374533619 4094441436 4181447418 +1138704948 4166603348 +3280157665 2828485408 +1167632193 3494857558 +931578648 443514035 443514020 2166693581 +1039661773 1516228772 +979826955 4212788290 +3632939316 3945759135 +88331615 1314165345 +766492624 223243689 1677637321 +1459783900 1459783884 +3058722418 1922123109 +1664807688 1601193340 2814199258 +465863199 3579369182 465863183 3579369160 828072373 +3361626284 1531728343 +2064741812 2198923476 1823017503 1887193679 +1158336775 3070692886 +1936818461 3635298466 +1846874986 297366981 +1215754241 339464598 +1200427036 3205520401 +1397475886 1313818233 +1980252134 3036452631 +812608518 1164381559 3090821713 +1515391121 944087606 +2576853875 1019405850 +989328935 206603315 3486924277 4216880992 4216881014 +1953776276 3875852015 +2796698997 491709440 +2782172625 253010470 2285441377 2285441398 1843415575 3735541766 +139583452 3828926072 2210218189 3828926052 +649450969 3601602319 1831871678 3376391304 +2943753080 2934783483 +1933824360 3686966973 +2780239037 1785957282 +1689137379 1703165895 +615041227 2159286146 +2731300430 2511068367 +3657356645 2403371439 2130813066 +3559038188 3559038204 +515244455 4286880224 +1982235094 3298708129 1982235078 +615545595 3167852836 +2202509575 2965536278 +488334673 4180605259 4093185570 +1244192844 3946852960 173610913 +3743100174 2101417410 +1410846043 1536509379 +1860817709 1004865413 +876763675 1601427588 +734539349 1092677578 +3546017579 3837362338 +3102617367 905191718 +2963235381 1072142698 +3921825432 2891363364 +3990619245 3730503556 +952532301 1153044146 +470872365 1537976786 +2336646502 2684238502 2781978519 +317379896 4289570605 +3431730293 1970773034 357226010 +3106469689 3742405897 +1645012906 1711670291 +4111622364 2909441424 2817423953 +2620421105 3511059568 +367816832 1592748690 +3017669191 1836121558 +1690093031 3878162131 +3683318789 2697640908 +1312407359 1676152894 +2430222905 1083588520 +3053417353 170057912 +3371491981 3464631780 +2445990270 5529929 +922044333 824169796 +2022663323 2532845128 +1554187826 3899276680 +3978065476 4279157508 +2398927805 3571157634 +2575665331 1933683703 +3465924415 1531996311 +4211976293 2608862970 +3637319934 3635581026 +494620294 1048712548 +2977728059 4118884584 2718387954 +385917502 974135135 +1472628474 663124893 +2487300203 3066090475 631627416 +4162339723 206133314 2184838411 +3164354444 1978364279 +3166256707 1576412442 1520239466 +3454017219 3671092476 +3725529442 1905662050 +3504521068 1074919063 +2151841209 2712398398 +4194871671 3348892741 2062316646 1170562729 3136887179 3172289247 3333223665 +3746820998 388520951 +1032118764 1476599040 +3001528549 3001528565 +218863646 218863630 +1580291419 3639998565 +1952616168 522647357 +4237234031 1474704044 +4095601904 991690197 +1511288166 238338714 +1893137488 2584454332 +3755452965 1674863452 +3801463324 3451124241 +2132141075 578161132 +2688293603 564024138 1211972039 157911364 832466074 2688293619 1178313241 +2245585123 2541133130 +1036483245 1036483261 +2406391018 3038839899 +3345596068 2406947903 +2037530856 966473493 +988106179 2276849189 +691420648 3361961003 +2392562569 755239851 +147027564 934505473 +937213511 4292110311 +1184334768 4170445414 +1899758589 2625514741 +852703974 562089009 +3369397923 3369397939 +3427479086 3361321583 +1029790967 4062891874 +3538702931 1560647866 +269574178 1834636675 +55724329 1055887502 +3366599474 368783269 +288910873 288910857 2244939938 +2099525725 715446699 +4001961658 4051890563 +3902179317 2339536269 +3731840312 1569321939 +2039282640 686844021 +2406875317 2344819946 +2646880086 2983625841 +3638991703 3389426150 +554683276 2547871073 +4074734491 4040961284 +3088497592 590919251 +97021576 2726690827 +2310563976 1431080459 +2512659128 2076354491 +1180037430 3114251031 +1574133318 1574133334 +3513093068 1859850792 +1991244044 1991244060 +1385386928 1424218312 2917973525 +966024403 966024387 1622975831 +453929672 2187142115 +1766491142 2743536199 +687735088 69166236 3084639893 +3365379525 4226387965 2343394586 +732993399 1040085062 +2107664968 193417053 +361906333 1442925204 +3847919025 3451224488 +3676888288 2440272952 +1258241892 1943063167 +644962555 3133652353 +3848546380 1756065697 +3876561526 1144226322 +3563898662 3594476114 2120714312 +4235986876 859843825 +1908553344 2829148763 +2341715523 432733232 +1433644340 1013239199 +1698577696 2163882341 +2873603104 3252719219 +251801736 678585885 +2278185997 3499026546 +1215806512 4041206980 +2968796584 3214222364 +2341619207 3956372909 +2675597170 2141470835 +1715819020 186657015 +2840966570 1005386381 +296084542 2597880530 +2510239754 605467926 +2147945119 706066526 +1313889260 664545024 +4148695130 2691808701 1041077283 3529519882 +207724993 2275628774 +3052284514 3354179669 +979509576 2913730165 +3011126460 1162335217 +3120247183 1433338904 +385845176 2582405700 +941687411 3203842506 941687395 +771506659 1192999004 2866065243 1204816978 1204816965 592848085 2765399541 3145296422 1192998986 1285765319 1168322006 +2610130315 582132217 +2284129390 1018336505 +2630621835 207429038 +1315262005 2658803068 +2121565403 241012671 +1567315138 3924701917 +896162165 1807533651 351075420 1292977351 2737466138 +3823621282 1744026389 +249614971 3874183090 +336495977 4225500248 +3604822877 2604954466 +3827047385 1857173099 +1859588644 2693893801 +3498200100 4004190327 +799580635 3782659026 +2969649019 4122586175 +1467207115 1984755336 1984755348 +3778617595 2280581938 +722521289 437110482 +3746773593 3909409310 +4143258901 1757039988 +2966720252 1447737520 +516959723 3393985173 +4276523143 2474612114 +85245035 1428310680 +2316426601 3273624664 +1258052879 824170126 779680263 1707940691 3097634079 2672739973 +821327371 466998100 +2178066023 3315332150 +2366765941 2366765925 +64610527 603648409 +982711824 1164309301 +3803382092 1576661455 +3537087389 2151098420 +1283251600 4170238389 +727272005 2190469772 +1853411701 1563540284 +3356368924 777027271 +1274428537 228668008 +662459859 4223343404 +2141037009 3211196202 +1417004610 3942529105 3239417834 1890529300 2122545080 3239417846 +293804775 3409884115 +217548564 1259203199 +399474080 1714998907 +579151467 3264969314 +3117991574 641768999 +945434295 1828162064 +797057781 3202156476 +297443011 1137353853 +2458240846 542444953 1603244498 24507087 464337870 2465674796 24507097 4137205721 +1030851864 3519093979 +470157796 470157812 +2177352372 1617192031 +4225458517 1176361626 889677306 3478796508 3936072947 +1762373798 57087319 +2301739907 2301739923 +2173769487 107433112 +2011904199 2387239254 +1657564482 2507030346 +1454016215 2899548920 +284989135 2359388110 +4132171830 520833559 +1809854573 2682373842 +109923183 3211640760 +948648233 2996760411 363462808 +1327231738 3275081685 +69490029 3027657729 4063394436 +172903963 3822527090 +2234373281 1210431862 +1603244714 419684749 +1050944103 1050944119 +1742458475 387690417 2244294507 +2086249279 3186337201 +1166937451 3919519586 +4008052196 2734517624 3560714041 633409086 3238284181 2862557950 3874404530 +1595809779 3011177846 +3739001947 2395718196 +2056109683 2008100209 +1667550672 1326289468 1202716277 +601233151 1762014078 +1120550950 840588890 +1603734360 3536247707 +3964739194 2108881437 +2440853598 3727041627 +74914098 842999003 +720926904 1562773933 +1776164070 2829811239 +496148664 2552996676 +2490066154 2038849734 +176474946 3507222755 +3070508701 3098448180 +2397897234 286933573 +1120367388 2078378448 1006253329 +2745451732 1872255417 1708473896 +3163949592 2206833587 +1616718041 2342997406 +1368213320 2842113611 +3614137550 3470734891 +1007408585 1007408601 3377364537 +3387395032 1431130995 27047712 +3391600807 3391600823 +2928832099 864273884 +2651101701 3325982156 +2488162603 3389032021 +133333942 952457095 +2457988436 4136147759 +1638010999 689957702 +2490143502 2253831941 +3076040506 2616897461 +1382702211 1382702227 +411773443 2786271932 +1950637280 971293065 +589557472 2824059775 831589029 2891170220 +3253172240 1331822901 +2187040295 3393974079 3028918334 +785409600 4061198035 +2697302842 2697302826 +978268232 313065803 +2044573110 2382695825 +2941057782 3962507591 +2899149512 3481592011 +518553834 2449666139 +3104248050 2200602621 2586487853 3656439281 2183824999 3341901660 +4145245688 3952483693 +3001120960 1216745100 1492194885 +3376331145 1455297208 +1781440868 2338852969 +3254331426 2100964757 +4235913819 2310250341 +1317811426 2293710805 +2588227110 2238683299 2588227126 +742686134 2824158092 +2655711220 334996479 +2066528489 3496416984 +3602692328 787684048 +1941348644 1283435455 217787641 +984164489 3783795072 +2925024058 2936734795 +576829719 920018726 +1343095842 672170389 +390235012 3640448111 +126948123 73470852 +23361256 848817132 +4289272500 2561850525 +3749548607 3656587648 2374993921 +744049626 2861721661 +780693713 780693697 +2453932149 4141868425 +2017622190 4272159225 +632656153 1976789598 +1583787653 4053178155 +304589188 409983711 +1936039110 1861602238 +412570735 624552622 +403447337 4171885966 +2021629475 3555062044 +851265676 3925874307 +1481087662 2797109241 +3629455065 2697404943 +4170674640 644360821 +19842350 133381230 +2395595904 1204991379 +1456850191 1539194561 +3514061159 555492662 +4036965214 4036965198 +347629756 1514987495 +1520634295 1705528070 +1114603339 3766838036 +2434203946 3409470950 +1433389772 1707978323 +3702443665 4165326902 +254271916 2278048215 +3986511922 1187383966 +2278878219 2278878235 3744437570 +1672676458 1688346709 +3128757019 952794862 +941130673 20079190 +1796457291 3676073730 +1339741935 706413250 +621897052 3059912647 +3186747391 47199848 +4133896779 771382274 +3144720019 2773066106 +34169685 2311544522 +446787823 3676620846 +46274995 177108186 +2811098167 2811098151 1829329076 1829329059 896085689 +3310701604 2088831908 +1098371591 379560214 +548963450 2093249877 4235758621 2093249859 674942550 +727606233 3433977284 727606217 +2581605951 4129090838 +2560681058 2627232201 +2001069870 2945534087 +1099655801 1099655785 +3516489071 3516489087 +3138573236 650001006 +3996839715 700871708 +2991322463 2991322447 +2702351420 3427529319 +923770396 3382044177 +1367689407 3671315580 +4272099142 4272099158 +1294745980 4171961905 +2231414205 487686292 +1691171513 1146045615 +1391265980 1193590769 +2886444698 1147188323 +502571374 2518294575 +3043994742 348945863 +2779407252 1597686255 +792268135 1139114813 +3738527656 1007996670 +1639639835 334194810 +1061638710 3170581386 +1007285422 833367535 554454830 +840750943 271946763 4199426145 391009792 1114049160 +457877281 457877297 +2140626170 310658997 +100189703 1839185174 +3108878037 3108878021 +4150232937 2760415448 +3092747642 2129382338 +405206831 1562755180 +4122228733 3350471508 +4274798297 2389390782 +987345309 3594110937 3784375977 101032105 2328935359 852006178 1629700521 1012871685 +688041163 1513489300 +2603447071 1737243102 +1573976922 167489213 +3604344710 3656458694 +1286315887 4097657080 +3433049535 4093493628 +1046055336 3472077693 +3431222056 474107901 +2966376314 148617301 +1945379882 3008687629 +3521816893 1298168446 +3157263994 3113890333 +373887182 3808785487 +2992611601 4009383383 +834733078 834733062 +1022884182 1348305521 +1405517990 2273084737 +815470594 2250689333 +373945896 1047429355 +3189986868 2241901519 +968143684 1075045340 +3243843213 3964344292 +360205227 2002722338 +3019585463 520423476 +2270266774 299250081 +303185824 1611554939 +1436588706 3872693181 +2619796292 356801545 +98835195 1091991858 +4121256775 4121256791 +2179421364 858412889 +1890277388 1773902583 +1571176453 1907804122 +1561146339 1590210122 +292855717 530010291 +919737842 2944683917 +1671262396 2983469552 +2089241457 3914582474 +976244669 2504707266 1460504212 1460504203 +3885264017 431990305 +297906500 242489400 938085897 +3237199023 3237199039 +18822709 1687401107 +751885696 3827966980 +2174746740 2195764889 +191551096 1898946299 +4189363069 4189363053 +2625184084 3499701148 +2450521754 3471111694 +3616608973 643864740 +2366299543 500563577 +2844054446 2844054462 +3252522192 3897816360 +2599507037 1189596788 +3045847110 290143777 1886580870 +2104572791 2310412336 +1952096481 195772960 +3053852624 1536654453 +189651618 1838099715 +585668188 2065628735 3018360410 3860050933 3322273577 +4090674232 213797947 +1991783735 3332927081 179322442 494014061 452707718 173539764 +3079878171 3898612251 +1783729581 1229905985 +1839932806 1624972662 +1530728602 2150182499 +676328929 1457525046 +1596332489 2449119086 +2997569013 3430968204 +397867224 755612699 +110279645 905821428 +756891321 1733617800 +1605380203 2014445483 19488542 1997667861 223322210 2400330719 2839996810 1750701720 +876467608 400806588 +433148213 433148197 +1203578390 904261162 +1825750090 1825750106 +546671236 3479768543 +1627848352 3816208236 1845686019 1627848368 +3164354434 1810588085 +1058895159 2455733638 +1676957701 1587974092 +3787951026 522250547 +1582685782 1582685766 +2881412612 497969220 +3003503310 3003503326 +2438510004 2191919695 +1707372007 2059346404 +281193556 1939911103 +2918345610 1321489400 700369610 2233951250 1513789469 1975990992 1707153524 1873135435 458921957 1734915664 1309779144 1672004551 1327704661 1272685584 3892051859 3965143033 1382672601 3193814502 1422559329 1240690967 872545518 +1388926158 552632409 +3567709025 600082848 +3538283614 1576212457 +2902236040 3651720989 +120886030 1304196728 +2700498972 2700498956 +4020669494 2033105159 +3453555728 2721788394 +253973839 597642072 +253975995 2410450290 +2651288702 9362313 +3604782918 1895465815 +3058976402 2561349573 +1689906826 447906611 +167923493 167923509 +1018277135 544676186 +397274732 2999866376 +1761148108 3021143215 +2270262860 1362966967 +3878883079 4234192918 1277720580 2983374425 +3761288639 3944057195 +2013066242 3845398325 +1476628076 4187567105 +1394629042 2381132581 +386948451 2986180688 +2190639641 491342569 +2029466085 1611280335 +2234910489 3440192606 +404202202 2912277622 +974554670 1211443594 +1028303665 2911600166 +2756596067 3065370973 +927374523 3685770316 +322973688 1175159675 +92416343 2177131202 +3102947251 3102947235 +1929970795 2184311906 +2786387437 150943812 +2188385123 3889826019 +3571906362 1637298251 +4294648282 3528870461 +3873787480 2903710195 +3225262316 4040343472 +3333691307 2021737012 +3120527837 2855065332 +3580004443 2020310450 1816703893 1536418124 2326417100 2700602468 +2325583520 3591642611 +2129650431 3044799428 2162070703 3774668022 1594572715 1265408191 1931908054 1568225906 2011296144 1712856851 275525994 2983544855 1786314771 3584491947 1824930325 3727292713 713114598 3398971841 +1771160322 2498699150 2461788957 +2213868802 1975213008 +806857847 4292111092 +1713891432 953342891 +1262245890 2528446475 +1654803800 2642395547 +1465105945 2446606686 +481661053 4247635473 +71982776 2031295404 +3337821923 566660598 +1248857977 2218971893 +1354144731 1725037776 +3395272930 2299378068 2433599022 +3101744254 2281380447 +3599652072 2853153085 +2679005580 3951267703 +256993760 882458589 +630356107 3432756143 +622071416 3599943419 +2070385291 2070385307 +3311878629 189788570 +2773412025 2210553364 +3909063036 1420383604 +902449898 3330292050 +481929741 1508731007 2152393060 +2793006353 585341382 +1990943099 1025059160 +1606513040 813888697 +739744757 739744741 +2239765599 2276239774 +1633315364 1700075177 619879929 +830041579 830041595 +788695170 2197611701 +4075041950 4215198889 +395373576 555978891 +4046335072 4046335088 +2639179251 2514212236 +1311745543 469916928 +1982666957 3590195876 +1798147446 783659207 +1790306378 1180478587 +2477684023 2996995472 +4073509747 4004351223 2211522593 3944164709 739598093 833804881 1132178934 919117382 3843499021 2876300812 4004351200 +539450959 1689603212 +2691065723 2873562152 +308323473 3937983981 2133004358 +7592986 7592970 +1049822305 3798983840 +1126431624 967112459 +957821949 1782897908 +2455039792 2075422579 +3446566085 701839898 +3352354610 3352354594 +2486133213 597102324 +1449054012 859847537 +3890018679 7536611 74647088 2010953296 +1100955255 650262525 +2620517526 4251290977 +1662981381 1294221348 3945891329 650815051 +1311240522 1390466939 +1398000627 461431607 +1253082773 3904122156 +70221053 2478948948 +1381289315 2121232454 +4157981686 2466028917 +2801075210 2778667298 +2158802048 266347923 +2811278257 2043338662 +2408106330 4207113507 +2937627176 3350305365 +2988252216 2614324260 +1775772826 3250967548 +2095007144 664856236 +200768696 2462506996 331758825 653801010 2351767526 4086011577 1623972205 1624624473 2931183774 1391324521 1601634153 3889131188 129058004 3978867285 3092132592 2359820450 +3316940515 3128264727 +1225488813 168514066 +1930823893 1592334701 11528010 +4129666988 694166465 +1791151710 1791151694 +4120386287 2487376821 +2548401208 1441766208 +1563720706 3147773731 +1912699500 3830691841 +3337793178 2743291850 +3482780655 3116052792 +4252909899 2253608463 +535503895 3620913616 +931520465 952063494 +2293479885 2293479901 +2572945776 3644564098 +1355232457 4070054008 +1560037744 4235340886 +1112369278 1938027910 +3345571499 2514487074 +3799520624 4077502293 +358349766 4181895185 +936810651 2178038802 +2118980639 2943621101 +2540990541 3521465569 +2443629262 396221017 +2298257914 2298257898 +2498514328 4160621835 2498514312 +855123726 1252358927 +2904033910 3076989215 +1354379327 2245639418 +2654071860 2909139040 +3942422710 3673701189 +1438352870 3694381313 +3525525851 679469650 +3664529808 1752681909 +3614725104 462869835 +2013365524 4267998841 +1506508661 3495535932 +2071804862 89265375 +2149105913 3306144245 2683815912 +1950863259 2819346706 +3346747822 316503097 +2829159353 3075112328 +3368710313 3169845322 +979289932 791919777 4017221984 +724876414 2181347913 +109407867 3205295026 +1214474963 3347130917 +1096961698 2411841795 +4102386666 3893727901 4102386682 +2016122954 3325368138 +3296345953 2909914528 +2557626469 1187732116 +121871083 1035278078 +3218236448 202803892 +3722764378 796845091 +4137457712 1770023496 1753453461 +617752363 1655171106 4164065707 +1043715211 2042468034 +4008478563 2170101973 +1718845643 215798442 +1438716881 3963175987 +3164242355 2509538615 +2573503227 3542211993 +712436097 302990513 +4275374696 2438947243 +1788499405 1590354318 +4183367232 3343556307 +3913948294 3742869641 +3508420409 586880706 +3586064028 397070215 +2737311849 1091687768 +967732200 3046366763 +858438544 906597885 +3582645394 3146555845 +1011403037 60070050 +865274652 1283095815 +1185719501 247951026 +1349314119 3798892992 +3823175321 3198045424 +3843581415 2355653280 +1520950956 1648593111 +661301013 1636334449 +1666365429 4051840397 1345820330 +2270539452 2581741159 +2666901888 2250493591 +3267559136 305222060 +3804516101 2603313027 +333750791 1665523582 +476593449 3776464792 +1192602278 3806688346 +944159743 2522477182 +826628952 3895380877 +1157268222 40882661 +555807248 555807232 +3134809396 1480216783 +1942782227 1575956716 +1411895879 3249538518 +4225169923 660078054 +32521314 1242788714 1865354819 +2414154590 3742266278 +2880009907 2910388791 +1138920463 4255763744 +3989975704 3933458784 4192576849 2978166820 1951570483 4192576845 2978166835 +2813858371 1237630826 +1276305476 95882015 +1275094945 1168319094 +449685736 432071997 +1816332751 1015574734 +2606712636 2508114663 45556182 62333804 +1347499399 4141302678 +2297593301 1790711388 +644526754 1188646415 3250069317 +2398010619 4241719076 +2315867444 1703602528 +3708714682 701143445 +1643784578 4162933491 +2261788417 4260924500 4153313948 +2560401442 2245123371 +3177772252 3114787020 1249201297 2293494032 +3368640948 3372535375 +2420795175 1277190774 +3308690323 3308690307 +3389622967 3288686086 +2291152551 4152741882 4169519488 1249796205 +2827763650 3356825424 +3513458934 1020200767 +3089254285 1413645042 1794548452 1794548466 1557257403 +1912412253 3463273076 +4055788295 2512550912 +2715903411 810551607 +3795524130 3795524146 +619223402 3608667680 +2468948389 1322028730 +450724305 2707021174 +1963196323 448629894 2657367777 +1600708356 1600708372 +2560832372 3169451919 +3839671907 212247191 +1105921459 3763002714 3083722099 2303455490 3784945392 4239710639 2959141479 3178920091 2684908836 1751464766 2229971730 2614335268 1441814900 +1036575326 1036575310 +3607081966 1653096377 +890332929 104578598 +127179600 1055948533 +4292417623 432099568 +3270445360 239826563 +3561843745 2709249115 +1166721695 3034402954 +2423907195 3940620964 +3622332885 3084819018 +2802457532 1893004135 +3444413784 2714855667 3794141088 +2978186416 4285627598 2794278351 +2474777610 3559588198 +1991870096 1980683427 +374399620 2773784009 +1469757242 579760221 +965940360 1567681873 713642507 395367088 321668020 321668003 +13079530 606984539 +1522653987 36435984 1798793235 36435968 761292412 +1350066853 2662141898 +1761249806 1348949017 +897795337 1573885052 +2123717374 1126055369 +2150176123 2500620840 +390842099 1305111671 +4259353309 2064874520 +1791053753 3343941672 +2121431837 3183388651 +565726569 3273032704 2084418258 3289810342 2084418245 2138210011 +1670941372 2250668657 2677194736 +1229270490 3119361461 837234219 +1988100494 427979417 +2833915797 2106570627 +3977019805 3350202923 +2595913377 882202464 +165597156 1841382368 2805848499 +2920636869 3500730636 +3227570523 3152159807 +564921122 600370837 +1460714062 1565870287 +85896712 85896728 +3412570966 2319405169 +1360607283 1300651959 +3511503047 1135186262 +250512051 880263116 +473941487 1734645560 +1517069758 4161994679 +2794525829 3143847258 1465042090 2537669635 +1761940715 1799801625 2380502798 +2886005215 2865283592 +1904091641 2727312104 +1376502487 753197714 +165279755 2367781186 +3839623622 3427979997 3517733562 597761542 597761543 597761553 207014583 +2597618816 1015846276 +2809882187 668177794 +1421170409 1889383512 +399985098 1374234861 +4176841818 1150022077 +3271283693 3508722862 +520091573 2071122778 +1150907469 2357606651 +2635186497 2213755222 +3884108623 3884108639 +2256359503 927567500 +2813376696 3006450093 +389259478 1548103921 +1269706425 3694366014 +2673672200 2673672216 +1821112510 1685035465 +3881864501 1912490620 +23631607 132169263 +1344251499 538984028 +1719689042 532162541 +2404503722 1204517787 +3843979551 3455626206 +2444605715 1947359468 +1048564714 1295685965 +3879823790 3120127225 +3890545636 4052033513 +2865225879 2865225863 +3600562605 2230242130 +1761766016 142414017 +2567784603 2593791502 +4284144628 4027072793 +3916143204 243136089 +1210042193 762674543 +750040413 3178856802 +2632243185 430732639 +2594370858 2866078182 +3215264123 734915762 +1348915445 2262495658 +536995010 620436835 2338543483 +1935034040 1221678011 +3233933803 2324183106 +2332088208 2117276139 +3128217345 2262949504 +2572998176 2368017523 +3416392417 2707268910 +2308410686 3616757897 +2260162379 1839105106 2260162395 +3390791273 3390791289 +4077162350 1360349177 +4106733893 2608977804 +1914388326 1898947751 +1128318089 1744135096 +3519161997 3519162013 3816913625 +3303284142 2702883065 +1971181243 2954430578 +2660838047 4116724060 1243486280 +2038282547 1944750938 +465824254 3010026185 +3043217686 2720146862 +1012416248 556010373 +3768449469 1437607042 +3561967467 1681298831 +903641391 4169843685 +118945454 3609613305 +829197579 3151173116 +4243932597 138137932 +2362723734 3560527457 +727469286 1820966170 +2051711207 1786465184 +2595758425 2853966124 3906764552 +1376061976 3748084673 503959356 +3686790624 293530840 +523304577 2602607872 +440123804 3841899601 +4086733226 538175117 +2770713096 40098461 +1657789596 691554695 +2088296353 2470972000 +2220774297 4185758152 +920318137 329839400 +898974227 1828127724 +1225471731 4020732058 +3509570795 960468468 +3718081171 1909376378 +3346416286 2636832425 +3680691040 3680691056 +843552242 2365516126 +1658597169 2943641643 2909241300 3150323070 2758516159 +2645464658 2346099461 +2833788695 1888937977 93360814 +1799649355 667508244 +70112147 656674938 +51608316 3551173287 +766340405 1286786963 362218714 +1406793791 1059179304 2318585835 +597459207 375332352 +2141093717 998404810 +3907777245 2041950975 +1868551309 3772488178 3772488164 +1671043155 1063138534 +2264722144 1613086387 +3979108118 1926868903 +4222943648 3910273099 +2173713064 1248601795 +2055413743 1910372140 +4247426049 619533245 +3615355934 1497844521 +2024199401 3617663704 +949860466 3229285465 +1845134607 811562638 +3847177193 3838306264 +832955003 2028899707 +1269793249 105477408 +3490944701 1272335234 +3220189922 3220189938 +1750086489 2403390728 +1141065043 1181988091 +1915039718 2525652737 +1197886567 2818071493 4029444754 +478139421 4198164916 +1784129437 83680308 +1204976820 3294252879 +836456597 2758430852 +546685758 2311215775 +2849558441 3040197401 +1798990466 4022050443 +3718089403 2268197193 3559983486 +1997233120 976320172 1189192101 +3583238724 2077045001 +2410205233 1222034112 +2027158638 2099076080 +4244337544 453289524 +4125705506 1077400725 +69242842 2717108406 +3701008775 395590687 +2186901011 1171578860 +2745647534 1313629423 +1041046953 3418520661 +479296109 702357714 +1700548955 3948155474 +425854752 1955184459 +753908653 1784967492 +3059970208 3753215133 +384054696 2973792107 +1565499705 492489896 +2605345834 2686993947 +1159280088 3685748083 +754406618 546634358 +2426514369 1588293862 +2065376979 290029398 +1467201732 3911106180 +2495744838 1937227575 +2044043842 223243765 +3404334820 1713897956 +3342933084 125805777 2666558736 +1475602550 1475602534 +3872042475 1007667444 +999921439 4056475080 +762484430 1499686479 +1384997046 1005308774 +4226266400 2606609560 +1979355537 1249060688 +2375139977 1702182328 +1151843268 3624703369 +1294167127 3638353817 +1949434755 1949434771 +1101025457 6227632 +532714673 2905215654 +2062602036 3172347609 +2367482915 1200077578 +3501231663 3035616238 +1853861167 2051303035 +3807658201 935856041 528618910 +3376245198 2578288463 +289298864 2712711452 3576115221 +3802432759 197539683 +1627138435 1627138451 +3514529197 1918517074 +1254930845 1254930829 +914176494 2076459299 +1385245986 94079350 +1200296368 1340921877 +337834111 838899688 +3144363768 486334848 642284435 29028461 +3234115995 898022239 279156484 +4252015672 722651859 +3072427163 606553672 +2390661335 675977840 +46001637 905805690 +1591980916 3564339097 +610586141 1739618228 +3151490710 384838570 +399723247 4157441422 +3799586027 3799586043 +3286059505 669135489 +3768888441 473662078 +882011753 730058574 +1847062785 1353737344 +279425140 2656945189 +1796912215 3700106174 1796912199 +4262590929 3343664144 +2066517053 630554527 +1393293182 2019399771 +307000244 3640473144 +1345462909 3152825044 +3017725019 2194164562 625900552 1553411429 +3654337921 2294448304 +840199212 36063575 +29530249 4287880952 +2485524715 586758626 +1158955672 1457837403 +2416479668 1903628889 +436915617 740075431 3903395229 3886617607 3348453884 +3520138074 2786385579 +1727256715 770770489 +620312582 978530679 +32793239 2839796105 1852202516 2864133040 +3782780054 2400652210 +2239525962 1827344493 3625267095 2255987836 +2955295649 3979337334 +3604144026 3354787709 +1918996238 496251673 +532741182 626022990 +2226101118 1584514902 +769725442 2345694196 +3907248861 2644416149 2247879704 2076058091 +585737876 2312190713 +3860224231 4233528562 +2475030901 2268089844 2268089827 +2397302053 3179022087 +2959939929 110263159 3113761184 2255515601 2511738396 +4095531125 3194535996 +3712635031 4076658086 +1747251486 3999985386 +971474048 521820703 +3519468870 2181152055 +309659457 1329228608 +138803207 232171853 +1506530304 1541323795 +3024286218 937560993 +1364648217 609827584 +3045921820 3910576145 +1440757714 33021829 +2688516250 2812856427 +1843738545 133183062 +494207207 410018093 +2689476780 375370732 +633130477 1429744644 +2955672220 4047209351 1784084079 4047209361 +4153026769 2138980624 +4187786302 1789718686 1300699487 1699047288 3332951482 3971090889 +3945436649 2226817870 +3848064965 3592098572 647959018 744447939 +500946750 1058264713 +2854375127 2958219063 +175031054 2052919055 +1270786345 1713654680 +238376335 516175322 +2128879891 3665470358 +1079522447 3654991128 +2416267257 2975655166 +1408932532 3884026191 +2741790019 1866300199 +3364002953 782003118 +3917949884 1539954919 +3855348138 1779265165 +2024779257 2380859870 +4119829491 2215804826 +1656225973 480845034 +2780737399 1647196240 +1645826804 1641911823 +2972395847 334347332 +2922482853 3707791276 +524991083 2913171042 +1322976247 3650763806 +3090870306 1220044562 4238254491 +2488890533 3700519370 +3309134429 3032982100 +3447501901 3360675122 +1555338794 1995804726 +89731619 2389306652 +208882456 2977904347 +3449093707 3449093723 +3243476370 117564658 3440203835 +948828393 4034844366 4034844376 +1223618930 1223618914 +1998759870 1234047007 +4182156392 2787313283 +1869206816 2207940965 +1517461094 1702649800 +1496407436 2615939488 4055735516 2615939511 +710081085 431755675 +2319344329 2166117695 1156221902 1765114488 +1777628805 1356239706 +940551836 3549170802 4192006480 4192006471 3912319675 1676512396 3702513553 +1585937792 1466007884 +3296319741 1973968929 +1344044202 1386365703 +2961163110 2965959834 +2859838778 4064652290 2436870731 +512619169 55932078 3216405354 39154456 4108324419 +2425603471 2027955660 +335405985 2773415996 +874265213 2238714562 +3547647314 853489669 +663124874 3266607661 +2215008026 1175935353 +31901834 2286793019 +3464006712 1069857851 +808955291 2023899220 +403254473 403254489 +97741306 634377373 +3277815867 866474266 +2133172340 2621150873 +771506657 1434399769 1159443744 1441737230 +3948458800 2896303253 +1026498642 4150218989 +190937854 3888906074 +2547460346 28672395 +1139421780 358905984 +345313444 178860585 +3360097193 489754392 205177563 +2434988910 3893481007 +1109284532 3384966489 +278366834 2425287027 +3275671424 2480069453 +2521290101 3483269874 1449652184 3810150170 135595818 +1502019678 1502019662 +1139084975 2425757038 +2945370160 2378507145 +908565286 908565302 +4101113579 2363939086 +919550871 555510921 429088532 +2573078700 454311617 +962938894 2013086095 +2459328143 3134908123 +640527408 1239814037 +813323673 3918839774 +1207437980 3883447185 +3795207392 4218317989 +2730973096 1742277588 +2062587051 867830077 +3012291861 3125164060 +2615237693 2697212948 +1789602856 326533885 +4226747625 3892660069 +475171823 2230470958 +3477115770 3868472150 +1934899276 3650396065 +2437961373 1584945460 +590856589 4257591538 +3328919935 2429942103 +4255027318 2968322639 +2306418274 2155283118 1030946571 4106186109 +2456524118 1190609953 3579582055 +2473460211 153948556 +3925751545 2877942639 2894720245 +516884814 3454772687 +3640573593 839256798 +459612128 3222949 4067089068 +980832190 980832174 +2308175365 2565622220 +14286030 2762194514 +667972770 2774077607 +3137283077 1688581068 +2563947059 3334151770 +2885766391 2885766375 +3031899605 315190899 +490995036 490995020 +2320166198 2415882202 +3069657820 3812507729 +183233117 2388783202 +2704980034 510418766 +1127485208 3807625933 314288292 +1753662671 1753662687 +2068975245 2938955762 +568608537 4155840489 1935404126 1935404104 +2181381695 2181381679 +540221966 4031753113 +1499161722 618605579 +4248015572 1815094191 +199808530 3515416133 +3027119819 101970927 3564349844 +2087981468 2087981452 +4096287832 1108549604 +2162896892 3996944807 +3977535619 3121868348 +2009073794 88958115 +1483357150 1222004490 +552112945 3156270852 3959299779 +813068842 1733346383 +4206533101 2696957956 +519937094 255656481 +1198801268 4026730905 +3834062495 3834062479 +2662787286 902143353 +3417985697 2987019619 +2833534463 2456799553 +3684712992 3179177708 3712489573 +2971930569 2764364152 +509244126 2791494505 +218024954 1864047261 +1173822372 301141997 +2275405582 2395296527 +2073580020 2227766031 +2877718470 3401262263 +2430340799 3379246760 3379246782 +3909090882 176145589 +2290017998 3851567032 +3063201441 220731232 +584898618 3641988433 +2261441953 3529172064 +1793210962 1793210946 +1710203122 1782209765 +2968591827 1586623276 +1235803167 332563678 +1134580684 1097067063 +2404254770 38214536 162454994 +3198601700 392655320 +2812413135 3004010968 +4048365286 3262397470 989504297 +3831853170 4256170853 +3095675378 1781780467 +3036504941 1474528388 +277704792 658312179 +3224023509 1479930460 +4083131829 2342334810 +2969081738 559320635 +1996333613 2118536388 +3169338152 2309076971 +2156346688 707307277 +1990798308 2958039039 +743432579 1347236164 +2817590981 627943451 2628356344 627943436 +4258641670 2641305185 +51323790 1591015577 +1243080897 1688430528 +219262975 4082461610 +1701056279 3281567043 +98486168 1558280497 3227923051 +2164652315 1514221989 3143634654 +1946466075 3194765202 +1514524772 3250199641 +2460468282 1002904322 +3095651191 4003402832 +240181495 3204054953 +1163034172 1557969009 +64909622 2208051991 +13202655 3120614625 +660836740 2243826377 +2418520117 595223402 +2550813862 4272144298 +1928946794 2063114383 1754862299 +1771479844 1970964644 +1362265855 3515515774 +1036287150 3411941167 +2533164077 857612421 3712848580 +2858618630 1072735841 +4129503247 1648827482 +2439159240 3184904304 +284414060 466688513 +801310797 762413931 109910030 +776666450 839698451 +1564895064 768913307 +314773368 3722881780 +873346958 873346974 +3702748847 495179118 +1333393814 3003377457 +1072083942 3089591590 2116891415 +905376530 96511301 1631863227 +2837944190 3869852318 +733791183 2837987022 +2026984157 243626484 3255979294 +2558926065 203394928 +845308848 14872085 14872067 +2721007613 1299075924 2324647307 648876258 +352344312 126619259 +2620984867 2305387571 +788390909 1781203339 +3497855122 2932372119 +96263012 96263028 +3449260949 1673975219 +2923198763 2682402136 +2346121342 2708024905 +1855150479 2700475406 +2829455001 625142654 1547368271 2144555342 +1959057916 311779756 +2238371076 187520329 +2686425485 2663299314 +720696074 2661147270 2845481133 +159528489 2039072142 +348134231 23792112 +3411815259 2098741330 +110351356 1454814631 +1058486778 1216120686 +2198806980 349317023 +1734706105 75469732 +2854620213 2854620197 +2162061137 791231632 +1160779067 1224855301 +3776037494 155639370 +2626948605 1082609547 +960566217 2142301230 +1688787080 4258061853 +2992438032 88080872 +1958298692 61241097 +4043870672 1282239528 +146479651 611869892 +816595026 4046012691 +1903478931 2527221504 +2905601513 1756293966 +521959320 3621487908 2446345293 +287635105 1828591367 1491485877 +1468234212 1468234228 +1069159805 3471823828 +2831692941 1076541924 +3278879372 990501852 +4125213474 879111829 +1274830488 3013810115 1628732274 +2687866031 2744646420 +843992989 3460781090 +910572194 3754533327 910572210 +2866963223 425852208 +4187968217 780560830 +981271598 1087214703 753937905 +3520845248 487685459 +937577671 3807792068 +3015743949 758560123 535084836 535084850 +689001855 1491041217 +1258078472 333701003 1258078488 +3020611608 2233386459 +1194267653 2128841185 +501498055 3578919232 3578919254 +1097449106 2339831763 +118994192 978454563 +1099351369 3204048356 +2207289234 2207289218 +1644911118 1709097999 +2727209761 107554016 +476313833 3564250702 +875616130 2867020195 +2931097768 3621604997 +3460793235 2351893014 +2172615318 3974770196 +1238791568 1238791552 +3828830128 3962786956 +3451144456 3670996875 +908337624 316753691 +1749483736 2838905429 1011555361 +3314665761 629120736 +4000863905 141582207 +3184540543 1305323774 +586643566 2428557550 +3831141138 2358609235 +2934218926 4293456367 +295434279 1116296740 +4009908760 1488180187 +4199443328 2306030227 2306030213 3966052989 +3828329110 2866346226 +2091057878 178091761 +1796034180 1911035768 +2987715483 3742532936 +2833806924 709725276 +1621023200 4195417011 +1941313782 4169236694 +213447757 3118657689 +348024348 3284620824 +688312458 3639835439 +458657434 2739043453 +3428435843 877990716 +3858141433 4230363112 +1754606105 141570814 +3088438334 3382026591 +3220718474 3184677421 +718896763 2444335753 2071036734 +2093541180 2890138481 +622543997 1372368776 +485062262 4186274769 +487325602 2852325547 +96669955 353617834 +3877754086 3443775522 +2744524137 1986535129 3998239822 +2249807983 979903418 +3623587735 4241085204 +3910276647 382810194 +2841723640 2619108475 +2897408066 3311925853 +3738452375 4210099471 +2751696677 1452955436 +34054582 3298695062 +3724126744 1944391882 4020648869 +3049867848 3330658164 +1329698183 4080444036 +1615037633 2476558429 +2433947910 1729127543 +388842252 2285931489 +899364084 899364068 +3878753990 1222697795 +2489410268 1900978257 +165079998 995433503 +3205454115 3895022090 +2769207683 1497014588 +330294619 1491471954 +694796245 2054498426 +3355536775 2530622098 +3232581412 1959198121 +2627285054 3578682719 +1490226481 87934000 +3301872589 2654120882 +2786755249 294254934 +1853608781 971874866 +2149670077 1904541076 +3137636306 593138418 +2322341306 553046165 +834079908 3878217279 +3835505056 2204665587 +2112004218 220529238 +3171927854 3453390201 +4109105560 1764318018 3998234300 3998234283 1044130369 1446793227 1060907991 1656292198 154796392 +1788690566 1535939297 +3636806359 361248870 +1392827751 1783623751 +823687340 4119197377 +3380569137 3917494348 1969325284 +658257851 2127281010 +299365090 2000317080 +3586129688 2503906011 +745943917 550961618 +3177900696 3177900680 +504875315 504875299 +2668086884 3125091231 +2337266055 3585306496 +3023018589 66060404 +666925259 4065110581 +1709365383 3944406144 +1092859238 2276061033 +364811308 1728266583 +1231287992 1079862189 +838637989 2384305885 1436933818 +1256920043 2535549931 +1836245593 2765771294 +127384494 3171479087 +2914213278 3983194558 +952427137 3740307734 +3812669504 4276227269 +2627040856 3611905179 +2404303152 3371835011 +1595870919 2580430396 762647975 1356720880 408977258 293513091 1767036187 483648845 3892250312 2752660190 4252060666 3552722491 2122820004 3279601903 1454866831 3565235633 3634044780 3684426393 3696600636 4192244043 458578230 842862363 780715370 1664799568 1922680374 643259409 +2188889631 3499904808 +2338995475 3054006939 1751742552 +4040848147 2677425536 +170087883 988614166 +1453345273 2012284382 +3083024233 1519205573 +3441667865 390233295 +4085338909 1905645236 +3139499582 2606404446 3538133919 +814761263 729988716 2719803630 +330677283 2824934838 +992224781 2371845580 +1957916623 2239300312 +2821889891 716237002 +2274452881 4209173328 +3573854215 1566645014 +3462594072 1491180752 +2465800335 3979231512 +3760895572 926746169 +4154598677 1972136934 978792378 +3025519120 1846912104 +3231006239 148657992 +3932567368 4191485463 +2068779596 1769590199 +2713634757 2713634773 +4137352674 402500291 +3809298773 2280656032 +2758039066 3824388834 3127091669 +3400545541 3400545557 +669587605 1760670346 +375512297 568713745 1708614933 3900473936 3297465382 2894802524 1414717331 533772869 533772882 365996689 2843085147 1333791000 3280687744 +312045886 3697477215 +3109843588 1351108041 +3777200830 686215433 +4274383205 1989044716 +2253447908 1431645417 +1293496825 4262997449 +442378184 1245224907 +318315764 3525874703 +2599474967 1719084675 2267440 +2047991630 2015528911 +1662005174 3301727186 +1045530176 4209678363 +4069083820 2048953559 +1087718900 62725913 +2056779799 339446822 +223862932 272211967 +3339600231 3262182688 +652394344 2666746027 +228344503 3142619504 +2226239452 926630595 +3983477030 137553009 +2344291362 2562994057 +1135626788 2995041961 +3616004807 299722560 +3935655670 3935655654 +1312238016 923117467 +3572818192 1300122659 +1332989976 1025439036 +3590777129 3590777145 +888007272 1629142164 +2085315645 3886992404 +620919001 467942792 +1477214764 2118989756 2625787735 +3435673885 2083645620 +1154168816 1005129411 +1225335031 4032750800 +25368835 1684037564 +4004038366 2444300159 +2877396215 1293275634 +2776276044 1653817116 +2065443543 510352391 +3719893554 3086504157 +2638716438 2914901169 +2000876970 2201807530 +2994377055 1441978504 +165798571 966251298 +3112965076 3951244975 +3591297754 2240231748 3918385526 2830436336 2834706644 444218268 3774836156 1574107936 3504760688 1605373024 3646005509 61233568 3323722287 3281047657 1906366858 1161285122 2303224528 1667987523 2093924065 2735258018 3654861105 2124803803 2255506569 3998561376 1286965868 1980183300 3378714866 3981638811 760677280 3653514502 2931882761 4151815849 211406862 3592257391 +1205355380 2373070745 +2954099059 2725359642 +3596199288 3877600237 +2653229118 844665225 +416479242 567311205 +2655343068 38412364 52419911 +1742948560 1787564077 +690044940 4232116256 3411530465 +2464853636 3413162441 +2959069664 3458753931 +1439853259 1959301103 +1446078847 1112101867 +774752941 2376115995 +559153706 2705287181 +425822363 2408188932 +4072818397 81104372 +532188155 3934542898 +79942545 2001134881 289803590 +4099944293 409639930 +48988768 4173217075 +3474272699 81990883 3847901144 1083762028 387132810 2212162374 1783035560 2098644646 1653660100 2627576147 +1146763300 3188089001 +2160323598 2160323614 3261897231 +1032721005 1468066907 +3803799397 3803799413 +3935307744 764674732 549217701 +554404196 1764313215 +2423950059 1541976034 +1647480889 3466135976 +3982530229 1678589692 +3130489338 3308660418 +3240949983 1267974582 +1049197141 2400707915 +691303576 1682197043 +2711333949 2711333933 +640115408 3758132579 +2679530175 2679530159 +1386683067 659536119 4050399237 3299800402 3047740534 3832290182 +1901504608 3412791091 +478977148 1834637095 +1078362926 1560314233 +2604310504 1343237653 +508189611 4169472975 1510886964 +3385719839 3460555976 +369042699 369042715 +1268986031 3236275054 +3395572481 2713094694 +3450800873 3012439256 +3908736290 3795780678 +2906827651 1123286826 +450314386 1499269335 +1166937455 3986630062 +4129886436 587062925 +3713809638 1655086641 +3531019457 1272793703 +2081413506 3472058293 +2331390163 2311036717 +154846019 282766613 +3068940002 3623890389 +1434550219 1708928130 +466689695 57722913 +125202935 181562484 +2485046653 2458505826 3608406539 +1334004605 2172728975 +3128129627 4134387743 3737548612 +211270436 4141586879 +924619061 911925137 4038391205 2227003196 3079899549 +60917474 2571589059 +1075142574 2063898847 +2209338486 3657897042 +1586260887 1846369968 +3716246838 3904826385 +477038815 3129139612 3129139595 2714433288 +3785121820 1160465415 +8783899 3992896132 +3238134741 2871789642 +1963918274 144894581 +3161372750 4031521487 +822453925 822453941 +431452412 431452396 +111758433 3716365494 +4100585364 1456520687 +462075044 580449740 +457232920 1256563635 +2913941814 2698448903 +2626700101 3155813772 +3756817256 3913696427 +915216521 1763549112 +938043677 1175316226 +3744573334 4046115111 +2483718831 3147321720 +3913419468 4277600033 +1003648810 1448187661 +4185270144 4185270160 +1727808021 874252042 +2390240050 3560421801 1933805261 4201307038 2032926629 +1617056607 533557276 +2987550632 2987550648 +2025248367 1993576632 +41533924 3383507433 +868672463 2801860662 +1472647119 4244185816 +490188389 3669795210 +3440598302 2324530495 4084962879 2324530494 +1462244782 1462244798 +83704575 3916707905 +1055760968 140371829 +3036881416 2280852092 898682165 +515377787 3788658973 +3743140318 381601897 +3250973000 1385053268 +2636384115 3535256090 +2099254217 3263112558 +1638214839 1733583957 +1570598036 4073843951 +1671679630 2612747755 4021164795 +526455311 3637862634 +1008592515 638705696 +1286149980 170902993 +3759783612 3756432927 2649547076 +1800013261 346647316 +3921382372 576648633 +1151860377 2910178014 +4270523663 3285776014 +2531336482 2791778435 +3356053959 2774096068 2913713238 3653532825 +56838185 2118817944 +3258847958 441591947 +1482826048 329497703 +815642285 893817412 2389625627 806901522 +1401366356 3519211833 +1728606103 1377291591 +644834992 1504078280 +4280232518 3685398586 3826224183 3200145839 997833350 997833361 +3684651266 3184297507 +2640413549 763487364 +306443719 4070476351 +245052504 1448306331 +3885065345 182531840 +1459680020 176072816 +2473759132 3109763207 +3466221619 3265218637 +2375531159 2094709670 +1078360726 3304258087 +1814227912 318326043 1814227928 +731932255 995180904 +1843891445 2993502763 +663056722 3646982651 +2523642869 2523642853 +1873760655 383480058 305291227 +1280723290 2245359787 +679262316 676745729 +3283435420 2991792785 +3121224266 669475437 +3288104611 695949980 +1418776954 2583282443 +2411710846 3370791263 +2374615496 2547781067 +2707338588 1679261639 +1836820507 622360635 +1516894457 2098185858 +2487384041 1302512600 +3874306701 2722920654 +3130755714 1155205813 +2844852543 776271422 +3473291065 533262014 +2229043951 371334705 +387282325 387282309 +479974413 374263922 +2431194685 1542324756 +3603161626 1220940865 155981222 +1114035638 1114035622 +3226066367 1934103464 +3886268545 3522068175 +1533169214 2238651392 +1568447546 2349052693 +732301127 4250760393 +2031787690 1785855358 +1259332675 366119908 +1824131853 1824131869 +2977675754 3597845178 +1991265922 1502320291 +3499062972 3055511768 232253927 +3270393565 3121411572 +2403785093 2403785109 +3025548076 263360087 346493628 4145410135 +2671727158 3870190353 +2247695442 958895365 +1202601439 1036951814 +2848577733 3264706478 632271727 +2570591499 1045805140 +1388767377 611411365 +385622047 1306955998 +2372948019 3081710726 +2958845023 7471518 +3455824080 322393973 +3452884219 3930783166 +3036694769 810041250 +296052585 811715150 +3533403172 2931283113 +1889427766 1991615233 +3004499368 846551512 3643410242 2376842615 1996008785 1722647285 2779566576 3105430972 2209708695 4057540468 2174522023 300546083 2130267617 1659530551 2843263269 672915854 +2246057955 2731684437 +777343354 1707510339 +2165194525 1181571746 +3755608970 3997182509 +1130305636 1924359551 +621709683 3370278924 +2362626194 377226190 +1266535301 4037284271 +2511862317 3718173892 3718173915 +1431243826 3851689526 1881079690 93464577 +1662705952 4237270523 +4114550026 474056379 +3557878699 1201023950 +2925289785 3027045544 +2687001078 361903697 361903687 +4117502854 3299390193 +3132557604 173144003 3656155757 1206608144 +2574675746 3077632661 +1535819465 23465784 +642860607 2431751464 +3007920019 3477240940 +3196262520 1616872685 +2887058316 1897174391 +2040032482 1291020227 +875501660 2183354577 +3052880193 3052880209 3040590144 +1001071296 3527461019 755348088 +39563816 64170581 +4014774687 1303502262 1906886518 +3166273003 950910127 +847760272 465925027 +3892937469 1129137122 +1216491182 4261419310 3538910191 +3356477810 1658461797 +4267315921 1854625398 +1651595117 1701617810 +844689739 2365839636 +2926614874 3237463349 +2287627439 1431902072 +2033844388 2001744304 +2215251105 4100320454 +3457240759 473885190 +3557424608 2881136563 +658548729 847483870 +1768086857 799169006 +2049387954 4255969075 +2169922255 1778224088 +644653195 134265538 +4217276042 1070451515 +4168383050 1767670381 +4147285224 162685716 211013949 +3727769284 748954040 2340802185 +953801093 66153548 +3345637416 343236340 +913507704 521241259 913507688 +3356485513 2047442104 +1305762488 1028313019 +3606367277 353314962 +3146538430 4227305993 +2994871288 4208068475 +2587095274 2848211021 +4243399595 3561956898 +938145279 4047321447 964342342 621658740 2847956320 2600980769 3941244047 3562092690 2670526145 3632975129 3460282228 872118619 3843123567 3947613693 3156676288 126618683 3334025585 1307811837 459132724 3187145065 1722840351 1891504952 +2735783814 2928516849 +388188166 1921671521 +3203018607 4188580782 +465835083 11268610 +2688250358 3990496913 +321180495 1912120654 +1950036422 3207551671 +519015847 1511783926 +1739675597 648997603 +1157928985 1754288360 +2622868440 1051293472 +1335228708 1830237097 +2341271824 3203142709 +3262645615 2448461240 +2074017658 2074017642 +1408744407 1689253367 +2515392875 2462417773 2337019210 +1726991328 3950899635 +3849398037 1027728435 1176536604 +1518434130 3919249403 +4236679529 4041441368 +3129562463 87123102 +4115823391 1339544030 +1993621291 991916194 +980453215 249739361 +4206285636 4056847391 +3996957386 3550088173 +2419808426 3077346203 +2047102009 696807945 +3534371109 1918306908 +2428118708 2299194703 +1597348576 3244478131 +3131861012 2138583935 +3173334996 48476770 +1195673208 2833231597 +3194106317 2929465138 +1295993709 2394938450 +3068384026 44388861 +1396813648 1875472694 +4179941385 1040193070 +2989349370 3148056277 +513986408 2722922667 +2545363715 1336284903 3629692348 +3650910263 3360767632 +2381582043 1379099346 +1992745698 3709282755 +214505314 3412280957 +3823246974 1688034725 +655460280 655460264 +2473159043 2448496956 +3559391841 1543224992 +3352563973 2065877834 +949500 315539633 +386071291 382374847 884021540 +3113533691 539740964 +2425952083 4093622202 +3209462280 1837637979 +3710191374 3578919249 +3678890501 913040844 +472544839 2648191446 +766248294 2633181558 +3439792474 471879851 +1012984772 3768850104 3768850095 1012984788 2511397940 +30129534 1371229513 +1031058910 2629454953 +4053948632 4141697515 4098979841 4141697532 4115757463 2864818472 +518160514 546327715 +2954656211 3687843969 +1527728540 4111523975 +1305075617 365628022 +1159984830 2782054367 +1463658790 1542146358 +1398523196 3160332476 1545238759 +4077782040 3071308237 +2878824053 2487857699 +133954079 3591551841 +2506747905 918868374 +2017277758 3405424263 +2422252401 3105966822 +2556275476 1897575627 +2916515211 1308825167 +2498709083 794902024 +3733776149 1825555996 +1229187510 199813511 +2518403025 515608080 1732285302 2259808279 +1642670313 185296600 +121591360 2830419667 +3510213495 3568286790 +1970210694 1674106871 +1384456327 1855075456 1855075478 +1869014593 2684123200 +434153010 4003831987 +2145497978 4056963610 1752277711 +2642161554 2642161538 +4080791181 3539794431 +1956439512 2561405596 +362688984 3758651163 +3161017692 4123314119 +2425533643 2425533659 +742895553 1537938672 +3133984817 1097579824 +125123550 2609725055 +419419287 4055607718 +250558869 2914621498 +2162851983 2150129934 +186573659 3957649842 +896157550 3428040394 +1290582233 4054252958 4054252936 +2018778809 627858750 +4091151700 1788752552 1868491556 2383009292 875979577 +409235197 1662695508 +776371956 3438926361 +704438546 722882387 +430512674 2268341141 +167820091 2935811560 +792799953 3536073917 +2728611955 2048369946 +1091412687 684483852 +212740114 136909893 +358055559 532426368 +3040931914 3382232159 +3288399037 1250811284 +2995869535 2043447944 +9643020 4087463671 +3206287785 4282371342 +2881519611 3178585394 1527347250 2011703035 +1190580737 3079444352 +421028887 4158442415 +3421682209 3498361662 +463086051 1453545546 +1144960870 2028723377 +3062441974 268574674 +4024152454 1160539352 +70904074 70904090 +3676073631 2361533534 +1850248975 2872652952 +167437952 2076283469 +4146280416 3966825907 +890243272 777187828 890243288 +4127894898 1156412173 +744256811 1538701909 +134149187 43528445 +3661770315 2429206392 +3976526610 819412306 819412293 +1878849320 1933120491 +1853946968 1292713613 +1089962571 2426543133 +1606859308 4136849216 4057404225 +193432269 56596980 193432285 +4021823023 4021823039 +3265085451 3894052655 +515457829 2191831852 +989019458 989019474 +3764421175 1861024902 +2321122357 1226994650 +1182842757 1158925543 +1551708846 1192675321 +222027009 3594315904 +954961131 954961147 +3488775447 2117934345 +3468064800 575264152 +1181131188 2274397785 +2514617551 1370514120 +2127593497 1067534428 +2791053901 805136178 +3643267725 3643267741 +1320007252 796263993 +1075400022 1037352551 +212727249 3336173574 +1867696059 1889078911 +1823711104 541376167 +3834772196 3050173673 +2947971772 3470941978 4232110031 +958031741 1495268469 1636886978 +1844328112 3187676931 +4004631262 1275756926 1143558399 +1059903067 2034322952 +4149162574 2678862041 +413923655 2531467047 +2884790359 868735211 4252102770 +239377269 472087821 3942693162 +3565022603 2800790140 +4224438639 3503993262 +4105806601 1228646200 +236058433 1732787008 +3986791427 409508010 +1253412429 3905880868 +3982530238 1829588255 +882600154 743228494 +1082856568 317798651 +2360485572 1081280159 +2015956615 2946621078 +1120336608 285375858 1911270843 +1178615029 2350904764 +4172714000 2539964707 +1625410910 3514184153 1625410894 +2134466121 3982100799 +1252161955 1971338269 3005224058 +2734044668 2241264561 +1595626729 1065275237 +4017387198 2992041225 +4279034827 1279957140 +307416073 3780588078 +701234543 991950254 +2925844655 935402350 +3585238184 265581675 +1828270926 3662398415 +2680138884 4273771465 +1088323913 1732609518 +1018286048 1875364568 +839300393 979885198 +2378375134 137046655 +3370185007 1763421425 +3794530488 3945624403 +3174392750 2747451393 2299259641 2299259622 +536183443 1037670149 +4023031522 2130475054 +4069651785 616899054 +195788459 167274274 +60036054 2015050215 +284273553 1030821199 +1149380687 669348952 641083020 221556401 669348942 +868710428 2667713560 +2612048001 3902894109 +346728152 2527502368 +3062805924 2741019545 +2427982222 1606656665 +1390038356 3455796096 +2902392476 4050309009 +1922208232 1153151019 +3285368641 2244154198 +3480201996 1802035571 +2841362371 2841362387 +3068062410 2867567597 +3994810357 3406255804 +3115026314 3540409901 +2943649711 3815872622 +1225387423 2577469790 +3339839214 1328449711 +2495553743 4158694862 +3206654239 16595912 +2959073974 3620388993 +1142066943 3066045628 +3440598278 3682300001 +2092066744 1258961927 +1070742552 2415172045 +387657202 3203349102 +2208242489 1923958325 +423723539 3575628780 +1686307372 1715235671 +947364663 458616720 +2899849391 1111315962 +3283209433 2890933320 +497786225 4165825046 +1195570880 3999952972 +1840750343 3205453846 +2704377745 1375234374 +1183934883 3119074204 +2722346851 3550064842 +1170838135 3400294178 +3196475778 3276760214 +2980929105 82540944 +735567033 3184555838 +2650446669 3647364274 +4284600720 2533156259 +1897221744 3405681628 1955232341 +3935928881 3709378727 +1942462305 493701464 +2781879087 2301037342 +3203283078 566928634 +2964116739 588469180 +4005000466 3704441669 +4189801057 2902835345 +4277032497 2184294182 +3618157767 1167365440 +1124424018 3848712685 +3616751503 1271738330 +1051463381 2109331992 +290313060 2709767785 +1846018328 1318697179 +1573350528 552586629 +875220007 1180655968 +3221854989 3618873797 +3946790125 1121118021 +4192354985 405735720 4192355001 +3404472237 515235140 +58762382 58762398 +2302586265 1092030988 2796242888 +1330766460 3095197745 +2968355517 1122291586 +120840739 2041380124 +1676706738 764299550 +4075221256 1531340164 +43827494 1120145111 +324897532 2017577649 +2949501673 2852324558 +3224210790 3988101015 +3251880070 2790789857 +1906620205 323771346 +219312924 849643975 +871485232 1380640984 +1073217021 2959398228 +3986792205 577593700 2622414789 3576316699 2905633976 2914670399 +2212305738 3742496123 +3249557872 3221278428 1485845333 +3863588885 2600481034 189608621 +361964779 667428632 +1607254177 1225375942 +3101395297 1654211510 +3579617358 785406681 +17716357 781126988 +3886649393 3773693232 +3317353957 3028782346 705830778 +117456625 4133688678 +429773623 2322825094 +2337028185 2717692958 +556253459 1150611706 +3227674455 3647510045 2784301892 553106271 3992057637 2160868242 2882282863 2560131248 3546304573 1357478128 4067490876 1193712371 +3507425337 2254099976 2298408587 +2008590833 1756595824 981766007 949785238 +425908017 664322598 +3523395912 2865602164 +361840464 1825093412 +3106287174 2985420509 +1450626632 1721299811 +2559852212 3848189263 +1624991064 2579412364 +146189884 146189868 3815639536 +2560334564 2560334580 +3815062627 1532891082 +2628915180 1165425431 +3939920253 3694186082 +169359920 268356565 3355199269 486465608 1225442699 337877379 +276232514 907654727 +1184238208 1432540706 3638167945 +929162033 1612228144 +3913579759 2937679709 +4228144886 2967567697 635008493 1014123262 +2358654868 2358654852 +1792818092 3645706228 2714729337 1150297147 3812267644 2931158409 2287585951 4123171696 2271969096 35159024 +3212425089 1273968807 +1180210218 1180210234 +3682377795 1605211389 +3539890555 4100402728 3539890539 2450284821 +3773146990 1473781742 +4103621953 1287757142 +2143184495 2277195960 +2309863939 2056725117 +901497587 533776480 +406217475 547216828 +471876890 1298052853 +2848577739 2848577755 +1834029612 1834029628 +1492858744 3644113416 +3909251553 2357699346 +2013411815 2125132178 +785760448 3598900760 +207008275 2576489622 +823687353 42339112 +3448554659 3448554675 +2619634494 2304432222 190933663 +3371028379 1806702446 +1139272243 420851290 +1109354834 2886320908 +1830485444 2239593375 +1918884186 1726163133 +480933946 1515930461 +930296701 3592710378 +618152636 2532897383 +917342143 3526144446 +1475224001 752820928 +3194719076 1028768057 +4020428631 2489685497 +2971856244 1308347791 +3014422420 2474024832 +3761454605 3761454621 +195778690 1568795899 2264404494 1903773209 2247626872 1803107485 3770438819 1803107466 3135854920 +2377328485 1980171258 +1854002595 324424327 +1043292691 4153893868 +1220762037 3855688570 +278277187 2889226800 +1213235435 3250254306 +3344420121 1859177109 +2965005119 1799140092 +1148689820 1682775175 +2694598270 3011528073 +4112303004 3396449164 +1147885518 2197502297 +71562429 1836289104 +677865527 3914546621 +2347759466 1786668646 129801456 93188690 +3629199921 3100771120 +787564865 2036468326 +2645038218 1708010469 +3712792296 500186875 +1571017091 3957510442 +3937086397 2414376836 +1506133037 3080401665 +3058206712 3251161020 3251160992 +3953582255 3780915336 +846388602 1117582933 +2890804508 1527841543 +1827439491 3684458900 +4290005411 735046538 +1761897884 3992489095 +335590569 213166104 +3604401794 3056015029 +882450964 3775964537 +4051621122 749294115 +3762995185 111945830 +3787897537 752352704 +2988690756 2992382495 +4067619743 4067619727 +2657696202 698743021 +2888561757 1714531956 +3192658829 1920104165 516906738 +1966296294 1707216407 +2523763014 1974991239 3617443734 +501498056 1074653684 3595696843 3595696861 3864138779 501498072 +1080304807 77968118 +1146120985 1133089028 +2125440564 3393282905 +2026404229 3224187325 3224187306 2803587843 +4242886490 4187122467 +77968118 1188608327 +1349792442 1626069725 +1251912364 600222935 +693940472 350918267 +3986132011 814852020 +1600837847 204692070 +752947348 978131183 +3811245384 3836524619 +3815395776 1324084955 +671212737 3505840543 +2054415656 873338179 +3782189259 268416494 +2452916673 971859359 +2617203023 3791230808 +2282231802 2427288801 +2079035527 2597618838 +2783013876 2060418105 +1197045333 2798995420 +947885080 3054974372 +1696536616 3276273730 913368849 +948828410 25096605 +2457495902 2457495886 +1875973558 3045501847 +2245531379 2787909786 +2774718240 3896572127 +20858016 4211491460 2105437549 3845347024 2668642072 2105437563 2801095697 2500200421 2105437548 +3059636692 3934742703 +747887462 544204642 +3198693938 676095437 +925489653 3420593340 +2136016829 1452840689 +33843281 2112894864 +2499262564 3858187625 1833059416 +3858788139 3531481515 +236470410 3123550523 +415190619 1940446927 +1445438771 3546877772 +806320620 1724245835 +3038539784 600071307 +2950641485 1518491826 +2413684520 3686702500 2239555395 +4069562765 1249501883 +3747042720 914082547 +1100476088 4197239725 +3069910117 1917694700 +3492904235 873870602 1497946446 3907521204 1497946456 1897450656 1497946447 3685619161 2142769749 +351057491 3698093272 +2792796239 3929298844 +2195139791 3350956504 +1095481772 3835755068 +2729352756 1289948111 +3429932436 3868287137 +2090220485 3850376972 +1430939173 1763626028 +2083469639 3310824150 +2743674365 1843842388 +794892388 4191774057 +2829307204 3185320457 +2138612802 3974796277 +3684993865 3684993881 +2445704092 393516679 +572839702 3590231985 +1594700799 1594700783 +1309707215 3020420620 +1872258264 2229714971 +2928775177 2241358849 +3523837630 1660060959 +3817131998 135477865 +3931423853 1349597074 +3308173321 1904981560 +2108607576 841723547 +384638499 977694986 3638824720 3370522013 +3964323574 4021761361 +4105548027 889559844 +189776922 2142999438 +850035116 1852449217 +1629271214 3309113145 2385538543 +856256572 936616483 +3392319017 1992829582 +1991907583 3858061694 +3293401341 3750314028 +805332174 1587458127 +50825495 4106985737 +2125675629 3777503108 +1200711798 5774401 +1984444154 766413707 +2559231079 2306027062 +2757758163 2686965056 +510493828 1176123164 +2055007209 1171044588 712752741 1933700944 1330692390 4165839249 3374151315 1313914752 38648146 38648133 1658875483 +2959100933 2895621068 +626785664 1339035795 +3112659907 3543049212 +331753365 331753349 +3069628621 3549082290 +186835511 186835495 +3265085455 1821104014 +1142678746 300499755 +2434122742 1531149393 4064060374 1531149383 +3455810906 2632340651 2845264162 3455810890 +3586849854 323894714 +3555030182 943104321 +4249800013 3115626799 +3641412327 2485889462 +421291511 1177256052 +305772267 2614817780 +2529690647 1943957542 +2501646835 2923223436 +1851245822 1490870302 +2872415187 2077384738 866829515 550751106 +2443887213 720927835 +2880451091 1499386874 +1338407530 4285707469 +389005360 2955643797 +713695680 3077775699 +1844331634 1844331618 +3562456425 2912470104 +2669992141 1409370788 +2225554331 2869468510 +1097189166 557354361 +3313152628 3313152612 1411837081 1411837071 +4073020230 1924050743 +2494408692 23029017 +1827356886 1827356870 +1276392348 1607286407 +142297734 3759558903 +909940245 1986020106 +1519047628 1418422817 +2380599834 2040233707 +2807084641 2807084657 +2725681759 3767364197 +1890844364 1138275575 +1444308407 1010966288 +3553916709 910390496 +1437908521 3675490098 +2350296028 1672514385 +1459985996 3763740791 +3825190637 3238413427 +3921341385 3124833646 +2688156162 1028729141 +1012102363 3529569490 +781582674 3284900333 +695053920 2108801722 3998335059 +807979169 1899222390 +1846179551 2968907521 1262700577 1173656042 427368734 +2504744034 1738698307 +3934119593 3442613272 +1820248790 1820248774 +1926256719 217777240 +4230588944 93763363 +1419563029 1033293548 +235987906 3868625507 1643895242 +2616395574 3046398471 +894373706 896864635 +3099788255 2585441143 +350226669 2399048517 +3143786351 864298831 2641585438 1131088825 1522013133 966885807 3879917028 2278734106 +1333783411 2573182490 +1461984014 1169544734 +1983618407 2262354230 +2332140270 3247668409 +3198437924 740045732 +2411073975 2411073959 +3314410575 597574299 +3785580912 2754765635 +1152210177 501010560 +3992663846 3363295447 +2351010877 1284717749 2491117648 3793516064 1521847906 3615087808 +1321021929 3704984014 +4193266126 1125240665 +1073213803 1073213819 +2264722173 2099637332 +1348023021 2037072980 1348023037 +2640179890 1402675513 +3287232498 1669888499 +3893362663 1939833271 +3178356071 180765817 +1478770547 873456154 3191326733 +106242731 300037279 +3678470764 2471940097 +3037753999 2348490991 +3962945549 3852293220 +1858503617 595683542 +813351499 2621430786 +1511827886 1511827902 3338307069 +608741402 945856747 +834273422 3587104665 +2609603600 3966666019 +896875168 205872797 +2522284735 1777947326 +32710451 1153047898 +3542731552 2328544101 +2176488792 2428049805 +4259983815 2125225046 +1729943261 795229684 +3322310325 4291797581 1897940714 +313954543 2462463291 +3823456845 3823456861 +4084254587 3045721773 +3887110967 4060370832 +1035445797 2596978524 +3914699040 1907586405 +2738989912 2907127525 +3591030803 1950374232 +1277857749 3154144348 +2291137434 2494108541 +127226805 2769470954 +3349141528 1486958043 +3714721890 4028469827 +990507786 4205418669 +3632578160 1224198741 +1100149328 2320724988 3464013223 +2816336420 1716190889 +663147637 663147621 +3162723735 1505737904 +2356457395 3467679450 +652123526 3060922871 +3053125298 2326126502 +1454058800 2669572252 +168831458 3911682350 +4012678727 3393006016 +4202654168 4202654152 +1495340533 3505565824 +1497033005 2763854276 +3122603205 3233629891 +1752908086 3645849738 2713884973 +4044962068 4044962052 +3847796405 3847796389 +3200854052 3200854068 +3425526188 1295331900 +938145271 2419919305 1584941469 +3941072029 1748151092 +1418413203 3755568049 1777546006 +1680419454 3240001950 +2093729324 2697525079 +1691631216 706628181 +4039183524 886266544 +3600106637 2617134670 +513425520 2631102531 +1688264684 2033956724 +4218793273 322941118 +3951438855 3893452036 +2751427590 3299109378 +640816634 2090135254 +3736689922 2681039395 +185503916 334347969 +1390846926 3208990842 +3672981836 4017998497 +988369944 988369928 +1738385144 2846755200 +2753248080 409572520 +4116997718 2735544689 +2798556526 1573763005 +3488905062 3285710231 +4079738826 2551270139 1580796210 +2850703995 4141039538 +1410197307 4102645746 +3057384132 3057384148 +3948901400 2225739172 2672017869 +307451219 3920401393 +273670184 2166300124 +3186726569 2890935310 +1432713749 2210344714 +1473510930 3202811741 3186034119 +546051867 719204025 +2591021433 2130001141 +1641058999 2992043526 +3955952424 1549381105 +1534198692 2558245695 +2987527624 2626394224 +1499785025 4208462656 +843974946 843974962 +1245933505 560780518 +3000684656 3908363723 +3104971730 696372101 +3025631353 1588766334 +2872239782 656480065 2422868058 4028087793 +1196864878 1491262958 +1396707399 1423548352 +3314361436 881896118 +4195373609 3501282968 +1391795736 2950586317 +1975790477 4040199908 +1454915573 2030874300 +2402069614 3511906617 +1124986813 1274046100 +1662981376 2955885147 1167440725 1811020930 972562164 3906332302 2219299367 +1714152097 1714152113 +1854746626 172135221 +2368514377 2253291000 2368514393 +102082383 3809894734 +1290132093 1213805224 +1275115304 3806605559 +4039589533 2795999531 2227799714 +1949002514 203365942 +717546621 1109900459 +787365236 1426767257 +4101280315 3136691432 +1652030236 2887340487 +2136588502 3846171672 +1173262620 2805520327 +1807753797 1807753813 +4099554998 1611708551 +912053942 1244004497 +3815976430 3606919066 +105940150 145830529 +2923710452 1232946448 +3415877770 229495085 +2396194587 4046729106 +417683033 417683017 +1835387767 2644845026 +704118524 224814759 +1117601327 210297848 +740879509 1356742743 +1057173966 1220887890 +3433344421 1050006236 +788717567 8822376 +3788067519 787301054 +2581533296 234158450 +3155497923 141192384 2135497910 +3348027143 2669510675 +1392154913 3246329568 +4018315451 3315795556 +863075685 4137776808 2184689477 1621648876 +1111580406 203203065 +1559079540 3189986447 +1443906162 3986200947 +3588182573 3683540164 +2904889355 2260868920 +273713760 1941607511 +3379590440 373630275 +3221068963 1037692757 166785415 1045189201 3745354908 4285551242 2167318179 +1565235488 1111168493 +1464497967 2570690296 +2613378126 2233020111 +3506577071 3042332024 +1360811453 2247444361 +1462496057 1931692712 +3203758434 4268627267 +716382689 1953428732 +3799781872 3461333853 +3517455260 2780335879 +4291087988 2281961259 +2983887441 643569725 +3298452568 349511652 +3686552049 3665100400 +907172873 934999839 +422454822 3383102943 +3806407766 2121845617 +2912123435 760492373 +2323258741 2450116364 +4099107718 4099107734 +428156530 2660992378 +3395686810 2759104373 +2051132735 1883974890 +1184779950 3854894318 3737729327 +1223828823 741394406 +1808917053 207672629 +2173113951 796635598 +4130297584 2089147349 +933458146 2018161621 +670736195 847820405 +1792725499 829984292 +3229105136 1522597195 +1810708670 2758824713 +2763643222 2641963063 +3910707811 2246088083 +4014951676 4113476835 +4173531237 4173531253 +661607873 661607889 +353132014 2612132463 +492343079 551109938 +2723798547 2792921082 +3205877662 1834341801 +4196783752 1368438795 +4150740859 4150740843 +3991296633 4204817534 +452826606 1798505903 +742221229 1369902930 +856702875 2526763822 +2249089048 547440068 +3615139460 3121881567 +2872499889 945852592 +1515963653 244459837 1131882202 +2590569315 4224274269 +1814218354 1656337435 +4164493258 157358332 +627823239 1874619030 +510548135 862476713 +2692795357 2528438228 +666885262 554185625 +3027019621 270582410 +440460740 2417393865 +850830749 1921431092 +566528897 566528913 +3231426427 3248378943 +4075093322 2826615661 +1318541302 2923395143 +880293784 815155296 +4149989735 4149989751 +3145421938 2502291301 +36414614 650108601 +3500717777 4078499095 1928632950 +1964998421 1972702730 +3005522110 3232303881 +532300594 284707464 +508836670 3269072808 +2252208527 3801078798 +4183159433 3118554747 2011678968 +3414577862 2872314512 712265143 35727697 1211440950 +1770418283 529342095 2309159028 +2528656865 621373750 +1536540244 2159713849 +3341614898 2323020507 +1739561836 1928344215 +102645271 3097214502 +780542631 3827862774 +3357185759 1703658209 3772481800 +4070536492 2570026071 +1973305605 757095116 +1972959739 449938994 +2146065672 176549184 +2794003127 3772059142 +227331541 227331525 +3763119659 1135187380 +4258487649 4105961398 +2344638138 1034693446 +1520332054 3177560497 +1226518887 2093925664 +3105190657 1573128832 +134547583 518807550 +1392289292 2948162807 +3484070590 2813813023 +3223957572 3223957588 +305540264 1397247101 +2165407502 1184321806 1574293647 +3832324923 2889685330 +506996266 1814952791 +526710628 4198993708 +3724211671 3395177657 2236943730 1995472808 2007411311 1920926265 +2856260944 1364102389 +3289556608 693902227 +2391342606 1873276953 +3948258405 3704736506 +1888614391 1559786839 +3392139180 708395223 +3452894043 3946289765 +399761928 3031402199 +1897135848 1534993685 +3162104666 232842941 +3117276447 749737889 +260250354 260250338 +3999926479 535551448 +1701255404 2370583447 2370583425 +735184689 748769830 +1332669175 43770576 +483741078 4190708519 1587697270 +3364270239 1258818142 +2241589203 662341932 +3824521414 2710759358 +199499868 4129800307 2972983244 337572039 +2603289708 2965671447 +398079430 1301049863 +3486151548 218792964 +365575563 3630096852 +4134823231 943415848 +1915800987 3747803941 +670737973 613655914 +157818695 367606976 +867009204 1675605972 +2650607396 3646870975 3646870953 +2229746594 4077144969 +1800775309 301631348 441165089 +592976473 4239489544 +820665546 3404730875 +1182056763 3580848699 +1674915813 228222316 +887327562 2352235885 +1461273007 3418515064 +1897262474 2407854125 +567580637 514527476 +445835805 118345730 +1476689418 2935778070 2568120749 +2643218012 1151570431 3382446564 +1960506222 2242661363 +3600083995 3882856068 +2262919731 2279222874 +1890105367 1914466196 +3437700506 702558571 +389756381 1865796340 +1054031085 3548965138 +3099522155 1067107444 +1822930749 4120326690 +5251866 291758429 +2939299816 3019166269 +1103920440 3437829947 +2686084457 1921885272 +100953760 419046899 +437135512 1364662247 +978936265 4291353295 1462371498 +2140033122 16029317 2588985142 3529131584 2199701396 3881461607 1625989185 +3934731796 372636008 +430138161 2369070630 +2490288990 141174015 +3765669865 4105882047 +2430557580 2610971489 +2331146178 2108851811 +2649169965 2964665243 +2178215289 3695944764 1091363957 +312733543 3389156930 +2584035565 1665479940 +3828461433 3006741374 +3439014799 1706574811 1047669272 +844673933 2642846379 +2904824762 1238869469 +3472645515 2469179124 +3940429280 3619526828 3619526843 4035007704 2613196709 +597288524 58173536 +3375500912 3375500896 +366985511 2520584288 +1792818096 1447397307 201848806 +3212931871 3090347467 +1731933659 433339877 +67626467 997123164 +2265055400 807864436 +197641385 2026410594 +3151617561 3278014044 +1511579420 4045879559 +1036359536 2920113493 +2486575674 2335695197 2486575658 +2918299136 3548480019 +164341111 3801446982 +2128374899 671004940 +2607554710 1094143015 +232147022 643034089 232147038 +240755151 2457730060 38389553 +3591727720 1807122859 +2493816667 1512496196 +3413993160 339323760 +1989544039 2237174599 +4247346661 1830735724 +3546449212 20453012 3599660215 551823508 1115752335 1079262973 3205636231 538566548 2592801617 2201126347 3414462882 2779373284 2624423068 +3505814118 1510125207 +1722356089 354845054 +3977502697 3977502713 +3820652466 4002055364 +3422721955 3407132042 +3665153713 3665153697 +1249101437 3490576830 +1122687414 229947793 +2429749680 2429749664 +2347952371 1113896588 +4129977301 2029949443 +393759836 3887004684 +2545350494 1403668841 +2008047663 2577885678 +897569157 3174487116 +429709286 937942785 +269643291 1745048722 +3980093739 2676395682 +4069493173 2364917738 +1850935716 1354247487 +715600207 1968787889 +889901 1113604804 +1005630631 49046262 +61243518 2458044318 1025263199 +765703642 2172876213 2172876194 2532461564 2998355499 +1543976103 1750743431 +3045185672 1020217757 +3943226741 3021377306 259617363 2135394396 +2052669378 4286682570 +2281978536 4183474599 +1873768921 2280202430 +2224822911 1086174696 +3527354267 3527354251 +3538594912 1633870776 +2545511554 3133632669 +489684050 4170288365 +1679327998 1870052138 +3058641606 3298842017 +3653135504 1455744675 +1396878653 1499604546 1324791563 +4099475577 4099475561 +3919301471 524363400 +2606339585 2399609728 +3577877179 109977048 +1502792384 3256167507 +1902786413 4147462276 +1389269889 3998096824 +3296375013 1768531997 +659420500 2777391784 3244029956 659420484 2777391807 +3524228578 1659174777 4215867645 2421592789 1259785518 +3303911936 36648467 +2767138391 1421134959 +3468393548 1639591521 +3963182288 1672078632 2405631823 +2530089773 2473904082 +2259795494 742501082 +3195098540 2020203991 +2113932181 1576548543 +3559878428 2845830147 +510306552 3655859835 +2665570531 4291528010 +760796965 1087738119 3713075148 +3758417587 2589585952 1702528973 1521953740 +243825344 2698591315 +467600646 3860129889 3226651165 1985220218 2850681681 2850681671 3259627734 2783571205 +3787395447 3603463750 +3209823637 3010937914 +3494644288 666116805 +656467892 1045264344 +3005070965 1458191019 +450850555 1220261170 +2366919095 1421128227 3455886086 +3070402220 369692179 +266466558 966984802 +3254748798 3812669513 +2503755198 1512884510 +4128287800 2487163949 +3617802843 3507359044 +1079492269 3669326471 +215180423 3467282835 3083288704 +1829640689 2654131814 +3676219263 1081158021 +3011637744 2240797891 +1897430425 2727196616 +951847182 1577206022 +1998264765 28397676 +3482415124 1194883967 +2650607394 3613315714 3613315733 +3078223005 1987696339 3050309184 +878110672 4264935202 +3105145837 1219522066 +100953761 435824480 +3375281483 4287063298 +1742149074 2462145312 +1936006967 3744473990 +3193960450 177317898 3004394275 +2542870316 3312718423 +1696536214 3320876593 +875404280 804860051 +2076769831 2796756153 73930592 1339870244 73930614 +2592974836 2383027051 +3383671812 189595900 +952060899 2163627793 +582031030 3588297879 +168721160 681721829 +2119580798 472834974 1606498911 +2841921939 1004524140 +3646406255 2485176504 +3381344065 2267544384 +3407187810 351319893 4279121579 351319874 +2369023457 713619766 +129195241 129195257 +715529999 847438990 +2016677891 2016677907 +2698725643 1144257602 +4200103387 4200103371 +517028951 3663854822 +279591942 2941397882 +2679720921 1236428424 +1726168359 3181814564 307897896 199889131 515458166 +626833278 479822989 +2116198300 1054332353 +309578182 124382640 +216167198 1719351337 +3435628776 1176274237 +481587270 286226146 2630486130 +815170036 1894683407 +2959076556 751391479 2890088109 +4003246010 1521000907 +2609886101 983670580 +2766390466 2259955143 +1068880138 3796204658 +1906567590 3737918987 559550096 339055953 +3989024588 3108294278 2534208673 +4162448304 1087243797 +1239188872 3458610443 +4228681276 4194017919 +2126938734 3088958514 8344377 +2467270878 3609738985 1602293119 +4004645248 1809005593 +3630764102 1583681670 +1412115569 4042716656 +1849290193 3048876406 +2126155926 3533872423 +176509284 4091486313 +2617977378 3348321155 +4234174905 79287870 +1977834043 750134526 +1156281102 2359697167 +4219616264 4127490187 +663344603 2197659794 663344587 +1489964343 2457485741 1688644759 +765029207 528742896 +299899725 1892350500 553526779 3246906546 +1167158720 1139787091 +317562671 4212233966 +2143969219 1708142896 577702961 2766648369 869997100 853219478 1708142887 +465899818 628167290 +4092564226 69495861 69495843 +9980537 1757232232 +185296590 2452200639 +4201911086 1924804985 +3198726753 2224082614 +2287023977 2079629875 +3254748794 3814837442 3745559069 1135043113 +3259440887 1994088802 3438657232 +2231181269 3519235506 2927915259 +1389118749 1955646626 569516821 +880393013 3968753225 +2816949568 3089692152 +4146112606 912122495 +3498501389 1364890468 1567392059 1364890482 2207652965 2207652978 +443467011 3374342985 2623027876 +1445333906 927092269 +3905809119 2183235722 +1642223538 3377466675 +1909405023 1909405007 +2488177308 419292472 419292452 +1407388359 1104170151 +2934168651 2906476725 +2338107246 3504876079 +553438686 3422033001 +2347618561 2347618577 +3279597383 2288497220 +4220525836 3876302868 +394021209 1816069640 +1825906449 1686104006 +2040170436 843299231 +1858225082 4186578307 +82415273 1688966158 +569740467 2703886390 +2475807993 2772501122 +1428416292 730127807 +2385291986 2723211397 +2438209484 2438209500 +2830199519 1850424606 +4189798765 2395471492 +2038787711 3423400446 +2152923491 3375973905 +147362849 4106301408 +355114595 4279724125 +1705548392 3415755133 +610510917 2380391578 +2758330988 1022797847 +2032704120 854272749 +1858906455 3274609648 +2409352194 339879715 +417550464 731448863 +3366547712 3804029715 431841080 4099498203 +2689624492 1806650049 1806650071 +2192787983 3476919704 +1640370369 2882297823 +143555049 1632233944 +3620678150 2959097629 2911757690 +3130413095 1227891385 +1732363962 1183569611 +2919707861 3394775882 +1049388331 2718122658 3548291459 1935163690 3566340693 3206676824 +596310967 3515384963 +1650777831 3419071926 +1408325765 285646067 +2176302722 3772915416 1979742933 3057706677 +3928978677 2645892540 +1058154433 177509590 +331272210 660704339 +1602387554 3161257027 +3751425945 3414930861 +465871878 1188963333 +1187733710 1076454489 +3058177038 24613401 +1118214644 3762576143 +424715576 301209389 +1525021966 638410009 +627569965 262600132 +2644429900 823524961 +3831087288 826958253 +1269444464 935164018 +2945167375 2322249095 +3580004418 17150443 1346358673 +3283806913 3762261462 +2776248558 3578496367 +1735883630 1326927407 +4244968527 2650732632 +2996219334 3542723089 631291578 3912470177 +1051414816 3291321416 +4208300270 595977583 +2274217598 3795587145 +4021186764 463180065 2531620576 +2083361427 247315820 +2673581756 1315443004 +3467690092 3426675223 +2468810570 266503333 +4118072591 1977536142 +1758078884 1245174308 4128662927 +3007625573 2586827258 +4024298680 1397083972 1381737901 +1486216564 3890978191 +2332665843 3543360396 +3000448059 379490024 +4127452420 1278090591 899160559 2741423428 +3379517195 625346141 +3378241370 1436588733 +497794799 3564482449 +4084376352 1568066419 +2653855677 3227874946 +452418587 858929810 2995761179 +2823502950 2205182374 +34481546 1506092274 34481562 +186835519 3337234750 +3399349094 2452685572 +1841741563 3403588900 +2549383399 484895670 +1284621416 2508400487 +2308038910 2393190345 +384054714 3275789259 3275789277 +385784044 103104244 +3957990219 2895482626 +3344769801 3821555893 +585450853 1407991276 +3246720544 3295192165 +3419826477 1147833733 260542930 +1420292116 1482616697 +2970809394 1319611686 +3825826722 2632818709 +4066424134 3560791351 +3615760736 2768276019 +730200698 4259925515 +879960676 4114555775 +119754185 93549422 +2664211640 3615991266 +3318244246 4034184487 +2012945962 173046811 +1698536181 4285364329 +1272186805 331883004 +234779417 277813048 +1434415490 1833881019 +1478947562 2941281869 +3336766781 3608555572 +671144577 1593162755 +3099338448 3838517162 +1584099502 2820680495 2820680505 +3143955162 3143955146 +174003820 3280446871 +561441696 1312091379 +4204671700 163830847 +2169317951 2017874410 +1272234969 1272234953 +2592924290 311001102 +2418953692 1959838353 +11149213 2832188450 +1001263506 2231740613 +2514081390 1988321330 506312175 +2388877898 1886632571 +1952040794 1952040778 +2460636747 580067644 757454850 +1024946981 1357529914 +193248628 109847643 +124936864 455785325 +1279978270 809205308 +3099752229 4280389420 +3151315774 3442845450 +2351281403 2589714212 +3484511352 1021389853 +2035678678 3630077947 +1845658269 3404963106 +282436353 2169477782 +1945533014 3808597361 +818528653 1815124667 +2865785293 3004599730 +1313538685 1313538669 +3583914352 2175239175 +930430400 227554643 2667830156 227554629 +2241781339 3021474130 +872159035 1760405992 +462388452 1189190377 +3680720721 117270698 2867577741 +1168150263 2462125766 +3078886980 3133481884 +446901089 446901105 +3821515651 375363370 +1942438804 2706464192 +4091995994 1316893355 1780931600 933870822 +3606227197 1560282690 +1773682243 2953446268 +3074484269 2821553860 +19968690 2443791923 +200856608 83563198 3882238655 +1325851226 2005713706 3479549475 2686302474 2488703956 3479549474 766032454 2005713718 1325851210 3479549493 +1131301601 1131301617 +2203442605 2232530497 3466101812 2544318491 1831597892 775312914 +3063957213 3340802347 +2067469232 2919235075 +507613572 3978787643 +1766360673 506170038 +984664073 92469312 1739106229 +828410524 828410508 +4003806270 1732804766 3294618602 1375160671 2334827554 3961378185 1375160649 +1586721729 2686875878 +3419749813 1054760144 +3208366360 3208366344 +3845970331 3185517384 +1476269432 4244360187 +3793052833 2293066102 +2840382044 3756166855 +1813248403 3060916844 +1174232213 3268984458 +4022438723 2655392048 +3743285676 3896287703 +2893665847 3133945990 +2647053533 2682187954 +2715535001 1710858952 1050664783 1710973822 +1994034772 1846414895 +2132554105 2933106183 2455888232 +1897538158 1979486969 2049192751 4017988658 +1974244258 3769395221 +1944140949 1886049069 1953159558 9592458 +69474850 2798986133 +1514729432 3051833685 +918456348 1240482823 +3235758548 3254485823 +2430590006 1181198609 +335184579 911988988 911988970 +1315187931 1119001796 +2107221071 2815039294 +479272537 1366476296 +359429968 561146571 +419587578 1489406109 +791064828 2586754436 +1633248538 606895414 +3926649504 281172453 1190364027 +4190891128 3020243181 +3422931518 3333547289 +218583971 2988638342 629713308 +1409918272 3761590028 +1744716560 2462343918 +997300134 3087668351 +1147026666 2321146971 +83325344 2330851526 1963791612 2011983676 1567775250 2512363502 2352022936 929556029 2705863087 310024262 4073071373 4072421744 3915340547 3761363628 1482216305 3904870395 3257937296 647409438 881309242 +3596361524 1805486604 +3156938771 3841813435 +337057445 163627875 +943187610 1493628002 436208747 +3788973058 2276306741 +3646844510 2376580607 +3947747930 3819619457 +767510060 2450613048 +3494241457 2399601328 +673137007 2821987070 +1850405184 3757688773 +974685937 1530935169 1704750448 +2827180648 4288776044 +3564221094 352074583 +2262900269 2262900285 +844122845 291887604 +1003916250 213788733 +47596760 1330536475 +1513185052 397981959 +1588410907 3925069267 +916912068 18285231 +1483220220 2672775556 +4210172205 942291396 +2892768611 3510557404 +554541518 3931083086 3598038863 +631259230 2673293698 +3561889329 3561889313 +1523407593 3662027992 +344869198 2851956185 +1047833147 2359818980 +2183234679 3764565000 3486150925 2676901271 3294632125 304257265 868600714 +3266350079 2908217954 2062312062 996260946 1130481896 3521955333 2922913387 2394674745 2922913404 2062312040 3937659189 1113704274 +3663577180 1675082000 +3270393566 3138189161 +1964931881 3035186523 2676232856 +2658014822 2658014838 +2582217636 1996014972 +853036910 2021984815 +1578317912 1147933683 1883353755 4010131616 +3054301067 559749058 +1187215189 3132414684 +1425059255 3013854366 +4184378203 4203962450 +2626501266 72561605 +2207014815 3036317512 +162946755 2340142547 +2108196647 2108196663 +1085297952 4120248691 +1264534539 1264325353 +2929994428 1090016902 +3559352624 705336963 +1316670271 3394106430 +611622430 2174019881 +2186818017 619590343 +3235609454 126045743 +1774325604 1416500488 3484808025 +2599999491 4173073596 +3435438814 931947369 +3040487628 378419489 +2792134687 468941022 +3061737234 1526481221 +1382470247 84647598 +246898099 3718807756 +2337485136 306143659 2750849269 306143676 +1794455699 965230313 +3420544698 2915573451 +3221671748 2616317444 +3775977555 2693040826 +1579382589 2061038133 2061038114 1268966731 +59474452 2828911993 +3827959916 2586526231 +3373397930 3373397946 +1939672955 1939672939 +1624243163 1114208708 +696241530 3459282717 +3503808785 3503808769 +244540534 1745298887 +2740045654 1228259285 +2053736036 404655999 +3752802761 3923244920 1329408396 384750739 2163896133 +2435399167 2188635068 +765596018 1210152549 +2915153208 1212152048 +4205359566 3068096334 +2971707032 1852195163 +2546291852 2546291868 +2161353574 578332839 +1361280398 3787880986 +3983982276 2515422857 +3021343480 4192151533 1991459963 +402286930 3031983936 +1170974115 516177778 3654699037 +4009185044 3269714220 2225988904 2268130940 1102485053 825991066 463562428 2679204101 2632532817 1842816630 2979616773 4138252327 +1286263371 4226354178 +2154129349 3835845388 +4056904693 1357812161 +2650440604 1297952401 1521503824 +295439010 1211392111 1520745731 +1654722705 3566015568 2149351511 3759598134 +1990558591 1166934270 +1056844595 1562247514 +2411298695 3355689366 +1687401157 3407733036 +1775715484 2401948816 +3291998650 3417650729 +11113774 955635577 +812658229 1972944234 +986406658 2418446378 +1998530898 3624799258 +4074072764 32966129 748894201 3350333849 +1013850396 1029578503 +1503614929 636294791 +289625269 2909141082 +129143445 3005005962 +2853529927 112507606 +4213302106 2690174317 +1071912251 2775747771 2462896574 +406293134 3249112466 +2148408985 915503998 2615650517 +3864408508 1325749996 +607042520 3448878363 +2301245625 2301245609 +957210349 3184914180 +1319007454 2708601193 +1451035128 517386596 +7390444 2062628864 2642804609 +1398463496 2150809306 1781536565 +3399125373 1850109908 +3650311277 3658407316 +2901684320 2758289203 +3512656609 1438001085 +2792909463 3898453072 460734947 +2119987091 467373555 +3023907882 2843157185 +500123680 223251059 +3025291346 3528536882 3856316667 +3185427304 3900178925 +3665577229 2257531809 +1277891298 1710538644 +3610411602 377693957 +2852160426 1028195905 +4279745521 2886259568 3333333673 1413703763 521970920 4115662943 +305572248 3155668186 +4101023220 3243589401 +4018361246 713861914 +3838985807 2248453720 +305853627 1842299506 1027964204 +1553911088 4261216899 +4143511299 3438074300 +3719006552 1292449165 +1552674861 3712685778 +1643810552 1763574144 +1474283119 1720089671 +235218174 270089161 +2654896710 1650922529 +941130680 3683535404 110582459 +2523813496 3395727108 +637112174 1754236618 +1756853349 1036794604 +1898658409 200195829 +2238125888 2279410399 +2419834116 302681439 +2123725532 558917703 +277665757 174814180 +3772962680 2098803195 +1659894353 281480582 +2887718653 380723401 +3001648040 1570396859 3001648056 +4065158984 3084490333 +4111159162 307123237 290345631 +4146280425 4117824472 +2330620380 2333162823 +818840094 3456254578 4078359849 +2171694953 2658189528 +1950789240 2383593671 +2391595457 3553491396 +3488184468 1885403135 +1623620862 1404111482 +1248272346 1177417201 +3108277950 1693234441 +3729626219 1595974754 +1698789607 1292981174 +2006199539 826458778 +3352828810 2614557871 +1591023445 976161786 +3643470402 2070854364 +4232307267 4292518986 +3075212564 2695626351 +3220428004 327235306 +1172901284 610184569 +1964790031 1788058264 +1288622001 2593190822 +1881090459 2345516111 3393006205 1645439706 859476811 1280552664 2501459831 1845243307 3269085872 3248511634 2149321397 1790762365 659732397 1829907975 4084621068 3421422616 823729807 1553272300 2812647520 40081038 2096434057 2325964648 1812209497 1010229544 1028811299 476076490 648914201 1192464025 2139569550 3451021727 284352369 3019578555 834835858 2403260706 1402514728 +3157748214 3157748198 +611655655 1242309604 +605981007 722610008 +2233186230 1515666706 1084371867 +3077618069 1534338460 +3491965537 140228256 +1307718016 876866707 +3014220860 65234919 +1558643799 545273300 +3168781065 1564477240 +883644403 3703272346 +513661707 513661723 +3970725713 3970725697 +3204459590 767003793 855395898 +1956402129 1662513680 +772953772 1887062259 +3072097944 3655027021 +3105448384 1283366811 +721221113 721221097 +1605254609 1883983888 +961340657 621569904 +1155389996 1045398068 +314589750 3131587345 +3118548481 1304704305 +156206191 156206207 +605789166 2289985647 +3806821850 3080748469 +2566719307 559053570 +301358987 732656302 +3689981122 4258487669 +4267552055 2759306630 +235174718 1326318217 +3919339350 3010030885 +3495463787 1717795188 +4181316065 3548271633 +3294916197 949442202 +499051279 3800828046 +2628905970 2652270053 +4238861051 3075100964 +2484519579 2484519563 +778007418 2051197195 2183298114 2051197213 +1197888742 1238107921 +1513254570 2808362395 +542922405 2522637740 +2031927338 2681848615 280150607 3527574029 1668569830 +2172003068 3371766439 +3707475175 3339413408 +3599053644 246772269 +3257856835 3770005808 +610132721 818692454 +1407127579 589716100 +883832321 4013884288 +708946116 1411412937 98802607 848202895 1229196542 1111753198 +3736657080 1426290107 +2714616544 2531903155 +2270999599 1581861201 +364133918 1220397375 +2542079692 1383484193 +1771317311 2714320555 +1855992453 2872018764 +2043451825 1846931878 +1529149083 372258308 +3926166363 3254553375 3223806020 +3816699774 2645646153 +2791664678 396967873 +3240252880 614095420 3641513571 +801378781 245898996 +272866283 369581154 81722475 +3483194495 1403782120 1403782142 +1893863081 1557992472 +2208094986 3939276403 +23086531 35903386 +3792487063 3792487047 +2170548456 2450013501 +1476728883 1292189622 +3061832761 3886985867 +2502133918 3007000589 +4097234178 182651790 1951486517 +2232594116 209411132 +4107753680 1057017717 +1019170300 3398874705 +872917336 1703439603 1074763163 +1718029638 2050614561 1400060218 2686702993 +2066316700 1780013127 +3579529640 3579529656 +1047963453 1318188363 +3948741595 1584206290 +3155497924 93630256 +3076053035 2680892504 2680892495 2128657237 3420212148 +2844853113 2702446662 +2636553437 1086910452 +4219462142 2367862513 3897606870 +3758422764 1014455831 +3496388487 2560211328 +2229148352 3919846483 +1543987806 1033886185 +3586276133 740547677 +3441185346 1209317890 +2483207076 2756535081 +3136722248 2586640468 +2903435631 3417984131 +3740431351 1689819865 704340046 +1684846001 3357672870 +1784628342 3925394897 +4170587160 1817065933 +3440464034 113983915 +3394117990 3741225879 +2824184232 285046451 +306953012 3282996127 +2013798063 2747813240 +3606338060 372941345 +2944928703 304774590 +1243005368 916455671 +186332549 1204580505 +2788974199 671659344 +5579059 3483634194 2351100064 3103998810 2229480269 1471011430 2964390070 4026277326 2543816762 2363701223 2246257875 +1595870927 3236981484 815244366 200580394 3984634444 3403538077 3656921436 +2850153976 1721566573 +3127019709 2181963701 639451522 +1349471478 876602109 +3250523947 717545652 +2548803102 1173782819 +3384069492 4221529497 +818037725 2664486114 +2385329504 446697642 +874586816 4138125467 +4028928011 344899906 +2756486997 2314557753 2513508863 +1077475697 975187478 +4026659259 749398149 +2835323822 3093435129 +1637241575 2499284708 +2205845279 1508813707 +606036478 1116620041 3680977631 +935105647 229424145 +2363053777 2363053761 +511806012 947537383 +3391140462 4212773938 +2903469402 3377013931 +2848876320 2494209891 2517472251 +2127792634 2701276299 +1204676280 3240244155 +16453637 2419734476 +1179472591 2239477757 164336922 +3531880190 2171314718 1679987167 +3852921508 3471154300 +3258550787 3281273532 +4187498588 2881165028 +4006264804 3442217983 +2102459970 2290106869 +1981152540 2341742536 +1262270059 3683854964 +3520860941 1785855332 +1059851418 1059851402 +2419721838 884545262 2035818287 +2274714316 1009420087 +3645035408 22769131 +2959841190 1600109143 +2479260383 2155873544 +2397042642 3163758469 +78529911 3579271768 +2250676205 465644050 +2344027485 670119514 +134014193 397353325 +903911909 3046261612 +3645937557 2933825436 +1818116423 1859896691 +303717493 303717477 +1045427130 1045427114 +93859332 2203894959 +2765413681 270145494 +492082977 1294592224 +177690783 1262518878 +1764504763 2424095883 +2567259749 2567259765 +2373055990 2373055974 +2668252621 3770506841 +1308266830 259177945 270532395 1434651455 259177934 +2665099148 2641942881 +2283273784 1975857700 +557056578 2262797813 +826832058 1326432477 +3445483764 1054193689 +1286121820 2668389523 +1754369946 1754369930 +2225814659 1763056573 +4135614493 4290692843 +4034688636 1977310384 +1286437400 1152402400 +3272966860 2394937568 +2848270753 3797977206 +2958308638 2995756598 +1035959860 1752411087 +2441386351 4252572400 +1590210125 1138134183 2589934740 2430305044 +3516555983 3305737166 +116615698 53475909 +2807280245 1112140812 +2841371915 2796130388 +3473269097 1329715288 +4152914843 1187904786 +4150839647 3462277384 3396152670 3445499762 470737311 +85527872 1181735877 +3677519215 2138797486 +1241066178 893276003 +3736718385 1583036895 +653112304 3056257928 +1345363103 3683028552 +1159002827 2332478868 +1324845574 1437484897 +2558030797 3442151000 +3005509445 2098390240 3884085872 +182795406 182795422 +3401424402 2807440190 +3562484757 666916538 3284054835 +3683254250 2288219731 +4048375772 6450352 +2027851869 2945430149 2669593347 780937541 2085845437 2508923950 347615526 +472283232 2962194227 +1379648890 3667140163 +2578247513 2108720981 +1596852738 3615080757 +4102951603 3180658231 +3127782416 2339331381 +2950287123 3873503994 +4108073558 2681008438 +1941537247 4156064395 +2568419372 839433537 +3348001336 1595086332 1595086304 +2322723118 3506954159 526297977 161932704 3506954169 2529097690 38237810 +1030567742 3852155977 +230406751 2609816586 +519889265 3756575853 +932714035 3077239386 +553299033 1134383134 +4240656136 4016624011 +860334785 2060570070 +2627882978 646618772 +3871444181 397456202 +703724919 2129789520 +846417693 2290453154 +1383762465 1383762481 +569593901 710626436 +2400254889 2108726015 +4163825623 2296614768 +3891045557 3464972540 +3980970717 1721194996 +3272672677 3373713507 +6300707 3126387484 +3113664818 3113664802 +1435997768 979041123 +3850488314 3850488298 +1619088705 3441125663 +1771096812 451899777 +624896888 2375027731 +1358718578 4161553000 969055523 575260421 +1230971372 2723099819 +3528559210 3980149957 +787398227 2155975987 +270246150 1635679350 +2687125587 1332808453 +3315644007 2197759030 +3285426975 1697237448 +3094508943 3945730062 +2115913427 80844224 +851946130 2186380243 +476200604 408551751 +3353095907 2191380298 +3646217342 2469091042 +3215772434 3473124691 +1087486003 1025833050 +2626809195 3837312884 3837312866 +1846708432 4050470204 388849525 +933002476 2002298775 +2248599510 3537827313 +3613559679 2015803112 +3679953070 4176605689 +1695651492 3199214655 +2200059684 2464769471 +2239315475 819771386 +3022529032 2737672843 +1967790356 1203525489 +3464179605 3464179589 +1361772171 1370404034 +878353283 3672371389 +3336447683 3336447699 +412150653 1669116939 +3566009180 4126126545 +3306609680 1392274741 +3091235452 2307746087 +1126543639 1861442949 +197662046 1392220009 +3512614723 3663566460 +2131872851 1543808698 +1697975118 2042681038 2692795343 +3806547187 968160111 214719508 +3076189468 3223536391 +494645644 4122509153 +1751599961 3690485289 3151102863 3013319966 1877975275 3690485288 3690485310 3722821845 3623374818 +2049563520 2882812034 +3011126181 776346790 +3320157452 2489950711 +2279954104 2785510317 +10554345 10554361 +2951280010 2477030177 +1623815877 572913676 +1911230523 2761673448 +2512436642 1617593859 +1016480497 3295302528 +2461335712 2465201139 +1635892847 3805153809 +3434100185 308593800 +2112872784 3113594314 4255604578 104241426 363019358 1173341164 +3241986576 1118967587 861571196 +2344515440 1492961268 2850710749 +47965200 3223609833 +3380787383 2299719988 +3925353400 161495739 +37300761 884224744 +3658010858 4227936083 +1941650833 783862413 +1286510349 3285698916 +1049162572 3180789921 +839328774 3342710113 +893102951 3874944535 +2371612120 1605856017 980197039 +357753219 1987899760 +2122361551 2381687382 +3419802618 3690257053 +1510041510 1446390337 +1777050062 3150647930 3175857998 2573046095 19797330 2573046094 2347743055 2573046105 +3009716486 1486071551 +2493813610 1762922445 +4147226023 3391604214 +4067353654 279511434 +3223267681 3524142006 +2953146335 2032862721 +2277081536 1762083155 +3795260343 3551791366 +1673211562 2992055045 +3657490030 3884627628 +3007294898 3745410853 +1039661775 1549784014 +1442076866 4222116457 235397944 296204643 1315615035 772331210 117954612 +3113007383 797400870 +801930771 1374320620 +1462707764 1933124559 +3160563958 1063018725 3896560513 +83677080 1912261723 +599882085 1745912409 +3623442657 2221060881 +1885360327 2929666368 613281747 +2831165605 1266678714 +112074349 4045006212 +207014566 3262507726 312542017 6736543 785439739 4116304580 +2558557500 1313154407 +132390422 1914389345 2182831281 +3536668174 3877980185 +2913071776 2672515538 +189977519 3124244716 +2459896077 3970229966 +4061255657 319331662 319331673 4212581326 +3020461339 1192813989 499780296 2223159698 +2042352291 1936803955 +2156654128 1783077276 2353526165 +2193448645 2501652492 +1594765075 1628298221 +2785410904 2387283360 +2854238238 187783209 +3421631411 2347915317 4144258724 +2068407412 2934184334 +4069411424 4027002456 +3260603783 3490917011 2028256128 +759300871 1173013526 1173013504 +2580804160 1755732691 +2152468715 3860394766 +809471037 809471021 +83325370 1525829221 2657978077 2760434327 1845638759 210633847 1651913112 1158537998 1437923936 2903680025 233681360 3597602429 2104745102 1680489456 277366102 3335164586 1658441451 1852980150 1779505099 1305687567 +2264702232 1881648174 +825938655 1587148040 +923645800 311933099 +2918299663 3800350606 +1763626022 2709217239 +3168420768 3952637171 +4206710500 2181431001 +2876108797 1262807055 +3762916542 3519581983 +2677492632 3141826852 3141826867 3389380916 1168974944 +1066794670 3340758009 +264118241 3169736781 +1369851843 1271068650 +984082596 973377176 984082612 +2408462621 1674000130 +1908167452 662099207 +676538626 2095681077 +3642466851 2967483143 +2348582145 1602576512 +1942189595 2460636104 +307972745 4144554222 +1842691348 4205782639 +2889536573 1570511874 +999033017 374852432 +878325783 2163848240 +855604287 855604271 +3512190700 1034663275 +523216728 846590927 +357729162 451220013 +1973615114 965713339 +2929991993 2493042462 +1350594904 305294733 +65875647 3982530238 +4071868592 221584946 +10049878 1197974119 +1207437970 1845278290 3715670995 3715670981 3715670994 1023909211 +3533732686 3768720335 +157341899 157341915 +3481460025 3825352894 +3428618045 431214718 +1882001599 2474708341 +2314334099 1727580896 +4283825157 4183538650 +673675849 1437549624 +1091431580 82540945 +2448782697 4148265324 +1035055422 1673381790 2547336799 +1359450975 336900124 +3352676733 1474543115 +3057065069 1343854791 +2782465914 2394119435 +3330321658 3330321642 +2419746312 334405277 +1002387444 240481528 1191196233 +4105575847 4105575863 +3070296034 4170371285 +1783794785 4219762851 +370067510 4014288135 +837332476 802425796 +2044629500 941779526 +4029554474 1117458189 +4294487830 175873969 +1037294775 314778773 830649634 +2631745352 4071594224 +3325033749 311126044 +4058177897 964527813 +3523088676 3069508543 +3251497351 1993152132 +55683859 1284525804 +3562894911 2384536872 +130347794 1292543301 +3605436429 1510038642 +3045777866 1646582565 +2477928903 1216633920 +3006930950 713058657 +3426639341 1932385298 +2719862170 3471485309 +723287616 1718942556 773130400 2774213256 3847523821 1315812879 4149764844 293480590 474969612 1236232889 601558739 4214139656 3249423789 +3647786516 2566785407 +2886362517 3328559805 +3121205531 4168363396 +545848976 3349724341 +1122926397 262016433 +250266666 2777861645 +800347174 1054898135 +2192630757 2487686732 +3043339525 2484035276 +2212915259 3736474866 +1984482155 2677553524 +3146764848 1936187797 +1809473959 3915042903 +410187975 1212471236 +1128724590 3025950969 +2071209440 936877989 +1660626802 1130305637 +1553825003 3068896738 +3112322497 3373518528 +2553071722 4169105101 +3562135777 1099068602 +2802489700 1504671871 +1542123248 3282274439 1200465484 +4098519218 1127180325 +1958992142 4175472570 +3844999440 3614983203 +3915063175 840503411 3782386048 +1633258485 888623779 +3965294383 3965294399 +3046951908 2739028953 +3809421677 3722327684 +28760431 3930589405 +2809260636 4099141319 +3002994345 3011678744 +4075643132 1739566247 +1543431855 4158258171 +1529597215 1945493468 +106779085 577785620 +3338175640 3892556186 +1529296460 3297605728 +2330619518 1019957930 +2386196994 4099105422 +2138384005 711697228 +4124519510 1471859569 +162671106 1950507341 +247754142 3711471529 +3622181567 2729109709 3231577706 +689410820 3519229944 3021762377 +4066450415 2074010107 +2231574020 4251789380 +2748783710 2621287420 +3808355550 893536617 +2356564764 977589521 +3601448026 1194557867 +901790963 901790947 +3994816810 1694828933 +1226505346 2541453493 +2265486810 1820583485 +2110407843 2825522314 +1304968335 92449056 2186144302 2186144313 4210552686 +3379126737 1754691788 +641602954 3183208493 +575016732 273271047 +2584031827 3375249580 +2912085728 507605683 +3320726407 487869846 +1256884634 2302057835 +2826597475 326561616 +3027393609 343189688 +641437008 2143253749 +2239337928 2429535989 +3138930023 3138930039 +1152987827 3800747980 +3159356493 3202192676 +872747652 2062515064 +2228798961 306158192 +1396991231 3769827082 +3619892966 171171879 +1949360186 1281070869 +900446883 542559893 +2751034025 541496846 +3663255600 2724017159 +3937011195 1688693293 +2987196137 863324376 +2209832480 3521904663 +2785872303 361119352 +3866865775 3866865791 +1359683141 3649087130 +3066704784 661278370 +1161684129 2708400502 +1049005455 348401115 +3799850686 1224172809 +1629022737 3946346694 3946346704 +3137564732 2724834929 +595449632 4279871347 +4236043403 241425090 +4152170898 737099973 +2419036372 3470851503 +2945790290 3118244869 +2301399096 690423867 +2101184060 1675251825 +2988157417 1250720216 +1446558326 1745667218 +2361200963 1330618358 +2811332206 941006649 +1236604308 2618357753 +2303900345 3862688055 +3364618323 1211738550 1211738534 +2136874317 3458736164 +1447685198 1476280452 +2392658079 2636750321 +1280871822 3177633433 +4065961573 3894472954 +440940027 440940011 +2201901703 602688729 +4064217180 3040487633 +825895127 1435388518 +275103522 3189085245 +1045520037 3643530083 +369147449 3693835176 +1404843186 3420522635 +608031363 2421318716 +3373230033 1413508614 2808951649 +2028675958 3449477299 2000932673 2118376019 2865318218 3492336337 +2354308797 4032748315 1624878498 2354308781 +3061950633 2849513477 +553734591 3021189032 +16777626 2591276348 +3321008457 898449847 290396130 1474955360 379023122 2600499769 298883604 2802061580 3022738960 2245498041 4258331604 +739707296 138684133 +2501714945 3185552790 +1048213080 2999471236 4138091887 +1941412025 3808783166 +2246811703 149763718 +1601876468 1109795609 +78682604 731693529 +3795358640 2255641172 +2222187139 2222187155 +2185027295 2884566417 +1514371905 1497040726 +4181179763 4181179747 +1722245436 48721136 +3226769460 3226769444 +516736417 2892877265 +2204103692 3691851489 +691635791 339195034 +2332251162 3203591178 +3147803190 1762038807 1762038785 6620042 +342237367 3552935952 +4179101838 2933225359 2933225369 +912352397 676415972 +3917582071 2381582022 +2679053759 531354558 +3216356590 4238125433 +3967231676 4220647911 +67136244 1475464049 +3031899596 1970496439 1866785868 +54780504 2078101659 +2793751361 495479271 +1473753772 4102964417 +1359295523 1359295539 +2880932990 3107500958 3488754271 +2387211168 2657780965 +1683556387 3896464378 +2600535198 2694464703 +442235955 2983068762 +2656124221 1994614530 +3532548665 2939238312 +2430100790 984044551 1550403350 +4141499110 2140622849 +2829954691 3197092241 +3318657777 3522184064 +1879907499 262414644 +2076769834 1478770533 124263437 +4168033807 1591196236 +2871869159 1597638076 +3453961637 3145376428 +857490827 3017629263 +1719105354 2551236987 +3242126285 2143838514 +4128062044 3000164049 +947651241 2486710296 +2924132525 211859538 +2096362502 3121161569 +1353788200 2407529399 +2911609787 2880763319 +846734874 2367945469 +2360763289 471779806 +2177117862 3990187863 +936842386 1026098553 +671491339 3783826375 +911522343 3804555315 3804555314 3927388345 2925595488 +4155918356 133396345 +1678216290 3363894761 +424106174 2303767327 +3208703277 1077239250 +1587051094 2833582535 +1011622210 769153763 +1371322850 2143420382 4234529385 +463597533 463597517 +3784630747 4167011282 +3796571651 3796571667 +1369160052 3961844111 +417682686 3616333098 2483309446 +1831340344 1094746067 +434387570 877134181 3227142170 +1127258605 3521514491 +3804088512 2911133271 +3198823012 1975977560 2313206633 +1062984272 2642749864 +3559248566 2911548561 +2043836687 1814218074 +3989332937 460658040 +2063723982 1913215823 +3434547374 395410685 +692851938 386294318 +1792014086 2082534522 +868870399 2245642600 +3688024165 3688024181 +3927415495 2390105485 +1090276697 2479551049 2560417675 3799774868 2638947158 2465255404 4270190781 1785919847 4224175860 3312194920 1550047819 959210364 3035309821 4203907319 1719557127 3946372558 2356045455 975950535 3706836107 899809121 278501317 +3491839235 928078985 +3739825157 2977607741 +2578541285 1778471330 +1056903818 4287124374 +2033822871 2905647925 4078286850 +2034341670 138473665 +2905973991 2456983478 +2884184433 286014694 +986244758 541261351 +808296701 4153762677 3644580419 1282299927 3318901208 3519164990 1449258890 4101095337 1503862222 2735053343 3244202542 3932953877 +717786335 951436040 +2532026438 3999623303 +3484332310 3000662411 +3187608250 657196437 +3384640855 4064413731 3319080618 +3249321793 3810064548 +2461439045 2350276147 980117644 +2273287941 1390892250 +912824030 1132962314 2225438591 1334293758 +2132068327 3684174820 +3844105027 4110172796 +3619002148 2194283196 2686981607 +752562499 854009648 +1019238743 2567781891 +71071088 3952177159 2735805644 +1264841031 4115976896 +4101417036 583724961 +273545081 2206247717 +1023749382 354803831 +2697391255 1229628259 +2504064915 2287096954 +171544611 1000204042 +1613723622 796415514 +1761795881 2290443944 1205409433 2022002062 1761795897 +3302110112 1970949623 +1475222473 886422894 +2540835619 3392043315 +2207420795 4126656095 +1164647405 882701828 +3546453614 2597559980 +679606694 2532848868 +1968649276 4098308721 +2648394907 456759314 +48866051 1149849318 +13912032 774710707 +1459631912 492229629 +2289530619 1069857330 +2890340826 405764533 +1035115602 1915491603 +827242071 827242055 +3369703185 1065930703 +779685644 2750078752 +60839133 1475221698 +2753924742 1063213265 +1833393466 1096270411 +2974405400 2942624053 +849577629 1416423732 1598357106 +2744923309 1004989522 +4273096744 447190781 447190763 +2707361362 1520667411 +2376760315 4267781170 +804453479 3233851207 +2773896373 1030933417 +1558696182 542500303 921563985 3214276801 3961550848 52468788 69246410 +387420973 2217265042 +1922210104 2496082733 +351563505 331761271 +3408846012 1239555175 +4125134498 522137815 +2570120962 705183797 +3594403084 3350641975 +3376504864 422825368 +2775389756 2775389740 +2763885750 207913617 +1808006966 3683303943 +594190239 791298998 +2539044140 3863834066 635032219 +4163152292 1169624383 +1823887601 1587113949 +4130623539 521353142 +3865863116 2292259383 +4225879208 745876587 +2583534507 2861197844 356257341 +2164056452 2450981599 +251936271 3614344636 +694189552 2507673419 +4135470150 1321564705 +2114575112 2317908528 1333571124 1904463261 1333571107 +3749137828 1825519904 +3040929028 464221508 +4144068635 4065333906 +3841781751 1898824144 +2684146860 2265107159 3127173948 1248144855 +3534210330 3088795627 3186767586 +1933023683 596053482 +3580500253 1723140996 +739878318 442487023 +2182831270 3383501798 +758174335 3766491841 +284164982 1172195929 +2426927077 2426927093 +2231166921 3150111150 589357432 589357423 +1227290856 1257348636 4201295637 208976947 +2128517572 1965787395 3908882897 355111418 2747413349 3641947068 1260557811 2817876901 3296937392 1283743082 1335461554 375000104 3897065732 +2418353280 547422284 +163013467 2796644434 +2723113599 33859048 +1532642827 3659285332 +2150408 2150424 +725183281 923030998 +1475883571 2931230277 +859054472 2211881392 +2529933118 2529933102 +152969033 802530232 +3964392884 3964392868 +4290025723 1415573054 +3191901173 1008083340 +906764511 4095196936 +2844478776 508202797 +607287792 3950376149 +559039485 1904281428 +3745410879 2924027966 +2277390063 2674948654 +1150558635 2687565858 +2802070737 4102506614 +328610038 2262522071 +3143786345 37307955 1252158325 1366014554 2628804654 624940571 3784295464 3003134704 799154848 821195568 +3802560296 4094530539 +613848709 504296282 +606862865 1312902506 +3869762709 2941048458 +98488949 2759276883 +335925958 3288908962 253163209 1261096382 +3276824556 780520193 +3707604207 201765496 +1099601634 254510549 +1861025633 3635084688 +906464904 906464920 +4192980864 207049995 3996624531 3611463352 2258314075 +87724377 2486357768 +2691525909 2691525893 +11929074 277568485 +2735782929 3294105296 +672519306 4199672805 +1098799151 1222955502 +1871474869 4153786320 +2013798728 1020027997 +3100468478 3914726367 +1440047604 317272847 +904243703 4232614767 1479098910 2504005550 3481964486 1423828639 519808665 3437741764 +116015089 2290930668 +219926225 1942393616 +1207373655 2699896304 +526414460 3772004657 +2026015986 4077829854 +217081251 3746521735 +238029547 1084305396 +738843515 3196348770 738843499 +3253289335 3107065424 +2399002645 3419316099 +4116919067 1713992594 +3641872116 428553310 +3227351715 1982336668 +2988710515 3788874508 +882259056 947162197 +2752010652 3575976081 +2415845974 71191911 +782268946 2023762515 +3099935045 595967898 +246162382 1332674858 +4186203655 1090201363 3530333440 +790145401 2631059816 +3639043643 2203683333 +2122259556 2249830761 +3657558730 4211383277 +1199662001 1102049200 +1687643363 1028903242 +379162424 3418125627 +752005972 2877921035 +1570371272 1452520337 +1546160652 1546160668 +31089054 263377944 223565677 +3988141960 3185142548 +2774766005 1169227098 +1489342227 2187116928 31914989 +2879256759 4265865784 +3795863617 2823725414 +4071153287 3277689746 +3910951523 1521410506 +1759146204 2194335437 +3256521879 3588546563 651684272 +3591666033 4024523812 +755139967 1509435134 +1793950928 2134893487 +2183223111 1993513540 +4066297863 4066297879 +2837781831 2355959510 +2996492902 2412105345 +3513562572 2049060904 +2011125483 2677396468 +2949590383 2810085563 +3203283094 654513191 +665708291 2042800572 +3581747323 3083007295 +1518844288 61408403 +2619662052 2619662068 +3721271042 2810339101 +3183622345 3460435923 +61295829 61295813 +3693061762 131276451 +3785580917 723386719 2220798746 +4248695491 1803888864 +3736986744 138288844 2025057541 +1572384383 2783318076 +987188504 3963360932 +1107163276 1859011703 +2235724034 54524994 3479027598 2099202315 +256159983 4163012664 4163012654 +2677480195 1440196593 +3697972993 13055165 4291244839 2326818342 +2645211100 1733365478 +3322935527 2988757920 +3917739556 4025931466 +454756231 848091542 +2140500622 644433116 +876639781 1719270444 +391277405 331285364 +2626344670 1284521855 +2141094672 2141094656 1301899644 +3445452471 3498289687 +3192278559 3108946575 +2574283080 3556922443 +1205454340 3803173389 827193570 2216832612 3876917589 3059262190 1547104900 +1898967887 1898967903 +55383990 3898364807 +2011742642 1969810227 +2064487207 2064487223 +3239480692 1100040159 +2851591973 4202223709 3056054074 +397783895 2628517076 +3129779429 2422707308 +4073746843 2345075980 +576349851 2941224452 +3875830655 2947491115 +3310166812 446085585 1751395852 +2660892290 2660892306 +2754161217 2915927126 +2415731336 863853597 727187892 +3886436321 2345647926 +3064200047 4079275950 +3797263034 1369773066 1943695009 +3074576027 1709056072 +2222016337 3478340742 +2295785815 3243332592 +3852009882 4072212341 4072212322 +1694182060 2741251287 +1232240880 3734305738 +2881762946 2881762962 +2749837002 1072078938 +1105791830 4155025953 +2128517592 1092204591 1615398681 336868753 504498848 13106780 2105086306 +1153541289 3856021006 +1632392766 1764475785 1431126562 +2046394368 63209477 +1210042191 3641098574 +459113892 3090768169 +3254748770 3342896213 +2422595174 3059554945 +920107887 3298561966 +805799174 2715183223 +2851039487 2714742370 +3934652463 384452632 +3857279675 2842887282 +2933990388 4068979324 2809456130 1350011297 2097923087 1663290837 1261490407 1132043219 2653161870 113804094 2957674826 2964792470 1292180903 548412650 1807109800 1404660116 4084947989 3795710422 1941736699 1721706655 4074539224 3040323969 +3142201720 1693549061 +497537351 1260299346 +3158426132 1870955897 +4059655926 2233190102 +2724267300 3267041193 +236470400 2955774355 +641222921 641222937 +3365912879 2569209351 +3185625486 1994214031 +3654337949 2158433826 +3466914793 916414415 +1778569914 1316109431 151584639 +186029917 1210081090 +3837638934 749362609 +588919596 2257419127 4267822306 3514153232 2447321237 1386115344 2585839312 4075838550 +1571865653 208384973 2990858090 +3104288038 3146493914 +2186532607 2186532591 +3799846087 50800702 +1319067362 2799853013 +612821270 2522934705 +4084756671 4084756655 +3025369113 4167438174 +3461892608 1631873181 3852886424 +2347728820 4130368093 +602316051 2878830900 +2090058616 2493298171 +2315492181 590032890 +22573534 3466424523 +2752348774 2806269569 +2419919288 3356904621 +1060320042 2811857677 343607418 +2011278609 3510367399 +3900597595 1509527122 +3499565968 3986382696 +3632032646 1641897265 3632032662 +4154792713 3500959096 +1358599681 3194208380 +4021191141 2034526038 +3668061955 1886472593 +296401299 3818663936 +849629861 1571690924 +2991405066 3614751602 +1337409971 1508401171 +4220110438 4220110454 +3375472881 2561273357 +2657109199 350541594 +753462735 1800911410 +1123366422 2114200743 +3242031456 2479231532 492464060 +4068081413 4068081429 +665970504 2478847075 568696711 +3437159580 518119815 +66003678 259253097 +2694684040 1612643595 +672578471 3491413980 +1136734880 1227010547 +94640622 3478442425 +2718790362 2355396236 +2513173025 2199869009 4045062646 +1948200914 2264614233 51506947 420482583 2984913985 3357867594 716290454 4275060218 3057319239 2998439959 3583234000 3413944850 564078935 +1997152203 312187577 +1594045380 1443528073 +2518379744 757884083 +1240577807 679424859 1988308110 +1928505281 3254439153 3036550358 +1861061411 4046706570 3100777490 +2780973894 1669882682 2484880273 920420129 +2019549895 1173487424 1542771154 +2502449705 2502449721 +336463880 2585175179 +3938318461 101592258 +1029910309 3357751098 +3332340271 3691862008 +2890147329 810013590 +2756466868 1479517017 +1177588578 3765961539 +1090385652 1137426969 +1136558763 4257159887 +3323875819 411816120 2403910537 +4175315962 2692939970 3219456651 3979372758 2692939989 +3528071667 4255570330 +1141063064 3166437875 +3068483008 2696044268 +3727703604 3727703588 +277719366 1507260086 +3613625759 1209698927 2687860702 703445125 1393047147 2106645160 +321327305 240775821 +654572924 3880258097 +1492118307 615458837 +1728444184 2623787187 +1099641621 1126263306 +1165010295 435981283 3344202320 +275849391 2434167662 +2697257257 1055814542 +2918155179 2918155195 +1420013417 2796364376 +336761105 2855951824 +2217225582 1583325370 +3159018700 4229048299 +1838848178 1012817957 +2829235469 337543001 +618821354 618821370 +4222592857 2391044360 +4246457611 4246457627 +90343004 3591996113 +1168753192 3379834173 +1750082779 287966404 +1447521358 544177881 +397126316 4013796567 +4133170848 2715707245 +1738403651 3519050758 +131248186 2326489949 +38729031 3914079958 +1925017156 3828651264 +2355966192 1155626055 +394560106 1872317645 +3337566484 4089040823 +1221904162 3715095594 3371530883 +1477370074 1768676845 +1293656973 87281851 +4042081142 4042081126 +2463005894 3775818657 +531863083 313877940 +1938043569 2890129335 +2603144615 2020982585 2313105316 3897054710 +550602838 2131240498 +3630523211 3630523227 +3161802443 3161802459 2006872450 +3357389666 535090030 +1316798658 3038052310 +1475032353 3133203567 +3922553102 2959918173 +660098874 1886264834 +3469049593 3467157008 +1475099376 1394694280 +4036469390 1286923673 +2030792456 2499791261 +1209936454 3447491639 +1684244483 196025514 +3608297041 1842359798 +162271962 333557035 +4171762178 1921499445 +1904783481 1904783465 +3637399208 4106605181 +1016355382 2475295502 +1051476582 254576257 +2637371745 1875879814 +2249310093 2599455460 +2184049787 2035411262 +90993567 1691560522 +2978801734 856205457 +1505412574 1419967465 +2380772231 3938426262 +3132511982 396631638 +1288527403 2154963535 +3789965202 797092549 +2488125578 7516475 +4062425618 1969752797 +1412656008 351422219 +2069558048 1345108851 +4186902095 724797016 +4188392014 1308457167 +2870734468 3098210675 +3695624878 1902409711 +1480526081 3963301014 +3101254157 188045924 +2883408116 2170974233 +1901983879 895035043 +749558367 3018146718 +812685418 812685434 1889862354 +3276229663 3276229647 +3588658816 973007763 +3983118989 1244771314 +3438062979 462759210 +2065912107 60343988 +1587752362 2766201485 537177039 +1360691333 834163020 +405424919 206551683 +1335912125 377600916 +3699254958 3365331942 +4181219229 4181219213 +3122696336 2437124796 +1906953962 1460373523 +3053153886 3053153870 +1957104532 3237570491 +2668620242 940381573 +4014363197 3904075284 +2805783388 1223947622 +3580004429 1903150969 1219211387 3243110488 951448323 3023531681 +2176703596 2850160151 +4207455815 1827363879 1472290912 +3843870632 1415243115 +2231270407 2231270423 +2089638280 2592338187 +3654613178 2755890397 +412757705 2209851000 +2921805499 2152662205 +3316490115 3008502570 +497309354 1611172613 +2817426196 1886935151 +87777907 2944138010 +2387786807 1128155782 +2456108538 1868599453 +2685300694 3434745329 +1924741360 3066675848 +3280017281 1161297920 220734129 +1861848582 3537582933 +1954540670 1361580958 3814804063 +3522870047 2897514952 +1099489764 242981375 +1840602045 1904175764 +1107667947 3656229602 +1778129188 3629238212 2192970024 +241706527 1814061276 1827568289 3438543582 +36369970 2611056819 +481153646 2476884783 +976050810 258305547 +2838148336 2838148320 +3153232262 846182482 +3012291867 2313080568 +38881865 4009226478 +1137520626 2919397861 +3076272489 539906776 +2180005312 1295070547 +3537702295 2298242214 +1657881620 2741906297 +2789901038 366028665 +891788430 4093040442 +568973842 1965181523 +742587280 1030882211 +711161461 4109880070 +2225016943 3371211692 +1630431343 1135327736 +3882019003 4222901874 +3493800908 2675044897 +237643929 4040529278 +227613815 3530542937 +445706463 723919073 +654955393 4118279190 2178236081 +2069201467 1654391524 +828135006 308016639 +3391520865 2897929862 +2586740612 994006239 +1894810875 3315685156 +1358718575 2103629718 3464064312 4148679655 +879867098 1761588029 +498203967 4264667710 +626740727 3317414854 +726868934 625313506 +514680143 3070503835 2583067480 +1300539291 2731792658 +3924105834 1356163166 +3036094879 2148134216 +1377337570 996103497 +3849414805 3330777756 +1499255335 1283899428 +347175689 2365983775 +1524264861 2732438580 +3763228412 3467225260 +269635946 3067488717 +858818677 174510140 +293008483 3779246026 +3311308289 1215741232 1122751107 3203764263 +4123082738 1302366619 3468205842 +1175785619 3861452652 +3361831672 1769247853 +1391153401 2171631592 +3613342451 1124925536 +1564338303 1198850024 +2801500985 3643015433 663749167 384799422 3643015454 +3445157611 771759092 +3098995292 3098995276 +1390590185 3720269278 +3143439073 3565467702 +3952592580 2558650799 +2805756047 3542429976 +698788430 2687370985 +3365415290 1099516701 +3324603102 3208523010 +3368182218 3556765947 +2365177289 3378371167 +337710797 2097826980 +371224613 4195387962 +3676026995 1604541722 +1135641225 400391608 +2690218467 294596816 +3338717217 2012468294 +3569472403 1545558468 +2974755816 1026921399 +2983056600 2350848154 +1900138946 211629155 +968638970 968638954 +1042135495 2638741715 +1222906204 453465041 +1559926780 607021489 +2063703139 636901200 +2973578680 3143340205 +1727077616 4254109148 +4071256084 374239087 +2920041103 2920041119 +2766649532 1422381031 +463262901 753064170 +3826290952 3338228771 2094286047 236212125 2741095472 3338228788 +1501725566 1501725550 +3360801869 313535922 +631684060 2270665235 128050883 +1596573751 96874118 +1908501693 3497930114 +200096586 276059515 +1618352485 837705651 +4294836526 719051631 +3654245188 627878921 +4232360207 3417029978 +1297860130 2835527411 +2465368070 3545804359 +3198132330 1025035686 +1079530147 3993638549 +1625306695 2338461568 +2665204658 3321997619 +3533328318 3284617417 +275297583 64305400 +3418282082 1506341238 +2368924638 2587490306 4278620649 +2189420184 2189420168 +3088330447 516496871 +3912921022 2595514591 +1138976155 1138976139 +1090554915 1090554931 +3874674766 3729425103 +1738495915 3403088436 +240550269 2088616941 1104548813 +964274874 720916017 +1878392949 3041048611 +2597102497 1361417846 +1884272671 3967736008 +1735432780 574809527 +3409424220 3877683207 +2756256279 2264822793 3849054612 +231602841 2098901282 +860020493 3208978802 +1267909671 1039860274 +2244808188 2647458744 +3321661979 2811987935 3347933316 +2414189523 1500794156 +2810021163 3583550132 +2715945611 952852034 +2307823731 3489179672 4269407500 +3743238156 1192782583 +495037617 2296263489 +3412681974 4136827338 +1736406030 4221809177 +3263231487 18770440 +1971594910 4044832453 +59834491 3601454399 407093668 +1573464076 1192682690 +834694300 991270709 +3530991142 1848893518 +3668472877 1513065145 +4257429178 877602507 +11860621 2850450404 +249813289 2578373528 +3899218388 2964118335 +699266156 148358679 +1029914052 1731869599 +1292426346 1132521170 2935159515 +3359861679 2235938914 +4072864438 3740314769 +2389676917 2930057532 +516651104 3465684780 +4132692586 3842909094 +3749023780 523320252 +2528808532 2611875385 +660786266 1996939214 +876891299 3934561418 +3161855028 224972443 +3981557448 1605326027 +2338521015 793330153 +2292975822 4107394137 +365637537 4024171126 +3489256025 3525611663 +3876280914 148844293 +96800054 1261685767 +3848581489 1052681728 +2086259316 895071385 +946307196 1190085425 +1935731870 364523147 2314143441 1853641191 1606053564 2025494024 +321056449 3774732758 +4014986311 27995072 +775278933 3514781617 +1949321070 2444476398 +1231994986 56157915 +2253519827 1175416108 +269047759 1816896012 +2931005428 49375210 +158935010 3417950403 +4168386615 148750185 +130055199 1392731336 +2718516343 2341914448 +2055370989 1504224287 3362020612 +1339255436 2837614891 +2928541198 3615944719 +248425564 767254596 2102184955 1590637841 2544990672 1951186383 2392884497 1406084044 2392884487 2874758343 +798698370 798698386 +256899281 3957633286 +2747255196 1659527313 +686931434 686931450 +2074038771 2395865484 +4253125565 4253125549 +813315262 241239830 +3060581668 2148531057 +2964848137 983885870 +1277380292 2676516511 +2731746822 2731746838 +3212997359 1767566894 +565393129 553707925 +1973991298 3130581429 +2813582177 1629641142 +1001054248 2637760597 +3169807001 98881224 +1033738585 1477994248 +3842766967 2633796155 +2840793165 3670190386 +2945936429 2952972434 +3520673126 693471911 +855256797 1236042453 483902946 +431916813 1385926245 2481887602 +297202006 956164721 +1283054993 3751717541 +1496800181 656760298 +2425887690 4231374117 +1914178943 1914178927 +2392356680 3255027275 +3031862914 1745019918 +631335614 1616407937 +648915349 204834860 +3288391728 3029523339 +4134552897 2798125437 +1953584101 862392684 +3248314413 4155625156 +1021110306 4055985557 +3216321808 3660967989 +3446149765 1190380960 +2024565026 426344597 +1835030458 1548669048 +3567316466 2874577907 +1646203769 1318273348 2494891430 3528589329 1615968010 595962452 3860852743 4001874455 +2041903286 1306756753 +1379945332 4013344655 +2140390124 221891188 1230464535 1370714108 3248216471 1269111810 1204322891 +841144495 1811045710 +2355663825 2650292086 +2922492300 1516718913 1216821520 +4080970467 2783592156 3467051861 +836839244 3513834657 +2194363294 352291241 +1623165595 3901174290 +795681190 1321990231 +2512860349 1461447115 +4278619140 2068736585 +1193148554 4054054898 2117785915 +2212427587 2723287939 +3180160655 4103631630 +2483328351 1647781000 +452542299 3512646724 +1582140655 1312482769 +2175992577 1036899280 2175992593 +354307931 1056304926 +53817974 1275351634 +669805320 195636177 +2234231603 3602809178 +2659646783 2844515580 +1065735844 2746278975 +3676852468 3205852953 +3328340152 3512145014 2062700541 2437577740 2210256171 307058860 1289424153 1093358377 1459437155 +113342749 1078757865 +1796530270 4024251391 +1764627947 724500495 +3481246629 2220800611 +4083918134 1752503303 +3132188423 4041904132 +2789781083 2789781067 +796209459 3900470106 +3413071232 2457653026 +3908005478 384486039 +1678319218 2250492955 +1810267097 3033855624 +66064859 233577412 +1222813696 3167647763 +4053040221 2847917684 +2520680908 3521759956 +1343895004 2120088412 +4065464516 2681323999 3486156420 +19351115 3794900846 +3650654712 1319072588 3994293893 2200815981 +3803008685 3605901074 +4219527558 1910703585 +1488050823 653984406 +1390516611 4230261034 +3209739658 3055181883 +3186912502 4257711953 +2706718594 4033635228 +162874164 2086193871 +1584902223 699893718 +2096095176 692978206 +3734462418 1293624958 +4292905278 3218916442 +4070450371 518522544 +2296330724 1533551103 +1636743493 3635259290 +2497062325 3248643347 +3371930372 239546360 +4216881010 508600435 +167145959 2972370418 +421876268 1224877606 341970369 +3941927483 2656188934 +3302845626 3138797009 +4287871994 3424729301 +1918884166 1390610721 +4258494723 2531753898 +1556558937 1721198622 +2584991488 2101035320 +2603668252 1776047367 +2026794319 2026794335 +2397377467 2644375074 2912817010 2397377451 +1140327490 1097774069 +2372772318 2174079103 +478464236 4229750205 1818521690 +1477498177 2013951590 +81716351 2468304662 +1847535214 1267084604 +767741562 1363201859 +816412155 816412139 +1238887474 1894306483 1904455642 +688700544 520928659 +469075634 3045263909 +2490143605 468459818 +3956226268 2412717447 +1933881418 3206644859 +386131068 644153798 +316266136 1156370779 +3492164867 1878338212 +4208626286 2004302585 +3591312639 4281278728 +1584086842 3704916061 +611630176 1399262011 +3080594617 3337867070 +1680183183 908131854 +1109504283 590198510 +3584441175 2880399846 +4082488215 828069387 2803635897 +3663125690 1145382381 3124449891 1891465437 1891465418 +168149760 187163012 +2654333481 2654333497 +4163173906 3629793291 +4108825227 8619586 3719026443 +2242027547 2046954116 +3379753754 368252726 +1307922023 539651126 +3517146071 3677760358 +1241472053 2986223484 +499042234 1189251715 +2008820358 2697052074 +225914907 1302379154 +1117212767 859014558 +925948869 2800350988 +3990467616 2137141064 +1508187334 3141026746 1236028321 2973446417 +2106271373 76282354 +2252264473 2953693667 +1648901236 2643813140 733424271 1784155871 +2208166558 2208166542 +3841965176 379944647 +1444940863 3547547432 +1752197915 2214108036 3787503788 +151530067 1110109888 +2939745402 1353243677 1445699158 80897365 +2497789445 1670685132 +279577854 967171039 279577838 +404534876 3755946751 +2357038832 2210595993 +1047417223 1151000589 +1544220111 1373679647 2490437998 3023330510 2322476632 +3160106063 3160106079 +4033244780 3060660903 +2539662848 1281911315 +3934200296 416719999 +2158178386 3538227461 +645989267 247429747 3074565798 1515203929 1663049084 4173707753 1498426328 1898314362 593187919 1397760586 516195252 +1509097870 1509097886 +2958252120 2958252104 +894431885 3313214962 +299829374 299829358 +4086468615 31487 +4289280071 3194197974 +2112053601 2381466528 +1971128701 1893068738 1657302645 +2525641563 411415389 +4136720068 1890679395 3939210911 +2978414834 1118427065 +653538172 3463253041 +3611190101 1670854650 +1653069742 3386410735 +47216600 2035158160 +2329649220 4160562555 +1770632209 3115159358 +2702188268 4250448819 +2207173835 2207173851 +1999993933 3585524031 +405714511 1336435852 +1215168371 890439693 +1397849034 3908957935 +4120112027 459076329 +1306319184 3452261549 +2926614858 1624252083 +2241192560 3136517699 +3055106361 755982867 +876852212 2884960801 +3251222302 780878911 +899160569 1467015912 +1755524785 1776451760 +3989330729 3522228888 +93496105 4007057816 +155068764 155068748 +1918639498 2432860205 +614700612 4052061449 +243413461 2884923996 +2638904596 2957174383 +1542682309 1262963907 +4114524005 1990296556 +1880386848 1403128300 +2015793387 263594466 +581488451 125712178 +887233995 3548838648 2407989557 +848497003 142070626 +3854588669 2865708116 +2747298670 349026586 +655646026 3742299325 +1979102275 1369301542 +356441587 2595464821 +920203167 4093920860 +3523190683 812138770 +124019635 3438864913 +1610293962 3797402619 1261012018 +86825587 1372241829 +3003811566 2859896192 +306921431 2742386544 +2597340269 515760668 +3412719364 1899377656 1003477833 +1232741240 2617236514 +3890375584 2842651891 +3105605630 1690031305 +3319530948 1029510047 +3427441140 3235866719 +203624154 640218786 +2784377780 2530885640 +2820344418 1579639251 +3293785485 2616243442 +2264722165 1965416380 +1807660246 1932963057 +798636321 281538272 +2668387917 3786479292 +317341031 589577586 +3155690360 2446161403 +3896708265 1250749966 +688029494 1641882154 3303948817 +3431092740 4112981065 +2071215493 3707557978 +2359148938 3607372019 +453773144 3958345613 +80797113 1305283134 +769284142 1710235321 +162981044 3022351828 +144554088 4165553067 +2123599340 776497815 +3296085080 3859583307 +1027597054 1771197897 +3851074145 544911505 +4119419454 3308851094 +1559319322 1776669181 +92761661 4046621186 +61114922 3859120155 +3208841388 3263604417 +2073184499 2051593882 +480254489 4148994792 +1436435839 1193764606 +3051975925 1401101738 +2659442021 4002776556 +4166898982 2009163738 565611201 3915157617 +4273079844 373271231 +1015326136 1015326120 +3836036299 3140176770 +3796780508 490207559 1803918412 1344109191 +2184647272 1093411971 +2092193174 1032280234 +3119588127 3315216526 3583658440 3119588111 +2525563272 1599638173 +1602938994 272595429 +3211388827 3473269087 +3421502422 3290320566 +4246945287 2239407382 +4251121508 1187738217 3535796068 +4222196294 1912462391 +1596546491 2300480882 +398098202 1955993085 +3795539920 4083891299 +3929736691 3772560282 2311919603 +3700946332 2877249932 +4268512438 4046727719 +695543725 4033705284 +2720243289 4022624553 2720243273 +2293331228 2983222215 +552515371 1889686279 +3135204364 968300257 +688029481 3085839768 +3575853565 507251444 +4125877647 1946341537 +430818236 1369922305 +2795992612 802181374 +4049410996 1254891528 2844957785 +915622842 203746838 3304369813 2749380043 +678737614 2109457999 +641557019 785306165 +3555995659 2639666665 +1222084723 3176385015 885598989 508284172 3176384992 +2650217345 754994176 +1081542102 2454567786 +3012466421 542549132 1952778359 +3479212588 2701531991 +2512344185 1001215049 892467838 +2877224568 1399076992 +409124792 460574395 +882100561 363195024 +3392170960 171548499 3392170944 +824562106 824562090 +76639021 3037883858 1575729115 +2686197991 4081568672 +3875547279 3875547295 +2951220394 2488004493 +1114728951 2408173520 +1595482691 824768996 +2491890712 1800084900 +2361499230 2648162812 +918060886 2054190183 +1692281122 3954884757 +4053548312 1895050459 +3529388389 2403844602 +3165801475 263039146 +2104573785 3527850270 +1021840272 1900688291 +1015933916 795495249 +3560643011 3691613674 +1423500482 1423500498 +2610339661 1078722738 +3180362877 3351203862 3883137236 +1465746920 3741087173 +1451598906 1851885405 +2749273456 1466522632 +2338299218 3112478739 +519422368 1558171365 +312767433 3241362898 +939303692 783592439 +308271175 4163462169 +3231331776 4072840531 +803757337 3767236303 +3059627990 3958172343 +1949916929 4149251712 +2488879890 2593205587 +3387266825 3714892590 +3793313509 3538969210 2322269706 +3704577510 1217996593 +3589859276 1281800582 2068443447 +2988781487 168731013 392170590 441968287 +772472159 4285493520 +3689263275 3648251966 +2922651286 735941707 +3725060406 402371858 +2748261339 345303887 +1650828521 3473054424 1045491425 +2604208150 1161698550 1892962983 +475187730 1332048045 +3568009155 3921697191 +3009435565 229246299 +2285430409 4203932078 +2562092600 1915809511 1137278396 +1521208873 3849685646 +652739347 2167978801 1640387990 +2753122823 1524375808 +2756782166 741248801 +2571725979 3289742436 3918919693 +1638687191 2573075824 +1440505973 3103558501 36531965 +2427276653 2313696603 +2776255447 2751170883 1451582320 +2897448935 3316353184 +100430593 1835600542 4292885019 +2781193038 1142952921 +2632297725 2979954146 +1613555488 3043489932 +1144791311 2653472038 +2560593782 2560593766 +3318244226 3698632117 +1221604534 1438841479 +705883855 181268433 +1660748647 994859808 +723624720 1738641336 +3378435878 3269386018 +4294374742 2316506162 +2739217940 433779056 +1810048931 1050631709 +3127516353 3921398256 +3527417980 4278094124 +1714228429 2783651492 +3830236617 769350520 +2571294123 4013317154 +2101089296 898864419 +1844283791 3692055774 +1644350485 1600603420 +289766296 3197511987 +940899325 1174974274 +2465983046 2828127265 +2739563052 1118318524 +3372835469 113648626 +3902875114 3070067091 2346936448 +1096518390 229720790 3642474823 +3125705941 3125705925 +2518711111 3046253849 +4169010730 1483754523 +2747747899 2306685183 230696676 +3906997933 3246782338 +2718256491 2035867508 +2411646282 1990947493 +1313175866 3250083842 1901975115 +793717007 1548363911 +3222842940 4077736044 +2781172058 4132222158 +1964250488 2540176915 3332230125 +2657332716 1122683543 +1117327983 1173882040 +3091358178 4068480725 +2550061720 3607159706 +797092559 2578637784 +341932903 2088059680 +3934788911 1665528046 +1673096618 1503984133 +4117485363 2344863066 +3117276427 2316499010 +347589614 2337671087 +3139706060 2891200402 4198576370 2749134209 +4017513968 3954961115 +121406711 1531269337 +345354946 3771217226 +4150169637 3265649635 +498170543 1835278712 +1762413836 3646441308 +113497681 4148846992 +1881458072 568528475 +2698739430 3142365233 +3427479092 2425691734 +3413471519 422458763 +1748910439 2164323638 +1811166319 1617857198 +1393140640 1479316723 +163932876 829817079 +3998782100 307667432 +3789533170 2474413166 +1840751193 23201065 286560798 +2813298982 698836081 +3863866957 3652068155 3652068146 +155542789 3932085017 +2717372251 3530954162 +3133033707 3834844669 +3936134559 4086872414 +348334575 348334591 +1151580691 549317612 +942850560 2011653637 +2262848149 4152809786 +1779724030 3527578573 +1378000671 1803582942 +638378493 200620788 +516633661 3068345346 +853802859 853802875 +3702355235 1279114768 +3622419407 3019024088 +2168744609 2168744625 +1876579603 1876579587 +921673887 439999060 +4216615840 1173488883 +1379995841 3156525109 +3158784679 1574867327 +1379477042 2717327525 +35614699 2668685848 +102947412 2454012852 4242387503 +1764487676 1565545383 +4012270810 2239970485 +2507056869 1286966794 +2866113950 469977535 +1714380170 1720729659 +135738773 1367955868 +2539161607 1697721319 +1904497497 2125504062 +1745399137 648605600 +3683364044 1759577399 +2743300256 3957882917 +3168196637 3240945777 +1755866878 3038990857 +623947092 3751861039 +3801072168 3494814955 +568608532 1851516015 +2104344288 1405319859 +2678958206 3697294921 +3383548623 1243378638 +2972486882 3407988675 +4124089121 994888221 +3553237288 2401606141 +1158134838 2777198773 +459963774 2795736415 +580124463 2650453742 +3923092286 1498413727 +1632767634 3418196269 +2921489259 1405765397 +2044472678 1000044417 +33261888 1259592040 +98739961 1020058088 +2750128922 2794734819 +1834585608 900395005 +744022979 1233542576 +1316050125 1231584932 +647491147 1031176056 +1785410364 3267471207 +3631856145 3384504246 +3261779525 1973775905 +1636382258 3170914483 +3890590336 2392326035 +1437016932 2508648712 +1916906007 4099850800 +430980613 4121402540 +1933805275 1313688274 +335731422 1585351551 +71243964 3861035121 +1634684740 2788804617 +2200775758 3457990351 +653320339 1509437207 +149566510 1482430322 2252954286 +634856538 2923743267 +2775594145 279107936 +2525702717 974355970 +3215856583 2248745536 +2350240341 3680115676 +3623662022 4101069200 +3556218152 3602894333 +2241033594 1273127265 +608546074 867139581 +1410251862 2838657895 +415082688 2995824197 +2544331389 1583627710 +3787027927 770998640 +387190143 3549511422 4121298731 3549511400 +725792957 81907636 +746717850 348418146 2863274091 +3507709032 2307329963 +1500994500 1500994516 +1912349810 464339483 +148776478 819603723 +4029565931 65110772 +2286574224 771002089 +771335278 3455965497 +4144912242 3956974521 +3434480481 2743554464 +3673473887 240094878 +2973147194 2436323093 +3530316568 1486055131 +2191642215 196602912 +3770693438 3770693422 +1616812923 1615192528 +2952788346 953512515 3137527658 +2516449034 684451003 +851277177 3678714607 +1809075259 4197712114 +1847293452 1631245537 +3268456846 2027226884 +1241303772 1284625571 +1885825063 1885825079 +4221631094 727981382 +3512193068 3871946048 3683734849 3107763521 +414963038 4067639513 +1132301494 3792179346 +3086098528 4062770981 +1107405976 1107405960 +2317418177 124943334 124943344 +73230718 73230702 +1493356514 23937219 +243357574 1537001441 +1555400245 1842562508 +3490347582 2148120415 +320851530 906860621 +3443050125 2969737714 +2478203092 1545235887 +363734562 3794703014 +3783830503 1455068094 +2848566540 1417374199 +2993484394 1266785485 +975217410 4095068938 +2222929005 2298637010 +2680130267 1434949316 +1213420056 4079631309 +2616715541 2621697052 +1718108185 1718108169 +2978718029 3518458404 +2998576386 1574027811 +3153545916 1820539495 2722801127 +2907116391 769887030 +804943106 2563356694 +4272918783 2598325645 +5451142 1658469269 3583615522 +1877623800 3748268661 +3635642383 831690648 2714018907 +2527908579 2217259463 353368924 +4191524039 305739072 +435520407 1954424486 +3035222196 4176233963 +2471727544 373807873 2471727528 +3356279839 4212695950 1072770763 186170568 3356279823 +551830890 827934157 +3763888432 1528888969 +95031937 1807425814 +1227704185 529792862 1239236847 +2425548566 2907594673 +3020862596 4146473929 +430845055 3080896043 3962571752 +2051843146 4048462245 +881778468 3090721039 +192813396 1803673401 +2150523526 2252907855 +4161009752 3738042528 +1474322664 1043893556 +3539051199 1193852523 3512939176 +2358097329 4095018416 +4285817593 2186833577 +2486622661 3553698016 +3442540328 1739989048 +4012895054 3566476754 +339279335 3166155446 +1264260466 1685592845 +274737840 2002989827 +1402779799 917935526 +3441295346 2008530766 +1960815933 958248706 +4070381982 216061374 +3649117194 1502304229 +499418416 3135887688 207465091 207465109 +2647938008 1296039195 +1016765754 2977844816 +153484218 550192587 +3244254875 2570909790 +393310345 1888757688 +672770073 2872921934 +603596873 509562450 +2318282450 904217466 1488172179 +2582869940 239431759 +2105501032 2351696912 +4197004044 883009478 +3382316681 3867468216 +3664621722 391827061 +2858440611 922097254 3158689543 +1302214514 1302214498 +2348079986 3296031845 +33178303 3690402494 +3847658935 3690996941 3156075632 +1441815039 2254135726 +508744466 3462546757 +676316543 4103333630 +1002808227 1639174919 3139475850 +1618775918 1733117945 +433320203 3013899348 534978607 +2006664637 107923604 +161680035 3467230876 +1507183914 2509371661 +3330416533 3330416517 +3716402989 3716403005 +2075744739 2814935114 +892766219 3487050068 +2608897651 1048145676 +377268090 3762005259 +2106771023 219039646 +3212446840 3844186349 +1875033372 1875033356 +4213603343 1821723544 +3712751774 4241146025 +1540713294 497960910 3477616335 +337958403 202824282 +2242988331 2242988347 +1381810096 1381810080 +3549179385 3881404873 +167094266 2813816477 +3033285808 1578456150 +1903816679 554913663 2422613225 +2026022044 3060343185 +1664224939 282823979 +2977393250 3237771349 +519842387 435593402 +1161284458 1624586189 +3831715844 1236860153 +2262822795 2383905464 +3614467123 3614467107 +971517438 2065821982 645949151 +626170237 626170221 +1430691265 2242294513 +2916877467 1281048594 +2875881481 3785029176 +752437174 2310483329 +1507874448 649482344 +3388537562 3445539509 +86532203 2307901556 +1040690809 521644158 +2063243638 1575957869 416471882 +471395373 1748749010 +1381982009 3844269736 +1190342967 3889592710 +719792274 3158913850 +1120243813 2745324426 +2275955052 2275955068 +3305180456 1218950635 +2502856705 3645682070 +3811440716 3982352311 +3148016136 360505136 +3299390767 3299390783 +2057695367 2587468950 +2021552370 2701905125 +2074127459 15687626 +1320312512 3474484290 +4141160557 618983122 +2374619074 2946760406 +1777006177 676546013 1062431245 +2863673470 828134985 +3560593460 1063186568 +255520786 197651525 +409431156 3738155673 +3906136416 360282623 +1105712857 2566338462 +1117991100 2732963825 +989328948 140022745 2668019568 140022735 +2634778279 3123955876 +3000185708 1794738817 3287475580 +451383066 1954956797 +2660256275 2955189242 +927294682 3695035197 +1421018397 1926302882 +3650450577 3992712317 +1339028099 660259900 +3822821030 1488633687 +844273094 4261529271 +2273212258 2920673109 +3155862290 436782292 +3499307228 3825267018 3093290384 3047549900 4110486533 867560017 4110486553 1115416790 3421095139 +714048330 1240182130 +3819130481 2945940456 +3031899613 1512478251 +776058441 443675896 +4006728094 955025218 +3412681964 585752471 585752449 +1824335814 4089814177 +2014907980 1534165431 +1769985694 2990463670 +517604908 3174545224 +678950688 3571058533 +3731045205 2493765190 +3270393548 2836192055 +2958845015 4168217830 +2265155066 22309166 926882065 +4248112573 1761967307 1278183042 +3924209064 3726860139 +78525010 2956539653 +3911528827 30141992 +3765597217 1965871072 +373250595 373250611 +3340722720 2523363429 +2568058076 3531273799 +2127876209 715558192 +254665953 3326037558 +3965808133 576729562 +2284949118 1345815967 3865532766 +422979507 176659232 +1163478613 2156509130 +822576817 145268054 +240718434 4164415573 +438108798 1192368521 +3202655630 3202655646 +1121579908 3239729353 +3983740186 732086005 +2426878158 3943239498 +3012429296 2559793365 83154780 2927153544 83154763 +514111619 514111635 +2425433057 1971852086 +2403297633 888960902 +156890235 865852850 +1592061202 1952527173 +2420471857 1314665776 +2564870912 2850826515 2850826501 +249128249 2570737854 +4087722050 242793053 +1284305187 2766117386 +2762659909 2113041548 +3153315556 3301054719 +3223187185 1612653936 +1975615688 664648395 +1314665762 2099750037 +598487325 1547824917 +177183327 4279239582 +1925017158 3364523670 2613812871 +1515963650 1081549347 +1100116046 2273757913 +3259011618 2886575507 +374662111 111327262 +1911988306 3131177798 +1666729628 2199079248 4294387601 4294387591 +2910860929 3650214310 +630644263 1400878944 +1946366430 2131198057 +1399020665 3194655336 +3669217295 1477478286 +814093465 2936103294 +2668799890 4072986257 3509139421 1534801068 3256524345 1281827091 1362493239 3414274374 820239333 4085738453 2540012466 3266452545 1138856316 176546669 +588709254 4185611258 +933364723 2265724826 +3994451756 4184486465 +2290617013 1205826579 +242744427 836918388 4216818319 3705215509 4216818328 +1023439465 325100863 +2770804423 3281351488 +1192509476 148961471 +3195819535 1126197836 +3290932685 2540306852 +2140470227 2861067564 +1163571710 734409439 +4231984957 1864397364 +3731170989 3758919489 +1276214121 679822926 +1502179171 1448761564 +2017173645 3537747428 +290609530 626971221 +3404786994 1363089613 +3349651856 3705886133 +4055272438 2019447889 +1574465983 2059079614 +1023918599 439775488 +2502130757 199008396 +3084313335 4152393769 573901598 +2732048814 4112997885 +1900414017 2453189206 +239410050 4174007733 +3793624144 897041597 1821671336 +3163792274 1852473029 +2798580376 801629531 +2123449944 553692999 20031116 +3382575117 3874369394 +2148586360 2148586344 +2669846924 972589276 +3322920081 3195237942 +3019648601 2935813640 +2363461940 709710216 +3942167297 1951525425 3867265686 +3742220063 1101258184 +1406689776 3986828483 +1584124871 1790861910 +1071190896 4072249667 +530948204 1035700759 +2170871843 242650675 +138044428 1609434204 +731825267 732128758 +4194635659 553088962 +2435215317 1149367052 1417808970 2435215301 +451165185 1832327985 1447720320 +1563470241 1419446390 +4267590558 4156322684 +3090608560 2927523843 +1254349755 1834149746 +1326603416 300401499 +813181601 3995802486 +861084042 1439773755 +834971159 1871803942 +3183495667 2830395788 +4001933917 3726913652 +2645274532 2645274548 +17183171 1219999101 +2557914807 3117746694 +4178696588 2736355176 +1578994799 2542015150 +4274155604 1612108847 +1317174237 3248821700 +509385668 3072082894 2412328351 3871296763 +2025273304 1416812839 +226320777 435032991 +2869774615 1558843174 +1178660797 1429825163 1429825172 +3863569218 3347529955 +1329754902 3684379569 +1425517708 2953762603 +3750428960 131253619 +1080378853 1147996026 +1348079137 2663661024 +4139457115 3280633156 +618887101 2639377455 +1047421566 2095269319 +3768695254 1956088807 +1251945801 852231391 +2496118743 225640294 +1417707250 3424084109 +1519218921 1973993176 +3568129105 2263364577 +255167580 2257743889 +1790653244 1085384551 +1749677450 1768781029 +1718549510 1186381175 +3414692090 4147230896 2044869509 +4135130968 4135130952 +441901835 2699846200 +809516535 3961621446 +393785603 4127106986 +1113183224 1802022756 +886533058 4045316725 +3028575178 3398032544 +3160868923 3160868907 +2493767727 1106330397 3312144762 +3559103171 1679127187 +1274880742 1274880758 +2584210931 4191495479 +3004116903 1343821772 +226121191 2894270969 +1045659309 16211730 +679906014 2848758655 +2618801975 4032955280 +2399177065 2262323288 +2230221524 392911791 +1606245659 916510704 +1077243612 4028466257 +585770607 1704624302 +3837342186 3837342202 160017565 +574231459 574231475 +100429452 4167173751 +2424089389 2424089405 +979338839 1759610819 +1114399512 1088298148 1114399496 +3300051851 3300051867 510377647 +3026817711 1719769022 +1701635643 282628351 3849219812 116787717 133565339 282628328 +2480698808 305302942 +1327581564 224833063 +3866541582 2992809871 +455092291 4137640316 +194582602 3773969829 +2920158833 1898796006 +603354388 2969194095 +828870322 2038560318 +3365908523 4267856802 +3597984609 1368975720 +4000296725 1859165699 1859165724 +1485677972 4210796527 +2664216367 346128507 725901048 +3309932843 2326862740 3184494269 +2161484790 2024768449 +3177113599 459748990 +3204091147 2943092820 +3401768382 4229269214 4005761567 +1043509678 3738420763 +2795839767 3374402741 +3630521547 1922110338 +219763988 3001085551 +1934453037 2950468036 +840651812 84243625 +3088404563 745426327 +1426345500 4056348167 +3966771494 1518612183 +3695785483 1323199791 3695785499 +727736404 3994518975 +3358631217 2742699910 +1495278142 2341857161 +1098135639 1626648806 +1956402118 1687601158 +3538566135 1066681955 4256982480 +64373405 64373389 +1566296510 3044972063 +1183093873 1941286374 +92844505 2402285704 +57304012 650781152 +502154968 4128867853 +2742841565 109941954 +1268832548 3015455512 +373385474 1742930187 +3530623255 3530623239 +2783938823 1301971460 +203432597 2815633722 +2990114339 267330414 +1479890450 3992354387 +1712346446 4189473241 +1200034927 145042097 +3154637097 3816913038 +1678357891 4266179900 +48637299 1606956949 4077871720 4230304930 +1832677610 3760570445 +3331487921 1234435760 +832590638 1103237561 2003053682 1298329977 +1557352841 3281633262 +1158673391 2803695928 +846010527 12436033 +430625461 485077756 +1779104808 2818344003 4217802384 +848507340 235496425 1773626401 +1752428131 2834168134 +461168235 592269333 +3149757586 491461061 +1206194565 3804488451 +1332262722 1138261219 +3022855730 3573975205 +751207842 224394922 +723599261 1361961364 +2324785908 763699551 +3159879365 1131208730 +2679471491 3988034858 +562944504 3394117997 +2264829058 3770220151 +3203509382 477271777 +3463632841 4035072057 3351884142 +2371897921 432458107 2889585144 +1639614906 2460405707 +1351681461 2303458282 +3467516716 2041845825 +485166828 1913159063 +3850788874 1552494509 +3758269719 3140084528 +496952778 1797504251 +2121831246 91101490 +759292139 2550873308 +4257899662 3043671798 4027527148 3265622327 4059403609 3632480570 4007815335 1245384078 1846211097 3839309726 1846211086 3115746496 329010063 2384290706 +2946548723 1830057882 +957505755 957505739 +1566908025 3035704926 +1801405173 4227229610 +2768302908 4236175207 +1633137857 4262562783 +1788803859 3947183866 +3465562227 3625467044 +2763030004 903235353 +2331735102 131595679 +1860838543 2442337484 +226803123 3728679222 +4051735217 1230240506 +507475750 3777093082 +3529413429 171224887 +1716556790 243004353 +1370264860 2930686737 +3732010841 2958089186 565701095 +1131617320 994569872 1446335229 +1132796160 1250319109 +3866348091 1249593267 +3912349522 1799591443 +3146265770 3781879707 +767399422 4164520699 +1427901618 2905078821 +2425980271 4167866555 279776696 +336632265 1596069752 +1739810627 3411103014 +3273553404 3702552487 +1258579998 1258579982 +4222305752 3340113960 +31578160 244016852 +2624708495 3472026608 +2547551970 1165758578 +3596563548 3554634961 +1090245579 393111682 +4131774727 3070311936 +918679587 4148310288 +3812713342 3744981662 1039114057 +3511809922 4104696071 +75120955 1198829540 +1950905 2070322229 +2255434746 2601439883 +1377453905 3395673824 +1676109196 3510950775 +1914025916 1914025900 +1823551194 3149141685 +633961566 2372027999 +1176279454 1052023191 +2320922981 954134947 +4176452345 3660641790 +3793578683 3793578667 +4276607003 1643721362 +2007553110 3032892273 +797829846 2993204967 +2331307362 563196227 +331659861 403667787 80879549 248655742 1892785831 1405613716 1162324735 248655721 878650661 4156745858 264441416 4139968252 +3145971503 3417281410 +1246134424 2791519780 1246134408 +2079671484 3743101937 +2614869271 1911204656 2221636739 +944174063 944174079 +2561616412 3753468379 +2295514502 3922522615 +3210675938 613930453 +3678286770 3572195635 +115373654 693782887 +2917799473 1798309431 +3308455120 551035196 1062245237 +2636956281 2636956265 +1578071185 2740224080 +1279184969 2811769276 4186262452 +1590952651 3145996747 +1240917148 195682695 +2067799758 179983418 +3694061690 2482731330 +1698241937 1099246587 +597896725 786533130 +4024737053 3252901044 +737357781 3761508913 +4225935190 3687672935 +3239871224 2785800068 4158794861 +700519480 4076000315 +2537413806 3294782969 +1603424333 3226757426 +1835673352 1120422712 +1798854424 3786480347 +2647602397 1244674018 +96494781 3448724559 3731184564 +3312875648 1829010088 1175262827 +2909649830 2912247327 52304297 3840215580 2444960066 2847827531 +4166497309 4166497293 +767845060 4098215405 +2917825395 2911565992 1665096717 2745343908 +2555011961 907712382 +1908832959 3227464525 +1864735044 3979674628 3372105775 +4037100761 1218879660 +3400707321 2132060598 2138163317 3976093803 2138163298 2115282960 +434387572 910689423 +3351625348 1055786872 4909513 +1079821113 2332512958 +2459042408 601475499 +1997311298 3637823054 +1396104686 3982450095 1545632366 +151513930 2172085613 +1432774527 2018570556 +3341966962 1447927646 +3892195219 3357860972 +1430493964 733367072 1164776417 +1915571029 1915571013 +4060459028 4060459012 +927258934 908909313 +3102321271 2396477776 +2072851446 276404658 +2513311797 2513311781 +432925907 1915473978 +3040063815 2271220438 +2080570631 1024017416 1222448659 1222448644 1068782080 1068782102 2183620697 +1968682980 3239572104 862261209 795150716 +3147326238 1860438057 +2458331622 2428957982 +660264820 660264804 +1580268380 2711158500 +3839638025 3342250360 +2404916581 4243597469 213272058 +3649459053 3681899652 +1131208707 660907178 +1055179362 1443192243 +3149743858 3763278026 +2013219292 3269543239 +4288325840 813154165 +2995651665 1720765328 +2267625547 283352596 3958350850 +882004234 358851217 +1268163623 623143273 +1421963615 3944529436 +1499692463 1721686638 +248637422 1114643375 1165726830 +4042864860 2441334092 +2503415294 3503436666 +1248094647 3541199632 +2346121331 2523471116 +933258721 933258737 +2477815506 1355484307 +1332636330 3033655693 +697107555 3422414812 +1622183121 3995557984 3825641239 3995558006 +3468445329 3468445313 +3170201870 3833040146 1940394649 +2222946324 4238984040 +3259347189 3367342506 +2851917041 2314641254 +2759806979 4150981820 +4053864618 928306451 +940551819 1368179851 +300526786 4107990389 +2619099014 1183094753 +3278665476 1530704889 +1594643922 1919621509 +4251694326 3868057425 +1923021257 2714642532 +4224932420 2981566729 +1445878564 1026919210 +561469587 542074624 +2281634138 2518492469 +1085846911 1085846895 +2563732329 4153585240 +2686888234 38173919 +1671913436 1671913420 +2114794849 3486189503 3684512190 +2611977224 494051467 +2301730165 2118995724 +3681562572 1033584183 +837511775 4103631752 +1876839105 3689917910 +612637348 1965623868 +610231209 3945390872 +4035342207 1883520904 +4088605571 638418748 +3509625887 1855085768 3630698187 +3963119228 1489589543 +3384831276 3320568919 +4216881001 3688255694 357601880 357601870 373519423 3688255705 +3993451565 3993451581 +160718346 512756141 +34424446 2756405835 +369568600 88685467 +3124510796 2027501473 +786873407 4292293610 +1631790296 4105371661 +3731023983 3731023999 +3349368521 2014982176 +2822887877 2274035656 +2687654271 994784042 +1096667958 481525255 +149168051 2988304090 +3110991542 1813574785 +3301217842 4084756659 +1636353121 1434640926 +654549363 3414162558 +2840422483 3621468844 +2465800333 3945676274 +4271739652 4220541871 +1618161685 3981619884 +1626808335 3020388238 +2673744717 2673744733 +1293178491 3523486628 +2444047606 1235902289 +1834766943 988295521 +2160053916 4183429457 +2142933549 1068768452 +4234517688 1536706752 4038755923 +1853922010 3463693611 +3273254914 600324917 +3397604025 2243639614 +2061252918 3439249161 +3894169785 496177960 +3941164857 3697181982 +555136717 1208530713 +91405910 3919683953 +175020660 3760006287 +511029479 996252900 +3398947623 3124396985 +1950848995 4021557834 +1908064037 771417914 +1337172402 700943155 +139373615 867237228 +2779195860 2125658815 +1121566242 848259471 2654034213 1751714977 2810457996 1595651089 +3713140180 3713140164 +2234390097 4169998736 +1011439176 247642997 +2962737609 2198822495 +4286539724 4031077382 1127210337 2538653175 3645192150 4047855004 +3978546051 1588652912 +3842194993 2284336429 +1861247478 2322210049 1861247462 +2035563942 1845724506 +3156342715 3833133938 +3490673357 1431419044 +73517277 3230575828 +1915459301 3163813825 2677967468 +692477125 2388147129 +2066600784 1517665111 +4135483930 588920573 +4281958181 1511569671 +3969423438 3258434255 +2699255651 3430765136 +3777807694 3506444957 +3597784441 238226814 +3357389678 1958835759 +1233195403 1093574082 +4201071549 3985613442 +192519782 1987336833 +3246655655 3082218567 +3815605225 3532736325 +2070711255 585114480 +2349115869 1942135320 3482781865 +2673192311 1496356605 +289829705 2061990904 +916931227 2861446239 2756565508 +679667151 2500838616 2144526363 +1413651886 1390295289 +4030646975 1213716020 +1878668723 1878668707 +1965400674 3382069611 2394117806 +2281499776 2468892051 +2756071428 2662331977 +3637951021 974249184 3667219233 +1887535230 1810588386 +302258419 1332954764 +1213441658 1213441642 +144669998 144670014 +113506508 3847305010 +3980807187 196118810 +3424204308 1605378415 +2923544255 276776638 +4177308505 419214910 +2825156370 673673541 +2085694862 1103804057 +2352720133 3337294554 +3702808064 1002870235 +2131440991 538807607 +2866471965 415263857 1773799114 +48994307 2615168170 +789173542 846891713 +3968385700 4283066431 +2953874489 2617550127 2869867016 +670121291 4173194862 +3427122193 89932193 2730954438 +2096782732 1243693943 +1132284572 3661394833 +655853190 269010145 +343536192 4042713704 +134212816 4185080559 +2587786220 3160216727 126306071 3071451900 +4240118798 3542176943 +1325333083 3060014418 +2276464583 1630891606 +1631300896 1899710971 +588946988 619024192 +3975148061 3037075458 +3446146014 951981673 +2036995859 889344748 +2125364622 239927879 +668749963 1523770386 +755790838 3768224849 +2501621674 1688346765 +473891444 3605742792 3945847961 +2323786889 2326762233 +2779785381 2035284908 +2349009278 3871863135 +926635353 1315237902 +2016081634 1788503329 +3743105597 1732865145 +1039518516 3557758284 +3616393149 288452244 +1960559674 804644683 +190590419 1078678310 +4070841715 3722957325 +4144338240 499774419 +1669321144 2983115859 +970153025 1220164160 +1852965736 1165712573 +232756459 2127186713 +2041432645 3516230298 1329611993 +3456543384 3967716678 +1169392534 1298788166 +1982165705 3589524360 +1581652877 4116537074 +4204019563 4204019579 +120379701 2157571690 3696382157 3696382170 629896083 +2063281956 3446361807 +3535053028 2790875151 +1916895234 1561337602 +263796035 366922544 +3708448462 3312217679 +1463220360 3548986891 +3698898184 3839014320 +345035582 197452066 +2254674511 3721128536 +3499792111 1415879483 +2463131350 4094812913 +2829749310 3262825878 +1719495039 1974780732 +2609927056 2720329213 +2932413572 2861255625 +3226745538 2258141045 +1622009846 667166801 +2456065705 915411093 +166086919 2625959424 +1123831914 3387563466 +3990509329 3610106621 +4287074685 367670882 +3436417258 1527586907 +2107178017 1804294579 +4201509333 3925410019 +2547189443 3291718908 +2697814086 1766755873 +3523128937 4243361624 +3131088938 4108067355 +3358952198 2705516881 +2731469913 332720308 +724063649 2441006176 +3408095317 498941404 +3242446862 3242446878 +3644343154 2066134622 +2164217832 4193739307 +219586247 1637610304 +3163140220 1916516652 +43471948 3499179482 534105267 +2031359585 4221516448 +812745132 2326934964 +4127351943 3435413632 3639708051 +1057618260 2427682607 +3205667971 1296851498 +1553639022 896794415 +2219628764 313993014 844924759 935723856 966116753 +722201917 722201901 +1177534506 2595392958 +2387781512 4051297200 +471683872 3974389755 +3104400696 2122791876 2177521453 +480315354 3950992427 +1295175650 107274486 +3602897836 3154563031 +2700059902 1463860169 +1443528724 2257035129 +492127808 1832752837 +354091554 2489061162 1535400835 +1039943832 3421704914 4254485270 2473080437 1836611127 1783740360 2302229018 3395952148 2264178977 4005658400 1775671685 3648043258 1566159481 3267457502 274354267 +2344885051 3286191614 +656315901 656315885 +1168830462 427145633 +819678735 4164673944 +943346014 3788379881 +2826481619 2278020141 +2476465227 2841364994 +193749627 2835285938 +4181603142 2927520647 +2699221466 2699221450 +4209480291 1569419740 +3941434141 3743455070 +3950678300 3455217425 +2464319165 1234783650 +537574728 1848374295 +2316190633 141183154 +1452736164 1687152743 +2078955220 3857100719 +2355142467 2355142483 +3858621969 531705030 +1127750701 818608274 +3060622842 3069138201 +2955726271 4069813365 +2321452053 11759290 +574266870 3124627317 +3379585996 3891075639 +3921154730 4088964883 +3049918276 1897269279 +1985169795 4080625516 4063847894 +187957482 462937925 +2393890830 2900211225 +1723919102 3216109023 +934479957 3557876973 64363978 +1980551674 3139306198 +3682212394 3682212410 +3849505285 1083394822 +943878217 943878233 +2299629162 816001243 +4082419835 2306316708 +1309238633 1309238649 +4181546752 681490139 +3070293803 1099241652 +1132925404 698424647 +2014019039 3642172936 +3117677445 229962316 +3263459964 819595313 +1600642174 1600642158 +2931233885 1731530356 +3905884273 346397974 +84929638 1578181761 +333840553 3650622341 +3813740623 2065112894 +3009177884 1987671825 +66137810 2880570894 +2685206454 2859895707 +641138394 43200829 +568608515 1566296508 1566296490 +3684859278 3691341565 +1731219846 1731219862 +2262642955 3993724149 3241041976 +2554954973 1379059924 1530058472 +780916497 3081772615 +1819206229 126766044 +1975327990 1975327974 +3039730605 1722303506 +2998226685 1349212226 +266338838 329468081 +94934074 3155340182 +2951243272 3892425013 +3806742823 1468344438 1468344416 +3987100052 2966580217 +1929716151 3356758790 +245123743 2749913418 +2385861350 2751459970 +3749610988 1663693404 +4110774495 2526064414 +397038320 725773405 1989187188 +3432488828 2393903143 +971652238 3116192655 +2907670913 1429566998 +269569914 269569898 +3718372733 1657777108 +2660541572 671022025 +1301320294 64794534 +1966247679 2512178506 +2289113590 3222003271 +512448485 4200291706 +1041796398 4003872633 +530051882 3862153997 +4169856315 2109737970 +1544733375 518721464 +3102859705 3720762942 +3270675606 2504217810 2532882706 2106299923 4218384908 3962257885 +1893535822 4194347727 +3603324393 4109341518 +1039412699 2813800863 1650732996 +2079926273 708442518 +1767609275 2519306084 +2214215960 3311879944 +3941989563 3119949215 +1603589537 3339224701 +2273167929 2214942654 +288761754 3302553782 +2883702350 1368052175 +962070854 962070870 +3082400697 4065717288 +3004926713 375312100 +3808191317 3229956076 4256630935 +3682296093 2937007505 +3436840598 698415246 +825091969 825091985 +3012694419 1106356844 +3502484427 1622556491 +1598319164 3898899321 +1924320089 3900054792 +1721572993 1560084913 +1019096160 2820397143 +3859347752 654437697 970540988 +3443962686 2196183113 +2127053847 1724180898 +3439788250 2617661227 +2185324187 1777268808 +3060409014 3742672007 +412113052 3131487835 1195081112 +4207819469 87410725 2678493362 87410738 734519419 +640903411 367933082 +2726219215 1689585690 +3226514384 2741692459 +3099380895 3979455324 +59659367 977000036 +555977077 4076804890 +2359064969 3813888686 +2684697808 3091118965 +4024063893 699916188 +2412328333 3871296740 +2102991032 188869037 1707268933 +354638402 2292651491 +156361396 3190930232 +3465434351 2948119160 +3414917036 3754031782 3770809404 2070368471 +3460917214 2731878323 +2116865143 1472105186 +1268794939 3048731989 +197381180 3241837169 +1777785616 835025711 +2642450616 1760975684 2842716589 +577509179 2564665403 +1278252628 441766404 +3822679194 1230147197 +2750960142 3147986962 +612144523 4213139924 +4179267706 2664525835 +2327674075 1572015518 +2964931308 530864513 +2949666625 100227926 +646608587 1996030338 +3059762866 2777796187 +2615951672 2352278737 +541793270 1738444992 3406674881 +3205826135 1448282050 +3075192291 1865372764 +2181993346 3125440413 3929805518 2588629774 1603461988 568284429 +1585720362 4094789133 +606525134 606525150 +527688309 979211729 +337797488 572482389 +1420731283 2118409498 3521865514 297478679 1420731267 +475306572 3845055927 +1140609559 862287856 1426162161 530784187 49784703 1700842257 1618679566 1826059384 2723397556 +3101927266 1885372245 +583087980 947193119 +695321497 3608603095 +262335346 259564645 +3306993744 2620794357 +20139599 1470943815 1276052950 +1311056638 3135530957 +2831829440 1987189075 +2125621 1477375788 +3885163203 1329264874 +571590968 1866752780 +1168387524 2954888190 1080445129 +658266665 4244768680 +3765026688 267903851 +1443055297 3284395612 +2325175447 409135124 +1999663878 1999663894 +2233469294 1088098232 +523528688 1071373131 260228309 +1740285276 2798800849 +516957234 2365764311 +1231532151 891990171 +862320196 377483084 +1491277517 3128747186 +3478796486 822566817 3478796502 +134325297 3415570736 +2813340340 2924689743 +2907070026 264662651 +2356924637 65653730 +3173601707 1930137652 +1292658143 696540680 +3987873248 258279333 +1934868306 3738578451 +591351829 1514918586 +684908582 1777785793 +3150072178 81370739 +3186505456 3993009109 3993009091 +986873072 247440971 +794571576 413776339 +2554337784 2766725485 +2093471339 4227593368 +488779727 3105269478 3328137062 +1941680519 3078125440 +131072009 1433407032 +3809702785 560811581 +1440932173 1440932189 2231833266 +4230168530 3179116435 +3488631826 1766309957 250856122 1766309971 +2892097805 1797382011 +47752535 3524020198 +3864521434 1986442557 +1170858889 4132413934 +1008079366 917522503 +689244447 3407698888 +2110407841 2791967072 +718966543 4166040870 +619704543 79179550 +2720966446 2104569209 +4183114961 418418455 +395021224 395021240 3098335613 +3941402333 3233304336 1138546987 +3790317084 3790317068 +3889753559 973077315 3514722672 +3679932263 2977038121 +1453765754 2119574850 3798866955 +1906331415 4133257510 +2521677442 509798051 +2086578014 654407935 +2786572258 1498839253 +1374228447 81286398 3564112847 3504602142 +3816215340 1074687553 +1683793090 1661469405 +2114197269 1970296323 +2129223796 66514318 +2603956181 700900444 +337646043 1920265407 +2654602377 2656379832 +3764150628 3764150644 +3249156154 417983325 417983307 +2669565234 3480143641 +3084605495 2773212816 +1375854522 3539153355 +1978698960 2041424739 +375116642 2492318531 +3528204031 2600219836 +2573268005 2560644652 +258757630 1416726303 230143454 +478682664 3280172611 +3623469269 3053425018 +277757083 225359884 +4215614426 3069762485 +2868718322 512400101 +4232640893 3167608436 +3495237805 2734020676 +3376259901 2568089361 +355814603 770171778 +176310149 176310165 +2885969488 451743733 +535351581 535351565 +142086644 2622089181 2430693268 179675231 1225016079 28676649 +506629408 1430070207 +3186399626 2239083579 +601380188 601380172 +2002137488 1823475107 +3237397907 528817174 +274377403 2042283108 +4257889058 2652672930 +4229009247 782545544 +1366103432 3255872675 +1574035009 4066435136 2740638439 3833669478 +3201680405 2139335964 +3240252886 3742179303 145307830 3742179313 +2994878595 1213352145 +487002124 3189654263 +2227404818 297966661 +2856556362 460633822 +2874880597 3155042028 +439599816 125542621 +3833237008 3169690421 +3752605091 3206049674 +3218069188 3625289470 +1667327533 2673072338 +2355558276 741894265 2835240095 1640128708 +2720101040 3936848643 +1629319175 4130488741 +2990301885 1376743316 +596815878 3357087313 4203227002 +402493758 36414623 36414601 +4115917551 780052510 +3564796589 701439570 +464799631 734832152 +2006843192 2546324663 +3776013530 3776013514 +4081932007 2767242695 +3497777178 1291137259 +3794357273 264227495 +1555912521 354288440 +3709620103 2593206678 +2642623493 1823894273 +545393490 2125976069 +3641887222 2928930385 651333834 434117057 +2097249666 1264096181 +2617605063 1671551552 +2392643269 1172707340 +1486679000 1460094221 +1896184344 2292268860 +1739700991 1003052926 +159385221 2039104346 +1530073486 1530073502 +453738494 2157236591 +653015724 4058012865 +2372510799 3964512334 +35754976 1291742907 +1401233944 2459216859 +1473865804 3111647863 +3044642822 3026041185 +1622614763 479679768 +1476486378 1165878098 1949424731 +3100426417 707880769 2605930150 +1641449904 2650565639 +704153044 3862604976 +3217388333 1345955730 +861062170 1705532346 +1649304379 954652136 +2254610972 2839884295 +3581871747 2583117866 +327033917 1836836642 +2526395811 2964948884 +1187808487 1526020000 +4118725545 226903934 3129921294 3335520987 529400600 4071764735 +1907950073 1832150127 +2307387341 1308524466 +2653733892 75010655 +2636786458 2204228066 +1681850432 1966610168 +1272689314 215627029 +2069045779 920560620 +4097399011 1497820508 +271602252 271602268 +2848951021 1052226322 +2970695853 4016875780 +591060540 2980829304 +4057329592 1500318276 1808293549 +2491767143 887864630 +3680517729 3112317600 +1284185148 3137172071 +2705521475 527534698 +2701738734 1871994041 +761229798 1396722967 +538029324 2999954720 2999954743 2047567708 2278779361 +465570397 206590050 +2589504811 2589504827 +2279968570 141636336 +737752076 4246475379 +2065826674 2910569501 1217096826 3141322326 +2837453720 3582685275 +2552192574 1296251721 +2756672331 4095678210 +3851338221 211901063 +3519397079 289949296 2764497475 +3432038861 3571520946 3495241509 +353139729 3242126892 +177692896 2353889459 +773007635 2603198700 +1630854887 3980060086 +3255387489 3583522720 +1856521683 98954042 +2498161928 784142389 +1316510739 1316510723 +4053818664 2272437739 +1531244993 1604994448 +228739658 2022420822 +3481281505 651701540 +802376402 15091061 +1575559845 2063698348 +2465825033 1741037870 +4210304800 777623404 +2866386665 3716714702 +1910067010 2065155317 +2498730942 1456411786 +2121909935 3367224686 +904634548 1863090644 +3848991806 1700691337 +452288913 21534544 +4227626416 1584219139 +1577150657 3036804592 +551830900 995710351 +850333491 4237618522 +115714107 169183519 +1305957697 2972299239 3405460800 +1638056362 1563877005 +44833883 3687908382 +2694786335 1505125042 +3516953851 3516953835 +3023931698 2599915543 +141484454 3968677975 +1522961315 641792144 +93436136 2892371261 +1330425885 3903279671 +1840751168 4162087621 +5932038 2019882288 1098289007 905281115 890700805 +300955736 1544623076 2502472333 +2787597040 1113240651 +2206489548 3579609655 +1777345736 2366236381 +1123831929 1350709132 596400837 991547475 696839595 1911053067 1210314080 +211007269 2491332433 +2466053589 960730698 1868928621 960730716 +2249887339 3247431701 +914309291 1968360756 +220329162 1987336685 +3776315037 4070560052 +1464719626 2307849869 +2102430869 596277722 +2308912871 2359520694 +2581998208 698906203 +2213248202 1386839072 +1358584810 4149293651 3689887424 +1794642402 1183065795 +366374820 366374836 +612813291 1798298850 +223886974 967773410 +997683771 3624456946 +2569644741 1957832181 +2482563331 64415994 2482563347 +3261229691 1161644678 3933823812 3221437956 1937034131 1236225225 3108756288 +420803496 2556465424 570820565 +671037547 1640353890 +3098843934 2050745627 +3043176216 2736988877 +1645012911 156285038 +1845096392 3899946955 +965454396 3537697905 +1452260791 4215777030 +2307704264 1352358356 +512303448 722521840 +1321629888 3262125651 +3329377070 3329377086 +1439738179 3821360182 1517974634 +3205384109 1667092498 +2665168262 122298321 +2711292697 2148694110 +341764731 2355830692 +173327989 2235767249 +528403829 161312572 +310854115 233617482 +3509768749 3421594483 +3924095499 2471921976 +1198325553 1131759927 +2587027878 1233381722 +1581941282 2437602197 +2227460503 526953748 +1429374708 2303768212 +2385814546 4007544901 +4050414291 3769379386 +4031408224 4031408240 +151731698 151731682 +959674674 1040697779 +315326316 3937881344 +1628913667 1628913683 +1898020052 2673287357 +2059020675 3274267532 +2999902532 3215760905 +1795597120 3144875480 +1156764872 1380251357 +3015275823 2657670225 +2696041505 2537644467 +934315639 1222993538 +2909902231 97753775 +2774322759 2551757248 787245380 3964106265 808045573 +76049160 717258123 +2164212638 2950132137 +2171185502 391487231 3133754217 +686397511 217126623 +2674619623 1599167155 +1026428075 4202557748 +1017608492 667395671 +718363911 1855287830 +2035075773 2247779802 4220991486 4153881013 60245129 3993941774 2967676820 723573707 4153880994 +242452295 3477776665 2405976658 +2783059924 2380734516 +2585397505 3623497766 +4182335149 461376068 +2567313862 702524354 +2163009711 2389495276 +3466751598 3935299244 +2706737810 2449402717 +1231446387 3176450806 +812948527 2678091116 +1379477035 2599884212 +3773527732 428700447 +3001463831 3089989670 +1897978358 1410817382 +3423673385 1743737998 +4112119658 3547554094 +872316678 3952062532 +1122204863 186474686 +3956576733 1577601719 +2092788961 1060267574 +351744817 388718016 1811348379 +198503075 1127046794 +3966306707 2691915629 2511152662 +1143932981 2332683114 +1788604445 4034592180 +2333862194 787487141 +1671611595 2755382146 +1309835759 3592588088 +3824861387 3824861403 +1142324691 40375084 +577582738 3287082949 +78843966 2749534601 +196265473 281033347 +1371370703 2084495822 +833669798 3746497345 +989519234 2939441238 +3393806733 4270100722 +871965852 1832165767 +156390437 723924935 +3772765333 2802382423 2840013612 +757858371 1598318972 +3777960283 3626297933 +3212071544 3692942075 +1606042773 2974681267 +1732781941 194387242 +1552451279 2045523918 +1687061983 15980107 +2770472805 303591638 +1189346386 1541205810 +1021082577 2685856262 +3336519445 3624355132 +1397594649 2331570987 +1391715312 3869404820 +4059809157 1330028291 +903598722 3347007114 +261152627 4226556254 +1593641052 3830720711 +2580915549 4247330114 +2282680583 3533244412 +2444891737 3237031432 +2075719777 1056841350 +798218925 3751380831 2949139743 2938425224 309106875 2462137924 +3011761325 1166527556 +2121701287 1614270418 +1974535304 3450479115 +2998817463 412890630 +3841261744 1860072310 4193635477 98295075 1865443003 1101652387 805755149 3971054829 1461851496 3287073128 1042622567 3727398356 2046168013 +835361241 988819592 +3519108468 2807661968 +202426461 1533766242 +1449935436 1399906182 +3387303835 1884313874 +2579844289 1526888934 +3301380458 794847707 +264074585 264074569 +1583851547 2778763285 +4211049683 4080932922 +2306365621 1192008794 +2900217543 3188891076 +2263897829 1364773484 +2823511443 2175028858 +1879600268 3913474167 +2579875151 2579875167 +4263723772 2863211692 4116352176 4116352167 226652849 +3305674952 3420846999 +3109477794 1707009539 +1329265915 3034332964 +2755790232 737070683 +2115558096 1361081699 +3312427389 1270560706 +3079993252 2743195455 +3707912975 3773184821 +3096053984 3482872749 +825363601 2846246432 +1557216057 729479861 +3186763716 3627332271 +3882518858 3216217313 +3784638780 2852754075 2793885160 +799255540 385600095 +1395701457 3333409552 +63709147 64815529 +2393017393 3261984625 +2710349448 3630835723 +2361716520 3255073771 +490343367 789677069 630382692 393823199 +816029804 816029820 +1483205318 4053177783 +4293699186 1401554277 +3467252379 4038806020 +966877950 3071202761 +3337789380 3337789396 +1640993377 2454526851 +3845024462 2374763097 +906546926 3827176207 965272666 +1385580057 462444872 +796570259 1361517932 +941130677 2436644685 +2859464680 2859464696 +1613309482 2328302605 +2406899019 3462142901 575986946 530056824 +2277951999 3169844321 +693539853 541790322 +639584757 3685000961 2029916044 +3522204934 2210044001 +218388223 2094330728 +2377920625 2420130288 +3347794401 21318944 +2331801108 3195480830 +122795275 2426404948 +1081507793 4062579574 +4246330468 3551916393 +4008371100 3083095687 +3739597974 2041045041 +17879222 225889034 +993362745 1849529000 +31509399 2346745510 +669978035 3154018551 2915220742 +4150734032 1198230371 +1440528056 2509635550 +2178779033 4059718631 +2612667930 2997707736 1074395901 +754528414 1783072959 +3566318353 2992432080 +182301806 653481657 +3031718847 4035638221 +3511262056 2526606538 +2398092335 2259422083 3531013165 1084992375 3876404850 211676978 3840126725 2917887056 +3976277728 4175219379 +1351143640 4065632371 +2072786807 4105916486 +2982334968 2287219979 1001817480 +1715600743 2812412832 +2969437153 2560871140 +1187362588 3750985892 +3223994529 595836278 +812313465 2483302517 +2444704502 1500631377 +1116824429 937395332 +1424818102 2879445268 +2335656213 497742765 1023937546 +2463077357 3089149084 +3240231395 1816240033 +1804022830 1943479407 +2629259106 3549550710 +1133907455 741686187 1681393768 +2622035995 839421690 +99289391 2567995791 +1370346941 1369929876 +3898231458 1747156245 1747156227 +96818252 1638118305 +1022648966 2058819809 +1864140944 2045442741 +1606613033 982341518 +3118566252 168721175 +1817210317 1817210333 +555978897 555978881 +79894348 3407719607 1622589815 2094024732 +508411251 660683802 +1937870144 351361989 +848219311 1171011438 +3995624382 2811560991 +2793251062 1346174433 +2441332407 3379679760 +1253455630 2866326297 +1780597129 2049290233 1832268703 2049290222 +328249381 4056238636 +2501844258 1089020458 +3215581371 1936508530 +1488231016 822915648 +4127361529 498938613 +3170350307 1559347530 +979030578 251192485 +744629568 511747013 +3311128221 1283866932 +488639713 3396624240 488639729 +3538131758 2734146842 57927247 2205241008 765302447 2102153781 4020193353 1428445377 1454263426 388186619 3036636462 2156425270 +1753191041 2577019229 +3994056855 1525536166 +1686222827 448374153 +4260849331 766598022 266409022 3055514407 417065040 3422780220 3128308497 1659005107 249012833 2450513791 2787389460 +2163690840 1565442459 +3621069981 1636344628 +3051662976 3404334340 +4083360021 973935644 +2518896497 3493426177 3398831846 +908836420 2329707776 +3612470942 3612470926 +1744448676 1389643327 1389643305 +577842658 439040707 +2952212748 4232142232 +1104021883 3336791348 3990398539 3944585113 821374533 +228123450 2965423833 +898548914 1783263510 +1199713552 2770053096 2716659765 +3602645799 3076822367 +274031415 3983224710 +2555536484 2384193124 +1916056917 1594742039 +2803509230 2803509246 +2666468911 3760560081 +1903661448 658118923 +2938715045 1659430060 +548435119 617066353 +3386602048 74767045 3371459596 +3055930193 269711405 +3734953310 3270143081 +4244537501 1083532120 +2652889511 2469411296 +1402065122 4011744235 +625349570 4089097678 2678884810 1867586147 2678884829 +3760278994 99475582 +3407748839 753056499 +3077148028 1262145072 128981809 +1247963230 1995066345 +3837022288 1473932771 +2548498505 2548498521 +408798496 4179922324 +3642535403 3005597922 +1527046014 1527045998 +2905316483 2905316499 +2551500143 2551500159 +3299745616 3994766069 +1079139555 2062520053 615004508 +1905240496 1965563907 +414744820 1208559433 +82021728 305630757 +3770532952 582751899 +4147740752 2139422179 +465824249 2926138088 +2418328596 632157643 +3461806318 1596558713 +242706988 820739905 +1249448426 647443277 +2587258114 1023425157 4132583654 +4134662598 4134662614 3143604897 +861213841 1272221238 +1141410093 986457823 +4003278310 2272215319 +3035545242 1842744445 +1480542137 898072742 +410654508 3023206999 +677078271 677078255 +565476348 186592689 +1848201282 2903070709 2903070691 +409744588 1045896481 +32088479 2714332510 +387292861 320805655 645070815 4041413146 821536049 1021839100 201205173 4024635524 922201781 336126850 +2455744474 1539375029 +3052880218 3460030635 +2322238293 985224924 +2528492473 4179002408 +465050138 673649634 3167819499 +2374057525 2374057509 +2723490302 2723490286 +3074037098 3664754119 +3079576776 784704995 +2341498732 166740633 +2436438949 2011361500 +459375588 2426518479 4269973481 3549470948 +1904956356 2186599839 1070947380 +302213312 459138629 +3904221437 2622237220 +106612757 367589642 +112507604 1878755636 +2545156071 1167459315 +216279199 3928748638 +2156760392 4126358565 4277357155 1584248023 31486704 3353031280 2799003723 199262892 +1448599757 3109479076 +3610433342 1578682554 +899668875 2303151791 4121336788 +1373505295 1373505311 +3649995307 2463231147 2790713762 +1476010997 3836046976 +3751982210 2401380533 +3712172077 4135894162 +4205204060 999964155 1529846535 4023625425 1494140364 2599491716 1658100044 1529846544 1661916560 +4159722681 139812648 +818779242 3739246291 +2433314417 3268991983 +3789973802 3971210304 +983271212 3379063032 +3046390469 2859903143 +4265714942 1062648799 +3013334156 168151443 +1991332129 1991332145 +3058155806 284492351 +1608804333 655329874 +238049434 4028332651 3852077015 +3225055368 3225055384 +60673056 60673072 +3648927521 2192623862 +3734183490 1816582237 +1918316405 1950332202 +672161207 3368257296 +3937014810 2886269721 +35473397 3140959642 +847279622 2251934583 +1769772499 489028396 3793738533 314037475 +605697187 1387627200 2630528205 2057706979 1840400927 3818231555 3799777168 +3398208393 2117503470 +112481393 571900161 4276153830 +2545129904 2142957571 +3097404738 3820889827 +1628511836 3660924679 +2544361643 3149288707 +2334075115 3977079266 +2581636761 3584443080 +313620466 1600115173 383222157 +4229450733 3342829074 +4159758734 248185490 +3680425917 323853972 +3430849248 616055768 +11461768 2605826589 +3690728974 3690728990 +3793969975 2469005517 2719372906 +1624156837 173449644 +3628796173 1949360242 +2002526505 523169028 2506598637 938027150 +771935277 1976379525 771935293 +3672021687 896967459 3672021671 +247960452 3174285293 +3772141990 2904252762 +2812536773 2886064908 +3390201995 2446782989 +2800673398 341525010 2766069408 +327921705 1295496917 +1998281552 3490758371 +1612206558 2646173695 +3509136774 3943709570 +943675719 2881600702 +2701735997 3062070532 +1315329919 3927686376 +1630586778 2220178787 +2146273600 2733576133 +1470105570 3442010877 +769381054 4010590473 +3009901002 903356653 +2352409736 3969456426 +3593696233 469727192 +3245063305 93965223 +259547993 3011798280 +3878277041 2547119024 +3198823284 3198823268 +391774828 2017594534 +691062247 3200748214 +2793754594 2793754610 +1585452889 1585452873 +3822514177 2891698560 +4106436621 1549653092 +1275350478 2026273606 +2550813605 4248939706 +3303245088 287147510 433640755 748966041 2579785551 4293206871 2908478312 2268647112 3456070882 +3121270744 3131157510 +2155664384 1149352965 +4241311435 3257299348 +3440458712 4038943383 +862334176 3386418341 +1263290432 1379412493 +1956577867 1956577883 +426693377 1106184579 3187197735 235211312 +1869819262 4031814985 +3298086844 843252977 843252967 +4161119686 534602257 +1314296640 187623135 +2401343722 898104642 1122934891 3463358650 212218511 1712071268 1564514461 3827607091 4011391685 2989997434 2778410344 3842976480 1560307707 2477678889 +4170770902 783817703 +207319475 653524186 +1416017524 1370568857 +2866060729 2780056104 2780056126 416341897 +989936075 1637971704 +3426907911 1879715378 +2730075607 20975974 +3707088628 3401738767 +2652225430 1916573991 +2289239063 3826216998 +3868982018 1696507853 +3092957367 3914868925 +2712850633 1434365048 +1523820854 2061511425 +2494749622 3415203729 +3087669774 2284407877 +1487001926 3435727159 +912818927 2508594744 +3165790051 1869048028 +91041311 2147472033 +956962769 2615377424 +1802951005 2300063074 +889319871 823103400 +2242219258 1570565533 +2747066584 2590149659 +2225327723 4279014703 +2018755536 2018755520 +1993334385 2050698214 +1257280279 1946694115 +695310600 1171515275 +2394836630 1268102695 +113992626 4040653492 +4227895763 2279968570 +4061880083 4061880067 +230925955 3780848061 +2862793282 3761753571 +1593332021 3051869802 +3204163616 1276282447 +3110288629 665500300 +4059517866 2171221224 2992594608 1342248166 3826699865 858525613 1311719029 +2669482412 3316658881 +2663944573 1637037684 +1904768703 2027089598 +1784317518 3129044175 +4248612768 3990245499 +481619988 1590092532 +2038903146 3117599181 +1209170022 3675490433 +101546319 2398379931 3593860952 +2120604165 2780434535 +2231630429 900464798 +22238421 22238405 +1721534223 446588578 2540215448 +4129509160 3766284195 +372353654 1714378705 +1923267654 3157156385 +2215533515 1772604338 838892921 3234672313 3728238830 +3035581801 3035581817 +1802126027 3813090690 +2959912462 3373662233 +2754111564 3080466359 +3073172949 816696924 +1459074674 1509176691 +2196460986 500484245 769747421 3531076546 4109229078 3531076573 +3570413671 4022632095 4022632067 +3953633199 3591056184 +1468928509 3517337940 +1572861242 1571322318 +1649051768 861197563 +1202711695 1113725544 +4216656179 1400658516 +4037324658 1214215993 +1189194787 3091331850 +362920913 3734678022 +1857798729 2739573246 1126923950 2707074015 +1024950877 4289300395 +804634235 4208647076 +2417753259 2265891106 +3034828789 3080740522 +234697653 2817027930 +4040100851 149933978 +3542328282 912790435 +3561140264 1291538164 +2899152740 1805171327 +3606505385 263106328 +2449583615 3617908840 +3044127269 3474888663 +261453252 1279812511 +3991618062 2539191321 +1566811992 793746149 +2348865603 2824106357 +4062558497 1382182624 +3580418044 4027318695 +2383897390 3704693103 +2254093623 3084377488 +3119479001 2374107049 2365275550 2374107048 1806005611 +653122199 1810404867 +1170996664 2552260781 +436048998 3548807591 +1128645663 97762526 +4139516611 3270774372 +1263719693 4053503090 +2219769983 3344812008 +1802670967 2016618996 2016618979 +4122221296 1961003453 +1641648158 662560575 +3992499360 1048860659 +2875870979 3680133564 +1003765025 309383494 +3760895565 3912920965 2885520987 +2136362963 2136362947 +1721163255 1988062160 +4215911329 906348150 +193105390 2720865829 3292504754 +1899608234 2634136837 +2264400828 879616241 +1537029684 1537029668 +106009109 3956423987 124319498 1742469847 3023889594 +521121200 3325118790 +2830512397 2748266340 +2959693348 3654458047 +251947076 2285414660 +1173507033 2772727125 +562415103 2695229761 +1137317872 2343035540 +2311918638 467059833 +137113230 1577820574 +2583496916 1028973999 +4252992098 1908031555 +4222285517 2884039803 156689458 156689445 +1860020737 2280824726 +3416057463 4278111568 +1524861385 3711035246 3711035256 3732971103 2744078894 +1582897557 3066392499 +3491904944 1441209347 +633600428 528615895 +2206598996 1610451247 +2333358885 2663767114 +3955124559 4209432024 +1371871978 2739494491 +2314156300 3412465953 +1160520257 897189264 1160520273 +325540301 1488084402 +2940114328 1948635940 1948635955 3542633167 1349374560 3075982132 +487924388 2591381657 +2962398944 3533305864 1464701728 +2795310767 4164820344 +1948803732 2645750271 +4004631236 2247019145 +737062201 1639624866 +1752142332 1671614385 +1784134937 2706144766 +2921703018 2403662043 +2575145286 1245954958 +2680435322 4225463837 +362268457 653165966 +71893254 278192762 +2120127440 4091267132 +1348154528 529782771 +8096711 2306673238 +3826489247 3046772245 +841707577 862038462 +1420223635 1420223619 +928575116 928575132 +2668799895 1770420757 2716362506 +3111239899 1279687816 +2909600021 395058186 +2585326777 1429556643 2068745864 +3319792690 1997213386 1253417780 2980485797 3734147362 +3968811525 1787096538 +2077869159 1639488626 +1745146067 2459221036 +1966327374 2429963943 1784214033 3464572115 3629741818 +1388959988 1203800079 +2299971032 3041926515 +1372694854 319650103 892719494 +1760583573 3345381276 +1158709648 2510538159 +669845741 1325349422 +3848121005 1383735732 +3283915081 1792587246 +1608425995 1419753775 +876746472 738856747 +3663215901 3588764834 +1616726779 3606406079 +2203187528 34303051 +9104148 942272127 1056467956 942272104 +2676595673 2676595657 +1609777123 4008546890 +3506576223 1699813022 +2459293975 2685991060 +376189341 3914471988 +3412920802 675308400 +159878139 4217461796 +2698171262 3477000863 +2418192735 2322215293 511704604 1167931550 2156157568 2037581409 +2560343661 2855060882 +1005218456 3926248795 +870503649 2400525856 +711945885 2829396117 +1128022683 1927076370 +292321543 2042808563 +3545823321 984900296 +1866816824 1522622015 +2583496915 1012196410 +1214559287 1016993955 763867792 3942556521 1016993972 1016993954 249612053 +1193060965 113061803 4276714669 79081177 1746498589 2460306873 +1125617095 1125617111 +3252785881 1681041854 +279548812 1136094940 +500871061 2695443287 +2011094950 322991127 +1507741339 1876566088 +4010081849 2111583144 +1353658036 2511999283 2726552780 3083240773 +4143051553 1717335889 4019818631 3756113120 +1291213450 642048485 +1423411031 3595171030 1989406915 1423411015 +786844658 3330903539 +3957221982 3857417724 +2612667907 1622737981 1451035111 688510634 1451035120 688510652 +727525274 1447599458 3718600555 +123750114 123750130 +982189526 4275711975 +1292184224 922397401 +168184172 3058447552 +2341395265 2979458160 9843779 +1749758581 2821016759 1591801676 +2641994357 1534770730 +1667289946 1672624164 +2465202808 179234521 +2367322730 738637010 2326705357 +1978742279 3679123418 +2843619866 3953712875 +4066256176 3124005507 +3182825356 1999442871 +2262821796 4135580457 +3587488576 1876353016 +2816933442 374798961 +1935921269 455157802 +218801304 532749137 +1568232061 1272108273 +3834027540 3555383663 +4249412606 545822495 +1586217366 1812053799 +3595698826 63870494 +3376575067 781845842 +3190443716 546963103 +1790378148 2719351337 +3690951054 3776955033 +879331573 1001795795 +3928306746 3532732235 +4161420430 2463738770 +2369661617 165491888 +19444499 372145972 +772221848 40667324 +4013884315 818304780 +817563676 1405855431 +2381594779 3707431454 +2186180489 2860919992 +843491349 1041501488 +3821224676 1885490409 +258977809 1943621482 +2359040534 2376152801 +270009894 3256134001 +2283484669 3286086974 +3048419477 240689701 +348416548 1282191963 +2887718627 1282315719 3622897500 +2422010058 3728808416 206507501 1024253404 1725515861 +2036888267 3932992916 +70871973 1264874682 +2840739834 1043160277 +1153853723 1599567250 +731312853 860754727 +1342976874 1832185805 +2227932031 2339150056 +1578741549 1332659140 +2341881465 1680512584 +2432498357 4080970475 4080970492 +2231896077 2024057970 +256032170 3306605061 +1775682894 3944258009 +2486887528 2486887544 +1801894635 4256710626 +89857935 210240730 +4080739476 2048562415 +1965768886 689364615 +2852915176 2565894699 +2889231106 457552931 +1408962530 372900035 +294755211 859298772 +2114010371 882604263 +1517030799 2727878384 +3893649018 3524311581 +1882784094 2936718466 +800242327 2908470192 +3109964782 3178334137 +2688213153 17874200 +1104319806 3187329630 3699437727 +3880240322 91454798 +529049167 4130707633 +81498563 3663385981 +4222915567 742711608 +2608240146 4075735870 +2307126089 3283614712 +2942946033 344619376 +4196905011 2040895415 +4190171920 2422246073 +2898952570 2093601547 +1639804059 1639804043 +356122400 204956312 463399931 2320277349 +4266725079 4278163255 +3626700046 1506118918 +362696271 2698886298 +2776693679 957101176 1177983227 +4275272367 3252744401 3588890990 932360172 +1718457962 2827208909 +1938208950 2467612295 +3389116820 2497506287 +1555201841 503200294 +1833796904 714317356 +592095603 1519834637 +143192624 3438689675 +2769526095 752919374 +507423888 749315747 +2836199826 560327739 +1595493960 4241898315 +165510983 3467599062 +3220060708 1208321705 1208321727 +2331358021 97072524 104633883 +1424581458 1955900670 +3069347221 2496154012 +2420848471 2103975398 +1299105496 3177383451 +3058708343 2000336985 +3486927832 106521883 +3139505435 756571385 +3715070723 2843655930 +2583496920 1096084507 +1615590919 2742368018 +1016175362 1530332195 +1628197368 3194292603 +2098229262 3962980671 497243259 +3612101568 3336870299 +2699187018 2387156333 +198697159 1242691507 2469087200 1966184397 2452309594 +1560544534 1829334859 +1777575449 3817765214 +992255418 2871186582 2869818390 2309181589 3567537117 +1840318850 800192437 +3055495136 2467022245 +869449083 331616137 1873959486 +3371085535 784156958 +1042888556 1189232407 +2399542967 264818904 +2209662533 2290095939 4046204010 2593398426 +848679823 819726862 +3330633532 3222150001 3342152432 +270293420 144779735 +2315938768 3097760428 +739308607 2645589822 +1666763698 965994531 +2679286413 3819511282 +2347082120 3262990612 +600123456 1316867426 +3186505460 4060119567 +237133145 1665794996 +1617025433 1393134558 +1656627090 55292613 +406303050 3572037285 +2610632740 1097206297 211936584 1486344100 +1361883547 731561765 +2177435575 108471558 706064446 1638712237 +3976193620 1792513593 +1793657686 2288649942 +1781379443 2565756940 +3426145616 1942332860 3394358517 +1645800381 3361618953 +2640338064 2529337067 +1132650430 84293641 +2208120757 3851110890 +796308824 2311870707 +1883673652 534047392 3897927265 2231258779 4149591570 +3860470775 840566214 +4126113736 4026935243 +670711154 1626258021 +1744798017 4164450624 +1472082676 2038438548 +1225647535 2950730350 +3048730415 1066239736 +283560739 3065906192 +4214508234 1028766701 +1126616586 1126616602 +384404521 984065166 +1020900521 2779667690 +3459082888 1064667572 +615545569 2731634742 +2812012537 2710798484 3727904316 +2796448567 2610087824 +2948729542 1953953185 +964323367 2729571680 +2047402746 368922525 +2129750048 4127648371 +919737847 1136169926 +4032492494 3218015555 +3202241161 495762078 +4188601786 2209263746 +1242342265 1242342249 +2264722161 1898305904 +828764987 2600720645 +3336117262 365373977 +3105770506 1857941349 +2438940858 2466217181 +4136543 2992420430 +1985948723 2329056346 +852517141 319345674 +1056923947 1460008610 +627282420 3485385487 +1471368393 4166892823 +2627576763 1193852772 +4175932006 4228220839 +371389315 1543853866 +2969361774 202413094 605632449 +1808981344 1808981360 +40395553 4216596016 +1210830020 1626560671 +2351682493 291234484 +1912605606 470963777 +3964520193 484210551 +1503415002 3943290155 729453218 +2075070362 544261474 2075070346 +3014269485 29832388 +2010468294 2010468310 +3379924721 353371504 +2748546338 133037205 +3203977659 1551064685 +2193876006 1851701105 +2469609390 1739407087 +771544628 3157302920 2567255001 +280272515 3478489148 +2115437511 1161491030 +1675690621 3090606786 +886279847 450166483 +1816659387 811664744 +1216491188 3639575897 +500029769 873270766 +1894816168 607722947 +629292474 3322358731 +2659180028 3721359029 +1095865708 1095865724 +4292960978 1261279085 +565217230 3605383503 3605383513 +32876896 1022628295 +778089357 778089373 +3097971385 3097971369 +3958658926 3752174127 +3689981148 399738439 +4014403456 749405829 3594208076 +2983203977 1938838456 +1836809191 1836809207 +3595515569 3595515553 +3215235902 3995099785 +1046310216 1964181597 +3255243856 3240425955 +3228315439 424560376 +931592266 3011042413 +416943658 409629186 +454284488 3977879029 877897916 1748362608 +197478983 3465801174 +3118875791 3124509914 114543421 +1069965607 972580644 2353721462 +592631870 3647629705 +1936148347 2468908082 +2741562397 1529590196 +1588717990 3088240705 +3635526902 3635526886 +1455879370 1697864187 +877683050 3297335771 +1660550741 613113795 +299222165 2827253386 +3126429734 3126429750 +57376701 523900546 +3716164011 2780994008 +4080015043 2545145066 +1059490059 1059490075 +2786633010 4141017086 +200765861 2340945916 200765877 +95795530 476510430 +224782381 2446045896 2295047314 2964442011 1147961028 +3682231850 2880361485 +1097963362 1741770563 +1078940732 2028051057 +3871644642 1570581474 +1986329076 3547382284 +3859366399 529720446 +2896449157 2289807847 1269275468 +1402956569 1402956553 +71891268 3847055676 +2710379436 1047022785 +88023424 3261185171 +3095596769 2996463412 1464888352 2315514311 2845464838 +303939350 2597572519 +2443869082 3915420541 +205917392 575023989 +924149911 1035177110 924149895 +679449716 886485657 +1565475735 4159088404 4271515407 +3923632974 1984746438 +2079994261 4197165931 +3697640681 3704634062 +1762753104 1050960092 1885444437 +2889584532 3049457135 +1986247393 1073688630 +2377192816 4062775599 +585338320 2889360723 3157802595 +634099114 696031899 +3543523906 3218288117 +1037378870 442041466 +3553203331 3914648124 +3497173039 319027323 +3813019223 508072678 +41507833 3725314302 +3890996413 2060311631 +261997408 4116353061 +3052880195 3074145404 +869946936 3635788347 +624572645 624572661 +2933965434 2774464598 +1529922407 4106459958 1877816164 1619371641 1877816179 +2799769426 2233374959 3935966521 3960823491 +167383300 3098069343 4021246276 4206157295 +1890277377 1589348736 +1149900948 310548479 2022391924 +419678210 1660148533 +1856405574 585263901 +1335275149 3587389951 +237669398 1660585649 +528196838 1159217125 +3311335861 1770199036 +3127600901 954695515 +2328304575 1533108092 +2883657522 786289736 2058893363 2771576291 2847498813 +3975729417 3949867180 269369253 +3819570918 3780689774 +2127319910 827906225 +1381707110 3268692226 +4142063656 389089347 +3691443845 3824554842 +3710293542 1237212609 +1190853512 679897939 +2381670150 3821806918 2136026743 +3146898675 966709900 +3853569703 3662565540 +1891126019 1964905898 +1744651768 2880775547 +4098421061 179645735 +2728254645 3011670250 +3841424366 1603803065 +1587252650 2564817563 +850903936 1464386181 +1714012539 1320916146 +452826605 1202348352 +3696121840 116029788 +1529098417 1529098401 +2305084848 1466779101 +4122093237 2087907050 +3703941243 3703941227 +1241317991 901319268 +236058462 2219337961 +506508486 1286378423 +1062488081 3266147023 +132627340 4258020705 +12265972 446892825 +948425680 3453120611 +1096975127 85220646 +2211009513 1592727512 +743045759 930436584 +3105950180 2517348824 +2706993749 3077408126 +1168581781 657034663 +562944507 3444450866 +2623918400 2814974155 +1017131737 1227885448 +3648826131 1916882682 +1348125499 3118552548 +3278903265 2322962230 +4245885504 3387917812 +2408336964 3655011076 +3024324310 2622309105 +3424143369 1396270648 +3740428188 3942961735 95731596 +1622313402 4020639766 +2522602600 446429099 +3975115760 3975115744 +332627981 1123193956 +3899889905 3060925611 3093937000 +1915137864 4209372747 +2337457508 4140603736 1466213226 1326914749 688607588 368566128 4140603727 1394547516 3075259497 1343692355 +1864312820 1503734526 3219908067 2071099582 655172336 1669660523 1626935932 +2142974183 2142974199 +605945679 3831939469 +2413706087 2856546720 +921121364 2289541484 +3667816203 417029271 417029259 +2336577969 747777693 +3437459132 1113146983 +2307204929 3181169494 +2221776027 2221776011 +1125034941 1293441695 +3639653694 1419111006 3236778143 +2210080145 197887798 +3042752540 2633356295 670881479 +3764011574 1679178503 +1922102191 154115182 +3756402522 735773493 3511677629 2830902774 +1842456432 1359648067 +1672809159 3170891606 +673542639 4102170156 3102479298 3718453877 4102170171 4133086245 3119256920 +501474304 230681619 +950460676 448146927 +1280432432 645069963 1423500931 2819454280 +980566610 980566594 +3761380917 602246524 +3572854369 2651230900 2568546300 +4243009996 619406806 1022069660 1005292038 +914306172 3542592772 1178574631 +3689719947 1662511865 4068041646 +337711240 940377611 +130592126 3202948425 +2679278680 3188911757 +2001381320 2458263517 +1460397967 2529003022 +2934997658 2854000633 +643786451 643068205 +4163058041 410220904 +697480721 2197069008 +1946070467 1558940156 +3999271983 1882402286 +2692763168 887883 +3994602792 155270467 +4080204627 742499258 +760827247 3532973486 +3361704201 2026776095 2003089710 563053422 563053433 +2088398522 2931576541 +4072774336 3871775813 +3914367708 633208920 +3212778527 2484683976 +1188078963 3983832090 +81307763 336669964 +1565230562 3666583369 +2115468731 972746084 2782850181 +4093995184 2750744967 1140785096 2692470812 3220518324 636176590 3565407509 2692470795 2625360335 +1471293306 1255560849 +1820015223 1526118441 +1430915973 271003867 +2153084181 3412969633 461852700 +1146026031 3075518958 +642963934 846002302 +3218628036 3315309471 +2436905547 3367349112 878880931 +3026261211 3026261195 +2689691890 1379192051 +4252791750 3505012897 +1160793300 1160793284 +3429755014 1459948279 +2175299032 4096060187 +2352209491 795327383 +956491834 956491818 +915333780 3577373883 +190461135 2919309784 +4017092307 3225521708 +570625111 3788270832 1354814665 +4014774069 3935438972 +1336546825 877567294 +2238565353 704535999 +73444193 1160628662 +331347147 3506082051 3794688898 +223592988 383422993 4236362102 185856199 92393382 +3483898837 3723600126 +1916653914 1916653898 +2063474031 218650030 +742680218 1730638965 +3361638601 646441272 +2213882280 835871504 +4166548141 2689146436 +3104788122 3977821309 +3958508287 2994635858 +1167369667 1275130357 +3186708308 4218391720 3419052265 4218391743 1457512761 3851455156 +963827526 3318283377 963827542 +3135044996 3135045012 +2600274528 1549227301 +1543984564 2475420249 +794320009 2372481029 +1728543308 2093319607 +3781085085 2910228843 +3059280516 713920964 +615910159 386769151 3650316430 +544661763 3841449384 +4293168601 3477652707 +1385127273 2200133337 +2652681284 2652681300 +3520632011 586300308 +990795154 2307962067 +935629527 2708678758 +2836406547 929304826 929304812 +869985404 1541315779 +682592199 3946938052 +4175838799 3340132578 +968172712 968172728 +3366407556 1667172063 +2928541200 3649499939 2126590763 3649499957 3736396520 2758859883 +3099226071 2759724912 +1628457586 2476987517 +3692385575 2627013750 +910412404 798096270 +2016837738 2815174363 +3541933865 2158071182 +628433275 3220532302 +1936049738 1523684261 +1700155105 1068816260 +2091848350 3862009581 619307978 +1480819914 1919219378 +1968159964 1013795207 +4053040212 1187971519 +1712046191 1712046207 +35506532 3101952127 +3026743046 107398782 +62369746 2563058811 +1807436649 14136920 +969922130 1412326149 +517735734 3395040273 +386479587 1279019741 +1913823843 2764950855 4132807132 +1931808875 2925058146 +3660252995 3660253011 +228170679 533733638 +1865673256 918134013 +44688766 2943632713 +2699556182 4158285290 +153310255 2443019768 +1664145118 808033017 +1365662760 1277367019 +3310146301 2498765908 +3316717755 1910654847 +3512132045 1489335716 +1162634686 2019412324 +1974036322 166677090 +2080109833 7032851 916634926 +4256471638 3108959591 +3483184211 3483184195 661440186 +1865395996 1865395980 +2111133789 3260516418 +167823092 3006870041 +634642984 471068816 +3788422105 3016325391 3556932286 1366406814 3556932265 +1949279650 2965249725 +1293446578 2276445531 +517323274 1835404658 517323290 +1587778544 2457343307 +3822113034 1607276578 +2448506215 633579808 +2686721270 2810782935 +610231217 4079611814 +142793318 2678214262 +4137401677 1727334482 +2213176186 2776555071 +2120078296 3316940036 +1218405634 673286886 +641599976 3371870211 2876822992 +401741905 52184976 +1447968364 2477792892 +440460706 2253479613 4129914371 +1272441369 2186338325 +3448792671 3425045857 +3886805922 1437632533 +3537481262 447558265 +1695053080 4151672499 +1401233931 2241107778 +945627768 849167085 +603047495 3701154262 +2999346059 1256527535 4182684628 +773129520 3138857621 +3575469397 439658919 +2766315890 46409317 +2372027078 2372027094 +40277222 2910610967 +256789338 256789322 +582085125 2441696810 +2435753952 1558422188 +2610119673 2185992159 +1843334751 2670104045 +2896348539 1060954276 +3243397463 2878737392 +451165202 1732939859 1732939845 +3945449400 3043451219 3965216429 +3277257853 4277106882 +2323013559 2941824272 +18841886 3801629247 +2091616824 2047514171 +807088079 3297589787 2311865048 +3456346315 3028745720 +1807839490 2743395893 +831113906 1612387870 660365632 +171374511 1190327547 1190327532 3280463992 4134375377 +2578885984 3125601339 +3554055171 1563966703 +2390645965 3433544242 +1909200493 1161764036 +2998000968 2031615985 +1559505906 3187365274 +3193384855 977267366 +827142616 1998218023 +657559570 2065737402 +3431059024 1079494645 +2559571666 4238445701 +467277332 3964715375 +3306650000 1588560875 +2487120513 3746447616 +1236469057 1171342656 +1844225517 1844225533 +841559983 2782269560 +1687728841 1181164334 +1294133333 3270753756 +3273524451 188854620 +3967155292 2579252423 +2696757684 2696757668 +3382293230 3382293246 +3851114593 3143377056 +286446664 681848157 +49474792 2202929752 +2898688397 2305906930 +1160442942 547257737 +27518949 2047217018 +1330918504 2287146627 +3315575667 2371544602 +1941104183 2079880525 2877595888 +1494072378 3976692936 3202921469 +3678183099 2010281987 +2454338924 3068047639 +3034356206 2772849071 +3907261351 3300009722 +3959832983 618217638 +1853681976 1853681960 +1962577932 1962577948 +4151875088 4151875072 +54661371 469809970 +2942908653 262446354 2988655429 +4255819433 4238629912 +3603689090 1867694731 +1822803288 800712947 +1121905839 3187363078 +4171443258 2732498763 +4050781769 1984731103 +1436899474 1193993019 +3751434746 4194018461 +2699027054 2573909274 +2778789653 3513054730 +2589600951 2589600935 +1637258920 1208953451 +2896810046 223531401 +2975667494 1804100625 +3314464815 1957556152 +4066723365 3024183132 +3305472299 3592846670 +882508036 2393787896 3530529097 +1426728187 3656922930 3656922916 +3871862968 3412871987 +1475879875 1050692586 +1596760042 3175071053 +1480251602 3064156819 +2056983157 1998458428 +4140998740 1383318975 +212848598 3885421185 +4211578357 605259152 569446588 2635792339 2761793821 +180906176 180906192 +2469847364 56925727 +3624521005 3624521021 +1910128193 551892291 +2449852086 2501365895 998065302 +4236759260 949114188 +1725311464 3408132157 +422261309 3690993172 +1805677510 865484961 +1600272410 1313558070 +2958542673 3945710736 +4228567269 516342209 2852575354 +4018626607 1092381166 +1086743245 3310192804 +4046837406 1438702271 +3255098481 1726892310 +2252087081 4129718655 2040860046 215242382 215242393 +1852957717 4064939292 +3160563960 1513807681 3288978955 1540633737 3751334617 2968474140 3500706589 979913360 177326316 932921938 1583242271 4248387520 +1998551774 3409131753 +3382441561 2882608271 +814732377 3412805640 +1142733457 3392778832 +1951751545 2606900606 +1105499754 618186971 +1184674554 3926494501 +4276889527 4276889511 2385999907 +1578447002 1578446986 +1358303293 3461707927 2787359102 1714620396 +4272907089 3672529632 +2347471067 2787919410 +2176710914 1074724394 +3207737460 2025266727 +4177813938 3018181427 +822147043 126237276 +437544051 2165973274 +866988177 4077508295 +283685168 3376856392 +3555750461 3766736386 +357873425 2774282192 +716376634 1910053213 +2824084038 2713715182 +2709554397 383279679 +2982510473 1659356344 +2393673608 564523787 +613155440 4167554627 +1374250410 3615601170 2624260763 +4255338762 1377342139 +3520546445 3806597092 +3395320598 2883699623 +3318066313 73339640 +1271577191 3072552992 +3523337784 3523337768 +2530407900 40484196 +1428141243 949504443 +4091658245 4091658261 +702186144 2197529075 +3367264739 3367264755 +3927221793 2117643672 1238689913 3005871720 +2373418788 2373418804 +3893537547 272722479 +2540348963 3132346865 +2500574373 2885745098 +1012552580 1012552596 +2840973189 387296858 +2871063531 3415642808 173291913 +1694223999 3601737002 +2122318291 889538358 +4228642231 2111033104 +2667057241 2575416350 +2382285268 1545058479 +3445897663 3458118600 +2555811512 1209222166 1036485383 +2313181928 4096727851 +1578043745 1578043761 +3739533312 2319036036 3645286272 +4000315851 625359508 +2642791801 1923249512 +2060446908 881962087 +3693107400 1324073675 +1470226618 2916402379 +2474151036 2730829607 +1459634173 4066687810 +805082768 446760099 +122862083 2319110844 +4057351834 1313940605 +2316682306 2722362357 +1223572813 470450212 +3729310608 2089540515 +2423666458 3723688181 +2861155526 1827503034 +924353063 3091908793 +730729220 730729236 +1334092457 3603697688 +1393582964 4287942142 +2330921545 4283248888 +2426899360 1472253157 +2772733249 1810521408 +3160103169 2766405681 +1986244152 828477060 +2611598062 3255365949 +2180821959 2866842308 +931103366 3820648695 +2747418665 4090992782 +1304923513 3928208744 +4025774109 3670834612 +1119019498 3919160141 +281900260 1673347534 2361496783 +1621994623 1586881834 +3266933319 3505317334 +554479214 1962317625 +3495338444 1362862804 +1190660353 3111529600 +2078498375 3143376725 1307404758 +3485583290 1971402841 +1500146047 1099174632 +775556777 1852118040 +980763270 1238904006 +3501350994 410927167 +3169727868 3875418673 3542680368 +3515476505 4112221534 +1983290125 620107108 +2728112556 561422908 +1478844564 2911051752 +2696925574 2482427383 +1182074433 3008511179 +2226762686 2924868617 +2212291050 2125964109 +2894301152 1930356133 +810458502 2445408737 +1518619137 1518619153 +2739609791 1458135402 +190199027 981305974 +3793776881 3927034736 +2041446792 2041446808 +252313911 3821005190 +2652623951 885995598 +2212937678 1916793167 +3367611319 1282055220 3007926534 +1598852595 3270642528 +1021682320 1837033635 +1761143828 2143444427 +2173761966 3192943602 +3255317976 1257030427 +3741266511 776159372 +3596002791 3596002807 +1689113676 269502048 3383047073 +2808056730 359187307 +3222480418 3101413526 +1346157368 2275064100 +782951683 3561054439 +3078637258 2834264045 +719312339 3000732178 +550529731 1796739317 +296318221 1050102170 +1810922780 127202055 +839345948 3718730001 +4294201422 999975631 +2112482965 265275936 +2051481911 1587138073 +446144872 61257808 3807169429 3485760412 +1221138701 2710728548 +4130390560 4130390576 +2682303489 4284606123 +3822969557 4242810227 2462417786 +1405983359 1760748168 +1435209036 1443682844 +3455916304 2917198127 +736751009 3259044960 +1493623525 1493623541 +3306653097 3328780670 3759737087 +2675966446 3175623578 75696569 +3081462803 3777716973 +1642314377 2069811449 2726208942 +746867303 864396615 +701040058 2171864011 +311404587 1663417250 +3362980305 1577835536 +551435591 81426134 +2741538693 2741538709 +903260903 2817460640 +3083248265 2818570489 +3579084564 2156054516 +3185834922 846621630 1891182015 +3858890158 3273808121 +2459685665 1493869244 4090058566 3964493024 +1449081344 1202901453 +4016434497 1197559398 +2259691804 592492295 +2032747948 4166460980 +685426945 1365929110 +3328340133 2463144220 1823487530 1123696215 787781837 159688179 2094565656 221382787 461499404 1531044112 1101628021 205158680 2860415048 474861360 3019393959 1424248031 3519939701 2054716457 645184594 2040492711 1665721651 +3566468874 1301964422 +2598404560 3550424122 +404183955 2405343744 +4117823065 3118491144 +2778013601 1938425568 +1077906627 1077906643 +878514878 878514862 +878067229 2160314274 +1549968273 4685126 +3534202973 293223270 +1058840011 2509524011 4024682869 1155479900 4145216988 2517417737 1229450706 3696212533 2011347359 801968071 226864421 2270169256 4175303342 239858582 +3973416124 3545039975 +3502798056 2362912464 2294188803 2475690283 +1364308578 1704710229 +1256920038 2977792993 +2534288477 2412467627 +3876594423 2564462474 +2331265135 1855230892 +3543179599 3297636174 +4043993567 1383154184 +4273909875 1766919019 +2066765996 2568722135 +1225446000 1812547157 +2102562176 3371483269 +2760029935 2760029951 +2452209195 1119247778 +1393140668 1949090033 +2792514504 3457356747 +4180889969 3167302896 +2766989761 1643379414 +2566487628 3860660343 +485238973 3267411874 +1255617459 2210816716 +1492362736 4153292995 +151568668 3962894551 +238899833 333922406 +776863969 2502662918 +1590167868 1894156657 +4034402890 257822177 +2465286094 533989721 +180893207 1182205155 +2720847919 2073580024 2294876539 2073580014 +1990324772 253326351 +3965219632 1060983939 +3161758726 2979110241 +473861107 2436839776 +186159358 2309802022 422086093 +3801385176 2133972512 +3498925359 2106175726 +3684298434 544174014 +135490298 437362666 +3612827062 2760404033 3612827046 +172509720 1204593613 +1914809695 168029342 +2103794626 130457485 +406976030 2420946748 +1535308503 3861137520 +2357777851 4134040932 +1675038367 1884177604 +2428255661 2917999752 +965934213 660833612 +2172648474 3973498338 4135181547 +534710641 2635848934 +116731580 2952303089 +1791687623 97260228 +1412272621 1891416082 +3439393247 2542361118 +3326122132 995955116 2880450809 +1428614643 132392247 +1367050495 1148758398 +3758886818 1425841173 +3886523938 3218469560 1110661513 +1613866235 251286693 4034538565 1764144946 2884783528 +286086661 3707660762 +1041304154 248728509 +3932764759 1520883430 +1957277006 4112241103 +4231098595 3839145290 +2481535434 2720397549 +447734685 2682474530 +133515424 2469592323 1048219874 645557016 +4061169720 1208381499 +3855648922 2379572834 +2592202529 1534214368 +1048574022 2048262725 3332750704 +1470184676 3604142825 +2640968888 2245580205 +2913511296 3766464133 +1861526154 3091850292 +814935638 3444388199 +3557425165 3636335716 +2277720965 1029917274 +2172968534 975831409 +3294784905 1213230166 1171280426 2312556129 +1190527128 1296232283 +3499182678 2864186737 +253662358 1663297575 +3435214069 1227251114 3513086605 +2810694632 920153884 1495654528 2058304021 +2066828703 2375889224 +3119990673 1363519824 +391834142 3793653033 +208694074 3472411723 +3787395430 3538296026 4168405427 3294489272 3318244225 +1151723577 2116642754 +2900963573 2985005706 +178074916 1585267214 +80681080 168002797 +690525128 1878302140 +2297764430 3366780377 +3334811890 3334811874 +703463362 3884605432 209092425 +2465650632 580235211 +3818156263 699251638 +3628448762 225598186 +418466416 3017289283 +2161984717 2840809124 +2152361741 2106981793 +925056240 1392209426 2477456359 +1820237305 3293753086 +2382352857 77627582 +1261919950 2474645070 +2969783336 3492864765 +2440089557 300274194 +3036535474 2644461093 +296395731 2728387884 +785277322 954436653 +733521717 366333645 145700970 +1182628718 3771971378 +3461417766 4019490007 +2251510564 1724637631 +213335612 213335596 +978910003 3631859319 +2345772435 1644887040 +4073552304 4073552288 +3487309434 2978216477 +3320083223 2644585766 +4036025843 2249644896 +3683697949 3750404866 +419587574 1422295633 +1252259969 18887424 +2798799788 3349743569 +2870131299 2241437700 538411179 165044918 1107722628 4248770796 1866704577 +740807270 3161509063 3831885745 204672381 3903862401 3884079514 +764326158 3315644697 +62391111 564996310 +2354660869 4119411148 +309555211 433338168 +431865152 3585148131 431865168 +712362478 3497408178 +126157505 2539869632 +759183366 1108881783 +2362618142 3450655273 +3983692084 4277523663 +2540912065 728381120 +234297741 2298296548 +1664453651 1078690298 +2950037573 2950037589 +2853412102 3269472353 1038895953 +2790342277 1457875795 +2575040692 2453234234 +2153084172 310854135 +3330239103 4187268577 +944282502 3555832866 +4088630057 3433304472 +1263596569 3016012751 +81253648 2948884533 +2679459719 4050399638 2370956435 4050399616 +256841322 2206222541 +2846341782 2846341766 +3807706504 678741828 +3174771724 3174771740 +3060117145 3138509512 1411088492 +4035286332 3729386865 +433167021 1493752594 +1409360788 3519742457 +1878222597 2109701145 +3218799213 1924675986 +3758091398 635524833 +3309158111 2816106029 +337912229 2503770678 +1403352442 1160275888 +1150074371 3968802492 +1766922456 824182304 +1726456134 1151525153 +450418670 3647146234 +3410645572 1241481481 +939089801 1348264163 +1784135336 270606955 +3319491558 1584061207 3107382567 +3053520604 1604176967 +3975426427 2137646244 +4246288932 416637859 +2423748045 1520249211 +1190216956 2848954535 +3321008455 1844865313 +353305242 2828628085 +355380438 779752679 +3614457425 810297239 +1635866190 3432701145 +1282385429 1805518832 +3647417137 1852374576 +27766526 2566420959 +3219936773 638282188 +2426969022 118225694 534541535 +2784075667 1449982913 +931879039 2941370154 4015804392 +31465075 4181778249 1179914772 +761873194 2307033989 +1034179849 2617192312 +2927832358 379429413 +1528458522 286851777 +2367489864 1823635019 +2329421041 2429144942 +3528037466 3825613072 +3830870923 4279755714 +634377351 220958848 634377367 +1376778720 522613955 +2668588230 3652583697 +3184939830 241499655 +89266197 1966860572 +2573606318 1846770521 +169842330 3193310734 +1422741915 1336303387 1514247481 829812345 1436969087 2850847220 2834069614 +450685522 893872703 +2300266050 2553236295 +4147363423 4147363407 +65279958 3382679143 4128343526 4128343537 +2361692107 1684954242 +3006732197 2329804359 1797737692 4006874723 +535053282 374791381 +528575878 515860983 +3790653927 4132638201 +2857334526 2981885662 1615389215 +3300333772 2017200439 +1410681571 1082450762 +407065146 1811575133 +926728811 107528344 +1195639626 2047946093 +1041037524 210704523 +1859646973 2063088962 +2760507255 2084382800 +3923457626 1728350966 572965201 +4003125709 2246538619 +2062990382 3496629641 3228187769 2062990398 +3797175383 3104125520 +1240706844 2165518860 4187891143 +470512255 2940236860 +3324944353 705876486 +169102146 266620376 3738065851 +705603851 1075059778 +326880581 4041483148 +706641449 1996528280 +3036678689 845923833 +1471729011 403139429 +10963960 4284258171 +4218958455 1429696848 +2329838363 3074974596 +2624170329 2245447325 +3937612647 1074558585 3743017760 1439507300 +970734537 3736214894 +1705067601 458597345 +3824974272 2792597843 +260507641 1787923688 +3862594327 3349595511 +4085159098 4097810307 +1936372811 4227453442 +3186505468 4194340519 +500683045 532561196 +3684528342 333838848 3322235809 2396561639 1967093121 +126558508 2333461697 1251134246 +3442637268 492797492 +1852691266 417566947 +2888183213 2904155972 +2313526854 2720484999 +1328728497 2354387009 1576239526 +3497665606 1984371233 +1853995743 1513717218 +831247743 2116097790 +1302344497 1625159532 +3469713786 571562562 +3030982765 3544058756 3812500692 3030982781 +4254656673 3635819872 +3789924620 2827558391 +845394429 845394413 +598964904 3683260011 +1851773698 3269012533 +1861230146 3858735605 +2416148801 4135876950 +843162377 643016504 +4065617295 165404696 +3664412735 795686998 +3200093479 1884386098 +389586363 1939356553 +51329415 1963598125 +2542708868 429082569 +1949894544 1949894528 +102278372 1568163032 +3931579586 3083240138 +1045327816 2214670563 +1527119154 1750117289 +2386360909 1194096353 +3403326078 4022581714 +2493352632 2885771181 +3220317755 838848744 +1881816335 2709397134 +28588789 2746797994 +3125818819 3929203069 84606887 84606896 256156156 +1619481616 84497699 +3498744527 2168331532 +1923151964 68009654 +4211574353 2111336848 +1339871045 3554794876 +3117276419 2182278077 +236212639 3371990366 +713481926 3092296119 +3988314147 2098682128 +1625530568 1314265821 +4107484277 3716688956 +534572483 1158979733 +1464606157 3104170789 970123698 +2514632177 3827794544 +2811669626 1278313501 +9636227 1786247466 +2477217204 611052111 +122388543 460697631 +3035856679 96843044 +1857906670 1110088623 +646376495 3580218872 +1987817776 3494769460 311202973 +940189662 368886399 +1516315810 3501535956 +3641662380 2505346263 +4060679039 2234399624 +3756245459 1760963992 +2427947086 2077760473 +1333064236 3149416256 1333064252 +132390417 2098943184 +2685782927 2437902862 +3789924622 2861113625 +2383392691 1437701850 +3353892687 973174087 +128221909 3707368796 +2479591910 3667372169 2406919447 3630301360 +471666847 2682695201 +2410370910 950379309 +535959278 535959294 +2387207043 2169579306 +3719297613 1225197348 +2897865863 1873762432 1359499667 +1734885330 3234872443 +2655264647 2889720214 +1780050734 3801013719 +3139649980 2163435121 1749615958 +306834507 3162747851 +3924765800 2877482941 +15822944 2661634136 +399738449 3539759504 +418135214 3016311252 +2616459510 1998422865 +1611399329 3554999670 +738779411 1694126316 +2427382108 525949905 +2586653401 2384923528 +3883477968 868218979 +2036586088 1156120378 +1588516685 1513942578 +376901221 3261835514 +2378674744 144076241 4184919883 +330131475 217765370 217765356 1457437748 +568789621 3551884842 +2119652765 2155595316 +3618830875 2847914130 +4249866391 4115823636 +948256335 1220613720 +1443882313 2203834798 +258505040 3126523028 +1704916652 1704916668 +2525272972 2126568823 +3129327941 960143427 2549195574 +61842387 2692670764 +1068139514 862831261 +1711444207 2232035384 2801619003 +3449098097 312954598 +587193506 408600734 +804338601 566291224 +2006913791 1315628926 +856132036 2458387581 1385162394 +560552779 3822761730 +2229183296 3890111211 3262083285 2306897773 1370953048 465183332 3352413743 1594450898 663762611 +1604205362 3088527283 +3003233332 4289637839 +4153756581 2496222969 +2802631052 2232725367 +1477827466 3148532467 +1620161786 4284474781 +1084069486 1861517531 +2373645463 3469123887 +3070712460 222484129 +784192334 3805520857 +1071261114 710200342 182982787 +2281617839 3305000568 +3167553598 1959000457 +1365196355 2133170692 +2549960338 1618664462 4016597529 +374636131 374636147 +881071863 1136448335 +3706797083 3938557572 +2977884488 2999532619 +656950695 2432966579 +39579885 3664026977 +2470643021 528570404 +752207800 1284073147 +277679648 772619365 +2181844911 1751216248 +1346473980 1396025777 +1947589088 1569137410 +1420835170 3010090325 +3542048211 761312058 +781345799 1467184896 +304050719 2793449160 +1089685338 1089685322 +4202497449 1030961496 +893770360 5501311 +898958569 1117174488 +1255373482 3413015290 2810597139 +218151897 1361557128 +1055839349 2736709132 +4191654901 3067636109 1130228394 +2396783294 2723696905 +377271720 490562683 +909100680 909100696 +1328202213 2236562284 +4146073525 2549851448 2618075994 1805815580 2011687699 2618075980 2032473915 +521468145 3741573990 2032073089 +3545720449 865492224 +554960933 931713580 +301614088 1425610891 +406573784 766800499 +3163471670 179765777 +581063181 2367805038 +3288901869 2992875760 +1109039635 585141242 +1133652497 1008820128 +1962693299 3694538700 +929049820 140942929 +1503704471 3023567971 +220368678 3546765527 +1697365341 2598958402 +2530353068 415751105 +3183521009 183922807 +1469395361 2161975414 +3599523758 2106077753 +283905136 815695896 +2797137888 1843057943 +4196256648 2504479395 3895029680 2504479413 +935808157 1807588130 +3583239454 208321986 +1715390121 1822185091 +1909248014 862684687 +614888940 1297142039 +2987702633 1475768895 4138605262 1492546501 1258538668 1208095633 337741101 3214925912 1609989845 4138605272 3094389724 739525147 3505929996 3859392860 1681224800 +3933300277 3634505165 1166271850 +3804122355 3804122339 +3040415891 1886637091 +1230672422 2677281217 +278849190 3406694490 +888092149 856410786 852933931 +3710877508 3303896903 +2819572482 53832477 +3652244877 1046490354 +3800275525 3660307084 +3007896519 2116874963 786426521 2116874948 +72877643 563210242 +3615745308 1621207815 +1087291915 1180490040 +1382315613 1633080916 +2144824016 2144824000 +2167132373 754564956 +271440827 4194058879 858842980 +1641945084 2738921255 +3737041752 3442659044 4265667469 +401337115 3369410450 +4275780958 4275780942 +1557447131 4260178898 +4040419145 1723114834 +4258487658 1242156997 3160943782 4256959949 +2791842885 988879002 +2392194722 404740355 +3926846601 4269693870 +138169154 138169170 +3202314266 2210226093 +2339378596 462488472 +831382329 820863262 +1995394352 1790345877 +2518403010 600724822 656104907 1729411425 1528080002 964309366 +2795745352 3606275167 +3302266109 1289770774 +526345593 3693919614 +2031520266 3064929069 2690089779 2826653115 2399794826 818906210 +125625673 312275438 +3177145542 90393215 +3698192671 1161733066 +3279003079 1178461803 1202826871 +3484300484 2988509112 3007123593 +2067287482 2476114050 +4254720781 158091890 +3930298473 170753765 +1059677662 1277910121 +209711967 1676581835 2112584679 2952745557 +2544561466 496823317 +1739385418 3139917733 +1071445745 1156988796 +4154607113 3355509266 +816308481 3776432176 +1252423750 1294252167 +2132498404 4228602879 +1015934371 4134344576 +3234837694 4117056327 +2981663782 3952162774 +403962358 3715268177 +2970879003 3716314770 +1001630285 1001630301 +917693341 3097251892 +1371837897 1456677861 +2155570253 2457063152 +3907900342 1684293521 +444571151 3320172942 +2818392234 497863579 +928183472 3348574467 +3884901477 3884901493 +1774887124 1774887108 +2232603581 2232603565 +1360030320 2354384843 +3008773542 3533276506 +565057319 1917123534 +3790914250 3503039525 +3089152136 1769580813 +1604781121 3572216406 +1926037507 1926037523 +3409456781 3485567809 +3651044182 2621891127 +800088531 3853123372 +2834991142 677663681 +308927414 1529499538 +360288515 1425927408 +2000761316 2678163967 +3913400296 3913400312 +3205453847 3693587504 +3368529666 341344291 +3695459442 829106035 +2161692616 2639206347 +3810262905 4262669160 4262669182 +811562647 429831561 +2318154943 1118019752 +1937049486 1219874073 +1519607542 3719116746 +3552434957 3552434973 +3525803275 2481564793 2732559406 +653064603 844706839 +1773324577 3032110820 +1866824925 123965419 +2355725144 1645855629 +3834994026 3834994042 +2622237178 98964619 +4014174895 565143532 +2396227415 1659896759 +654465152 1683430647 +2730866953 1178749240 +2218874990 2218875006 +83325373 2391823436 890056879 3775593949 3551727798 501326481 3248137581 3854772259 +187603972 2639210472 3913617988 +791140142 791140158 +3853295452 3938377169 +1423291365 2993056183 +3445375834 2721973949 +3631105876 1457603752 +3706677597 3415209652 +613042246 3417294391 +315943352 1495635012 1563159725 +3173142378 654509019 +2378517456 2762815983 +2857368933 2162943468 +3088791409 3088791393 +429773601 1134252282 +3304854281 567408440 +2926131011 3533831786 +2057719563 3539447342 +629984715 3886544532 +1502792410 3692385597 +2493352634 3140389841 +396712942 659535791 +2027851858 3245048758 +2423868428 1988104183 +133646552 1648864269 +1488889086 1137623049 +1857962965 2867619098 3061026931 +1099478827 3685983064 +3359570970 1428610283 +2694470652 2417873891 +1005473039 4103387482 +1707235153 2179953798 +4082296975 2592348440 +2123830750 2123830734 +3223369623 176226982 +4092703814 3352766010 +245219183 533488300 +2153100125 1676237684 +3645949516 1713908151 +2975247666 1567794597 +1478562818 3188883253 +602830106 3592148878 +4250678808 3379751084 +1924359551 2219133713 258524904 +1149273845 3220313242 +3195243423 1385396252 1867623701 1860488030 +1180055174 1413796994 +1320898459 2346602770 +653550012 424126833 +1307654101 2277172298 +267462106 4070479403 +1616339506 3683620005 +3453810769 1675290512 +2204097942 970984160 +940144954 1894372957 940144938 186406914 +2299398334 3119580110 +4146858187 3873885925 +2821499675 3645987716 +412715918 120617614 +2449997601 60203232 +2116928643 2389838960 +1102264302 604333167 +2759654174 247418943 +938620428 508237047 +2381919246 2370630159 +3433144869 1323442659 +3987049268 1335501529 +3007648240 633027779 +1065783583 534148040 +1114449342 3342667465 +45427783 3334952453 1358362450 +2218330928 1439472789 +3901218652 2212786192 1776590289 +1284050630 1120763395 +2022444611 1103350823 +214084230 992464517 +4105129667 2046181552 +515732319 508650550 +1745389715 1483669370 +3504090130 2557649581 +829490020 2889972190 +3491588359 3344472070 +1588001752 195429929 +21607504 21607488 +1176454078 2502844413 +2262738539 408931633 164459792 3018432687 600268627 1713755234 2468412544 3712085104 3194474629 216726175 2158950193 3093537195 2169010257 1142699793 2164305792 1330968665 3235568083 +1747744065 1056740672 +3896103705 2886160478 +2154495462 3450718001 +2495173472 2143174707 +648922619 2123749032 +3262804914 1874871130 +321560450 2179391246 +1891838609 544707617 339477062 +383862849 383862865 +2889712712 3017120117 +297533708 3274730249 +2146428041 1145933953 3017812418 543600759 +4177110043 175851497 +719139299 4245641461 +1228945783 3340400208 +3216810618 3888169813 +481067088 4013406005 3384109180 +2900906869 2797297962 +1292186893 1278378866 +2178571246 1488893871 1488893881 +995162996 995162980 +2245987385 2245987369 +1436787470 2062455951 +4196671948 4196671964 1569003059 +431796148 940087375 +3996809943 2351910043 +2973350092 3386763575 +1658713426 3092345192 +1747542913 1246761565 +3859280816 801430301 +797156185 624567560 +4062739234 1471796885 +934554197 94282716 +3346707885 3006005074 1614999045 +3105639283 4063934885 +1277647691 1808174946 +3894917274 277322347 +2493122376 913929821 +1578742115 2573924701 +2700558486 2757558646 4214926375 +1223364800 3132429352 62822818 +3926991060 1291234745 +3006475854 1737614553 +3649996731 1577589337 +2472852957 2472852941 +2628838523 2825283406 +719312337 1657240124 +1888538459 1374449416 +1529099880 3791758781 +4196591405 2983607186 +1781373556 3263294740 +25584807 227570422 +2622035976 1417589556 745802143 2192244993 +517441366 3813280881 +3120354544 3120354528 +940361146 4128981981 +3106031906 1926263022 +580848556 744447959 +2932218557 2932218541 +1813642376 3035138571 +1191429442 3299618800 +1577588831 1706974622 +2368677631 1077568382 +2369715229 1999036834 +392053441 3019597357 +2862726447 248376401 +2419326235 3945247454 +1713759595 950544226 +3124406833 1532619568 +1609686686 2814472895 +2560937609 2974289356 +1000658573 2819539387 +634905278 1712755657 +2076993565 4291290530 +2478563507 1136835034 +4087878005 110328618 2217403162 +2717891874 664190083 +2034114792 3197411178 +3708665060 3768605439 +2280757279 542275784 +4287334317 121442309 4121335122 +2786102944 3875720648 +2331635020 1770190982 993036151 +3840302512 2340574492 111508501 +4242207094 2026589505 +872780522 3469100635 +699155790 3895531974 +1319324160 2872926668 3406659077 +2382343311 2851286385 +281506711 244095587 +1459007508 4200017775 +3964114946 2161264669 +1598045640 3736557848 +1494977572 442342936 1784519849 +2450259464 4041270941 +1599567234 2561538997 +129463801 516863742 +2664315715 1101482602 +3899749067 3046618498 +3362725009 401209414 +1817395721 2417030190 +1553327030 1979021191 1979021201 +2713307779 3942352871 +3832357222 704230594 +4067759720 374490539 +2414202551 1036282374 +3268459059 3784646234 +4050865395 2849792608 193077900 2849792631 265370765 +1245719202 2231573781 +1112149464 848546587 +3614631665 450989414 +381822163 2043915584 +4102951601 2056263524 +3569972095 1489651137 +3633146313 2946336622 +605112909 1339741847 +2844478795 1413996235 +3437466052 181550103 +1646179465 4283839416 +3763225251 4280351894 3191006858 3242110990 3191006877 +1284922428 3485651638 3794816274 3914261403 +2616227383 2674174626 +2176716018 808345829 +1860075695 472488768 1780592642 406381159 3768470240 1964260273 +1230862174 2113189514 +4110888356 1582094633 +3091518108 2958527384 +3429546905 1694847432 +2845206298 298077675 +39357029 375512300 +2567734860 15781148 +264019960 2196758408 +982383642 1199824125 1199824107 2140456437 +3417325465 1064574430 +3230384892 402911921 +273364737 504499750 +569741344 3654476850 2509365875 +3738333191 2462138643 +2506877298 3747240030 +3055342165 73341916 +1098259404 3639460385 +237957878 237957862 +3607656851 9431476 +3375102441 2570742232 +2692362957 3706617893 +881927380 967612212 +3208740895 359412875 +2404349593 857191112 +2012254179 2998043210 +1399639935 4128934593 +2613731938 3547609555 +3036898989 2707071570 +2390133382 3399225569 +3952064238 3640356171 +2855400805 1369787884 +2631279637 2667607337 483583551 +1809014741 1309132922 +2794214042 2268875741 +1792402385 4290093574 +3120527825 2653733904 +1984086726 4044922295 4044922273 +2562327903 3419829376 +2314226284 2437228567 +2988045568 3238005154 +3125700236 3364503516 +1660438927 1541131278 +118013439 3329898958 3966944526 3908742355 1592177377 +727744806 1860914903 +2030263964 474869639 +948049250 3746526314 1455925571 +3784323383 1291680134 +2479165154 2167827907 +2249341702 3642149909 +2449079317 315907757 3783775498 +1742104762 1981115670 +3932535485 489791906 +3708414317 2776830969 +523654251 995728476 +1024793703 2600449124 +2565989710 583799529 2565989726 +2770305870 1578897113 +3890565844 3791741871 +531457619 821564602 +2069696654 757825049 757825038 +3759213747 1842806213 +1193060960 1935882110 2397709193 3549943556 816918404 1901429828 1179675548 2770262624 2687410855 527613353 3598760117 +1057308555 3225618370 +1143145058 2770124867 +2929370015 2087686984 +687466603 3705880985 +546872074 1513885883 +2870193182 1481893357 +2525868022 786722753 +179322067 2792341548 +925709254 4173502917 +1515100616 1515100632 +4257126264 3943199227 +2185734790 1186264725 +592382981 1113783091 4163913789 2591026138 4163913770 2859468060 2591026124 592382997 +1777146964 339974191 +3547176586 1603310395 +507610190 4012066511 +3378470923 203698516 +884557161 3783828903 +636398306 3141068772 +2399699173 258140282 +3662758773 585969980 +3127012339 2755992735 +2206144114 1930450277 +3360492896 2974551589 +3411162265 3019538814 +862936457 1062382574 +3968986070 854179510 1677789413 +3567600115 2881684365 +3220060719 2848865147 1392875502 +2334470826 3046031757 +1505855486 472513125 +3696362566 3845727377 +1828464249 166760552 +3425191226 217447878 +3147979627 2461003541 +2787376059 294001886 1274715044 1887231980 1248716658 +2800330867 2800330851 +3158222056 1050515755 +4002826828 4002826844 +206908193 3837685574 +3459771957 4057984460 2407749687 +2286248619 533789400 +3760392639 2519226280 +1111404945 3652290374 +788118060 522195777 +2271018535 1046746976 +1508083773 3190781972 +1135750192 3246100355 +1086637220 2579598911 +1700250492 86555697 +1581099655 3792925334 +3542273324 1315248704 +1250046409 334782318 +4212042833 1489325025 2300134278 +2919195725 1160170917 906683698 +614863500 386682551 +949800222 88896809 +1876665597 331659860 +1357450801 1357450785 +4256649341 3834885332 +3521857024 1969173011 +802029176 1501576667 +2670613952 2405348237 +860750506 1842229645 +898381171 898381155 +4184108171 605478594 +816410929 3418173478 +2653733895 125343510 +3429989082 1036731043 +136825963 136825979 +572271257 1263996630 +2988454893 1437711876 +248850307 3700241194 +1762118912 1464317715 +2638370423 3592333709 +3702254239 3702254223 +2769799503 863102808 +1530215759 4155229068 +1524133118 11768777 +3435388634 1958734487 +143833279 917947498 917947516 +1484260906 2284051264 +3042733102 2927512687 533877433 +3650572937 2399841951 +3328917557 2413171580 +3550271797 1424617084 +3529070403 2587304103 +3523190681 778583496 +3246878263 674433630 +1947717561 53759669 +1834100580 557828943 +324568423 2008011672 +2952158038 1456588913 +2634307184 2647921237 +3026261200 2565538580 +2057144668 365636112 +2842550983 2130444096 +2907054992 1433009077 +1155196747 2946112258 +972233633 3669261920 +1352918376 1510089387 +3439527954 1420590502 +1229868086 2621569297 +710896946 2790338974 +3085612902 3719983258 3967726999 3799506097 +444234260 663854027 +1541074995 3433570380 +1676453180 4064696551 2307399015 +4141872463 4052691800 +3122525026 269060297 1596334933 +1924272269 1924272285 +2297834558 2297834542 +2573046095 1576109949 +3202003416 1246099227 +2180834051 2753125802 +300360609 3487372918 +1328535228 1682901479 +1528734974 4247699487 +1124063792 1187721446 +3719269323 3327725716 +139037424 759194699 +2851318596 1781156356 +3956909184 3349017989 +187515256 1924333360 +2450170628 3541352431 2392858436 3938361183 +4165298487 205824400 +2133335737 4236953736 +3697514722 3536432085 +2660089655 951163828 1102162370 +2145470697 1846310579 +3995680864 1257264947 +1696536629 1736470782 2850555748 +2851860321 271281542 +1459057939 139945797 +2572233908 248078169 +1830315463 2221422678 +1889505332 294840456 +919005336 3915850592 1961448797 +277423906 703109781 +1141354386 2853790419 +3447373593 2436551752 +3608374216 1536338909 +350499476 2000396015 2000396025 +4049767128 3592458765 +1098838416 2756688875 +542685888 818416201 +3317741739 4183995709 +4141337082 2410869917 +2603891151 3492725512 +2163116926 1971689289 +548960304 2102069832 +2887533263 3212651480 +375891084 491350086 +2363582986 3503943099 +1991949969 3079358518 +4278493761 3041619008 +1593708936 1654655157 +80199320 3378865708 +285255179 3473236802 +1268206351 237709454 +4012494922 2667425203 +3996928444 3931492711 +1343617425 2744639302 +1034586154 1031035419 +41295007 2129595998 +2677257519 1686518001 810263408 +3609695892 1196559097 1059538408 +3294784899 3285091549 +1073887617 3964867760 +1933783663 3098200485 +2591101996 1139470260 +4058103022 3025955513 +3164385278 3903392969 +4245908260 2598445220 +1230297215 4019245025 +1116265412 2171729289 +2521478641 2291952240 +302229452 3054437879 +197411780 1240903049 +468224858 3420064519 +684835735 3644253862 +3492575923 3492575907 +104817280 1439174547 +2473945733 2799087436 +432298735 2132485678 +2505825245 4238023924 +3795659335 3469355904 +903009044 2889977080 +4195480431 423770030 +3464319707 2660854958 +3720188735 3211483114 +459157880 841354396 +4067750791 890985878 +1985035598 2414051791 +1238310904 688870267 +1107018873 1482050152 +4249903215 900169687 +3911478138 3944494147 +3101978765 1428733772 +666211136 2099637531 +1329236258 3867078198 +1970125956 1606403039 +3833985547 3387465538 +3555044618 2626643643 +4123649073 401602241 500316454 +247528811 3854758799 2765025140 +3826756903 944084064 +1710959652 878067224 +161325974 2714344566 3106440487 +1153245482 1430504934 +771734874 3281458365 +1195939523 4198847740 +697165464 594231528 +1474153433 724035208 +2502429966 3691810073 +1861180979 3833066935 +3215073436 3215073420 +1240870308 1476451215 +1193274146 1097441323 +2184699035 2565883922 +2206918463 1235932924 +1072132117 2884327263 +2858702940 2549553351 +3206266802 2326709541 +4181760269 1840312178 +2856401757 717595477 +464524199 820223410 +2918128112 3840258651 +243892200 243892216 +3737830532 3737830548 +314105175 3489951718 +2028562937 1349636855 +3384262371 1866563412 +272381123 1371999996 +570504857 552137438 +3517428963 3993092426 +1817923614 3908808223 +1043010841 3823864556 +2212729653 3561012348 +3928088718 2343447838 +2959205446 4028258871 +1556847480 15616909 188209999 +1556301867 845847458 +1769009457 768323631 +4045672402 1811455822 +3270586696 3270586712 699438155 +399562602 3888323547 +3711006253 4200911062 1670036295 +1272478020 2848384521 +1047799900 2900068561 +3788950448 891463189 +1112985206 2531614900 +973700180 3234595263 +589620479 1377074558 +4039142468 1122660105 +1463132500 2641164079 +3612214050 298774147 +202321156 202321172 +197552611 1219028841 4153927237 +1245353658 609251715 +2465202789 2943714738 +87163879 347874464 +2264390349 3067861519 +600982096 3019793397 +3725881406 3915093773 3626807711 +4181268967 4181268983 +2787947786 2724265659 +12707492 3652828313 +1481254528 2092604307 +3236344458 3989371378 +4224483620 2263829417 +3371059265 2417737280 +1633082615 909051310 +1963795975 1758227289 +454475614 1799573865 +1236030449 2138909800 +321056475 419988491 +3130201238 1267296295 +2396446519 3757030324 +989636564 1581504808 2948346553 +360731773 756601006 +3488453625 1275064574 +949278386 3293444645 +3498137873 4154087782 +2112944543 2112944527 118104139 +419065225 3678039736 +1445183182 1749376591 +3396586366 1125688533 +632613998 3385864495 +3758224434 3758224418 +3792087551 3481115774 +4285575597 171721814 272387493 132741194 2508578127 171721793 4025045632 115963572 397126087 +353943842 1475872917 +3193874007 1640343491 +3867864939 3867864955 +4125213476 912667071 +718184201 1816419128 +3096169651 924007898 +2963132279 2963132263 +3392697851 173541032 2325505861 +2076677721 1211439400 +3508721480 3508721496 +3556938623 1057894654 +1358614327 2983474064 +482545436 1662044423 +1381367517 2423578856 2423578872 +491943110 3298782897 +4123824776 2030742557 +2133538879 1879673640 +4010767692 2706744993 +1686675791 1351075724 +2559468642 3221347179 +1350524873 1350524889 +2203776295 4012895328 +1914072824 2437984365 +1677500480 2796569797 +3120400079 2568697806 +1328122467 23386588 +1512641978 894363178 +3973651501 2111043716 3814062354 398875740 2111043730 1825441691 2435472605 542120649 2435472577 113728196 +4287870762 2139707149 +2383878432 3462172005 +748392867 1775123199 +823618722 3923772181 +217427122 3376542367 +3686290169 2501293768 3693780478 +2681895305 4137230738 +1646020475 2396473285 +3554854929 2667639504 +2518644271 1922553723 +1363105965 3842018612 +1283863432 1283863448 +1108336437 4133667401 +1935647909 1150300090 +411933254 913377284 +2488339785 3298290159 +3651430190 3651430206 +469808856 3978286605 +3173270445 2355337815 +3889212386 3481179338 +150746792 3338285584 +2905643125 411041834 +2580874951 807966148 +1975090652 4253160852 +4277626912 1427111323 2858775839 3196021849 2834466670 3211759612 +3959931802 708373373 +2160554641 1384719798 +2488781475 2027540358 +2985099185 879836737 +2775504389 1920657868 +2594595366 1905901654 2582413783 +4025097142 4025097126 +2296750703 4034835640 +4208525018 2737333922 +2133674884 161420618 +2647551576 3287790733 +4064654159 2998486350 +1589670453 1355157964 4090364983 +2448608315 1608204366 +197625196 4198706327 +167333506 3213411447 +269934707 746635191 +217363075 3895788586 +3657346311 854221334 +1908993681 2958003792 +2942960088 2349576999 +131317315 697865133 +4219450240 1778881157 +1739418087 486389430 +3227345969 2037348033 67418406 +1982795839 44659201 +2855761623 3427800166 +3069160945 3964588646 +3144005241 1577071204 +3891594600 174250755 +2999952052 1159429919 +1461660879 4111698382 +1198975652 484463225 +2934012441 1710437704 852688532 1710437726 +4223227956 1155484381 +3670478828 1398673559 +2351172971 2768534876 +3651340416 463888773 +4010522257 3765462608 +2657765670 2270242519 +145435390 799913503 +1976104128 727272019 +2054147084 3388880631 +1847838015 2706342462 +3489945752 3489945736 +2031082964 866752910 +3274659303 2753912640 +1026189975 3771059110 +1027569721 3351608862 +2180686965 311485500 +3781008947 2078576017 3727701430 +2742707591 3071728581 +50140781 560614802 +3127379545 3401711112 +3728840519 2768279091 +3265725945 3779220222 +2095185881 626089662 +3106031935 2952351272 +2182396782 883101241 +2160748616 4125987100 +2230316145 937108895 373752970 3950695152 +23300369 1085326800 +1221034327 3754827705 +2285758447 1752440100 +1057588281 1962616232 1962616254 +759248349 356909231 +1599010997 3503944649 +2945121469 348904843 +3149009476 3176317184 +3407025512 1263189008 1106097232 +1370393328 2244261845 1772971101 +2582339183 3162876088 +1379417235 25647994 +245236038 1220280609 +469011340 2381819233 +171220714 4208339533 +3011126440 826782845 +1517617056 1931964102 +3896862801 4131600262 +2861927054 392764825 +2315199801 1973917864 +3775791919 2014249720 +764275926 2355877105 +2495263538 3378335450 +1040378209 1040378225 +98554594 559479253 +3409183946 624047667 +3479394744 3475639602 +2205397333 144717306 +4064254150 1023344188 1232081762 +2028995872 2178421107 +2231154549 240178704 +1996311535 1069451566 +3734691728 4258131893 +3214917924 2514051419 +3082970045 3082970029 +3833584935 3695780960 +4214556334 726311691 578388985 +2147582626 610313493 +533283402 1406360187 +1473347190 3033142222 +3031234249 2427163173 +3133437652 3133437636 +297059683 787540244 +3190574639 2394887150 +2559369189 1715790874 +2610594100 660192076 +3047768724 2373177071 +881091167 2062259978 +2143141469 1950170871 +1179039994 2606051735 2606051723 +393995675 2466935570 +2077882231 1864405062 +3391308366 2206294233 +4174084092 2756567473 +4219565471 4219565455 +3799731362 706323221 +1446977897 1168289765 +1744941456 1064336381 +2898735563 3365102228 +299033774 3170762233 +3688866440 3209194672 +804702209 3713489875 +533197399 1589804774 674096823 +385029964 1049846074 +1463440152 3335462785 3451227315 850801071 1758514907 3450787552 +1520853908 1206829551 +1305730805 4212206746 +1453690336 3494115515 +2365911911 3823736414 3139570789 161061133 1591010162 +2215806067 1546027290 +1999409636 2133436905 +412540978 3884117683 +2606523157 2809133590 +2333461950 2974999049 +2263136771 1561383612 +945387311 3822493432 +3102899419 1810225546 +1786026140 831274385 +3514771189 3223999402 +1442687983 2334989969 +1304341583 2989047886 +575764076 1916627991 +2578155283 2833217943 +2775362138 3402060042 1186825974 1349828131 +1174348424 1174348440 +1504930357 1785737596 +2168452789 749821692 +2453273440 2437330981 +55111019 2491989698 +3636433599 2902470268 +3613911605 2359708122 +2084284124 1843899463 +2585304807 2076321184 +3555804803 3952500326 +2691221181 2575806411 +720603035 3300427675 +1035686961 2413244471 2304173782 1592101168 +3966825902 3822239983 +2751279845 1273297436 +2851235119 3620314723 3519828800 +2038413021 4218625873 +348118111 151513480 +302809665 179727206 +3348628273 2655038912 +3260086577 376981542 +2832051293 415651444 +2243560294 2399031290 1013291985 +1765653408 3750675492 +862424349 151200948 +1922766720 516926299 +2714626927 2006338974 +3421224121 3792864181 +986052923 3232192484 +529202077 2410698746 +10924528 4134149333 +1834204470 75551405 +597560587 3126189961 1918892941 483297364 +4082333470 4215025449 +84641309 237248446 237248418 +2124765349 2275270767 +388767883 388767899 +1070255784 3653810704 1660607171 339956331 +3142857789 2148617272 +4198438118 3612206615 +1224509317 2055827356 1224509333 +2809786128 3035846179 +3819772226 3819772242 +2933973965 3496633601 410845312 +457573405 205027764 +697418074 3396559037 763034705 2528134134 +592793609 2823618104 +65943275 1974896920 +2362147649 1804063856 3848249152 +668306032 3564056523 +1277894857 3856810296 +2083589704 3375987531 +192358194 1049801647 1049801651 +933550255 138296827 1199643512 +2020780026 3885348054 1946682562 2524868235 1946682581 +2714760155 2505892292 +3923389571 2775847466 +2844918214 3067660961 2387025425 +4061501869 702647252 +1447746785 3101275680 +3613559677 2620937634 2541978168 +2732685380 2901431071 +773354490 2323550877 +3233961261 2666272196 +3109968300 1691225235 +632011343 2622900814 +1954424507 4036233233 27857822 1948086149 +1622784617 2908779352 +3446017236 2738374923 +3968265500 1952924423 +686343026 1012675784 +446309002 1789157179 +3297552115 1550504090 +1890569227 1874736456 +2985907223 3733220226 +3034155530 3161738683 +1902309045 1902309029 +2933281829 4216069468 +3972436226 3197519413 +4045898724 242848375 +264770029 4273663682 +4195018320 4195018304 +3528586389 2885944988 +933899657 2727476216 +3060351974 230023937 +2152663124 3490344383 +102321139 102321123 +1796199874 3923844042 1273856117 +465134573 2446872068 +928598307 1150165532 +3907538321 649200128 1616965409 3907538305 +2837947716 2777492527 +3011401513 3011401529 +1749336479 1247046765 2696357962 +3354860192 1778313708 +1753327679 3273382718 +2832953810 2742300051 +2181169333 1579621610 +827642570 1921504237 +2432460810 2007375785 +4250332506 2306357538 701998251 +2231250690 2231250706 +433266289 408480752 +726733590 1125886221 +2569860369 2569860353 +1721969870 1109707980 +3866857869 2015747301 +1164246279 1157255680 +4228057225 1103523768 +1846078083 3137940522 +271350185 3951724118 +3005075049 3781801944 2486611550 +942477678 3406101931 +124331655 830973590 +423334938 3208125922 3536463083 +3810400676 744643903 +315730332 2671973772 453698631 1007550599 +1792924018 2906476147 +4054714725 3656960506 +316737998 2252500825 +3058071914 1525752283 +2990068910 2969972537 +891321664 2662249570 3313755931 +877659957 2398836842 +600560526 3890088089 +705357924 1915440496 +3084797110 3847547957 +171394859 1074071732 +2350823140 1586079448 2019158249 +1345390678 2469404529 +3012291865 3192274504 +1833564148 4285617433 +4241137374 1972174079 +435662524 4065607280 2632454641 +1089959784 2287757904 +2649469578 604639021 +2935327827 3213616812 +1009159812 2138611140 3183695727 +2951889134 2571091374 +1135659144 2334166704 +835018473 1833110606 +3626502959 3441359544 +2839390955 1460932596 +1256881072 2669721109 +3628821899 691679407 163410388 +2526546957 509278322 +3507419289 3012647112 +920037307 250219364 +1203731646 2960219935 3782786526 +948828404 4219398169 +4214036623 4143819022 +2385393503 3675649034 +482527506 99279364 +533196875 1388267010 +3232054535 4278633385 +2445728184 2445728168 +637419923 1315419747 3301048391 1731343655 2936654834 1731343675 +1624259428 3419242089 +2960339786 2772781235 +3574521545 795391598 +1936141684 3391684116 +453760008 2610874516 +3956517923 2648260705 +207100590 207100606 +149168035 2719862172 +1224232505 400761790 +3428955322 2010087627 +4273214228 4273214212 +2331101005 767518898 +673801379 3693702300 +4230168524 4218707447 3078450743 +3142938340 1068179160 3414003945 +361483968 2855755515 2719749752 +1323786808 1849663021 +4024135603 1755456311 1232131788 +1768916350 2022647113 +980669199 324354200 +3366452867 3459765872 +3769559690 1029388077 1093133574 3516396005 +3326159478 2392184785 +2425502448 2425502432 +1106369524 799705997 +2435878428 2435878412 +407893137 3536133984 +1533120182 2425596039 +32407608 3378335443 +1309857792 3047858139 +2061407114 3368446797 2180893461 2858276971 +1918915262 1918915246 +344360297 714262222 +828107365 414317804 +4050713820 1096714319 687479986 3442040005 +1217275715 2059914858 +1071496648 183773335 +440982930 4071935187 3852365882 +2839836286 1661695202 +3623222776 4030647665 +1011761543 1982932886 +627684406 459714833 459714830 +2782775452 3089288593 +927340122 1565863842 +2616359244 3151623031 +1758870275 4188155075 +671938293 23643068 +432307957 2236865468 +888716531 3421980486 +2165135004 2165134988 +4196578955 1336237250 +3222633990 1742037879 +3697162142 2088650174 828515263 +1451865888 1060785995 +1080813058 1809519925 +1220926605 477770226 +432272447 3464068904 +59738499 502626602 +1750850306 1251591203 +2176590533 1564876010 +4068823419 1121928356 +594329677 288536868 +3322347752 2768661821 +1388726015 1294058366 +3826562516 3768204463 +3001589084 2824913049 +1160717299 3846962385 878547318 +3278454817 3070036642 +3896085722 1821948715 +1950416539 3529788965 +1558349823 932976232 +3188173792 902710956 101945765 +1479768685 1175042436 +2184697744 2380814243 +4255835386 1309046155 +1894273945 1455135176 +4004921210 1122364683 +1848242287 1318036725 +711207812 1850514628 +1743296834 2129944126 +1505859825 1019462502 +1470235627 3742116578 +1190430033 3195362062 65920655 +751180213 819623914 +4129497508 491648319 +819386955 819386971 +3187877323 80501045 3756212975 +624182503 1545148153 +1640200399 2960269394 +2801618427 3686908466 +1806734878 4209743258 +4221781735 3633324786 +1274830482 835232462 2086177828 539659533 2686574099 2339536919 2618073372 1349501903 2001278138 107755066 +248911417 2483354536 +227294792 265079116 +1728007366 1786492105 +2686806540 652603639 +910592229 1443463276 +2513929612 1850162017 +613829571 1536771050 +4049662415 4049662431 +777380189 2740739243 +302087770 2975773134 +1654942629 1033349731 554090716 3651246663 +3916041604 2383139524 1124523927 +3506771946 4110722381 +2313959100 4207792923 +1549595240 3461454251 +208153959 1546366323 4009720096 +2169267302 2538545050 +63599628 62172897 +3476711867 4092883300 +2266526733 3095310436 +357908507 3854183880 +3507502179 2140082122 +1539938220 1539938236 +3562389655 3657313712 +1037580542 1471361918 +689466413 3732032210 +632494505 632494521 +3873604791 3767906327 +3677844635 1444602299 2769269292 +3522204935 2226821632 2226821654 +1100161301 1375601523 336306070 1581681581 1100161285 +126375578 1973441661 +3934879037 3871673568 +4090064860 2719684423 +2199734237 1368965201 +2018760039 3539530038 +276112809 276112825 +915273177 3128558728 +608662968 2543545484 +2778858597 588049132 +1816659385 778109480 +1069070026 1289783334 +3442795551 692264136 +686935263 1403355934 +2874326437 1480624812 +909288758 2277118993 +4085376236 1430086758 +2461708299 730691384 115548482 +2450467654 2450467670 +3355909607 3392410272 +3823520439 2055708176 2055708166 +238446416 1617802914 +4095613282 4095613298 +3734010379 1752178516 +1308411315 2011904204 +357971547 3671481949 +784694839 3622154384 +3790616245 3643300265 +4262312521 949764334 +2473355811 917181725 +3448387650 3938623928 +2582339186 3213208947 +2203136760 2966633581 +4177166955 4177166971 +1290915185 2443602150 +1787578761 1138213550 +1610293952 3629626451 3228938872 3629626437 +741676801 741676817 +3250370740 3250370724 +4174886392 3012785531 505535109 +1980239642 3903833597 +1263210601 4029338968 +2432827492 2854657385 +1193762547 4126832780 +3658230730 187231995 +353586889 1325997870 +2115774159 1431377873 +3773855763 2701152918 159515185 +418669473 1677302736 +537626568 975617995 +2446115156 3646183205 +1474476191 4175995486 +1428648946 4279993829 +4154073026 2308963957 +15748141 2806508242 +3197542408 201437393 +470129179 2607262606 +1132872626 4267479347 +1882364248 1770314995 +1029392416 3065154149 +2498686151 1794630130 +3842375561 292635822 +2716273230 2700253879 +2887242604 496060341 +731629774 1950161999 +516674055 3453971196 +2835878518 3674723905 +2240124333 355225695 1098436100 +2974781382 3862910113 +3871569961 772643464 +2554858099 2554858083 +2907622284 1594518903 +408740434 2889369349 +2501083702 3820354321 +2604324703 3222808673 +2477728626 1033756505 +301712687 2119657710 +624751531 2658497486 3840887253 +661607028 182191785 +3702115034 1526993589 +2970612096 1276724643 +612151842 2454481802 +3213265204 1928923551 +2941414528 3390672312 +437517621 1115134588 1862732956 +862279437 862279453 +4161473768 2407457556 +3526932032 793175763 +496821927 509196857 +1202338206 1861792681 +347876253 1094232098 3459296661 +4019762642 2699862651 +2592541957 1201241804 +2015637469 707143761 +1659679320 118128288 +4211367258 4211367242 +3869651650 3651266421 +1688403650 3028124263 +583361780 2965236751 +1282912359 3345658400 +1691725971 100482326 +657586631 354791414 +2432743876 1515951288 136605599 +2135126183 4264187616 +1653425150 576850143 +3525770741 2680552907 +3377970034 3362482644 +3993396407 1796246534 +4128457080 1334461262 +208431783 173259813 +2447741200 3160628277 +1215686983 1486764745 +949800205 1965180018 +150896313 157149908 +3289237285 3333455674 +4128654067 1477141658 +2366293864 854907472 1878517949 4415892 +719744142 381477775 +1645800357 305853612 267759023 1892632342 +3782632626 2673902629 +2317727188 1297956015 +3448448734 1657216939 +3447929935 53435020 +3621378531 2935095388 +2763130679 2763130663 +3072293144 1586208987 +1033067208 3069700317 +461718591 2638471186 +2931972469 1480747802 2431832892 2156185171 +3869442262 3902427367 +2484989640 2527217635 +323673006 1773810361 +3234827128 3917966355 +4224932421 4030652522 3229974496 +752360690 873463865 2438152558 +1972575938 989718222 +3810680795 3481121672 +821019133 107897155 107897154 +3054102962 2315188051 +393785605 4160662234 +3588722780 394805457 +235052122 1746674091 +3955186818 3851870346 3955186834 +1308274320 891437291 +4200094290 1796615955 +3695898889 1286417262 +1562047744 597314865 +245185390 1870958137 +2493355952 2752891395 +1481758403 4265610365 +3220253852 660971335 303527564 3299424647 +1236193543 794757651 +3041899297 2352804803 +2681506925 144248722 452166341 +3179275170 4065548309 +530114543 899216834 +4128331474 119581562 793488531 +545851446 1840770311 +527686275 1185747568 +1174974494 1870135107 +1771265055 1509937291 +1090711080 2140989693 1090711096 +503756825 2913956094 +3355076129 4029597174 +1692152401 148835901 +3799460643 2761484298 +1174164770 646478416 3159774558 2095301021 3327329900 +668681611 1227782594 +3524228576 2388037555 2388037541 +1410814383 263558776 +2945564425 1122211461 +1343858979 996491786 +3182136769 1443899103 +1222460013 558862738 +916422964 823682265 +4261293050 3508484747 +3266928300 902826177 +435200046 1768138425 +2928218797 1858627140 +3868608334 1284653017 +2941514521 438808670 +2439905775 2280170207 +4066040214 614688185 +1856475273 3081606905 3133704110 +2480936336 1505882548 +550184305 1460419073 281800934 +4024235342 3872795097 +2450993231 2450993247 +4112432425 1550043806 +406602339 2312929756 +4284624864 4284624880 +625535517 3469249460 +3863705942 3738174065 +3293044508 3293044492 +1956445351 1858219065 +3431390908 3025183217 +1950911495 355757846 +3894125345 2387978054 +1361521560 2434830304 +3745397257 2012568632 +1900246578 1900246562 +3341297267 4147414810 +2344726571 4169943342 +3960439590 3261822145 +1001969557 1572300346 +921036913 108617463 1785687827 2935239936 +3588182572 3666762583 +1664107341 2658682021 1912205874 +1123549881 627853608 +3682413015 3841234755 +2278024122 1341587526 +1041726105 1447049086 +953011476 4014776447 +1437915608 3954963706 +1246727349 1496877587 +2878696070 2721493239 +814319075 654051827 +2070679253 538663260 +2850261217 1378908735 +1475962666 2812110605 +614212247 952791974 +635323694 2178794205 +3048227003 3212174962 +4045358681 2349612582 3980115479 +3793216592 1000106467 +3353793839 2178151505 +3831780651 286983644 +261549160 4069926845 +1600456620 3664779479 +338448915 3569693676 +2640228518 46412821 +1242046773 3217835644 +2374029936 3086989259 +191774318 1821132591 +94758905 208520815 +2720844358 2726462833 2458020897 2720844374 +324684710 488969793 +1731480054 1833987665 +2801935324 3294524241 +3373133023 3373133007 +2320158940 2412169799 +2484791156 2503881183 +3337697158 3849431494 +1822112346 1381817277 +2604203744 3779039192 1026921284 +2959608674 2962430382 +1441331940 3004951792 +818690988 2105667521 +2515253622 1456945994 +1459578504 2081318941 +4290988992 2072084699 1812025842 +1751986686 1642443465 +3112726768 2829527282 +3728714114 830961044 3959430185 600379548 +1131260454 1268963777 +2490549844 766732212 +1827700366 211237263 +3774061281 521784191 +2333855444 1637931049 +2729007349 93784508 +2029726729 2087080504 +3522522321 4129767542 2077509399 1448758544 +1229949540 3426147199 +3054684386 3157529578 3054684402 +451523937 1108191693 +2246049678 1302285465 +2398775479 440412058 +320639618 320639634 +427685145 2024210127 +2866879932 182496896 2855363491 1943722396 2413682965 +1752672613 1752672629 +3154774892 3463930412 +2644492567 964491046 +323904640 353124443 353124429 324220344 +1597037386 2274359436 +3892534154 2394803930 +993391634 3366285878 +707849219 3952099312 +3167821144 1769013491 +1441075338 48860705 +2474158610 2712330502 +1910209130 1963961254 +972537317 1340474198 +140430447 2321881670 +3547130444 544527777 +896586353 2442872816 +2664245453 1273076347 +2678771825 3404079600 +2463098735 2353615800 +203210291 1145006682 +3092649809 3658362592 +1807930552 2047848640 +379577741 716594418 +3707861328 961673461 +547229092 4241455401 +176511529 2868611470 3990604415 +2226228535 444681606 +743940092 2737226884 +2081749780 1503337460 +2078464053 2536111646 991583100 +2529473317 2091254572 +2228443912 1806760496 +3843638132 449130383 +2983150332 3538282459 +4175333584 4175333568 +625833658 3117304646 +2765360734 1592854163 +3726365991 3436219510 +655940576 3736794797 4049358552 3736794811 1814176165 3736794796 +793076445 1195024866 55367381 +1324813073 1608936410 +218560672 548993816 +1384727950 3918478105 +1011084014 1011084030 +3884759109 3347453082 +1607923231 4268061406 +3755629956 3904976581 +2317000329 2075765924 +1830939342 2590286415 +3244905781 2916164220 +592632360 2655161335 +3985721483 813523139 +612144519 4146029440 +4238895395 3933458951 3760030236 +263717285 1672124076 1672124090 +2354823121 3312383504 +3894812328 469910141 +3098282930 1758882099 +1761466065 412691216 +1490226480 71156355 +809562192 109957666 2623552695 +204962861 204962877 +2412798472 1829393053 +1466074740 224684233 +1500848172 2982862136 +3440450979 1961994140 +990535470 525587833 +1001090381 2063634841 +664389830 664389846 +96304925 642718370 +2252606502 3432943285 3214575875 +1767483034 1914782845 +2248550856 4043340533 +180042207 689765003 3283884552 +2291980848 1055619459 +2437417501 1217916930 +1225016085 1225016069 +2146959817 1013632871 +2621315036 3518992199 +4096274491 2521033970 +1828949928 1151018347 +2721457141 1346017980 1346017955 +1248700021 3235321535 294344425 3764630606 +1942270472 1429894570 +1218027068 501381607 +895521002 3296653138 +3225101445 572161356 +1041796394 4087484499 3936762138 3936762125 +1922717096 3878572305 +1625438344 203357707 203357725 +1481912708 218706775 +55503048 1943847855 4248335060 +4107496171 1406226420 +3174806624 3174806640 +612804229 1598654979 +3306767390 1690712873 +778659863 3696865655 +2492326655 3663484776 660445355 +1570074966 2822859377 +1311064035 4000387061 4085260870 +366253377 2661741910 2661741888 +3670412393 4230504901 +3447847622 3160886308 +1487101756 3308186471 +1006693882 356516074 +158298539 2714385794 +2358870964 1519678977 +2997491861 3354445274 650978483 +3607038663 1042351328 +2768140680 1150898461 +3880805275 3196898578 2031045202 +960219898 320898955 +2773595336 127899339 +2324573196 3545341020 +457242662 222733271 +2574245793 740100726 +1485567801 3701432534 +955187033 4181457160 +2712186313 1166644088 +712734967 3613355206 +842088851 1738143744 +1023480504 1023480488 +4028731243 3008384429 +1837670133 1662139306 +450389665 450389681 +742985298 151096069 +422104512 1530651973 +2483899121 32307568 +543244995 3155958012 +3565940902 3565940918 +2616802661 3869527431 877021340 +3255963029 392913308 +3265085458 1871436883 1871436869 +2128831208 2817831741 +1331610078 3492491369 +3400154725 1862285548 +327771183 980841836 +2713208985 773474504 +2556586845 1072628596 +3020739017 3020739033 +1730485904 3518294120 +2192709379 3243915690 +361234746 361234730 +3917362011 3572658974 +636650068 281225775 +556409156 2035441183 +1390472433 1762983792 +3070598197 1389684586 +1263967146 3679874496 2567492022 +2851146220 1920114305 +2380902269 3823059412 +3237786436 298726431 +2755995098 1926927915 +1093432995 1186688465 +3071060619 1726512501 +1110692131 1519532572 +140019202 626718005 +1140609540 1080400356 604866436 3952749990 4252517736 +3678539403 3019695316 +2639385006 14152761 +2813528537 2595929696 +128051980 128051996 +675041553 2898155546 +3709620098 2509318581 +2479730561 768296982 +2133665701 2223318712 +3595122484 2302797529 +1906364561 573969907 +2218162760 1774354251 +4022654850 4108272053 +3031402894 2972055019 +1709355566 2447277689 +574742153 1991332280 2183923845 2552473704 +3375046222 718607261 +3915312853 896661834 +3798898352 3798898336 +4003959326 3486188841 +2205913215 2055501822 +720245812 4004449417 +554748931 1262575686 +3171191271 157457892 +2286466043 948794558 1220055365 +3088010498 3256236597 +1261467799 2927254206 +2862289462 1036286858 +1225651550 1039336394 +290256953 290256937 +356394657 299290486 +4271945025 3511532736 +226696289 2791681184 +646003899 2691238783 1483905636 +3931962146 308237955 +2821559353 3374185775 +991951317 3897969226 +2935026505 2924411896 +3023049402 1668947070 +4227335172 2876133983 +3770051419 439025746 +2904435462 2357049975 +2229383309 3158896100 +1363853644 4149798251 +4031162994 3613647304 3630424926 2973651301 +819105452 11696065 +2877410820 378243817 +3423533234 3985735731 +3707998504 345866749 +3258284174 2962616317 +3818414161 2581569423 +1299472083 3241231930 +169873727 169873711 +1279299588 228767305 +1109802771 53779041 +3756369403 3611342504 +3084533714 3084533698 +4159831108 2515541791 +3728738162 1355528307 +2815264868 2887029849 +4061247133 2934077730 +4287443497 1127223935 +2333992329 3012588788 +100129433 4264369886 +1452638426 660199229 +2106843965 3972970772 +3842026591 3742325128 +3911545657 3635900680 +2616576231 4032525555 +989408495 3195751483 3309419576 +805061917 3131187989 2803944628 +2717193153 2717193169 +2199604684 2196185940 +3331969968 1411923477 +246785696 3354742245 +3319286307 2524755228 +2365387879 2533841538 +4084329751 1398291238 +2934325301 2306282364 +3806303200 99994021 +1461142036 2869201107 +728945160 1841341085 +2040469032 2641354987 +2106293908 1582302680 3937496553 +2786266464 2448442427 +2504258272 2504258288 +2663529565 1220871796 +3202658995 889540556 +2286114095 2286114111 +1024063028 1252955087 +1602849487 2251197708 +1788557102 5758310 +2409149930 4045052454 +4163555215 77021146 +2186239293 995182801 +1372728488 1977371755 +746038 1206622993 +641061934 2006209098 4205137271 3430408404 2880888712 3566074542 1421673583 1743355875 3498964093 +233285920 61816179 +3863025421 2361957989 2239187314 +447598671 447598687 +2496162989 989590051 +3898995485 384205076 +2225890750 2305036537 2225890734 +964682908 3364838646 +944103881 1593995128 +368409924 3581162015 99268105 +3899719433 4074863406 2264197497 +2854556206 836051314 +1503165182 151625161 +3862738188 2106655201 +2571793343 1800141773 2536535914 +1681912997 1974345658 +1663063300 3866182590 +1130211592 1130211608 +3050739039 2681021576 +1475319409 3744060390 +4013405996 3233110615 +104774330 2394944203 +1237658413 1237658429 +281857722 1673331173 +3750942250 505881627 +2732021014 1861939623 +797057776 1810283612 3118268373 +831817309 698411839 +4138322439 1414072598 +2872452879 2503965848 +726706622 3992663561 +2770774682 2514391165 +1450196938 1795451173 +756216809 4275375702 +954580526 3215614575 +3254070627 4034931217 +1060768485 2798227997 +2392405023 2586643656 +1783680863 3157684894 +1030078690 2301535178 2301535189 +881356310 3368373415 +2861079309 2181830002 +262800537 1101348062 +2474683345 76446224 +2914624897 2232301346 +4199366843 3265062514 +3010383652 3010383668 +4154184069 1330304076 +3241270762 192960347 +2197101308 601455271 +1307117938 400154213 +653949997 179644315 +4061266538 3452101397 +1413500588 1413500604 +887784268 820046876 +3467096615 2029876086 +1966211108 987443737 +3029214327 3113984738 +943319781 2021421596 +2898447753 2141818552 +1347584609 3538108064 +352971860 1923024943 2841244073 +101546310 1188964322 3442862391 +2832251768 48503827 +993607056 993607040 +3058357676 923413104 +149502730 3168794226 287830203 +2649281525 2810569720 +365561077 1725767388 +1824250932 2359849044 +2118237032 679562114 +1914965867 66672015 1938533141 66672024 +3826259026 2246796525 +1140609536 3630288546 654706782 3467073458 228818726 2877673093 +1095981198 1681155993 +2156726061 2156726077 +1867236219 2519850564 2940517037 +3057015259 798546286 360716601 +1969286840 2140654500 +824378604 3868030976 +1564704777 3661794862 +1478281840 304638351 +3672628677 1610751258 +311313163 3424820930 +2170861712 3831780527 +3032759784 2597190659 +3865025905 3116058733 +1058574019 2812379303 380157180 +1948383816 427622237 +661988510 3144197289 +2648469881 2842704201 2648469865 +610222049 944009744 +326438996 4115182649 +3004524950 1890917857 3004524934 +2173717537 388487136 +3413301281 1724529654 +2879284177 4216791558 +2511123767 1101038004 +2735417868 3063099639 +2909296999 1648672032 +3521258782 773291458 +706082475 216379096 +664578555 1453299250 1453299236 +2906654900 2609053075 +3733546658 229025449 +95201961 2547034136 +431876547 3637629862 +1241721786 1023268317 +2224822343 146421718 +2862253381 912006171 +4153043996 4153043980 +2498075186 453774797 +769091052 769091068 +1089994628 3395763423 +875384775 3931412054 +3548237223 317253555 2517286368 +3452951140 1647627113 +1287197021 2906266315 +866720827 274455557 +2734916026 3762169818 +515141473 3070973344 +1633672117 1633672101 +1979879397 2869462394 +1517456555 1805524181 +3612438676 2301901040 +2112590767 2112590783 +134310791 557598102 +2877546970 3667692093 +4206924811 3358133570 1822423864 3521275381 +1374801070 2913285615 +4210516451 1696813098 +718480382 1751230687 +1743693760 1555174227 +2687735007 2295877002 +789103600 4207702741 3292432480 +1184685322 3938543717 +4128350848 2662116941 +3362887497 3553699815 +4205071207 4154635062 +3435865223 3939139712 +2027846360 507208205 +320997650 320997634 +3858890153 4187551088 3189920024 +2695403577 577216936 +3094616213 385557683 +3839682543 1711339743 +977106333 1270883874 +4133133583 2837547340 +3891594597 806994524 +746249142 1921130301 +4176663842 138773653 +3028561655 3513623675 +1973565660 111725211 +779290362 420739979 +4067020653 2870610962 +2376600578 2376600594 +4180936861 1621907678 +3660408531 1215880762 +2711871026 2373842969 +2918521175 633437699 +4067833893 3574341753 +2507285100 2930520087 +788983231 2932980173 +2110458876 44293543 +382214648 3509986963 +2671335188 3141801081 +2459838129 397425984 645553079 +3619526827 1249334562 +635148163 434215893 +734797781 3344309340 +2874670723 2825377392 +1459102262 513661713 +159901020 1559105489 +4265503373 3411988271 +847990931 609212282 +2190587313 368400136 +2361770299 1051221420 +2666824111 2893318303 +3776189306 3432687874 +3523427684 4279870591 +2094719247 2609924750 +2601931736 4230348059 +1684876221 2702772440 3571178114 +3665132004 3404653033 +3660808679 1712684726 +875916334 2429768377 +1324448190 2710274783 765396254 379905761 3646221212 +1183507795 2743468205 2885746134 +3945066471 751725534 2265875941 +4211383291 2905582302 591498290 +3416130377 3535743982 +1079336478 1684220201 +1354127015 3054135542 +1374237364 3572178656 +3280131957 1006185770 +3192550795 413431992 +1854222308 2730934861 +97144656 1836767989 +765703634 2864134547 +1080787560 3910816415 +1478339690 548825819 +611049386 3618836986 1361689619 +3160172897 3866747808 +3770147069 1833383739 +251825184 3570485433 +1961377185 2862154870 +737184478 1527485940 +833854025 130225838 +2919993827 3744901212 +2826955873 2724273334 +1957111176 1957111192 +1872592186 1872592170 +2211897331 2865125093 2898680359 +3343052084 786828703 +2953274983 2191930422 +3812233194 2657553741 +2681078441 978202638 +4259264934 1281867841 +565243121 4203020144 +252234391 3344872571 550154792 +2609327615 1616597152 3570231393 +238331194 2531269213 +1681457079 2685585539 +1450655847 292059251 +1512468358 318087633 +1615851135 673357156 +351825074 3037928485 3037928499 +4112599025 3563339888 +3832959076 3832959092 +3298640672 4007153304 2744167283 3787313147 +2346298641 1374533053 +4064059693 351600283 +1731712322 3202660067 +1921252098 1204036650 +1981162227 1453467767 3621323916 +1008241169 2879477958 2879477968 +2599223452 2132276615 +3543271884 1776341916 1137011767 +1270981515 1181898424 +787083873 787083889 994610870 +1118989551 3990977592 +974071697 1098005847 +418092102 3226646037 +2518237989 2827049337 +4058206354 3569720109 +2975126975 3884743614 +5905660 2312872113 3049125543 +4044410009 4044409993 +3276220026 3808530973 +3897476181 3677128522 +2309086576 4140514013 +3982285928 288290731 +2990861039 1092106811 +2149991725 151246802 3913213403 +418908319 3983905374 +2050789800 358173565 +1249024509 526929924 +2353028781 1985284690 +2911015391 2630881930 +3127008708 3189763207 429473081 1935522689 4001439490 3241925922 99264971 2756740096 342328486 334868848 978648258 +2552586774 2388886058 1161805559 4200177350 +3366063606 1480822076 +2635775601 3256470502 +2488788959 1700922398 +1107054289 2267090063 248825968 1281870543 3498633039 878379524 1450766073 2951895170 3158725290 2622824106 +2021869859 2920496993 +2202005078 4000956117 +832519721 3544321422 +2297435773 1434491073 +3824844150 1498644679 +3518233941 4174850208 3778843873 2905157729 3580052892 +2516433072 2224038639 +584051888 1834057715 584051872 +3552792699 3346503778 +3706703069 2860482530 +3916637262 3460441807 +1146769401 2469127422 +305257949 308074417 +1301870828 3573301350 +3639924988 2238813361 +3313152619 1260838516 3257938063 +807007583 1634993718 807007567 +340008408 383333747 +3412681952 384421043 +3324486122 3663979341 +4170828445 4145673524 +1388740383 1836719582 +1097896214 439641521 +2339674626 2324590901 +1675606943 2724966986 +4293293764 4293293780 +301300624 3284035467 +712909710 1922168985 +349577477 1435332823 +1512724835 1403696842 2445139024 +836838543 1055005914 +984523325 3711334340 +2358130144 482402491 +350550947 3726436486 +1970933157 3990500061 2485353146 +3511809860 3355983872 +241992696 2899558267 +1371936918 1356379175 +103240891 3002655592 +497873997 71603506 +1232839247 4238377560 +2794660609 3758742054 +1376264143 209891633 +813540161 2529689430 +1335945675 1509995828 626002589 +1756891706 2405992645 +301152361 2866924888 +2931636224 333391877 +4025264516 898554591 +3595331218 3376971190 +843525059 1361122195 +3209594365 3209594349 +3917582067 2314471578 +3412899516 1971641192 +1633788921 1169498344 +3104349427 999232154 +2642040211 596258059 +3271689264 523411357 +2027955128 14170811 +792348843 62940450 +1064949529 97360968 +1574410147 2475427927 +3249299512 2868784851 +385529032 777252336 +2801742288 3015404131 +2173541960 972041025 +781776907 1708030274 +1846179522 3626590628 +2232778266 2232778250 +728486416 1790684981 +510175865 2820512328 +630312642 3867704181 +3686903417 1793435752 +501823423 3575824830 +4053751580 3776320515 +13517901 2444592434 +1004078125 1671533266 +2098052283 2543852132 +4027115595 688238082 2817591662 3463567417 1920718005 +3873014543 3873014559 +3113533687 3555777274 472630480 686216035 472630470 +1938108086 2426964103 +931271599 3892495313 +3417529340 458979244 +2296746929 2296746913 +1631646611 2889838714 +1381585493 1075790359 +160332647 437108295 +2313131958 3237729169 +1951177524 550136735 +3687078978 956646986 941439971 +133102853 3634635069 2184728282 +3183122174 2864427465 +222163348 1820543993 +926663104 510594116 +2616045581 2217485412 +2252543896 4087227473 3472041253 3989010732 3524043887 +1584587525 4233721661 +1397424641 3763833895 +484720421 2689558316 +3098254854 3156853623 +1144290358 2493483271 +2253171112 313463677 +1500087814 4063422275 +117680497 2076425446 +895360198 4154629978 +3642919702 3642919686 +3921959448 3181931428 404345805 +4142436798 583083658 +340626795 1158282588 +784640418 1204078857 +39299188 1109613256 603860633 +209605257 870051256 +1989258760 1989258776 +2937005240 1289145773 +3989583206 2246335130 +3833597640 2107065547 +922875075 1528057578 +1793419797 1545994012 +2768416051 2768416035 +3018724034 3018724050 +2861700870 1671756829 +707647422 904573602 +3450130957 3346442852 +3543304105 562794254 +1941079860 1443550937 +3066248526 56197593 +3449122188 775648097 3565471229 2720046227 3176555477 +546787649 4100086854 +4270899804 434239175 +4076992325 593523267 +246617628 1072418311 +404505457 2065835766 +3877691829 2378387452 +1432592142 3603230873 +333721860 1413032287 +1227093738 2661601790 +4116112436 1808350681 +1986925827 1917522876 +3869474465 3026212704 +1639179964 2318678513 +324774855 1078946368 +3264067378 751956685 +1531997282 563781187 +665842655 505496732 +1022884176 103115196 +1387772806 3771061282 +2114610205 3073563138 +249257316 1621989874 +719289210 4157563165 +1512187015 1790935190 +2244495539 2016486432 +3591297743 1521136536 4045064897 368888887 921116155 3463022581 833095080 2970851606 +2126135161 1485956156 +2176285731 3534789894 +167668936 2206547668 +3802806349 4030710194 +1616085896 729288459 +643611904 1830522075 +2177869441 3672317215 +3126621203 3676222874 +2886590199 2430607714 +1107179137 1680854272 +3364929962 508272395 +1746277082 1746277066 +938902765 101925138 +517424866 2199356610 295365962 1391415002 1994474826 +3044667728 1403265468 4277592309 +1230600558 3856279609 4235015115 3185647922 +50178908 290767313 +346688609 3903945888 +2121327055 3669194958 +1610293971 2805979968 +1806770609 1925959109 +2605375203 1507647306 +3885360441 3388463272 +1630588123 3671227602 +2874390273 3049854592 +976796464 3612257411 +192251593 3540201080 +1953228332 1910200129 2102025024 +932024323 932024339 +1032325463 3481278325 149766850 874951664 +2682970948 2780803588 1506396072 +4278935834 847597878 +3949671402 634578588 +3156081865 3962892408 +4044821934 1529785533 +899170664 3333355179 +1179062700 1306579393 +312295897 646883464 +3736542230 497617142 +831440763 1692583877 +4026032072 2071869596 +2348796623 2326585341 +296946578 1825420840 +1585124495 735886141 +2352657980 2440267641 +1506011821 4234833490 +563442032 1312920387 +1733160844 732961121 +2379475450 2379475434 +3015145714 214433134 +3656035412 27642292 +1147490255 2933522971 +46475319 2472431248 +3057642630 1822512887 +2106338197 950573962 +1542145267 2791148186 +3841808301 668009796 +1669596888 2161559067 +3020135908 3020135924 +336908553 2781155630 +482864005 3552035404 +55245941 1082492755 +579956289 3954203489 +910604185 108493391 +1670423233 4028264564 +3629062391 1095035746 +706511538 811312038 +1985178140 1772684648 +2050170192 2927043811 +1599506794 600759237 +2862951109 1728205836 +1900391195 1806457732 +3921977965 1837871492 +429596030 3442437449 +1556769102 3834388138 +4235328339 3127813050 +1620408446 2303503967 +3841261757 268855305 635003991 242464610 441269897 126830557 125322635 3229686899 2862776469 +3493320561 954738426 2054326430 +4148044899 4148044915 +4203699436 1192395167 +3072967385 3316537790 +1125568872 82552509 +1843177410 3025933923 +4263028879 2123317466 +903386928 4092985475 +2981824697 2188294974 +1073163176 1511635307 +4032868901 2369286202 +709603420 4045840593 +1203096125 1192667629 2842361140 +1319056314 510056085 +4180059866 239203216 +1985378480 1164600047 +3258511226 95755673 +3681767905 1468654902 68408326 4148204231 68408337 +2583297489 898273286 +1206577876 2309430812 +3399694415 1307681870 +401900860 401900844 +633252439 3257280240 +3969648808 564240491 +879837320 2171324012 +2705318068 2341387088 +2815774852 3100491721 +3675138366 357231775 +476223732 2738276367 +1654416261 3241192026 +700517833 2213065582 +4153338719 352093854 +469692886 3897996273 +4106147073 650763302 +1887416683 1187170200 +2381148280 3838315757 +3963881406 1428980026 +409589457 2354146076 +1052062454 25635543 +187397454 3461763289 +3646254588 527185379 +452355011 606060492 +32992486 4134616282 1294166748 1953344135 1700592850 3930659203 195258498 1398038232 4035660518 938767810 1009327091 +375099649 858080384 +3693856852 3974913081 +2294667148 3681702241 +2532622956 256774145 +864684171 2907402964 +808735180 2925315105 +142465679 3978235662 +3239003977 2882645877 +355649246 1022300009 +3990182107 2707539166 +399574228 3752853055 +1185082870 679254599 +4115287992 4125647879 +3743827908 1768870575 +1327000525 1349628850 +1111965565 3542675906 +1010390065 4144293569 +3237594172 2607681511 +3535639985 1903338918 +1267007076 1180465023 +2449004821 3753753610 +3358459468 1819535777 +1954762307 4004318256 +124378823 1923724096 +835652252 1211356816 +2183319121 2621128182 +56243221 4292106544 +3545576816 522395477 +704222719 704222703 +1428466123 3716835064 +3924753978 349288854 1839326485 2564522922 1839326467 +1833709110 3266432883 +746479339 4126108642 +1766427520 3928793784 +751483743 3794073224 +1859984273 4083464535 +3182748790 1238881354 +1286659227 61045645 +2938936794 2973408693 +2513521614 1637108558 2793035097 +4283490869 559159676 +1972453957 1487622810 +709560678 4196387713 +1814602548 3050943368 2012801753 +45558930 45558914 +3704129478 1437449377 +1759854408 1759682123 +647376419 3781861660 +2113675326 2447819167 +2841259233 2013511005 +128223686 695223889 +2595458797 1974075154 +273350087 3645124465 +33843283 2146450106 +440754632 1335784181 1265563580 +535003117 539124228 +2304084336 3413426319 +1891466198 1347023335 +2457211078 3303996690 3040490215 +3956886054 1829747137 +3850926941 4006200233 +3197305740 2372834657 +1183356070 2936144215 +1263769915 3802891474 +4230937619 284611052 +2962128198 3048261009 640961463 +1176580648 1174347158 +3859285486 211899823 +2953635365 1827583241 3241562287 2279920084 +336475471 400126096 3781028689 +2179239242 2719564359 +3121277337 2016263112 +304371700 1086526897 +2998147288 696458267 +39955390 375653577 2109824031 +3380156285 3380156269 +2002772263 317681760 +2258713103 4274939278 +3287532393 2850895064 +1816497004 3715791617 +3159148816 3159148800 +4159113834 4159113850 +2847762895 70095054 +474949202 3801699091 +2247115799 4030410790 +1450458963 4164274171 +101581563 2198778162 +2285725353 2927948799 +3760832751 3760832767 +2887813437 642348105 976837246 +413046149 1185243212 +3324027338 3324027354 +2114031225 3581102184 +2948196077 2787551150 +3655447748 3259994249 +52987225 1372187422 +3236546062 3812362875 +116397601 32000602 +2092051482 1061975522 +97816258 951452301 +478656287 1680660939 145049032 +1864541349 2559127482 +1091143504 2986345187 +2943747802 2640359093 +1404775945 3529679821 +1033661727 1033661711 +2695193091 882350141 +438763307 3002018638 +2003929135 349514544 +2697217319 1006165110 +1128542076 3650129201 +3675805780 1035800455 +2763511306 1350273394 +2689668915 699848374 +3588182589 3951982100 +1408016258 2900633016 +2991561199 2991561215 +540927656 1769085565 +1257384052 2860636872 1865789081 +3247151150 546333554 +172056544 1749099991 82439596 +2612860168 849877899 +2371445700 1203244425 +3196441995 3196442011 +243092221 3426552898 +693063887 314765407 +3363635986 2932593989 +386767324 1630636804 +1221119110 437909217 +592680588 1337873227 +4260380939 3804699529 3426116692 +1923537310 2290316690 +673180764 576668121 +1992199003 1224040516 +1853852603 1853852587 +293996943 4180280999 +733421432 1229359597 +3900516394 654719501 +3015420908 315489611 +2497659506 3810562074 3447036275 +696389378 696389394 +881077985 1330673926 +4234384431 450112440 +2680062627 468166300 +2198790088 1280254179 +3213884628 1672151471 +610205380 1122492857 201872936 +74443700 74443684 +21699135 1211781416 +35349359 3223160760 +1114451279 1114451295 +1469482728 3388366653 +1767446287 3248936742 +760428905 1676554922 +193554531 2354009034 +3337633279 724670590 +194576004 1024673657 +50902948 4059596583 +3685435809 1873078390 +239931899 62524317 +1040092890 1908072765 +2390353754 2952053539 +4197330671 3316900398 +2773446422 1376509873 +2074835660 2062700343 +2796690826 1388369414 +3570061893 1078526618 +4010522244 3547353545 +2648442280 693954411 +3846176238 3518807481 +4116111520 4287349065 +4061464692 2526001887 +555314090 3239061523 +3802709980 3802709964 +566441818 2837877538 2152735403 +463373750 463373734 2978910165 +2517580296 1794544192 +1792818093 3785369281 3028353529 4080689294 2806714233 +1617562061 3926093902 2428743474 2481810866 3693774203 +2885160951 2236103267 2927698384 +2197925209 1169189320 +521320695 3062562863 +2776367015 691237856 +882231866 882231850 +1371020657 366368998 3742627347 1181610496 +2191097910 3450131729 +3915740044 4139050359 +3648212693 629479772 +2211403117 1137796097 +4079079517 1071956034 +238237587 1132585763 +3279601746 3986937518 +3102934509 328356868 +2111623433 731713848 +1182949422 758999151 +575680205 3510217906 +3645055174 3645055190 +1499648376 781172717 +3286049101 1663783602 +3745013283 2105429329 +1558651645 3664763151 276030452 2391635595 +1612952607 2988685798 +3454554372 683116895 +1238770830 3390802822 +76847650 1475257219 +2515721749 288850633 +4033219432 3634623677 +442611553 993686929 +2731032619 3460051797 +817874840 1925486628 +84966739 1059256791 +3398363019 3495436367 +3367376003 892037843 +1907648550 620753879 +3244910473 3081029102 +2072597666 3488409021 +987105076 987105060 +515343852 286644197 +3822860410 766306333 +3792162349 2999908997 +1228430624 1673173363 +1727275961 1889568687 +3972224128 3764564059 +3869847792 3275438525 1146423286 825002258 +2246004387 1636354716 +931713587 2674058821 +1580663684 3566897375 +1100954034 2821814605 4289188645 +4098920522 4098920538 +275169109 3372020730 +3254111606 1982927719 +3102276432 1724096245 +4092490790 1098106737 +2712272084 1385759151 +122184625 649672285 +2834984596 2520519417 +1700188024 4289239547 +955538526 2180691582 112027647 +603892444 2246506567 +2044943133 4259868340 +1157105111 1769025904 1769025894 1157105095 +3867021643 594884884 +2832341583 1213491340 +1067765719 2782360185 +544816327 3156252225 +1614047188 2145997555 +3160587007 2389467006 2627350698 2628827201 +1120252458 928125573 +2445265104 2751235371 3884943656 2868678701 1089019747 +1791059565 2071215492 +884901088 3890949285 +992292481 2626172182 +700554510 252473618 +3778044057 405278942 +3966713960 2602722219 +2629249301 3377835036 +4038307385 1603956472 +3688982725 2716585121 +3597532008 3361805904 +3253664377 3291761768 +1960298470 3585060609 +1492671575 2005749187 +992376406 1289194785 +1681514411 1914378804 +763478113 445209917 +2570338253 2775569714 +3049290752 1141564364 +1473577000 1473577016 +2776898868 814351955 +1122834300 3611031591 +311693133 3047092388 +186835507 3135903322 +2091519569 3836483479 +928323922 1828117523 +1907860819 1461273018 +3143398844 2928498417 +2172517863 4027006677 +367277115 2973645042 +4053862809 3175317583 +3421618614 3281252753 +157335306 3444358317 +44755923 3106098240 +267072591 1581471822 +1589741442 2896712117 +3596320373 2643005094 +446518711 2360202742 446518695 +939278096 1677262140 4168011370 3355301459 3705464623 883567191 2683054076 361390460 +1733732298 2003444461 +1471229134 1503761497 +3609545679 1359656460 +466437100 3328659200 3328659201 2955013249 +2564979055 461711800 +2520517408 2693104492 +780465562 3578700157 +2505299304 1390813076 +3781410878 3036900681 +1650184586 1619713069 +2641219351 3940352304 +3116439235 1469139120 663322006 771151100 +3130100942 2506683470 2166401103 +938581961 617760069 +3528253636 3540374665 +1883755211 1505756257 +67785778 67785762 +410592847 3585560152 +2392550588 984361959 +648348350 2479051017 +3109843598 1518884239 +1173685730 185669885 587726126 45630147 +2812362561 2812362577 +856836197 3402102522 +4213119371 4142662667 +1737237610 3502452864 1111853652 4050414282 1202287873 +275262028 536516023 +2147402242 3910737909 +2840864797 2893751714 +347693412 64245865 +2656003096 1325044187 +3110231109 667718114 27111544 2672813431 393507924 3219607317 1051938866 +3349691898 2793310915 +3076284825 3080255080 +2965126895 2965126911 +2192116385 2192116401 +1602527040 2647044563 +4264070676 769108345 +3703421890 1104184510 +842139475 2841788902 +203152040 686505488 +638501962 859766893 +3811423093 1139794423 +4146913113 3360018950 +143514163 2857270860 +2227725399 2734642119 +171724962 2607694269 +1956402122 1545070317 +665457277 665457261 +1489771462 1367328775 +2530482256 3219277301 +1366591350 2370165138 +826694524 3849104388 +62503597 2321604164 +804386167 4041566790 +119263029 119263013 +4261700111 4024851854 +2346792718 4279908622 +1362458082 3106443971 +2169511832 690076749 +3317095220 553519518 +1599585265 728691862 +1466426855 2046520519 2140072630 +678198241 2210857760 +795099888 2329239491 +1369064515 3101259132 +524569570 2146488042 444822723 +396772083 396772067 +1995247045 3891531648 +768758272 571938309 +745499702 694638855 +1831395238 2102923863 +2506835063 2933704518 +1744147344 3632432400 976223119 +842339295 3901638664 +3243584975 3169436006 1559476154 +2483302989 2202749874 +1700781164 293403892 +1447701826 415579882 +2325509734 2588828289 +2915158750 2915158734 +2325491796 515888575 +1840285319 1840285335 +2401279971 2401279987 +3192275513 3248111550 +3297134542 761465177 +732192286 1887497790 +943981584 3303792907 +1600435252 1602727385 +1123831904 2383046983 245378361 1921879000 1591708309 +1513361580 2885041879 +4131221334 4131221318 +1853467319 1853467303 +287438213 3656977853 2104852570 +2005008769 2728943126 +406624103 2388809526 +4253267548 3781145246 332687769 +1766663941 3379850458 3379850444 +1654405287 459328179 +3387588699 403703839 +1866883546 2178206070 +1952485381 3949294211 +2826661696 2052071891 +1739017918 1676023288 +691908603 3877374002 +4004094352 1158239669 1158239651 +1021000102 2276442789 +1565312514 3789272355 +3764108411 2875831716 +594246521 1426714972 +1544077243 1709944292 +2875315477 3758256156 +2844715521 3926853803 +991046694 910559786 +646033288 2581150640 +711574895 864144824 +1121990413 2672606834 +879884213 1147728380 +1379215007 3126927303 +729332793 233663553 +216424671 4016439272 +1077303183 539101147 +792828398 840930937 +4141392002 260559109 +1889458476 1980751937 +184857895 2406040966 +3529025919 3596132984 +2421390054 426407959 +2872347772 4290324273 +867082945 485111232 +1785024365 3074524206 +3927837168 2230042016 +316007524 179734911 +355042406 4068466703 +2284171829 919843596 1681377892 +4281893845 4281893829 1034652781 +444337642 2605311821 +3928687337 3928687353 +339683650 1908177486 +600120748 4129113254 370348353 +1183643302 3014151655 +3377940806 759461858 +3882689790 4066459657 +1450311535 3561990390 +3186904721 1194554440 +493300313 95770767 +256159968 3911348389 2788643756 2721533311 +1088659430 3204111971 +3509202631 230368691 +4287055265 3119271366 +1375476758 593089163 +2940347475 1565848065 +982400049 1592312102 +3896499452 1896370024 +1116255611 2725026860 +4201119266 2861617999 +410406418 3347175684 +265315631 2349850235 336546040 +2731686077 233787796 +2944768753 1079175526 +1305190980 3314753310 +3826008165 3826008181 +3601886997 1445837271 +1840910258 1843836218 +4073821154 691230461 +1912682059 3270014996 +2719587437 2605793156 +2042208876 188395521 +3222475478 872851175 3514352626 +4098107841 4039617179 155560338 +45250053 3430597162 +1542346483 2583240247 +2310514869 735000570 +1314452379 4043799812 +4060455654 1263005466 +3021992989 2873969076 +3664784950 345554705 +1495502642 1495502626 +2500243372 1434887399 +3496968126 3642226889 3716552713 2083059463 3281971874 3265194268 +1227914233 163324658 +507101502 3538629769 +3456452577 4247632401 +350499484 2134616967 +768997344 131413420 +720403171 2073129802 +2416458242 3154688523 +1995193454 2749571385 +3391454496 2252446189 +105035764 3473380623 +168502175 2194800865 +3637365222 838128897 +3975667831 2167823184 +653106102 4262207377 +3938221434 666456673 +1304794619 2155488958 +3878453491 496678519 +722378007 3741403952 +3371884500 1691076530 +664618385 1187686176 755959639 +2314226272 2235897125 +245783182 394188815 2648739215 +598566502 985113521 +542144904 1722765579 +1484567122 1170485997 +1581755468 1897520736 3067362209 +1566364431 2147739687 +358909211 646713343 +933750780 491527612 3085204986 +2755436094 3049421641 +1321302725 3026664246 +3273790915 4054335996 +2811368073 1408445880 +2340471514 1974648125 1120665226 +3085851471 3677994328 +1200881771 419211380 +2079035545 2899615944 2899615966 +3052099251 121496118 +2816391572 3617465327 +2768834997 2185682940 +1545161089 2093921792 +2198083971 3262392636 +4038091091 950613420 +3648864292 305512909 +503731821 2969177490 +2792237149 3693402196 +3048869721 2354231849 1827023134 +123254265 2936885704 +3500388209 3803000560 +3446595763 1878359095 +1357219257 307331624 +2771945672 1121100144 +1186150062 4196340729 +1771701200 225706083 +1473218842 1437914082 +916893381 3445956620 +2970472756 2344980895 +1768140342 501956369 +1742546258 3542204421 +1365748849 2536797679 +3326435262 1519442142 +3953490320 2788103740 +159155864 1395923214 +630917088 319645107 +2174584736 2868674803 +1794847749 517348657 2320371212 +4227964618 2532030046 703747957 3187626110 +2334002402 1592920216 +160486932 587268473 +3866614055 4121614454 +4031381025 1702563296 3065444944 +2319344325 2646769367 2167538102 1357283938 1698003980 +3656981080 1667874727 +3982432579 4021601404 +1498077101 2731859986 +812121116 812121100 +2629819879 3342869703 +623105347 3127425148 +2713346518 3512577492 +3890608871 1498801202 1147542406 3605020106 140893535 +3769115831 3769115815 +3580445928 2916340919 +3618204010 3920687565 +573372679 3553363456 +3272543158 3333386119 +3504957840 3034890089 +3682758396 2320807601 +3177794036 549415695 +4064926363 1470856578 +3750534169 56212296 +1956210023 4245398884 +3728362525 4073050548 +295642475 1257335262 +998887627 2230562690 +617943367 1114256064 +2070931571 3291147546 +2803475759 26943098 +983239731 2597213088 +347175704 2720291376 +3188682767 2355660094 +2400211885 3320626180 +4284316920 1787992963 +62503591 2220938486 +3189884155 1244206898 +1237470585 2514482558 +1409680593 1734711414 +2964002397 2052338786 +2941304917 1360971210 3916138995 2104581370 2104581357 +1430562229 4027636714 +1596417863 302486742 +2528585880 2528585864 +1411784566 3993208529 +4027084445 2808493736 +3774429332 3229196404 +2816034646 2433436775 +545943155 1062214036 +2796465993 2919100391 +630480168 343467315 4226184100 1351525867 801639231 +2509397213 560925483 +3016243499 62127019 +956265603 2085829744 +3343259802 937105771 3709550094 +1481179393 1481179409 +3095681881 3512454408 +3686108157 1126626530 +4058432906 752793263 903791845 480644614 1226227335 +3169157513 904884206 +3685389566 3414723529 +1469050603 1153106200 +3610134076 4191719527 +284702146 284702162 +2801396095 1516933886 +2087459955 3687611872 +3543271895 1894020931 +13709365 1535504531 3616517687 +1773943902 2680040291 +1076211688 3813927485 +3329009879 2704386245 +82057577 471072856 +2561052132 842096127 +4195932659 2820610437 +3839517746 1341764029 +3450764362 330147949 +3567832638 2097292557 +1746318450 1832333670 +3251186479 1051654894 +870936667 326885202 +1047501260 1910198488 +85474981 2601929692 +2635266299 2925904318 +656048114 2159503859 +997936655 2988171672 +3619263353 304293758 190262089 1847297263 +3596782063 552546799 593458788 3965051893 2637526575 1799330073 3588442217 512280929 885223912 3983490619 1896196267 1548969604 3343875014 4283812213 1014890141 +2313446270 2424872777 +498269210 2291881575 +831338168 2801661836 1634675013 +1060301460 4191468009 +4148402402 4239463107 +1459985984 1306015715 1459986000 1037573829 +1258078483 518254842 +2813941766 3797883204 +2520145571 1890351254 +2384566099 2515055911 2206981351 +3011681081 3482999486 +1889214822 2304202406 +1436649161 923438 +2572280816 1273615061 +2761642451 2170102336 +3346222535 3246616640 +1350748648 1655531540 +1488013243 1511254898 +3967220179 3171254829 +4076393450 1739954523 +4035062463 4035062447 +1878189762 2665786951 +4032233312 3102999603 +4135522558 134725577 +2123274170 4101560779 +1451047806 2770642761 2928281694 1471380127 +3756369387 1132356524 +3315736103 3532566477 +3726106112 2677176837 +506224687 2933615086 +3210896807 516445446 +1670470770 802457445 +1039170909 3340481858 +700741028 1682256191 +439842562 1719320330 1196447779 +748700900 2294163277 +631279393 3688187015 +3345720325 408592426 +1410772988 304365991 +3481126864 4052106792 +281017122 1538273341 +3551526018 3221913763 3070238222 4085809309 +1632157971 948433132 +2091468019 1680805702 +407569366 1408621136 1695015733 +1078203540 3806520777 +911410387 1471191084 +1231341696 1231341712 +1561124927 3125084968 +139624196 4136883307 +2330339440 2330339424 +2063676754 2063676738 +2248369198 626439289 +2069094457 1577712062 +2698643824 2805783363 +2247461627 1357358015 +3498077195 3139358861 +3266174042 3266174026 +3458821404 166922504 +4057852997 89845900 +2450786628 965383711 +32710454 1203380753 +693141581 3245954959 +720637928 3070138320 +2230683139 2230683155 +1307739718 987161186 +3681245143 1679389513 +2459127632 233167605 3587682236 +2831493133 1921196603 +2050597005 4122459634 +2902735144 1632143700 2242247165 +3086217057 2214951331 4209208720 +2194574509 3776719704 +1001849929 1243332334 +3950011713 3807339840 +522478727 2370453632 +2497027721 3578302894 +3952761646 3952761662 +1985994637 3857509106 +1123831927 663686727 3308050706 997077566 374932800 3930015512 1009116310 1795396042 3671028671 +2895371855 733429986 +3930894659 1872153332 +2487768774 1406681530 +3469163549 4058821183 +761050938 4105416361 3109460447 3152844985 3664090862 3126238053 3143016428 3152844974 +812584972 1255555831 +2784443116 808567191 +1209922570 3708401979 4050127422 +3160563962 3421873627 +1144898112 2906180293 +1637520778 1489229884 +3538400314 1019262813 +3722746892 4063867959 +2857011526 1498814782 3767123081 +931597365 2660775804 +1140327496 1198439773 1198439755 +3579543030 3574024785 +934592538 934592522 +109356262 684693022 +875968251 744000818 +2146302805 3097667292 +57033963 1157529076 +3784431845 2969112604 +438710156 656761133 +3833039080 2418836779 +2308980551 3564094035 +2558433729 269500775 +463156178 2456691504 +106395399 45113344 +1524507103 3282121291 +1031302187 3611746382 +510255058 3602570362 +822259228 1127749127 +2655571168 1205924791 +2275464434 3646334618 +1759778228 3540920911 +3617573774 4270682255 +3160746334 4047511295 +345012703 1047517704 +185741410 2215910957 3483511391 +1214692760 2445047387 +1211834066 2266072211 +2264996036 868077106 801673723 +2916607580 753075644 989672775 748350709 4223186148 +2689373618 1763544862 177186611 +3735006487 2354936614 +3270384744 453197460 3270384760 +2401223486 2525931615 +793940477 793940461 +1090088847 3618283032 +265081 3515568445 +2551532497 662681462 +1933297022 3340986174 +1442144500 1162321945 +917638711 2403076336 +745876596 2703654600 1886714521 3834622740 +1248798214 2258679780 +1090357503 2610584485 676337474 +511299977 4132475896 +3149219959 3149219943 +2219140439 2420017136 +2645186318 1093077766 +1630415474 3400950622 +2898359447 2341112240 +2522403105 2280447203 2304345424 +3694250140 1046400401 3225262928 +1471680148 1040470644 +4034374275 1918722663 +48710499 4111406300 +887089683 531991182 +2003131563 2677072180 +329134218 1226287090 +3780358099 1862568719 +2469180093 1818058644 +154817754 1624478525 +3812761205 907407932 +3666053491 1880186906 +2988156131 2988156147 +755175455 2704169692 +2355324504 1484397723 +4159418001 1304382349 +792391493 19184823 +785301240 2809569403 +3624792073 2066596472 +882046124 121130432 +4290268161 2010229542 +199365113 1636413899 +859104508 1758069987 +4181547562 2241130509 +2259433820 1739676177 +1689792518 2482215265 +3870777140 1722474201 +2201536938 2102371174 +3525684919 2287077904 +579178883 3678671146 +189199246 1320249497 +2484193089 1807857766 +3734610056 4091000349 +1738444437 3013244042 +1437195151 23800780 +922234235 1902987839 2970334098 61839524 1360374213 +3382206160 719143267 +3080414868 1730620375 +348887799 3011834566 +279022867 3857999341 +2532477627 1523606642 +3417100051 1270214307 +2308846093 2970143332 +2489734011 2377572415 +2834986376 2110783024 +443322986 48921805 +249708367 3129202791 +2783871964 1192307920 +113817852 3903108780 +1886602350 3803746775 +1415338546 4284611763 +2037724413 813853250 +1169748095 3311716365 1903501866 +1420155079 135545174 +311550074 2204209232 3610397093 +3213884613 1420487180 +4078414053 1828989172 2712001487 +2283812724 3199683471 +3565167126 3321396982 +2111319395 3947714386 +2048453128 1027107485 +2230205711 1376394894 +624349873 1531369316 +4070904563 3973895322 +625644724 1751652185 +2637720179 4073689882 +2119440496 1315076163 +456170902 1669862193 +2446268070 1426550246 +1834653146 4288276011 +334459371 1290818804 +2735493848 2221304324 +3656707939 477668665 +118844625 4156181776 +2187846658 1267461923 +3313640488 333376253 +3743614853 3374634572 +2527377064 2867528387 +1970186938 3593774485 +189841703 4146073718 +630307643 393604584 +2815661964 3189215585 +830257850 2707026626 +258013622 534188710 +1491890577 2369177414 +283106376 140226932 +3258937440 702408485 +3259011641 78000062 +482745259 3536247759 4141714996 +322955167 322955151 +3997738703 1575553292 +1189306783 921873736 +376731045 4266996396 376731061 +440311437 3717437426 +735681001 157919045 3572704748 2092756340 2717916044 1686860366 2569332528 991209670 3028807779 +4064714009 4064713993 +3202815937 2512858365 1638337373 +1065191124 1600475177 +3962224522 887377637 +2334233260 2443862925 1145150764 2544515913 1635936834 +1706530235 639470719 3674256740 +2943749985 3498400929 +2336512571 796863291 +2829679264 2889061228 583797221 +4054217837 2191239890 +1735412299 549778434 +529015028 2538332185 +337578197 3046775162 +2177116927 1188015998 +168327199 3317138354 +261050150 4106984039 +4239640276 2734817209 1428525096 +1320358303 2196028744 +3547342765 2257483099 +1395018647 2085158576 +45968314 170956253 +3341344242 3341344226 +284926400 284926416 +1199617979 1296095965 3061409829 +98146308 3719904495 +2627118500 623296809 +1928949815 900441744 +3224909717 763330442 +3207270551 1807724008 +1818595545 2095252887 +3739535309 2938537892 +3473897277 844674306 +3915741092 247158591 +1947763552 2557061691 +2264830587 4257257394 +3124514677 1323911047 344214225 +1143740095 2070565483 275238568 +3181131181 3181131197 +3583373339 4019115471 +487526773 2506744588 +1868715398 1868715414 +623770731 134056590 +376995340 1806593249 +988140562 75010297 +3051234476 1139736000 4172528321 +828872493 2028104594 +2400270259 3705079313 +2310690965 105899593 +4045186344 3088580075 +878216774 2908446775 +861269340 2165583376 861269324 +2220868586 1287743835 +3489332141 622480020 3489332157 2319164421 +2625413021 4113515572 +2467473386 1885230413 +265517497 2733153855 153556788 +1281498872 913752187 +1246912272 262907445 +725053596 4179341859 +2716487433 165067129 +1423467392 279224979 +3068406088 825031755 +3541263998 1472798110 +315220860 388981031 +1830632739 1600570896 +627119770 2680923235 +4210516457 2265224202 +223373209 2392004040 +1131617325 1530223314 +1423380361 165547423 +453745030 464349058 +1926269525 323601354 +336049958 3342188322 +1822409093 2222826586 +3265125517 2952044530 +2095275987 1827658042 +4018290947 218912700 +469014055 688414560 +1334258863 3771422584 +620280663 2324621808 +3111899327 3169426600 +1191398001 559488676 +3854047402 1255068557 +2807846454 2891691793 +1747773760 2167090116 +3518953546 2040585325 +2652559216 4153263325 +253824759 3356135110 +2803203045 1281941552 +2494505350 2648351697 +3637765413 2056370483 +998673098 1372856110 2380733935 +127245179 1461642181 +1224505064 3446615869 +3557803503 3285489464 +1802879419 1802879403 +459535875 559695530 +3332924178 3440637253 +3570534120 2545611594 +996362633 2446748924 +1451035110 215389441 +2321700742 1590675447 +1976104130 945051523 760827253 1973951568 +1538064841 3915483694 +4075162685 193192245 1953274592 510292256 616861536 2129108716 231550336 +20575567 20575583 +519712317 14076436 +1157388076 3712954123 +3791157666 1546091029 +3803523579 2701206341 +4056679680 2754338565 +3128448581 3496988314 +2650959553 2650959569 +3103006415 4148985816 +1994730358 2697161415 +2027760561 4113287078 +1113594539 675937076 2692117199 +4057063283 543343116 +2648936815 4231917998 +2229924261 2229924277 +3146987960 12836027 +1589721328 2683939144 1098754148 +3890904328 3890904344 +2314662715 1791026660 4054443519 +1570908776 3460874667 +303398437 2263469090 507008861 +3798893902 3790393773 +4227767742 655836873 +2653731891 862733402 +2719273498 1859395682 3656317525 +3428644664 1600264071 3998821691 +3613553444 2106088719 +4150337476 837091712 +3043566276 1484896905 +1046535992 1786733883 +3612688779 2251697602 +3622916259 1638775446 +1482792731 1018001298 +1277509008 2237594937 +3227674449 2812052980 3504708070 2357066171 +576187650 308943395 537339165 +841482919 2616995040 1845142707 +1409771354 2712122045 +253887182 2693425753 +3191832156 4076515857 +2417784048 977690187 +870552497 3741862583 +3524218788 1686357820 2004001639 +2346026259 874544364 +4060093400 3458979085 +194522051 376973793 794668422 +3993514195 3993514179 +2629613272 3141138035 +3594684365 4138823547 +2100370312 1876922399 +2763106967 3668937648 +1633335678 3218211145 +3002027392 3002027408 +2222619373 2043642642 +1012607172 3347131551 +1784141876 3765989512 +4226588792 779553043 +3256261729 59662982 2771314247 3935841440 +4229009854 2376625695 +3637776281 3637776265 +843128535 4085484656 +514209969 2274600349 +3039550568 3027415487 +1134337642 1485799169 +4022837541 2621615404 +3496633343 1277440406 +2595778464 51910344 +2882328445 4034345419 +2453108739 2749610650 +1463993174 3021570151 +632877176 959365711 +1072059916 1434708572 1804795447 +2683103744 1846729751 +3047510583 1330199822 +4205335802 2432550283 +4195478621 4195478605 +936729169 3766463940 +1626558880 1057586931 +1589683454 2929770527 +726920717 2314784114 +955711076 955711092 +890342402 2179947549 +926658332 250915089 +2329229417 4138192206 +141454034 399648901 +444432650 3180470957 +47095503 977534926 +3500221647 1017967064 +3770688859 2488449883 +546125156 3777266428 +2816562513 2562281094 +1715980616 2003047306 +2529457448 899889847 2237141324 +681122641 973471888 +4145662363 2560122642 +2273143839 1769026760 +2841401677 2500414117 3915420722 3915420708 +4217256625 1571224347 +578694538 3600920635 +2832357394 1366729022 +2043648507 3167708722 +848162678 191887057 +2082731365 3542007374 1071248975 +1388012808 1157630877 +2093406515 3403874347 +3786022332 3244934513 2795469548 +714610199 610977328 +481150649 449652152 +2782024214 538392753 +24780462 3759244029 +2885061042 2885061026 +4200066364 1416263015 +726015327 2120236190 +751782344 751782360 +2143892994 38278667 455626040 +232720917 678632634 +909527423 1313803310 2135465199 +1492657499 1772277330 +2237306997 1757037068 +3360977898 3555742997 1991856657 2554941019 2297774720 1911889500 2314552358 3702212554 179636805 3235826375 2660989941 1190295885 2893037496 437759891 2487830559 +1965581521 1965581505 +3655049425 2358272305 +3529154201 3181882056 +3029712602 565932349 +3329232558 275192825 +4303145 2422033287 +1134074434 1134074450 +2367624931 2507052496 +1543329990 843438010 2445528337 +797150095 1135411622 +24907669 3947661212 +2422969580 2951776279 +4053208971 4065796458 +719234933 1493854490 +1157965954 1760469383 1083855265 +1666489707 1666489723 +3568925640 1369513187 +3115437309 3115437293 +88705741 53393940 +1286612632 1363984731 +262849272 535044469 +1545548990 3273656095 +3435533747 248785114 +2488214027 2207422292 +501040924 1789034811 +1298089121 2500453585 1845037430 +2634515345 2364151073 +1646376183 1913643216 +3846877789 1368836194 +1120589044 3078197396 424492047 3986004831 +2254510725 266125132 +4265548582 1666694337 +1212153756 1212153740 +2144555858 2343315987 +2728377666 1131867875 +923386297 1566307880 +1005702405 1655029466 +746044314 613757788 +1855755375 3243031569 1968624093 +2491802949 331869068 +3322559286 2648052562 +4251820584 4251820600 +1476073001 2839798415 +4200918355 2145491386 +692107785 3958442201 +3015754266 309432043 +584394857 3257630302 +1075351644 1118519495 +4273401613 117068146 +983736940 3120934913 +1436047243 1238486996 +2470180773 954314339 +3889276694 84543399 +4038671720 1536928427 +749140194 752470978 +2050461019 3228796484 +3659386830 720249158 +1926771103 445651018 +2437290761 3094408223 +1910554331 533492420 +2486179853 3427403634 +3463597169 4034718243 +990448095 3459942920 +1576863898 4235832778 +1710257024 4186296979 +1518672631 1784659316 +4089840475 3850814238 +3637966546 2221891150 +1865866195 3471359063 +1143472368 940989064 +630823632 13546869 +3792730604 3375500134 +2000552572 3751155761 849209639 +2588518658 3002688531 +2753842606 340054062 +1161302609 1212470671 +3618960549 920461228 +1656516865 1873142934 +727241345 3184746774 3921794481 +2147582630 677423937 3995976931 +2145295219 2128909935 3866458741 +4019888939 2810541483 +3969416019 3339330476 +1454970199 553640078 +795364121 795364105 +1366215954 1131205459 +3747330431 476381950 +993157321 3756956511 +1219872484 3626186763 1248934210 +3030308061 587792036 3030308045 +3468617234 2290363987 +109360595 3164581778 +3320726405 454314586 +161676331 161676347 +1835321905 1722436400 +2635877902 1247890450 +3235089247 3235089231 +3708925667 3856852810 +701503869 1335369666 +4050870213 3718234906 +520037943 44640400 +2672364313 3640424542 +774631839 1500108892 +2630375862 2304349650 2238003601 +4144275653 3750892780 +3124147658 1025195358 +1039661770 1465895931 +80402419 4072386486 +3484069725 1186074484 +2524092749 4138309880 +252444861 1826957716 +4159171763 4112096730 +1024208013 424898533 +1964098868 2130276559 +3640550531 460864060 +2163875644 3634087916 +1355571864 3384751451 +3372489443 2631688669 1417040732 +132646770 3829643379 +2197547410 3297816787 +3929817271 1943658502 +1050136955 67028146 +4197222822 2452199654 +3406012967 3182969718 +2978003792 3181829877 +3855638767 3054016558 +4080970466 3450274243 +2863146988 2461456535 +1352970519 4198673942 +525799362 2129166798 +999981648 4263090859 +1402490636 204225948 3731597301 +2999807145 576851480 +1686899809 2843180192 +707372469 344972266 +2032385015 2022882528 +3856712125 4059922612 +973700176 2632882387 973700160 +1933831744 3018854085 +3201084768 3157585445 +3432642055 492719382 997406482 +2943620752 3284108469 +99953278 3903608488 +793587541 3414262492 +3531894790 2990980048 2223471377 +4162062642 3112860083 +1569653387 1654670709 +1701255400 1610075924 2303472957 +360678784 3561477654 +3305860011 2203365931 +858478168 3845713051 +4245896549 3277313398 +1341982889 2488574488 +583596733 2137175956 +1233997746 2071229733 +1465831157 1502441591 4218264716 3716395731 +3409460409 3409460393 +574742673 2125759568 +3160609822 2918755113 +3207419276 2153622391 +3664654128 2634957451 +3679293375 4195961278 +1876242466 781895043 +2923242172 104705511 +2229953775 1931165151 +4005686395 1983029567 +2219634371 136043754 +82772883 3387066880 +1870536387 1183476988 +1131011673 269787432 +347625183 2986547022 398448975 +1869387965 2932780981 +782436273 463805350 +1724728097 3989438599 +4229934899 4229934883 +333988432 2795529187 +2064528963 1532237761 2687906854 +3607091323 3607091307 +2213383914 2566388315 +2240015596 447608727 +3903112257 2086728278 +1192041616 1772353187 +2393580100 3680956703 +2985174019 484618428 +135293222 3621095134 +997018361 3928913832 +1106523565 2149936519 +4128527740 3724710449 +1674608470 2000188519 +3214403902 3659803785 +3414487383 3451979721 3369089101 3108498416 +4024422074 3827497079 +3062746316 1381642977 +1830237411 2659729738 +2814917913 1104689813 +3883591786 934208512 +2504710445 835969476 +1960663227 2973659506 +3678351928 3293204677 +3210816328 3641383029 +1507599211 3767255394 +2380910861 1947473778 +97427926 4199072743 +4118293109 3777680956 +2511226740 24013979 +82077708 3213871863 +1669256782 4162955069 +800632203 2864263618 +1697328631 972643280 +613617436 1488750033 +1288101687 3236802640 +4276383927 4276383911 +2673636573 36332119 +1654369471 4195414206 +3006112914 2732200403 +3642506354 2416683358 +1671975836 587522956 +1820871149 1073434425 +2602193033 3010250680 +2250487588 3291820793 1312378303 3442819343 2704240191 1875600548 +3247792199 86413248 +3612162030 3700362169 +329441972 2641027417 +3671199264 2561424485 +2401006379 2430846379 +1902786406 4030018945 +2157420538 834853601 +3338034129 1964477645 +3252630202 2011601686 3965508317 +2761327549 1291719330 +155095077 2994530860 +200692592 2662050765 +1306004579 2873769455 +3687298642 4257218046 +3374116979 2129940513 +215270922 1022607803 +1104384755 2467320972 +4214497282 1963877173 +1727029010 1042867718 +295268092 2580191399 +4155824384 3054772988 +1507355489 3501263264 +4207704284 2883732049 +3980280179 3959490586 +2464522434 24908131 +2974738779 2974738763 +2981483166 2821633705 2758529602 1597673129 +2442324512 1377128187 +3274585697 3771144356 +3924514976 1716993978 +3976221943 2724794146 +1510543229 3345594788 +1535003952 936608405 +359150121 3691443864 +1090459344 563145084 +2260696955 3410095167 2591403684 +3222031502 2306952537 +148493293 3299624239 +2766698913 989296758 +4038709211 3481417170 +2390138922 1618147194 +543630703 839071930 +1462250799 3581501824 +1074053459 444356026 +3301084633 1468863091 +1990252493 2352199602 +214403516 3659387640 +2722097574 278712385 +1622070761 473611726 +3135355613 2449672110 +371167486 3518054345 +3562127202 2662352707 +3438307174 74630551 +3169060551 3075446227 569813824 +997540870 1600488314 3062876753 2677675383 3062876742 +3712416037 4113014499 +422347596 3977425057 +3313787356 66314256 +116774985 4073071592 116775001 +2943565228 3791666881 1669375548 3731494337 2271398336 +991463545 2157893246 +71632918 3467360935 +2194090705 4122623108 +2693276958 181234217 +2932160099 2205457866 +4015585344 1732501310 3871943379 1944194456 3704361625 3871943364 4163363392 3721139263 +3922720323 1432398698 +913336847 3254187416 +1036465143 1036465127 +4131619977 2431429369 +1678540484 269574575 +2387392851 1439153594 +1649391076 2809877993 +160265013 1072628505 +103368757 3892095868 +1464524400 2796839497 +3899775946 3040673517 +3126246637 1719035717 1133209874 +1168126278 4206312098 +4218550695 4218550711 +2755364582 4202538677 +1817548923 1564799773 +1245483941 1000359268 1530834931 +2178237991 2310893430 +3472295630 1731971081 +2066479757 1485499890 +1170859750 3466942502 3268836375 +2015978451 4230489388 +4050332334 1168602425 +1601601054 1539872109 +3914752862 3257694850 +599089075 3917850330 +312327232 2387564741 +1662581104 603829980 1884334933 +2787164403 2022686362 +182992308 3751354969 +3290831389 3101561588 +904183056 4228592508 3876954165 +183052446 3406491839 +4278034320 405871083 +3588616939 2220365678 298196734 +2671125004 579185184 2922879201 +235190766 3446126190 4285575599 +3713392195 2972509052 +2128997311 2196905384 +2109455882 4169935277 +1292520390 221595809 +3735281842 771405875 +2949301357 691222418 +3440646542 4253560601 +471472620 803673367 +2102214615 4213043018 +1943980920 3753528813 +1428815825 3793597958 +1875501764 3201301129 +1664048615 2367973881 +2964678254 320042735 +2293329421 2337900786 632136763 +3532030620 96443281 +673621063 2947624772 +2919847800 1890890235 +1575401237 1575401221 +901709329 2576112125 +3553413054 694054943 +3705806811 2465736132 547582856 +847051388 4139667761 +1928186199 678346698 +1290582228 1138020927 +2567173634 3812377891 +1959855371 4027248706 +3821824982 1892532721 +462774390 66083937 +2521368822 499385800 +3224237883 2121592794 +3109410371 3896283047 2921418854 2836545045 482781347 +1706232009 3788952690 +658000538 1469935741 +3758080718 1839180377 +4034773518 2750970905 +4174261237 2710516412 +1413508610 2741841205 +863581670 3989821726 +2966697882 1834461366 +1086743239 3209527126 +1519075739 144165704 +1042818257 1042818241 +4127221503 1101144936 +1627710141 2008084372 +3102655698 4057978515 +3512506908 2965805575 +1967558656 2652155923 +4141672332 700481889 +3328714299 342216959 2431921892 +1262685005 3347761700 +398711737 575857726 +2900939698 3833938227 +1382069159 2853030201 +1599744900 2666692831 +1754865801 624976815 +851117943 3304543038 +1375329910 2186884046 +2578507703 2826749200 +3838086118 1008808474 +3810762704 890944532 1214624829 +2405150381 1515452996 +3180409020 1211281680 +2175387667 826668524 +1314365647 3677459212 +544813797 63643258 +3234613679 4215643448 +3836943951 461835419 1425585752 +188801835 3637428875 +2327587678 3839234300 +2609987267 2030153904 +3579369172 4269352587 +2784438289 1427378896 +3917508357 2443174698 +2780128016 215265236 +1391821892 625189679 +233371492 3467105392 +2717899903 3735001298 +657503320 657503304 162260635 +602283402 1095328030 +3525542834 2145931571 +1539407329 1385769270 +248017521 248017505 +369215529 2305861528 4099396699 3452835982 +2802901638 2241108193 +2329238151 350061206 +4221989836 4077406775 +603023338 1381834309 +3441718533 4116985548 +4276494100 3101756688 1528390040 2412365265 1172487474 3308925113 3027880827 867476266 4080618241 748677026 2192109017 372050834 3924415228 3065664125 4244833010 1958569263 3206807447 3633752022 455701994 3523671188 2354418569 224086962 1533162606 2741014441 1524212265 223786067 3361171135 1791976379 655575658 2585830455 3868414639 389690668 1275488830 2387079929 3166583436 93518463 +575382034 157681837 +3035588322 303539426 +541375663 204818535 +3228796484 970743049 +471609856 1617201612 1617201627 1080210949 +2202323320 3654846472 +3818901004 1620139255 +3139405983 3139405967 +3380647518 170029649 +1980063151 2037545582 +1796470089 832989625 +1257610861 991425304 +378419489 2732846838 +2586826680 1901106861 +2692954722 278194261 +2694684052 1813975023 +1497123027 991195456 +3521857048 1444360551 +2979800608 3100640371 +4057840331 2951814441 +3586213269 1805157421 +3560308 3380961177 +4215343523 4029060125 +1807603484 1807603468 +3773159962 1512803914 1433064419 +1011554065 4214575046 +442240414 2321554242 +3693553747 3978731949 +953257429 3805822579 +2301122353 461455910 +871485242 4289280093 +855047233 1023833446 +790024425 790024441 +4112978960 3115770475 +1266271070 2125044354 +1540888674 4147012163 +353347896 1604805421 +3697872116 3697872100 +2194909447 4197651968 +4008630751 1670669687 +1039705124 1526185999 +852387110 552155841 3404295593 2905058153 376938776 343079145 552155870 1407196418 +2371084716 249496051 +3204670472 622417072 +2842325466 2006882289 +825407887 579094491 +814896987 3512697938 +1576320986 1387142538 3466875766 +656663292 1390161073 3719824556 +949690427 712137470 +812035759 3982306513 +1486557160 1679428157 +3958288529 1865255456 +3952028434 3952028418 +3136303473 3105740006 +730286644 730286628 +2383007325 4134526050 +3777309671 3656738333 +3927415515 3963210807 1421768575 2831951567 1895654316 2027537629 2994523258 2837212286 770082684 2181660752 1608871063 3708186486 3830321241 1314359010 2793331353 1538531330 4202849686 27305167 2942505619 3627021023 840622698 234372536 3851382983 226366047 109831015 2367970422 2597990359 1093274065 2741228007 3486095080 3025577539 2707496047 2345986 2063966433 3495378663 1932535447 4024260588 2322168880 4261091721 852130813 4229949607 +3491299092 2874772591 +4216013751 1316722960 2613268885 2626810932 2011246057 2626810914 +37260739 3980859312 +630367099 2698468018 +3572319266 1401045379 +4219607485 2865661058 +465863193 3478703432 +1280550556 1685928273 2839491318 +422464984 2904235500 +3521072125 1602527060 +2614384406 2614384390 +3656406954 3210346637 +2847762900 153983161 +4212657064 4007287165 +2150330120 3428829597 +3477072096 563845285 +1176544397 4066576882 +4146821738 3187648133 2205267154 +2598379656 1456682507 1082611376 1158510339 +1527924386 2792105917 +3246047378 3246047362 +2639225481 754458040 +2188960183 3954735081 +3446356026 469611881 +1870417597 475563979 1034941314 +144666750 285087327 +919925389 3728331748 +4036178049 2664017738 +4072237338 870347773 +3475618488 2777238867 +264182813 3872997812 +584627662 2837853017 +1834267220 3085405108 +2459938814 3479309513 +272336364 2041827991 +2837970352 2427254044 4193541141 +1793282099 1993818202 +913629319 1090352256 +3529620236 1004106721 +3756681265 4137552951 +4149796417 2716196950 +1555565582 62585359 +2119836469 915284371 +2610274457 421121406 +2394591086 498059814 +863442304 2222381203 2222381189 +2209206910 907431049 +3995338133 2008336796 +1940202361 3857470027 1637169992 +3094458708 2935629615 +137554404 3425055231 +1975167900 3146823248 4040959633 +1837170952 1779736477 +1762290963 1852421370 +2408878866 417563973 +2812767779 2812767795 +712299074 2208410699 +730026063 3468127310 +1961136090 3721294891 +2367346332 1326226064 +175247624 4227257397 +274107081 3761552184 721598779 +3423562877 3108489428 +3361918026 3229900159 +1798995257 1798995241 +48355232 48355248 +2504720027 9503788 +389719479 3933546018 +946390806 2476565127 +689585301 3232039480 4129317979 28099295 2546341202 2641656941 1601129664 4172180549 2794051979 459550357 3906548223 15752606 1782575040 +1624258801 2003334263 +1376445812 1376445796 +3595696844 789434167 789434145 +1665072832 4230678611 +570406942 2744047423 +3299690819 1261946161 +1532642838 3843839153 +18172936 3162943645 +1233546060 2915427356 +3362586334 3362586318 +1727808885 320189859 1727808869 1518089997 1518090010 +2288722750 1120403821 +4000759450 4277013611 +1412764410 1412764394 +2243413193 1229637752 +1950036432 3793898536 +686436657 775068036 +65279939 3809568746 +2652973457 2014646931 +1629364585 738619223 +1799876523 2369669666 +3521937589 2313660639 +1889717010 1648733523 +4189437849 446091855 +365197487 2191390480 +2469866331 2941098268 +3345080244 2467506265 +3145581046 3790590401 486037073 3857700882 +556082304 3278419303 3404942060 +3238880454 3238880470 +340696307 3938521754 +246274889 1868677048 +551913663 2287355070 +3996911956 1552068399 +226972556 1986656183 +2313649158 761812657 2313649174 +742379920 2552994813 +1430826193 308808976 +3990711751 982765641 +840910089 4030311736 +2926230020 2516767839 +3323630054 926513958 +4211383295 658608766 +3254026207 853888008 +1880073522 4057081426 +3880789684 280599756 +3662375305 1783301939 3345903845 +2945740953 4289544414 +516476697 1691348117 +968639009 4028347783 73144822 +2962105451 1434317464 +2417020635 2775950020 +2774870008 813276292 +537808720 2068492203 +428886058 1747032589 +4208339533 2946106277 740595506 +4091090959 4091090975 +1813601621 3230384634 +807472603 2668154834 +442951974 3053520577 +3991710067 4270768154 +2641103337 2571091055 2641103353 +597397146 2816572523 +2115796747 2447113812 +584820898 2177529621 +3345177444 2903908175 +2528549512 3379905565 +750106540 235938760 +347705778 1377852211 +549518589 3904534487 +886550306 3710977066 +3820537491 249600364 +2201269667 788131722 +3841261758 3122032390 1443140129 1892988903 563533849 2965471723 605339910 +4269962665 406673663 +3762750176 4022961829 +1467812750 320743419 1467812766 +2499358095 272562289 +1981983135 3779809372 +972054415 3295047182 +1830088795 3682153279 +140360452 797796160 +1965198571 1348720098 +3643272352 2044297203 +3517241667 1233257578 +2856291741 2668359220 +816471689 624087470 +3852310504 3973572099 +537357827 537357843 +3320022730 3134655872 +529603296 2439859877 +1551983192 1551983176 +3224418235 1202797426 +2789601378 572090965 +1235452507 2917523547 +1489397014 146274785 +3461697879 1516458191 +818570996 3265270287 +2357400923 1080606627 +3388461864 690061627 3388461880 +1589137283 2670013226 +2960234690 2228451683 +3945088125 2829766868 +1861260558 1641138299 2998576399 +680646967 680646951 +754297670 2214482893 +4175474959 252646589 +972833375 4233593200 3905292113 1767445762 4148654802 1081193457 1537128590 +151401625 151401609 +2230436124 1687355143 +3236041519 3553173073 +686836166 1245881873 2717217466 943989409 +164232640 3065078780 +1068034521 266870920 +1363252444 1451859737 +1177039202 3771267959 +1820522895 281310079 348420571 1630460952 +3965410894 3965410910 +3279597398 270664817 +3161657092 2904597321 +2498588506 3798940617 +427542898 3987336986 +2068725567 2326345473 1529712680 2964975356 +3606611120 3381285899 +2748315380 3563176463 +1748202543 939517432 +3488254389 53921770 +2843268438 523753063 +398514617 2751039976 +3728685398 4109839392 +2329468249 1075918910 +3548114779 832343816 +3805266150 4077693463 +1878655347 706833142 +505913193 3696350271 +4223396660 2094219983 +909438415 909438431 +3755915595 1564023138 +2895613368 1788090555 +1396803057 882298497 19257958 +2770928675 2560012933 +2157595505 2157595489 +2709251775 527127117 +1063621347 2951101258 +1492657503 1839387785 +1751620220 3608686887 +2404096429 1090710350 +1270221622 1704175111 +1063473529 1063473513 +607276275 321858092 2858016259 2059811981 +511644326 3746417137 +2128740809 2261307246 +2451806273 1528127573 +3148034531 3148034547 +3809495609 1289695787 +1561495505 3467098341 +3751603422 3792232822 +4056830167 3308470403 114529859 +814847229 3066871665 +4231830376 4231830392 +3782094542 4011550287 +2863301513 2863301529 +1311364870 2527991121 +2508061230 2203113071 +3035506880 2464818757 2464818771 +3379816483 1148612380 +2169411875 3648876339 3850207751 +3173645885 102447618 +3856385369 2594965205 +2217207812 2499280601 +501110084 1224751625 +2750968414 2115766783 +1341229035 3651977752 +1428214334 1084946313 +1752239539 486052044 +520610713 4242884734 4041553301 +840166745 777954078 +2128517595 2320700026 3521900065 4194343719 574692023 3751218012 +1667960262 1342507526 1200008887 +4209383630 4002363965 3635911381 4198141376 1414409473 1812557208 +2382926160 3883712757 +4225247117 38159076 +570048769 2113164438 +2164836895 1071001310 2896856737 1177265372 +2916922512 1270003452 1114652341 +3982530211 3333258119 1376592540 +3953996266 3953496909 +1068782094 3484842002 +3653284391 1497215330 +2583002054 162846478 +1866021836 3810075169 +244344332 4182811895 +3691113953 940144928 239984508 +2223258649 3039468360 +797564651 3238652898 +634736803 4063341276 +1765891556 2514931199 +3142824168 2241184074 +689585285 2453181982 2021098177 2056150025 2680924786 898202288 1025423833 3394002377 2981899478 3433222071 2143243836 +354157267 648687237 1814697261 +3495139346 4120398645 3495139330 +3210896827 1728838193 4143044366 238301043 2276601869 1434555909 1116858046 +3354085351 2657235126 +1612089596 2642297511 +3364142149 3992215692 +1816687629 2198777970 +2271847285 1671727753 2649250396 +3685114117 3766758262 +3124335321 4184569359 +1862097354 1468815744 +1512322256 3070174051 +914270363 209914440 +2909833314 1780920917 +1206962063 83490779 3473548824 +4205074673 2599277687 2176320358 2595051905 2595051926 +149795823 2181859387 +3594757290 4135335821 +2526096189 1132925186 1132925204 +3303948823 437389872 +3116143585 1155320608 +248889640 2189365739 +3445383212 2249221440 +2734965605 1688714908 +3639751061 440667523 +3391073407 2933689342 +1063222294 3645920942 +280207629 2877770585 +129722450 2114271493 +4276136991 1521415368 +4236708267 3875259001 865351714 4236708283 +3205114126 2648148633 +4017380427 2466157505 +633600416 920107897 327284467 142501298 +1519474433 2479617686 +3329564144 1516118211 +272452565 1702781020 +1870699351 1870699335 +3182448235 126579316 +2646355935 775904264 +1303199618 3154886414 +1588498518 3960352981 +3595315564 2362603219 +1870308889 833097448 +3516458116 2008005599 +3060715569 261575051 +792872207 3470855003 +1321701321 437182431 +2657877408 67126003 +1730091863 1588022938 2150025608 1556791763 429632781 1901599693 4033706166 2559943278 2740022464 3972912356 +962158659 2326956394 +1139242051 677119356 +58572048 2398134307 +788695174 2264722145 2116414915 +3215588232 2855915730 +1374005861 1546716118 +110384430 2307004281 +3511803607 179584709 +234766172 1664990680 +4001419845 3117089434 +1751875692 354623383 +225914900 1184935801 +3794906154 1043465755 +2336389232 3444712974 1569245071 +1931491181 712680901 +2708752127 92576956 +3333386123 1361876930 +981497323 54108386 +4238609316 1299822506 2134597891 +3872510155 1881499118 +665640603 94297308 +654918757 2705660751 +2579645264 183561384 +518080142 715264409 +2979089665 2294036608 +918247104 3907620947 +2210044019 3518889242 +3368053153 2816886903 +3262310430 954427177 +2053016966 685296119 +3893197019 674578628 +2118212707 602173404 +108733417 879805170 +3456218572 4293837793 +291890538 905156562 +3715624697 2630693374 +3727615593 422334939 +427535154 1336836005 +3305954182 3401410042 +3360946876 4166772565 174549607 1303194332 +616840620 2364347841 +2985503921 731192759 +3352900616 455249200 +2872319809 3289199424 +1553178406 3798173889 +1378170210 3273769645 +4180425146 1394232469 +3914108326 3917675607 +629153264 2344092335 4263411256 +750366949 2764612615 +2029725283 3596447178 +765693984 1233640856 +1408520803 1159650918 +1319460308 2723329209 +1712280515 1830870012 +1411895894 3501202801 +3640166962 3979378125 +495620122 2133409523 +1450037349 1943998202 +1356567590 1873426369 +2655107970 2453672718 +4130053527 497620144 +1050635596 3373401952 3774418593 +2254422209 2254422225 +3966542712 3664135172 2802144749 +1099313572 3393201449 +1561371027 1624565613 338582124 +2863867551 1059097162 +2064052426 1978469883 +3221996454 3221996470 +1791321745 701943714 +398173497 846631870 +2895238856 2713477541 +2076228168 2076228184 +3576383206 2924844052 +3768317628 1367697895 +3716994349 1410562751 2862126998 1949015001 3436665457 +1691294027 4244951298 +4140889972 4119511519 +2322805345 1562843811 +924123241 521119046 +3669853379 3547727875 +3718274619 510940900 3718274603 +212379704 1153944804 +973875565 3458545284 +1476072997 2772687916 +2757679460 3908142029 +3215020560 2204520555 +2896305041 3418515178 +3268456857 1953349666 +2807384159 3962957084 +243825367 3084476528 3677540419 +1473551930 2109019467 +4215368860 4215368844 +1745934851 3582407338 +1498813594 3170184908 +620187833 3931378494 +206360381 2582265090 +3140326703 2449036497 +1207108696 2609895067 +1072213173 1346887932 +3957254412 2468344687 2627034132 +575376664 3244971699 +495842808 3735918876 +4183120234 3948659163 +2833688004 2803299231 +81286376 2290985259 +3928314541 3812458267 +1101205857 770465681 3031718816 1461988679 1962100438 770465680 3675942819 +3091664687 3547355003 +284896578 3457875786 4251467491 1770645784 3524986281 +1321629913 3681566088 +2202838254 2678563513 +692787298 1664574047 +3519551271 2606081129 +4135586483 2901230475 +102049722 1296927197 +1691303992 4077653700 +3305206408 2840022027 +1935404115 3971286700 +2518707124 2315772393 +1104648142 1104648158 +2517222413 2726925157 1046454386 +3773015484 2794065986 +4198130330 106384186 +2477619913 1125665390 +3248681010 92282547 +2599144662 1291913143 +4195626024 2090939477 +749590133 2429872777 +2601131186 4197874051 1044722158 +3076696936 3714377836 +2394597840 2144948853 +2232040820 577009608 +1395563899 910725727 +4029734029 2850763236 +3132557625 656639144 +2137674076 2830834547 +3040211403 1595427659 +1421954010 176755101 +472847371 1290704079 +2672522632 1812335779 +1927736076 3352435488 3984851937 +615234178 2673176203 +2605421811 4007780172 1794865797 +1598260019 709331290 +663053815 4165948099 +3069416510 2148098377 +3592192969 3622008184 +644377051 1365156804 +616080065 2410165696 +858186265 858186249 +2837404450 244224042 +4280321438 1043486655 +2928504177 967002342 +237142815 3382222061 3655501258 +3184874020 2196494939 +2021899595 40041748 +2044035019 2518166676 3691916527 +2580956357 4048437786 +3192274512 3633584099 +1252996692 3855779375 +2568353034 2749120613 +4237103148 3188749633 +2624157057 3137600000 +2515253628 2115304999 2432533045 +3711777055 1717627870 +137909157 1463871690 +2324128143 1378035736 +2371591244 3543600055 +3330080043 1497389400 +611573283 480825095 +2554198042 3280834795 +422971750 18309366 1399881383 +775976670 2910527337 +1643235665 1643235649 +3623972370 3567522622 +3524017096 1900157917 +2774698407 2941392519 +988992249 988992233 +171965901 4022110628 +4040304178 2714335706 +894134109 2280178167 +4080597567 565309736 +2258537995 4137261908 +133364358 3961038033 +615501562 835006060 +297650708 297650692 +1675234986 1675235002 +2469343322 222895531 +3990429915 3242029277 +4110445417 413734488 +216167190 1585130407 +1432288882 3599404403 +3351672249 2684794493 +3260882424 4036373883 +3470477220 1194444607 +1316308917 933224956 +2023604887 2002342822 +9726148 449598574 3713293231 +56418058 3071542918 +2166347182 4078788847 +2790227605 1680098460 +556624977 1709351319 +1196743938 3595292663 +2185747765 3965026975 2222102818 2205325212 2845614153 +3181495979 816561972 +1546774115 2240654794 +1178426825 1536861048 +3491673684 1402325661 +3057379310 3695341314 +3024522040 51194171 +2026385865 3961937774 +2190052455 2450753913 +3442606174 1672909801 +868197456 3586878120 +54720624 1829461256 +1692481088 2780416012 +122027604 298892351 +3044422371 3699446224 +3214542496 3482648443 1064857061 +1696536622 1819176279 +1451205701 1877973146 +1244031967 698621003 +1059685389 2069553252 +3196272604 3298658119 +1566897878 1228309011 +3424224257 274834214 +734078509 642153327 +825387133 2373084532 3543356171 +1138049997 1768062862 +2305147250 1403653734 +4017716917 2973923050 +2281499782 293660358 2569557729 2569557751 +686445 2105353860 +2896756074 233336773 +1549262138 2555462237 +369009158 2782465911 2782465889 2461229907 +3864849753 4249461512 +3696680951 3552743888 3552743878 +1256060740 527187977 +2608050934 2904734033 +3105190676 1891903599 +1962127507 2463578890 +3879608611 701377034 +2600905034 1434222459 +3693825639 4281101366 +2674558537 2006096293 +3997668920 1665196352 +2387207041 2136024064 +1760151983 3607658094 +3459916652 293978903 +816635747 3374500868 +1042925045 1281551258 +153530626 1776854563 +3889458612 3801520089 +2319465675 1671908032 1847571330 1002903093 2020242562 1019680715 3631335283 4024939000 +2334510846 2972941434 +1542004621 1839435748 4240517432 2982790797 1023191780 +2919070100 2047239151 +3143189025 243472864 3462520400 +1305225640 543527787 +2314316127 647214603 +2352880186 3111622934 +719381172 1018085129 +2724995651 198337798 +1768076916 1516583055 +4148845527 1608108893 +929006000 3680053269 +3564142803 1075498021 +4260025195 2582100366 +1517196675 2542547011 +4248612798 1686677535 +2938991189 4291452666 +554960931 554960947 +2128651231 2594306056 +1567656579 2603224124 +783699016 2113804646 +3291227516 1300169255 +4252389130 1708643974 +3609063615 2861334987 +83351829 3878337564 +3591297734 4283192790 1582704892 2044572458 4012959799 3957779879 2494190966 2962604835 2118626845 408042456 3005644948 2363639210 1203976026 2310924159 2849869630 440431910 3959904337 2193704175 1239755728 997457179 1842476360 627278961 1484405281 909484834 4137980004 3493440280 53215947 105690736 501931126 1948996673 3771181465 310781911 1527947309 2181006450 318198202 1223014060 1941245250 1505126212 467552743 2659598091 1942800483 1418866250 544255271 327638010 1725999007 1002095085 3491386049 3081746866 1772887285 166556766 782684577 3867768446 1466040522 +2710722898 2875366405 +229416707 2310951356 +3180864218 62608502 +2578123510 3728884039 +2820056777 1688768120 +1788753871 2786187992 +1214962177 1275002389 +1571031224 557431227 +552472984 2922884901 +147636831 961936286 +1391198034 3682790931 +3127008705 2766352877 1887173398 914414544 3532821735 130583714 1225530959 +3395390986 103504286 +1198796020 564673528 +3077201237 1068730611 +277070101 342422538 +983674339 703890640 +124741810 1593491546 1717686323 +1477410286 3577354873 +1801486728 2431379741 +3904654544 2960566588 +130564752 3493906613 +1735533278 1077164744 +471565981 3696552226 +700100359 3295579737 +337989214 347758079 +2354387994 66796797 +2043973259 2043973275 +4022326779 1711135282 +2271467876 2251241577 +1029914070 2033866727 +216783104 1764100315 +3285435300 3931962153 3285435316 +3727795706 3257419915 +3946253362 2041066163 +2068200982 1506213208 2799163060 +1470730109 2095899074 +2166439568 2166439552 +2897845010 724249018 +2472602763 563169199 2472602779 +4129552309 2151028220 +2964329755 2508034331 1789617573 1076967826 2440923848 +576297958 4178602753 +3909049022 662093243 +3746146136 3639766925 +2165148186 1334969333 +2938996291 128605034 +611518109 393349105 +449839303 4235278678 +2490102837 3673255786 +3800762044 515069553 +2102951084 239885287 +796269336 2341115059 +1725028364 2719961143 +1792818100 53527733 +1610705902 3568857146 93926568 4005075257 394055093 408464202 272426927 1054914681 327930339 3508397928 2886952194 1054914670 344707961 2930027698 +1676420442 1676420426 +2407517799 1295117366 +2831616041 3662796942 +2139538175 701960257 +3251497365 2888218012 +3707540572 3913826336 +1823309980 418624307 +2180935424 2743647507 +2222271489 2238989718 +670452650 2461605019 +1782584773 3991333294 +3556218173 3955224340 +4201949995 247641944 +4090927009 2345716656 4090927025 +903005804 3936089724 +3552166431 2313900369 +95107733 2173515914 +3456337555 3456337539 +3339434847 3061315230 +2008188817 3438724550 +1261637056 1449194265 +1470223193 1470223177 +600024337 1576851920 +1007325316 389753078 2208153603 +1102784332 3583964615 1102784348 +851339750 4076065781 1542085017 +703566991 3190688972 +3320907946 1481739525 +764612340 2994768409 +2229183306 3289950441 975517354 1345184327 4219283980 4251930422 2626115829 2713478266 1137710020 +3959550904 1058187963 +2779138566 1927950294 2911322183 +1666802865 1812507456 +3452854889 576613326 +1850214615 1850214599 +2359156434 2359156418 +2359327374 4003523993 +1364789691 2761826408 +990510420 1153026863 +56134632 744767037 +2938835099 1540039698 +3126108845 3937860 +72284998 1518292156 3417340386 +1664479129 4253037694 +1057138433 841803392 +2247115795 3963300346 +2945592182 2341869377 +1431736700 1653590543 +1792542291 658778838 +865794344 1329875108 1430540859 512777784 3246611751 1430540844 3229834129 +4063498447 385250766 4261118746 +2224687310 2356927567 +2729478737 1827257734 +1113765718 2106078753 +77205316 2189821961 2189821983 +2525576464 168501301 +3031924288 434985789 +2470911612 1425341745 +3695017589 701370922 +1310790318 3436420409 +2966505128 3379693130 +3644229555 3046613354 +2844591149 368939730 +1340246982 991148049 1922711114 +2804297760 1092469363 +924596342 929882577 +3481042794 580696950 +2893070594 1161699177 +477196584 4002750955 +3290297695 438912158 +3340696294 4100938939 +2104398277 974092556 +4063812987 1926593064 +3539110180 2035078927 +3184597530 3184597514 +4139862011 2029741279 +2173440868 1669504911 +2613687795 669740343 +2741273601 943443328 +2813040796 2401320327 +1013771377 1463607133 +1464175021 1464175037 +1365932296 849119115 +2810960444 4247293041 +3214586066 1354162558 +1186497186 4134905109 +1547927156 2990543001 869933256 +4033290025 628186902 +329995131 1907649202 +2226032543 1414048936 +2541981134 1377319759 +4168761865 4168761881 +2254348067 297413129 +405309598 3287768254 3287768233 405309582 1927147410 +3734788647 3734788663 +1064143047 2691584320 +2073207102 3318994057 +81191875 1632144380 +1102946886 1102946902 +1483415013 2230869258 +286026921 3627227570 +1253437428 1776396300 +2640585542 178489121 2040696282 +3294272282 2185842486 +1752621812 2077448521 +2455248591 4151394586 +3442236916 4040681231 +3665050083 3354861660 +603654865 1966212880 +3710050344 1172758251 +1157559264 2103044531 +2496506854 633707287 +3373782959 1065912430 +3589949209 4059950174 +3329233698 2221809283 +2734967383 1641933763 4139845360 +1216688621 380475410 +3329065216 2573463771 +2756836533 1645269244 +3870525053 2845619924 +174569468 2268105127 +1762753099 3978521326 +796802616 4223398445 +2746456064 1223168563 +1489406087 1489406103 +3174811105 3323494688 +2103322042 355820509 +3046117107 3957592717 +3113733910 1595962359 +1963115410 3887271666 +878150240 1975927084 +779604480 3526961627 +3348994220 3910620865 +1480770178 359802051 1876690618 +609879590 1605873089 +182502527 182502511 +3727110228 4260583040 +2547440480 1731942437 +349980849 3978782637 +896543496 3935534627 +875619454 4058204875 +2849476716 3394787841 +3436647737 2945869992 +1017488000 1017488016 +2280590632 626111997 +2403601915 2403601899 +3202054218 3179175021 +861833579 3974373261 +3520159655 4086928380 +3084443681 111173852 +894938968 894938952 +1931672303 1338821164 +187277461 663210627 +100953778 721044005 +3738599433 4202386171 +1409199269 2751818186 +3832855264 2210541221 +2989806889 2989806905 +543127368 1044956747 +2354474855 1393647401 +4101810209 4194499105 +4189314307 421850026 +4288577849 2270601397 +498705791 958981815 +2385577754 4046335467 +3365966941 3259704386 +3421381824 3353598533 +3398208802 4248972437 +2497919604 3585410191 +2538904725 3476192924 +2604321684 4052646384 +1382170784 1353432051 +1297952413 3383290004 +4135782943 936371402 2789550573 +2509826928 3384014902 +1672456125 2860846722 +526807907 3511133404 1338541639 +420748490 2717536629 +2185875621 3986440652 +4160661057 137310065 +4062983010 4062983026 +508172262 1059403290 +592975117 2353187954 +1283243283 543858560 +3862020179 3008479930 +3680877942 3680877926 +1112196243 4004737904 +115237498 265225968 +3930308025 2174986814 +1017144432 3766361155 3766361173 +1888138954 1888138970 +3848398325 236781756 +2823770300 749627990 +2108865278 3932669449 +2885386697 890752293 +3657133244 984522732 +3519478576 4189187723 +1489327154 4037249715 +2586068240 3071850549 +3734170427 3922894312 +3941533634 1445137417 +2001225374 678417133 +1748570261 2798983836 +3738277304 1810798443 3738277288 +2537788864 2537788880 +433369874 79167931 +3708208970 1001109869 +2062049183 449742664 +3627784565 3671233322 3671233340 +819871444 1769026868 +3038978917 2578628515 +1040840653 1991317412 +3407082892 1013680993 +3301956320 3259993517 877003736 +1011977534 845240457 +389014689 560261472 +2255134692 112605145 +13013997 1154192965 +878370729 336467736 +3219526130 1791930841 +372208382 1368312542 +1018286070 3337980277 +1488756383 415450021 +3149510030 324587151 +1108208898 4260108853 +916137595 3589246237 +267292979 4050772151 +3199225852 1097261488 +481866259 1237341164 +1239096393 2364376814 +3270367411 2469999670 753888717 +3873552777 3455687609 +2020575682 1799492477 270685358 +1851274275 3621393162 +4130798301 1972169186 +2054218837 347566556 +3375254024 1549022516 +736666763 3720868038 +443891194 1318292181 +1486674629 3107406163 +3170350317 1727123716 +2260376871 1053123680 +3589446521 2391503710 +2899443851 2576800450 +3012369100 1931554593 +3975952197 1443561868 +2113117921 1991123399 +1915620300 588909047 +2764029598 4158198441 +3110479813 2698025740 +3332358015 3332357999 +3985525956 3137525897 +590513970 2592789427 +3983325989 3878329132 +4185830532 936636646 +694832061 1160452770 +1226196032 2687008735 +1802235855 220983066 +1014526040 2308496013 +4136609345 1117082905 +472850807 691037481 +296286214 25575533 +3348380731 2771469761 +2900222397 1896849589 3729415298 +1625177951 3705520798 +85036653 448410561 +1017491389 903063170 +3627396225 357498791 +252577930 3725168044 +615910163 3717426938 +283014138 1863402180 +1691430174 2411125357 3498558026 +3608911278 3608911294 +1857171405 444024114 444024101 260128690 +3423931916 1361386721 +2008129445 295588026 +261605439 3404741416 +748757700 95009439 +2574757247 377299030 375791358 +2095732837 2416465217 +1171171260 1378508647 +1677173218 3497727229 +550957212 1314702737 3976921936 +1904611960 2834302976 +3609791393 3483534278 +155627651 1411569767 +3821104805 4015717341 +2116538400 3098321509 +209952075 2822282731 +4249316324 2607732735 +2618385201 3764332080 +3076554359 602346822 +1962347040 2372300539 692755352 +3530676417 171456470 +2067148792 3998057325 +286459503 2478604716 +1784751015 501948406 +3257822227 3257822211 +764474233 875513726 +3756015488 3993237139 +3779015577 796801480 +733492514 137058870 +3251537214 749746782 +2481812431 2915913422 +4209047316 4281129576 +1435029063 3982277056 +643477166 483165783 +1783308651 3209010036 +1434128456 1434128472 +2397983831 1845948015 +3847508237 280729458 +4016517558 3413125014 +2474128131 691555772 +3127960153 590758031 376047388 1105020222 607535637 +1323231365 2917665114 +2573811189 2573811173 +3862365692 1688103847 +2940544656 2312993020 2276409042 2044441781 2312993003 2293186664 +2734874334 4045356287 +1699005664 2620280185 +14454479 1227043084 +1627335024 565066581 1514628828 +762780397 2139054866 +2534478982 1440960247 +419747900 2661312103 +2761433653 1350424956 +2678771679 954547230 +887829488 3625497931 +3016288852 1497948719 +2479153785 765497928 +1908993684 3008336623 +2705545133 2697032441 +2166512972 3920545093 2166512988 +3552743900 3552743884 +3575758400 1265511493 +3754225256 2869120445 +3521960166 1574531585 +1503313257 2006461518 +3672238943 4037379742 +1402839184 273384171 +1619925068 1269841825 +1091095954 4074478803 +1850963556 291725183 +1538992424 2409744875 +2366469570 3459276899 +1015344041 2931782550 +263324683 3225181524 +2888620556 379273463 +3806963031 1434368112 +3276396614 663500045 +3080809391 3256648824 +1791124163 659649702 3743223933 +2466637773 1061939131 +816856953 189527195 +988602770 1424431315 +3276333427 83296961 +1634652429 3624069751 +1230516158 47872674 +241289031 3772213529 +1077420086 1314567441 +2578620721 221824273 +2291551941 3382575116 +2480048911 3075333361 +1626258020 4224674687 +844600860 3031295175 +2492652350 556737183 +298602203 3751813828 +2202576553 1415470104 +2363404243 1782286019 1298786353 1369924526 3336345135 3171914830 130746505 3699538445 48896944 638624953 +2195508871 2299200388 +3353641172 1891021983 3353641156 +3082836310 2580324977 +1591980917 3544316307 +2102652066 1215643051 +740313146 2698091021 +3390791507 2081886138 +3581731241 3164028174 +3740499622 2672844609 +3447314441 2144278062 +2893744000 95211141 +1717972533 3831000601 3881315802 +1041491665 3368766049 1041491649 +2799528543 227439496 +4263207428 152783957 +2418766639 3724951617 593908462 3280177340 +3217308990 3480250140 +553967857 1762992512 +3594302930 328350085 +1865432665 1865432649 +1811412140 4273589857 +4008698838 4188252657 +3334364011 3615129999 1219094900 +3838117840 4062923893 +3898027994 3452642166 +837286827 3180897625 1651227598 +3046825761 63783136 +3768993969 1455713968 +3839398019 3286990378 +1748810982 4254948887 +844733289 2886706766 +1870428209 1152821974 +2438686047 3850388962 +2220480764 825889447 +3313244391 2639992514 4038643655 +3712719621 3712719637 +3076045305 3908498889 +3916672618 4150593746 +3375548583 1643241206 +174900579 1551116359 3426400988 +2470586154 2470586170 +2642121094 2266272710 1871058423 +947113784 374289709 +4246502491 3470246738 +1551066211 1727094598 +2335144433 1209855579 +2140247175 2797512870 +4141081985 743088304 +975080322 1416629 +1090443003 2927888393 233820094 +3404459476 4207120169 +617238471 2977666624 +3530944267 308305022 +2989836910 4016725042 +3884716593 3884716577 +3010021479 2558378099 3585931808 +3356233345 1811600671 +4254632234 4254632250 +4129413944 1282545728 +1846179545 2192581920 +3632478332 1385294641 +1149852184 3753567200 +1774247828 245364217 +2256300727 2256300711 +340548953 2047721091 2091950384 +3960118572 2660854337 +308811210 3285863661 +2261194914 3446392597 +2279007013 1588380765 4232549178 +3801708327 3734409833 +1206909173 687593101 868542890 +2012949886 4256152735 +492604373 229646428 +2702196254 4183691639 +1926937615 2401047445 +1018845126 1240566970 +2436895726 2514444207 +2135005549 3504330706 +4082404062 3960904553 +636195238 1473660993 +1013982476 1013982492 +2633672954 412615069 +1842677412 2321118249 +3371059266 2434514933 +1370427979 117452171 +3606534240 22087483 +1656541732 2566863167 +3671179273 2167492152 +362106318 3356064601 +1315329914 3843798301 +3327757062 1156962935 +2467197358 767358201 +3890608881 2893757153 +4233244166 2478575994 +1076006385 3882185318 +1352581296 2582205699 +353893221 353893237 +400412198 3814349530 +2741823286 3427181587 +3859821225 3565142040 3927003556 3565142031 +1492887254 2204463521 +68369748 3334875839 +1294937485 239383794 +3159501938 3881564005 +3893948389 3893948405 +3042150804 109155321 +3662807341 3960992532 +1070393912 1070393896 +401734854 2269319441 +242982360 2761521947 +3489107703 1505103568 +284329263 3704072430 +2468415305 3858659320 +365722958 4096955037 +2102216647 2102216663 +446813780 1086613049 +240110493 614303778 +578101259 1231122754 +990507778 602381085 4071197749 1555486094 +3381998235 4041124370 +1569314529 553468982 +2989059211 37084884 +4254658986 3787746957 +3099812412 927258855 +568073292 1180421729 +389606436 3087312237 +2387970799 2955532858 +217381101 703923026 +1737621396 3749532013 +870708267 3724500898 +767155565 949730244 3777533343 3041289563 +2049568463 520286158 +3926536757 2735540604 +2305289882 3902577789 +696985355 1896773204 +1659530433 1659530449 +1100184222 1100184206 +3970872022 1828947697 +899754875 706632126 +2871885885 3997213474 +374238065 692057693 2389910256 +3717897620 1852182512 +2774428743 820131667 +3307581182 55663738 +1332686322 926216619 4261762031 +3957463396 3102603369 +2713596013 1251194459 2213529285 2213529298 191249298 +2689558326 2466216465 +66856448 495427035 +1473765772 2463254748 +363881778 1454329253 +2986237790 1737968892 +3840950356 1524262335 +2481351110 3027617297 +3184669621 2263311850 +3678592614 2420382366 +3591088516 2019285727 +1542178332 3492339217 +1048119323 1938276996 +3990055519 3268440961 +1941544782 3299445465 +3958462361 837672062 +2521261475 895811466 +2690389949 771317396 +1934003446 1846536017 +4124026958 2784831738 +908261872 1371034203 +584531296 953523749 +1921476319 707195166 +2576437267 3535867386 +921508910 2772655225 +170806757 2175775523 +3733914302 421613854 +4250119307 1880888181 +3994973537 988989366 +601652967 3018855673 +4118072589 160097417 1943980900 793298260 +1836394587 2859370308 +1404464383 1404464367 +685201071 2907303465 617446987 3886417590 1752279012 296150664 492221195 4002827187 +2573885673 1802931918 +3709190818 2873189653 +2110484971 1435614222 +899464225 2260477920 +1786956381 149196907 149196916 +33761627 33761611 +4044250830 1201618511 +2785333271 2568902378 +744765307 3090602847 +795828218 1808878167 +1108145216 1108145232 +3832185832 2074977853 +3791779702 1058574023 +414052346 414052330 +3983960390 392673569 +3640861318 636442849 +2910978804 2910978788 +1784320309 2710738538 +20160288 457280507 +1408293479 2334642208 2334642230 1408293495 +20506154 378688525 +1579046853 4174371306 +3532152155 4178399333 3349870148 2518789384 +1886175861 1614152940 1886175845 +2113928622 1650073864 +1919587132 1506133873 +1637533409 2275873824 +1061396424 1061396440 +1928655419 848909042 +3457037273 3912938174 +1890518137 3699640958 +3433945162 2046098401 +3455561787 2011852018 +975614870 4221643873 +2127694516 1487329615 +149168063 3189635496 3189635518 +778584228 2988294697 +2613742544 265951349 2433722920 1767145515 265951331 +1369489609 1835064018 +2815727861 682412476 +2036491763 2287505683 +1660626815 1348414696 +419587575 1439073222 +2584189936 4210672114 +2976229047 2976229031 +744375714 903030562 +1992260242 2171466693 +3528807056 133333441 +1585322209 1951757062 2945311069 +2949417713 3031071351 1946016662 1946016641 3047848973 140593252 +1896774542 2278326425 +2080021252 797050719 +2491082993 340683158 +1083090709 3046180380 +1177609670 2297898682 +249310014 2489667657 +861665767 3234490038 +42444619 1183603458 +4033936355 1692173898 +3744792379 2607663588 +2261551257 3439003848 +1705868178 2719581893 +1534772323 1915801722 +123293177 2325069566 +1460238200 4190189587 +1224497635 1358396685 3118287756 679260210 2072327767 3052908521 841999290 4243586310 208924861 249660818 647398236 582561347 +2161489772 1013956353 +4191384263 1760372398 2952458226 +2923266574 4204081678 3830516623 +639174235 3968862505 520158750 +391880045 900449344 +4257489043 2736615168 +1020529149 2696194366 +2557686546 2240978035 +2196733441 1077665831 +648983091 3375730886 +3254001978 2370850397 +2312305431 237061424 +388425806 3503970604 3404409177 3375503112 3190949327 3225400025 +168109164 3712967575 +3023227751 4254237088 +1109378240 1363884684 3624057413 +61597055 3335967427 3335967455 +2358018233 359332510 4197360446 +2609769960 3244764163 +185138952 1730771348 +582135634 4048158227 +356186474 1661360820 +2014441011 809824963 +4098038575 1440253051 3030633208 +3709285191 1384495318 +1280701323 3058590676 +2820496755 423238682 +3154083061 3895571900 +470040482 206915755 +2178223506 3676982718 +2732992570 2857456459 +850270999 3742672176 +3186400683 3186400699 +91770768 744832949 +4257899671 3122737154 +3216757581 565027378 +3994091416 1240940319 1556241476 +2934703858 4212863910 +1155204773 164328876 +1732480967 1448826432 +4041655316 2050692869 +1832075330 699279331 +3917301444 1412851359 +2040018587 722463721 3685369950 2937697829 +3097476219 2538402111 511030692 +2220024256 242835795 +3975121273 826907502 +594555123 1632897555 +2666984195 1103138236 +3629080366 591789486 +1012604076 2943230679 +1789224236 3747967575 +196320722 196320706 +1524964961 2007945888 +1954918827 2954425301 +1918257031 2228394390 +741926373 2190600058 +721666090 3773268493 +2051255449 294171870 +2621761416 2289597195 +410829288 1952792637 +2181490275 333229532 +3665601281 1433072464 +1658543560 2268778228 +856623899 934047967 +988412732 988412716 +1421091098 860302757 +3935882784 1814549243 +1347222367 2870761482 +850140519 1315511652 +235190771 74496410 +315431683 2615248316 +2806709793 2349737776 +1945503453 2783451861 1766641122 +657152603 4153243739 +695543729 4100815782 +113177444 3506482626 +3241535414 3722167175 +3590074406 4239254385 +3328080911 3777974166 3855644657 +1109304945 1935189547 +3679262258 2535250532 3552252381 +2118514428 2632556305 3290680999 +2668787234 2270013 +1566081397 3538473741 1733544746 +4244012175 1603480016 3339064593 +2849999262 2213953818 +2363019934 2363019918 +2596705482 1889286651 +940180275 940180259 +1133227474 652386707 +4101449486 4101449502 +3151528517 2003585149 4208267930 +898001623 3183099970 +3519996223 2276234792 +3435950785 1234178995 +3778497729 1259197376 +3761550295 3388414822 +242927528 4006735247 1934118260 +3958565966 1517109165 +3793090148 1284693887 +3980449082 3071257163 +2180216552 1389806800 3059113219 +1196162795 1438455842 2169705770 +3757887349 188431199 +1253092268 1253092284 +4032978788 3470535295 +2474679525 410451052 +1464232467 1464232451 +1983618413 2363019922 +3502143086 164917039 +3264300199 4054782710 +1688015904 1362335623 +2668200148 804638127 +3782781478 4175424870 385079745 385079767 +642660339 2884681843 +4235343414 2647349009 +3170477267 429337943 1342076972 +2295033365 51388589 1832798986 +1269046745 3965385886 +4166366227 32143845 +1992307860 2886472681 +3552336453 2295324791 +1882993617 565548055 +3790323190 3790323174 +3841165492 2912254420 3178288415 3077622715 2173745010 526398297 2895476814 +3529483039 1570722241 2244933729 +2458803796 2458803780 +2543389529 314123915 +1696536628 1702524748 348821861 1914188689 2635728157 2973859613 205181545 1075599851 928656652 1857141944 2582471367 2964948086 1594797447 +1726453907 2072265837 +2358345437 2358345421 +4031472212 3007126452 +3278282156 3432160961 4012263990 3480008807 +3710817429 3710817413 +3052461498 1236422890 +636048890 2823968907 2225169090 2823968925 +3601103030 2599028366 +435391532 1393127744 107325761 +501930953 3786931576 +813037420 3048505111 +3141753198 956680249 +2077356877 1245978219 +4063492382 1708206633 +2347297739 178991252 +4184108173 639033842 +3498082962 3427634138 +141453432 3103920389 +2186639400 1418471147 +2266925118 4077943177 +242736368 4233088648 +2466014118 156294743 +1347483474 3245692435 +206850785 1236394038 +163745892 2942622799 +4049377469 1119377687 +4116475473 2441193862 +1488248635 403157503 3753601508 +440620521 3343499656 +621839842 2941821933 990036682 +4030868071 2670247968 +3049545176 4229937933 +720829398 720829382 +3858386097 2123879232 +2057980634 1714983587 +3010639172 3247659551 +2689304799 490740056 +385491373 3636659026 +2810388143 1651068273 +2757470645 1900816380 +86403334 86403350 +193621794 2617361469 2246411860 +3954388061 3954388045 +2732962282 1503073115 +3142325978 2613919394 +3234063045 962460684 +75441800 3343915184 +3660688756 4029943183 +364038715 1668569828 +4223903275 2147390882 +1580760159 2985019806 +3621305611 3576797250 +1357410818 581939722 1609267491 +2353331965 3449645122 +489692466 3565470110 +3974984148 87830528 +4157715724 3294819639 +1979797522 362891582 +4271349645 1437608676 +2740729106 3277948420 +2701646248 1916952003 +1358648570 1973863837 +4170674625 2933237488 +36414622 1291422315 +1547330243 1636398247 +4222756894 3526708009 +3878619916 4212024311 +3758777347 3009114282 +3313820738 842224618 +1332518001 1476135190 +446185333 1275144275 +2257831441 3953183942 +3021330636 1248086305 +3043172578 1829553091 +244424906 3107986925 +1587249651 1273074777 +3376331152 1572740533 1195951083 1752296847 3096858984 +3283816663 2154719543 +1036912355 1267664327 +3634193082 3116526301 +4223756209 41302960 +3052880207 2938595227 3275476824 +2779140667 2185421769 2648562942 +4282274303 3457881214 +1645804851 2690029402 +1315329888 3407580197 +2040732961 3272257862 +4174899114 1709289627 +2142277978 508014956 +1894810855 2980132768 +1439478266 1439478250 985276098 985276117 3280563750 +2945897629 2945897613 +96652291 346499242 +2314863882 1050013357 +3057265251 1083226588 +1688305859 4259868574 +1452420283 52193906 +196407904 3453586739 +38865941 3130393866 +498687643 1708125714 +1051727377 1784388823 +2672684269 4017574318 2092504914 1870491611 +3985245739 457684404 +665320502 1401173527 +1202792955 3605337650 +968641673 2276651688 +2696242343 2760733430 +4277293544 1064759357 +2759117952 1675488645 +3012291864 3175496923 3175496909 +891095686 1099034885 3330985294 +773579190 773579174 +3440724849 3061003086 +2643503719 1797477241 +1397867320 1639338285 +3863153000 3955913620 +3874912444 1375735800 +285515096 2646569070 +1567234072 1187635177 +1274688398 685713561 +679262334 978742879 +2489453089 2387337210 +329850695 1825808964 +671363298 3768120277 +2102764016 1036905685 +3508075794 3508075778 +2834501759 395067946 +264092899 2863683914 +763523403 3457448293 +2505823378 2781588505 +42108675 615746672 +664134106 3402598385 +3335628045 151442276 +798355069 1711697620 +3517103890 3362528753 1932730992 +3961714633 2215383406 +4053737807 3162605726 +3257381342 2189230185 +2870357288 2078873067 +3325158471 1293346841 +316124271 411333294 +1787092369 1178074934 +3716851716 3606629624 +2630113393 1314387140 +1170040074 1170040090 +2276581372 18512304 +3662120568 379105019 +2465367143 3133566518 +641788658 707910387 +729148383 3015672956 +213030112 1608569912 +3109311996 1166628785 +3652148683 1437258036 +1772155877 2793734647 +3583456119 1799596841 +1126820353 3153813398 +561329443 3464668700 +2655792424 1508578813 +1463073523 158998753 +2725757051 356432581 1032061348 +2758925833 3896543278 +3149762808 2204841595 +1769887861 2263171114 +887237829 84703756 +3434372558 1949100991 +2528549504 3245684613 +3319218937 3319218921 +3087864985 3087864969 +3537317852 3300939591 +3207880487 4042866846 +1012496052 95122185 +2950587995 907747666 +997309760 3557616581 +2315232153 3597568478 +755836370 2751158470 +615587707 3011153861 1037340338 +898851961 295930687 +4003630024 601402595 +654955412 1308904191 1308904168 142086649 +2584195960 4062152173 +922806 3425344142 +4253904388 698626112 +575792411 1955575026 +1432173403 1432173387 +357209745 359335504 +26694344 1228361931 +593741651 152225708 +445903736 1323845101 +592377987 2211995751 407975484 +1691267321 2858457086 +1560415773 1737996523 +2724279805 2617769300 +249262709 3631558204 +2785152221 4088565954 +3313679075 2054478288 +632352910 2607167833 +3169243010 3780684195 +2629864983 3665762313 +2227576261 3370179852 +490456643 4219880496 +785307408 3214708259 +4002725873 2234132582 +1880880497 3976421606 +1417420057 409062984 +660319383 3563807587 +4293170943 3554259838 +154277415 154277431 +2534873093 3891743363 +3212946509 1961226992 +2697859098 1046698219 +1487673964 2634434967 +534121402 3623122397 +1185214147 2053117053 +1528619629 3682103698 +1067217609 3964187256 +672238637 1084205778 +876267836 2179663165 +84064281 4232564574 +2581785355 3173755439 1261961812 +1008241181 3823242475 3038539797 3080809396 3080809378 +239587629 2807568765 +4135768119 2607586727 +1427464406 2694232993 3753036742 +1335093677 4074298194 +2797588058 3656505259 +2632264110 3157724217 +3465801170 81748371 +2792444249 1566773022 +3346782982 2000271697 2850602724 +1947063280 2106348875 +2052967820 1716070707 72907198 250935883 +3127054683 1352499464 +372059060 2906290598 +664834629 605739132 +1396168286 2931202522 +146066768 2388692468 +4051850547 1786070176 +1909801471 834069630 +4226168893 546857013 +1763182990 4275505807 +269387736 1934650920 +213876243 611547130 +3021616431 3145084524 +3217262623 4291774686 +3052284541 3807175380 +466566217 3001981088 272361208 +3354201451 4168450968 +3700586250 1150379195 +96175316 2188749228 +4079859904 2432292435 +512425047 2767254544 +2381354030 2144584112 +52811185 1186792534 +96914951 2410193753 +1579590131 1609318262 +897196513 897196529 +2705038095 3755284622 +55421574 308485777 +1003477828 1648841273 +532811274 142350779 +2860210420 1412237327 +765645924 995383679 +3290581765 3236445059 3338410188 417013546 +3410078468 4234164063 +3280431053 2603116466 +2602533693 769550667 +2027919775 3875460446 +4059900917 2494806865 +1000024415 1352581293 876748936 876748958 3424204316 3772021302 3306760970 +1568109320 1365674508 +2323827828 2145901199 +3173996421 2418687932 +2163548902 3991427446 +2305440244 2769815624 1178155801 3659740645 +762186152 741946219 +3800138108 232707623 +3556442611 2848431991 2804158860 +2208923523 3335764778 +597879695 3583632499 2051385743 1831323413 2920560988 1062651424 2803117645 1379058200 1371857700 2112326619 765139106 1883609563 2648383790 3822549855 2954116206 178908174 1709663749 1883609548 4152427925 781916728 +2736369173 1779445463 3993399603 +2758601669 2625054490 +2935025699 2827563280 +394093522 1420034171 +2844623065 2590781455 +3045917077 3100896444 +2997190802 3431556549 +4250436253 3374957604 +1602973434 1652536221 +471894228 2436178472 +508210158 2643240889 +1974016161 3660694902 2573611075 +942124950 4235815217 +3565820333 3644518916 +2417718146 1563874741 +1439436165 3401070713 +4074077134 2099180370 +3596782054 2208677210 642597736 3867905015 4056263627 +3182045694 2430606047 +443651639 3763132240 +3635476020 1385403353 +1619294092 2089300329 +1566895393 652298976 +2492120860 460387719 +2378849745 110211088 +2379504541 3796645922 1610374548 +1774686827 4029382242 +2586018877 923813685 +756924729 1054289064 +3683089446 3158863831 +3098766329 335411145 +31453708 1390719049 +1653738181 1435649258 +4095386315 1148320766 +4082935139 2111331036 +2298733585 3439908040 +1268363566 1849916098 +1457627097 2653856392 +1885809205 661090684 +175194961 3458938026 +2127743563 4040455188 +3900306813 3976018548 +1405056556 1405056572 +1759466750 1867696298 +286596389 154984748 +1622632136 146197707 +2661267734 3413138855 +3541749890 3541749906 +2456422382 1793751993 +590453615 3591876536 +575927243 3576219778 +657551619 3050629052 3050629034 +1060658442 3984322694 +815832564 815832548 +735162897 3573557174 87982993 +2104965190 3366819383 +3301266474 3575221458 3970137627 56469998 +1648891659 3262924354 +671827862 2680271153 +1689630690 1813018837 +2225722990 2225723006 +3008172464 4065515523 +1662460205 3596932167 +686426353 1314655882 +2145074340 3927995967 +901340204 2622210368 3201046849 +1548118176 16594888 +2764701831 4043232384 +141038670 248564430 +1811571450 2077341653 +359798915 1167889980 +2104840801 3769675424 +2856926418 3813326483 +333721873 1631141328 1631141318 +3918385384 2005485333 +3029855630 3643471513 +2315125236 786240281 +1430974410 251099885 +2687260427 650180142 +3241856558 3166471353 +4031274275 1693097500 +3524045754 561843843 +644019572 3788006809 +3538392273 3549381904 +2996766117 3250228308 +1293379323 1293379307 +739110795 905280636 +4242387509 4242387493 +2896623011 1842655132 +3580536354 2972603179 +2151763908 1867848377 +2364644431 1610061783 +1761972926 1406356347 +2563250749 2071053435 1208865662 +1807174293 304191224 +2196609387 2793272601 +1061650108 1502380519 +547520299 915843930 +3289718880 744248265 549446380 3098213501 259942147 533991267 1878648841 753947822 227920349 1173647913 1915417264 1961385802 81872946 3094585239 3180943374 1828399590 1172122601 3128721919 2507689914 +1998428169 1998428185 +2047667463 693707265 +823647689 294789998 +2350439995 3515959550 +3294234893 106323196 +233993298 1185750277 +2292208709 1499768972 +2139335937 3175700608 864211658 +2497437228 392631104 2183053121 +3632050641 2760150390 +129465659 3764092105 +4050056392 839122843 +2626391176 71662499 +1424825899 2063067307 +2254907853 4054069652 +1430536242 1819348645 +2264005006 950825706 +2763925816 2208590465 +1014362655 1286350558 +2313608284 1919739089 +1402433869 1402433885 +474669280 1352729531 +3022318236 840782727 +2627088493 3983424402 +4289666355 3014326106 +135690124 3125263265 +465824241 2791917168 +1418512138 597513389 +4225214728 2088703901 +2288192195 776363175 +878961178 2470244093 +3772823714 3051820250 +2559698719 1286526430 +2595135588 3840310633 +1123648691 1637798349 +312947624 2978105283 +1483704034 428955075 +292039645 1140657396 +339942086 3906232070 2879595959 +3186505457 4009786736 +4194720209 1761567760 +3378303516 421446161 +3352190633 853476376 +631595899 3193674404 +3568344105 4211463303 +2519505460 2620833753 +2963424471 3866254950 +2420165839 3842140632 +4021352486 2039915457 +2033793791 3558334312 +4116598843 2121813234 +4012206333 1230676030 +4219725933 4290264786 +1483042343 1319921504 +3955535633 933205958 +3966368269 936682084 +1067492390 2674492003 +2602964497 1307884752 +3411945071 164405691 +673040603 31666372 +2787538472 3226115899 +3012524305 2158806710 3422985687 +4089935950 2512489433 +4165005397 1947911702 +2663122860 2382369751 +2031793702 3406609857 +1873530349 1663585907 1627608086 830938877 2405579815 1713918766 658351097 2405579824 1987339950 1546142588 2886271755 +3659582373 111187116 +3465025963 3409995810 +3870678431 113953 +1312134696 3201936963 +3832923879 2355633590 +3388313136 495900053 +765401462 1198855377 +2822836068 1114323583 +2952856708 1184479004 +910345045 1550543603 841127930 +943246096 3340100946 +3014055109 2493575706 +3502524118 2835893413 2835893426 2418963963 2936559162 3305405530 4182690354 2284743009 3290414429 220602368 2435741569 +1141124003 4014469767 1566889242 +710776155 206708292 +3704777049 3828589630 +2843743642 473295478 +208244722 2083363301 +1265642669 1755757842 +563015890 2785352325 +1036371995 3190806181 +1578689883 293411005 21899282 +2993917428 2482207817 827107064 +2505458178 685376010 +4232367116 743257825 +336878358 2987090865 +4191900794 3460693021 +3042927859 449070221 +3529388388 2387067007 +2668009115 4066317828 +2096119684 1110709743 2096119700 +3677969924 525271135 +2614261490 216406157 +704389438 1441289353 +457441114 3057804801 +188774146 3095091235 +6156898 4125397077 +1143170804 935006745 +2175234948 2660948191 +3921500780 2197514443 +2381532415 2591691452 +495352184 4071700475 +3538131744 269446461 2897700822 +819070957 3349314066 +1986350841 1518031336 +2185569657 2787773768 +753381541 558287859 +1683645548 1716262423 +1948457087 4100758721 +4189322901 1117801392 +364044941 3046810610 +765507478 110415969 +2255671139 598880115 +1333793743 4120850126 +538301943 2036323270 +709505613 539484923 +908378563 3204403176 +385236322 3355696253 +1332563296 1332563312 +1368897453 742548956 +1175731292 2916811975 +3682222194 2982067738 4084429683 +3131421189 1701603865 +1858634309 2862944922 +1691408098 1691408114 +799531678 128212670 3424077503 +1577297144 1577297128 +1895320931 971100892 +272829888 1502520645 +2913516798 3460467195 +1033908021 3567032026 +2262676199 906011062 +1899689832 1899689848 +3510278307 37636234 +2342411552 2242863604 +1899880662 1899880646 +3282998796 399914209 +2211107993 229904021 +1004526331 941781928 +1846018309 2899232060 +2038416351 589387784 +859705023 1773221566 +2118830196 2118830180 +3783310321 466730831 +551496608 1599188211 +1576135499 785737474 +4086430927 1037105624 +1372939224 3803545250 +2900451130 1729888195 +2068048330 1656724845 +3951225254 1695928385 +1248838974 1811120265 +2066812064 2385960947 +2926179409 4186297334 +1025074436 784869619 3724201888 855246175 +3692220095 815494846 750504572 1100333441 +118576973 1246856952 +1643327234 3089708811 +768805053 2016583586 +4132012706 447464381 1471718677 1937951086 +1803642794 3419309074 +38294517 1754737050 3052186067 +160052630 2593282865 +661731263 3349785163 +3172545490 1781628260 +3587215260 1232888936 +1842667156 814337512 814337535 2048549625 +3462011768 1339637220 +3114653288 19744125 3925667775 +1086976714 3353949179 +956258264 3578265459 +150390484 1252036648 +561625158 494025878 2521430151 +95729983 1509750017 +555212964 3588184715 +2742469548 3141199932 +1838360316 2057723569 +402361326 2935834553 +1302996390 1302996406 +1878056778 1878056794 +3591339048 576746219 +703357948 177413091 +514386151 719758240 +3048546333 690064820 +2285147066 1572201250 +2853750770 207049115 +3620362759 3129719062 +1157105107 1701915450 +3572103570 1896541229 +2450114266 3211004203 +1813412098 694189603 +2431647573 102269504 +4200579230 3267115199 +3372482209 1077817030 +2704269097 3293451928 +943638224 943638208 +2280286646 1307711797 +1364213422 2941430777 +1000144581 3518230350 +1002263517 3893036258 +2756668802 722035637 +1913535513 1913535497 +3501233386 2118266093 +988767695 988767711 +2312186574 3269090137 +2281750366 1999454463 +3790244925 3778724875 +1167950162 3908211717 +3259228931 1124962022 +3362988731 1212132466 +2553141480 2016179499 +2200012294 3769456184 1129473756 636329131 703067829 48180820 1441503211 447454476 3299588605 3057685606 +3392558262 159865489 +2798923541 3037077020 +4214302763 2573351860 +1035448357 66207848 +1899075759 4027806910 +2382165496 2100770171 +140089151 3977824849 +653501756 2374835569 +2929818835 3140976698 +2886987455 1181870716 +2292097935 2292097951 +3847541973 79162877 +496446299 4026089540 +2497064799 2888602270 +2908991205 3639366252 +1868107478 523393767 +2422713948 2939648711 +3489710558 1160387022 +4187495213 3981703858 393398212 +589797081 2882684770 +2978504017 2433279200 +4044430089 2263715640 +592805697 3979886228 +195232730 3597038517 +3869540181 1777627850 +1402118661 2496990668 +3477622946 626672043 +2007760027 4273907730 +4255536904 1423638923 +4017062297 347149950 +1673583017 2037745397 +3814147691 1211163800 +2574391014 1831466928 +1923342013 3889589246 +2731042289 846756464 +4089085138 4254943161 +3539699004 1576189287 +3031594257 2246986192 +52304533 2103695516 +310244423 161546052 +361259658 1874009915 +1689497171 3655036076 +3175856306 3665300639 +3380263112 4096844491 +3523797502 2717631177 +3179164484 819470852 +110461476 2170281663 +473620776 2561700331 +1681847112 1681847128 387512907 +3957472459 794407406 +1194867784 811274595 +2183743119 1979323150 +3673906780 4257842951 +796474593 796474609 +4262348111 1064770382 +2904850791 4151817526 +1039312293 704299692 +1618495548 2082990895 +3118343457 3115610848 +2954748839 3859636214 +2284400119 1339251664 +3089922033 3741372528 +1580183056 463604861 +1769025892 1630584959 +2800886552 57643566 +2458479212 441616407 550109820 1894521239 1894521217 1152132608 +2550825434 847931965 +2131808775 242917632 +442378188 1312335393 +1896917651 2419885420 +2861113616 2245987363 +2834827800 733715364 376955853 +1299451697 2067372502 +1585482879 1130179560 +305428528 3633918851 +1561351733 3048715644 +2360129260 1608775063 +1263812305 1721688848 +1186165388 3632091745 +2330981848 2110187700 2157946622 +298706463 3462144203 +634888215 3974731650 +2973513124 3049818703 2973513140 +3228935165 3512782050 +1337536653 226979300 +2445691317 86557513 +3134287418 997755286 +1035686967 1701165219 1692766854 +265358661 2158280863 +3387836909 517028933 +2491514375 3470353664 +1395810887 1062254038 +105384841 1495140846 +2037176409 2136511496 +2182958928 4058099244 +566580621 3865114299 +419587571 1371962778 +1194367565 4195480484 +3029859309 1893231880 3816373081 943822340 +4281713432 1940432608 +3232874787 1983441424 +1076139117 1721083780 +116015101 116015085 +2394820834 3936302638 +896875188 3683346777 +246128309 3403348446 2799416095 3403348425 1486453788 1503231394 +471460008 3838394475 +1090733081 1898197854 +2245098419 1539685082 +2509512976 2627943864 +1206421789 1343215778 +1124797413 1868806508 +3241426138 4129346722 4282108715 +1143921781 1580344858 +1828644346 320434883 +2086660382 1056705646 1056705662 +2236278137 554028382 +814077145 4143260930 +1607448605 4043232674 +1023280931 415586461 +4288601837 1410920196 +455541892 1114381257 +2699628332 3501465677 +1007478927 3460137178 +3324435261 2313483829 +171260946 3604704574 +2916745254 3687330663 +3598758377 2509771214 +1369209630 2538983465 +293393437 2592262676 +755590849 3727044024 3765637769 +3614483129 3375426697 +1205872305 3604801712 +2958721193 1199082008 +1460333906 1479776261 +3080809390 3239871215 3508313097 3239871225 3080809406 +3378427083 3407256468 +4148362534 1685357271 +2232091961 2841196712 +2423009993 592704110 +2961815792 561988188 3637387733 +1874461268 3993956716 +4113508140 624601665 +2256764295 3587099282 3802566105 +1125609542 3823484449 +1722990971 644256946 +2203744711 1430941949 +319225685 1224995548 +1019950201 474751349 +1009083262 1009083246 +1809935985 3100112531 +2614972533 2614972517 +703889950 703124799 +1938935522 3498618307 +4227012045 1823166884 2746068651 3434195304 +3836010532 327997609 +1597184797 448593375 +3554287357 2746006673 +778539774 185361887 +1904404455 2551386294 +249262712 3681891053 +2098875815 2540191222 +658170992 833985621 +2402546163 1640358298 +3763473045 3055986844 +1171899107 3955358887 3377711434 2989483517 4238851769 3598400655 767839610 1129864647 459055326 +2857387811 1118950054 +1024402556 2597744423 +3295704578 1600214538 1057604899 +2165760356 2600783999 +3774383122 959965253 +534980903 534980919 +164655755 2821371358 +4050020476 4050020460 +2630586412 7599447 +2129503318 7581840 1177584399 +4049059618 1431802941 1341915886 +2586870894 3202270446 677411119 +3402171508 4146592532 +1008390168 3056965083 +2535042692 1634580959 +3625212324 1532553103 +1417583821 1869900110 141358624 2705455666 3539637883 3494958756 +3427411147 2391267822 +4068992577 217020502 +1015786764 1015786780 +1611195083 4177331604 +889372741 3092556954 +2741501259 1493564341 +1319299808 2859974323 +3317677452 3463843748 +485553711 2508543866 +3083357229 2102389444 +2898664785 1289758352 +2706536222 315720767 +293514269 4268536789 +2425259360 1683584450 3134480501 +2163677178 2696053974 +310527150 3507625465 +3123455328 4054744987 +392870186 576188805 +2969571886 2668456110 +1193204110 2207283855 +1705723577 3315619112 +3549189357 1413862959 +931224702 3735329375 +4133073128 3073473853 +1980749010 2901149317 +1145437952 1597742796 +1194324083 151677680 +1166308937 3095803128 +499890794 499890810 +1016080745 1991183054 +281980160 1968854789 +3863141982 86116457 +1957514015 1957513999 +455417977 228982878 +2077875383 2077875367 +4288823788 1483589249 +2967269802 365981325 +2612023721 2612023737 +2903243491 1289483100 +1392154937 557844254 +1713391481 1632767870 +377829922 785979727 +3969712583 1110035520 +2063817990 2890625121 +3910742430 885018146 +941917011 3027942316 +1374249511 1523437604 +2600274529 1566004896 +2797072283 3990301000 +1832245511 4072973846 +3037588521 770360462 +1840930820 3227854409 +1669285770 2137003763 +4134272752 3691140053 +571785781 2891508092 +3909909321 665195495 +2934841199 3487267758 +1557526018 651314467 +3900249369 261895752 +3309953315 3058526748 +2378144349 2174746740 +3298053760 4147987837 +1682340741 1609855578 +3857384821 2984834828 +1016267066 2119506374 +2002792741 292379948 +2675991576 790467035 522025099 +2712931699 24194060 +991729550 1185636801 2772788748 3233464488 2393099170 3328110906 1945965705 2183768537 3205143680 2745162037 2005013979 45954314 520572345 1084424835 2701661564 918951193 379753938 3382738754 +1963234642 2285309967 3514981067 +3744963341 751616626 +1650935729 472077997 +363125539 897906698 +1093596629 1911357020 +1255388105 2487485816 +3313982537 286367164 +2548963022 2384563801 +3297762912 817626427 +2049013719 3584367478 +1858170039 2576532771 +1346707960 4038040620 +774299730 1585254637 +650424066 161447989 +3566859119 492451768 +2704269315 577393639 +2171624515 1351862822 +1861555646 1775319583 +3317132707 2665450833 2052792917 3804338076 +3429436469 3629202381 +3044314678 3699105543 +1895785383 2592828836 +1484822546 1851453101 +3987508922 3768889053 +2508370783 3149946504 +2852334520 3317565434 +4050587277 4050587293 +1995451505 2903897584 +689653957 689653973 +955624911 2184636428 +191335154 3858742003 +312215321 3297957865 +2629863387 1067203294 +964471778 1631753411 +3009231570 3009231554 +1360315415 3132141606 +1374853264 3478469355 +1668493498 2094794006 +1706538758 641015415 +3974727986 4136573721 +1613846670 2531450770 +1328761862 4102311236 +744940054 1260207841 +2957123058 1779770355 +3645512297 3691190228 2292690024 3645512313 +1198337414 61525626 +887945565 2920058210 +1008938929 2947923629 +2624997814 2624997798 +2348770625 2508424806 +3647209873 3379459920 +2768883166 2892960873 +3536987085 2915982244 +15206540 15206556 +798074231 798074215 +1270870083 3984304662 +1022884161 995975488 +4099400635 1633386340 +1949889711 2762551160 +3496948329 2037627854 +1730091868 3666437299 +2487562394 2487562378 +3427972048 2218584107 +2824174999 890799095 2358754758 +3692390657 1991527574 +3527239642 3500833853 +4025962640 3661641308 3200969979 505253761 3574995442 1341985727 1521751458 266082927 4165443576 3599888516 1774018574 2410607618 3326520538 +3391579632 738556117 +3473895740 281281776 827277681 827277671 +1662981398 1625782527 +311532828 1463440135 2863866269 1463440144 +3111836897 3714692662 3278493457 +4278136071 1924391446 +387662370 2179537813 +1380177274 4207480605 +3927826230 168579329 +2694046635 1942971956 +2051593840 4037644885 +930988000 1891923071 +3482032512 545134572 +1088985658 1747634507 +2604916336 1756865500 2604916320 +799322883 1694978877 +1948124574 1765988265 +749924581 1118910586 +3212071542 3659386833 +3957066906 3848787581 +3780156447 3504719070 +2526849253 3652150460 +2004072794 1697433789 +4245111541 483209370 +1983618427 2597906610 +3925137218 3279354560 1624009661 65717587 +157273014 941315082 +3161888383 766437886 +3982455468 1126431703 +2644818713 265230851 +4175033947 438227288 3186634356 +2573672228 2706769343 +3131899952 678165405 +2525795714 2191257870 +2016508029 3001068738 +1789611672 1940693003 1789611656 +2703598374 4152102513 +2230972485 2591374476 +698320586 2758165194 +3847673189 1823600108 +1681514431 3302736747 +2479081427 2291129389 +3095163260 1159177571 +2410694446 1619004783 +2198159789 3997590354 +550574044 2234027847 +867214367 2115132638 +4031196535 4031196519 +4286782003 1851932236 +1591486674 1207072185 +4157281897 2108966744 +776441747 1780036619 1839662188 3961302146 +3519844630 4114089441 +4014433010 3830642542 +1557813943 1322940158 +3806634675 3753250336 +2323163316 2951844687 +3592648189 4231587746 +1588527652 2517959695 +3576219554 825377813 +3609941489 1553800833 3609941473 +2944992493 1102233883 +2387456501 563525516 +2295951867 1766747698 +2609211054 2164302831 +1276243490 3795443587 +336295141 3192693888 +3766703876 4032730104 1925315401 +3728946124 3705106913 +4022932224 2039015699 +471695481 3144760936 +1810587596 1127306579 +2621816299 3052595224 +3471634658 884898813 +2241064901 1585130401 216167180 +114653706 3423542701 +230503589 1171906476 +345454780 3649558640 638472177 +3613888480 415943341 +581892316 3070430540 857007505 4209337168 +4260177226 106017645 +2597554405 2597554421 +2074086214 3807493921 +348795567 1766705518 +4045584321 3172928359 1520911552 +3271090238 734593439 +373770756 1597244011 +219482882 3286528778 2585809955 +3130118205 4144694175 +3967686125 930907154 +1621849980 4031120940 2973570352 2973570343 +3895571886 876675321 +2741935843 707010396 +1137982268 51986289 +4116876543 2409322760 +3258610064 2012442452 +3679183120 772118996 +3753670332 1567413109 3753670316 +964088109 3003867924 964088125 +3337482951 4019531606 +1508543543 3275405958 +2150816705 2433740992 +2549688425 2788859214 +1354160541 988679060 1488730607 988679042 2899874356 +2075637017 133327644 +3931010776 594336881 3089648171 +3419647895 3419647879 +1058704072 1058704088 +2540772643 4109534374 +346079940 3684087848 +4250223601 3678125185 3191469158 +4278584613 2608470316 +3473754431 2745115905 820661812 685312252 686432497 685312235 820661800 +1332152159 1485728609 3397598671 +1259213937 1885749526 +3617553261 2434107844 +2006883430 3031446657 +1363918536 3258799307 +3636558644 1821700825 +3438896225 4250528499 +1651979536 296257571 +1063757896 2712094611 +3365669059 3756266801 +2898322005 614682362 +2162544390 2983041507 +3635239591 4288400088 3219502313 +3164515965 2518519796 +236653509 4187195148 +1041310758 3673941953 +940144953 1877595326 +2434631939 1954459580 527344871 +2254781619 2254781603 +2066082083 4289593884 +130788880 1436746531 +1053732301 1053732317 +2865256197 3130054015 +2639924498 927853485 +1945664594 3794515219 +3097571307 3486034456 +534934514 30325649 +3900372037 4105802051 +4277731247 284852344 +212249350 500808277 +2606612074 1196568574 +1907616888 2265346219 +1949466674 494915237 +4086918554 4086918538 +2384566102 2236380653 1393484497 1850626565 1555686506 2822388531 1906240909 2385412953 +2794815254 2794815238 +1323434812 4223002352 +3948730685 3223976724 +1997045738 2487611382 +150294231 4154828874 +1067184997 1287582934 +3280999496 600829259 +102318023 1623156310 +443341899 443341915 +637705251 1119927558 459903073 +320373196 3683931169 +1023518774 692306433 +1058376417 803840054 +957210612 4166196808 3302460697 +2132724575 3263837887 +1610293982 4132955007 +1862257363 2410433068 +4099893488 2721198531 +2781452296 1999844148 +647659052 4046757719 +588624863 945620124 +3900538403 1524330256 +2973963389 2308522196 +297998147 958242410 +3014269480 4240911613 +2898577303 2428908198 +1380087896 1884115940 +2175579696 1390595477 +1864532841 1549065806 1549065816 +920962582 1600635617 +1566785891 1715465930 +2180698041 2180698025 +1434319213 38774418 1097026233 +3491742347 2767710524 +1228568176 3070784067 +1227876444 2962992822 +2476895424 682701395 +1673794572 430673655 +3670562551 1616963270 +2709055071 2421335966 +993617679 4263989489 +3050634567 2236266176 +2137831272 2406571 +2669096281 3397149448 +2720366204 3171294503 +3647341723 3600367620 +3565126971 732167748 +3777437831 511120794 +3290977302 3100750598 +2819612115 1677341484 +2673310797 2673310813 +1816584884 2710381728 +530828029 669305844 +1548884600 3443501819 +558712795 558712779 +366411299 2222067978 +2159899442 3694942131 +3385836159 2246077527 +942638735 30462734 +173086885 3802778554 +694762446 860207961 +180286771 496762714 +3239644474 10559126 +1639071793 3457528513 +1584597898 2745909344 +2075599746 1129112995 +984392516 2988792367 +893083892 410453855 +1008257270 1960920522 +4020958690 990939389 +1514072735 2953533534 +3725660780 1704986579 +1268801649 2121781744 +2869815363 2036569574 2397713968 4257544449 +590904289 590904305 +1737692748 4178378012 +169363371 2402865716 +92186136 851191386 +2715579746 2715579762 +3394136981 1234770477 +1180940447 3610458164 +3007824062 1808044987 +1186877395 815245612 +2256643079 1147509568 +752298912 3630230552 +734140947 227406679 +1941925142 1941925126 +3348562164 172730207 +953094248 3589723051 +3199427912 2711288958 1733282303 +980005790 2456142271 +1564692263 4160068214 +1420751709 2892569460 +797155311 668501525 +2565741102 3973264998 +4224027999 4224027983 +3218249671 3213160000 +2789973946 395780757 +1274936580 3033884271 1274936596 +3316064779 823826242 +2576850472 1910437461 +2105780980 3311493471 +2541745073 795647910 +4007698114 3449416565 +1948679871 1856523682 +1712775966 3557263423 +3297015179 3884255682 +4149574869 698745111 3258428780 +1849047170 1849047186 +703739868 3830312775 +4125119614 591575945 +991573654 1911547745 +3631050033 3846366246 +4074823565 1893653234 +2709349596 1949777041 +3514698577 443273360 +1342593226 2405167558 +497296722 2967654470 +458905596 2608548780 +1710712448 74865541 +143420669 1823861393 493502753 3498262004 2695403555 4273490513 3149980944 546990805 1913623124 3870827659 3622038736 3498261986 3887605265 +1481749156 3807144079 +2376403298 1556989251 +1822498899 3911437940 +1768472717 2095521252 +92406081 3798827632 +3040394932 4233377113 +1476043014 2240511073 +1873742351 1739854321 +3590448242 1459265381 +3233850106 1765838731 +496433253 4188604154 +1606114833 2751572029 +793543774 1256728538 +1871435163 676244591 +4224121076 1312417817 +400399513 719160520 +2443255969 2934251718 +563647192 563647176 +312509310 3799777950 +2807586634 2017219762 +268482530 320960707 +2594258447 2060759438 +4011954119 3625626184 +2255819504 675389449 +2807846459 2975579876 +4119197398 1474532071 +3312983752 2753066205 +1422653129 1175813752 +2427629824 3377242892 +2036109512 3129391587 +223772953 223772937 +35103050 35103066 +1443256588 3324131639 +3140719695 980644507 +3685631578 230013474 760790955 +710482939 3007084767 +560296297 2256114382 +3735692043 1334942716 +3289080548 2179771625 +2079343164 1463305319 +1658597175 1768355529 1760405843 +1918342541 3075178725 +2304008223 2416938038 +2751558827 3936801568 +488038790 1692829983 +4215609605 3897400618 +1382275333 3090064076 +1858690941 3825291732 +4244116066 2823174506 +507506248 1901532003 +3592471895 1821812710 +3584630827 3775444047 +1254244350 486138197 2949250402 +58931454 2240985033 +3048658105 3352354600 +838747298 838747314 +1621446841 2260224670 +1821011523 552309628 +3992328428 413707287 +2510308827 1716385746 +959964482 1425925877 +642847408 2827524184 +4271846413 3785289828 +2507238081 3109452903 42667456 3605448678 +1860122795 879113506 +3299690835 534230084 2072333485 +3827156621 921672165 2816446450 +1565365914 4192307114 +1046622613 3725676602 +419394622 464009997 +238679637 3124676572 +4148105261 1699116740 +783520813 2577351545 1320630120 +2958845020 3413179655 +972002289 3701900874 +3319740697 2540102216 +1529761239 4156840788 +3585580925 3977253314 +3769408704 3147176658 +336810729 2204861656 2204861646 +4242987741 2957637297 +2962937675 1321265922 +3696765260 717816481 +830746651 3009060296 +1255076836 199535576 +1173452460 3340619991 +249913342 1897274569 +3547572719 3625902348 +2727835489 1433464246 +3138724297 3200128050 +4119146788 2762759081 +880097546 2659764909 +4286440967 2605754116 +367606254 1814442415 +1414196770 830202249 +1007285421 816589892 +3514684629 2652244810 +1818730698 1898061307 +2108823140 1129922431 +2945645927 3412388150 +2648892899 1865409610 +3115869755 2731546427 +3320276561 3695579536 +1935661794 2179305923 +1794548466 1413645043 2545165466 +2211261401 2980333839 1723755198 +185296583 703777600 +3417501049 521593973 +4082255501 2542079972 +3438771808 161214757 +3989390480 434032372 +2407302146 3808677685 4105292493 3137333150 +2299907012 2437924233 +635214184 38108861 +2220482698 2220482714 +1342674790 1643337118 +1272982791 2028397078 3145532526 1400227332 +2820640366 2390036369 +89877729 89877745 +3885065347 216087100 +2752172091 2752172075 +92289618 4208709381 +1891628081 2938988838 +3147121661 1224345428 +2063696416 4108429036 +2045615214 32122079 2224149156 3695724287 291109221 450459784 46181025 2404514268 122582447 1923071028 4059991983 2090380742 4263834804 2452055568 2616862109 226517795 3666501745 2019483736 134433537 2950937375 1086316158 3769089148 +3335828704 3772300453 +461682244 164832559 +3996145302 2350403111 +861895490 1382743370 558827765 558827747 +3446552108 3569930512 +3943734483 3943734467 +2699138262 421350641 +729829627 729829611 +1374523851 3288105620 +1247378184 316452235 2807778529 316452252 +4039208536 1484829851 +4227628347 3917030386 +356101022 11319209 130623935 +2796774902 857216449 +2862662375 2182271414 +3144197299 3144197283 3099280858 +143928166 2705354929 3879752087 +593208100 1429970504 +347397479 347397495 +2336818711 1594387860 +3191046026 4111582779 +4008500317 4266549604 +2146594958 4171706265 +1193561195 1212249671 +3515878452 1733149855 +1983253386 3451812581 +2933990390 774462493 +893515866 3390983793 +954922904 2442184749 3185200780 3047744669 963922439 1929415253 +3837888947 3484140748 +1884264846 1531886233 +2267262434 1396965629 +1733781112 647384827 +580318002 2066981294 +3745337768 1633719765 +3766781460 1063813480 2225017209 +2436919102 2436919086 +4200316903 91166880 +848490866 257037925 +4025097143 1686741254 +995310983 3943291776 +388701614 355470682 +892801309 2163725662 +1033219827 321409222 +4235247255 4235986854 +1597673139 1597673123 +3446803305 3548902990 1292418254 1218672703 +4113287087 4034675948 +3104788126 4044931753 +3683940743 834359168 +4218476646 1628374518 +2086680943 3362063312 3556578065 +616750443 2437403535 1237487476 +393312723 3131230010 +2703178804 3626747344 +979382660 1768813257 +915697739 915697755 +241706807 4275454900 2842317929 3841309574 +2270753610 1527184749 +1662981403 1265162107 +4208036364 3822866657 +713757415 3756966304 +2514162878 2783029001 +721044025 3774234558 +3518235300 1259365784 +2895157701 4238294156 476573779 1240000567 1350675392 +3887496092 1615107736 +1865736389 44239727 +1665825841 2048806593 2134999334 2579490871 2048806614 +3182448251 773477573 395021220 +2606701758 1421491999 +1082867055 1082867071 +701722723 2047754326 +210228410 210228394 +2729862220 1897915297 +2289078140 1160896561 +1930933897 3075758510 +117466067 3365735402 117466051 +2246963029 714064604 +2627425716 2734025224 1015540313 +1276404927 182341756 +3139758002 1293466931 +4249641996 3642407991 +1418037054 2589039906 +673309051 3643368901 +1304341568 2664115724 +2037457267 289245943 +2749076562 4090234878 +1779960030 1779960014 +1811692690 2417187279 +1119787757 4279100164 +4180261691 2008137188 +149802860 2721810071 +1873080205 1873080221 753494757 +4232853976 719536620 +3854995371 1653877300 +2171627010 1320600422 +2785712093 1068306676 +4047950060 3282692070 +2641728568 2256593183 +966997992 2412175569 +312540721 2727190742 +1291711717 415794298 +2086165919 1578852702 +93804826 3879814141 +3484592638 1581696717 +2872236885 3289149421 3591325386 +12744055 2837375558 +2760649425 3651626758 +515436590 1974236846 2334267503 +4257014978 844897635 +2515528978 1502006202 447886163 +2233567544 2501104897 4278702282 2598447106 2237140272 2914557845 1094078616 647159481 3074200398 2342281912 3550712564 1181570700 +1164948437 601364572 +4154960007 4098893529 +2932287184 2932287168 +292063222 2375485399 +2441680043 2473131214 +347634346 2506929265 1214847373 +1860106364 83962673 +2406495340 2382162892 229510149 3151557527 966952471 329592956 +3854982148 3141720649 +794410019 3703364871 +2932207765 3063528074 +1560984083 3066943258 2402903168 1532592494 1111201395 1228644743 +343708696 1478304205 +2016489605 3127861594 +2889776174 3272168386 +945873142 2514323649 +420183255 1142261350 +2154337718 3182048915 +2748187860 2703374132 +1189809557 1724639006 133773247 3046377501 2658211840 3559416972 820447973 684442438 3100024243 3695146386 +647384828 3130939047 +2724310158 2556918287 4223282764 +2481079887 3203298458 2002221233 +3123525982 1932611305 +3706419352 1513942579 +2015134612 2833457657 +172488429 2785756217 +1619245907 1113580460 +503159482 4030370525 +3861199157 1844555994 +1780123435 851626164 +1285016256 756273018 +4008883939 3480958407 +2486075914 1328985531 +299511062 812972465 +3819333404 2062831889 +1643485714 2621265822 +305676026 2827690909 +2123028923 2334945384 +2491376213 2976169367 +158367907 2132443292 +2774671264 3685954044 +338996902 1961815873 +978665501 4046712226 +954538433 1369934528 +1899271412 700873743 +10761586 10761570 +2487853878 2783702535 +2724750791 1184585881 +907916693 3739382828 +3936762124 1873530359 +2885104006 2718512081 +3052849016 3601866103 +1811908506 2638378877 +1338417952 3048393587 +1984841506 1597635203 +3332531455 2075847356 +1209087148 521530056 +4151235426 2096456299 +1332773392 2001978580 +843763765 2584198992 +3019952637 1514836290 +224182615 383564483 1610898416 +4154776772 2422571422 +3000132261 640764346 3385067769 +843311885 770377060 +2987957205 2987957189 +2993145195 1146865506 +3236116060 491074163 +86575371 714685506 +258607745 3303966998 +4024723797 166512408 +1563078019 758064444 +3970679507 1701032485 +2993089258 648478174 +176401253 4064727034 +2811231150 1974022895 +1853355263 955447996 +3492621324 1709612124 +2184556112 4069669138 +3032965410 1809369217 +1874141377 2602733504 +1301437496 2657782468 +3970356818 1748301562 +3457091674 3148490173 +1651844087 773685591 +3880604591 3880604607 3451567214 +1165729424 124037807 +3433048597 1833610996 +3786350716 2316617672 +2069186177 4019546534 +1174430835 3287156192 +917798263 2784087454 +2832619471 2557229784 +3458361914 3123525981 +3940167684 3111753311 +1351360674 1837175662 457871805 +502778443 446675822 +4116732277 2601544474 3148665660 +3938451498 1409817318 +4186956219 2558548338 +900364554 3426888199 +3546239454 2634932351 +878912670 370320553 +1558202311 1558202327 +3565262709 763024746 +1617162096 760343875 +4181239687 3677337984 +3428571299 1469450396 +3553601858 3553601874 +4078453513 2352619599 +2914668648 3830223787 +2734818328 3022811597 +273833407 2066851457 1890161598 49508732 +2010426593 2227971638 +3090896994 1735139907 +4041509695 1574272151 +79632594 1255412371 +1145066714 1145066698 +287786543 1105995628 +1053188001 1934133856 +2230316143 3437847104 3375469783 991099614 2755032297 403113065 802494922 +2600560731 2433034700 +1736414530 3894418616 +354611709 1124266324 +558916521 3415111000 +183191956 2454166388 +1487798508 1386664961 +1650009437 3860372820 +147913399 2832115946 +568878887 2279236192 +1796530254 3755809497 940651470 +266515607 2564966822 +2254380442 2236777315 +2645693490 1901447859 +919737849 3869057899 +3294471217 2102367376 +1362809607 3868865558 +3501889913 247437694 +315945254 3409419998 +510149013 1931427210 +2329395250 3282276005 +2082619859 370250326 +379229809 3875246849 106615782 +1180112838 2165992609 +2140647277 1221142674 +401114230 419988935 +1818818964 1713823977 +977980135 1145957736 +4257315851 2904698678 3065070670 1626581341 1626581322 4200418371 2190886210 3738519362 +2925558818 2925558834 +2292452577 3298102174 650654231 2015852436 1053867066 125794472 2205055419 +2267642323 2092403264 +3648826141 2084658868 +2079286233 3950469822 +2343215126 4086956721 +1269244497 1763378566 +43043582 133139913 +3411259623 4000292083 +3793937833 2783938840 +1726418810 4277244965 +53292035 2709946343 +2997775298 177447523 +998476356 4094863647 +1260642784 696030117 +75789226 3330413723 +4011199216 4011199200 +3138483759 3247654263 +174758005 2689222758 +1239012528 4058632469 +2427066112 1241514296 +484163857 2605076150 +2548638011 1593790450 +2266930154 1322405805 1612150464 4071584339 +398059709 782532532 +3010130994 3768711131 +730009389 1439822623 +1947111843 1441743754 +4108750735 4108750751 +4118434983 378749686 +1037633588 516792080 +3658442444 306107191 +2549596048 3405942709 +2699899124 1231294489 +2873117097 1247897792 +3719885679 2032613294 +250503833 440743624 +1532802028 329006848 +4020466080 3729514227 +3505100741 1486014109 +4003591411 2616498828 +3687539865 3687539849 +432940805 413874287 +620918976 48502355 +3834705848 2285237933 +1940775885 3464061819 2172393778 +3294460693 640251322 +3357927104 3357927120 2047028364 +3647935745 1256067200 +2240783514 3676315243 +2947927993 935868375 1833804092 4160697739 1524764818 2711735730 +4096519702 1999096999 +1834653142 1834653126 +3464546667 2393220587 +335909935 3016246776 +4215834723 4130255836 +3150808366 3532171119 +3443411002 2580178838 +2633046964 3469252599 +994405126 1413970529 +3322528622 794732079 +3667357024 2086743589 +3896708263 1217194742 +3505507153 1034096784 +1323702523 792285997 +165397289 2107084159 1702271630 +490857195 4189599714 +2952671381 3141020851 +1475879872 1000359763 +2507832604 1808986897 +52895566 3348302553 +1516946344 4262592893 +3260683402 1188047845 +3918347601 2761623117 +410282312 828450249 +972833361 1556011429 +1114963976 957405987 +2720301015 376782694 3398622548 55585609 +869226183 1449499478 +3378157457 500321411 +3965264992 4188386107 +1110502226 390192299 +2695779037 4087487787 +387778142 387778126 +1150066318 1959484386 +1214538473 3741824216 +3172485899 3091079746 +1416005418 124176141 +137695 3796810270 +896449434 67524529 +4029382245 2037905644 +3898955496 3213348651 +1907369738 1525596773 +1912557728 3021252900 +2604159688 564809931 +3542250002 2426493101 354172734 2426493114 +3467711552 2697126099 +611550124 830789428 +1642312234 1252006081 +2739917985 3081484662 +1037639168 1556756997 +3919777720 2209463981 +1705543588 478018084 +314643469 2645182617 +2196327442 658686021 +491553928 2828589534 +3565092137 990595237 +3903349085 2918533000 +1617866557 188603650 3026381365 +1194180707 1879432138 +2962604102 1102949921 +3215712860 395663047 +1913700303 4175776282 +1637872168 1637872184 +1280757964 4171936033 +1159877797 3652538845 2047557562 +1487454395 1286039140 +2129801289 541197048 +1195271357 3828913556 +1083383706 1100660587 +2650779857 382020285 +419399408 2850856072 +234400315 963902180 +3925611214 2332176466 +218723609 2665698888 +4081009231 4081009247 +3674962547 1175569164 +815169526 799129537 +3936437243 3936437227 +2107108237 3047872985 3572822152 +3997133908 1061908927 +3757372589 778881902 +2553067177 929270808 +4246891875 3761386204 +537306092 1450445975 +2785262604 473814071 +3124557150 2348172031 +2516697655 1539619984 112514723 164346022 +2389450758 976644449 +4271426437 1334338138 +386485551 1189070237 +823487242 1320648877 +3427698959 2929836686 +3287104430 1859411738 +3643692276 1679827447 +2896614746 614587581 1439588642 1439588661 3000573942 +3789986624 1225930011 +1148790403 1303879722 +1949643126 4014968151 1706876113 +1744241236 705919127 +2702878227 2951966700 +200768684 1000124493 1235431448 2700964851 3920008455 3154072731 3855245055 76053401 246432156 3063321413 1884017577 1907820065 305140112 1166178706 2522340435 428535563 1095460221 1991829088 1358280421 4083550253 4214880051 358144263 3288687125 4067583865 2923687855 1035958961 993360607 2857401120 1197027754 2640199831 3726752170 3095884327 1689305860 +3433405253 1265994090 +2296865688 474073179 +4896076 3248187063 +2433287440 1630730275 77276628 +803636569 3301646398 +4148679588 357002449 +3613279020 895729239 +1624134770 2797798638 +2011951137 3916104694 +4280250383 3026850907 2910676888 +2582912988 927868743 +1406216580 4137347704 1406216596 +1556149491 2266508214 +905748478 4205829343 +1855736410 2047413181 +3269809551 1577431064 +1110959486 1534700947 +3463194152 1977269845 +1842898009 1842897993 +78316793 78316777 +827569175 4096116232 +2411462522 2748311637 +3118948451 171752412 +3451718299 3451718283 +2661931063 3659652276 +3302993694 169913385 +3125531473 231722647 +2055953389 3596727826 +3118280808 3118280824 +3588043940 1329192511 +3069417873 2457517904 +588002256 147054738 +2043018661 1471040186 +3197266998 914381063 +2661866430 2178018313 +688172553 2606626872 +2131125505 4161863839 +2422863476 3704707273 +1014497124 847335268 +1970364926 3749528259 +3705574648 2858713723 +589840787 3948886636 +2728503198 2725961151 +644141749 3021477916 +3651619552 2186993317 +4108809346 173828259 +1930891144 3041751837 +788181177 2541529758 +2333683398 3198460343 +1473551046 4135706374 162506167 +2545238022 115748002 +2340831216 1432918799 +3886679303 2411722013 +507768418 792425853 +1564754836 1719034361 +3764981395 237964544 +2334825485 2213686130 +315832710 3719232468 +3067205717 559386058 +1057590408 1462631088 3052632995 +1706397189 3256818737 +976945312 1256324069 +1253451377 230589424 +2240380008 2674841533 +2449824640 1584335507 +4148372566 2494706535 +2945961834 3052442066 +2386696561 4150192798 +722939908 3655626308 +2694549041 98621232 +894662377 3680776408 +1718101759 1058096167 +330660300 3534666807 +4228224254 3133770697 +2285846743 4035704894 +4204019579 4066373284 +435463643 3072399300 +2844682804 523317209 +2644599323 1495801800 +1637107314 3701499999 +3784643620 1101968553 +713526473 3160580216 +3237810997 101583440 +3443255401 3443255417 +3649195494 1310761217 +543318814 3349493259 +2897801609 923295736 +3226720175 1929152632 2072696059 +1515630907 1903755250 +3264329403 2052006788 107128941 +1273697640 425245604 +2409962946 3807238261 +2873514773 3032572426 +39488769 39488785 +3203565135 4203594906 89452006 3622378297 222919167 714915890 1676619557 +2770195037 1257384052 +2367019251 207914650 +1838190137 1568895285 +1075382674 2036994259 +1513885879 3280883718 +1675421011 2277310906 +2114350394 874802179 +2997235307 2795180642 +2968009630 204175690 +1590598285 2055115854 +381753946 3916869155 +4060384722 3475718533 +728250662 2064774849 +660892784 452562293 +850254419 523269313 +1713535955 2479704419 +2194462628 1225823641 +3785965027 543976522 +999495598 1989035759 +4105836961 3791018097 +1668197320 1329097675 +3556417881 969969993 1860243032 +3791779694 924353081 +739339311 772914555 +1754682324 1754682308 +1806389291 2846831522 +2224714218 2591438917 +1738113323 3633723601 +3194408800 467170355 +1936428760 2320621069 +617170230 2616537619 +3605971269 2665103244 +3914834916 955711465 +1061959215 1061959231 +1788792693 1291883818 +1988530308 433422281 +4045741276 2037149255 3955670831 +2717331680 3626102963 +1410048043 2035098530 +561811678 870137599 3358347010 2501381481 +1691064168 343890100 +606693936 489826691 +137353774 2744106378 +3918621799 941392996 +3987276200 3987276216 +3951465055 2182932309 679488203 567100018 679488220 583877640 2820643173 +1957547565 4108647045 +1636049926 761901218 3578081148 +471519104 3191121561 +1989927766 1989927750 +3756784227 3756784243 +1436023367 103381888 +3669193625 3669193609 3783195080 3783195102 +422208798 3234840347 +3421385817 2134271445 +414983481 690919592 +2739894733 3810311588 +2829738156 2789972417 +1843155391 3104634838 +3160563952 2219981798 1097803127 298320904 3622672909 2519779457 1843606587 +3693199810 3829993686 +1948132907 4134933922 +3036425061 3036425077 +3748390222 1914978510 81394127 +4264302682 2037011883 +4263956816 1729855733 +653615805 3123546530 +688029472 2934841203 40078973 4191614382 +789195277 1682927566 +3710114149 2221881850 +2505901344 1097798003 +2749218075 286306692 +1054128809 2827422501 +771991965 214172212 +2214389303 3079358825 4263405702 2581502644 +792188311 3957669040 +3479629139 3523713452 +99952809 166658584 +3540800710 40465313 +3485490048 4152163563 +333267324 2330788356 +3239746682 1994675211 +213080999 2528634114 +2682045440 1096218522 +1704218114 3933654325 +3168537563 4036837256 +4099148019 1468526647 +2993241484 1739318113 +3638795918 4233271705 +3455659871 2944773148 +45766977 2354741590 +428012697 3257339080 +1282301717 3384736186 +4080184724 1824997359 +624118719 400329473 +2467621989 2365644629 +1896233786 651115613 +295738871 3067653072 +4139476063 3908211830 +3599579237 3063298973 176150151 +3907937759 118621834 +2728650679 3204826384 +1173810076 2712954308 +245787344 3757712739 +4143697164 46626840 +3535955521 151451734 +168431212 970241047 +310776605 2128205040 +3748165846 1215523946 +2899716473 1831727710 +1176934984 1176935000 +4039494933 476174364 +2941370383 212948888 +958520605 2847534708 +2995991003 1289213343 4172774340 +3479338738 3685743624 +589357413 1165379447 4278143882 3484454044 2397919623 2859227392 3367010704 3484454026 2982334956 4074989987 +3527834949 3674970872 +2808087803 1166246692 +41781602 1302283605 +3305719044 3420425687 +4209466902 272178343 +3960603021 760770788 +571807953 2016809222 +3891084795 3891084779 +967466306 154193653 +812750599 3861429389 +628038402 4024927285 +603654849 1697770944 +1424567800 612110981 +823687356 92671975 +1485329014 2082611539 3566850001 +1182312987 1182312971 +1397095773 1949161826 +4250663206 1219709116 +2096215393 1129685894 +3670770358 610190471 +3095941066 1217764077 +1240715842 2899574261 +904993757 4139647019 +3228744836 2867737967 +3925837759 2085575537 +1077977115 3600817919 +460606305 2568137120 +3854776658 72563717 +1221871733 456003644 +18333463 3356027367 +1161247660 662766559 +485296461 3592791076 +4141883636 3542826785 +3132136124 2684589543 +36808357 3191403363 +400832322 3728932085 3728932067 +4190659017 2388388408 +1166729343 4171196392 +2161267026 3702024699 +2118725508 2695979129 +2817003005 3453594104 +2072872306 4056486501 +2288635223 2288635207 +2453613305 846243317 +2623849917 4020455572 +232532393 2056623374 +4129231682 3035320565 +2973240697 1950168446 +4214380838 1634645095 +2284621491 1401995213 +1181136018 1705918917 +3106031904 4177727640 2432245093 +1209648626 3833033182 1922210789 +430758394 3032123093 +2030144276 2439901295 +3770541988 1861461823 +787666617 787666601 +3963748650 367514893 +3735822956 3735822972 +2597314102 2597314086 +928152905 1608202744 +4209383647 1333618740 2481799341 +2341543184 3312500789 +3643036942 3794920729 +2370674207 2370674191 2419059400 +317094832 1892988419 +3043916222 1525261855 +280549940 2264891343 +3346957656 975217319 677383414 +74892363 467158382 +1559377916 1296966055 +1402181819 1280929400 +4287914790 3907449947 +3525747633 4039960167 +1595469487 1665121646 +2664714226 4198095333 +2621308043 2621308059 +3941824431 1296268088 +1121978933 2075136362 +1049931280 1259279032 +3231426430 3003689801 +2228760896 1805957915 +2248789711 2958947889 +4168293990 2201541271 +594979411 3263000278 +670736219 1250483282 +4268953150 3259836962 +1010222335 727075499 3375897960 +479067839 2761547857 +2404157995 3113430607 +388971154 577541435 +3415298654 1875491554 +2529535828 2904975663 +55352228 2643840075 +142683393 2339368410 +2407985098 3144383213 +370359193 816719829 +2564533097 181327438 +3960697016 1243671815 +3988539229 2623821684 +1387294869 3233888924 +3988725988 2546898443 +2256629060 29295113 +1827571180 1786732823 +2209753110 1841371815 +3102415146 1142463771 +3323160152 1584067044 680139917 +184857914 1596151446 2456373853 +1310274421 1722548540 +3129183715 2149080138 +1707501522 1149150330 +3072807557 3622233932 +897040931 3119076103 +813168426 1994004237 +2768175991 3761052131 879916112 +72767649 1241951371 +3809503913 3161918061 +871815820 1845509084 +708912934 1420635173 +1148717385 893033902 +847468099 3619742906 847468115 4034941991 +2242864476 3673581063 +1514989980 1042208140 +3687856918 1826189003 +3508352464 16496227 +1848714463 1448938270 +3176427598 1508690639 +2637503308 3331979425 +2829977737 2307182318 +4138487731 71399116 +2445300728 1774464877 +2224984086 2224984070 +1917720569 1114014664 +3289592963 758884906 +1410330052 4172325534 +539958263 1565934566 2408855895 +2274621843 4146032482 +4226817597 3623852564 +2748759246 3104520262 +2392440162 3724878165 +440673335 2411684245 +2598012510 604079593 +1937217655 816068340 +2870733014 854558961 +1263388171 2934514571 +938447064 1324964391 +4191074737 4050538918 +1639388341 2576957 +1089807267 1714807418 +938685385 3705308519 +1630884721 3095730198 +3097702427 2513558067 +518263696 518263680 +1980239278 2530423048 2091747577 +3078593290 2680633880 +245431951 3515626353 +3549589823 26860801 +1198978358 3057910801 +938022461 1089339906 +3364618317 23361828 +2590578623 4075405768 +1319341631 175697192 +4114513448 2607001898 +2717214808 318380353 +537845519 2159447422 +443251168 1189725371 +1442630975 2919116010 3508581453 +2221995012 2177901129 +3665608530 1147219475 +2696723258 3994446339 +3887885762 2409678947 +3840257486 1269071183 +2449357367 2449357351 +3075704596 3075704580 +2617605079 2012363075 1939993456 +773620500 3547931271 1759965063 65324414 2173950394 1497040496 +582911655 3936279431 +4098059811 3676276125 +3227338869 2104328073 +2039272641 1252606438 +2887163140 2887163156 +1980397318 3631832673 +2179983275 785443181 +1980418593 4093391328 +2574443448 1205631661 +3284822219 1007024693 +3681184655 4152840728 +1899099983 426993726 3707242303 +2672802225 70632019 +3403174878 3949869545 +3162673678 3482053657 +2800897842 4202973901 +46147422 475185918 4216256895 +2262388245 2474705068 +2590960945 1113997120 +2807948491 1137650562 +2678146950 3504576481 +908350628 2139411516 +409093057 598780118 +228050187 1894461506 +1901868694 3961485426 687163250 +1252273445 2921602653 2775781690 +2885279764 3462119289 +4263382841 1588639336 +813542424 3032419748 +1602635703 3970870039 +866223424 3057659661 +3209638507 3232239277 +1637677537 2333957408 +3186811351 1559044663 +2550297131 3502202027 +304589193 86104057 493871790 +447626829 1296831291 +2717518415 1268660814 +1637205964 2381542831 +2956066427 3652426660 +4011303593 4205967829 2618195834 1268574965 1019452528 4252527593 291995069 +469773175 2336517190 +1412491144 284982045 +3755462738 2998726917 +3949839430 3821795895 +3134287402 1102081037 2059018319 +759126358 2428084849 +2444877242 3750210593 +205762339 773596848 +144716990 2236888542 1379075871 +3633772041 4030865845 +2128390276 3618723904 3618723932 +3063886840 1289158522 50366611 +163281631 2228164614 1163907813 1630643082 824339742 2334421549 +425102193 1413317360 +2292469583 2899191194 +1311260161 3775917350 4162592807 +3205049444 527491455 +2897228704 2036417779 3258790649 +3535839341 1111270612 3535839357 +841989787 3634434142 +2817801079 3698957401 1226638121 1668354548 1372765839 3698957382 1828660949 99638251 +2613048407 1396098782 +4082669527 677431351 +559678451 1994012570 +161999937 742692107 3064295124 1004203645 1215126370 +2681648740 50405225 +2584298838 3968103478 3533186663 +1192549990 1272584855 +1433618592 1327827775 +1796777892 3669449252 1363731864 1003480873 1363731855 +3408513452 2127067592 +1942214545 3461110096 +2604245813 2428234876 +191373946 1861109277 +1263486928 1573784693 +2202011692 3385646423 +1122909772 2836140471 +4016843819 320289994 +3202156456 502467965 +2257458714 3898562614 +1122153569 2883712160 +1796076327 1122457426 +2388313797 746306755 +2499847865 1608771759 1625549365 +4083196730 2373718166 +3840917597 1393792648 +2242843744 3533509413 +4132121471 4287450863 +1480712715 3496682680 +463778776 463778760 +2786096033 3357291021 +3932525542 3823620865 +2427001492 372140543 +3824785125 3337128570 +374674145 418173296 +856485395 909955309 +2148640771 3340252537 +3255584904 2860697819 937564449 +1521823234 1521823250 +118126073 3540643011 +2637759883 197376450 +971553979 1346748612 4125901915 +1157663616 3746607611 +396066684 396066668 763387175 +1927089102 2835751762 +132390428 2283496967 2283496977 +458542066 458542050 534574477 +272146243 3424827004 +1502184543 1614448924 +1993314263 3059515447 +3989760313 1886705417 +3034651354 2540610431 +907575454 3331487935 3331487913 +1759616345 1948955422 +1658140251 386969096 +584430495 603418401 3087094381 494824010 +3597269221 1842532474 +1524614376 4131584317 +1909217368 2091848347 +2052578825 3088170427 +2352490826 107544429 +3632119539 1151687094 +2364520649 584832108 1206871269 +1148801659 1174198180 3506927423 +1948477895 977343853 +2559851955 3831308492 +1585720366 4161899631 +2880495571 2967456263 +806164236 3231408391 +3504437835 1843927933 +3164451557 3510673004 +14354257 3606357309 +651785295 934842806 +135475261 3730166580 +653063730 2962445470 +1269094007 3871253748 +1653911911 2534622496 +2291424831 1083202878 +3565922518 3597288353 +1644924854 238238609 +236212636 3321657479 +744965037 1512980140 +3274456028 761480659 +1361504226 2722040021 +3863153004 3884438807 +3516300344 1984812044 +2118828771 1176204945 +152266917 4002266028 +3902837821 2590915194 +2754190755 2754190771 +1466211399 3663856598 +1550256837 2453785211 3875089656 993391643 993391628 +1604039000 3659017613 +819535626 1799014022 +622836346 3165425646 +1198614837 2894634620 +1130825101 3187704793 +742071717 1175431866 +2601457157 499100108 +3512343931 3512343915 +2657190246 3989151386 +701663882 192188901 1617958701 +312463095 320575408 +2761021442 4223774324 2052846685 +1622776436 3090031769 +2793014047 823323080 +2083816052 4205403279 +2179620934 613343366 +3362101963 4161224696 +46949550 365067759 +1306539236 2079539967 +2398092332 3383762128 2476663750 4171383954 +448445690 3076709334 +3494167613 2750643734 +739517856 3195123323 +1515641160 1515641176 +3961896267 174652692 +54302199 3830022851 +3845204457 3043293639 +2828704283 2254477444 +1677662235 3394487775 2241000068 +3878504812 1481282839 +1296960988 2380255569 +3784775126 4141309927 +2024317186 2024317202 +1581281256 193494209 +1097867467 1077602818 +1194428094 3505855766 +434387559 692580384 692580406 +3441000697 903774709 +1521292430 1282890649 +1076867073 2524032806 +2281345418 3409277170 +2502180859 2526277861 +2276940776 2376445501 +3918420812 4145658039 +3835850610 3835850594 +4268248337 3351818311 +4118315426 246682115 +2895240541 4163055787 +1454535718 2294308329 +4109576067 1344510374 +1892346661 3027249964 +3316172540 615595687 +631387715 2170252138 +1667602251 1667602267 +11768776 3022978928 +49191363 3364236669 +1492118333 1051676930 +4190578740 1753500121 +1347214354 4153072662 +229029576 943987178 +3897541423 4103101502 3897541439 +4082503106 3531057269 +3131684847 3358362926 +299906972 1472701450 1504902947 +3010458814 369751519 +528812547 2708390588 +1276401906 3053978853 +1835321362 1202123845 +2868365164 2416897793 +3196381853 2484851307 +462484056 3173875853 +2341380999 948661654 +672577549 683916388 +1658174058 7632077 +875306367 875306351 +4017553644 3830870935 +425389368 3938976708 572747565 +1748672684 3226136257 +2304479346 501081269 +339544607 219800779 +3624752978 1371097986 +704087541 704087525 +1705800604 2860121745 +1859978032 3052143747 +1312771147 4293397871 +3275466849 2859297351 +764455708 3602734353 +2622447860 83206159 121408219 +3940197320 2185921780 +1109457043 2619475712 +1067497022 1744757641 +2980481868 4113385655 1703887900 2445792069 2538165623 2538165601 +2963880300 2963880316 +110625681 4065172806 +4037934111 784410315 14935240 +953328190 2979358622 +1161348540 3026142961 +3092491351 2193116390 +2881001825 3029955510 +2706339495 2534918390 +101069876 2329160863 +569026574 1919323673 +2691260350 1659059477 +2653733889 24677760 +1590667575 2011652486 +4248301919 4262525086 +987557304 1640642747 +986458903 2492425902 +3183226802 1631524147 +3749342312 2637511521 +1710437717 3537695946 3537695964 +134113672 91343212 +1275061570 1923583566 +1265930238 1483350793 +2226889045 3078727162 +1799660473 1973376392 +1787415061 3421052700 +1786896262 812834785 +164726449 634849456 +3450107583 3485071745 +3654860255 3476219422 +3544563016 3737712715 +3949917968 2947477027 +3898844734 1402258270 +4149770517 2821170106 +521809110 928530410 981185699 568192066 3158585103 3700176699 1049974167 +3599652087 3104817350 +147853086 1539737407 +694667232 241149349 +460343017 129259292 +2418463376 2858747115 +3842150876 3912595404 2575036432 +2461626737 3955218348 973170198 +2052253785 1535302467 +2137163888 3931069899 +1891599028 830128473 +3437607301 2964091324 +2231918425 1312576540 +1731954138 1555281469 +1959015167 857703814 +2791250265 1420734712 +533253891 203284906 +1517069728 3988665964 +788695189 2516386460 +2605529287 1099981120 +358463657 1267315224 +2086125560 644478085 +416924206 1288482425 +3120659709 506713227 +939974579 3855754956 +794785032 3035273264 +1422832504 4184114683 +821717396 2922656761 +3923079898 4266783897 +2774458912 2565737800 +4113894760 1787042475 +998333832 4273091747 +3496178084 2961958207 +2128903740 4256348263 +2576987730 1883635198 +3371206380 3008893100 3371206396 499894784 499894807 +52795043 2536252060 +3260183394 1922173129 +3747556230 1070778563 +1401201286 2766572753 +349595713 243670614 857850225 +118557225 1221787288 +3300238893 3606354139 +3160854895 1574487227 81506734 81506744 +946362171 1272177580 +3502069716 4113300233 +700036317 4152370761 3491133634 +2052545310 3045355583 +1110042645 1022908700 +2234020856 1827796764 +26358178 455352853 +2727474908 438138700 3493532551 3351747655 +176886091 1264395791 +1213680518 3319258567 +2001044467 3043932058 +3444567616 1960054469 +2398649316 4113237984 +4046065 344744283 +353812786 1691492787 +2602435249 3778952358 +470602272 228950551 +806639821 2386830456 +2225382153 2225382169 +3020121541 643380492 +692212212 467131400 +2403866219 4185606772 +3071635434 549399885 +3640520039 4273781046 +258642291 1290563526 +3820445127 359946151 +178432764 3121818289 +2674510106 929946357 +3639130380 3639130396 +3068278547 3068278531 +2862746006 2218947646 +674451824 1568971939 +3503116905 3620808480 +1684591376 553927221 +1071411102 637777321 +2076851154 2975607685 +2925952184 1585047744 +1655586366 949820233 +2810633116 3610273361 +3433018983 2255234080 +1275069227 2564411224 +3127008724 2546197919 3916869936 701766902 940091374 1696979357 2021279471 588708682 +2274628222 3961068617 +2054657446 1516570018 +403795359 2711730856 +1825477552 4180835861 +1499461768 1143033631 +3601994026 1183517061 +2457350499 4130717386 +3083343223 3939162412 +583596708 1717735465 +1458950363 3173034687 +2785865272 1554976321 4294046537 +1386550547 3737626976 +3618340212 2056847145 +2709923163 2704068164 +4209079340 3308099927 +50625059 2286996240 +2298926992 2298926976 +3006612738 517710371 +2423655595 2423655611 +542663354 2770561730 +1783846857 3700871225 +3550111224 2470898179 4091279280 +21866905 2942824213 +3587933494 3734156305 +3346898796 1992423169 +3200078679 3200078663 +3141374467 3168556518 +1280615387 71168466 +1349442721 1065701728 +2380805793 93192032 +4020902365 3384378737 +3374824677 2391694444 +3012429306 1095590839 +3629973049 2227008520 4265453707 1243613999 3546559422 +2884113020 2834738787 +3411039871 791279659 +613662117 1564697290 +3638612532 1909127817 +137936287 2421326152 +606115170 206697597 +1538742839 2560820358 +1261012441 727561352 +233617488 3683500220 1000744437 +3970056297 3966461272 +1159066462 529407209 +244750916 991222047 +4100540903 2831111862 +1806757591 1074947138 +592249132 3727194426 +1745899055 1672041434 +2348051761 2194138150 +3979250241 863744870 +1310548185 122990207 +3854463377 1767748406 +2255862709 2452109146 +4184238592 2620972549 +3086805774 1173768978 +1879573548 1386129729 +1534053414 385769409 +802791494 2995250183 2116251023 2635807086 1375700202 403595543 912150225 +3979051905 1015446740 +1184043240 2603647159 +493867637 1527974925 +3610382336 3285135379 +1900106994 690693773 +3273962013 1338270644 +2456707520 1136910675 +1804231311 3654887182 +4076052132 1372468376 +4170895306 4170895322 +2637498395 4119300623 +1484855449 3963205832 +2080782567 1521216777 3117905012 +2476663567 1065238348 +2612415972 556494832 +2898514231 1773596312 +516634498 835826571 +1794582269 1611817044 2129496052 3287090447 +3393001988 1647309897 +3074706599 663005920 +2375711413 2670668540 +2506878844 3035234343 +2550499966 2604055794 +818413109 647396812 +3733717623 2861019380 +39868743 78416598 +1449445626 2899799770 +4094389892 4094389908 +73005910 930358868 +1447650327 2331704195 3968372784 +2125201821 323638633 +4188510682 4030642563 +274553006 3169342265 +1426459719 528831446 +2083950985 1674505477 +902407653 2440046458 +145934099 3827478526 +591236574 3734438910 +784192208 754097963 +3502353102 1860166223 +986645575 3672357846 +3838137812 8337193 +3294682957 3294682973 +680108930 1387029923 +3084915228 2093007047 +3825792908 2250092919 +340847092 4016065295 +3319259571 3319259555 +3931601870 3694453646 +3314231060 2581236328 +540538484 4259242260 +3755106112 2553016787 +2640034128 124041443 +2744915818 4172864461 +46942438 1301725697 +1822272616 1949729019 +16679163 2342849330 +336959841 4278219702 +1520340360 1302726908 176874677 +2704066745 1920990015 1920989992 +1310998119 1779317814 +788020160 2965770053 +1917964382 2923463721 +3634670273 1332478362 +3409165641 728955384 +2762701665 2599631286 +1256974034 1849930622 +4162940166 1991678791 +600203424 3098141503 +3929855406 1808031993 +2170078404 1656602761 +90559079 3515747193 +3014084237 1565790180 +4231506125 563419771 +1777240989 2174356866 +1187063945 3164401390 +3977510833 62647991 +3724135660 316458679 +3044508970 3576078605 +1497314678 1497314662 +2079035534 2715062169 +753158223 3509941105 +1862350485 843902643 +3905048335 1469597937 +469215491 1477928441 2432238659 +3197407808 1138899667 +1901516030 3204756489 +1888546055 992289280 +120116562 2538065925 +3776438981 3776438997 +2237316014 2614457081 +717190946 3197242411 +729296256 2046407003 +1155681236 3384280116 1572988824 +2832439604 4179242191 +238444604 2610527847 +834694209 2464836182 +2671415602 1320614077 +1722878097 382968352 +106064953 750804392 +1088151460 1997200792 3189837609 +1054256592 3153305187 1434612267 +3920258742 3796034710 +2739479265 2187365638 +2772163602 792424517 +1371007296 3833868229 +1558639601 814875760 +3514061176 2660645751 +3672640737 3672640753 +2964653035 166817058 2964653051 +3709302533 284187852 +1270947233 1117121549 +3820911731 1241914295 +2043679290 4237078859 +1194631116 3444882912 +1160799984 3677490115 +2033419902 1243396163 +971265416 1870261429 +3438625344 4289378920 +504125267 944989143 2691528620 +1243376273 1243376257 +2594847668 771488847 +2679650523 1241612484 +194979994 1934574518 +2227509184 3740237355 +2649984503 2640870342 +2995585736 3621805936 +3287323707 590613490 +4275981668 1670195327 3271829860 3923206488 +1006292169 886071416 +2443588427 2476916482 +2309912275 3870171437 2426736172 3755298624 3755298647 +3714128235 717647759 +1331354781 1306661662 +2769465609 1052942132 1734401642 2231497996 213242572 4288124825 1827364867 221309429 2336155122 2405943248 1232288259 1835038162 3413418078 +2338324642 169934613 +3160102258 4123492979 +1349582611 3034680058 +3713442809 3114851317 +1043184356 4016694753 +3830931449 1854674174 +1481290778 395937003 +2901860097 1235291798 +3997563585 3643391455 +3309352865 2198398051 391122896 +1026118466 925144413 +1982053562 2399995797 +3220253842 3131648467 +1421924116 2140312687 +81520433 3610047024 3207282999 +3155523550 4090212991 +3599615494 3341728609 +1252741751 2997296140 +1540329330 677387697 4190031973 +1870804293 21799982 967210105 +1263001208 4196611835 +625916036 1055684553 +4173809464 3652525357 +2426380703 1619672462 +2643451751 3806807309 +3189920031 1862644702 +3496905452 168079745 +4204817526 49327178 +2774450870 2774450854 +2167485210 2998688561 +3528166347 3528166363 +1118721118 4067628418 +2204532932 3572511663 +1130630668 578952439 +2906291654 2031353505 +1559530054 666770065 +1469029651 3927196908 +3722486304 1755265139 +3084973384 3206684747 +1636110850 4221642006 +2303286364 2054972625 +1686439273 1123370702 +2960436684 2477627425 +954586817 1657875216 954586833 +1141700323 3116332496 +3702377166 865485391 +2343815518 2343815502 +1707568744 2700266923 +1513710851 2595479783 +2389216423 2389216439 +2243088038 511397719 +3232042011 3366771144 +3282711380 1492045103 +1695907024 4040391523 +332102565 3461588140 +4039094353 1296148813 +4130748843 1113376820 +2346146243 2346146259 +4137964173 3517838308 +2505375106 2850599810 +3576695041 2610834560 +652208254 815689609 +170413147 1483748178 +152886843 2473711346 +2049961853 4181448415 +3723907539 1705779776 +3287392842 313457222 +2514203557 2379992243 2467379718 +3190717453 3693304777 +2531842723 4046540619 +3617993977 1940218856 +2153251467 1063603630 +2675924514 3814574909 +1673777779 2151959322 +2082105932 4235096918 +93376432 1928786435 +4066765756 3130868583 4071544044 +1958193687 529641876 +3697883252 1839455897 +3396343050 3094421165 +730395257 3691511981 +4259983834 2443999787 +871609929 296219886 +2884722982 3539726017 +100702528 2901076472 +2898656685 2829997892 +2892258164 1806088105 3590059919 4051673368 +2527196601 1475998018 +3150611504 3486390147 +3917569359 3852854104 +773714533 1792763148 +935233955 1676848010 +3157347522 2089176022 +1551956093 470232276 +3128353332 3173390297 +1724692 1030595183 +3835922472 3074812407 +4049928010 464123045 +1417887750 278776183 +1338338570 2647303853 +2862224166 3062637783 +1532140203 393268455 +3518275708 3518275692 +1253891006 2561324233 +411534363 3092575876 +2591181895 874615271 4006156115 2410169314 2591181911 +1585749433 2210679358 +1567096122 1152623197 +1137011751 1350395699 2194796640 +3582976103 2558411318 +3831982359 2781507366 +985566830 3891935033 +868664122 352563733 +3173175890 265361157 +3379139093 689235116 +1988066041 2209256936 +2463184408 3821443477 928524251 +369311644 857540983 369311628 +877708345 4095060488 +3364712890 497953509 +385596099 3267787219 +4058699554 4138773141 +325594883 2416050602 +3527892784 911923331 +820278561 3234318672 3397511395 1183557255 +2175035683 2379207174 +593979813 1623936698 +392167002 639461291 +2910133862 1969150593 +3991441422 2468005391 +2907963075 2654604522 +1350701410 778361774 +1249703295 3661442859 3249960680 +2291970486 3299590535 +1626444755 1613640768 +3667054155 1612365826 +1353869998 3067998191 +4290964070 867191798 97975937 +1386660905 3829133619 +3089705089 1774895872 +423656740 3833921440 +2227123960 3582968723 +823253866 2837211099 +2921622888 2337815229 +825156129 826310214 +3861179691 1998674612 +1217379987 3635503063 +3578654268 95291495 +322549271 1524213296 +2169473711 1060589946 +2600401622 3580157671 +2972456216 6632667 +552512315 314019300 +791852412 3369316903 +1979037457 241285961 +2187594655 3570434652 +4166679874 947072739 +3833234952 3034644107 +2554915103 2554915087 +1795739233 3572714301 +939691321 1694781630 +643457092 2689697813 +364265559 2229749990 +1745827296 2951860147 +3334562767 2976915160 +1449137553 4153538391 +205629867 2022882925 4133361716 +1277674930 2493265701 +1938970722 2681120942 +821131810 1908853742 +2632818706 471006291 +345088049 2453613872 +802322901 492161628 +775790501 775790517 +2097517420 2616037624 +975873982 1327894559 +376596687 2125534257 +2714823780 4282760804 +1408791750 2506820538 +2622435544 689636228 +3030353913 623735774 +711075228 2556805191 +2092464032 1635629663 +826421539 2922600988 +812863260 2520171975 +1998664841 1267310244 +2745818446 4066861510 +355741599 2914671627 +791513403 2142177266 +3441719686 170529033 +1572141023 1658991624 +3184914181 3862255451 +3195788667 1476241572 +3644722735 3241974459 +3703662284 1349833512 +3517067577 976001419 577593096 +3103607066 1354372075 +1771473840 1303460184 +943989435 1312992370 +1425713640 2929293355 +176746578 3885125893 +647535071 2704947720 +2989047891 3387966138 +3223821152 3730413612 +651788643 1319453776 +4133448732 650809206 +2162555082 1635207717 3020334587 +3718661129 4122810926 +171978232 453533051 +1510855791 1663971515 +2618863186 2509074398 +2497637153 1044280317 +1977456168 3016974571 +89791638 47906865 +740636846 740636862 +1782731104 749353816 +1131119560 3930092509 +3245604708 2014407067 +3442229529 363493982 +3299146288 1682279384 +2336947076 1023277039 +2403311629 3407938725 +1436270293 1820114797 +3209647779 3437585052 +807520211 3149629504 3173392970 +3258833615 2522837976 +3768985965 311637650 +259744862 3419845120 +3925751529 3172906687 641832025 1144025294 641832014 +958048316 1435735024 553047665 +208253476 785178894 +1641176314 1641176298 +1028370307 162885488 +2916144971 2765623416 +3857158360 3280536603 +1906001385 3228503512 +3106329338 1914576779 +299994055 1856840388 +4223932629 2048391433 +899814503 3576045110 +1920954240 2902236286 +3688848299 1010385588 3416084002 +2284957806 3560488249 +838514169 2726066142 +2214887916 3206055553 +2938785454 1838799865 +680174120 3950221908 +1500101673 3933418648 +2016479611 2956061874 +388690940 1956517297 +771119626 25663713 +735821756 3337540849 +1088086277 1864760590 +24050354 3630277197 4088702515 +177973928 3548190403 +2517495453 99475932 +2598755189 1289255228 +3589315413 516196060 +177347323 2059321822 +407553601 3467136880 +1989035747 2499391642 1989035763 +2992047147 3925577652 +2593431114 4071408745 +2697847814 2697847830 +3417594960 513279165 4243411445 +4251196132 2078789966 +2407778091 1302208436 +273900159 843320830 +746698981 25424107 +3091270099 3781326650 +4282789668 4286330281 +1786328880 2068841499 +1237454120 3391913283 +2284841628 4285420433 +1079152752 2157094365 +1115642699 1115642715 +4278760202 262611590 +908331622 2676549542 +1358303288 2479501324 3994508997 +4118787312 2625347147 +4011577026 339456504 +820688495 1887252654 +2226633967 3997457452 +2284393589 3450549290 +2024821156 2710603049 +1396615488 759808756 +2022505679 1357664012 +474096757 4045366332 +3631507471 3460288398 +1754665622 3751095923 +1372666484 1079968911 +655167467 1271371870 +1358626888 3948553200 +1628056502 40676149 +122901108 1942452896 +3946622671 3371142246 +2057669024 3280371703 +4261700109 3991296612 +2712766173 3268385493 +2909390994 2909390978 +289691498 2559941581 +3623839738 943899843 +3345763474 3647541873 +1406689785 4137827048 +2224662875 417700420 +3810285552 4184371983 +1527827468 1735472887 +812403647 575299638 +1178623650 3725192215 +3692723604 3604874495 +3502843170 3466949763 +2206510080 165331987 +428180259 1401388038 +3034107636 2773338649 +1862486561 2532255302 +912423235 598978342 +4049081989 3722876586 +3405588807 4227318922 +3382415785 277564697 149310734 +3813191888 2607699811 +958068058 1064320189 +3889212395 3277489688 +385243949 1389463506 +2504155676 1783276300 +2648853145 1003785429 +3377049721 1476447870 +3104842823 1719054163 +891144608 1426937492 +741459917 3728519193 +2285405741 2650486980 +3354356368 3354356352 +1299393529 3847108840 +3328762284 2766701248 52117953 +2450136523 3682224924 +1289541578 3383210747 +1113668717 3960610692 +3361105985 3181486174 +1916435557 923914988 +2391115605 2972977884 +444408824 2868879227 +2046978935 3122844887 +2261980587 1966958031 28393429 1966958040 3914013748 +4260567268 2846895871 +2179701233 1994610288 +1051723900 723344167 +3603959659 3655512003 +3235093570 34949294 1490021768 4092217432 3306236002 3343454221 2605091891 1422911299 3904591635 3712854091 1439688917 4291206630 3106496663 3309898980 1364531884 1626889395 1372578446 3388649253 3863707510 2672202364 1456466529 4092217435 28170489 1490021774 +4068630630 691912855 +1184572179 959985388 +112817504 4126393893 +3734933303 2862314374 +484830501 2733920570 +2762531044 433719017 +2767644784 548399189 +4244285607 3851910880 +1538861460 3422890035 +452958771 2679668419 +1987924455 1850207904 +1869465350 2079032657 +2204336153 2204336137 +829358328 133261184 65904019 3384706683 +4279544611 72279056 +1948200925 2059677765 269543800 4059251008 2140504187 3184004359 +3391499743 421148190 +1029407896 789691227 +2993936346 1863673781 +437262979 2321136682 +4008502362 4239424031 +847697146 2218870155 +2287364371 3003607269 3003607290 +1542714873 3745157598 +709927712 1720020632 +1885173830 1885173846 +3580090163 522962252 +3038636940 2853817719 +2195353291 3369888157 +1075785049 3753039059 +816589913 4161392670 +475738970 4254193341 +690002957 2312645490 +4176505170 880135194 +1752503309 2102300772 +1664453650 1061912645 +2496953112 3640652964 +3152552338 1617746131 +3634343676 3051018417 +490577591 3204504070 +2516889778 2391099483 +2548383084 203662487 +1734208444 1960450289 +1059078012 3687051303 +584031061 567379658 +2774085924 1869110185 +1621870315 426386402 +2371661891 3421075818 +3420154670 409581945 +4030150719 596600693 +3500629873 3900391142 +4036030441 2636753880 +1043557054 2834368799 +1038601920 1243061572 +18297220 1864639571 998437568 +4088448308 3544608985 +3984765667 2664032802 +947197522 1313684793 +3097273511 1421755223 +2294979076 1837566108 +1234899786 689921389 +307778724 2232237631 +2563676419 2419777450 +3226887424 3596657540 +2433676126 2128127359 +3247152958 3972771487 +2068446633 3195687192 +2319718282 3510200037 +3529671570 2670660738 1142166427 +2368095709 272628450 +4137200299 3713313588 +3379753759 3379753743 +1506430085 3732305242 +4227012041 1756056440 +3496985554 4059120517 +1902543294 2371598314 +966299348 502703412 +4011303612 1414700983 3931611804 3175897167 398785244 1049876429 +3835390956 2245394394 +2948521033 879839711 +556857643 1796751028 +1522587442 1040850391 +1906032713 1267996127 +4013340411 630610519 3818565544 +956922569 2464959096 +596539770 1934179101 +2618472406 627100901 +2771065888 584926821 +344988831 4259122782 +3053417347 69392170 +947958072 2296415097 +4248903176 3045213853 +1223995524 588770156 +2785869134 3685159581 +1363149343 1863855297 +2547394527 2934062967 +3737346500 1905452937 +2726584946 2578814638 2726584930 +1675014478 1059712217 +1166158312 1395378179 +2652738421 1850814161 +2726926678 959375415 +2132901823 775305513 3689224032 3935661149 3958656873 3153629775 +2257591850 4276059163 +573729921 1449185024 +2990987395 4232261011 +1056460686 2934258841 +3443454885 2402846922 2333824396 +3956576132 3281906911 +2602031635 177766038 +299558596 3751364255 +3537659303 354762660 +3750282723 3343877205 +2974470169 3087878398 +256136342 2660313127 +1598745347 99612092 +1642670329 453738472 +544681958 27289367 27289345 +1429580119 2189695666 +1234165829 310250636 +3723536364 1306024087 +2962030952 2429000604 340863893 3299465296 +594059383 884251472 +816592302 816592318 +4135146388 2499711481 +1090276680 192266108 806984775 3841733441 +2722072468 4261572089 +2297921498 2006860861 +2043981829 3469809612 +1250046426 1858779510 +630748435 630748419 +465770353 1410497558 +3864822304 3099060315 619496344 1530177261 2162345732 +591892346 61267211 +2443151455 3878300956 +4021942728 700724701 +1865611532 423497207 +1241572020 1087291167 862249295 +1453587878 170413143 1416637670 +1960114302 1766010463 3712453346 +3341360336 1438145379 +2131694001 3048790448 +2478101011 2561061861 +331829548 1321519191 +3780459434 3132651525 +704846029 1336989220 +2740562286 2485499951 +3424595437 1931520799 1195277019 +3880407465 3271462158 +605056995 2833261130 +3485530778 2547078194 +2246811699 82653274 +3503861676 1897696193 +2607476640 1230452979 +2633243657 491266606 +3395532321 3395532337 +1318501591 2387297894 +2042521946 2042521930 +899405970 4132826565 4132826579 +710563134 710563118 +1514310778 2428707869 3074631254 3996237141 +2439329395 1341604074 +556446505 923588982 +2887972 708500870 +346924166 3706297776 +3348349314 299257227 +4203675932 2334048017 +2396353149 1459829460 +450501174 2069316359 +2921886677 913636474 +733246629 1323594205 1913888698 +1296489410 1754002037 +3552524371 2835720876 +3592471894 1805035121 +210075347 2301011500 +2986845353 3943183896 +363036670 1097793481 +78216019 2848793530 +781361597 1173084363 +900426510 2742000783 +2727913081 1399964165 +1817074970 2572980203 +1877947386 797889163 +2508708864 3499181019 +1983149621 1234572668 +421909199 4183761863 +869632736 2032770725 +2654157538 2654157554 +3610033657 4241786613 +2883657516 2994164685 1672625208 +1838739986 2579829317 +692580394 641667611 +2517866533 1708687930 +740922521 510979272 +3500381405 3500381389 +2053105128 2364992555 +2179173285 506778810 +186589813 4144184874 +868331068 3051702385 +228176049 228176033 +1394259314 1158390387 +3922767623 3171883026 +2388160181 963746833 +2809770835 1745230196 4153756588 +1913540752 478728867 +2148037900 2572173793 +1271066920 1809949163 +1983205014 3317652445 +2154600533 456327420 +557226599 2952073270 +2184526129 2155336641 2184526113 +2435624845 374889188 +380773698 48273218 +829016034 3328748266 2877663427 +3706177069 3990681810 +2743977857 4180742144 +2692845820 2817998001 +176151871 3439226427 +140700606 3436030123 +1852647309 300119621 +2272874499 2272874515 +887340584 1787058411 +1086040601 7128414 +1356334880 1678980965 +1914414970 1914414954 +497056102 211830426 +3295574512 703198403 +630154007 630153991 +2649437376 3999332472 +3114984923 587716548 +2983728776 2133555211 +1695358174 1233596286 +2197101297 1312598647 +3358830619 2509950629 +2979459355 3340886418 +2010916999 915655830 915655808 +3386832540 1711159175 +982717974 1267451057 +2328336533 2328336517 +233772037 4099703756 +1145949816 2319378195 +2379302481 2440147334 +2719346240 1753616089 +4024298658 118439339 594020925 1012630275 +1430822457 1268913161 +996933560 1124306605 +3184536010 3323326911 2314872113 +3179739138 1568172853 +1760823873 975174095 +4112631689 2349082104 +895386157 4246320448 +1115293077 991349148 +2024581393 2024581377 +2423712940 468838822 +547562823 2815667926 +620918982 149168033 +1458606434 1052040515 +4097331930 21617333 +2754482292 3900958351 +1648748690 1175264709 +1171898647 1552101042 +3063093935 1424282215 661344251 +4068924631 3844631113 +4008052215 3670787919 2331392048 3237349424 3483793968 922416524 3831248789 +1033576160 3677461171 +2363404247 2193349664 1617691020 1763079572 3611841383 1067777977 460861105 3083084501 2524612104 3285701339 1608464895 2619662829 +3885509330 1720412293 +3836973265 2337014880 +3000150478 2851068239 +1527937102 2886951641 +2645257215 869991038 +1020661082 1776048437 519505067 +3695761659 3695761643 +2104029683 1597301132 +2294255983 3029463473 +364681013 1558310700 364680997 +3026474118 3371751674 +2361892599 2503950022 +1200555381 1183842396 1890619591 +675530793 2343835800 +459566759 1875437605 3141202098 +2857628670 539564233 +4153078602 2676164787 +2737621997 3431269892 +775351246 4007545130 +1163239965 3432728578 +1138945767 3309180342 +3277608178 3225303406 +820749047 4193356486 +3658233711 3170533031 +1763424673 3088576510 +3236122101 2597566634 +1146277004 441974881 +4291063609 2487582778 +1725775487 1833525736 +1512524384 2370783547 +3352704437 1261865980 +3120974217 1625670328 +2027851866 4292400822 +464191680 464191696 +3164696545 3164696561 +3609653154 2379899245 +688029480 3069062123 +3621146093 1826807890 +3316438147 2987559466 +1961429762 215766069 +255337476 4183863903 +1803952491 767997848 +3481645777 2155380486 +4173204844 4281278743 +2627118496 331852312 +3588374638 556494137 +3190801671 1815292438 +3966986908 39657508 +3082264995 3641930652 +3100422960 846811976 +4151148613 3328240794 +2093517505 2977240395 +3874681429 1927678505 +3248739523 3935643166 2146643327 1239371959 505231015 1642034813 2289915714 438120548 505231024 +4198660492 189304247 +1281812617 86419444 +58138709 58138693 +3437249529 3772430959 +3290117988 2874628943 +1248125124 3771585673 +3882759379 628959276 +2891905394 3972008030 +3877104695 3877104679 4054368630 +1035469639 1873619158 +1904888292 3786863055 +2256386576 3354126115 +2690147419 3324377924 +353476723 2646578458 +2705884322 2267597589 +1190179449 1195559144 1469418495 2538465125 +2212696852 1633830985 +1385904179 1225094915 +2090542630 458303370 +1287268845 3054501906 3054501892 +1363238366 3353789545 +2587258140 3752706833 +1080248368 1853850525 +1609596281 2157282686 +2831151321 797106706 +775842616 3793924549 +2632116550 1060452641 +3472743863 3472743847 +599921114 102852108 +2828830781 2875881492 +1068026975 2511976862 +4144850911 785129654 +645932966 3586221809 +2422353986 751385181 +1558922385 1296973366 +1067620191 2348042888 +1199049271 3103265926 +693566112 3018623475 +2541874016 775248008 +1278463820 2340302876 +1425629803 798355042 +2434468702 3415401705 +865620526 865620542 +1371769800 2127891403 +1473800270 2544644815 +536490221 3821599557 1138427140 1138427154 +3723911309 1968340860 +2809787471 2540794545 +84536324 4070476361 +1642670322 336295141 +3284637208 1261520859 +413976947 4003263184 +3943270982 2205956425 +2528851975 1833174853 +849326679 3686234223 +3470657587 1250154573 +1460484395 3640718671 886111924 +1802545869 195292588 +1485094756 3849331535 +3692584501 2942061948 +732155186 3839624627 +2874635772 3064904615 +384054706 3141568293 +3623776651 2425142740 +1618489781 2453028860 +1753543104 2721886093 +406057342 1180703309 +236064203 2693819118 4050368148 +3724122813 3724122797 +1329262342 3217442423 +1345820689 318024007 +1189316324 1684207311 +1303643508 3914825695 +1858058153 13508376 +1760470948 3551651625 +3909714261 787912906 +2362884236 1643097271 +4145818649 814992392 2158637195 +3118596629 3016312604 +1749068594 1338867621 +2998855385 998598536 998598558 +310932955 383303643 131172292 316193183 +175317279 1940325281 +3068325395 2198959225 +1640338343 2433183734 +875801550 4216812889 +1223011006 2139867401 +4183451033 575533022 +799149703 3866248083 +443712108 2196593535 +915127466 2422772556 +1291637783 1224859696 +2385439008 4091084133 +1082719729 2249655958 +580522297 953696009 2978553022 +3728940495 374986764 +1880286725 1925192140 +2849056518 1514172001 +2565619331 2565619347 +2349718368 2349718384 +1540910727 481689238 +2509508460 112871371 1949527319 66370342 96093749 +3487062501 378897274 +4107719038 2660048354 +2964286774 4271339794 +1777866886 2924754181 +2863021461 951251338 +3210270925 3518973312 2715692033 +326885193 4110450670 +2548382511 1289497336 +557115342 340322639 +734198734 734198750 +3645352856 2174154744 +3753435981 2098057778 +3019219145 346823790 +3454837372 2810431793 +51596379 51596363 +14242851 14242867 +3087963628 2868249239 +1096190719 3661418366 +3783050740 991841034 +3888885736 4180655619 +350859488 3420549285 +4079817420 2616497953 +266471837 492607780 +2250532146 1565216179 +1391810131 3946243258 +2508957311 94226475 +3697522187 4227306306 4206685496 2306038773 +1901785915 2905400818 +1559953487 2921430104 2058798296 +3272508986 3486275186 +2138149120 2680636165 2044739352 +485002482 3250163963 2285346187 +791400737 2580318048 +207673169 3446862992 +4083101699 567841980 +3910989337 295135582 +881252375 3343264816 +2365017515 2488222772 +2750678740 2750678724 +2633829781 3076284828 +3421957799 3421957815 +226328892 2022863217 +3610382350 3520022031 +3576314549 933691592 +1121024921 3368391112 +1826631304 3974709277 +1012116874 1300372621 +916861460 463525241 4147121512 +1521781094 808733591 +1671022273 4131815567 +914342929 1324976545 +2373698273 2377953117 +4182769027 4226553130 +3979327404 3657849935 +4117953703 2735466867 +1205820768 2225077797 +886709502 3177097850 +4229476111 3165317964 +1153819434 2193632146 1837407003 +3365459571 999921434 +413576790 610562407 +2887037489 362054448 +1430249897 3700440334 +2813897729 146195840 +3772638281 2065736159 +1568019738 987969515 +655172981 655172965 +2990114347 4108225112 +198975727 3343288838 +3201092607 1211443626 +4112612243 2566952877 +2943659835 1873795570 +790471052 3081064289 +3887011080 3887011096 +2494616889 976232848 +3705320822 575383761 +4103717980 1779440849 +4013585715 2005706121 +3804509718 963424993 +787174734 712460751 +1780132759 4142157570 +438518545 311814960 +1805035111 890411973 686773738 3307729974 3307729953 4110531560 +3041506061 1879367012 +419825945 4009863657 +632533535 742044082 1382398757 +2917805624 608672204 +3665072295 1028185637 +563691873 1443475288 +1301078185 3425350681 +3859253531 953996690 +1338545638 2126772503 +2263564255 3289793026 +3395543359 3016581372 +4106470922 1513144763 +3292378170 656586589 +905038105 4275806068 +327284455 2242218761 +468224850 935568135 3626821865 21504175 364065873 2435289717 +28596264 1246445635 +1657970990 963792415 +747478745 4226879368 +597297858 597297874 +4180469618 1369128218 3014678643 +1991310771 2342478028 +22472145 1207815828 +508240942 1567345326 3729388655 +1992419214 2168423577 2168423567 +4016081180 1730645959 +654955392 1574094668 4101501573 2748955320 1574094683 +68885455 1168950993 +445706462 2955619711 1078226690 +2251818714 720549105 +4289280075 3261308436 +1425682528 635053875 +95305046 2707303457 +4173756918 2524053073 +1722950442 3563936525 +3671994106 511206339 3129281514 +205725054 3416747359 +3708200092 3708200076 +2779376949 2703721690 +1195137736 3722767036 +1102964447 1504178058 +774891720 1143325605 +3134562505 3880524920 2328936750 +2046831355 2046831339 +2784257029 166813738 +942001780 942001764 +3476551414 723109201 +2840503840 2798617715 +1842642708 1138729599 +4240722023 1342044726 +3562651730 2605302021 +2236947352 188664115 +3990360429 3626200722 +2547407477 2070963772 +3108398522 1674716125 +4147553760 185016225 +2135824171 2465102004 +653096629 3781287744 +1393179289 1377451720 +348710060 1681914583 +4285352341 919882499 +3363222558 2967309110 +1785554799 486771985 +3478741802 591075450 +3371019171 965548176 +433431228 1733242343 +517422467 631154468 +2976702660 308663433 +1578339684 2093454463 +3868664336 267034403 +672501396 2918150905 +2444891713 2834368576 2834368598 1643654620 +1178549960 684577613 +3040639743 1295359870 +991729559 3286347087 539984307 1603744468 1963252448 1684309809 972805496 2202421533 2422327995 4083285307 1553597419 399161928 3737460939 4268168898 404065156 3563658140 4269546763 3904959414 777157809 +3720266433 3561788886 +2799219380 2799219364 +1149611493 3278946170 +3988652554 2365298034 +2850291542 568247410 +4260214291 2379698007 +1656340904 309058429 +2674060393 2107383108 +3754889409 1056644367 +199284934 2029338551 +201878929 1473122080 +1360993329 2593386177 +230092903 2230671800 +104827061 2332308732 +4166677365 1801699644 +3246430987 2826179138 +3635530237 3089654498 +70805254 70805270 +3942602191 3686496614 +1424178912 2149265909 +324294442 441620454 +1366734566 602008599 +2702541175 2702541159 +2976823112 2571798109 +3255948087 3104800656 +147916715 147916731 +1699697815 316811696 +3707753357 3694352608 +3915609516 2419537623 +1928609346 947782133 +4163878399 3709758396 +3259784675 3241659484 +1367205923 2861515677 +2912427153 4225827927 1931662902 +4124255166 3110159369 +1238317077 2595470475 +3536853092 1100375423 +396966149 1147454170 +3888483419 922481476 +2377384777 3079193461 +1192447861 1483085116 +324324201 3615241816 +2623712030 143061695 +2078184720 31596897 3823768849 4170549976 1839555323 3858821433 +2435907815 1998875574 +2836336451 213285638 +815960212 602511609 +294489674 2670140894 +452550436 2593179049 +285151292 4253453944 +1557339106 39118037 +2950314421 2307446780 +3223894427 3223894411 +3490673353 1364308600 1364308590 +2667273543 2667273559 +1894781832 399956660 +2828261356 1287448705 +81566517 2846837545 +1046000210 2007021331 +689585297 2394425191 +1696536636 635697900 3754077054 3562679560 1230157463 3463844243 3189055871 +1539738953 3264244206 +1916452653 366930884 +363514313 1872771985 +3949625934 3869974745 +2964772499 526783767 3268659564 +3678650603 2677023502 +95525878 3969418311 +165390810 1590452779 +772508222 3123355529 +2409146134 2758261034 +89941671 89941687 +30680599 4160222758 +2055668209 3548909158 +562910553 22442025 +295037336 1191098957 +3332598805 3332598789 +1076541939 1522876011 3211668357 4131568026 +1411859026 3419236101 +354342248 2729455588 +1450349342 1450349326 +4116111537 3905140390 +3351747677 320695381 3351747661 3694863970 +1026490559 268315816 +1320388822 3131074791 +411798840 33137604 3685699373 +3567258906 1466654606 +1814582951 3934284022 +172295096 3802454701 +3922693067 3703115906 +1209201364 1238647727 +2549941671 3931104758 +337263936 3847121861 +1385576704 41663251 +360948679 64149637 3220210329 1536752324 1536752339 +3333666949 1336936618 +3556279632 3556279616 +3571324803 2627666748 +3130558754 3130558770 +2711329374 121979018 +1723954076 1586036369 +450302531 2207367018 +1207437974 3782781489 +1818583239 1788303680 +3881684836 2628614761 +3656707937 3227631612 3034214518 3948237718 +306303995 3097539634 +3030171678 1891790655 +447484685 165805426 +3710730395 230794277 3376198674 +1703497064 604264341 +3096219288 491026765 +2504615495 2422656888 1233912265 +3930275147 316243229 +2770089712 2770089696 1033957468 +3053353966 1839011759 +2725297896 2675738429 +862636553 4196142136 +1888129243 313845477 3633564808 86116562 +718756297 4085689655 +1525142876 1287353955 +9916708 305445801 305445823 +2093586425 1784298728 +2630176432 315434959 +805733282 3459521901 3718982826 3718982845 1010907139 1804932206 +3093809805 3630423026 +479029752 3288294647 +2208255659 2208255675 +400175407 340557690 +2264282949 3316593625 +2809367765 1877390172 +3319984048 4014640328 +928320658 2900543955 +660793307 2663742344 +1826188794 1826188778 +3785044123 3825652296 +2696949687 3314228486 +2535190267 567988237 +2408563967 2408563951 +2621271557 4037704234 +183156185 225660072 +1773499978 2992682341 2997433970 +2190441441 1759511350 +3858890144 3038921459 +646832602 2337966653 +3902267583 3860253864 +4204554467 3672717264 +3263107215 3263107231 +1321515076 2483549999 +1250093747 1576113719 4279728076 +3883575846 2350504407 +1007181257 210156127 +3850718576 3933481675 +2787546765 257030227 +1923630478 191971022 +738001830 3486218399 +1366039474 3744438565 +2607698414 1143405466 +61778788 3961122649 +4237591939 645486839 +3105956042 2161248148 +3663837900 2990195544 +1259654150 1259654166 +1000946382 755716687 +2338924765 1401639906 +4054420125 182793506 +3996660503 427322662 +165648351 1778127902 +4078084543 741823850 +2975290802 2975290786 +1556123839 1182030972 +2283998836 1044820263 +1509911353 3860187816 +1720889613 634837409 +3895071678 943526921 +2414246399 2762573756 +1298655616 1519686803 +2902609191 1845769011 +3720444885 3969249354 +2885697294 1094881433 +575831213 3034203218 93949189 +3189321824 2712086323 +2733144130 3052752885 +3589013748 1831380808 +1439073236 3682698927 +1155290183 2916658134 +460743895 204365762 +1727651053 1000248728 +1326495157 3280881464 +1747587012 3191263647 +1751284756 1728664431 +3860029758 1425535674 +3287240669 3522235330 +532494958 3830844558 +411172528 1151594243 +3014678843 429684708 +3377319344 2507852821 +3234351294 961184521 +4003903144 327906652 3082617557 +1439230944 438370008 +2619844535 2923470229 1721694242 +3363456435 3363456419 +2579897012 3336309081 +2019571385 536649886 +408690960 1762135093 +829764675 511788412 +268078291 1669748055 911905581 4201361452 +633312787 974256026 +1261480490 2275139611 +417939825 2821850352 +1483217096 797938876 +3388146908 475438566 +3177341581 1063169416 2083156784 1862199358 755500011 1041653187 1736568583 +540964110 3495052559 +1789194504 3920064395 +732901496 732901480 +2581866279 2581866295 +4188932648 888798443 +1009956254 1205705914 +3222633989 1725260250 +3619688157 3619688141 +1423328065 3461078848 +3988429654 1866250785 +679875498 1964045453 +3538781637 3504968972 +3589623939 1412283964 +3120313629 3120313613 +1315584841 426057656 +1027103054 2914293209 +2544421810 2847039897 +1323860696 268827163 +2451037990 3010374257 +4196010056 3056577152 1296359604 +1974363138 1951104127 +2793378636 1725227169 +1322064672 115653730 3991180546 +2232355158 3433804401 +1103448534 1603484654 +4012700393 1824679118 +4244838138 1172122525 +4219762853 3038647772 4200360263 3038647754 2525621164 1582463331 +3417353733 2887905754 +3560369324 3195441857 +2126235955 2689456288 +2332382271 2600812877 2362674154 +4136765193 1473306619 542191992 +2202509588 3183645295 +3137904185 2811302824 +777197675 1473212532 +1946397688 2580002669 +969702452 820479439 +3410824680 3737694783 3723523325 +1100266867 2955295770 +3800918190 1385941497 +874806188 874806204 +1882968824 283549135 +2955672223 4097542238 +921389661 162255006 3513127028 +1608798336 2000912258 +1300231014 1718364567 +3284637189 942746074 +1052013171 2960376823 +483754922 3567648773 +2401581892 2610711561 +3031749744 2906312562 +1476622005 2678061855 1742229982 2087388578 1742229961 +1658028722 1157021221 +2743846561 369733472 +218851828 1813947285 +4109786084 1839092697 1765670536 +815600005 3098272515 +687787962 3053416613 +2577253920 2204207852 2577253936 +3286795028 2064013423 +2398092341 1060390782 1491523918 +3887246160 1770810283 +3096467663 1513868750 +2127869930 2444817537 +1668905748 2889662585 +786914795 3618056853 +1480376125 2877782580 +390206493 390206477 +4158606728 1505789360 +1598981909 496936476 +4062066628 4062066644 +2986613091 3750599760 +3913015172 3175151087 3913015188 +2053812489 3375557486 +883114459 3087051716 +1188860003 178846331 +425719537 3227459597 +1376946217 1546410136 +34640271 34640287 +4013248982 1726993393 +190101541 4006289756 +954465401 954465385 +592082410 592082426 +1188701260 3580306337 +949691550 3124405417 +599502225 3513924422 +786183288 1732427027 +2463460455 2365171254 +2866924870 3081337146 +1861713368 2183892775 294804086 +842965065 3941321282 +3311367363 2017775356 +2142097247 2142097231 +1035271326 3253316799 +297020349 2611010196 +2995544253 3489417620 +3015258615 426537038 3962354767 +170976697 3287917118 +3466463216 54440135 +2540367867 1482147890 +4142437400 3625979980 3543065056 3362895495 3357614555 +2259542896 2274734300 1941768533 +2709803996 525337425 +408238699 4070701208 +4151200551 4151200567 +1803425659 2994665138 +3253468864 2209547405 +636001045 1604186539 3236531237 1272795809 4272644868 960009531 492958612 1784843507 783806378 224367972 2085085721 2771407729 4188843919 2301343353 1810686991 239683911 2708983003 1615898279 881228919 561021823 1239592486 1843427036 3452634049 +2798844679 2770414614 +1578973890 2299517307 3330377949 +3962682362 3427461789 +2068622134 2068622118 +836867392 2787557132 3323851717 +1343734015 342151550 +2003196544 1981839251 +3215802740 3878230984 834537881 +3012779398 922499553 +507198891 2181418456 +3614113169 3621460202 +676988977 3065701670 +2097633572 4136719295 +1974971296 4028837107 +457657154 859535587 +802005418 3937762957 +1212860108 2578903841 +1808136346 640155082 +4080994765 3107745188 3107745202 +3205323082 315397082 +2419342597 121376474 +3342631884 3677962743 +143159621 3016380300 +1243359367 827575446 +4211228834 3331047189 +3891363276 3978889271 +2900457186 3521475050 149824963 +2224289156 954957513 +3829133103 2035910382 +2584095386 149089039 +726622033 3318907814 +3240030255 850663928 +2248093389 1485954084 +3905310328 1823172371 +2804591783 85352100 +2483026484 2483026468 +3367059980 323340855 +3923904240 517008323 +3321059222 873652519 +691267091 1125412992 +1231943734 2521555282 +431609111 2525655856 +4219430381 3599594500 +2700296029 729106445 +3871398305 2511439745 +3796354087 1345847844 +3389096872 1843824317 +1138905921 2868648829 +2402873218 344079998 +4006712540 3479272328 +1933517115 2626879700 +409499166 811517502 2283068362 2283026626 1681003838 811517481 811517503 2322723135 +2849756729 877122864 +4216781618 3689770931 3922122458 +3978134078 2393374559 +3136596967 908762294 +3926209045 4079584428 +1679982308 1432792783 +2787733861 3268648074 +3379683520 726709901 +3822827619 367215562 +1488923851 5775855 2146665364 +1628653715 1738856192 +344146138 614405949 +1353901925 1856127994 +2637962039 3164526480 +2043515884 3638033407 +2826315423 1819022966 +899668870 4037448673 +2743480516 1270301648 +4280854886 2218008241 +1291633725 1860758530 +4053719601 2383510320 +3699855944 2697738668 +1645757770 3056931693 +49067381 262252348 +3358166831 4205189243 4205189228 1215063800 1215063790 1500410449 +1295940806 3634598151 +607546173 397329359 2833712692 +4078309709 4173151282 +3251517036 2476721447 +4265769081 3148064382 +1692152414 1235271505 3914862027 +1727503529 3234569742 +990187450 2734145995 +4068354097 3840393005 +3842676532 3282831055 +635845270 1064188455 +271475439 1745206840 +3059674198 1835928423 +4132731069 4256640025 +3371652936 2774427220 +2874989360 4079815829 +2310045478 3872925889 +84397768 3008005341 +11987170 32545731 +2879043377 3575939520 +1426924976 2477937667 +2121797013 1239452730 +1569622246 674582404 3488361695 +2659607414 59675335 +4083364803 3895098364 1444632670 +1072289614 4011885273 +3395471536 1233251605 393237940 +365410128 2573570805 +3386743132 601385927 +2603318249 1268838213 +2026501764 2851017183 +3811544006 1775831223 +3116526279 3116526295 +898782470 1187810064 +1860075692 162337000 1570827806 3502529116 1870223168 367663941 176003849 3019135403 3227286047 151431433 154494642 1314615727 +3176017697 852040077 +4183871221 1648336012 2288372650 +3703603782 3703603798 +3965770210 4269211338 +2751931771 1189916946 +4158222927 2051994190 3499061885 +2779946917 2100383930 +1859928583 3075799465 3224830490 +1112339224 1998761677 +3830318751 97807454 +736522537 4184793220 1153704839 +3223130417 293563350 +359359937 1812773617 +2064825183 494728862 +1552078838 2239879105 +2339328405 356347274 +75289569 4051798847 +1784590839 1779574726 +3801162552 275001408 3015715283 +409254690 2177036349 2291308181 +888970832 3115136995 +315634660 2176954367 +316926390 1925769617 +2224723246 3982022502 +465190411 3370464245 618346361 3201998003 +2280122246 2014410721 +2440949936 1166186633 +499698687 1368466287 +1678064149 3609017960 2769496709 3609017983 977373785 1763277668 1166172878 +1267867073 2241737457 +1878080350 2260753369 1878080334 +4160161008 527749006 +4018010082 3847043285 +1468277027 3892324874 +2931809006 101033145 +570687019 3075022242 +1442442272 623432088 +426871114 1471881069 +2019965107 525898784 +193790280 1996031069 +349866836 1068574911 +1347078362 1069166397 +1796185363 1768456064 +1070178326 2154234535 +2947884840 2839947075 +2694252050 3753807443 +1967587584 4154028251 932613944 +3660601654 1136941847 +380981683 1919917260 +1457349011 1367382636 +3557230245 1812952492 +4141916718 3516878447 +2211624517 2211624533 +4193263764 4121145458 +1047149316 3086292771 +3757737402 1365279709 +926478326 832679895 +2315792567 184625442 +569688066 1984578339 +194250523 1582288094 +228737525 3353724813 3353724826 +2046302056 1770838205 +2992764365 2432871525 2830234194 +1141798909 533128002 +1758477987 2731711114 +1975333404 4256358599 +4201672846 1054724075 +2811637392 216644271 +2065826668 1116431127 +2629588248 3710610266 +1161401533 133827508 +1387652722 2790901107 +3852070086 3852070102 +3775158933 3470432394 +2536612787 3055858394 +4110957881 3784957157 +707926252 1490893719 +952972313 942689512 +1931175049 3782198395 1714916088 +4138959886 1788404239 +2934012445 1777548212 +4002738385 1702304006 +983847004 2896855249 +3875295062 4113622129 +3117599695 1440143064 +2922793766 1702382785 +4223249926 3314454906 1263334241 19088465 +2010053392 581607787 +826583933 203027906 +1200920910 1200920926 +3550656565 1579678588 +2489929077 382005052 +1175205840 3515936438 +1428206819 3850158428 +3818952148 701226169 +3927554072 2658979291 +3679222284 3279854048 497009185 2677831260 497009207 1164189921 1984680865 497009184 2661053638 +3381604591 996804664 +4078881615 142216526 +3333194519 510177922 +2106636685 936646898 3571664114 +310895414 1642769937 +1441012569 2400652552 +2406939045 2102066860 +2768369015 957704784 +1676507380 2438299640 +4093073122 4000410025 +2794413551 582016824 +2046997125 1863242228 +1235941355 2249962008 +723287617 2367392395 +4146150486 1599208305 +93802815 1598443754 +2524376130 523627509 +2185236028 4102449639 +1469232822 2622831732 +2299021720 1342954075 +873470972 1304123461 +700710905 3096179944 +546281736 1510867163 546281752 +1579869700 1099438175 +1901870946 3593979715 +1024063038 213590562 3991638857 1420731273 +3514989970 1651223749 +174962008 174961992 +3330520009 3756563640 +2297349661 2037192436 +3846667681 2224855915 +2129270058 57455553 +3062935325 2615968462 +4219819306 2543447429 +1928111190 1082569585 +683904369 2631379184 +3163471666 112655283 +280674534 179948357 +3016993393 2268418042 +124096918 988032817 +1076784815 3089263825 +3618035250 2913153203 +1294615806 2005572553 +2914998016 2914998032 +2358276352 3978684304 +1039206096 934998827 +2631177360 807245565 +3271721192 3259368551 +3047254158 2065143705 +746899392 3573969747 +1582981332 4225677865 +1672733559 186448372 +2514960046 2835852281 +1927506645 2969644380 +2841012659 1174955212 +3423105137 212809463 1592655104 +2724085081 4082799368 +178684254 572368639 +3381922213 4178259642 +3478937626 158009969 +3331308380 4030984647 +1295541104 4291070275 +3241804895 77531420 +1339986561 4254895946 +2637202590 291554473 +3345017359 1484433446 +2421678634 1683556365 +4063158670 3452768921 +495377947 495377931 +3873624102 3593990362 +3800581948 2277122924 +413170344 2123785941 +858818685 858818669 +3903504618 2299843366 +3833985552 3471353635 +3486390222 997979993 +2051593835 3953756788 +2283496988 1596046855 +272977930 3299247407 +1568554796 1505587777 +466069193 2219544184 +338444639 548071582 +954905996 1658923424 +664141674 3139507163 +1052677287 1828979446 +4199193222 2305900769 +4258163375 1121918971 +2581057614 4142085330 +213777777 3040184876 +2274101539 2222088732 +2224441458 2030961765 1059831355 714345330 714345317 +2354832940 548099912 +3354928814 1838338361 +1413064157 2323410475 426398146 1941969652 +3484628564 2047691688 +2812208342 3038919911 +223496412 223496396 +1390967095 3136737680 +3371395811 3975973862 +300166623 154416648 +2021621965 2655487118 +2760988427 3160704757 +3454449757 2704795714 +3831443697 766061715 +1192542801 917366160 +2970678288 23315068 3450877237 +180145295 3871712061 789185754 +3815843977 2485309368 +1184122261 1076069420 +2519510887 234842197 +3459075383 3535696294 +3647329373 2555203170 +2112894864 3509024693 4155521896 +4032763318 4032763302 +3263059887 2683917548 +3054502689 3054502705 +1500351874 1232454581 +3579086969 1293080190 +3250341336 3546411803 +1061122092 2624988907 +3368567111 1514062550 +2596940065 3443441376 +3783954757 2580232249 +3211373594 1834609917 +2915658686 3724548093 +2653838124 2653838140 +3687948086 3687948070 +811553497 811553481 +3119909824 2119466821 +3727596386 3727596402 +2937073415 2642020374 +3860345830 1970595557 +2432950636 3038502167 +2010475317 3656893564 +4140664011 1463733417 808669583 3300875422 +3925078570 1111980437 +177793393 532118768 +351198702 3741891758 +3694512391 2947249686 +89342 2450377 +32946612 529638361 +2757789143 2599596390 +3550410154 3053135233 +3566838789 3000841178 +3276869507 1211362493 +1928095102 3533418391 +2825271506 1738892217 +2279322025 2279124248 +1872484132 3595808191 +943751038 2905422494 +1179112851 907359866 +1131984232 2589096419 +2131559588 379735370 +2047514150 4013013350 +2903761054 340433087 +3106942770 2997168859 +2381434613 1755892668 +485051335 844821927 +29236272 3997589397 +1385223726 671165039 +2723033414 2124870022 +4075754960 2836734072 +195138440 3613081373 +951816845 3695686642 +2544702708 283237193 +2838515875 4276445859 +2805855090 3998296333 +3808520624 3808520608 +2731839766 1788896689 +1697643477 529100874 +2675233726 3270071327 +1888996201 2835638757 +790501958 1919114295 +3023585787 2205856424 +2034920255 791073832 +2732359044 3843659487 +1668360208 2602701109 +3687456848 3687456832 +774010274 1111436803 +162260259 1553577500 +4268554344 3985312683 +2065387924 1610705903 +728790508 1309254273 +4257581151 3707088286 +1640413129 380186670 3033747832 288954853 272177247 +2863426040 3559370373 +2775403143 4060893833 +3008602831 1669489932 +1797380099 2005926229 +1430737356 1430737372 +3832257927 476642176 +2782340810 3685879803 +3650464470 2960725409 +2822209048 34222003 +662483296 2303408691 +3445148199 1774599008 +3902398388 3728418895 +394798349 408048498 +4109173400 3637683304 +1958578612 2256578616 +925995669 2170165549 +3942772617 2097943726 +2833346724 2128892457 3933034136 +221938879 2451503272 +1646062824 142500714 +2739754752 2301540059 +1781878865 2196598662 +4078172189 1957205086 +1524816444 1327336561 +1293086224 1293086208 +2857127724 1109434945 +814904276 334267711 +1392154630 2793230711 +2300759109 650612876 +2115720799 3825792926 +1975761845 1110314183 2811735088 588772387 588772404 1964977259 3727043648 +2632215513 2169611883 +692744389 3308226060 +2254469069 507953019 +3399458462 3813368511 +528770662 57488001 +2121029786 2121029770 +1053121597 229651458 +1899769883 2245172703 1556068996 +3934527029 1660652924 +2126059728 1753613089 +3432568543 2278843880 +2895957444 3031588397 +1528576213 402506364 +4142805330 184001555 +808472689 940106589 +1411322827 2630082808 +280759716 4228479295 +2763656652 484685857 +2662295974 1948471361 +2164248934 2025235329 +286483606 1359988065 +1449615321 3720077982 +1526224640 888206611 +1373765919 96977886 +1408545173 2284310586 +364721585 3923477926 +364483527 364483543 +113696 113712 +3688528893 3501026110 3145537137 +594112347 594112331 +681270579 261332490 +2965829078 523567089 +2530037918 53864617 3161245085 4228113832 +968798794 3988938661 +788154509 2164274674 +1862285558 3008998215 +1461599797 2054602202 +3691851488 746521005 +3447497159 1110617174 +795552383 615769576 +3671086248 2719664759 +486046544 3945406197 +2750777112 864266957 +3554693775 2826435276 +3153143349 295642474 663217613 27200556 3153143333 +3983394682 1037108491 +4008878153 1894929144 +671251846 351919098 +3049123761 3627843245 +3231741009 2375490438 +347976067 3228320102 +4117050802 2552763925 +4175156290 1846443707 2447075032 +2254043593 2862828920 +1769659354 3839758833 +2571921617 619486304 +3847499886 3900199150 1904753967 +1937870158 3507890393 +4182367565 3158794290 +979754330 2465769763 +3844562408 4038466563 +1790147747 254476070 +2514391151 1549622958 +2216789919 3220128520 3817811886 4074679627 598330454 +4190915103 1536732872 +1682867804 1210439781 +1030564528 1658467093 +1710018285 1623834372 +2414418463 2868125384 +4062469953 1883370304 +2038980920 2310081339 +1803354171 1892113650 +3787933279 4142113718 +2773508857 915131902 +744831834 1761397770 +109066259 1322796524 +2215390199 3467721806 2360897915 +1135250681 2122050558 +1746050037 3393946282 +705212669 682532418 +1123857517 3771729810 +926674516 1027319770 +2234220929 2257689776 +3499516858 1759428650 2578024067 +1428085894 1087133393 +3676041961 3590284494 3590284504 +2847174092 4077443127 +727015742 1910011465 +3848802258 4107331475 +1680395371 66902671 3682880382 3574336921 2031487509 389663860 66902680 +3503282124 2201007671 +2942627953 2363916784 2363916774 +3937456781 351766002 +4226254891 2445177119 2059291883 +4036373860 1862418776 543781993 +1536627345 1536627329 +3225836889 1292543317 +3903581926 539244507 +1689347794 1430576261 +1258052892 693585180 1464156390 3430607604 +3381362969 4057352179 +2714405274 3973557942 +3692823998 1042090505 +3035851531 3862004308 3018861103 +424390298 2809396341 +2166303863 3471305460 +636001048 634883854 +7562526 7562510 +1001581410 1554549571 +3652250183 4169190848 +1808195211 1706399742 +2396409836 2396409852 +2544613417 3964856462 +2214608404 1696523284 +2257936947 654192309 +3780925769 2676923557 +3096456955 2247750962 +2267243220 4092109976 2427753391 +2349040529 1213427040 +3712444301 3832021755 +2160024760 253542213 +1592679167 304009387 +986549002 1163553414 +1531460885 3350734876 +3270675609 1196214660 2337089730 3434401970 3900413954 1862471964 +3137135563 656054402 +3896311433 321474400 +1139824655 39493518 +2324588638 2083408895 +845926287 4005019150 +4038442400 2468939839 +1010385570 1881400597 +1321146171 1357425128 +1003251815 2311608886 +2149278806 18805607 +2586626363 2586626347 +1935473355 1717489026 +1365269444 3415655896 +1351462346 2567476461 +2211546251 2553257902 +2880451095 1566497318 +1583715597 2800329572 +2553350928 2771675701 +4130845754 307367713 3551573853 +1642670328 436960891 +3491285158 1023663447 +1841398793 3500333624 +1196383400 1196383416 +2046220 1025953249 +1097057976 1212238647 +1807293807 2297110266 +2450912552 546369003 +2911951930 1963634525 2329015042 2911951914 +3078832275 4289345174 +1785981845 695983004 +1327244156 4115383063 2271977776 1327244140 +1722741927 1282089696 +4077681631 2074542110 +3077955958 3099049302 1150414023 +2858158115 4108711475 +805547764 329472799 +3127346222 2865703609 +2425584108 2217275009 +116160128 1715374995 +565440062 1279265667 2614245482 1173334273 +1123565635 2949458282 2949458300 +1198791490 3816120398 +1175618468 4079303487 +3483834982 1242467969 +73250356 73250340 +3230661070 615885135 419006286 2776529329 +3180480288 3391386604 +3065998642 3780699571 +2503175309 1827922418 +3707307788 3892713441 +2521370702 1626254618 +2089729934 3052553497 +937230331 1721079399 +2542066199 2636337712 +4001101920 3441950515 +807499067 1822373058 +967616480 2865513907 +2714412713 1527012376 +2687286470 2687286486 +513238397 108014197 2773795778 +1205835062 1526195207 +1137779971 3309126570 +3405796266 643222381 +631259214 2303015631 +4138382195 3250093594 +3538131752 1026374150 3651364100 3625198044 3439485060 +3973261902 510367961 +500767262 1639582270 449060159 +3692119664 3738341360 +915334483 905118124 +1828904852 797308409 +3635017104 595014969 +1990943073 818564022 +1745109844 313916719 +2305287659 2614797487 +1626072024 1800908045 +144900879 2812137624 +102359361 4237079527 +3383590103 1394312816 +67677276 4189025123 +2493558264 2493558248 +88094632 3960970621 +1191828466 3330620915 +3569138417 1902218112 +2687698916 2687698932 +519585878 1277650742 +4184209081 2156026031 +1133843894 74842634 +1685168209 1663443820 +617825733 2322690465 +3353625793 3211426265 3312091991 1834499030 1834499008 2875873895 1920388252 653924833 765317279 15089684 4159058406 +2453163662 2225335310 3164842383 +1633115376 747064771 +2683474439 3520848150 +594170733 37233092 1113401247 377157467 +3895116529 3914519446 3182256639 1842149860 +400832331 3879930626 +3586064019 246071674 +3695284120 1783495657 3341569705 +3219024468 3219024452 +1987877911 2636757030 +1012147928 2045562991 +3752790112 2156539699 +130534129 813988208 +2502310224 3147671979 +2882403936 3578229029 +3060351993 385727087 +3442378451 3544071724 +4015305480 2845728421 +580889948 1272180241 1872741584 +4044392072 471528155 67585354 84133917 32769461 +1067264185 2855971952 +3314156312 1715780773 +4246517663 2777904413 4277188871 +3393439174 3005141046 185912642 1795872524 848853957 1881244518 783308471 +2040238449 3773166822 +1861061412 1827313919 2843471389 4065021723 1940736061 2589167457 4126406683 3129333795 2641572245 2082225011 3620167924 710226232 448366618 772679254 3883494330 940694631 1425084359 822808521 1119119584 3349908935 3095087342 602082462 1539987617 1062872164 20344997 361908297 4100613335 2896845667 2666654738 1802301107 463859339 4063586268 1745115660 849037275 3072934305 279319828 2297450412 3087989217 1397514797 3871772552 720712065 1603700386 3596161730 8562806 3010175316 1891226746 4142466551 1233123754 3850890283 1391559712 644815567 1662870410 3226413414 4267104627 1392976372 2879552788 1680640403 4230551610 2721210737 3473341560 3548793784 1675469975 3111762352 1470966294 1777708969 3032684361 1823927702 956953488 3126851328 2421073200 3026150256 999118242 3815915250 3921594058 2233878739 2204585111 139240630 2909378857 1118515408 3842086736 3760169266 1583445781 2359271471 2003033020 +2150897120 3632906412 +2875828483 3663007658 +1037550693 893049479 2570119843 3001132938 +1258959248 2970355107 +1564704792 3913459149 +60360625 1525095334 1525095344 3218114113 60360609 +273759947 2061883778 +3878690960 2160280227 +2471059327 1535202558 +3475872912 3033364131 +1292598409 395226360 +2025315530 3547369979 +1585507226 3739225870 +4156675070 69253321 +1194332780 2091712520 +193661687 2051305813 3123654004 1449282985 585253574 3274652546 +564257106 1138078725 +840150307 4160327178 +1008241183 3114364616 +2347875839 1284380776 +662728051 1471919840 +1669503365 731360346 +2803088184 1007663405 +393785628 251580167 +4184869119 2858297704 +1056335177 1726050798 +2860099831 1418001616 +104412476 104412460 +3894125347 3663371271 +333953676 3788155511 +2638977633 4278453920 +3905924630 458287841 +469400054 3770884298 1287208294 +3810119748 559858741 +1830164849 1830164833 +2735705175 1206910420 +923367335 1256676342 +1084120786 3771265901 +3079452980 646417616 +1866846784 1793718995 +721795169 955834000 +2773446423 1393287472 1393287462 +1036680304 3960146184 +421730556 2386580657 +3501291525 2355097562 +4178001628 3798463569 +4006368265 4104669742 +1539812631 2358307988 +1606910635 1913828130 +2275529982 601714718 +2263770538 3080214374 +2005582281 4168028024 +1221387855 3918433870 +3205448164 1789945614 2835659263 +170992813 2348578052 +2473743245 2851702514 +1987282716 3606953415 +810473651 3206488538 +2043709122 2043709138 +4293913318 3434006529 +935233982 4148630217 +1554777751 1876992515 +844196054 844196038 +1959416376 310341179 +3835867813 2434742714 +2767660672 2362806489 823237523 823237508 +379455942 379455958 +1103450108 1103450092 +4265530013 2667069589 +1645940929 832266176 +2937024730 1464654030 +1668082539 3182960405 +2107505292 2303358625 +96569531 3400154738 +4029930616 2577666299 +1208393672 2808930531 +4031304297 4031304313 +3295993181 2700638580 +1715774319 2098028798 1715774335 +2983373209 647026469 +2684778993 2684778977 +3305781396 307212716 +3876716054 3612540081 +1507015155 1518614925 +2465186395 1643571451 +3108591402 135895014 +3195680236 3328369303 +2767498128 3004836562 +2534059548 1600317640 +3837974368 2126056499 +1889688258 274442461 +3002668087 4112175769 +1319165332 1319165316 +1112638571 4267727083 +2601418768 668178741 +2028837605 2877412104 1921820882 2650068777 +1305113000 498133885 +1993334377 329861439 +3699059833 2798540783 +1657585768 702795088 +3602217353 2293125816 +357601861 3537257100 +890797837 2727346546 +1742319929 3031563432 +955301846 2533701994 +2935557629 1863386452 +2903392091 3362634834 +1793986303 2450382063 +1316172424 3727924400 +1521081401 1410368009 +2622491678 805507903 +798740260 373757375 +850629150 4236591657 +3628970728 1783669547 +1976392600 2064714035 +2287529275 3741152242 +3676700064 2630763237 +2729027224 3782980540 +3975911321 2836375006 +2363315343 4032047677 405914074 +724787818 1810099405 +2963936634 2963936618 +2098947513 2098947497 +3313152636 1546058023 +1543339452 321694384 +4164139067 4100654308 +3804224841 4290284370 1024023032 +254429150 1610888765 +2117662090 1034586171 +2130118287 3328352573 +1883517573 1130710356 +2010466264 1869049715 +426054118 3759877377 +1983716342 405996625 +2458936226 3615884230 +1644625969 3629676829 +2020755244 4095879827 +1891274631 4239389065 +2027199969 3806073584 +719636952 1579794189 +2698509271 3276323139 +811160087 865876528 +209587987 3178347258 +4011948170 704741126 +1259373609 3390292878 +1902684369 3204635766 +1415152319 2280182440 +2212719315 1926077741 +1388069187 2170207356 +3634987656 3553316544 +4278817215 2085474026 +2619854346 429408626 +3530848713 673727781 +3233231020 1051519447 +1388710312 2919966330 +4043934578 4043934562 +4195531029 2378261592 +3242924635 2755296580 +3362075472 1115503784 +3074405344 949590477 +1470451769 842877374 +2205762885 1021840268 +3691949087 4244521559 +3922749219 907172874 +1152610155 2440586594 +811413346 3985679790 +1415147429 2418894044 +2171729304 1583717965 +2515435037 594577332 +511833299 511833283 +3374566181 3374566197 +883966559 1350073246 +1519322401 1079826769 2955219702 +4115675898 1761038293 +3245995841 3556784960 +4292759290 3304477597 +1204121834 3855663181 +1123016257 2694504512 3173307111 701441894 +1421484088 153218771 +361404798 3472558217 +2876278092 773969591 +218816681 2467299262 1591258546 +1531608439 759398992 +2517845338 2695385379 +2873395586 2924402115 +4236508010 3989096397 +1458685231 228157678 +919134271 1153429935 +588832241 588832225 +1951417595 358389540 +3651348985 1189008117 +3808718015 519516350 +334865528 3820087533 +519730905 1969508437 +257100878 1841061593 +144694428 799558023 +2570148611 685296552 +1741799541 118289235 +3927844357 592576659 +532996634 532996618 +1022415573 2827410531 +1787817031 3039808039 +3732448616 2683069099 +3999526281 3494833830 +3062908436 2667116507 +171987475 910242810 +639252441 2858721195 910136389 2524173120 1928116172 3340838609 +1299393520 3696110293 3696110275 +2871354490 1318865811 3066717337 1318865807 +2310357631 923190314 +247266941 2961481410 2730879861 +2580997776 3175937187 +3202477262 3202477278 +882581067 456175636 +1132373482 249007186 +2419129310 1826300393 +2028300730 187002827 +2603630710 3426470930 +917188094 226059977 +299377596 2133212007 +2799988776 3785133803 +3712902083 3711425968 +3111701168 1686312205 +991369655 2536028724 +3697295924 3626258638 +2700337179 2062142098 +2939591962 4151889653 +2920396582 736317633 +2653733896 142121117 +4172492994 2822926294 +2984056288 3915861208 +556233805 3090505125 2115769650 +4043600683 1158397774 +3051311129 1737168734 +1391612617 1551389304 +4071382385 1985419494 +3560019504 974089621 +1527339157 3837162140 +2162349133 840185138 +3354949001 1428227768 +437389873 996543270 2812513473 +923367347 2589158199 1458007756 +154853095 1856824736 +3509381306 2630357909 62020829 +2987190177 3947930230 +1520199538 3388433658 +3378788341 4257486506 +3553675775 1890450558 1890450536 +3498164282 1290032535 +1416223895 2040938928 +3527301212 1411717319 +1573158312 530685612 +4202431644 1556921590 2686157155 1734593729 1321934860 2679050564 1741475408 206403409 3077097443 1707920166 3980083601 +3207375162 2641037333 +1700263830 3350457158 +1852099004 153451780 +2857034057 396698309 +2408272922 3345866229 +3424427230 789246313 +319449531 319449515 +1082853800 1121989483 +1577442180 2268631263 +1904048872 2424863549 +922138829 1399122596 +3759330535 3489489124 436029177 +69459114 3157426437 +3458779908 713238511 +2216948035 3261672625 +2424567467 2882939605 +560868526 4240917884 +1101111218 57566501 +682365798 28919448 +3381197561 1211979631 +436648198 1859245840 2393827437 1725024890 1006290769 759119615 1006290758 1813484541 1708247268 226435822 4271195255 1796706908 663752475 +328910939 3819802632 +2560714773 1528224010 +3145401246 2006964599 +945089064 3584859389 +3224112524 291066721 +2772313595 466995748 +945783611 4183528946 +1594455294 530452511 +647513645 4004935876 +3503329207 1867660550 +968789205 3153572700 +2291551949 3516796068 3516796082 +2215807295 674106942 +1472098828 3108651488 1754167841 2506628700 +3820874834 3589997850 +795460813 795460829 +1656148354 3888893859 +3677389258 22248229 +1687547991 3633114147 148355850 2936625382 3925643274 +403693399 312477891 403693383 +3694712692 561720217 +3686238975 2055435680 3773812577 +1778096253 1410403540 +1586926058 3506942811 +1678753481 1305040504 +622305784 1546910075 +2593236668 27981415 3443498476 +3180706858 2629252621 +1613545620 4201851129 +3195536704 384844741 +3127714909 3603971700 +2756571008 492956962 +1351663316 2816239545 +1000191436 2772774945 +1639005938 795057170 +3099079257 586629640 +3772571042 622849559 3556650092 +991463543 2124337990 +2484960596 2121026351 +2303553879 2078895088 +2557938322 234944526 +1196609746 2199893357 +1610292935 3746657088 +2271588727 2618711622 +3074831199 3074831183 +2950146506 2592098555 +231636283 4144964594 +3675942844 999253863 +4186268127 2885227038 +4010395266 3462626997 +2793716789 1475626876 +1824243464 3306893876 3306893859 2998027824 +3795333798 3296181057 +347206140 2418012071 +1176507675 4155499246 1413604351 +1848693985 1474240032 +825449424 1138329699 +3206455184 4038144738 +4078414069 3004931091 348084715 393994128 3884863254 2310425105 +3049704568 2683560164 +145753021 1779819138 +1662375431 39841024 +2267986797 999361682 +2466069103 3550674104 +3364118006 2657086033 +225196815 3982781681 811661454 3232192332 +319099434 2500883077 +2614759900 877272391 +3663598545 2527706998 +1636240608 1738097843 +805580177 2475675446 +1337349152 2617667187 +1389405337 4151516382 +2900057059 5351004 +2729199255 2889031590 +2860628335 3644254641 +4260258973 1531470626 +797572624 3862623029 +3188025483 2911081172 +2780422402 2575055133 +3310807913 3810928580 +695796571 2759870546 +2611202479 2611202495 +1337896800 3912111155 +3279598969 197270857 858500478 +124263451 1329890534 3286515346 +4141758628 1137912361 3849015417 +1359958390 287128785 +2509318575 2509318591 +252369992 3120471680 +4006477129 4186086304 +2080472187 2975266212 +897933213 3723854882 +1508905502 1508905486 +1385777206 2259968534 1028435207 +4073032827 2818319794 +723147684 2122203945 +914238649 3646696501 +3719526472 1233541451 +1555615843 1508903882 1777345818 +279197370 279197354 +2464857404 2206721383 +952558319 906602299 +247465053 2504449652 +4099893494 2821864263 236146902 +959949013 3885942620 3908286828 +2497661306 3581979403 +382863649 2025950068 +1159505752 3104639191 2390080962 3851628653 1225861328 3452898729 1262797880 2379672548 3449570962 +297088881 1363560176 +561503438 2108725327 +527923212 2500983521 +1692392272 3454301352 +1559657980 1409831847 +1729688451 3746001018 +2200239144 2604200683 +3026353901 3026353917 +1569767875 1393306522 +664586117 3242214836 +1702330041 1948024104 +1627795918 1627795934 +1042244780 1042244796 +3597010401 1671119158 +2987026448 4264703683 +1517593259 278663988 +1602527042 2680599797 +2626809201 391386403 1877233700 +4203760815 889747153 +3548344745 3548344761 +1817277427 999317879 2000258956 +4274429497 3494904117 +786615558 786615574 +3929326967 1772991024 +2336718311 680211104 +1724708424 480752477 +1121764540 4253660145 +2976470965 4258599420 +1046958429 2577732962 +3310824332 340164632 +2584116485 2100743884 +228077293 1402068740 927405468 +1909537105 2103261830 +3245098664 628308605 +1181231639 3853371206 +2362191096 23806787 +3011206317 3390926098 +683009338 1347934813 +1553161756 1553161740 +3770162816 739084891 1247458232 +4083819059 1662244442 +1198758930 1206883003 +5867096 3056114336 +2465202812 3569001132 3725957409 4129267780 2416051366 1992162901 2379431810 2987854179 404062332 2077529466 +4042870571 2840722254 +1688588366 1688588382 +3158345933 1917044261 647453362 +1356613296 4207101724 +1120167857 3425647536 +3219920343 4154876272 +1058430776 2633876932 2285364525 +1581380168 2849007453 +1580965809 148661168 +2918256698 4077864706 209488715 +2115328779 1060870712 +2930671924 3425268067 +3831652854 3690295745 +1004908865 2341865814 +2946773522 2440745555 +1599798385 2369480176 +1685107452 426361521 +248725954 412124259 +3907203857 2930336710 +1429938632 2721156418 +2076189253 3458731225 +4157715723 2532971147 +3515900674 3515900690 +2851146222 1953669551 1953669561 +2158629901 3832177522 +1493043293 1961306740 +728088512 1318923675 +348673510 2640263447 +4151534472 312848157 +2795048020 3044212785 +451830139 3762517170 +1086148383 3130389387 +1370104369 544564417 +3001951648 1290091251 +854469654 1122985639 +3297622972 360817513 +3305059091 479442986 +1579878144 872146651 +1160936380 2860042481 +533535456 4024520371 +1581941305 2823487422 4095699643 +1015931596 3541057637 +2039666170 2039666154 +893812112 893812096 +2177101194 3580413446 3970182373 3513708589 +3530128986 3037438710 3542047216 3834201447 1465265123 3912217141 2754357445 1527349807 3733535753 2517755837 3979327601 +3543271894 1424100534 +137766661 4064242906 +1635712307 2917701466 +2827912409 2659474837 +100240200 2950054475 +906429686 338316503 +2978512892 2978512876 +3287890029 3998471058 +3869149166 3713895086 +708279792 3238459784 +2356677148 1266342668 +2694845515 2028606830 +1764312221 1470195575 +1380400961 3341325142 +2651285578 262745211 +764067749 3246861953 +3763225255 3258117366 +419046901 429542285 1187627178 +1071895453 1760223309 +2782548689 3887095568 +4211412874 3219485470 +3569037792 3266282419 +2013224000 654194899 +3697245554 1548909171 +85945837 60423226 +4254149936 1535779459 +2487120542 4232998591 1246933570 4000863913 +1421193524 2382755033 +2889460481 2653397542 +2265172351 167129832 +1869709791 1869709775 +3758961958 1078105200 392077719 +2194089825 2357081149 +2112811315 3177388877 +2303902280 4246210420 1967642461 +1747357842 2260047301 +213619428 2545410776 4014488809 +2801215907 2048297884 +3268524436 1117626601 857369460 +3412058826 4059169778 +2033436950 3800403367 +2171556309 2171556293 +536474794 486030438 +3082159831 1692116010 +4293728429 2403194962 +456345159 414687680 +2391982399 2953197118 +1340030960 1273602397 +4227163335 4227163351 +3391059829 3430386225 +4058927075 563541712 +1373080110 3247325918 3808836014 +3568256047 1002393375 +777679190 3368517687 +691683129 531728040 +2086397030 715689089 +436639654 103927541 +692926360 2626585677 +3742230107 2111938884 +1450867857 1505506848 2051627143 +2999052642 444952265 +786013862 1427218011 3990841135 3974221246 3096848222 1849628773 3947122880 1417102650 3939843338 +1861830055 1861830071 +361799850 2628578203 +2368514382 2337179087 +1681451573 4204310890 +4183325748 3125511641 +3193437501 272628489 +460364720 689023110 +3755948901 3513417722 +1444367963 3786430802 +3717031916 392041216 2979698817 +340860957 2278422018 2438463211 414551476 +2511688906 1608368730 +518401921 626837504 +46629713 2970859654 +1173868415 1173868399 +3984853748 3671932431 +2242899639 720685574 +4627820 3676950785 +873108670 3317011913 +378866156 1655932183 +566296909 1876233266 +4148431071 4259307932 945737254 +956952556 3064246423 +2373969910 3059361873 +3348822911 3086608616 +3569139541 975254218 +2106645160 1393047165 +2884324861 4001070339 3483864382 +4239543230 2326608905 +726582268 967603632 +233013812 19259071 233013796 +576112884 43931663 +3467038926 2089408601 +2469011402 2469011418 +1148689812 1548554223 +3617481320 3595889067 +1441465381 1710720570 +2775523550 1274068329 +2339502803 1466817082 +2386713512 3782522579 +2131659049 832948786 +3726274242 3175853980 +2461708290 4259517237 3480690717 1873097870 +178473891 1914038813 +3348265548 2006353335 +1958748893 2809586164 +3211334887 81633508 3791295246 +425730123 1028838914 +3957624180 3435834777 +3339388705 3957632739 +305600041 3585598104 +1583408772 1168207737 +3127008730 3295947404 9574695 3545394714 +2461562546 2858605093 +4035486489 2066334429 +571046442 3203092493 +1792818087 3297847100 3765618048 +4283377383 1507957950 +3915101638 559883959 +4212186183 4212186199 +3416918853 2854028823 +1993334397 1440146699 +2230994895 620694222 +2161475829 4005550697 +1721446596 2171364271 +686255162 2656001858 +1191748361 3684214574 +1909678408 1909678424 +3900310171 2467437074 +3540483305 3306435200 +1240993204 628986447 +2331710060 3550086314 +3472203195 2007446562 +607410359 1874557077 1272534249 +1420195459 1420195475 +2013460152 1043392529 +1443472984 3375422619 +2893604591 2592247775 +3261683417 3839080350 +386672292 386672308 +3225368775 4052424658 +1042954315 1042954331 +3657558724 4110717599 +2875036899 2807128412 +2189458004 715534249 +1052596462 2987589305 +2365940795 981256420 +265269733 3371502458 +1295604547 2710195795 2911527216 +1625041912 1328770853 +3192232764 3421359920 +1235246430 444216617 +1963294360 3483781453 +1100955905 2202941012 +3947951884 2088036343 +3676022082 780478179 +818823056 1246415188 +1904842296 4086790715 +2982327826 1143762435 +1693285244 4126321241 891215526 3821273737 626395349 3896529385 +1160462345 3960852024 +3516674470 1963294950 +4113192241 761904173 +1699699442 1844194035 +3344465205 88939114 +2261904625 1865259517 +384777603 1534504294 +721305221 859597658 +440198915 687498420 704276053 +2257378879 247586110 +1021772594 296355763 +3841755572 295453803 +1457559526 2844729089 +274620501 428975562 +3576949069 144015745 +686470955 1994761048 +2260409166 1720450009 +3441541556 2686709327 +870936660 3756987816 209441849 +2243424478 2243424462 +714969313 1686374401 +656172093 1675896628 675763275 1675896629 1948890831 3467758594 +1748243988 2291729652 +273430521 2700877032 +4141803091 292321582 +2606330984 3002748983 +2772631953 3111876432 +3024808905 1470792750 +991729555 2620689572 1306081284 2710929921 238459142 4085041206 1702655486 4065029286 +1017724400 1852604611 +2498590811 3436476228 +4129867800 2336590244 2587033037 +3616429723 4027733522 +2459849967 3191845934 +1901622243 4195497398 +3389053159 3864359840 +698854406 2566114657 +2476673701 140362156 +1418323741 840356532 +2939207312 1505492149 +2396468593 1305026800 +2196009985 245538198 +2856967762 2294993625 +2401289307 3384706235 +226455809 1084155030 +854894331 841145650 +379646832 1806039303 +3606756090 954585045 +374465387 2380857698 +75469529 3990104968 +3178406348 3306511260 +2234019235 3849934566 +3928570397 3152444340 +1150993442 564314499 +1396904168 4203978045 +1000544531 4106254586 +1771479845 2153540835 +4013769235 3158033492 +1935460441 4094649374 +3735184902 2141625185 +53361927 147460630 +3353539237 1329854906 +3285922434 3557851811 +916740334 4072144569 +3070271990 761116690 +3904154916 3141896167 937828540 +517953843 3432606554 +3041888321 2905833024 +450314383 4046580744 1917124843 +979338837 962623434 484217581 +3563995455 946254169 2211365116 +2848571634 2848571618 +669097035 1563576947 +824688446 2677149321 +2081852162 1501352995 +4058476352 1965923320 257171923 +3311059926 1440757707 +4058069435 3277443198 +820071943 728121248 +170581049 980987326 +3059541029 1377643868 +2665080856 2665080840 +4228741042 883279134 +2510942555 2522852453 +2672289044 3526205049 +1909148578 3305639939 +2187374528 1911135643 +1120733593 3705523093 1176992668 +1845712218 1788700214 +2039397178 3392855214 +1080400470 3052533102 +2692838853 1892443404 +1483824614 544657687 +2742085122 1287263523 +1302072031 195370248 +1218315494 918664727 +59318528 335057101 +2268883469 4045075044 +2485646176 2385948610 +766346290 3733915611 +3874816965 2734180769 3533650729 4016171904 +1829884240 713657211 3316582392 3172097906 +1531056016 956202933 +3893425716 3453550050 3920741611 +2665718030 3234831634 +3246945843 3246945827 +3407261592 1287023693 +1465148369 3654324065 +3836803835 4254800164 +1914134741 1499806332 +1425547034 3701011965 +1086365758 3571141961 2552033314 758923657 +3531811311 1400570680 +123520380 219616808 +2471351843 109582602 +4168880844 4149319479 +2152827930 3273267875 +606115178 1229665755 +2101111395 2300279260 2990593351 +4090185797 3892194627 +4269719638 4152936295 +197108335 3485928129 +3165330347 2243155356 +2071183256 4013333572 3532460531 3951982265 4013333581 2302993339 3951982254 3039237087 4166975726 4013333595 3606576917 4015977165 950620832 +497492956 1707648588 +1748700580 3103160617 +2489891418 4208810941 +166392056 2497271419 +1189809550 1974718105 2629513133 996182291 3936635007 2357514438 1602838395 +3572653357 1720233412 +888560264 3889202187 +2392017361 2912618007 +1677631138 198424853 +578636529 1588768999 +1069571128 2551505728 +822449871 2230947377 +4081169529 1768888958 +3111774883 924381062 +1027900698 2363328491 +3862470189 4187714375 +2175335841 3188147296 +3539258412 1130195265 +2230796598 2566090734 1134118706 3835903732 2268833799 +100953770 586823053 2184684904 +1449251108 536624063 +2136140984 3963801413 +1003429834 2041466721 +4008486575 148749307 +2379393253 664789100 +4236347807 2332251659 +3339517269 3326224023 +274106911 2243020449 +1502106622 4019992777 +3953604830 3278644969 +1248608333 3857444961 +2366101379 2253931306 +1045123626 982669339 +620918977 613636514 65279936 +1129514930 2914327845 +307946437 2853474060 +2537917472 1115395685 +3248471645 729328756 +3800798903 3800798887 +1245394777 876093726 +636670617 2330067115 +379769382 3360739777 +828184651 4065900920 +1219108313 1020066952 +3481244886 2780341298 +2720576061 4218180625 +880528161 3190687566 +818964013 782627317 +1823358877 2996597793 +4088435311 3972146705 +3629125263 837031643 +1559877816 976329555 +2804822483 12087084 +1164898173 3231433845 +3852968725 3902768700 1956896172 +1431195696 2051554204 +3866957001 2682763374 +611550117 2154272970 2154272988 +1469758586 1044213077 +993327112 2885522228 +210286488 210286472 +2749537137 904372225 +3341659729 3698400736 +3140320619 3140320635 +1784525899 3050422972 3656432587 +1809279294 2959063814 1698595813 +1300510408 3475127517 +1063562308 1063562324 +3635089054 3007840959 +1906780597 2670110716 +2193503511 3899495216 +3742076256 2133823027 2133823013 +279626911 3688072798 +3837991913 136638414 +1964769286 1233839687 +3689430095 2107043928 +2533554397 361454805 +1734047179 2147118722 +3902954771 1807685937 +3485569710 3149522927 +256218868 256218852 3496160607 +548994437 137828428 +3595024677 4243622492 +2248197327 1606027313 +2904305129 1817986520 +3007200264 855146635 +2669921041 2521568208 +1580192142 3544638105 +3550936610 1373769621 +3835757261 1120846250 +2353721451 1157134434 +1279586883 1401511786 +485651480 2846671323 +3255692274 1575638229 +2171748230 1289355255 +2748987260 1820678193 +2193007665 1583849527 +1107080759 399693968 +3862422248 1375351613 +4263730194 2005226170 598339667 +1768998736 648590921 +4270647514 501441292 +3083957661 4223411764 +1084679248 3252803501 +635247663 635247679 +170057893 2582094764 +10414430 1479106303 +2879511792 3817734159 +3136663163 1448773353 +2248029669 3559839596 +2444827423 3340164555 +2943465853 918700710 +3210474405 1919748128 +699141379 2647309814 2764753127 +931176044 1477998721 +3833475884 3735719489 3346919488 +1321451126 1939197670 +845556590 3507439410 209077230 3302383161 3302383151 +2034470965 3789116608 +3411069132 3693877559 +1374610124 3339650849 +3859764225 2069099302 +3562934846 1287851849 +1546881932 1760230944 +3423965428 1389672264 +4136170309 1892530745 +1991467753 1145779514 +603443034 3077865188 +4287466559 2329134910 +3121663768 7733979 +2837188983 2922348102 2378425858 +4254720784 374340072 +3964539682 552083075 +3088447312 3430848427 +3006650003 2965424506 +3466733663 2823130504 +810482783 2255013736 +2395736709 2395736725 +1191218678 3011968202 +3982530231 1712144902 1712144912 +1827344508 4060803879 +1687174843 3307397 +73537020 3798506407 +2676013736 538500624 +2841145246 4071824297 876066239 +2466053569 625178304 +2258999840 571789060 +4098142295 837009876 +1751957333 4060084504 +3264251876 763751423 +2031758435 120840156 +286691532 3844931907 +3045519259 2797480286 +1193060963 409108008 3963676808 962278225 4286353395 +2837999659 1973982132 +2791009686 3991236629 +1858382017 546678720 +3120792917 680191196 +2451503462 2451503478 +3303371420 4135980039 +636001043 2542509392 +2585835485 3493423847 +3749501642 2609671149 +1665436445 1642528436 +1405691079 127198163 2105560473 2896487744 127198148 +3009298788 1957214966 +1867713977 3456944450 +3345253529 2084355294 +2673581757 2587550594 +1723172601 1682053301 3701672804 1332252218 3141365287 3023921952 2114769799 2831383016 2780365954 +1358802770 4080403031 +1928601966 1683005497 +1935002331 1796101842 +2278966068 240145289 +2323370377 2323370393 +1582602726 1697531137 +304098011 3224178354 +1440440754 3663383354 +1755453005 2420110576 +2618763914 3612580502 +933530897 875527021 +3580004592 3659370947 +3495935872 2626196315 +3463453531 1434128466 +3425635546 3579488053 +4185708307 3532034796 +3674172493 3605554461 +704592775 1629210296 2747970953 +3658461348 3937604137 +2944420991 3321392126 +2199692947 2420663552 +305211932 305211916 +857814508 1259152978 +3837176848 1815491216 +1177689222 115533537 +478664254 668353417 +1060756732 2216091815 +279792896 1087387397 2377306936 +3687975342 3114614009 +627580041 1810164654 +3850378440 279793355 +1156774032 1748802283 +3379801129 1401887449 +3351613050 4127148555 +2018246675 1923358202 +3567269371 3213299476 +1483758177 2581481142 +2624790448 4181385731 +160322265 2643290558 +776682155 776682171 +3101939273 1470780654 1470780664 1494517727 +2608307701 1514177434 +517028932 3345080095 +2758618130 2758618114 +1461620630 3139176753 +274793741 3880598642 +1108676667 1109953764 +2572485589 903153738 +98688100 2434302917 2559412390 +1229496987 4135490654 +49558486 3347662518 2087557607 +3099577807 2136868876 +647042001 2271359494 +1805647599 4089737105 +2074904280 146158480 +1293485538 1080312515 +511584088 1486352283 +3579369179 109739084 +2757034474 2614231899 +2647394952 2647394968 +487564215 487564199 +2500623292 1587988711 +4100080609 2544950048 +3070832622 3070832638 +2598379666 1624458693 +1313126346 1046059734 2970363 +1342766824 3861464875 +3162661661 3728869044 +2612834731 3574312994 +1492055958 2519712039 +1036154263 3491699878 +3153545915 2706023538 +1075577666 2464044728 +3317198562 1465290323 +998339965 998339949 +2646817044 627960936 +1881580964 819380543 +2440763301 2848340140 +3497983358 3168799903 +117934056 4175098411 +1146712473 835572702 1157924457 +1903121415 1103283460 +2019782114 669630699 +4268429913 3683508766 +2327775787 2512191924 +18121416 4065131491 +3710718404 1870399134 +944947291 88395602 +350538622 2087944616 108672901 1668504156 +1024977322 1904066153 +92590780 1617747734 +2773398146 3168993962 +2233567523 2061099839 1189792115 980061522 1095608421 2749347908 2528641567 1970872303 1363902966 1591470875 192150422 3451902012 4271091409 566113473 +3257157950 3818306201 +3126649222 3862365665 +1503848501 1349749610 +2227918972 1972002343 +215026321 2129163297 +1157165305 2363709416 +1648240351 3416716001 +1727008366 2045163311 355622638 +2632474442 1271791981 +2576962949 271810479 +1278325452 2653916979 +3151016909 1084383570 1513824096 87676405 1170953675 +3459018495 2398272360 +755139948 1190660375 +2291303787 2291303803 +3257826324 3274527609 +1520177472 4217311736 834378523 +515550606 3990828687 +3848315382 220132935 +2810577473 2773322890 +1340485202 425388819 +2529918376 173461355 +1079284265 2116169640 1079284281 +611792438 3817166707 +3536979870 2982043117 +3713025664 334356407 +966849624 771731996 +541245210 541245194 1638318306 +4026882758 503357201 +49423758 825302681 +2850300815 3819090907 +667194623 948101762 +241722973 190391394 +1868074473 828859864 +777228282 131540614 +2937853184 2838826771 +2251482107 1025303602 +3257952167 1278049343 +629161534 1189215113 +4181591483 396559724 +1924086279 2430097686 +2774625563 1935589778 +1229886647 3532139810 +1370912714 1816040187 +3148663954 50727365 +1351849806 1112547902 +440147030 1842653554 +339741622 4098199959 +2877014598 970118199 +4167359346 2026206309 2446741786 +2080021255 847383574 +2156803507 2085704404 +17467314 1021035729 +1083800771 1956603626 +1264602205 4120386852 815635541 1264602189 +284245028 3485576361 +1308348378 1308348362 +2701135657 3853504645 +4043268670 2131545194 +2856784276 2715855855 +466158484 1366335983 +2917137893 1893217031 +3012429286 233167607 2392017174 2392017153 +2112831820 2010644915 +750165276 446233552 +1757958007 3220527319 +505529639 3273419556 +265844501 113473034 +1083119881 1366120357 +221406963 3816518138 754703379 +1139405074 1810399857 +2409252093 215652930 +1964477974 2777402103 +3447490505 2304475192 +237162293 237162277 +3684408715 469622958 +2128638549 273939420 +361843974 2864800009 +3055020983 1588072720 +4041430815 1424106952 +1812151512 3776497691 +1820971095 871561446 +2828115952 1295959747 +2179444269 1948831131 +2514459904 2707440440 +1214313354 2057265709 +3586713631 3544445660 +3202802371 189698173 +1778353250 1060988501 +3036613758 1803594313 +3123222811 686359954 +1153343008 1477635173 +609987522 3120030173 +42624327 1188916950 +74755660 277065847 +2956867405 3203468836 +1582409608 42646292 +1425287368 2220634827 +837661034 53365197 +2314346393 2314346377 +3299891560 161267371 +3326177376 2787434284 2030298917 +2271862765 3892167250 +2281116954 603338731 +3234842449 4004697940 2983681782 +3893544246 3038422807 +155459891 155459875 +3370630227 2758922432 +1732090052 4254667259 +1701653844 4275985199 +3713530574 1065341519 +126035489 583827847 2797781987 +1763747418 3630555051 +1201196369 109786758 +3625717029 1495839034 +2178732602 1522193814 +1029163850 3497813158 +3762915105 4291832656 +586823061 2766297482 +2161205093 1495285974 +2456084758 2328778159 +3758961980 290374120 +429278690 1962595667 +36201981 1654164820 +2076292582 3086047489 +260516422 1646442554 +512825669 1667942284 +2171382009 3071148008 2171381993 +2660047585 2032226358 +1466876236 4015671991 +3696637334 689012321 +1564900234 1222404837 +238331191 2480936326 +634001895 1225436644 2850913785 1680262838 +3311562536 1291401133 +2048632837 1049198554 +1011032201 1260101778 2156386427 +3646358188 3489215681 +1047551181 3859666555 +2127750589 1517700258 +2522446088 3067709341 +2462154750 77364438 +646242850 3308256149 +1709780800 3618173997 2920636883 3756779716 243084441 +1848893431 1923715526 +3687171221 100047674 +2057807688 1575769693 +2149980977 2034532045 +2785676692 4124270585 +3537935242 358731872 +1051957015 3417758000 +699000762 1350027741 +603547896 1295376256 +4179975269 2955214730 +188854562 3753630804 +2931744875 2172340340 +3704839543 3106543319 +2420293219 2081535445 2081535434 +1130985433 1577214293 +399824709 3252408209 3137846419 544025526 3373195660 +3203587438 587154927 +3046336969 2685372280 +3863539505 3050342960 +3889557043 684063308 +3287923136 1551021964 +681304027 3361826258 +3050956271 889517870 +3806505735 1871148051 835927040 +203965479 1248020854 +3078247871 2492791720 +1907491461 2151282522 +951541550 1990907247 +870263040 2479387865 2496165503 3669075844 +1974460006 2849708673 +776553115 1879061599 +1527240153 643146910 +1836098491 1049562757 2645576296 55689060 +1122479864 115667959 +4224206152 2597328155 +883832324 4064217161 +2617848379 2334899454 +101846162 543803845 +3825958995 1360724652 +3690311019 2931818338 +3837477002 2630261051 +2599622588 2829999335 +1992419219 2252311674 +2985707632 2456362443 +1654296465 3394240848 +3516093143 1173707896 +992396855 1426720902 +4230679015 3737163424 +192453982 1826601705 +1906220012 1906220028 +3964709759 428846529 +2501350713 3889158 3978291383 +753218061 4042633573 3117271666 +2364443675 1262537471 +3088514146 774852163 +3767292227 3219385468 +3315418298 3499307229 +2063146415 1160362606 +1971664858 3669421099 +1416601643 381232052 +3139706055 3220128748 2824287812 3934433791 1550621387 1304143634 3917098586 2963230074 3372724549 1511013885 178827575 3359068561 +3651801360 3065568291 +1845884079 3797954414 +793513102 2643561422 +4064182054 2120362199 +1849947922 885188026 +860079430 1180388742 4189031735 +106091494 3663958785 +1639315472 3782574371 +3605390749 1275350896 +4256805156 1188875023 1037876473 1188875032 2404506537 4069106340 2404506559 +3606750009 2777608894 +908303477 3655738615 +2120259857 51443152 +447354348 3854598785 +3168922327 1839171055 +1392381618 2744702541 +2107040036 3632556981 +1701166285 3919588640 437316065 +2599976544 1429139763 +2096117246 2888105695 +2162177652 1473353928 1425389721 +2323636745 3711829102 +4037402775 3879668756 +1817634787 1875839580 +2754687543 2717623043 +2878824061 2622078658 +2161670910 3536428511 +3845740994 1641311362 2605206627 +2832027268 1804786750 +3184511411 2165998810 +3175518895 2405493819 +3589532823 1516265994 +4162805718 1868815857 +1390644687 1261976792 +3687458121 2671778222 +3899937596 680116200 +1454837909 1454837893 +2918256674 4101793155 4101793173 +3330577357 979061031 +3287171174 3287171190 3591331969 +3712947429 3712947445 +2863673466 3897044003 761024541 +1321629905 3547345158 +562140757 335521756 +4292997299 2209212890 +479943796 2089978521 +2093161640 254155883 +3098135434 1028352557 +4086793395 3634362677 +2359365658 2072795371 +216379922 1603752531 +4039173932 3894735528 +2834712346 572281822 +780571701 1926975356 +2486836341 3430599722 +3297719178 4151190061 +1982044914 3960269562 +1949117457 1248003399 +3569754692 937947423 +4268576945 924190384 +3016887891 1290075871 +1947297286 3001647862 +3747248537 1715523177 +563994554 2777100765 +161712139 930031965 930031938 +1875478169 981925055 +1107921986 923257827 +3203178214 1954423809 +1428366835 208036704 +4055072537 634669631 802445793 952814459 +1812193088 1243115973 +3879607103 4243794684 +1248802582 821774905 +1954369222 2239476486 658702775 +3747597899 4006723586 +608518083 93406269 +884303248 3047076818 +1595057878 2153554663 +3643343578 3046079805 +2115134657 3960558054 +465526770 465526754 +1726035407 2795614234 +2655631811 3281554813 +981986237 3774356098 +827039915 1158540596 +4004868178 429904147 +3884476002 1101970572 +351281879 3439777900 +3643234467 2079361180 +1021909293 1021909309 +3654214073 702464904 +3028384319 4048607959 +3801913628 1813642372 +616510374 1096110822 +3744522478 4044993913 +3312493504 2421278540 +4119356447 2763365598 +4275454908 113198976 +3422203486 1839614555 +3503775984 3961069301 +2592841102 3620275865 3620275855 +861090040 3287684731 +2625074653 755927796 +3281240671 1083898782 +2570935179 484794914 +3381126284 2692489711 +223542708 3739655315 +1123831906 180745056 1596250549 +2123248259 2123248275 +736498532 1743916400 +817604109 3587443771 +617599730 617599714 +1931717597 3056552388 +1590491041 1750486993 +2016045894 1892081463 +860734015 4143231048 +2855343237 1883458906 +3103707821 1935820857 2739198318 +3501107855 301367064 +1132929441 1993453981 +1391810142 2542092393 +3434907892 1087084569 +4093969945 2054473455 2535418516 +4273036074 456295186 +2023160932 967790953 +4278853357 3569195346 +1754702252 1361084864 1999389399 +3901838380 1221034327 +1008235538 2893985861 +2638807749 1792457452 +1669898380 3713680664 +3247220273 3781795622 +1117896244 1117896228 +4192628051 3099466156 +3017175451 3046430482 +510857482 4179874491 +3303033700 1360440928 +4199864238 4179148080 +1950307460 2065808170 2209483743 +3152292047 2536259032 +4111136756 3024377103 +3788270845 1909428802 +4093041562 1159426421 +2148237044 2249775631 +3439064702 74174814 3435933087 676197602 +4158822572 4158822588 +2712756826 3829257149 +2538275248 3675498499 +3061397573 1540723708 +4293539047 3350588110 1276366610 +3678070500 91861799 +3898879445 3898879429 +3692215653 3868384675 +2511947928 3687267876 +2011074244 1463269270 +3657644257 336759350 +2838287703 3066843512 2828261360 +3375590534 1064100090 +4197684170 2586539514 +4289338660 2630606761 +3388723817 1617705816 +1806651477 3657135562 +1086039666 1499923813 +1581941292 2893494204 +2509553904 1764473301 1691716188 +3783538681 3363780207 +4072478074 2577977099 +412623222 1715733394 +433029316 1705489545 +1958693924 324609542 +830651965 4111993112 583209250 768702996 2704388683 2443732393 +2753892838 790262810 +451015885 133239333 515137202 +3034218276 3623232937 +1308202518 1645286134 3588703399 +224258474 3033978509 +1797868358 2707112849 +4207170914 621963605 +1492443439 2622847463 +1113720169 3914237006 +3297863959 3831523299 +517838446 3362727673 +3430376032 3415810349 +4293293761 2563568086 +3483967321 822097749 +527850619 39032242 +1830374805 1406476700 +1457185391 697463982 +3029492227 3777867624 +3207815537 1952765440 +493072186 2262334997 +989389896 500129117 +3619726289 2167042895 +1878255282 4008978995 +3044259885 3526028996 +3825744112 619626738 +3940398691 503717322 +2079953333 2079953317 +2366647150 1185480849 +3314665856 450014555 +3231851044 3450852168 3758957583 +1642361168 1788764412 +1162255629 1837031570 +2664178734 693957753 +4083752958 746413279 +2569347837 1373758453 +1810197419 2234023458 +3857032407 3140641745 +788695186 2928480296 2466053573 +2298054410 2680627813 +3761350917 4079817420 +1216641822 3974934133 3049828290 +1164934855 361010006 +807619704 1066492155 +3816480971 3849314196 +2501325506 3366699726 +3598425008 1027916572 1419122197 +889336014 3083085178 +329036231 3304638045 +651210410 4113081107 +412464687 2321732283 +348306544 1938602008 +1055883262 285637855 +1497781172 1035322447 +3951053729 1270176893 +2453453949 4004960610 +608445491 3707898957 1246035034 2282639978 916007840 +778179872 610746725 +1368054335 1368054319 +3607363752 592250987 +107026899 2819436288 1776212732 +1736535948 2093128033 +1278090565 1278090581 +1033797503 2730674475 2139272424 +234501177 702553240 234501161 +821263544 1423745739 +1236994476 4171950784 3178248641 +493036710 1944466010 +1827344490 2349873861 2894241190 +3243168638 3583624903 +2752426318 2752426334 +4146724113 3858033334 +398401338 2615027787 +3758526076 2223997991 +1598419973 2040780 +173624986 1617585590 +106569577 1286669531 +105704912 3139067491 +1353762373 478686314 +1053517128 573599837 +3832031639 653883577 +2105086876 563732113 +3022677633 3157038605 +1496198042 3303752053 3712885942 +2626747580 778124400 876469233 +3993264146 515372731 +615490557 3179226964 +1350232023 2085695326 +3908775758 292255695 +3397565286 835518849 +4081169435 191792786 +2026437004 2026437020 +29406720 4139375667 4291210701 3514296152 1994231010 1925421476 +3078116688 970863272 +540497846 3558569126 +700046534 1972800439 3771499450 +2156204269 985485703 +3352900629 2951544092 +3984624878 3479034543 +1616240967 3089314884 +1242705687 696273551 +302987765 231827368 1660435644 +1902674940 1840646719 +4195593587 536480794 +2189397854 3436097791 +3218264798 3232909997 +3699710270 3692931351 +465863170 1452425738 3092818211 +1830477473 1649178486 +1473701710 201355262 +1450105903 4123307387 +1630302089 2180224174 1081282041 +3068931716 2266101624 2043492809 +3678063379 814591738 +1986693874 1538833139 +3426209685 3426209669 +4116160768 562385201 +434514762 257303917 +1090276698 2804251376 2374917091 951963187 3769699950 3671189434 +1105136623 3708404524 +1845116930 657010717 +2283755150 2283755166 +1063481211 1149796013 +931376261 2604868342 +2761070736 4076157693 +250429442 2172371765 +2525881856 23138835 +2240203496 197906691 +286969612 4034804384 +496218542 1031845113 +1494041952 2662447812 +4224038014 3024272579 +3678955660 144544951 3204224119 221173212 +2550740768 4081902573 +3027477011 621290476 +2242787233 306287222 +1497446003 1497445987 +286210132 286210116 +375443560 2615128576 1725371028 375443576 1725371011 +725287019 3208392344 3208392334 +3245934694 60706531 +2549156323 326275146 +4095004410 1922466672 3948665073 +3740145894 1112660519 +2007030097 2738231952 +411945922 1765261923 +4047815062 1698479921 +982383619 813938858 459001831 +3934051129 3709933854 +1946532160 129461568 +1735675126 3524601671 +2022641169 269892423 +65279954 4061233029 +915245649 3523570583 +4078008610 2166383287 +1733519084 516144149 +832199053 2734356722 +1005996718 1710724409 +2374549883 21102120 +1269662096 3275549319 +1852123544 1631615565 +1422903838 2702912809 +472085345 3209204102 +3753489020 515002156 +1139851573 687875708 +4254720769 977296000 +886953667 4231599356 +3301266468 3159401999 +1059112196 1687561567 +4265364114 1259351230 +83325375 2831455369 +3036595454 3943701471 +2659753904 2659753888 +2192143072 2270005826 +3895412645 661506220 +3611802525 1529953616 +2116880065 3033114204 4113682964 +1009935932 4283887719 +1448327735 483271814 +612542546 3417241861 +1502680112 795002773 +1843185189 4121390429 +1509251566 1922640442 +2492375671 1401536857 +2417737309 2580766293 950840418 950840436 886776728 +1637982412 2558797536 +1012683952 736611665 3176898801 +2825540591 3157607085 +3799685670 3688534333 +2422741693 283252610 863029416 +2918659260 2552759281 +409951529 2689574808 +434663159 3894751586 +99346072 3840634984 3332502443 +1115872798 3523455273 +3552325835 474009474 +3410384545 2070169297 2696568694 +808261694 3619429010 +2699830184 3324557251 +3620698409 3835411352 +2624326077 4212348052 +3453193946 3725189419 +3222674257 3016556688 +114895314 1959920201 +310482537 514244568 +2314338892 1945738657 +1240597895 3752008186 +3703855547 3730264285 +3939909092 2470669801 +1666176685 61796946 +2497119750 1417575265 +2365242174 4287520841 +3232824568 1318992491 +4284806115 3318505305 4008439370 +3241844468 346437959 +4012159847 1062904690 +2533756158 2796054537 +2417199316 2730517945 +1006388583 2994228203 1398997681 572386484 2165226522 1400425820 976257685 3912903264 3953555276 3077565094 872593797 1652027068 53636388 1835602781 2070106186 +3009870909 4201241675 +24218458 1770546462 +1371020662 450257102 +154955806 3925636802 +2167940199 3529592374 +2976229041 4093995184 +419587569 1338407536 +666740149 881574572 666740133 +4084703069 2971207729 +2757961093 1370017913 +2624598234 1543497909 +1247532755 3784519212 +2869409483 2869409499 +2382257222 2530819206 3446358583 2530819217 +1396884988 2573196208 3920971697 +2604661909 4206534282 +3439928299 2959313634 +1426642313 2919747621 1780841017 2163304626 +2549842148 619439849 +1006372775 616572166 +1488513228 1997961527 +856836193 3334992032 +979099824 2393027843 +2978280343 2211178999 +4278950370 1631796931 +3694397261 343255435 +3025146551 2433578502 +2987190619 2634755015 2773703236 +1237741710 1237741726 +705799802 3016299037 +980763272 2392308765 +2993680629 505557001 +1744585570 337515331 +884879010 2860404669 +1106193323 3258870735 1988214324 +2176302727 3141594774 +3756369376 3756369392 +802154937 4263185310 +3708294002 2467907810 +3079734480 818945320 +2078971209 1531511271 +2309248871 3118262116 +4154895892 1400564072 4016310649 +2282329417 1621428654 +13853214 1791194409 +3010436238 461302286 112423823 +3017792393 2993068216 +3204214167 1046512806 +3350811741 3317681762 +3923047038 31689118 2553920607 +1891603087 211007256 +1145570125 3395105330 +1738252591 1610353019 +2753540728 3320175019 2784848644 3093738320 2784848659 3588616941 2753540712 +3628754641 1310710534 +2870131312 2153198044 1558890892 93190267 +3507647719 118359990 +2761749457 1284482253 +2443895030 1533603894 +2881931225 1122802334 +2664115731 215582693 +1697504931 3929373322 +2376094023 979366592 +3767428270 774405625 +642183094 1393617735 1707151157 3296133027 +3335787502 164881586 +2185558464 3318740877 3532990803 +1401134376 2687526379 +891846691 3519133468 +1816973933 3919785051 +2392217659 2980898034 +2994889164 616277333 3380533848 3477074999 +2955633373 2404916428 +1572719584 1908928947 +3744758064 2409285251 +148270463 1754160894 +1299658377 3993929525 +382815857 4279401498 +1509128486 2347031234 +1726919264 1774374181 +642082044 4086202023 +4235456851 3179603386 +710390579 549768276 +1585950358 352722807 +3733124555 321449620 +25332736 4064506829 +3091261893 3811580508 +143159633 3217711760 +1077516632 1077516616 +4273582807 1142081603 3579086960 3579086950 564758264 1202658377 1142081620 +4046521778 2713236744 +2349761650 2769996395 1324786189 +2094339609 2094339593 +3395210929 365241686 +1857317760 1857317776 +175625880 312922459 +3866312099 1785333642 +3168527444 2720559151 +3211568089 2911195790 +2657155630 858771708 312088946 4200370361 2158614137 2682164450 1314907785 1428784958 467471753 +704396194 3121733653 +1856431132 476885849 +710058275 3272845852 +3846079008 23517285 +2053109664 1158861029 +4153035083 4189151490 +3219572231 1091864339 524926208 +1364865806 519986969 +625577231 1485927559 +2301800949 3533110199 +80476564 2420681328 +2915960165 5406188 +963990299 2394018700 +2510104835 2305265596 +2095757367 3699375750 +2042279741 2813504824 +1754698203 3874545842 3728231584 179349918 +2082260201 3228947033 1246362318 +67590751 4026884100 +2782465918 3213838306 +2326884527 3453379010 +22009390 2189328953 +4005698079 4203683528 +3297361108 953434543 +2567660327 3392818183 +2755913138 1602354974 +1048891495 3524530720 +1715029411 2401804170 +1603404223 836288424 +349812906 4121015990 +3872631049 45526752 +407399595 3571891413 +183302804 3339613935 +3079757621 785965162 694765261 +1319650547 314972791 3320089228 +2936543406 2886793856 +3909447978 3909447994 1182624146 +667243447 550746147 +4184062330 1480535046 +1105681997 2046281857 +3165832826 2272162333 +158308460 1185739287 +577310084 2942322399 +3241537647 2531884728 1234336684 +632670409 640357496 +1236432645 1236432661 +998430958 3471338873 1791400882 2633727663 +2851235120 3547091952 1319362996 2756278542 1734835612 2291599540 256118699 2253148425 2360315373 59595276 1846493845 2119537342 3797494889 4106024178 3998449548 1655680477 2550923962 1161832465 3694513053 3439017427 2265560500 2915576795 293833387 1196050946 +1595049808 285268136 +39929992 1193618973 +1910892119 1451677301 +1483504933 2723676697 +4080093928 3197692733 1203392788 +3641397253 2983131098 +2136361354 1703143653 +2394127384 3163314637 2649841060 +598045246 1239028666 +1010507239 3772101481 +1918924288 232374803 +474129675 178827340 +1866315815 1160308064 +679476636 1568423047 +941505422 1845649554 +2681948043 1159633592 +2552248293 1605893498 +1338246417 357540311 +1733723764 3765987528 557164697 +292846008 844864699 +3215442669 3968140665 +3745941896 67797277 +2933675595 2413549588 +4121633127 2080728749 +3973941859 2937284039 +3621850271 1984355934 +800932669 2243223044 +4208339532 723817911 +151504285 3560707636 +864161178 252113762 2948295037 +3447434332 3585103057 +4232896018 3591234366 +1414598379 959521048 +3687686559 43716264 +2623802743 2827039302 +4112813309 3851022932 +1334092222 3955924489 +3066625072 3066625056 +1123549884 678186471 +2885144278 1124034108 +3927771886 1274736495 +3896471013 1361915146 +3111259051 1058498953 +2162792998 278027622 364751319 +908855815 908855831 +1048406457 409824830 +1882635249 1882635233 +1576738705 2203234640 +2931814976 2410472461 +723287633 2971656621 1126777535 2516935239 2439853403 +3717577354 2620839174 +4246233535 3368302829 +1376410400 899045016 +3039334128 1277035673 +529172213 529172197 +1784683683 407704714 +962249237 4077638384 +3885855244 296957518 +3791779692 890797847 +3504370411 3159680994 +2437546734 2776800431 +2659938572 2709714401 +1118071773 907368230 1529645893 3319123188 +1772277312 2336927443 +1895774707 2201130848 +2262738533 4253119356 2633973073 2077569924 4239497146 +466878188 3132771713 +2499359737 2102186216 2102186238 +382313951 3195018760 +4019102624 3180041445 +1876116888 2710998619 +2900480116 4108824085 +1479316722 2083022477 2683093537 +1358436555 1368334546 +3027067072 4240271036 +2821510104 1094766368 +4182665747 2305883130 +3780250656 3559462515 +743720109 1973951556 +959528798 1696715113 +672080287 2932993352 +3529809053 3512896299 +1460146909 270875473 +1584384618 335258829 +4184643714 670307509 +3529054711 591245993 423878598 2665046658 +3874900265 3199544206 +1502891966 3262744585 +2049282883 2049282899 +916571733 2793984749 +146435446 863654097 +3136274083 2675237776 +3315372599 4099155636 +2636783507 1508144930 +2897412819 2966254138 +2106247999 3766350888 +1797216728 2052747021 +3532133217 2108568956 +4135842320 565579555 +2698769090 2171748226 +3321008458 567773679 3546436371 3360920566 4020151372 2694106643 1268589516 1765756889 3516654282 2091210795 +1399376962 2415496181 +4089218899 80283564 +721694590 899072841 +148421695 2244154027 +3376640528 3844902691 +3130902683 1633864722 +1545452939 3005094774 +1508015214 3985236271 +3260345303 3266265958 +1921152151 3174476643 +132390412 2015055073 4093249056 +2126999634 3858092307 +3728358594 2985144526 +1182093102 413902191 +267471561 4130175790 +3063452305 1502818491 1284457085 53393990 +2625413016 1734077747 +4054928083 1293470266 +151311474 2451403291 +755020577 4179229920 +2961299791 728307534 +2781622404 4105942921 3460633150 +2872573722 2737214973 +608850862 608850878 +1484929440 4110464755 +43359952 2142063403 +1080649236 2045489529 +641832479 1480544990 +2686706974 220548414 +1717763375 1557434616 +1407474022 1987623831 +2923750566 1430047434 +1700249591 2149790150 +1580925821 2771136984 +50042523 50042507 +2027470690 2027470706 +4240667224 3241459360 +325254385 4181044148 +422615664 394468931 +367277104 1222135708 2789091221 +3939612373 1204778860 +181161409 181161425 +3645925689 1385538748 +1442407407 1506270011 1184387384 +1824243471 982369422 +3077143056 1454782184 +2029529162 3097980027 +569628776 3671960491 +667046652 2464719527 +2955672216 3980098893 +2694370453 1982343980 +652896388 213270435 +1222949269 1772960776 1370297922 1422058153 +2661792713 3401501272 +1218928263 1371542418 +3194514855 3477763917 +703190307 2143362576 +1789555413 3209872732 +3282140136 868659849 +1897868063 1162766129 603899049 184782315 467018384 1524239268 1375836806 3508699453 3165021937 4104568974 2012308515 +1101338665 2145716376 +4283704296 4283704312 +3321008475 653582544 3689899811 4098399643 1522538677 2787446595 +3448460096 3528723909 +3041892989 862276062 +1315329917 3894131156 3894131138 1315329901 +4093299219 4283430016 +1628831036 295544167 +1986002114 454747491 +1591887807 490140072 +417320945 3724321883 +2259171452 1993403185 +100102947 620540311 4182566539 2753959081 3983614973 1760981287 195683117 1231258502 4210927428 +1672439089 505170992 +109124769 109124785 +2552322193 226389062 +586825968 586825952 +471133791 2482192286 +3291499766 2674447553 +3769486578 2111331995 +2618271597 396309086 +4273152010 2856315836 +1975737105 1938316240 +2386107114 3454361179 +1936766731 3312461396 +2944101456 2296222891 +3545562430 3972704393 +2646305951 2646305935 +2206955845 2206955861 +2420510399 2572356907 +2792316349 1966261122 2735402187 450067618 +4112486871 3381847097 +924068142 1581307833 +944474236 451402545 +3413092811 541943534 +825777917 2025687124 +2571882418 72873253 +1459823747 2096265770 +3497839152 3961851570 +1155461667 3271237722 2350641203 +3664422050 3128341931 +143852036 2204904521 +940640516 1188114783 +3058549169 2909268400 +1213872858 3221923115 +124913757 360917620 +2265045493 2095717564 +1345861984 2827113011 +725186388 725186372 +1245483964 2110936983 +4239645926 3039084033 +1091952122 1869377693 +2395521076 4194734553 +1312095831 1953260262 +4077947339 1846078082 +3981131209 2212505144 +624328746 2042795713 +1014166192 3639872277 +55860899 809466653 +67101544 3016948907 +3864173564 1932529073 +516169031 3048871638 +2432498356 1667538077 2829355241 4064192847 +686912654 35290009 +1497971618 635661354 +1331610072 3391825691 +3040706911 4156421729 2345130413 +1496588154 3243573766 +1869322451 2157723991 +309923129 3743969511 2330537333 3546649794 387087815 +3755440221 3174201972 +455169252 2574820073 +3916599840 1122055917 +717461561 1391892944 +2095391705 3988988606 +2536366811 3627818706 +4277342600 1586953802 +3014067035 719997010 +2766214199 4098661557 2917568757 894827438 3616619719 +53760094 1944579629 +4208743751 802832086 +3145032868 745878192 4150340611 +3474698640 2560132533 +597812351 1648965180 +3201821643 3201821659 +317299203 3367858876 +2022418583 1524262310 +1601825548 1601825564 +714852191 1916459656 1916459678 +3809171600 4208749219 +2343224330 3657767904 +1438611807 1533808798 +1897403056 2840903986 +911679004 47298316 +12427404 3062086753 +1002670218 2664427835 +987106248 4026019061 +619307686 2470042714 3257912129 +22912543 4000938742 +416162185 2508114616 +807695703 4002254531 217411305 +221008185 221008169 +3421953738 3751852027 +1234807140 1523123056 +3517793391 2193799854 +3226574219 2247160910 +1343333849 3304617129 3838317726 +3295548979 1816982106 +186987269 937309689 615594924 +398138462 3643247102 419395199 +3193946273 3193946289 +1574621223 725610020 +1235672543 3501147678 +272664623 272664639 +2743949557 1820527018 +3184582841 2295448382 +2329256223 2477116815 +696422837 562327146 +1938459794 1964722650 +1309707202 2785804917 +3351008334 293394715 +3119334387 2743203738 +2674204845 2880750027 +782562684 3704526911 +3760987743 1246737180 +1728113310 3295762111 +3753504606 1413119618 +4157303594 2731864965 +2323867928 2487043310 +1949640916 4159016364 4159016368 3320496703 +1100366953 2769165774 2827858254 3642436415 3114969344 +3828753849 293072343 +650591175 3533904448 +858283708 1150099953 +388392704 1903437061 +1121062112 3775532987 +3059986908 4210097489 +625609067 2276514140 +3282551679 2149105896 +1304341573 2263278698 2821271692 1389855338 1389855357 2821271706 1228437827 +1662139950 599253615 +1324920600 3668002995 +2625091357 1836401332 +1274830493 962210922 184978207 1827743847 +3210199920 1930679816 +1435388541 738149076 +826342107 1682630354 +1570774685 998070402 +2547500269 4121624850 +2613387742 357847145 +2199672241 1003979841 +2347875822 1803965501 +552831282 552831266 +3713873589 784146172 +2706381580 4246377441 +2694291682 2964472789 +1409918291 2653897146 +1867957083 3540111025 +4226417337 1247955262 +1490444344 2939694789 +3609911192 55848229 +3852882057 1839879929 +3871684339 1903086221 +3498840791 3750797211 3355600007 +2031407793 3330078888 +3717095416 1106045072 3206615931 2802291537 3206615916 +4151330179 4264752486 +3279863654 973020773 +2456210598 500443457 +501681617 3820666886 +1692152389 1801907744 3898289395 3561491424 2875540687 1986648410 704888170 2694211196 1767547718 3672452408 950953329 591356527 1716075798 3875439745 +2200229543 3400898724 +564199478 645092615 +2321025825 2321025841 +1297475090 934222550 +991729546 1579910048 416118658 +3001902738 1035499461 +2351417912 3668137531 +272426915 3325974566 +1913480453 2417362636 +3224139660 1243909144 +1814454258 845744627 +2574683508 161525135 +2307847889 383584869 +3498664527 3498664543 +868336260 4261754313 +3035359683 2563386945 1789907878 +3122552586 2302967473 +4122624125 1362330818 +3758427227 49443666 +1090121 1664055544 +2079398915 1265919978 3225398116 2211780547 +1915112565 135208038 +4122010095 1242990892 +3783634431 74508414 +57965879 232884660 +3287364312 3403207283 +365661277 2892887668 +2311676326 3430349750 +1247624603 3335744663 +4055920153 2867679560 +218061738 4139751429 +2030053712 3410036963 +2092398429 2092398413 +965739934 965739918 +3326924150 2700347601 +2446088567 4222670406 +902488609 1178261475 +2577256210 2106359226 +3075476183 1336729684 +2496345128 998472789 +1530189184 338434188 +2934240621 3211680388 +1296219245 992936507 +1627385940 115823673 +4105515830 4105515814 +1266718762 2845206675 +3172009516 3452745559 +2826846964 851666447 +3033674832 4142422499 +968336013 2545609058 +1309104400 1172172708 +1368897456 567683587 +2256389612 2751369879 +1441529316 645967359 +1520408803 2352852316 +2887271235 758243946 +586051804 2152539075 +104850844 942417851 1687427144 +3600345573 3350744252 3600345589 3082302330 +2820244810 3928806253 +1315745658 3223828036 1915231889 +1796485810 1507170893 +2089601363 124569401 +2448593656 1903722387 +1108843113 1948783448 +1038113516 187810899 +2048733968 3413088619 +1309364138 2244896909 +3572884175 2039335014 +2589426744 2825526220 +15868520 3844876715 +1250783073 3181794720 +536868167 2800688832 +4157393455 3300346732 +759778804 2720284272 +1720294885 3379160852 +2948465051 1125943044 +524463190 3123032865 1818724914 +3280923981 654282788 +4097859473 964128662 +4244268089 1999357352 +1164331359 3718862347 +4013281142 2784884257 +254387967 3717325694 +536960489 3166394479 +4068598215 2306239574 +2150323777 2388877168 +2112675104 113768955 +1986568393 800398446 +4008328096 1747360792 3132873971 +3810447408 3112287107 +3946718612 3872729071 +2423005949 2423005933 +1698559240 1753791380 591350255 +3272941272 3315531943 1358627855 2302270520 2743070865 3889594044 444808437 2092161869 3505425097 1353227856 2911543771 2234848996 +3468935945 2267809582 +1529146484 146554568 4011866777 +3015710702 3848645551 +2689793919 3785897214 +3544947604 872802809 +829294244 1949594665 +1906418480 242275979 +2207663856 1840556972 1968150489 3428244616 +3466708401 642717197 +1549227297 2480096903 +3506655924 3157995855 +2818687545 1605562604 +826509490 1062219827 +2436861586 396063636 +770306265 541468062 +4024905325 238035035 +3689612670 4009707131 +983085557 2321135514 +2425346777 3355324862 +2300857855 4262296490 +3853817478 558429431 +823685452 4036799329 +703614971 5105714 +1788769546 3782360763 +2395245577 2792077330 +747723018 3133915418 3072345203 +4203895051 2137140290 +3849555334 55151610 +2117458406 2496005377 +3436591330 1463520213 +1935429985 4216593312 +1650609334 2529084049 +1857966548 698011823 +390205136 1828540789 +772559999 2421662941 +648567038 2154927113 +466647069 3861714356 +1838833969 3137798182 +2004742978 1564864757 +266829776 816572532 +4074814436 3756580408 +3639081739 2150642242 +586987222 3922973425 +534242657 3244085821 +4197828262 2292692823 +3569908539 2355801576 +2214374179 3921766410 +2711037755 2616377828 +1148588100 165387039 +1452258448 1087429224 +241381582 646789199 +1101521915 4252509375 +443857716 3653415631 +2425772882 4004626949 +4060790274 149495082 +4191700555 2591467540 +962880977 705447942 +3043264967 1413801024 +1664297225 3164349305 847878446 +3893504860 1096962303 +107402151 3021700901 223894962 +1811829799 3860112442 +4024822327 3723474054 +2654501235 4023521756 +1726542757 2582808796 +2929741576 3999033739 +1996595108 705076623 +1855308847 1855308863 +4188347950 1194492354 +3303969290 1426084926 +1883670561 1883670577 +3740818248 3740818264 +2905259023 2839939982 +2576686323 3099366028 +1744879507 1278055532 +3565172265 2933211800 +4009185026 3026574120 +3617145915 3252099244 +667831763 2093253420 +1815147800 1494334347 1815147784 +3287684274 778212403 +434387555 625469898 +1229318438 2758921486 +1463074474 4060620173 +2131945222 281128545 +3234411372 3904631575 +1686661022 3770359209 +3573963892 1435709129 +4277906673 1462845286 +845479156 4276095403 +1627848360 1711465067 +3216410898 1741683390 +2663886851 4149875882 +2482768533 3791981235 4254421306 +3119853705 2141234127 +3361128323 3270399735 +3864882152 1317919252 2366692925 +1092903393 995320848 +1499295943 241207219 +960263782 1163526158 3153876637 2150523521 +769864549 2712266746 +1239029569 3868178623 +263932172 3486776801 +899300650 750587702 +1360268411 3578700411 3376152958 +2107166038 3107142689 +3550348695 3099774118 +947478971 324379220 +1167103881 3579346661 +1043624732 3036345360 1897438732 2375453137 +2191726919 26988603 +3099415769 3804838825 2869727646 +3674971696 55182741 +2710697288 1934750307 +424364751 2351320347 2693186520 +2869329074 706305698 +2896071653 2727754092 +1564314620 2103936534 +2997952434 4275365157 +2223731393 4084922275 1440148344 +2954073267 3788707290 +4233762470 4233762486 +2181566559 1658451228 +1539120464 3760795051 +1254011673 1254011657 +4046567754 4215713659 +2996518578 603031131 +2972322493 2720982932 +1265374597 1076224076 +7459955 706834189 +1494200728 3997318224 +2211008013 2471240901 2196102756 +3025674478 2461201785 +1687518924 592878369 +3857828074 3857828090 +3881053871 3632627064 +1351217014 1059321542 +3538495381 2584301468 +2112510447 2094580027 652972856 +1752460996 3885371524 +2531697094 2050801158 +2772021953 3662270283 542877892 1448891949 +591682689 3978391462 +1138313363 3269120180 +591055729 2119850525 87808948 +2041098934 982602897 +4131513038 2008549977 +903330820 3332176457 +1985718467 357214972 +3272856630 1315095055 +1407255426 2369291701 +1550153697 1421588256 +3756259978 4259538747 +1922478446 2352560622 3510194223 3778636105 1922478462 +948559726 835351938 +683972236 3111714423 +410046364 410046348 +2305315233 2969333618 +1999396756 1999396740 +4197610421 2456561148 +1414945518 2985370799 +3001951659 1474645026 +1262257311 256165470 +686966094 3278051791 +2644221788 2012995032 +1983644858 3665522909 +1633505702 3957819479 +1271556933 1693807914 +383369514 3769776530 +3487516864 3487516880 +4168157319 3866812519 324762893 2248530788 +2707234180 2707234196 +2367200285 3910278715 +3912612584 127220523 +2443200883 2991824908 +2383350729 472236277 +3610087624 3610087640 +3087311165 3964261140 3442665453 +1196505800 215976139 +3502171789 1173415734 +2553788157 2629111892 +4196478724 238369184 +2077214278 2077214294 +2116124203 2206191976 +1084405925 1156528483 +3917582053 3357364490 2079584876 2600908298 2340863523 +1178669199 661459224 +1125073054 1436990605 +1502585793 3728955801 +3096159653 685097658 +3060074364 760428076 +2994878623 1921092587 1168305242 +3374076529 144033766 +2571790873 1764033886 +2120954542 2965424121 +3240786774 1809852519 +301617506 2936937813 +3676355130 3676355114 +3609695890 1163003845 2787340478 +1189671488 490208504 +3294784897 2128224113 2178193158 2981290180 739337021 120862895 3251765907 +59984801 1105202784 +60576996 2052814041 +1091769134 2957139118 +3312574720 432021956 +4047927870 4047927854 +240335961 3859283998 +3688848290 1931762798 3265085461 +1750961092 1750961108 +1548642877 2356231682 +864174063 84583736 +4161681385 2370567512 +3286467472 3956645360 3053250710 +3427504263 569672854 +953882652 278017735 +2021225128 1328512637 +3775132794 3718553174 +3737433400 3699051475 +3712716990 561312201 +1255453396 2698347439 +3209866103 2987896163 +1043015613 2599390868 +4073483343 2261680209 +443965539 190430172 +2721651230 2112101695 +2304709767 3587553668 +4217933497 2123935038 +3671119351 1841353670 +4199476001 725361888 +3291058952 3791351067 +1519473523 96886298 +1073306383 1073306399 +3350023668 1238480655 +217131225 1037051152 +1396015486 2067454303 308422689 2067454281 +112333827 2371190954 +3716084614 886660065 +2222020244 2510580340 +1296613691 2210551502 +1304568609 168559993 +4192303408 2381432451 +1346047537 1918775510 +2223163713 3672297814 +3922749237 2076183955 +1123061816 542523777 1123061800 +3682203008 1954132152 +4178174852 2962977912 2391877824 +3525536964 2619001194 +805992606 469945513 +3358050226 98547533 +1377275644 1757788327 +2489234834 293865517 +151007741 151007725 +4088227457 452484362 +2201701360 1382190429 4062469447 2452509576 1382190411 1983829718 237275508 2253949635 +1038381069 2073846898 +2888937102 2687879577 +3644750167 2782805044 +2447748223 730762238 +3189976659 1765452252 +1646203768 3025353415 +1319088203 274892308 +10311679 10311663 +1194182459 1209049572 +180276552 180276568 +4065019265 4065019281 +633600426 495060621 +1188494806 265280800 +3723865519 415263342 +4081822702 4081822718 +387627956 2579131092 +3413130409 2151903257 3937369614 +3370243025 209744390 +1313769507 3495725318 +1776192349 106259316 +1145332765 2494142900 +956489929 1541407032 +2298109888 3302149531 +2617171273 3267656787 +1679355614 1900021609 +1820814808 2972838683 +1311601409 311167626 +2322567727 214651756 +3468421785 181554888 +3209195218 3160013490 +29199809 2389065744 2120623830 29199825 +2158177972 2467713706 +3119395001 1794552616 +1746652847 2462473592 +3372050114 3379270858 +1108703010 701139587 +2050802933 1267516627 3928965670 4222845594 4222845581 1655311786 +3167604247 2395898786 +1638099238 1852723043 +3875957091 303556316 +1079934517 1407508807 +1384506660 214415295 +2704015348 2890132761 +2925369588 1901578265 2100293929 +3881399211 3704690210 +1006042220 1077156865 2365180028 3520028161 1248918423 2348402406 +1882120798 4157495785 +3123542977 3600404694 +304726066 2996158370 +1921995482 832531773 +4149836140 258490519 +1004357803 3898172706 +2099888358 3873030695 +3212979098 334144381 +4085266593 1423308998 +207014587 718439293 590841170 569559287 3043412890 +1653426199 996703280 +86917179 1657740530 +3228463561 663411398 260748540 432651570 264875377 432651557 1266419952 3432238451 1216235259 646633760 +2112872778 2506682721 +749288173 996655876 +1036723302 1036723318 +595379219 4033391098 +2322115224 2059701595 +2082441751 2091278886 +2106479438 2460966607 +4000441654 2471220241 +281981107 4024630250 38321603 +3398752566 3321684306 3254573846 508686343 +2729847722 3469130893 +4149812237 4149812253 +3760323713 1451261696 124826115 1112018854 2205839271 +3721586721 929231942 +603228069 1056016556 +3126621208 2005582285 1851855531 2005582299 +2334542714 2269696285 +1486133416 434917501 +2217213107 3510237238 +596446633 28256526 +3404409177 766373778 3375503134 3621413929 +1213521000 2289419420 +773233582 1635108089 +3605393252 1814877007 +3596529436 2467146008 +1684517344 4013753253 +334410327 3082993382 +2234252265 843476415 2369621966 +1897551714 586378985 +4087385239 4087385223 +4122284694 2152473441 +3591745758 3794103657 +1973265811 4202953370 +4152933513 2197857017 +1348338069 419200394 +1370919339 3394784367 +1277448205 2706770016 +3943729199 155734490 +2778014213 2932116954 +208056900 4190263044 +3268362022 268798321 +274011565 2382555201 +1597088634 1428445469 +3612072652 3093917473 +903586206 903586190 +4251569086 2878061599 +2036643222 2945047335 +3679399084 3919794903 +1076584501 1076584485 +4006242454 2124588081 +2951618808 3957188219 3142696324 +1125066711 1025257113 1125066695 +579981895 1151050265 +1697608746 1697608762 +1284298876 2598886961 +213151874 1571034250 +908505945 1124726754 +2704069284 1119663491 +1124326329 2210221448 +1484644427 2569541140 +200443969 200443985 +2527107339 669255726 +1643938508 209839905 +3224114112 1164121939 +1688814938 684948925 +3288445188 706051577 +3877854614 1923896113 +3185949681 2035209591 +1218318007 131148294 +279939071 814204737 +2439811664 3069468384 +972302226 4285862276 +1397717406 2009740735 +2083178054 2083178070 +3418739613 4176951479 +1322578974 926698303 +982246830 2381202769 +556139918 2710081170 3168452249 +2986747768 2986747752 +3887813409 2293805191 3700741188 3974356192 3769947974 2122820781 +2587876048 1293412156 +4030861099 4030861115 +4088830334 645112137 +2131574640 1910168917 +3998559308 3998559324 +2341673710 2794677433 +1223031461 1728680364 +1400460719 1400460735 +3951222469 2214899724 +2083207014 3725079937 +3936529975 1160618658 +671209069 516611269 +3405891976 466632971 +3143015284 456669204 +650329116 4286087436 +781917980 829489676 +2186479806 1354049993 +3450876826 1717648253 +3121612394 3111461074 +1487149832 4215336500 +4082835122 3108061501 +2020090298 2020090282 +1953468523 3063961716 +3340391183 276770651 2104541336 +445789366 2317941383 +2170796041 2818751227 +2353759155 2380288730 +1511422585 2542266952 +1971424365 1743785860 +4257595868 2100778631 +1659104610 248426837 +1770473462 554531530 +2270249832 1827478699 +3122809522 2920116813 +2855772526 4019956207 +1283811556 1510219497 1955672464 2056338151 977764796 2491194041 +2612628728 330066816 +869685617 191810800 +2268713587 2086768694 +3223107929 501431695 +711625452 1186950679 +3015922151 3816418976 +1594259173 4112113162 +1727244650 1619064182 +2791820198 2607126103 +2478638535 1502615616 +3390997850 2282482877 +3570848170 3089895053 +864192116 2323228825 +884079411 4078718854 +159053441 4082100688 +1608829535 1412076424 +123853864 3339555563 +1531830087 3926926798 +3331197952 2442978309 +1355265494 1358391302 2201852087 3842067306 +3265330913 1846515483 +34769540 3341815263 +316823263 4009233488 +807568949 461917222 +3548211133 1515820706 +1577985464 4063703108 3359989933 +2364657681 4054485712 +1391335178 2530100411 +1762198985 573840238 +2984552060 3974349663 +3230672572 3740072433 +3805501864 3805501880 +2126856273 2301624310 +1333093803 3234794530 +2953123364 3461546876 +4011721929 893487224 +972251521 972251537 +100496268 3268810996 +2871491741 3218249835 +3721976235 1996675102 +1082845722 3031336683 +894561603 855146620 3107078960 1608147222 67249149 +3739828252 3998098003 +4221310815 1975044766 +2918260660 829013452 +2305040242 3130884197 +890799322 3641859253 +692618104 1431641543 +3872728270 797503577 +1598427317 1941779987 +2813689298 1782239901 +760455789 3349721490 +2503140865 3760198528 +605028257 1386518481 1696905735 1714383478 +1027157710 788835919 +1911152898 231231234 +3179198986 1302226325 +1785199487 1297367153 +4107343811 955980035 +1691930068 2489221804 +1908993680 2941226147 +525556552 3906850032 +1323464974 1015320857 +2443267879 170924039 +2454335591 3038166845 +2318584 800171643 +1486837306 3168058717 +543367643 3608038340 +2373315199 799024638 +2978234833 3910172168 +424533222 3052722038 +396518076 211464684 +4253899539 948330220 +1447715748 4098294159 +3429827300 3066137833 +521094240 521094256 +1366563677 3244525982 +1239447876 2422138399 +1446275744 1694589732 +398477274 1035017277 +2330619497 403427160 +1091900418 775037981 +2123773460 1517756783 +4251069215 2702077404 +590077605 2405626390 +1301227099 3565906217 +3689258896 3128569781 +1948342385 1244834975 +1795123747 2694657220 +482085773 3372625636 +1664462891 206554190 +2218367290 2115599953 +1263975344 1233745429 +1056974543 4231862232 +2331836619 3372183424 +685687392 3064724773 +2620982295 79786032 +4144003171 576094323 +1018066263 3609693908 +1368656690 3631035492 560999756 4196833401 +1029880943 292463288 +566481428 589584391 +3066148834 997597998 2499049685 +1656917817 2974250664 +3679975344 4219136515 1026286792 4152262411 +1809486886 4011276225 +1704147695 3193375276 +4148701212 1654072337 +967598677 526306250 +2526096171 2876454735 +624457153 624457169 +2785946720 2058746669 +1906245021 1594387288 2941051497 +3779096562 2322610675 +1827374724 3337509770 +250052831 1433394974 +4205829341 2144907234 +640123814 3056877143 +472746528 195968736 +3207336057 3036537845 +775314374 2240968887 +3549740805 3860117878 +122727544 4227825901 +30208389 1520448595 +1327032956 2330935344 +2032631539 2888620186 +2170459140 3820665412 3747387631 +2738758358 3503347441 +1162819929 1958168328 +1800325926 3480057446 319409367 +4107943878 965895329 +1620302673 1620302657 +3936740208 3542419779 +4162256142 2586860815 +2609146758 1467302881 +725287031 2136596212 +1084781885 3429970697 +1297316542 2922900425 +2618828862 81624261 +1726840448 4037879656 +1568087954 51085882 +104901841 2832207110 3313795169 +3062920806 3062920822 +1603885085 1856530155 +1331072305 373310502 +2516028039 2611942038 +2729773227 2025328856 +2423508884 4199532015 +2622035968 118540307 +311628407 3028685136 +2645186309 942079194 +3514670294 2663245031 +506500759 1303839286 4184311165 +4221151824 1659313141 +621724362 540845037 +1545186582 1545186566 +3934025315 524140871 +2991051659 2991051675 +2366712717 2668072690 +4021681527 4021681511 +86245246 2339467945 +4181122241 4091225712 +2627247497 222297784 +1185159210 1185159226 +1329385332 486896270 +2020741629 2559725890 +411945930 1899482861 +3143941464 1469452685 +3651281907 4292819341 +979985856 3218272339 +3010749572 1890327919 +1444495391 2831151326 +614589924 2396841449 +1242411497 1242411513 +3569274142 2736356931 +3041136760 3525700859 +722470156 454149408 722470172 +3513757716 3407891774 +3003605366 1164265555 +4021261049 436205256 +518157268 4139551627 +3088345744 1478738083 +3924145346 4137389418 +2147975242 2147975258 +2818020314 2818020298 +3476549178 451695874 +822521910 851169093 +727408760 3101220091 +214835348 214835332 +1758989703 387832467 +70677228 242024444 +3230440547 3925432134 +1558870169 1558870153 +2976229037 4026884690 712623890 +3717386734 3156244921 +396381402 190380843 135488693 +1164203922 2751955065 +3451242847 875298952 +1079088090 3265233826 443269181 3265233845 +1524044699 3989106014 +3375252348 579677715 +891849746 3235151955 +1583741303 4211526646 +2515714402 1864789315 +556902311 3895127030 +3353113788 1275833047 3353113772 +2797153092 3112115209 +3207564671 2730083960 +442020135 2694766710 974862131 +941130683 160915314 +2654896713 1396976675 1701255416 +3707842466 3219913403 +52730578 3300683646 443518843 413064882 +813023415 2760980788 +104171048 3997315325 +4132472350 776005826 2452515189 3962394175 +894026600 4264607125 +1194583397 1194583413 +2262461106 3956661525 2262461090 +2648966361 1727242632 +3079569531 1884570034 +2459216847 2399827672 91821595 +128771739 1577482334 +989328952 2625287379 +4166548158 2974365983 +682639940 1366839561 +2420471859 1348221018 +2056102028 2029239415 +192284993 2874459162 +378084213 4007016746 +3602808657 1591897232 +89725301 865544986 +3813682755 3813682771 +1906963729 4287416784 +192851833 2439920510 1854383945 +1829198594 2695646200 +4051560577 125033382 +2846217567 1863246984 +4202704019 32922390 +2062485211 1632094916 +178726042 1595842155 +1981034771 1981034755 +2949459571 2949459555 +1123238111 1139744542 +745106496 703948997 +3151512888 457311369 +712321344 376434629 +819695618 3953374005 +61903212 989129985 +2485521657 2748816751 +1097947648 2506224077 +2340241163 2340241179 +1947510320 3967917461 +1764484743 387704470 +2548863733 510351274 +207350913 207350929 +1584472109 3642074820 +2573648869 2573648885 1699443485 +1910261451 390122467 +3895186425 1979625704 +1255191247 1255191263 +754599253 586884316 +1346592411 4111330834 +2377318085 2656981665 +3106922412 488050333 +1222817377 3316190352 +100893397 1283913052 +6990778 1510195781 +3691631487 3799511294 +1987030906 3956358429 +521287701 2678675288 +420121896 2476488171 +3649151150 161167309 +1103404457 18430233 +3148164249 4261754078 +1704830424 794951012 +3592048253 3975525643 +2369175400 3039776957 +3390863564 4140968247 +1531708614 2291547066 +3290414407 3290414423 +64868091 1219444937 +1711536117 2039592403 +4121083325 2588444562 +2993336355 15943452 +3197743161 888164504 +1840046178 870998542 +2409514547 1227391557 +916183586 425223043 +894739894 2856377745 2333916055 +2017218328 1592820443 +2013365515 2703021103 4117000276 +2300434295 3386510819 1358573648 +1577717748 4258733327 +2051723715 1013302055 22016044 +145527914 145527930 +2563995254 182680519 +1594300489 3777706734 +774079270 3353834711 +2934012440 3084553139 2933554581 3084553124 1709982688 1693660109 1693660123 +1583751576 4109809251 +2831942621 2519340258 +446158953 1175039310 +1336418037 1521007530 +1090276685 2644198871 2615291127 130778895 2591517591 2098463141 +3253848966 3584254945 +3485925052 4152105329 +3198354793 2208400472 +3522431235 3832091155 +1738108541 1217673937 +3552521577 3906973390 3203693656 +834706549 3296323098 +707753573 3400375952 +3582560743 4022445085 +1885294077 3808937300 +1362447425 1264979175 4139074918 +2856934411 2489670863 +2957571323 1101143464 +261199987 4113759500 +1698857787 170842864 +3777072554 113104831 +1692616391 3706113966 2563271488 2563271510 +2503499228 3283861841 +2289017572 2881318143 +82057579 504628066 +1877447985 1519377446 +3911401952 3800085427 3911401968 +75748012 3347358913 +4056665672 2079032081 4056665688 +425937337 2957839912 +1092042739 1092042723 +2901267785 4031725157 +3216870510 1804012793 +3453961653 3413818364 +3658368459 259513986 +512400097 4113682486 +1788299771 3341383218 +3284689020 2960122673 4045579824 +2203338971 316977229 +1722660869 2826481612 +393324898 2212385762 +3618819255 1165509638 +4141422781 566605259 +3251907381 1442841724 +3553156667 2687882980 +3168499005 2323222292 +1515778324 1308852857 +2342225131 2966568445 +2956082559 2246555434 +147996505 1006221576 +1186426641 1186426625 +1691223401 719734489 +269042188 653382770 +2557318241 1332353670 +2929124191 914878110 +3898413656 579068045 +2096940739 1022130352 +3020402959 413580634 +3652238303 2911586903 +28254355 967853932 +2000382287 25610062 +479726469 2287608396 +3378403058 4051885797 +1997526399 1812132277 +3822239977 1526658203 4231147096 2262901951 4231147086 4231147097 2378542798 +2407302171 4228118162 +2265960765 3672531732 +3684663137 3389155549 +3797934252 3797934268 +3040278154 3944537573 +373305428 1527518265 +4161767583 527700574 +2373360769 3997020070 850943766 +3919208856 1443340891 +1659729991 3684427002 +2786142794 2940762590 +3654785253 3546656876 +1275573039 3743355630 +2156677177 2640760329 2513809854 +2630554749 3089289380 +4000947267 3856594771 +1107951110 4223329121 +936055708 1890573969 +740641418 971396545 +3226034494 3521934921 +4096579216 4069901493 +4169616906 1191172539 +2869679545 4238438952 +4119466336 3987271304 +3590464289 3590464305 +1993255101 3293815170 +4231324766 1698922473 +2047345593 3550338103 +1995984492 673313724 1082739586 +3831002213 2978600842 +243161262 2128976367 +610990765 2047474960 +112079060 1479990703 +4254809914 3450103195 +1673093157 2015627594 +1075876739 1984444202 +2684153639 36469366 +3118388402 2267420503 +3114900505 1593883464 +2804139904 2639466131 +3846925894 1002346551 +3433860802 4121213795 +4180758429 222062955 +965117864 3106126787 2082663696 +1887888352 2091663021 +184468113 3758901830 +2146428048 2612364468 +3470230163 3949711981 +1885328955 568213234 +2603865570 709460631 3351982853 +2443902545 2704169360 +1948200909 415425237 2493538838 1454369626 1043101371 +2710892526 2101994202 1266004915 1837831601 +1073217016 2875510139 +4197256968 1605694437 +890605075 2750326764 +2766903233 2766903249 +2909353424 4077397739 2710011748 3720396876 274871161 1734965288 2490120747 3433018979 +2804556026 2979351429 +4073040031 2880169820 +462127612 3895966348 +4000529939 1095115402 +916269884 2290700016 +2423899778 4055072437 +3082993886 38559490 +2297546576 3620136892 3835478773 +1337768426 1337768442 +545216487 82652871 +427895358 1683324831 +435850276 2010421180 +2826673653 798599356 +1747225867 4236904532 +2218690599 3755370020 +81983152 1632261891 +3047784102 2681364289 +839429692 4289349735 +2958907139 2958907155 +1880082108 4054195363 +473129067 3249235477 +24367932 2236974951 +383203907 405625566 658435237 4194900509 829481907 958454568 +973770102 3567038663 +198684396 2424855959 +1787562451 2373154618 +3527960163 2848370874 +431075999 321984369 +2587510579 725321398 +3857011732 4228078447 +250649248 250649264 +4097772403 4064216588 +2908512162 2322238485 +2172445653 509756656 +3066189445 955134810 +2937354360 1646786701 +2003516160 2417572571 +2031358373 1066911418 +535057108 1664149793 141452217 +794132152 999717819 +2081445611 951636980 +735681005 555601479 3448275336 1385023857 1984502062 1013227340 3282652602 2918550668 1454432324 3388112891 700819936 465708795 +1267732337 1690849008 +3921735088 2864065557 +6247850 2051088901 +802950181 2087132730 +3983740177 3709702607 +2366124895 1659428488 +2193364828 369059847 +1175827056 4039905524 +1944320063 1155623425 +3709620127 2995869534 +1743026051 262677290 +3250490351 3561448406 +3326580871 4059789017 +2557966378 772942349 +3501834692 1483474847 +1793470386 2261495070 4200404261 +2214389308 105756308 52326503 52326512 +490593164 490593180 +3314416121 4152394472 +3907726032 3443901366 +697916619 1198330754 +276651831 744285072 +786739676 2919497031 +3004983844 4124757772 +1070382373 2959552074 +3397714687 3462641512 +1606301740 3832704343 +434387553 591914656 +987600220 3859925748 +904419447 1405305680 +3934639937 1907481408 +947914094 2465508847 2988258604 +1371962756 1064802015 +1614414822 442461617 +289236391 3399943670 +706018380 2332634017 +309655944 2518995211 +2944290199 1198191277 822450613 +1777501693 2639101666 +1766771962 3238833547 +4225879222 980763281 +185833872 1031523554 +935014486 95136684 +3330828268 1958451351 +2256568472 4264375844 +1411119966 334343459 +1851407384 1271504320 +3629362568 3722688199 +2354385472 703314643 +2565363732 376284009 +264742681 2780264424 +4010644394 1508168038 +1074853257 1074853273 +4159113312 2696032051 +645981656 420953444 +3131374732 2066594 +2538517716 1880960575 +2260530358 2260530342 +289370896 1978775657 +1521948529 1060759280 +2921378131 1886856634 +707895772 3728094864 +541277385 2463674488 +418667888 279034588 3098482517 +18378046 2553093796 +586808817 9093744 +3520751547 2912382447 +773537909 52377380 +1958301892 1958301908 +2374551623 2374551639 +331665449 2688479129 1205055630 +101837492 1110735193 +553609214 3377249055 +2668406871 3085762790 +884948842 884948858 +1252258534 1246790889 3331934901 +3653110203 3087736959 +984581080 2929352480 +3098426437 4282966156 +3540847863 3540847847 881551568 +4077631895 3632538073 +2550287639 1654610726 +1150222071 3926395920 +305150074 1361611350 +2151990588 3517675751 +4068607027 3435310157 +2770975448 3635487245 +2005353111 3236811696 +3498326892 2888403713 +1328709474 243173205 +1677688268 926091319 +1837997159 2742303097 +983874997 3831761242 +3261229674 2853348484 3293913521 3249823884 1285375736 241206324 953730641 136781950 2295846584 1124538173 4011396061 +2740650942 3555366562 +57386335 3245692062 +1884806467 491868284 2734797607 361722877 2734797616 +1330383269 4258345342 +828534421 1359499672 +3539324092 685411431 +3699632983 1785670089 +4270870476 2295424728 967108123 3415615091 +3486434952 2860681227 +2887913839 1755410862 +2354069668 2717951631 +861312012 3712683745 +3771428536 1487151443 +1033797663 1712734753 +1875467795 218044396 +3565714937 754342345 553010933 2346602238 +2323364265 7119798 +2431223589 1098516554 +3467265192 4262073468 1725841603 +3951304659 2482903354 +1652233383 2931917558 +647146787 2204357847 +1385743324 3799798599 +3541353169 447655696 +3166520518 1359350063 +14816593 1551334160 +2278577333 2249922463 +2302621146 2448876918 +1616538099 2706688410 +40426737 1640152192 +2466053585 893620240 +3235605435 1204572799 +3698605343 704395230 3758870475 +1135392417 2904604440 +3925751550 1175486504 +2279948189 3314672002 +905634738 2884923699 +3794906155 1060243362 +970910265 3140759343 +3365227332 379732527 +1338311419 2384703794 +2144179199 799013480 +4008052200 4277188995 4059717692 3302749791 1992369933 +2099971935 1773968008 +815771477 45573114 +1716387941 130580131 +3216581716 756348862 +2616598194 913461797 +3815542683 825022318 +2430157853 587610548 +910906305 966056128 +2771838318 3933858553 +3653796618 608768646 +1090410759 2714625255 +2117708500 2294803375 +1485292519 3487131620 +2247077329 2247077313 +2355986832 2690839971 +2753905665 1739197824 +2772826503 3022507904 +503433920 3855430558 +2918994238 573826185 +1410015280 2105781141 +3833036340 1485801097 +1364417765 3946527866 +2748792412 3904399121 1205283527 +1413832357 1312030124 +3534547201 2805124246 +1741584728 3255371163 +1777632999 3076858321 +69968030 783145129 +2026531992 3198743373 +341130163 341130147 +730748212 3306168527 +2826961368 2196167148 +1219449625 2231357512 +1934849789 3125463797 +611566473 611566489 +1657811123 3182912821 1185573878 +3894543202 4216590973 +3799971413 2696779833 +2719831895 2335210982 +2958307074 1556493273 +125208632 4153962555 +933670407 1070248846 +1326439996 2986006641 +3518711637 2127645386 +1556440886 1086421511 +3255680544 2611104869 +1516228771 3889524874 +1049828470 2278748246 4153789895 +3599206756 982609673 +1157897472 1989264184 +332667934 1156065817 332667918 +3503740355 1703133565 +3340612049 1153362950 +264697439 1271024412 4175833546 608833983 +3154083041 3560019488 1074755345 +316944243 808890906 +230974283 794718701 +4043530455 490153538 +3424430315 2534886168 +3525615314 2443570037 +523671367 1777345750 +3763225256 3324866260 +1953248231 760591520 +3595247066 4021021196 +170362123 356961001 +3352848122 4058164577 +2090240600 1574225568 +1871307422 605005209 1871307406 +4040924840 3518677611 +2669536009 2232182574 +938170865 4169045616 +2970133615 530242232 +897356955 3458068498 +3143410759 2229086233 970365888 +2636544136 4031268789 +109993006 109993022 +589363282 2397491189 589363266 +3581277115 1878923903 +3257504935 1647543972 +3226895949 355822386 +2718472929 4102803488 +1968959365 1153044044 +1693368523 2933489538 +256814092 1362566236 +3630391056 4110517204 1060087165 +2121008856 3691955739 +3518826295 1670536080 +1960520572 1896182833 +2921998902 1650488081 3839169537 3866657674 +3273744624 495688149 +2221933535 1532368904 +3215545775 1720836718 +2928822861 491452196 +3743302499 1146100794 +3350829207 2831792 +1919523039 4214990600 +4139118094 1852162073 +1615045439 1393029884 +553236819 1008647596 +723057025 2888289882 +1110869347 1687968106 +788695168 105697167 112665460 2164056467 +3598683485 130779490 +2499863934 241780063 +1288777235 1659304086 +3842305913 437771340 +3755318974 457762079 +1205248129 498057029 +1520332055 3194338086 +311011586 311011602 +4275272376 1476547264 +2842458233 2577626661 +927916990 3476063241 +1053466348 3304598935 +923650657 196449974 +1186508817 1052435725 +3746100111 3746100127 +2205267081 1962881966 +3938527323 3910305618 +253402558 1435715294 2229686815 +2286229973 1506257482 +3980213991 1584006582 +3748825282 2424059800 +4001289132 4001289148 +1695573443 3687854588 +3643794237 1924193626 +2307195080 2088543127 +2820142669 3937975076 +3476695117 1873359269 +3638932224 1905838355 1233827128 3632558811 +3170629660 2899187399 +640074428 3406073329 +677946755 835868007 532450620 +1299640890 742347101 +4240020994 2459925609 +2368177811 3359168876 +2790998996 3047933615 +1090894673 4085171863 3862983414 +1461278682 4142222397 +2824163655 1162801856 +3410320187 3898772968 1429164293 +2408940338 979208115 +2146428044 615608079 +1627178830 1627178846 +3027417331 907521655 60368524 +1514080648 3495845116 +775215453 2868741161 +3478764887 3242528742 +327284469 921240717 2862072746 +831211231 3711996168 +272801071 2576930426 +531162973 870594402 +3816059091 3813514298 +471666835 1408751796 +680211105 1165656784 +1573733900 3055895799 +1707756975 330940881 +240420470 240420454 +4266410694 271546352 +536418817 1445195670 +1116064777 1116064793 +1486889985 2232987039 +657503317 3617850867 +2779595201 2984769264 +1759271355 3454091634 +1003687084 3644650199 +444727785 2091659199 2745762264 1896732494 +1331701142 2321230641 +1579145803 2729331566 +2746149283 1331284892 +3756423869 886257556 +4100560539 3276449886 3431402473 +1080844268 3674329427 +2147199858 2916196621 +3775018187 386055733 24714114 3852888568 +3664646164 297812925 +1083448206 1576860381 +1275804798 867187295 +3555407604 2794573151 +2997525746 882184435 +1520332060 3278226183 +3426391588 2755287743 +2115709253 3384932236 +1305172282 888301089 409022918 +2552875397 3280849667 +2228798955 205492468 +1127900775 1005532214 +3224886333 1129869833 +2510496855 3872535782 +3605581846 1401853536 +2383118469 555438426 +519709380 519709396 +212234506 3107531340 +2818680682 3835333595 +825344830 825344814 +2850703998 546331826 +3847316877 1148810023 3706933455 +3879311434 1235926139 +798164173 2976943794 +459832632 1568481083 +2401870222 108928507 +82192529 2906859778 +466151816 466151832 +20503475 3849023264 +1667710578 1382760286 +2992896157 3780599585 3508616204 +316851917 3512418936 +1901436996 2011181635 395065518 1052836392 2751931771 4176420733 2927986768 1203834958 975623107 1041747863 1444410717 2927986759 3820746158 2587876060 3864558509 1450953382 1461188323 2827321072 2990538930 4256802634 +991463550 2428680930 3088584585 +2971781787 2522474874 +427368716 632227319 +448466542 448466558 +2002072725 254511917 +1012801506 3928764611 +2200602803 787821004 +3426962884 1374907295 +1906236974 3647406554 +4075162660 2018084051 +2586538293 2586538277 +2757569030 290006690 3299420001 +1251002073 1456928610 +2388036548 1053618832 +189885185 3526062720 +4186531500 2135728343 +1707910877 506113524 +3202570796 2884039489 +118310741 1090821286 1411713149 +2486623293 2968477474 +255614660 3221827231 +2325788960 1526951269 +2198164406 4150445959 +2603000559 751992366 +3935968123 3415818916 +1317094995 3900814522 +2412798483 2013946874 +1515362192 1515362176 +1766633841 884692198 +1966198523 2020136228 +4230079730 1139160730 3680200947 +2458727011 390484426 +2095080051 138083098 +1658597159 1728641657 523441703 3018848414 +1445724824 1061688667 +1729055750 2921352516 +55583109 3156526156 +1390971735 3675478502 +3680767919 226799736 +254965189 1817978858 +4205145813 1735227740 +590585904 1944297944 3001988946 +1120452616 705055883 +187391016 3959678019 +939303700 917813359 +486392173 1905731495 +518557711 345996541 342231814 3257505998 +1935743646 1071441577 +3984322585 4078630728 +892453478 592774807 +3664237550 3211960249 +367442838 272190759 +3219209915 2088774004 +1457022645 1806282492 +3466059448 635306805 +845432766 1361938253 +383776333 974407059 +2439603837 2867445003 1709987522 +687100815 127896088 +2459491132 44113767 +3389116822 2531061553 +2512002220 1610293975 +2760415920 3003876117 +3923044479 3923044463 +3926738153 2960105627 +290187181 1604081247 +3487894032 3487894016 +4212335608 921565317 +2891784759 2891784743 +497700307 2249753388 +4161112979 1257263616 +282345123 282345139 +4129197696 3484255160 +189265157 3343300300 +3650519152 3112733360 +1974971315 3163471671 52644570 +2021490292 1805918408 +3225167239 632230784 +4084772232 3472436509 +2574275164 3889276625 +1629863996 711827047 +4081708070 2233991014 593412055 +2857334505 1400984716 1705801797 +2434167454 72773311 +3614279425 3309624870 +1694550192 2956717315 +707402322 2991025939 +928237763 630213296 +2795741230 1825482415 +778650718 1840685033 3044925033 +4115603890 2010722982 +1894132177 2337526790 +1328122468 40164223 +3673439814 2215214742 +362118730 1146474093 +3576310058 2592843629 +4019710270 1780755615 +3511114317 1043130649 3226674980 +2923699545 3074547413 +311151124 3200999212 +3047988782 3047988798 +2163515163 3416622586 +3313519613 1897012267 +3244188934 3244188950 +3626505788 2199584871 +720193790 720193774 +3419504987 902734404 4165562632 +2731609434 3687799074 +1717357389 1717357405 +2899847769 1900718600 +3589494445 2064740932 +4006435908 2713403771 +2424098958 41701273 +2106593970 3076815450 1540189747 +3834021707 180812564 188563567 +4207729920 3498043141 +4063896292 4262529470 +1101208136 1921920752 2415664995 +4214214278 4064419041 +3158977112 4232664563 1663183211 +1401844410 1160927111 +790132119 3129023665 3129023654 1228941571 3129023664 +106700903 1778844214 +1783143419 1263373348 +3617271499 877308290 +2261052626 4194356883 +3976029187 1245006107 +1491223209 1491223225 +2727002427 2262180701 +1466282786 1466282802 +2029006768 303763971 +3139938608 3139938592 +759861729 761505078 +2262704392 1030274940 +1487693998 2885089522 +1164309288 1736296445 +2247045812 3181417376 +1765254474 4029418162 3969463163 +136744413 2981188340 +2974574943 2051661982 +3413987779 424130026 +2059230657 2062867535 +2968697917 3418246472 +1444985254 998522967 +3408897866 3487246884 +726015304 1734350923 +1376097899 2311834210 +1116871332 2028408984 +410325158 2554261925 642331969 2621372401 +3441321849 1723473758 +4202390198 1410480693 +623574299 2645324164 +2777627747 58462154 +57910456 57910440 +1537314311 3019935507 +3007590677 1230586908 +3518953558 1011333640 +1079746696 2250616739 +17073411 2635948970 +85382461 1072803604 +48201866 265771309 +505945773 640174660 1668087570 1555251995 +2902451287 2902451271 +2170317550 2457621689 +623462484 4212227118 +700071803 121944723 +2554461848 1109092871 +2240415520 1732394781 +3167965123 2939459283 +2898189643 997612802 +1070114900 12468815 +2061260002 3068247471 3507924436 1226011696 3121848561 1856485362 4111250030 2959249612 1415475601 1550909913 4034335780 +1703231082 1496914117 +2980168354 1134912771 +2703129688 4210933403 +1134062224 797734254 +475187494 3541571103 +112540716 3217667516 +869468457 2465927039 +2185496525 3726133156 +232564156 2388190961 +2784363504 843592387 +3076793207 698602576 +2261396943 4282784974 +1539055802 573967234 +1231040162 1231040178 +972332394 2786315739 +1735833352 3890356637 +993259050 1556081691 +37350698 702974952 +3051054089 1365146168 +104418940 1438327719 +3582793302 3492755507 +2045893259 2193295572 +4246638617 2417809224 +3262303981 1250810937 1553234882 129744654 +229245305 4221587838 +2876749635 813006442 +2710906888 1708000395 +292837149 2535793314 +3221970098 3660350249 3844529182 +2468439202 1066494723 +2428391793 1285174512 +3432440791 3432440775 +517136277 452327306 +3412207630 2353408530 +2083881226 4218781720 3285938857 +2738951430 289324666 91494519 214074193 +3298562618 3257342210 3148919115 +42903814 1142699857 +518401929 518401945 +1071472161 576917325 +1927663444 868573497 +1956033668 622063853 1956033684 +1107797303 688461200 692908451 +1358718581 2611012915 3900507264 3983402379 3463205647 2406663088 3787090735 3411424654 873985576 544713594 1416605218 +1137883140 3367480905 +551407728 758063189 +4256510874 4265622397 +1722004826 2947373262 +1256715094 1776530935 +1777416357 3732449607 +1204662261 4031941776 +3674886349 2654810802 +4046346433 1828042710 1557161457 +3925885233 2405867558 +2414344965 2402298074 1120948029 1053837537 +1308045710 140706636 +1667227551 3340924490 +413647435 136599101 +2186365979 3469941192 +284823941 4277438909 1051300954 +584170964 757456680 +1215549347 2974801290 +1618185806 1456640473 +1017144441 261940297 +66877606 3966889281 +1448439343 801482363 +4096389439 4096389423 +3089724926 3089724910 +623282895 1252819918 +966362566 1923978923 +2955610865 2747292566 +4119277022 1611615356 +2585880111 3516128238 +1334018124 2578179412 +3673485541 1600160339 3120142148 2795779051 +369254710 3947208842 +3053363317 4107704362 +3409375747 3934190268 3789862375 +3454730525 3408220649 +3125639026 3119712371 +724351320 1332200859 +710343747 3924761962 +970161214 1173132681 +1761329689 1565691208 +3026216801 1530775169 +2718223128 3891315891 +3995852132 860518256 2031904323 +2841406546 2334885879 +243434087 1047742518 +1558935418 3232568605 +3557784875 4284615348 +3291640988 2003669383 +3143497052 1357463495 808416775 2815723212 +3018293560 1836084013 +323824487 3380302646 +1727581965 648933746 +658510159 1915006090 +1355948948 1398241652 +3380302646 1663303175 +1898369635 2199728604 +580274309 406657194 +2201364893 725844514 +52326502 1178379162 +2420122511 2750937624 +3337716768 3068558560 1508865892 567020253 989400094 1508865912 3840524255 +1382017471 2805587324 +3139881416 2275547893 +3768533392 716453283 +3594389861 2075522205 3211141539 +2512002214 2599184163 1509628225 3936481770 +1940112783 913317759 2580545550 +3215432252 3215432236 +1709531688 2417591549 +274030341 3143931098 +1800361661 2713968587 +367957622 4237745105 +586200247 1230784745 +3470203888 2359360195 +1746753610 1571847137 +1737934027 3713518484 +1136205658 4134296253 +2891553091 2483831914 +1522961329 2542659494 2542659504 +2218843721 3189504696 +2706514781 1364044660 +1164331330 2181386997 2181386979 +3343720131 2171038954 +1164418465 1632240647 +3677653754 498866566 +2350467766 1363183476 +1500682179 1893282215 2456086524 +1473358765 2120644489 +4124990636 261895527 +2421427653 2421427669 +3304077685 2066379555 +591914682 1144010461 +1084254933 2441620810 +3589672465 3814204614 +77695455 246665448 +2790841292 3133338712 +2771991595 3447082286 +602892672 3785715716 +830645433 2846445352 +7796924 3234702203 2001309688 +749333628 3929006501 +1819097166 4238778686 4260340430 3290401343 2252160427 4260340441 +250076057 905356203 +2456455261 2892511298 +4223589776 3715549603 +2114660532 529601359 +3270198838 241141511 +1775415021 2208915204 +2405419571 3202254199 +402052019 3759273677 +1604036606 2148103369 +403303188 3684497247 403303172 +573469260 3991204124 +1327579889 1394242195 2641187712 +2083124166 2509437915 +3578302884 1698514239 +734466841 3655117768 +304747572 1581976713 +661644433 1274065108 +1087405479 2939538934 2981304228 +925149178 2131363011 +3497008754 2457857381 +3046864155 2177362654 +2559373374 3834262579 +1644903670 1644903654 +2444891728 3086032867 +1296982064 4099693451 +1564260208 3682925076 +2839591285 2696847480 +1629426174 1043318946 3369911649 4050938594 4199282098 1680290809 2129172990 293419057 1427400425 1965612580 1695670284 +4149882283 4149882299 +2400471829 172279226 +1313120247 3008318068 +2756815499 689929589 932149460 +2662881119 993102494 +3591339062 2600307082 +2399038382 3364061935 +192067436 3511594624 1905704705 +3901649218 4025082717 +1528489659 643381348 +3441731131 733064946 +1028451116 2887136833 +3616429701 3658625882 +3835373662 2789448605 +2014907971 1383166844 +813715353 1589743138 +1557688371 1538826330 +1634470623 1008016670 +3401084195 1129565706 +3403505257 4164655387 161204184 +667186398 2017720681 +2302959645 2312742869 +3123699663 3898430161 +3948071274 3713208795 +1513900783 4226414126 +2150467156 464156207 +1645228062 1533252414 3368947775 +2415471644 605407551 +3676672013 3676672029 +1739535635 2024561852 +3857100220 2787344113 +348116717 2533316356 +2719719879 4169116736 1895573715 +2611662371 1557742610 782652922 +2945211405 2240408420 2240408421 1727326322 +797383545 1253064552 +3629884131 3679313075 +3041769703 1348080566 +205495570 3619215422 974519213 1512325957 +125035410 1299136211 +1660549213 746715746 +2647131978 2883811707 +1675764811 3390233310 +4074172588 4099727041 +3921645682 1737608550 +3903833583 1001690926 +922450928 2112101059 +1671423751 3820818436 +1026210728 530200780 +4049954195 2510218874 +711828496 3667477813 +3407162234 1187778295 1782606654 2607543385 +4178613208 1190237479 +2269951687 69192704 +2460809636 2320301353 +2017928223 1996348616 +2857690871 447190736 +2630767282 3110913367 +2008035549 64507501 2147962128 +540740288 2096229459 +3499450985 3291081550 +2524108865 667584400 2524108881 +1133727545 1977495383 +446858838 911875361 +3014049223 2524758080 643998931 +715942586 436757909 +4078037105 4078037089 +285962281 2472029729 +2711714468 355733545 +3818831534 15084527 +2093862300 335195271 +3510702369 3776693574 2322462432 717314695 +4114238539 1439046146 +1051818464 2439175091 +4283071569 190732425 +3814675934 3440651369 +3615956293 4026434599 +914681921 340145750 +2904967818 1380864485 +611645149 611645133 +2000337521 567432961 577994726 +4273368873 1786452076 +1857527983 1857527999 +4062910029 1910951858 +3467501710 2087767577 +2135052945 1349618731 +3574964573 3456959860 +1893910905 3975827785 771959166 +2278422036 3711590767 +655618764 2296211027 +4265554249 2256180718 +522387891 3072044250 +4218435294 2946916201 +448133974 448133958 +2307163724 1545129244 +3764999683 1221748394 +4178828352 2460775483 +201715218 913674664 +3264018079 3806870606 +3418447248 3418447232 +883768267 3082100866 +437082328 3755914401 +1350687367 1131086464 +1169712933 3863633708 +2822087748 3956327225 +3918137102 2744025630 +4027236630 1603909089 +1507775753 1507775769 +4126139313 489393425 +267397269 1728159546 +341239660 1892568855 +359397625 685886664 +2485312120 3831024839 +1913192210 2519304531 +3409927325 2438579842 +1646010725 3778923677 3611857402 +559818552 834588100 3208101165 +591299407 4208294298 +539938306 1717792266 +1350407734 265469711 +2817982198 2817982182 +3161960278 3161960262 +3795378040 2542258683 +871945675 2612563604 +685869767 3498852787 +3932686842 4224169099 +3915912341 64513692 +2836363543 979083046 +1593321139 746473421 413086262 4170976017 +2487038883 4283976092 +4183165747 4183165731 +3346659854 319071257 +1960774792 2199960093 +3301524341 3301524325 +1441975792 932896605 +649637262 2193176217 +1974304042 1780222235 +3894033275 3894033259 +1433614485 425857692 +4248790792 422255157 +2674235827 2674235811 +2920891517 2920891501 +3574053289 2850371995 +1752722933 2570204816 +2409176601 3863413199 +4152990596 832557279 +2985174047 954391774 954391752 +104110267 2144104050 +941149624 3299219539 +2243521348 565404207 +827666310 597847235 +3896708261 1183639468 +2847093031 2397695507 +651897634 1292166805 +1888541517 1401330853 2164865586 +2345949302 3375015750 +1212318373 1212318389 +3809815190 3809815174 +1079376053 1720795840 390562241 +2638555379 2262791820 +64704684 1069418967 4115085116 +3482045479 3482045495 +4061566963 210842522 +2104830068 3560759595 +1608650360 1759299309 +2735481788 2735481772 +1128506880 3816706579 +3085243775 2570211132 +1484640370 3222217573 +2739032315 4234509092 +2137571341 2665895026 +471786939 2428659227 +4085394907 3405066654 +2473159249 1609719184 +4233963055 1973623800 +3567306340 910492249 +454512340 2041649071 +630680913 2677031475 +74175251 146622202 +4251890665 3729078215 +601380501 1488146099 +2281499778 2502447285 +3654748099 3654748115 +100071171 2064166931 +2475132993 2136702528 +1228646177 1776818422 +2885517250 778037438 +3976789010 925159493 +2913399098 2546843211 +450314379 1129574134 3394687932 863395638 1045343341 4235729902 3920187491 3465997012 377306281 3815015674 1676802987 2684637246 3150728521 1536322858 20558845 4095720190 1269500686 3538020212 996205 2214556026 1721896908 1841348836 2065063130 1721989923 1959581268 +822293262 282627959 3458556300 906583823 +1321084875 3227034754 +1972193727 3429570472 +1353958252 1354013313 +228565236 605375915 +1719135217 3464668310 +741020935 2396133910 +1450392101 3432098275 +1415096114 4186911667 +857905988 213555716 +3416795589 1589231884 +1447720336 1731662261 +3326118582 3449445521 +812883293 812883277 +4201332495 1171539096 +4037096066 1338147491 +1603713139 3980680474 +3145929633 3763863472 3145929649 3495421558 +3413111118 2402868678 +730228556 3499400353 +4240076724 2373834841 +2575077800 3553030843 +525498360 3941559429 +453904098 1590460925 +306046383 1718653550 1570374975 +731461563 1273916037 +1279886001 2698049878 +1353036660 1759084431 +1155668001 2431384566 427664465 +2657936972 2976811447 +2130000247 199575088 +2086421131 1346158804 +3565344147 60271638 +4123917737 280074521 2621853966 +2936136507 965105128 +4243470853 972131882 +2186639396 1351360703 +3435448154 1993671760 +333721866 1513697965 333721882 1782139901 +1227093744 3058610269 329104341 3739839624 +1478711259 2594393540 +205389999 4103803758 +2553728487 2235966112 +2378766997 3365197980 +313774044 1292908369 +2190232278 1017120714 +63502244 2612640731 +202965915 3626812709 +385577194 3687108435 +772448193 1229467914 +3403450855 2801442276 +1105921461 653705727 3726851132 2866551761 3723094541 1391701425 2966355798 +3990743450 1314429573 +1852253972 3764552815 +449280022 1496846534 3980522538 1144440055 +3728781434 1507184669 +2628029018 4043688893 +502336582 1055967927 +323351602 2300537509 +1770915225 3281178568 +2835836639 4122183944 +2980754476 641259863 +3993274996 623244431 +1276818564 1502880675 2805209482 +298508309 256147288 +2619008335 1192951265 +2726399728 3253994435 +2075036812 1070022753 +3445012038 2239819831 +2308496362 2510441117 +3160563949 1184506332 2675995392 3731473031 4109269567 593415102 2813625731 238558227 2714685452 2325450404 +585764858 3476697185 +143056378 1716482205 +2429230638 499155577 +3404060680 562201811 +2894600062 2391919866 +526062536 542668003 +25075635 223700677 +3883796824 1268528346 +705288284 2306840785 +1130154849 1813260704 +3358929439 1253959390 +3155906097 1304653367 1341921062 +3083609744 1832665192 +345042756 1962968623 +426494199 32054132 +1766253180 915835192 915835175 +2240005812 3799108943 +2930204972 3678161254 +2023051816 990887690 +1432195068 1575242032 +185175205 4014691683 +3973964302 4014660623 +3048673143 2251118672 +1795600625 1820887910 +1129116843 2508184792 2636458292 +265959373 2415921436 3816412086 +2641016585 138174410 +694136871 1352621331 +1974571008 158603227 +491324667 508079550 351459122 1785299465 +2029616789 2597446970 +835518124 2697619393 +1795988006 3373905357 +3217843132 2864775399 +2773751188 2773751172 +2182216086 1194385345 +3960446470 2727723895 +4039822717 2276950480 +1933325844 2076778873 +2512478461 3161173588 +745662017 944601174 +1432551893 1071374940 +1787929208 945942135 +1469101033 3251320792 +3796606280 3381123683 +4252710080 2636917388 3371436613 +121081756 4168553095 +2688264465 1324033478 +213513190 2190943249 +2708558023 3965856086 1585901522 +410178508 1220766263 +3004865240 1852078692 +2155449257 3468351256 +2935720752 2784763011 +3266750409 1573809875 +2101354922 3589602971 +2109418237 3936660546 +2469291810 3557579413 +1658860674 385840490 +2636399252 2636399236 +3603786454 3603786438 +792621891 33515005 +2597523612 4222516021 +2002141300 1355249295 +6930410 2423856475 3383309906 +1893407494 3553294673 +2409958365 4258376948 +2545922975 2545922959 +2755854347 2692288834 +257185615 39285361 +1463220357 2718255274 +939303702 951368625 +653649312 380424029 2170260832 +1188875033 2794698824 +260743622 103068610 +2376328454 2376328470 +2076905842 1387034213 +2362483523 1793517862 +567784849 3616723792 +1753240564 3784094281 +4163061919 3176302410 +608119275 4201577698 +3244136994 2287575939 +2958624611 4280721610 +1860156616 1379282635 +868212928 868212944 +2488501447 840319940 +1724255975 3153679731 +96437646 2592030361 +3021070781 962835337 +788795775 788795759 +530711363 530711379 +1552399527 3789680307 1353579232 +3851110886 1078285591 +3041179641 1412275432 +1290355625 1446858521 +2855399275 1469834612 +3841053484 2494525015 +3275562574 2805380303 +2594156719 409150328 +411386706 3955816979 +2612706875 1643738866 +1837967035 3512102815 +3213613175 63121903 +457579954 2707472165 +1096048590 1306487930 280478749 +270813858 186744085 +323642823 2907271450 +116123223 4097107924 +952689474 1829780248 +3591430976 3591430992 +2539972713 3511760703 +341129618 277359661 2485756115 +2451258084 839109337 +3721677076 1227819641 +1540229704 2717421428 +1434885086 1798947305 +1666442373 3792747852 +1293945617 2257365174 +3990316953 3169479785 +3119426365 4021784852 +1523023868 2101420558 +3067315558 888864670 +2971671783 1925179620 +4119389586 1722923053 +1684320013 394236274 +188785702 3698637855 415500411 +3531926458 557782493 +766401659 1685820850 +670250911 2195754846 +3102899422 2199816929 788497466 2489275740 507669770 3190368835 2610001524 1984730124 1148296266 3283854628 +570979511 1246739462 +4100023242 1712598322 +2736100671 4193907240 +2446024392 707082228 +2576588807 2576588823 +2273692318 2273692302 +1920217266 457230427 +415181367 737113222 +103144932 2442939881 +910569109 91968668 +1862053 3796496093 +317464778 2478284283 +3077129592 3308828164 +2782465910 2327008967 +545231689 1909775352 +1659612727 4026744976 +1492040650 578514538 +3502528732 4123845711 +3212347158 2159847335 +2166525676 2451640832 +1232860409 227022325 +4285957969 2023163024 +283596617 2202951541 +1912588736 1385668472 +1439098182 660825925 +3099773781 799413962 +1573294190 227892537 +3253345525 948671932 +3728861593 2059582408 +3077077116 2691122280 +1124836479 707327548 +100374684 3974706945 +153703714 2588210414 +1906206736 3131175144 +426785013 3038123674 +4265139992 1267151565 +2892356489 1148733189 +47512115 2823151194 +3756369405 457547509 +3197826265 3874451870 +3086803279 3086803295 +1200237698 1467756046 +3095048826 3091744854 +667494178 3282606723 +3810824927 3535567755 3535567772 3031209697 +345088058 2604612427 +2693172332 533663233 +2651668412 2651668396 +3779018639 630263310 +3628759912 3846194365 +2324779204 3871483039 +3606490297 525461288 +2286146842 2630383595 +4185988780 2699790295 +967809466 2305753035 +4293483989 2952642609 +3904903538 3630698106 +1067338020 1846485775 +2648013433 954912587 +1033165079 139575088 +3127008722 2151049172 2072344383 1485936487 436283155 2184622789 3492370880 1262402577 321528435 79693681 3683732170 758805490 1572165434 2830208 +59379705 2337744104 +159853778 3519778451 +622015300 2704913439 +1057806460 3174615847 +743587199 1148636904 2936518443 +943527968 3499478176 +4183541829 3497804940 +1019040862 4228632553 +1799111233 282872896 +2537535143 3226241270 +3168237985 1038317575 +2857996183 3254586022 +2510979407 2180831515 +2781566692 1788298968 +4048473850 3641693067 4048473834 +3907887734 2530207319 3225918182 +2987884174 3908843929 +1655028857 3286741608 +933545697 2036667424 +923367353 1558673448 +1833340799 2232673512 +2728255145 2810545176 +1151768791 2748915284 +2623248885 422796476 +1212461471 1494259804 +602194091 2262906115 1468429226 +2201305542 2045749136 +851736410 3207190897 +3045019185 98334493 1460634292 +4042669662 2250417026 2980326889 +1014785765 483785338 +1449015798 993812682 1295057781 +3330526838 4152230865 +1317503087 3426198437 +3297550539 878780308 +3542112594 2917964805 +2313523805 1902471284 3835908693 1902471266 +4218139061 2139668476 4218139045 1871226540 +3964792216 1761930035 +1788257478 1788257494 3753791594 +312477499 721663237 +636851831 949738822 +702912237 3781990148 3781990171 1757600968 +984101295 2399649531 96876152 +1642771122 3598143013 +1059930369 1966953622 +2368514380 2303623863 +1138269018 2576650470 2866813441 +1796279083 3067384994 +104558218 1502544685 +3713866692 1085781512 +1590441099 3329668808 +1120409205 2516277820 +3003303709 3932123828 +773099945 862014744 +390745082 2750782109 +2936329723 1186613978 +1242855004 4197864135 +2250881461 906454348 +3676714046 3529198626 +1416363843 688051818 +3888095212 3198730391 +26665458 1921363941 +3901940802 4136308298 +3690564304 433423733 +2514792837 1287068793 +3783948124 4159338312 +177053026 4277059925 +2105360188 2348384999 +1962517530 1056789757 +3240210384 2302297148 3624387701 +1228999594 1536215045 +1644384660 3745082351 +1621385026 1690432739 +2669186073 1585855439 +3583482844 430594887 +3571575545 3571575529 +1969697166 1601372825 +2252961420 3367522977 +1236288313 964285096 +3465444418 453172361 +3432561989 1751284604 +2800894490 3969567965 +138418022 1161575601 +2099133857 631956487 +479270446 644213359 +966076841 848565503 +1122310277 3550845260 +2837714256 3597794774 2339961415 +3725033479 2362346240 +2556559605 3611787690 +1020014159 1332649114 +2088567166 821572280 3673168265 +3537291074 747710813 +3274605847 239966389 +2282941378 1956717003 +343324850 3659176791 +2939459328 284943410 +4270870495 2620242974 +2993241491 1856761466 +269016147 2854379315 +879988436 1709823919 +4057473234 2616034669 +323548219 2530769124 +1737140372 2120577140 +2647421716 2094606447 +1632650872 2841571067 +3897114485 542041404 +4080468938 2845505275 +3541090911 557771776 2724330369 +445504206 2728636852 +1093764524 4072845842 +2825688519 3924805696 +99275193 3532620207 +666841299 559257920 +3878749774 1375701930 +147893232 1712419314 1632294366 +2107945624 4292458547 +1425547019 3449347650 3449347669 +575423411 575423395 +2879063904 2232196147 +1289517447 2249412502 +2151934318 1625289010 +996655223 2359088451 +382811550 2305032127 +552112957 3753470077 930753084 234004577 +1742237863 714887441 +858545778 14200165 +1352555848 827119691 +334672210 3104646163 +3589623054 3743960345 +2622447856 16095683 +3521857026 3365428039 +1644817746 2812319749 +1644644813 511258034 +1802359709 1461622146 +593903905 1547070087 +1883049120 1343938533 +750165037 2423773892 +2000683452 1586256964 452280095 +327902543 326138702 +3462985463 3862742726 +4230168520 3011340253 +2083378258 2543789293 +4080597540 112314047 +430673642 1393687117 +313138138 1003083819 +453559734 644518004 +1691760014 4118653711 2211727502 +2117866926 1721114863 +3534940637 2062721839 +122201019 2873643195 +1976104131 777604842 +3649363339 4143964403 +976683824 1131755165 +3009756685 1969270386 +2303152447 1514464830 +3788128118 3788128102 +60557303 843279529 +2233870184 2403189141 +1930795860 730511551 +3492712762 4082015819 +3485311472 3485311456 +506310387 1961519258 +978936276 978936260 +2164514441 2719437240 +4102574572 3734566551 +3621086169 2649501320 +3545052069 1200114860 +3315742911 621954155 3714012328 +2569102495 2928764488 +1182698634 3738374026 +966532384 3502365029 +1028442398 2648742463 +1938715001 1938714985 +2224746183 2263212886 +2788161897 1266949829 +472245346 3961871211 +989487949 623530546 +234116605 4104346946 4104346964 1596706530 2048157579 +2129289352 3293062764 +1502563712 2090270867 +1601827254 433799265 3293990150 +398752710 1539894493 3843430586 +2604858991 2604859007 +712066228 3688861140 +1638721150 1093589087 +1811762638 2141157714 +3978267262 200003242 +84790752 2273720507 +2336032546 1393703555 +3490924897 3490924913 +2022896660 3814079343 +515962711 3658677418 +2185122572 2722324640 +3046442058 3621341320 +4123814648 4123814632 +1950911503 1950911519 489978766 +1124728740 750612287 +2838287696 2710818037 1353426347 +2636442398 2132680745 +1626326609 3933548944 +1923598436 3793778025 +797285807 3130279837 1532037882 +849485989 3260546525 +2952351269 712377402 +3699717904 901099061 +1376363049 2475493020 1311393432 +3195543282 3373840101 +2355607701 2621936284 +2379606471 1895632393 +1774686837 4197158442 +1853006638 1195987584 +3119394997 5387341 1727442172 1727442154 +3539500612 27272924 +3035111104 3189212792 +3714391928 325656581 +3920252389 2514877747 +706638450 2531999770 +1351332674 233517301 +2963581081 2889181384 2358826375 2713050444 +3013558718 1310886623 +752452234 458102302 +3790712111 3994877925 +1488455082 2358522874 1518424595 +1358582399 4178566632 +2875658599 2867106035 3613341600 +1184913552 3194710691 +2061476519 353176822 +2034518977 2810396886 +2568815195 1408804709 +3489683420 1284132679 +2935342227 4293161850 +1454344015 4162329996 +1663448133 2166246013 1512327322 +3178365801 2838852825 3178365817 +2805176387 2805176403 +672856493 88280129 +4014415327 1094746705 +2777401621 2777401605 +3107631051 1970199790 +2011074255 38869828 +837763523 1587840490 +1292577313 2945769475 +1930181284 1930181300 +460932419 2196244604 +986821672 1831730261 +1664855989 1503741201 +3726909081 1272720094 +286579979 4007131202 +4054673513 3707460942 +881698829 3355413618 +83836719 214988536 +213536469 3729398108 +2766059790 2766059806 +719699534 713572814 3584726223 +2899174133 283365377 495243418 +1325369573 1095008364 +3798311473 4031119527 +2140100070 1971707687 +2720080714 2377462946 +2698637022 3577796866 +1129420941 2571418610 +3860534214 2407896633 +1834278253 2308477572 +4024851849 816135864 +1772572457 623789525 +3479514835 1524496330 +282848330 3807930025 3875040497 1961950653 +1763639372 896755028 +3963565981 3963565965 +737500866 4114885475 3498480608 3729279009 560528966 601541028 +593274744 3342217361 +3328607148 3341022401 +3216131105 3869327350 +4274308132 868271273 +752580718 4029726904 +2866429772 1183907868 +1999516643 2159783516 +4051539621 777139015 +1131893231 601226040 +811160081 765210822 +1762464514 1637149749 3228547869 3338745230 +1336357602 1177885123 +875323872 2576067178 +972339285 972339269 +2919960207 1789061378 +2386461902 3127578713 +2984084459 1985367189 284986396 2002144811 +526533596 1135661905 +2738298887 4140264214 +2823381923 2391267740 +2693322469 3109241942 +622102772 1476761888 +2639508984 2730980717 +4222563471 1476832475 3285171470 +3429665666 1356832181 +1714689105 888929168 +1454484968 1639236669 +332627977 1056083512 +507306371 483852586 +3472588522 3219704402 +1751326656 986960248 +1859928580 1368092270 825327792 4179072681 3911734028 1313627601 442292203 2582355196 365427041 1021782508 511098425 1100726870 2676023424 1192816152 +1112339221 1948428828 1766500403 3700534714 +3488611574 2856404178 +1871739156 3699220883 2132616748 +1652098179 3057318321 +1477981453 4266650738 +131698048 3682189445 +1732944380 2524774311 +1179039981 2387942660 721211800 +1658583190 910709809 +4240268419 365388903 +1329473715 1910116826 +3125728786 1545272901 +1984751246 3373199759 +230345961 3591836658 +3039988412 1649441393 +2062539950 352462932 +1167265646 4102113839 +3245574440 1863342420 2967529981 +810831551 4070132330 +3103750198 3103750182 +3474345617 2434641488 +1272835168 3462077235 +3825499181 1789077403 1247697042 537885394 +2492185751 1818121762 +1121172927 4065571774 +3364618311 4217663446 +2102541539 4153677491 +3568667513 1389006696 +2419269219 1668863452 +810598726 1949567581 952543622 1428177207 952543633 2613507386 +1915813529 1545652958 +1436645046 2200821895 +1888483239 3651329014 +3376869068 2122130679 +1033626918 577354455 +3856803714 2828673931 +2747397261 1465121266 +1845032867 3848750214 +2300884255 63512542 +1818401185 1077401718 +2734656506 3564734659 +1721372765 3783770740 +3431161336 228180627 +2161660183 3951535920 +3158744281 3158744265 +1229330800 1304417995 +911825812 581642735 +3309541857 3382553287 +2790224058 2299426013 +3823568970 2638849445 +326517844 4146958383 +3168671699 3541588055 +3135058400 171279269 +311062510 502150054 +3626168010 150857709 +3997455161 3550705086 +346147799 1370743654 +3772815194 1331599843 +1674556506 2916603957 +317205389 1461311743 +30409458 3466364059 +2877289313 1533813174 +2581128975 1064549518 +3783419076 3292831881 +739452410 2565321411 2008967402 +3662538909 2975888932 2992666554 3026365713 1065639863 +3693839782 3151425189 +3385517384 4066832477 +3298244613 3686945834 +1054042399 3960265674 +93426340 3396678436 +35341542 2396055079 +3568419546 2916465981 +1285830019 696270122 +2589053107 4271970131 +1201411156 246677551 +2437536240 2437536224 +1827978415 1203540721 +2504665244 150797137 +2012229151 3994589896 +2345816908 1746477239 +1733105627 2036108740 +483942995 3148007596 222422743 +1974971321 153310248 +3524278068 3817268943 +1219484110 3934816601 +130697942 2794170358 +4139911192 2026813271 +1469998605 1182944315 +1697262520 1697262504 +3111162728 1330989251 +425827128 2020696531 +3885886901 1661072659 +3317929533 2414182914 +3064928554 2995742225 +3626744526 450302543 +2892079848 2727360555 +1179697282 484500618 857672867 +366140348 2125927571 +464596953 1496054741 +3483834200 207127719 +788918335 1399556092 +3281747530 935841389 +2907466365 3708893026 +2488449706 675010971 +1264948731 3340379838 +1562441596 3559762959 +2113406134 57633425 +3739237878 3506539089 +1426431936 1441797096 +2097726426 2152562550 1453470645 +771849115 2411304286 +4156071558 2107739383 4156071574 +2208154246 3076077793 +186237959 2156893952 +3731537392 302579907 +2368208992 2516096819 +1435833423 145684558 +591055718 4143958673 +3836673905 1887182566 +2239657781 3440910029 +797050695 123390532 280065238 2718574873 +763847559 4261683332 +2333208534 1179872697 +800330422 3464066193 +835648751 3655270006 +3173875844 1386303433 +2566708081 1192063728 +416455708 797687825 3925826256 +2273462299 1830257284 1073903071 +157055771 3616918404 +266621703 191804416 +3659394230 2608913047 +4260682271 3883097822 +3252482881 1876094784 +3232422653 1240906818 +2566299301 4278956566 +97507793 4147373062 +1902920704 2865753037 +3220324298 4099566317 +80867823 2528252405 +846442214 1503158311 +3787796946 978408309 +2213241981 3684252149 +3902219935 3304180808 +2720853124 3501741023 +3015876822 2250636193 +3336667537 2522825526 +3721999185 2381039760 +3182448225 3182448241 4253770422 +3108432901 2946862028 +1531456874 480214491 +2996215833 1008600926 +4100220105 2198513774 2466955656 4100220121 +3239106794 2719774533 +1643932980 201035145 +3464398671 3137278608 1613693265 +47415524 1458824959 +1137338770 1235497157 3430477582 +2046131658 4164343602 3346334971 +3588348152 3791140229 +841758398 3113889033 +610802212 2926199804 +1730343173 2403022122 +3518124527 369981754 +3357988569 2164493758 +3874988232 1141675739 +2381884710 2759365313 +2027244237 80003250 +2593253946 2377365853 +2205778955 2205778971 +127643094 127643078 +968789206 3170350311 +3479736141 3466171940 +867637749 90333069 867637733 +4179811446 778866841 +1088807004 2246062289 +1677909852 3344396304 3431308753 +2612259603 2612259587 +3515175629 2715900082 +4211563099 2274573650 +3140917346 1038346990 +4182665738 2154884525 +4007749977 1708709662 +1164039725 1557402237 +3505552545 622582993 +3967209557 2483680732 +816024641 1334409199 4121597332 +1174687683 4224290812 +3175783209 2161980056 +2866924871 1215702720 +2162395829 2603834108 +3316550273 2999191839 +658397130 2182783834 +2684652169 868728211 +4273214707 3900504716 +181884204 1077994048 1023087681 +484361925 3366150397 +1795768631 2516951555 +3502444408 454121979 +2865919696 61377767 +2213270554 3326010603 +2676364304 784042708 3769492093 2999276776 +456942182 1175381633 +3536360113 2193550512 +3145414690 1157193091 +480225932 2162502620 +308849329 2881795248 +3182476990 1530676489 +2636912325 828889100 +2800852809 3063227321 +4205191145 3525977432 +2952291560 3418880771 +2964396870 1456723043 +2627869252 3610204425 +541944539 2137208456 +2379703530 1725218335 +2772953172 3831991936 +3891059957 518769875 +1500261232 905001163 +1492254351 1492254367 +2971679952 2780806005 +1697509608 793918772 +22822421 311780768 +2988277505 1701768854 +443520056 2178319044 3584447533 +1726669934 4083819566 +1129705218 3592062861 +4291274973 773296926 +3218643092 3218643076 +3702336693 429744362 +960829844 3943149886 +3522329948 1273708039 +2505656841 613387310 +2268738631 3243809165 +2595506617 1120931390 +1681452534 3147733585 +3940995112 4043945770 +4061702346 3872503277 +2109455873 4018936704 +2315191137 2315191153 +1136766445 2620211282 1997709433 +3461475907 234492778 +1810056454 3703941217 +1412938089 920761667 +1723946481 2357676612 +929492279 1845980550 +626859529 3667281966 +1073026669 3132713408 +3521542467 2966479996 +2622117934 380806002 +1662858583 3287820142 +1244849624 2787103501 +1250996575 27131420 +2803243183 909213164 +2230316154 3687756931 +3078265980 1376016167 +782753338 3924189171 +776322243 2596808426 +3423753540 800021560 2229025289 +1240993214 796762633 +3980181780 2326000249 +3256975974 12600961 +78234332 4214603664 +1249853120 882394252 105891909 +609655154 1216954125 1216954138 +2083789318 3912826830 2151806312 +4137368693 2875206698 +3787134966 1334229063 +43308449 2974567520 +572687500 1213638775 +870651059 859361334 +3252630201 3948730664 2216043554 3606616907 +2698492265 2698492281 +3624838631 101657270 +4070365552 1558858581 +104838929 3880595408 +1001669467 1001669451 +2085094712 3714070317 +2155119486 4215945674 +1169305452 595633943 +55789865 2320355199 +3176320291 744025621 +2846882926 634552492 3377921273 +1330232871 4162213750 +4023741925 1912340332 +2245034639 2061216460 +2560722536 2923861437 +659401540 2382471737 +4044392082 251910085 +3080809406 3508313119 +3056281953 154025421 +1946743825 3138926278 +3757871134 3096895295 +1926024021 224663260 +742989368 902586203 +802824186 3957430013 +1232880740 2213271997 3237629552 655642684 2230049603 3237629543 +2454306519 555183206 +2586626946 2586626962 +752311543 2819205531 +2409182616 2788122189 +3032296402 2243823478 2473681 +489143704 2106553947 +3342132300 3829621665 +1198073181 2041093442 +2558710025 3562535045 +2369642410 3207533926 +372453822 2962705929 +2293708235 3015512322 +1178025370 1949803363 586545533 +1119787768 168686700 2582496849 +882279280 955312451 +2292029096 3088329323 +1537039427 990430180 +1379151598 1925134086 2266363856 +846166727 1254762948 +2635331545 3792047375 +2510992718 1218876904 +4149139298 3005026115 +3236701413 213278927 +1345442365 3412373911 +4160960433 4198381120 +3256254598 1049008839 +2103494286 62626120 1640367641 +2688404186 1887576310 +820554853 624412724 33762140 +290976235 290976251 +3367572677 3227234842 +4175886385 77116710 +47456876 2336330135 +3019581627 1130310161 +1511605867 1086970466 +422726500 3042347260 +2572945774 3199244182 +3512601364 2869653615 +4113889405 2137205963 +2015055085 4294580484 +2256291516 3576075888 1906530801 +2935226474 3558647515 +931105937 4006234192 +3731582939 4263581124 +362536059 569774399 +3281818032 3281818016 +1893511908 2995651279 +204615804 2936165169 2585344300 2980640304 2980640295 +2886633701 2886633717 +255126339 860772981 +3720876592 2568641949 +11911690 673215931 +435597540 3277354751 +2897125862 3169377537 +3346605168 1941199939 +1661731156 619490540 +2527779620 1391917503 +971080682 2615787221 +1038160862 2352949825 +212405787 136006722 +3825667889 1266981313 +2988215680 3807559813 +2800410442 408079958 +280949565 3202627915 +3408182949 1876434362 +4030568816 3225640216 +1305023610 3985325085 +227790113 2225267024 +4212022565 1553768762 +2667385009 4183901872 +2044629490 2384980823 750186116 3631975138 1813235887 895043878 +3185478936 1547987465 +423083200 1925063244 +4064528405 1974728970 +3405999541 1984443063 1025060808 2602187084 2434410930 743754776 506438437 1264956394 4198397203 795485593 2602187085 2602187098 4215174825 +2322228430 3011293263 +791389361 3083135830 +932675622 2843655127 +323259730 2039748598 2938037127 +4104525452 2910158455 +3613800380 3521756391 +797663762 665489214 +3220346694 1893999393 +1482857308 1362545011 2134544856 +160611590 1045457745 +3497007959 3870107082 +720466394 799035131 +361379073 3918622870 +4285401776 1357673928 +840403483 3702425567 4128139396 +2390920761 183429992 +2845706503 1618879326 1638650783 4180476420 267906137 180893206 +2815789094 1677449434 +2912135251 2456943290 +3225143981 3225143997 1260392004 +2079343157 1345862012 +1658597168 4007232578 2495438654 1908650120 1526668459 +2087366641 3632859604 +1368138294 2285095958 1368138278 +1041640790 317283953 +265517486 2548600057 +1425547020 3466125303 +2346242312 777064331 +3741802651 4152554469 +3435365375 1455999614 +1645212210 2434417829 +976999098 2916017867 +1783702765 1783702781 +2606963188 1592518751 +1192025382 2834749542 4282393303 +3266342446 2847765103 +1397455515 3895108539 +1496719057 1093829382 +1050886158 2835207695 +600989042 3327968146 +3359421737 2257439141 +4201432514 3781135325 +2570460827 3825102920 +2031842700 842664823 +1046124600 383606711 +3945519278 3825605113 +2903079154 3234211208 1533669593 +3542585388 2470966593 +2828583109 762803738 2903436029 +1238297065 431634904 +114578431 3208657534 +1946955534 3173913369 +2103286966 274576017 +142918478 3743631517 +3107369325 2480320453 4263071378 +3985004300 4195824988 +2878675119 3400915822 +3064751027 1147204314 +1013073915 3870485829 +2743441513 2135139584 +1045987855 1111636465 +1433876574 3636069438 +2020278054 1366837032 +2786371244 2786371260 +898288750 3078607161 +3705684115 1208330085 +2912786310 1743063505 +3782908327 2600460768 +2543324583 1264418294 +3460103737 496858142 +746612034 1344235235 +348316870 2834887834 3988614326 +3895172700 3843278599 +2086101946 2006056413 +2025149019 2977844521 +2931317939 1938823629 +1784249175 3252496880 +2695779018 677382652 +318827437 318827453 +3595824052 1999074923 +3621936935 3621936951 +1686297866 3390531685 +2978976676 2928836132 +2258724430 2140150689 +4228258367 1009636392 +3726387871 1163335752 +1724169597 2154011791 880884235 +493142665 3466476974 3843753477 +2641489324 2253989335 +325582361 2780102984 +3492307590 898832609 +4248473168 4248473152 +3726388441 2136643976 2136643998 +1784861816 4053039341 +16276025 3895004180 +2428557642 697700219 +1454502288 169821621 +396243915 3441422479 +2033865497 4023439454 +3544257608 232652784 +3588182590 3968759689 +1882392132 3830635807 +3977821293 2867896210 2867896196 +3929435450 3987599965 +507610179 820383265 455622112 3827512700 +1699358152 1002011101 +2740414812 2124078033 +3432838544 2870383011 +1315573696 821480275 +3727816113 2040907174 +1157076564 3906513832 3854673465 +3458814794 3574472059 +1504401348 3971688863 +2950812960 8552819 +1619055927 1280265833 +628345203 845443831 1749426188 +3602792803 242137633 +847353829 1728191866 +2632012751 3317100238 +17092858 2492791179 +944359604 2253460745 +3816430868 2769904195 758892144 +1163638648 2808205805 +644876540 194586284 2120098993 2670969511 +979754318 1012621775 +2215523875 1533015221 +3446633902 343294191 +2060697792 1362466459 +2485421240 2292852548 +371471519 2046744136 +827495840 1157729011 +2553899702 369748234 +2942307220 3222356735 2955047284 +4121710280 2252342475 +3696640966 1815752721 +158305580 2164411126 211550545 +1984305127 618326009 +3276637586 84493509 +836406510 1762384569 +3876114151 3185280249 2581444000 +3809534946 1667214885 +335626589 3673810292 +4265039013 3310506442 +700716950 1437671729 +494062015 2964831594 +1443208355 232101020 +3259768915 2269563302 +3794926249 2789629465 3182270478 +1509097855 4282442071 +1743249137 2198074736 +1122631528 3193770173 +2865990723 772132220 +438813241 1704378302 +819452866 3593767845 3870812467 +3490921850 139052829 +3605230563 722431580 +3337530279 3501733878 +371389340 1963294353 +1221997297 1221997281 +1473614812 3905983030 +1536043625 995587022 +2815433635 3483074954 +618839389 1928852821 1844451682 1844451700 +1207503321 638222494 +2321419638 921291073 +2490029313 2771210368 +3841541531 258511634 +1741616112 1523188419 +1475879883 3261821167 1184913556 +2339334352 2154512924 +3351538450 3351538434 +1493373365 3570720750 +2302872738 2302872754 +1258876217 1477275838 +3507222218 3755311085 +2250345174 593294455 +3431507982 3431507998 +1776955065 979812527 +1181945829 3266389914 +3218404837 821750563 +1755839095 930040144 +2683797573 396291226 +462819054 4129904947 +843030682 148258421 +3518995924 77952185 +3340078772 878604684 +3533936665 2579134964 +2302999571 714658298 +1593619639 1053850630 +3427689838 1280970222 +817439136 1043665531 +2107380731 3081991218 +571043959 4217753315 +1907860824 1545161115 +3953767103 1111969404 +3800781998 1331056111 1599497993 3800782014 3554455342 +3588420274 3588420258 +3479338732 2241124159 +1688275541 2997073644 +171230137 1365012290 +813828313 675221438 +2716264246 343800327 +387721401 441719607 +1142941725 1395991697 +4255562792 1970942717 +3043821261 1738650788 +4214969483 3178384245 +1475879881 1986427961 +173277805 2138504121 +1569876580 2977790825 3515434584 +2246217543 62459443 +2115424302 92392306 +3569779688 2531279935 +1456538428 3914143899 +352188290 2378998179 3693245322 +3092830474 519292019 +725870678 1910947697 +1224955316 932022094 +834991401 2181951374 +2224069653 3299194122 +2646544972 19124508 +2003176702 2003176686 +2187004481 1985029206 +2114545554 2303793906 +3940662108 492433873 +2409362444 511782647 +181466605 2754351835 +2119440489 1197632856 +456170895 1552418830 +1524819804 1865561553 3708467216 +3046976070 745114657 +2684162636 660852151 +1377338974 2593883647 1641279614 +2678334468 2424613113 +3585368053 1609764522 +4083933892 4141218463 +2241843688 1171266744 +133617485 997321015 573736312 +3606976790 3923124010 +3357953270 2283991498 +3178365797 153845405 2675660794 +1459238844 2816851185 +1752754683 2450496190 +2972105266 301407397 +3735431528 1236439939 +3410784643 679018864 +3975171081 122139182 +1383937330 1410900186 +2987545039 567724248 +582911674 2932726598 +28603072 1863361619 +763339201 3086335789 +2863673457 591117569 610025958 +3879481899 784529826 +3171898586 3681397517 2032309053 2032309034 1365497731 2737586986 +2969566976 2734583059 +2660708638 3322040895 4104616254 +3938325472 1765362085 +2822995289 993940232 +1080086038 3115072833 +4100203940 4100203956 +989658069 2973790300 +2548072848 2968767467 +4209888318 1113097609 +1127876392 3851224465 +284845704 489412784 +1083341244 1653973735 +2068588891 1944394308 +357344051 3131369818 +1695153739 1773889874 1695153755 +1507867300 536629311 +1285284273 261170359 +1308976094 1384761855 +3849761237 851006603 +3535618214 1710015831 +3522635219 542533165 +2366059315 894802252 +2937429947 578004584 +3069255250 1335016197 +193033594 3101564878 +3877197839 3262790747 +2331003886 2789705657 +1352548972 1696770343 +250232219 364837636 +1245807500 1898059105 +562097215 4243842878 +1421055426 414498933 +2147757307 2147757291 +2816489218 1207343139 +4097781949 746168388 4097781933 +48502350 3675200729 +1983591671 372531408 +2571362903 2571362887 +1114617447 4242285622 +3501611646 219182153 +4179101841 2983558224 +3005232637 2938100795 +319814365 3743934964 +3990516617 4158906542 +3367093152 1415808109 +1510216817 627846640 +2124301900 2883849500 +3477848491 625976277 +3963444355 1738056234 +3870233468 2711333937 +3079024959 3976211119 +3748094042 4278543394 163360171 +3478837361 3707943408 +316944253 976667092 1714619509 976667074 +4253491610 2057576742 +2533327059 148269399 +138236134 3733346839 +2796562210 2303564419 +334125942 446809942 3488479943 +3828668369 271564294 +471174174 1407947583 1524157502 +3013156861 3071105876 +2606418445 3718031316 +3204247826 619484866 +2822616131 1027230519 +2942804566 2942804550 +646254326 3634389109 +1279579716 1415400713 +1424324637 1721110018 +654445766 775560097 +2231421793 3993086353 +945514188 2212680481 +3581704840 4159297811 +2646880066 417803410 3320523205 1535168842 2648073443 +125200917 833560400 +3044049969 3508541743 +3144005243 128219944 2082358194 +603739626 2419801933 +1280599388 2228981703 +3921805097 627355032 +348217528 1684750765 +895723406 3419761945 +1282065788 3621510806 +4191836446 1891256873 +1038448675 2470190876 +3271841038 2891843965 +1343638088 1528229707 +2238393430 3988927286 2238393414 +397867511 2249864308 +36289951 1351900449 +822934594 2037455850 +2447640129 3941980246 +1922096742 3222149761 +3940570718 3940570702 +2773276340 3958766928 +1365401474 2682018229 +750850005 1223421020 +2624924926 377260041 +1184565969 1405085363 3928660232 +1177552948 2979850703 +1869933495 2374852902 2214407213 2008542999 +2359106294 1245008577 +2723303192 2677179085 +3820285651 2474326764 1221850672 3707300100 +3693291388 123152423 +972017700 2509747703 +1155196764 3231331793 3231331783 +2564254848 455069075 +2435179305 2812582296 +4283487209 3577583576 +1150235924 24153721 +1683907162 1519702955 2318822736 1128871477 +2462828705 3083654518 +1618223933 332626196 +495369964 1730055575 +3855804537 2419918921 +2123015877 2162311420 +4201580462 2307856943 +2029196116 1330029694 +4142437376 2954951685 +4255240795 2696815954 +4046856530 2615826174 +717531714 2509768181 +1253624014 1860443225 +2653862515 2951433184 +1385571893 2469717466 222037033 205259411 928916842 +4051108868 1589807352 +2600867055 4187157540 +3524802621 808852277 +1930706227 3890048183 1541166924 +2354046211 3740164327 +905238440 2557443435 +907033041 1691833697 +421360086 1452488294 1963407489 1812408929 +3211209870 2531523474 +3136329881 3787471070 +892868689 407783312 +1676773978 3386402371 +2609340376 1098577277 2745946522 +1917954242 1917954258 +4261780921 2614577704 +1173166042 810590566 +3780476883 2358786362 +2943481163 1041530052 +2249630277 1176987773 +882421979 2807982290 +2146735142 2146735158 +3055746920 555225277 +2816753514 3058684877 +4123262329 673228104 +489992774 1072997431 +465609221 3040808410 +3057010226 2400885210 158367923 +805249633 4090058886 +2103781211 3241997380 +3816336710 1559807265 2526968802 +912618707 1958144044 +2144726271 279818940 +1201765476 1201765492 +3989096394 382108397 +171782308 3191895708 +154316075 2812642076 +2188252541 515658068 +3960083480 3499954735 +2411122599 3821593590 +3253809064 4138599787 +3767420074 3767420090 +1220635783 259905686 +411309343 411309327 +4240756929 2866061248 +3472588543 3572034430 +2743990916 491337800 +2745280633 1338551279 +1570200898 2538065635 +4205872751 316907694 +439772485 2887540001 +67274803 2197579852 +2577743164 3403922216 +2474411539 1074204652 +1901138644 3085024296 +174590216 1774598045 +2564351343 3052804486 1193995706 +3497497811 4282337338 +2331583525 3946047020 +393869260 2464999659 3238073889 +213883760 3431472648 +2392666627 1028976548 +2953834212 219484393 2038102500 +2254517943 153816677 +4261746122 2885766395 +4265347023 2801127963 125848280 +265368416 3741966472 +2994422118 1167116853 +1018286063 254386374 +1945379876 2908021951 +3064948118 239395552 1450256051 +377726058 3954299868 +812998419 1539615482 +4203868683 3695937839 +3441234153 3452018392 +912220201 3240386712 +3030476518 1075117057 4161329190 +395669330 1916681747 +1885473415 3947405203 +1921270546 2054798057 +4161288501 1508938643 +3800352085 3959596234 +2566302197 3243084988 +3595590480 2961161973 +3109302884 1632916635 +2215239274 1166614733 +1299559039 1866989032 +2735214177 112108192 +3429886038 2240656262 +3732345855 4217156028 +432748035 2649097898 +1475879891 4068426816 1319134522 +2303845761 2901166602 +1750173395 190266938 +1235346552 4164414725 +3242234017 3651382624 +2912825274 4193775793 +2008398928 1010920692 +3704006993 3704006977 +1459855452 1454731473 +2604970462 922807718 +2850362389 2292096266 +177668445 146220386 +1952133958 4284705681 1905375031 +30032997 1181336636 +1261488890 2567094351 +3686190778 2596761309 +3261229669 1188409557 +3797840768 3797840784 +660564081 1815177712 +2583751974 2507494103 +2485212311 3346540976 +228271594 2307394643 +1570750473 1803243064 +2283760116 1030998799 +1555193387 399130018 +3689359540 3773109072 +2947131104 2478360536 +2645875546 2200363088 4204851685 +2608349085 1531716660 +1467303233 4003202368 +2344905537 1848573030 +1413834265 676384510 +2031657505 3267836384 +2232259785 932130916 +2104669210 2509341949 +2740920236 460583127 +1171899127 113406365 413761640 +1958476901 1764532125 686707450 +1198955165 1198955149 +3300955780 2946320803 +4281140024 2020542931 +2153084188 579296007 +1240939692 949912376 +1111585808 1560917301 +897992366 4032906223 +2165937122 3636157769 +891593845 891593829 +2996324000 3317116403 +814272769 2760617321 2904314979 2579068878 2750749243 3868776413 3969442137 3450519304 2562291256 2444847924 +851972163 871471466 +1445997018 4201056693 +3872985763 179852956 +2521514368 169141595 +3898406914 2928168078 3428477731 3579226141 +1545134650 892084573 +1395201739 3031359892 +3342697633 2239344903 +1956748169 3256422815 1786386936 +2951112919 3199666790 +4172538698 3960591392 +2452944729 2187419934 +2837201855 4135495080 +1161481085 2383480510 +1840245558 3790554631 +3349431849 1889170072 +417222264 2650113773 +1992389779 1909832090 506182131 +283984672 3313544051 +688029491 3253615962 +3945914278 2586699190 +2843932507 2843932491 +4154245848 4154245832 +1545286516 991477780 +1486316363 1728019576 +825885236 2991683535 +1472654656 3334571512 +4243932244 1023954990 +3431147144 3431147160 +868606864 1912391732 +3581752701 2434479070 +967620703 2104679690 +2923114879 2923114863 +1705800599 2776233657 +3155497938 1298783086 1719557057 3721569652 2342239888 954443326 1281321813 2195719804 +242095687 3095623263 4266463689 +2608467526 2831552813 +966676897 1429897332 +899405960 3965050397 +2965436511 2395399246 +733902201 1439886696 +2512158996 2512158980 +330942055 1953715232 +677845653 52355386 +1480600639 2138315633 +1696059551 107892572 1935879045 +2560688449 2255812950 +1369472373 4104486698 +2921373115 4211202747 +82617659 4220001266 +927294660 3325927583 +3051430699 2087345332 +270281160 332195740 609600971 +1596390888 2992747581 +138242015 2305677450 +93625301 2649837642 +2613950843 3218799780 4102663621 +3250863082 4058665293 +1858981857 2352839610 +3681695677 3907184290 +4228376374 4134599175 +2468091367 2083945142 +100953766 519712577 +2826204913 542588262 +2967676810 3408961726 +2108738948 1632863945 +2855435813 2855435829 +3458280251 3107393010 +1426663367 2758385216 +4041698739 4015108300 2308526368 2308526391 104666317 +3830893412 1902842724 +3731023922 2459765723 +3205653468 2784179025 +3362787807 1735139870 +2217355544 722486421 +1668626647 4275617364 +2032304746 458443995 +129458208 323335405 +409009285 3853354316 3928550588 3194141699 1517071335 +1233271 1199085556 +1485088931 4225071242 +918041624 1006240219 503337644 +3196913439 386020830 +230637770 1846738427 +309386979 3924931319 +178304777 3288343352 +2137034132 419356655 +525471505 2599963830 92313032 1596831686 +1907118824 3657472259 +3791449660 4290662435 +3371222470 419911329 +1674703387 1048584338 +2002065556 1861595375 +173061022 3585885704 +2016720290 3707366933 +3117448428 2430840832 1865721729 +572027191 3816438150 +1041367353 4015516862 2238295817 +1443955377 1669381635 +4071672312 867372691 +1876921719 4035735262 +2741240853 1265790218 +1931222681 3460573896 +1851013680 3734477187 +1971202115 3224923389 949576042 2507437616 949576060 +555292884 3441234740 +685684366 685684382 +4094952503 1921163910 +430625467 585743474 +1683893685 1059854517 50718716 +676558960 3949369429 +543995128 1506046355 +3355926458 2644226525 +3310099213 2675275764 +4154207229 3707671796 +4133505036 1156268064 +1108906866 2125470835 2125470821 +580077752 635140539 +535461038 4230110985 535461054 3961669103 +3847786655 3847786639 +3176979548 1966007505 +1975426969 3486535615 +312889693 312889677 +2219053183 3055941608 +2192523988 2380673967 +2080982203 4254544498 +3377987490 2542234645 +770330783 3788011832 +2624968038 209074842 +3545632826 3551377853 +3067818947 3541642672 +3546837898 3640335510 +948692506 507198205 +1483016789 2081375196 +1332236808 502363863 +3051882560 3315198476 +1235635055 572152081 +3708231089 2738077104 +4284021387 2215798996 +2374229477 2878754682 +1505242441 2247051758 +2359064967 3780333440 +330042078 3587513193 +2780758661 3298126070 +1752794664 1752794680 +3857904778 2272720187 +2741622263 916181958 +2268304642 3143694812 +2334233268 3172805562 1489957669 3281915798 3558451339 1366108134 935291785 834547032 +817610858 280372689 +1995288091 112343205 +2018717635 1172316029 1399294384 +3830017877 3030008540 +3762028428 2322811240 +2199924639 4205501966 2199924623 +1002989 85437458 +3525723395 1838924006 +688029479 3052284534 +1770244193 3255343246 +1835746340 1675379881 +1100954023 4104634870 +2279146552 312583213 +1009690992 762624835 +3236549233 1035129117 +2694936135 3634996329 3133079006 +2376393549 3700286642 +2445220883 2195272186 +2652048751 1191060920 +3242309830 7724983 +1155358634 2977139593 4142188991 +325820962 3027254147 +3176744276 1736975151 +188289103 4191464526 +2910050288 2924214603 +2813288955 1024853407 +2651769533 2133406114 +510167261 401247768 +1488103376 1899900003 +1098551670 4035177815 340542303 4035177793 +1225138626 1225138642 +3102928539 3245186564 +729768980 527827830 +2437669091 2641560906 +4051523680 2287083315 +82192531 3742713989 3540029117 198111070 3809207884 +2421337130 1545930253 +864940289 695362710 +2397698810 4099282818 +1190430025 2237757880 +2038045168 725013699 +279545448 560314517 +2425355981 1360473138 +3239592817 318343169 +1594276358 4053834564 +830826261 167855626 +769089180 3644863779 +1668289042 867223814 +329897856 1952333459 +3492842426 142970140 +290528084 2527987001 2527986991 +1701329286 2671082439 +4067398592 1778664559 2979394370 2559953890 +1488448763 2760511268 +3398147882 3398147898 +4222620430 1143865113 +3496820629 2969245596 +886742860 2150155425 +3334782408 1974675607 +4291401066 4291401082 +3226306719 1074025368 +1612245129 1931128569 +2499218486 3068672273 +427135280 1142132373 +966038247 1238531342 +728839757 728839773 +3919557830 3241380113 +2498541727 2498541711 +38569802 2741965126 +1759253152 2993770995 +3557594259 1657660282 +1891903603 4157320474 +18520414 450850537 +2057227551 654108616 +1701176614 3311909591 +2349257930 1388938789 +4248401707 2461164367 +4088274964 2937880431 +2680254478 1509911371 +860674935 956136518 +1499662370 1079336455 +2900480103 2390430240 +3157977340 3566465448 +155280046 1072584687 +646582699 1448726562 +2573920984 1531949595 +1165071084 1036667265 +4209383616 943314065 397180859 3087195084 1706503902 2381570186 1543319708 4260339879 2785255098 +41352450 4200903946 +815543674 3738856386 +1946698427 1946698411 +373062378 3822342438 +22700120 2034608772 +4166278413 4166278429 +3186932384 2822883827 +3155904981 4092934748 +3641154979 293950532 +3161264583 1723006038 +2967579623 1514249376 +833941044 1943206863 +2753331127 150704162 572637673 +1822605721 429458435 +102947640 3772717357 +2013684357 826143863 +2803924990 371817695 +4086569051 3795722578 +4001884952 4001884936 +4079925429 1285160013 +1506855322 4255997309 +1293801866 4026364973 +1428385000 4005851435 +1970357022 3175744242 2428463928 2979090185 +2734547949 2192428548 +3961552360 2670081085 +2544193492 2369563311 +2649509689 3556816574 +3407877331 414915904 +2569241244 2934348679 +3091844770 1761800107 +2974886075 3720552050 +937240296 3643031357 +986007402 1724303813 +154199672 1937487106 +1349095353 1589116741 +1868067286 881324000 +230136364 3642699607 +87608460 3295281271 +2749530784 2591329376 +1336132668 2597186151 +3472201084 2079286055 +3295201361 1654298413 2180208518 2180208528 +4083905139 92455927 1912342180 +3944694074 1546890845 +1871745323 785386840 +1246419595 2127956162 +807788000 804436242 +4087808211 1599015608 +2615819009 909293677 +2690007266 4195378856 +201847262 2504132607 +854957089 3923186567 +2576771358 3855055423 +3454925132 385971040 2040492705 +1475879880 1134580683 +4165205659 1846136324 +2499687936 2351890949 +2263461458 165529937 +2879480685 1047376338 +2644297750 3258425842 +989328940 5801815 +2032445866 3040384531 +1122126554 892375714 607900971 +3709602493 2413738934 +683620859 2433116840 +474026063 3379342414 +3122809530 3187385053 +3870847268 1482300329 +3207341716 2256583407 +1479437999 2149072248 +1373257137 1481354304 +1132851946 903702107 +1994358265 950360520 4098643403 3568829117 450055912 950360542 1076803695 +3711064156 239507344 +1712239082 4188305477 +2580189809 2330232816 +4095947554 1969847957 1969847939 +210488910 210488926 +210213611 2759385085 +1764708348 2440751537 +3560049501 1741153140 1741153122 +1379153268 1379153252 +2742384107 3593822232 1021878516 3893375637 +2193155090 602252606 1987086455 732568237 3675195461 +1605934915 4070749820 +3063414239 1346676232 +2840157736 4182837212 390510165 +2574013849 512409544 +2717052877 2072380709 2717052893 +2698203180 1487353153 +1289145096 4263615883 +1324527828 4045708084 +2350399235 2368418218 +2129044995 3356972732 +1302695324 3617451143 +3112890456 1177979891 +1862438344 528553706 +2865103878 3686290807 +2407869026 1352775765 +3643532111 2430996856 +2301399098 723979083 +1577123056 3951963587 +4181935571 937880364 +3865814047 3664993502 +345416966 1864747127 +3849328715 3849328731 +2327864181 3090711834 +4099705839 2628798766 +2682091882 652250441 +552112959 368310662 +3139363572 4209880808 +18441721 3019605758 +311390223 291117720 1187866510 +232013976 2909894148 1562488644 +1323005204 930696815 +3911985147 193130546 +1239361180 1239361164 +2193086675 1367316029 +1217986699 1528398347 +1064595128 163958464 +1333737301 2051283676 +3792759996 2628037617 +144137665 1195939520 222655217 +796268008 1588565012 +243297602 371982069 +277474431 2609077495 +2422176987 2986346431 +4133402751 1992567356 +2026560012 861225207 +3323903378 1952738515 +3286515340 3964565111 1820618132 +451797604 2571020137 +551830907 1113153714 +2909550697 1784466776 +3678064949 3678064933 +805301953 1357175232 +1592526391 2603793076 +168769002 168769018 +700710910 3180068041 +3315418285 3281198148 +904168261 733658844 +3177657457 528393357 +2169909761 2169909777 +4217242975 335705217 +238573444 272203972 +2771177229 311030130 +4000730859 1329478644 +2311209076 824227864 +3776428223 212750549 +465798871 2345485414 +291747561 1224274126 +645222613 1605255004 +797057787 3302822194 +4241968760 3248776965 +922173959 3924779795 2386358528 +2400847662 270049551 +3459370555 3546785522 +3449477381 2948833996 +495380475 1985949746 +1040840641 1040840657 +3257617931 4197770229 +2234027504 2396483797 +1511748205 1177887122 +1468687888 3739134773 +2899550071 2284062790 +3632613058 2833675485 +1184861989 1378768684 +4034797829 2609773260 +3682706241 3457417024 +4238516596 2542631903 +326256105 2246315470 +597085913 3748110216 +732008087 1179875238 +760140790 1226288209 +273768965 3038596556 +4190422661 3049554778 +843823245 2818111809 +1972038137 913089993 44978942 +1298809968 3769799794 +2814255803 3142619938 +2148117887 1285857519 1960173762 +2213832427 3035543505 +2950768030 473723298 1136134196 828549959 2147745096 +230359007 1257604577 +2179701235 2028165530 +648516442 648516426 +596290676 1733130905 +2559455462 3290473193 +2219821923 2895981788 +1295149172 4200230553 +451063199 4260688971 4057420104 +3220060704 1141211251 1141211237 +356470227 1168605996 +120935481 2448659902 +1489131561 3807430798 +2038188484 44572575 +1392283729 4103548816 +3577983916 3577983932 +2013163898 2013163882 +1385417108 1946994565 +3464936433 1332733331 +4012604639 1618318110 +2372525563 2561176100 +3261055317 1997719020 +2339677535 3886044318 +30586151 95628406 +2341498739 121669856 +1272501121 3881104384 +1157150019 3599063164 803883815 +57987871 2414369246 +4208646871 409192234 +374429525 1997306570 +93586333 93586317 +399650368 3219050195 +3235578635 3016090514 +3728905317 1204787962 +2366539143 2497459072 +1164827726 648581071 +1387219564 2515675137 +4248687777 1230354784 +418902195 3586982150 +2115720791 3691571942 +2073179273 271102904 +4088475134 2649450185 +601972921 3469211701 +3647934826 3017304525 +3119433901 1608902724 1608902738 +4236386593 879581869 +1513037709 2234428146 +2174044271 1352504251 1828783800 +3113218901 1922830044 +1338407522 4151486549 +2063814027 1130695292 +476832669 586360194 +3957925945 2839457288 +1746466076 4215921415 +1991342543 104782799 +522043089 3722879667 +318626452 1852910079 +2210912442 2494858133 +1052677283 1761868956 +1798191446 264520295 +2533848428 2533848444 +2374174238 14931497 +2878273933 2668812530 +1234026969 2737318046 +3255786672 774826261 +1004122302 3841987017 +3772952565 4286798711 +4121670970 4149103197 +3074042856 1486036541 +1941920328 1104052720 +2568456587 2332919234 +2375183202 2734658260 +2045399971 2045399987 +3898947492 1380971919 +384775999 1502869566 +3310283560 3310283576 +2478289617 2522305485 +4202431627 1013702393 3694864084 3765820277 3694864066 2233343928 +838711844 838711860 +674901706 496478203 +3269607392 2552246072 +2945185084 1667479460 +1166569179 1355186898 +1481935363 2391872902 +1786816242 2592526053 +3238069978 2929576235 +3981437316 416062153 +4039589535 2829554782 +1017239494 952544439 +846376601 59300552 +1352205626 1377814190 +1859418115 936637350 +2658560510 1919474399 +2817140071 3164135734 +4118976158 445848255 +1928779713 2358282909 +2636225921 3706384896 +2262517708 389154359 +411788742 411788758 +1864312805 4130508450 1445269020 194877598 2741895149 +1104538378 1104538394 +3228869204 1268484655 +65624887 2879166371 1599772560 +4191384262 232631713 +77450140 3764881031 +3185853058 3141701714 +3678020376 881147597 +3791201898 1901281491 +1272632814 1804677743 +2809031081 1003509006 +588919337 1799157400 +1432140645 3321561082 +1532041816 1686226405 +311128370 167927198 1669542323 1518812378 1518812365 917954699 151149576 +4233940542 2216209311 +3861462994 619673491 +757322002 757321986 +1663663855 156422702 +4034402352 3171816341 +1409971144 268883171 +4018456152 564874151 +3848117147 2908484868 +140066127 594527116 +98562207 3733441096 +1736320128 1804825989 +1360718269 1784542356 +1028069482 3986653893 +2051103222 1793105489 +3664945720 559871500 +3826119276 1844748296 +2039894319 2851280092 +2767779740 4283493878 +498222018 3119385833 +1185630693 109152035 +3394158036 540240436 +3599256574 2794424249 +2965111263 385282568 +3849663558 3688083477 +2630406405 3575712460 +2259168451 3183376106 +3545444105 3035826990 +2521301821 76439093 3495762178 +626302007 4287905972 +2336090578 74913157 +2605379403 3254170388 +3453961634 3095043605 +383610899 747153751 +3172464032 1287105253 +2568236130 1556209226 +3067839567 1704918683 +1199163900 4184325702 4033327126 2302292657 +3856279445 2776708666 +955599712 508015149 +914555141 114181192 1736412953 +3845563450 251955037 +1994610283 2464221812 +192329542 1373799201 +2224638158 2337119321 +618090588 2023629084 2739799672 2281762967 2073427412 +3991321686 3627711345 +1826457606 1723670881 +2146037790 2068119337 +773087731 1978662775 +1812933860 1812933876 +270025634 3128093885 +2912895214 416350003 +365765057 317465280 +1243400032 4036070971 +63524618 847014044 +2250954135 2240384848 +3145536544 2710418068 +2510658192 598888611 +3816302342 472215137 +2636553416 734580445 +3831866312 441287924 1409340381 +2235264210 2391559827 +4190098842 2467098407 +1240553594 1880943190 +1269551145 1215869080 +2973978793 3052927502 +2470916696 823410829 +839129526 1920235921 +841723521 2344865360 841723537 +2633828200 2099224963 +2727888935 481924470 +2585738009 2213944875 +4265793845 2017193578 +1008773723 273365964 +4070673171 122547952 +2164345220 2164345236 +1007942636 587934996 +2243570195 2534423546 +4019765038 1534391673 +222651591 2872943936 +2600463261 3539066897 +547471961 3081040392 +1666694337 605955030 +1327488484 1932152297 +3323973534 2182337961 +2933209192 2712128445 +180807564 2215316188 +2025173080 1577360027 +2169226269 2806364596 +1631608078 475893354 +2959041786 2687235485 +4045579825 4291528918 158479927 3398147888 +2094549719 1602080870 +3274644511 56940790 +1711272582 401262817 +2683156042 1467684170 221640301 12747629 +3582061776 3951545187 +2308732122 2068575037 +1648300995 1816927228 +713402740 1684652431 +2945276038 3783416545 +1190351954 51232005 +2436853018 2151030517 +1000943784 2471991403 +761478613 1211782748 +2165819359 3971954844 +2701738726 628757553 +837520986 5656912 +4176338417 4197901952 +2248308400 2782975765 +878333174 2522804276 +3873705667 1964572838 +3594343654 3966334502 680306199 +1676848030 1754113226 +728137592 1305560033 +3053412974 4010275641 +103694793 710297888 2947976485 2947976498 +19303489 279890518 +3206697631 2181566558 +1286865963 527011018 +3329678289 3424896886 +1850446046 2129988991 +1581496991 4210379100 +2585200123 2585200107 +1366714205 2794339736 +904329536 446324691 +2626569283 3549986225 +3785677984 3951490340 +1362194922 3134608219 +2306738818 3552067210 4083845795 +2377641348 2626348767 +1621835478 60025585 +1872588328 1567566144 +1881580844 1881580860 +174040402 1353181431 +149845608 2953586819 3718466275 +1200240650 1536694662 +1500417188 1829201449 +2121532954 715496189 +3150478584 2493299323 +4159542639 4159542655 +289797647 1075992974 +4117457314 3419586767 +3628056924 1006903824 +1645725945 4242176917 +3538131764 3970526491 3142554421 1239113700 +4091517364 2633954895 +2183297282 148017437 +2033883170 3737949483 +1255861451 2711798658 +3216421313 2375668416 +3576467819 988793058 +236266924 3611971009 +203624217 875611208 +2865311512 4071957189 +1527318814 1832475199 +755590878 3943761325 +2829749280 2759497317 +3555203215 3959697612 +260310766 2629061218 +1009283589 3098246618 +4057255591 2975199193 +3532884297 2344024287 2575441326 3342933496 +2604579953 3569526256 +2717991374 679227737 +934289090 1816161123 +3452680834 2042010293 +1144889949 1784799810 +2257394195 3549279469 +3898701298 1835692306 2534584219 +1431639120 2570288316 2767124981 +1388998017 3584713216 +2804896092 467368579 +1891636919 621448514 +1119836940 524047329 +2579391460 1232743759 +849629879 3745454883 1873688070 +3291162226 1106085235 +3743209088 3127225235 +2747721282 337410549 +3634819784 3603968203 +3628594196 2370124655 +1559234076 2882907916 +2835291044 1880521113 +109156250 1973063029 +3453938664 4188756500 +1521395517 1521395501 +1783734878 3162675689 +1073499047 3629236857 2445398534 2234603196 3270978647 1649621591 4178555508 762128546 104394367 2419679112 3932264316 4011858836 1135456049 4192191199 2835788232 2817684235 1362184839 +3215296926 3215296910 +2800743070 1773858495 +3158611166 4258189322 +3543560024 3601942427 +2579112683 3942971362 +696029030 3038100865 +690774053 4124793402 +805082766 1416983566 413204889 +3765522793 1259893464 +2538217292 1974420641 +4018077975 808205871 +622457682 3118074387 +112997064 1648619723 +1338348662 3350781402 +801391697 2308173314 +1009027122 3749865125 +781405145 2679498789 2228434518 2830497379 +3060489152 943860123 +3358279407 186690104 +1456016407 3848725379 +982179987 3147794284 +1624142803 1350962676 +3135058424 573942125 +420183257 3280536591 4058489790 4058489769 +54804852 2518162376 +3527991224 250706515 +2739196829 2723749922 +377244739 242929909 +3361895386 1843356362 2302655803 3479649429 2577811206 1115965498 2884291408 2979385547 3067888126 3580560181 1432142751 4117205916 471174681 2677842753 532383343 3101597917 +1118262644 1634436495 +1798408133 2214116108 +1532196776 546450371 +2150384497 4197287936 +4224369966 2385799023 +3398863831 3254657904 +1087441353 3524421496 +991463538 4128894302 +403441359 403441375 +219959446 219959430 +2995707029 834478956 +2747665464 147143739 +2573808109 1838782468 +2054195685 3869878538 +175970372 3337433887 +379858379 1869878914 +159022938 1171684011 +341294320 4129189333 +3988511850 2830891725 +116714913 1408642938 +161767127 79776870 +731292294 606197985 +805368934 4152409239 +1923332821 450567020 +1541150891 660447438 +26560326 3250429841 +3053210813 959237506 +2104500375 243486128 +2343147915 1727837634 +342523200 1671637971 +2478591616 292524933 +3335474631 1990571204 +1316308923 1033890660 +455536256 1045001093 +1285614656 2081910299 +4136493497 4197827465 +2246335807 92195390 +1890518128 3491160328 3548642371 1304836555 +277694058 2278189009 503431808 1599363702 +3844685916 776722539 +3591339071 962631464 24320790 +677195065 626913936 369807797 4245334629 +1355092425 3719009745 3383457375 1052908795 3323779079 2894449868 +3961538738 910598221 +3829354893 3702350052 +4150060282 2636974530 +2531061536 2647420787 +930671197 117602408 +2874956916 987311816 1952520303 3638215444 912624271 987311839 +4018389912 2758600785 +2228979513 2228979497 +1586360485 2121388986 +3708248395 335194744 +2053971317 784686890 +1493149598 3094666665 +2745670915 2749115306 +4102708290 936328181 +3412532687 2182993946 +1650815767 528994351 4239666489 +3029206903 2996158534 +3643637852 2746584931 +1171144562 1766365101 +980079877 4214052570 +2029084334 301468655 +2921937413 803624410 803624396 +3984503347 292718156 +1476283115 1884286973 +3746403315 2048911258 +1179039997 2656384596 +3012694410 955358267 +102018152 4203440043 +3606505397 1440822441 3666208280 +3220000142 2204533519 +1374704227 3790790246 +420114067 4268495212 +2585754026 1664607762 +2809192737 2809192753 +4081460818 1231966981 +2656147032 2456792219 +3511087749 4155492186 +922453672 905247357 +3382839934 3893789791 +762904984 763200091 +785126601 1982747960 +1513001598 3799699548 +21494098 1447918597 +2354180682 1254998494 +3875818149 1354858938 +3751636384 1578122875 +2719745173 3340449418 +1536364654 2525158703 +3906674885 1442092570 +499894785 3905879936 +2040131843 1308589142 +1690014501 3091768108 +3260031681 2770777536 +1257430566 3771154791 +1727191965 4202619870 +2883940802 1546785909 +323267758 52155897 +490148103 78630400 +1652316868 1925881263 +1325669144 684233907 +2985503919 3503249272 +3185455372 4003059571 +648701195 3679025841 +1131357198 877133330 +1025520187 1957630692 +2943174224 2299532163 +34177369 2570878014 +3303475734 229957799 +2127185468 3563884647 +3527078103 3385401958 +3694906429 4012016660 +235727630 743835417 +1733285711 4054839630 +4027921531 1818336685 +1380642354 3148054989 +3035506899 2783593530 +3718592249 132658306 +3069228834 3743480390 526505965 2263481398 +272955479 4086493414 +3707231926 294439136 +3482419026 336293395 +1701299071 559464702 +2330256392 2330256408 +2795563991 642990950 +2353547841 2353547857 +2396023576 3563266950 +3388313130 395234317 +3367441807 3367441823 +560047485 163021762 +1435178031 2064098682 +2461708319 451100894 +2744896540 2856472593 +147788746 4109078986 +1729261031 688063136 +2022733362 2401273151 +3348577843 3348577827 +2737259688 2127631467 +2318761828 2318761844 +4215240136 4215240152 1290168779 +3531117188 3620644319 2202991480 +3448438088 776349568 +3412733806 2787682863 3238258670 +262932144 3528018376 +65961457 163088000 +2900281695 929691563 3205880936 +2198865447 1707182869 +220424259 146519600 +3592444826 3542153137 +1038902326 2971779345 +1252993380 2869468516 1129946447 +3860562871 2860266548 +4291338974 3315900649 +490790433 773696992 +1642136452 182969540 +1622076224 1935431123 1935431109 +2538275258 1611286143 1269154220 +345077401 1684049186 +1519456457 1532849272 +3311215270 3311215286 +1874314973 3142454772 +1570729275 2633561074 +763029356 75124481 +3008454809 3466300776 +4231264052 1908625307 +3510998107 3414723410 +702754111 799029822 +43014716 1907201520 3942418116 2707469420 1312392945 1907201511 2690691798 1161694321 +1941819056 2948181533 +1582507124 4041368207 +1733835696 1608906243 +3820272341 1250041180 +2246010694 2965218865 +1293495730 279113523 +3752430057 14948814 890543950 324601791 +3323941420 1499047745 +1255862486 2896765159 +2278283128 2278283112 +510734935 1838675657 +4092441549 192775103 +2701887296 3307596229 +3051398031 2408614513 +1045375231 362645886 +3916408897 4001169766 +3569590985 3103343224 +1794882275 3540262471 +2704074485 2825221261 +3667492037 3835652620 +2220561626 2115503242 872377507 +2157182033 3119920016 +49348717 746235776 +396598181 419549841 2526757513 1519481034 3683517612 +1421745005 3561303186 +3063657261 2753236955 +3460179103 2798868645 +3445998597 1546884058 +2884658079 1901107786 +3307243971 1826552615 +3403048853 3833925532 3833925514 +1912020527 3902602390 +308106585 2173546652 1106074398 +1358148844 3339036673 +2575078365 2082260212 +3105190663 229342227 +3666485407 2792446558 +3338258573 3160672171 +2259502519 2159592995 3116678928 +2081381529 27185487 +2294373990 605576102 106647274 2926025367 +1069730753 547799262 +2131366440 618304765 +587420616 1322956003 +52278402 2748122638 +406099320 2462534628 +1703961485 1703961501 +4246882672 1810863775 +1261713226 576187557 2905803117 +1374119676 301289648 +3065923215 1015616280 +2801078333 281579531 +1601991532 3169432343 +1817812206 1453709701 +52858008 1476403749 +644688184 3050824507 +3746290295 522671880 4217956697 686695486 +3830335733 1547491754 3721045645 +3720665456 2363640643 +3041384632 3482483793 +2130719454 3411022697 +3611523956 2674582984 1396397977 +1401900420 2902247824 +4064722754 2808026357 +4046712473 1144245096 +1946441188 2261988863 +1684366598 295569505 +263214971 1828357160 +3104850027 1711122692 +1552352542 1795506302 +3593668233 2451373294 +1104297698 938965501 +2232332600 3264507780 +2883660413 276161236 +3969333787 2366666898 +2833468751 3954203096 752005966 +3578118249 2123451519 634250575 634250584 672527716 +2312248689 2904027670 +1632621463 12695299 +1216544665 3820733566 +972580658 1946842021 +2169449951 1856321032 +1598943984 3349089372 4155862997 +2693209748 1219830511 +1335685698 542559325 +41109260 3883456481 +1902586818 991366900 3467600349 +1517637960 3203436383 +2100940969 3406002702 +2853668845 1191856101 +4127493323 338273154 +28955046 1568999489 +2911921089 2911921105 +212328831 1341286667 +899700716 612535809 +2576879835 2774698194 +1325188936 2683156043 +4033946570 3456758625 +959244924 1886369968 +3865211056 1559717123 +511426323 265145068 +4226718895 1838802641 +2799156980 1256201876 4066743647 +336127524 2919385791 +3054857814 4189892967 +1035346240 1706448837 +3354857400 2179841723 +4191017105 3368350262 +703971841 21172528 +1214124191 952012618 +4050052458 1488510684 +1494216784 3853498556 +2103459743 4253296478 +1778172770 2410626658 +4264626105 675043720 +672807695 1705979895 1798200286 3024318726 3928630233 1144146183 +469110385 1968749552 +842754321 842754305 +284533353 464431960 +3237710194 42970907 +3331439880 2674693021 +806702875 3431696274 +1137342194 943721148 +3930739848 3930739864 +1270338576 1113773347 +2874467929 262577672 +752980738 2837081123 +4285637559 3605313798 +2352660743 1485427801 +1219603727 1383262078 +2212568010 2212568026 +3858890170 3475139531 3475139549 3288929302 +3361895375 1339873018 3677223129 3861344580 4137866664 2596352640 349615468 1033048316 4130509500 2935187883 +3169687431 4043671936 +133156884 3327362759 +1847924674 3375378882 +1976240960 407574887 +1851729200 1851729184 +4112713629 2503534997 2200239156 +3643123500 38152791 +2886887491 603595114 +1793950931 870414559 3067716720 50311661 1739546632 4176118737 3303213049 +1565852304 2094205091 +4269313893 3952274077 4241079290 +838275989 2111177274 +3903686347 338375060 +3454378920 3363873131 +525931498 802859603 +18200210 1194223571 +967469295 1260358971 +174530800 1348000213 +3385204878 820330393 +2308524020 2308524004 +467825168 4118384419 +1122928203 1365956472 +2357981642 2026807056 +137456512 3313508187 +1987147249 1537228416 +1945748095 1945748079 +2609983748 3918539081 +1034269996 937178199 +2562620045 960353672 1453424857 +3000764790 3106843466 +3743339092 1233666412 +1969937231 3901366193 +4224932436 3250008623 3250008633 +3276913730 3148569589 +1948615357 2483867540 +2629917811 860072707 +3110671551 2674632894 +2613945606 3137435342 +95990251 3972011234 +3284355972 2300501103 +2412081920 1406404869 +133156886 1941101793 +1114551661 21469828 +3192168723 3389984931 +655773754 3256896349 +3595807687 2763801284 +111151157 3841365964 +3514799105 3436576150 +463050454 1221096167 +165516015 1993231918 +192242435 2884515867 +1510402582 3470950567 +3851569536 3292697267 1313629778 3535896936 2013736283 2013736268 3851569552 +879197132 1256710711 +2874258968 3382814683 +1092184403 4148413888 +4205127129 1794806920 +339036981 521999052 +3511016010 3136725627 +536915614 1097601678 +3323730909 3141524706 +637735553 1473650944 +3630859917 803971452 1018286052 +3490438321 1608560055 +3597571174 4128480385 +973519151 1001096165 +3587440596 4058810702 +1416958513 625713968 +3011400773 3028511338 +2979408168 3076704765 +1587848955 4164082980 +2732146616 335498916 +4151407747 1703109740 +2648792910 3620276185 2155301582 3620276175 +157347179 781565794 +438132549 2902257002 +2287305118 1016794025 +322199757 141845170 +1872145073 814113089 +4239597843 3774681324 +2481340486 427241015 +3454188226 3723231075 +2965825434 3895722490 +4171687243 3116037396 1968164463 +1970757059 2917702140 +1232815 3432837230 +430625454 367634425 +1776475845 1965338636 +2597907595 1105580917 +1144676991 1144676975 +1101025469 207559060 +1542004619 989636546 +1689689401 3649995314 +4290999211 1269765666 +1563327002 3391764203 +361615585 3477066294 +3882531465 830519756 3719440031 +1066413841 2947771553 553260998 +1549242777 2004854376 +2900195373 259373806 +4188027424 389775475 +4084223010 1539824021 +2590946555 3432899579 +1015526925 3582317925 +2356968206 13577358 +4162157146 3822033853 +3278929019 622065074 +3565042772 2560290811 +2179830181 2979515491 +1433773418 568940499 +1738308431 1784028504 +1320425872 1971600803 +1040274412 2283216008 +3313496139 862406146 +3303811891 1020922551 851968332 +1678068758 1838856417 2320942769 2124575033 362483754 3432678130 +1931069737 640363141 +3541904109 1045243251 4557742 +997540880 2845451555 +929059412 2158074415 +1762776261 739373594 +4010907145 3237577937 +3216971742 3084030591 +2499818591 3998380446 +1715567436 1159010487 +3146514082 2852691882 +3591297758 3899795383 710932015 3733459625 2282780282 3362756789 1963872013 497834544 1282845364 3364326228 1694220679 1754334285 582375926 2679708811 2687229725 24900824 2043902748 2667565262 604247138 400853018 1909415605 2947425615 682263336 51171842 930230052 1382607832 169806198 2758711337 4248051031 2555689525 2534760544 1889523210 3642448633 188425144 2703918523 2765087018 2727818252 2129461611 2228893 3483411203 1950631028 105064934 325170511 1344914280 3093024395 564681869 957035999 940796249 3883388 1014537989 2751024343 +14870385 540989998 3593623279 +4161050445 3157929522 +2344562213 1118930762 +767302482 1360986643 +1976104152 1129934875 +87498405 578826774 +219446284 3007275015 219446300 +2776260689 3500515206 +4191174840 4208320955 +3653353210 3321865117 +4011826384 1053023093 +2280974773 2545011369 +2706044087 2684304390 +1169361449 379107737 3789094542 +2942270565 2018562796 +2507346978 1713942915 +761616295 495516662 +2738222462 2862141352 1276888201 +728623086 1275337657 +2573645263 1269839054 +1487834588 1992905031 +1937287455 3857857502 +1278931524 1154179337 +378493519 378493535 +3644541458 173382234 +3466766334 1208906975 +4263692073 968852888 +385150749 1083468450 +2448527615 3192340862 +3483877486 1393814831 +2555813705 425508846 +4256645796 4153393956 +673128170 1079192915 +1242197309 1037033086 2453757328 +650420583 3708924025 +541216234 2801010738 +3922202546 3086005555 3270328154 +2126120408 1456943885 +1291230305 4107200071 +2676769501 114115042 114115060 +3691021546 1053899867 +3592611356 1731310801 +113592053 2643375018 +1404759914 26782582 +2287550588 545293095 +352776184 2737087621 +813828308 817096121 1353409332 817096111 1681039935 +1765132741 1689035020 +1936540482 4144029923 3110208842 +1826217920 452672339 +1813075012 1665640201 +970903830 3610527201 +3161792007 3161792023 +365119531 1835703202 +1732319337 4101598542 +3372588842 2648280859 +71989604 71989620 +797097673 572395320 +1122043718 2386457377 +428409455 2712589486 +332258707 3408786432 +2076242788 884942441 +2411386942 2166516127 +3650970686 3502558601 3502558623 +1914982705 3760967728 +3962682358 3360351313 +2537368572 3959758247 +1054362462 1784528233 +956136518 2226058815 3995253924 +2475018472 1248722708 +1495616570 2283004674 +3991756203 933917748 +173914362 1267347851 +2068677076 887280814 165549010 4216406847 +1765698460 3860493904 +226763855 2516920408 +3403197199 1613264674 2935476556 1630042296 76349573 2935476571 +1467212264 2473369643 +2795727860 1195569423 +1849265551 328849432 +2721805165 3499537540 +3337619578 577868550 +2159333788 3192278096 +2797047058 2230522707 +783588139 2974827700 +2900129556 856650863 +4043562552 2702627373 +3674350524 2153660657 +2991967690 2991967706 +464378962 3836859667 +3500909509 1058076681 +4157486607 2209773573 +3277949369 521509045 +1767483156 2392015027 +2216763090 3525543045 +2575814910 222940169 +2413084957 2413084941 +543475806 1554476031 +1104816324 1852714112 +2281250680 1555814144 +3843527402 84117168 502630325 +1853861162 486381851 486381837 3191342482 1227269148 +2162373634 996420408 +3539759503 2993079310 +1507900143 4233223636 +2949655152 884133461 +2592764346 32573405 +3486482090 3959794278 +636358087 2092937280 +4031551676 76836849 +1468682888 2904601012 1468682904 +3093907222 1673193383 +204052205 309892868 +3706838127 1069417144 +262185700 2111859967 +405893023 3033708382 +3182448224 3213637787 3553253976 +60236864 3874361541 +3982530237 1812810626 +52627812 4204477796 +375840342 3151115553 +2829932545 3930635815 +3417558879 185561758 +4030980572 1703825078 +1371962764 1199022967 +1438023170 3982876073 2655262892 3027537550 1693097482 1693097501 256253337 4031274275 1902414478 +3417241355 2762240380 +3389612093 1237483540 +1075595620 777764175 +1041354886 2210035139 +1315108566 1003131623 +1635820311 2491464998 +2631745358 1045080025 +2917257741 2094223717 +3251497356 2737219447 +4094199865 4094199849 +2139884032 2501587512 +566489953 2289574304 +3021376105 3900433240 +2001244338 404503342 +2331892234 3375794944 +2239443984 1932984036 +3182410101 1465830157 +912664476 3141078323 +1490680 860261267 +802303649 3906955104 +3646705633 223461174 +4100308892 1479320199 +844051584 2997855621 +3976559946 3297352790 +2612706879 1710849320 1710849321 +4243245391 2862453659 142777669 +2876203734 1577647668 3758362081 +2606756111 2802350737 +3964962606 510879161 +3245642728 1921308203 +761460183 3204517102 +3220310392 3220310376 +593804449 1486156128 +4096389431 2500245894 +3819350765 1983474076 +2129449489 408962977 3754864838 +2339323737 2262839240 +3692845486 782314745 +3819317400 3568071724 1957633573 +3217683493 267081274 +3639535629 2376947570 +3972263762 2215524333 +3958774988 3958775004 +1150518538 4265242299 +1574031455 273352094 +1445542236 4276440007 +2179701216 1709390771 +745049048 3230934299 +2808904806 2157160881 +847293227 2878174388 +2347832868 1887820479 +2260517022 3106093225 +1287423031 1791401444 +3233187374 2371172985 +4061709377 1576858176 +3691113958 1024033025 +30295281 3367405414 +361006899 312530266 +281976518 49644295 +2817251155 2873358266 +2073947189 2814450650 +645347676 3920579527 +2402118707 2541835354 +1518604010 3927548801 +1966167700 279661297 +270599069 2843559298 +805597928 2130764605 +3586444885 3586444869 +4063394099 2020920140 +1499662374 2496428903 +372504422 4144176294 +1727434477 35096914 +2181566531 4122057084 4122057066 +1497270650 1862733674 4151470877 +1483159559 717599065 +3487453029 3419318922 +1964031022 2002271353 +2828350156 429446812 +2281516513 1448024499 +628366858 4291512763 +2208455679 4025154788 +3317475008 133857363 +1074365890 1074365906 +3180171031 3094257282 +761875959 474397527 +737068253 561645780 +3389687540 43151897 +134757670 876389695 1918090814 +369773617 3811963184 +815767824 2605354019 +1298081828 4209249260 +3883739524 3639371152 +437876566 2398942753 +226009415 2078663382 +2952471093 2952471077 +3470389523 3021373690 +2457866808 313866588 +3605447545 2646596446 +257464665 3827122517 +3174067631 3607437777 +3675054532 3563584687 +681439455 1609900257 +4161050446 3174707161 3174707151 +2357632697 335746613 +925574524 1424753201 +3361234981 2283756076 +3094226429 4232193342 +2265482844 4000023239 +4111196753 1820804019 4183585270 4183585248 143733655 4183585249 313869702 +1104583615 3327378309 1851639413 +3874300592 2431679944 +2180940656 3666035544 +248967399 369458335 +1785822970 3590599637 +440404230 1787574906 +928846697 301553459 +3905715359 417869384 +1625939620 875134015 +353629518 2087397839 +1285392522 921029514 +2629081932 4233132215 +4244938543 2101778168 +480356360 444302493 +2556037679 1290858677 2566245506 137293013 2222457452 3853991653 2985685986 2583023128 2222457467 +2313585613 3673536818 +3730716445 2060018577 +4062229006 1633663897 +989628809 3121934636 +2150355105 1710845280 2590897415 +300578950 3122379489 +104828504 194468324 +2591950910 2870665834 +3614157873 1285226176 +3332242280 313705643 +1047450820 209252485 +3743076819 3743076803 +102645276 2369309905 +3522568284 3799314641 1326913799 +876866317 1407911282 +1633387920 1535429212 1442140137 1458917775 +1897464649 1398811640 +1998976320 2273977305 +1175422155 2615512450 2994437483 +3306496494 1373433588 2423067439 939956659 1065048627 4042446490 68789158 2582022074 2718501932 3582017515 827294370 3278302363 1303567322 661707239 4206807744 1399768470 341725803 2260768238 3038862337 2723843724 3229416250 1803169417 311088546 1306614263 3538051848 1256310939 +3604805919 4204327464 +1003893599 2436030110 +2609737215 3949991338 +4196224557 3533732484 379641311 +380998096 1293708328 +1315873894 3727477911 +1045579615 2336618593 +4135200593 1397482630 +76098351 1391393518 +986244730 71488029 +335873370 335873354 +447292192 2505879532 406997861 +1570787618 2237642883 1570787634 +977596429 466270779 +718196929 613588928 +2358466434 1390184585 3720755914 3910044666 4197117880 +2877092501 2326913180 +3588839491 22409589 2404064060 +813783640 3475851116 +2241019534 2337299471 +4106372701 2866070626 +1867236217 2906961768 +1349753137 3606718502 +949498350 2990048410 2064903790 1916972332 2064903801 93755823 183934039 1933749938 +1878840292 3900017625 +1811872615 254947744 +3436059351 391948946 +3007943347 3621580115 +770536193 770536209 +3089048924 889704401 +2882977095 3389781718 +2943676578 3608596245 +937158134 3844801105 +2201378006 338770026 +2176302721 1549121003 3040929024 +2867688855 4037175053 2711436279 2865765542 +2415296127 2415296111 +1679751902 3120474843 +1239983283 205211084 +1514773820 3932983780 1217930180 +884605968 884605952 +1783004857 100236584 +3765205330 3723679801 +1089611333 2400750698 +3480009066 264801234 +3846965361 1739672048 +3185150770 823261704 661437414 +4000702798 2979114457 +642415252 488557032 +793413830 945115041 +2763812432 2762057717 +155982792 1791998923 +1793698804 1104785679 +903093854 451661289 +1032620671 1665009150 +774033369 1543941822 3529987343 +2292369284 2621445343 +522227096 4161047332 2554259021 +1010321137 3180834150 +3746812929 3183677991 +2736153570 343198981 +96154089 2237824076 +3347467422 2177742344 +1637160052 1992985373 +1553806346 4059783070 +2485396161 2485396177 +536960050 2485396133 +3263342072 4073635595 +4210496113 2617405206 +1303412988 1641347751 +1656090590 1114151529 +2900372694 2900372678 +3909090883 2749636349 +3737695364 972303305 +3575393737 183670318 +4156066963 4156066947 +582060652 4037097879 +2013632685 3278376814 +3684684264 2761388075 +1417337177 1417337161 +1046393794 4044683875 +2592241881 342113694 3083665320 +1085303719 1140312199 +755286193 2407224998 +788647440 265773859 +898286962 2347191053 +404366271 2955298238 +4135741612 3142239959 +1017413756 4076225319 +2833047143 2701495165 1366453460 +1372311892 400197433 +2108434765 4019204961 +936360970 701975846 +2113515901 3440535499 +843311100 484848039 +3207569054 3529204415 +486814165 486814149 +169655043 2227809475 +2016841868 2016841884 +2685054980 2685054996 +2883987933 2018764514 +3913631015 1774250425 +3262290090 3295040411 +602061751 2686730526 619538422 602061735 +2002473185 3317715510 +1356437365 3146345770 +1439339936 1724986549 1171191938 +2474192719 1026316699 +3276947705 1937524734 3276947689 +1910382951 3051594323 +4233393482 2197070715 +1385127323 2461031172 +4203735582 4203735566 +1427176143 3099251662 +227539922 1625770418 +448664635 1038648731 +1261563744 2891427412 +3747634499 3887255669 +1781834649 3386739166 +739913324 3644265495 +1424036272 1424036256 +2085854041 643174459 +2448148676 2049772681 +2111166277 1554112908 +2239005801 2137813336 +1410300681 1566486318 +3324496058 1718481813 +1985994638 368600334 +677102228 477318895 +4257315869 2492883380 +1410838689 38473078 +219534714 1734528143 +1158733837 130813810 +568167642 3954353314 700758827 +831025802 972733280 +2251161851 1011616191 +1069337729 3991997277 +2211906060 4115277974 +3423562869 3423562853 +39782858 2241620205 +1820819825 4158170156 2952819089 3961914414 1246807279 +3383269480 3697798077 +1416329538 2472684362 657449699 +74624544 2604970733 1512418052 +733700401 3644642521 +3651796340 2037004255 +3736343508 1769682607 +3841759559 3232058070 +3223351151 3223351167 +2395520880 1601301707 +1392154914 2770329838 +2835453732 2532712728 830533033 +2552357023 3777945419 475306568 +620522480 462919770 +1543980934 664734202 2937993671 +429773615 2188604145 +182223083 69136884 +3613559669 4052978636 1281177331 +3329814753 3329814769 1428687633 +3934561454 3704569327 +2924632734 161785535 +2174146616 947281965 +2102725287 4091528438 +2718020901 2718020917 +774341585 2033484304 +758950548 3243538920 3397420793 +859843827 2077868002 +1055025781 1055025765 +3084394536 3084394552 +1442459342 1778498584 2163916248 1024277293 +1313624257 52633558 +3857512068 2013794783 +3276343728 469385219 +460302756 3569880383 +3776293031 3331313031 +4222633104 3330010805 +2164836880 819336995 +3970776199 464930966 +4126996461 708463122 +2681103648 2984849779 +2222711263 1845793288 +185139741 518891541 +1411129708 3561528577 +3597002828 3463229345 2518186592 +1580776981 846376745 +3794437436 4251403249 +755139961 1408769384 +964907690 418432614 177596165 +1859720055 4139361350 +3104788118 3910710823 3910710833 417775478 +2545176930 853286211 +3921335505 3924465101 +71328126 3906605214 794392927 +1112903585 200084398 183306776 287444291 1000005757 +1918971580 2090450544 +279224972 834777392 128837495 +754963655 2397246418 +2241682908 754864784 851099985 +461683539 2767381420 +2171299177 1628128574 +450397689 932815304 1322888651 4238066089 2596016239 1372088692 1004201704 932815326 +410623099 2087309631 40981924 +2711294725 3340948355 +2066519731 2273387040 +988628342 1381482839 +2253114438 2941424161 +553262834 3686708965 +5929889 4020326499 +153573 3349358346 +2942908658 346334451 +385575454 1271401769 +2365639260 1870320391 +1176050055 3766693760 +970059252 4185495321 +923367342 3729197625 1374119663 1555521010 1374119673 +2027890413 1659756882 +3047670772 3944315161 +107290973 1848870242 +2219247329 483382304 +3591297751 1351433021 583811301 1918821991 1149147165 4240826894 +3795070055 2132928032 +4147334576 4147334560 +2264005022 216789951 +1173882721 2255723936 +18748962 3831289731 +359945771 4045645236 +3358570121 2887539128 +447761865 1693690684 +763126215 1640885334 +157818701 736714612 574193829 157818717 +670737979 445879714 +2586366122 2290259219 +1170909517 1170909533 +3460369504 275151667 +1379503469 3717833348 +2785731571 1445255052 671043959 +2118909833 1520649390 +1793795793 2631259443 +1690225783 1500001680 +2980824762 3182863112 +1489828636 1820153277 +882508052 3798971001 +4225648808 768309264 3273385155 653025405 +3813549469 4008811396 +2089875909 2919607747 +2754111562 2754111578 +1109172866 3797294927 1618020391 2159799641 1819537749 3973064436 +3927239877 1139849740 +3925856413 4204521586 +3655908000 2841496037 +231661667 2995729668 +165707586 3510477149 +3159177816 3314735245 +1146311598 1026341625 +1593516336 3042262659 +188345813 2932083910 2167498314 +3220253825 2846428928 2846428950 +354754015 678299137 +4228190909 2029813652 +1257028067 3584598090 +3857940387 2706501002 +1630013858 239544585 +3410384553 2830789646 +986394501 3878202627 +2418971473 1246881936 +4032436363 679589749 +4204817520 4203394133 +3936346170 3319961365 44691350 +1724903194 3340296417 4201607394 1182623122 2758080460 2607081872 802925987 2976336603 +2628478119 2123486884 +3095879278 1147283645 +338289660 3119637927 +2544972068 2544972084 +2933780034 2304643555 +411714330 2007534273 +4040021603 3171991322 +1229202437 2090958639 +3419225949 823836514 +790298483 2592088602 3233941517 +3599952259 1279629610 +2067080054 2879246145 +469628547 2479558709 +3471399561 1113163182 +1387556911 3983738411 +2012819650 2672279907 +762414475 1833568430 3112937977 +152427982 460073817 +2464888058 1111778717 1111778699 +3600166388 1698467360 +903103320 3554119847 +2661313131 212477006 +2789582776 1395286421 +432764988 3612231271 +3229264531 2484766074 +1766535860 1969279311 +3632482930 1219375461 +3717425254 890067073 +2541599295 3119264062 +3991296634 4221595165 +2095432155 3310676955 +2788918416 2593573480 1999965928 +2709715102 326061225 +948431645 3488914149 +2001954545 3377139056 +1683584892 1698390981 +4290722800 1053449580 +2457244786 2806329869 +3107818732 2279921537 +3301173528 3630690509 +1222886954 3901813787 +3627174453 2351616380 +635730279 4016961657 264301530 2757679460 +1870205684 3331918175 +2267432785 306332816 +892269569 3119127936 +764660833 127287695 +2474968203 2546935307 +3969973988 2588487375 +2974525369 3541633086 +4292604388 2872953343 +3994122030 4085161337 +587975262 190228354 +2681675093 3806297009 +3853296168 3066250475 +3402632770 1202019134 +639670424 2639279963 +2731657383 4148092662 +2463176781 2991303072 +4099956841 3443563565 3455651803 269739537 437515717 996277504 +2400717183 3252089598 +4204463809 3280757567 +135869118 702187327 +4096559570 874313093 +3737241307 2248936146 +2970802251 2553621634 +3876615918 2901096633 +2058394077 16922356 +3177616453 3277188758 754259358 1570371350 2739025005 1836804236 1570371328 1667228842 435484557 +2828810592 1512790871 3454947884 +1635958930 1635958914 +1782260248 2511367527 +3072670455 4149009763 1184617168 +2551969192 2551969208 +3186806235 3211186591 3761901508 +3141151923 1067937188 +2518051403 2420724738 +2145120855 2654895846 +2246632526 1257166799 3304962766 +819243544 4140286925 +1973474879 3868188156 +3739296795 4151039634 +4230599448 232214212 +4267503605 3211044145 +2644759039 1541494925 +4053125391 1063163212 +3840564265 2247038104 +1703184197 257707809 +2878874185 4283358904 +2163623297 3988504448 +3177466778 3202548587 +1295756667 157034949 +2341090352 3666880405 +3972548674 2627047246 +2387790662 1381367585 +682982299 2964428050 +1779743201 766668477 +4209383623 120353037 962157896 1076247539 1635721402 225093612 49212001 3600878355 1439894172 3636696377 1173452776 1120252572 88587971 1917566243 2822909051 763128571 4016849343 +3600486530 1478163637 +3447373588 2352663663 +1173304638 1435553951 +4196000545 3619720438 +2638045670 1839275265 +4165389926 1031203457 +3349142876 2628351953 +3851340308 1942494575 +3041149203 1836216556 2642092525 +2645102474 3553828595 +2805757231 2102119058 +2136558241 1198676678 +277117148 2124834183 +1818829166 2732996810 +3791130031 410305893 +553132539 4261282057 +341506250 3577062907 +3497706433 4064422080 +69136775 1473863315 +2314805909 3358683274 +3131942725 2409196149 +3282030994 539067775 +1179883136 1941643699 +362255912 3618693440 +1135182240 601296627 +2763432971 1773479892 +93841240 2470304499 +829290566 829290582 +3529410170 2764943874 +2555949560 3416271213 +1764781085 1503404564 +4165225194 2928294226 4165225210 +2717407473 1143036310 +1602681355 446419256 +222268394 222268410 +417682684 665436961 1746564934 2587403669 +1365917322 4235552242 3024122683 +1761588026 4035404460 +1725359211 2363429397 +3135109027 1056794375 +1702532055 3296345418 2532752240 +4017277497 716462014 +236270385 2423872960 +1954186807 2481014928 +3531677448 1389335075 +4023844766 762602921 +1238901962 3921828364 +1914280984 3390338919 +1780800160 1501573400 +799059519 3446633963 955403560 +2318813521 2318813505 +2502130773 1392336070 2140970483 +3428532854 698982353 +2638990199 449764441 +815411714 2226960675 +3947727472 3675319893 +115878058 2306343821 +2357954403 2728796362 +2486659069 1345893204 +1093856687 1378626168 +3061488361 738319576 +706362923 2879882243 3259892326 3527543891 2194876035 +3252974281 60863096 +497295782 2611073282 +4274214243 1272335226 +1586017246 2553515644 +417854831 1774805435 +1356323818 2016064069 +1239939909 2637204890 +1737542938 606074166 4015423202 +3525106605 3525106621 +103697018 887045643 1181657941 +1497191132 1468624977 +3919290730 4153783237 +4102196038 1923442218 +2672364308 3859485417 +85805427 2149228556 +3691486692 3691486708 +3663125680 1723689219 +4049298279 1507687222 +3501263292 1118982887 +3356851293 1456653922 +2194049801 3884769080 +3551573851 1574744350 +3711018077 2451947124 +220720069 2060986124 +1044517025 696547967 +551830908 1129931303 +2763182542 327173967 +3054768806 225102321 +2491871891 1668275564 +510924376 510924360 +3397242454 2710908027 +717299753 3957047182 +2232192833 3016065878 +803355421 2116226722 858786069 +2957235936 2465851835 +2511768011 2652849902 +121833951 1300793886 +2559349643 2087368747 4166590420 +583997110 3727117172 +572240930 4220918145 +4122808065 4275602455 +185296588 155344096 126334351 2457363828 +284041331 433919258 +3934285966 3934285982 +1803059674 1803059658 +2733093348 1455229439 +3145711486 4104358826 +2810740265 3631041945 3839793806 +3273674826 1977508987 +1616457887 1742999073 +1743563642 328331531 328331549 +3356620291 2766337085 4148577980 +2045615218 160917300 2008192548 3026186347 1331271827 2359565767 701762117 904371508 3484718515 3831614662 1817188905 2993572620 898313517 3509807012 +3586536296 4009946301 +1993876828 1916981201 +1990936967 1525896063 +447509942 423694802 +1090276681 3316572981 3347558559 2612508598 2161173342 3640891835 3146887780 2445297380 1145647990 +3092667888 621866844 +1041796384 3768985971 +3733839578 4119428404 2252415645 +603224210 735694277 +3934778455 2445996149 +2480936337 1522660166 +4012776851 412651130 +1299976880 858493469 +3374323857 2147560426 +1521000896 2004263237 +2478012118 3521757601 1501827815 +279108168 2019401565 +3115728167 2162312310 +1542210800 2767226325 +48033519 1892426296 +775803950 4183098489 +440516903 2088964214 +1059271177 2294236972 +2365098416 2079219979 +1094905531 1286540648 +1141943307 826201410 +1368872962 1933544245 +2661339795 2661339779 +1264041155 1579034364 +2588189136 2852829795 +19442354 2231678515 +3605286971 2221559026 +3585621372 3684426417 +2095284778 3290818573 +1588894831 2625572344 +3900529659 4166503460 +4292049971 3974923340 3974923354 +1872025569 39093010 +575870691 2411894224 +1756176267 1411396270 +1989117018 1738811445 +1549686451 3172730890 +3771356702 3309545023 4236611881 +3261896084 4246639685 +3199225850 697165469 +306921425 2641720848 +987915314 1006561243 +671966723 269981372 +3155111670 3267650386 +3063616084 951029528 +1515963657 1198992696 +3173699395 224675452 +3758480710 3758480726 +2499009671 2383217166 +1775682885 3793259404 +2464200051 2864555020 +1745317570 3275154061 +1203172615 3654644267 3595112537 1739036133 3128548102 3959667222 371941406 4014485038 71847721 2313014788 533019051 533019063 4014485042 2520065010 4024113962 +2186642586 3063915821 2186642570 +1231129992 210881803 +1133890570 599875887 +3705724840 1577063805 +682683067 382067515 2598594920 +2431381563 1584082162 +4178696595 841502720 +1098206611 2661883500 +4116579193 3154081640 +2077526190 2643667438 +49546606 337939513 +3066720350 1280371327 +3555774874 769480546 +1168830851 1648066918 1648066928 162313089 1569661629 790245674 +193661664 1844862248 4172096025 199368377 +1795367110 1005361057 +1067236358 636484613 703595078 700185975 +4075924692 1013709340 +2360520609 624871376 +1697969442 295392174 +111791430 2869204369 +1612744772 2536932105 +4028791715 140940550 +1181503804 411296103 +3696026660 4044039359 +2137913729 455067158 +4085633483 648626836 +2143587121 1399266864 +3532412044 4276689015 +2484340008 1132731883 +784235685 1708243421 987641786 +2821559358 3988800633 2821559342 +1211034329 230681701 +643233275 1473937516 +3775049905 951111946 +3326122133 1667206957 +555283115 3309699874 +1285579174 1182382145 +3196488824 1708073197 +388486547 112539258 +3068256315 754391807 +1924305981 3424607252 +1997629573 2818388577 +1555958691 3821302340 +1901306599 3787316964 +1668821770 1909563616 +4067412608 637257605 +551338852 528979583 +3700079143 3068631204 +2652623962 1543629480 4168534841 +3469032553 3917355352 +3304496834 1035335502 +3522046548 3822032664 1686331305 +1664529891 1664529907 +584044507 2820945362 +276318581 4315917 +83325353 930570644 2681633956 3061344 +468508897 468508913 +269635947 3084266338 +3112164717 1900647044 +2881736186 2020383427 +320079657 830948743 +3119658612 743159951 +274737829 1818436019 +2303388589 3455123780 +2241824441 320935208 2241824425 +1899417687 343073236 +2862308631 2845018918 +4173471567 2780483397 +3299525877 2379484604 +1979874154 2822356520 +3773016431 2214419628 +19996898 791760593 +2824797225 3948146124 3974384917 3856941573 2726923424 +3560108341 1093777002 +941362586 3995691371 +515688473 2083454792 +3237308027 1028674468 +2652794487 3089297254 3910012887 2014934616 3708681460 4194890958 3156407759 1625810246 +650230347 1308115988 +3160866599 3173231222 +1548680874 3420207199 +2886288551 2039943926 +3196423583 2336092488 +1554988396 184396499 +2456142259 2456142243 +2484676204 209204608 +452961071 452961087 +1863229686 3389481809 +3517679697 1644664720 +2304274424 798106771 +1025964199 1573489316 +1254408692 2814202640 +3792027534 1561103513 +2390578502 1066884486 2390578518 +3173690605 1875105605 3173690621 +3555699602 498325736 +420728601 420728585 +1864719151 651070200 +1367017977 1034990334 +752180231 3463187716 +3521010494 4213899337 +2897186757 4024540857 +3645520306 2314708735 +512843182 1688231993 +2162325140 2021698297 +767101696 4199305477 +1008241158 2694924129 +209137303 916346790 +1650015059 2625950947 +847348765 2665675170 +566851439 2607706223 +3941638934 2576836577 +134000140 3534558775 +285978330 2942583083 +2263813051 625964900 538505855 +1743803520 525665669 +3319174757 2272902810 +3084843785 3084843801 +3169062156 1533008043 +3941492583 1807789526 417172039 +279218484 2007326048 +357383670 2434903489 +1187565964 810727572 +3095535753 1257416440 +101526212 3335070852 +504359128 722177037 +3578070270 3114720201 +3955664496 1370205148 2578973269 +1455226249 2598333587 +11408632 1162390216 +3954760008 3050399583 +1441351786 2936351862 +77425308 3754873745 +2092786490 619204336 +3805869330 764005189 +2311209411 2156517587 +4152512173 984568993 +3381058060 2077660764 1699815991 1263091937 1699815968 +1133447859 2334832183 +2748185166 2748185182 +4011460731 2971783877 +1742395818 663004827 +1439763068 3742121231 +4195510457 1677384488 +4203692441 825668966 +3323630505 2732970840 +454569932 2329933212 +3711590054 3907190615 +991008098 1588472131 +688029482 3102617357 +603984044 1917897175 +2074013179 2519769650 +827339182 1581124874 +2560970578 2896210717 +3544637129 3056022968 +3038998565 1271499322 +1327980398 2338996276 +1553139164 332149328 +3751636393 2988869913 2988869902 2916327704 +3759418378 3384890285 +3183839046 180583317 +2656201875 3468749690 +2990308431 886753397 +3105481809 1472832369 +3674645370 1670722193 +3158094499 4136449674 +583640928 594705459 +2584708393 963076991 226833243 3106221208 +810761679 3792325838 2793306929 +2414369388 4140193793 +1961973856 2012094259 +1317379125 1317379109 +2148470444 1434646487 +2771163496 1188443108 +2716343735 2540095238 +4052793525 1343626183 +1489787037 1722777378 +2596264642 1577410421 +2367820149 2603934476 +99820942 3955498649 +562243784 2306421469 +1412687848 1974866493 +1461800820 2641367951 +11460091 3120881477 +525244034 2022025998 +831681310 663435305 +3135321803 4100557717 3391333668 1312833915 2509600185 613082822 2159296281 +4281663489 1720601043 +3463344533 2363280796 +3333881682 3068485480 +3851495423 1652684392 +3666284180 3666284164 +516590986 943302150 3164327141 3164327154 48025659 +412658253 89397042 +3085099514 1948892317 +4293844131 2282050716 +3047343067 3455976403 +202766989 1283780069 2476305394 +620918983 165945686 +1973982143 4147476609 +3846154801 3604269728 +2197919491 1048623530 +851546255 221712189 +929711971 78440778 +1226066152 4075734333 +4101596076 215992380 1805767895 2266490839 +1547721532 1968152423 +3503260496 111916789 +265069870 220727161 +305474484 3674910728 1572064345 +2190469777 428753488 +170146632 765961450 +2991768541 2991768525 +4008268715 3293492788 +2385292510 3916477613 +201764758 2861937940 +311404280 807655547 +1912245061 2993241484 +538465309 2739694004 +2442584975 2608034779 +191170248 2486902755 +318103070 4144802111 +3104745432 705837325 1202704228 +2398454582 1115524625 +1507330833 1845799073 2149149638 +903621730 731504195 +2906484043 2906484059 +3480169576 3717385859 +2039291820 86563777 +2457962613 855201443 +2811641906 59182757 +1862412669 1030180802 +3229779003 4127350504 +3718823005 1302365803 +4035648645 3143179871 +1995730977 1674347510 +120791391 116456576 +1461713873 4207011680 1564531748 524237875 420649871 2186649178 4166609414 3142134807 3535679985 2940803369 4207011702 2186649164 4166609424 +189099926 1414441255 3738454134 +2905475858 2905475842 +1284305215 1099390549 +1967965007 4141315416 +287139132 335438532 1072682905 +1191059923 2500804396 3540021847 +82057590 689181905 +737300727 3353797475 628454608 +567786978 567786994 +2459328132 1186384351 +742582593 3998560598 +413318161 2843820470 +2443281053 3636784088 +2264722167 1561003421 195958010 1998971590 +562369715 3923300384 +2799776869 656447388 428178170 +1130187695 4006468603 +4085958531 764900210 3571615002 +3655396552 1175711088 +3646404036 1763703168 1654523454 2932923780 3910345631 1914761391 4041526578 425062535 1981871867 1763703196 +915273167 2960782552 +1176067465 3807264440 +2930607927 841735056 +2684524268 3362229244 +3270421272 3358359595 3206578664 +1666752408 4236459085 +3805591078 987413975 +900426524 2945597904 2564398353 +3868612956 1521396679 +2758037230 3085451439 +4190861705 3293598392 +1387617775 579002168 +4289260582 298585910 +3226918031 2148416881 +3083252945 516859142 +1725901828 4115810889 +3797309645 451791524 +926448912 829754194 4041536363 844243717 4041536380 947197522 +3017035949 1795699257 1054967662 +4054285597 2276062370 +1067040955 1157421024 3658114674 +3904179753 2114275992 +2921366561 3750753933 +4241710016 3233378117 +3611322139 4116860804 +3761773849 290836040 +32992503 1459393960 +1343997576 2746845213 +2092946188 1845050359 +493315938 2881994563 +1859146589 3472046964 +804601155 3255791740 +1643547050 3776624269 +2900518446 2900518462 +641667600 1162440483 +310500905 759178968 +1763471361 210962563 +1559929220 931320414 +3949823455 2087304734 +1408227154 2644538062 +983908635 2872020894 +3795792898 729734947 +2649247108 414320329 +2954992652 1357424375 +1518844314 1960099510 497626493 475168629 324170079 +911157752 1990136187 +2106470648 2664896123 +1203804494 1775763962 +669312558 3575283798 +3407187814 418430337 +1888663141 2095245706 +2148281485 2148281501 +3021420202 993717310 +2066302971 3707523122 +3593533344 3474313459 +2489010273 3415296583 1404104337 3971150006 +4194821385 2741865774 +2697211464 2148881269 +2907670925 1630898404 1630898418 +51336637 2384722068 +3276882953 3016962066 +959966646 3372955015 +1659653564 1979604711 +1865409366 1865409350 +1698356088 3550969325 +823953348 3473581328 +176146330 2612804963 +1585578303 1585578287 +3595675323 495548530 +215699838 3141618015 +2805416004 2147101449 +2620639532 3044279078 +2849595295 2516055644 +3379807873 2544808452 2266492909 +1210363388 3550701787 +1228521353 1228521369 +300104805 2390037561 +4073675798 3409050451 +4248712218 3270247659 +2444231365 661787828 +1679694572 2271502743 +706998038 1821466535 +1892280820 2178632473 +1548822901 348894803 922073882 +660639013 705974106 +62949255 1587274898 +2450981052 3426805411 +3528586398 3036943529 +4192980894 204985782 4058344849 +1434699544 3060951771 +2311815720 1892641797 +1283712196 1283712212 +3823242466 2665105347 +1244119704 1419203931 +2138166797 449639780 +3731917325 222222395 +261152015 261152031 +1297162001 3350456262 +1535809541 2169812029 539840474 +1678327453 395153698 +3401431865 1638775486 +4094547329 2305693421 +4002201107 2593077228 +172856588 1143054839 +4008337595 917557096 +1265743485 1090668244 +883832336 1918358652 +1342960552 2865795435 +639469108 880427983 +2777623212 4083002582 +1791045196 2991981852 +3901649242 2149932322 1916563645 +1311977567 2039817630 +2906726803 2906726787 +505552098 1619363819 +2208942148 2286306079 +2504720017 2517548624 +90714536 934704579 +2592882113 197473984 +648949829 691403916 +3083673536 401144645 +978905993 1660602542 +318429087 2548182620 +3068928452 3115919263 +2428384620 1198397719 +685392913 3706395670 +1999063926 148622023 +1765085577 663395000 +1642441046 2979099093 +3841522072 423679795 +835177667 545740540 +1704217850 3282274220 +1994053558 3498152849 +1370284227 187325334 2951346813 2576032432 +677341696 2385763859 +3739487999 3758332798 +3687584502 4165065038 +2034690888 849633885 +1128911585 3459708960 +2274246844 2274246828 3400147056 552593393 +1754237313 2255021233 +1873813600 843249459 +124367760 3297008527 +2538339507 3751726540 +2682981392 2327085825 +323656473 2003970120 +3533984685 4119789807 +3736706675 3736706659 +905877853 1556835682 +1370894690 63946069 +540124558 1009229465 +2347775570 1963808506 +3203275121 2703407607 3282718208 +3939978298 3941400395 +2087174136 3237601712 +3370336996 81724595 566381792 +4198858999 4067034310 +3072032815 1867172334 +3940848207 3940848223 +1426575320 1307654003 +4235247233 3943276976 +3703997057 1436485040 +2041881110 2491484665 2908432558 +3578044949 3490391818 +2266694010 1383886166 +2496665942 2576867943 +1920626119 4256878656 +794785043 2789559532 +35782106 1671362406 +3802438690 3944860035 +1956551848 1034984573 +555292743 1635858390 +4003415330 3334067331 +2969275990 4060156273 +2879800111 1519307643 +140103565 140103581 +2275307316 2993229519 +1821186111 555559742 +4219075089 4219075073 +3342134999 1277594019 +3394879564 3611932577 +2379504538 1033382649 +21736016 1511857141 3436379247 +241706792 3467716436 3589645309 +2816068316 400185432 +2988655450 3347252898 3347252925 +690202947 2596971099 +449313573 3060621337 +3509363008 3618024219 +1919762872 3657331899 +2461643986 3428296325 +2061592933 1817375385 +3495726302 1530785678 +1340615383 2709221478 +2614439861 3147221850 +3127877938 1442770125 +4038386970 326822899 +1694242235 2117471358 +591794360 1061966267 +4246457607 2042872342 +4124835824 1410621771 +311373212 3546598535 +309643882 2010817741 +1066744556 65782167 +222139784 1609721099 +3809116070 3362750193 +1929164200 1929164216 +647384804 3741774003 2728276223 2728276192 +3478643880 1922295355 +2812505964 2298095255 +2753416161 1468842748 +895196102 4223432890 +1220483075 2278739132 +2504813852 2937056674 +555858942 2843169122 +102947415 3121019843 +1817513119 685956702 +162742792 554560803 +2311104330 3906891226 +458431127 2729165193 +2727139154 901182995 +649597050 3612141457 +2612506149 1193747514 +556551424 951924499 +1142418268 2376565201 +3126651510 365194817 +635048927 1967998984 +2657714965 3450502829 +4197643798 4097402023 +379629024 2072254636 +83325374 748184627 2472843070 934375553 2038481460 2199969800 971779226 4284979991 2530229701 3102032335 2105092575 +1004534375 2828480566 +2549171931 198347460 +2242978349 994207880 +328610039 2704830377 3429831888 +2433041801 3561780920 +1963182840 754484333 +1820366179 1884952394 +2341759174 2158030775 +1096454830 2408900601 +2334221100 831462999 +953314590 953314574 +2411420887 1402387394 3755378880 2451666634 +2452406008 342925435 342925421 +2321495727 844640933 2110196786 +1296166528 4256422491 +2715254726 2352882871 +3132542055 2459204174 +1317610237 2665616468 +2730472847 2730472863 +173513306 2716335019 +1283521817 2703372549 +2285495619 3055806588 +558586681 2728434344 +1230600571 4074388658 +3896189833 504950968 +2056084653 2575885394 +3770700951 3848314900 +894000460 780000929 +1707366251 3851168894 3808877967 3808877976 3808877966 2668993908 2514010901 +2407744901 2952977853 1889955930 +1976104133 811160076 +692580405 826221436 +938145265 958312171 723862599 2139543158 2913065240 3221563146 1857044126 1785069678 4227994011 2767393061 1429633376 3186344249 1709255489 3102222088 2873711571 2168432045 602331140 1198308748 1138555226 2526500707 808994499 +1006453800 1440175871 +2396870561 2272326240 +413847850 4276569357 +2468291890 3806597339 +1309813723 80757583 +622923847 767904584 +2658913885 3655720042 +1947986322 163627454 +3239449966 7006931 +1072080677 3901499466 +363698784 363698800 +1973705014 1740140551 +44810332 2422198481 +598195932 4245779527 +1813127018 1813127034 +665024831 2773999166 +1986405884 2633672108 +326859535 4201155674 +3711331278 179025241 +1899339304 1600649469 +101630291 1540677056 +3429380010 1912801421 +1144965047 634676486 +2089525093 1959521274 +1562598242 11066197 +1700425843 2710893024 1031324595 +2650742134 781934801 +251815558 131997434 +3947566701 3560197522 +2919591081 2609516056 +1399164145 970776432 +1437519102 3761026015 +2956735507 2177235436 +2355791785 3031666446 +2057482360 2249968891 +2245394798 501497913 +3357808266 2597288763 +4018247787 1946349666 +2196398902 1291464209 +59119955 3554550347 +3678871547 737630258 +3103523456 3031953285 +4199226944 918155291 +1108933666 794093973 +3588796978 4015031461 +1890187063 2458921862 +3179504845 2491945080 +526193826 25656085 +861510913 3608291456 +3833487949 4294229810 +659129801 2713557870 +2509988110 440769911 48552844 +2082654826 887364518 +187136213 1809360778 +2481671351 2456405008 +4009185028 3665218162 126397681 3943374539 74023182 2834225877 2667940472 2749323808 3362265923 1188839141 +4101704183 4101704167 +545164136 774292867 +1645882681 2822058174 +4113463658 1646862797 +2474320032 827107707 +2970983608 2096955204 2970983592 +2086604246 2086604230 +3837854545 1826109574 +1937729300 3851371641 +424046751 1759726174 +1501938140 2667009680 3381669201 +832168631 2182893593 +804257161 1549028345 +2458015440 1932437877 +1744733939 2830004378 +3651382628 3204530892 +780521895 1125813156 1125813171 +90346292 1222360165 +2170472064 3534089144 +3416328811 4232585072 +838070714 1770491926 984925333 1560643549 +400711238 3528593030 3528593041 400711254 1084369130 +3750942247 455548768 +3923456361 2366556242 +1662703252 309102056 +4069423060 3940590109 +185174947 50778506 +872929488 2871727403 +2622571833 3687093022 +2473330654 4044382825 +1277868996 663381679 +3369493631 2826974206 2826974184 2558532270 701609515 3369493615 +2167955147 918370690 +1286477762 1665019357 +4223744767 2740760746 +1223983676 1540488679 +1649804683 1483389396 +2132460686 1557200337 +75443581 2991746191 +223301296 57093660 2748899093 +2725641806 2725641822 +1843037180 1843037164 +3357584394 2021085042 3357584410 +802654901 1173102170 +1944220803 3446552100 3513662576 +2856938164 3314743631 +679670877 589737588 +1126282829 4212259620 +4287152203 3438157881 +1314850722 26805269 +780660685 218005426 +1261482432 497537363 +3245715674 1715824445 +299951385 1040754270 +2937347183 2937347199 +4275675670 2582142662 770851370 3417177847 +3874816976 2607028658 1921797761 1741454300 3501873521 3054330347 1606057196 3845059483 1226071685 +888842104 3734348283 +438524572 2128220633 +2036079626 369107885 +2101967099 2628866098 2713733115 +2011319508 2369712569 +485815537 983538932 +3389014741 3546887516 +2401048512 4094999695 2243404404 +485123805 870550953 +2939718715 285524196 +4216620051 3104565754 +1473340006 2761811585 +2962639002 2526300797 337552615 +4077019254 45996497 +2246811708 233651815 +401244511 2828291595 86616200 +861967686 2907479441 +837929999 2929998734 +1423481137 3254331440 +2025022898 3026786099 +659025131 3241801186 +2512002226 3266241754 2287681393 1710959653 +2910266925 3815379588 +1650015043 1012739667 +2850695310 161339289 +2485460814 2221950927 +3255439779 3134123664 +2368985221 3449674074 +614219159 955577510 +2465293991 3795626148 +3133033715 3969065626 +3328793871 1725791896 +1309397796 278756047 1309397812 +2605357698 3175042717 +3817827805 399110900 +3724443985 3366294160 +1657375836 3746034887 +1369668863 2119790989 +845250928 3212755797 +1109319619 3650764796 +207403839 247646955 +304419252 1146805839 +3576181988 3155126180 +2243560290 3855831893 +1812463080 4170495019 +3157770311 1336870496 +1546207684 3639773087 +4203365031 245820662 +147913248 16367731 +3528939714 3783309667 +997300133 1917242139 +1476324543 1162784958 +4034003613 3627826415 1111219348 +633793181 1755251861 +1670180650 3772546843 +3682774904 274267890 +2674837589 2674837573 +3318321282 3729685685 +854533034 591868660 +1247497063 3710843748 1729334035 1571991774 1611890719 1595113081 3710843763 +1934214006 4078875345 +2083117922 3936429174 +3696189224 3696189240 +480500089 2398050664 +4020957398 538517745 +350582434 2932819310 +4035957597 258587508 +4011700392 2410515668 +3738639185 497025168 +3698172863 1165961084 +464069690 3309569867 +3679931758 1948815958 +3756050068 1945892328 47749881 +1845140418 3817026165 2880865742 +97652453 3165007367 +2452520700 456255143 3437738156 2156800167 +2912978337 2865204678 +3347735570 819693637 +78091339 2315959969 +3112798721 344211328 +326675158 2096426737 +4190171311 1026825272 +4258890377 2466167244 +1078889768 1671968253 +3811404101 3850155930 +1715158599 730356050 +1457315496 2432918647 +2503906012 3447795783 +3081406401 1028601744 +1414963093 1499281308 +4275620779 3662192180 +3847089367 3847089351 +1415293149 1315872460 +2075724276 3768737757 +1325367989 254984598 +999216351 2698582792 +1712910842 3078639791 3296748817 +872353593 3128821295 +1502348512 1502348528 +2687295626 2963634491 +3210763817 1085812110 +2327161432 3019581595 +2277702594 1534570973 +1570752490 1283962203 +1983618410 129819337 +760841311 3270205854 +3237933603 2932649225 +2611022678 1417992295 +2010772235 3071908436 2437804591 +2289017583 3830297147 +3737435942 3585665217 +2655740027 2879971748 +3308907968 2999724514 +454548689 2005966096 +1754658983 1630755839 +539458792 2250875179 +3694729273 3873513896 +229151953 1365394704 +1807761763 147457095 +1495617698 50282922 +4056582495 3645347338 +642419351 241076895 +818811011 1466170940 +4213139935 829663752 +366937082 1632747733 +3016993396 3016993380 2318750863 +2407404571 4269385362 +827317699 632203841 +3331042336 2283540482 +2641904331 2428381167 +862657209 862657193 +2773902179 2773902195 +2387016764 901714535 +1280399751 2869948288 +2234125246 3978947868 +3848281868 3864031031 3848281884 +208151278 1446496110 1978596527 +92357371 2776396082 +1817274579 1610518848 +1930725244 725464620 +1082611465 584824421 +2298809514 3983487237 +1233888100 718419561 +2516386440 2773154827 +2928249586 3028663013 +946087016 2537877868 +2510611867 764769028 +1268790344 1999618839 +940044711 3682691574 +3283113928 3600429003 +2761626097 287129190 +3950367539 4116705974 +2342782371 3758154502 +3592282561 3523896022 +1604071860 3139968972 +1329506720 1604650725 +162208970 765020615 +1686001880 1686001864 +3836942534 3251604753 +3120481867 387065876 +4123030594 536282101 +3007638671 1780424319 +2353789491 1315040267 +3332798846 907100511 +3129256705 2681811584 +1582198087 3430293478 +3242943647 3903809118 +4278985250 2978099005 +1475310849 1861562496 +1407694046 4089559423 +1499818264 3533992141 +3984692541 536735508 +1149264333 1149264349 +814293112 3755875579 +1210350672 93495208 +573265500 641266385 +14800010 14800026 +3116526298 106803874 4250772639 1192113451 611740790 106803893 1192113469 +1593851233 1248402721 +1408904303 2715022008 +4197959387 1213919902 +2392365934 3896290863 +3991436335 1290227067 +1118500406 690067207 +411914347 4095673579 +1197894832 456032856 +1419670053 1517137978 +3791964947 249449695 +3348961639 1096322119 +2818230262 4153844911 +1430997830 2393591509 +592618646 2185976632 +2711716742 2711716758 +2508347534 3124229635 3929106319 +3641750416 2897250018 +4188564562 1445102867 +4059008994 2783730546 362266087 +2423062814 2040054313 +195113901 269889201 +3331775993 2558488296 +1257098792 2702747220 +3828266636 3247005281 +3112496949 686773978 1095012458 +1655659976 3617579741 +1237853848 3189031259 +2045372480 91822788 +3902327034 3902327018 3781529026 +2556143144 2556143160 +3413615945 639580533 +3043193459 3043193443 +3304930415 74549649 +1664660910 4046677338 +3745638418 2260751443 +2275811946 3445529810 4102565083 +1462508047 1231881624 +3484959482 1947487909 +720249182 3556111809 +2180498275 4228420828 +1424217954 78384963 +2682911268 3780429503 +316841962 2764160333 +1289067095 1758968788 +3556793880 3325026240 +2427187252 4071301593 +2705782315 230000052 +2879440790 3162685098 +2102971620 702065871 +3252630204 3999063527 +1449659308 2982830017 +1597705114 586359139 +4009428732 2897739640 1788359643 +2851577819 1808836036 +3567866305 2274079446 +147424498 3342616819 +3890590347 2576879810 +1178482108 3516379204 2125256944 3315047793 2920554574 3133126011 +283553833 528612479 +2171718548 597012462 +2201290091 4151805794 +796209466 802032187 3298658865 449555094 1274728469 4017913437 +530238512 4038029205 +873467888 3579577789 +3796727320 1475405787 +3153783709 3068376432 1063329521 +3087031571 3146941690 +104110254 1280720377 +1580882503 2631671254 +909556597 2250463675 +2641412503 934237460 +1708957767 2976746308 2706395072 +3364618309 4184108172 +554409702 2118766641 +2889758584 2414082067 +3846925912 1304343707 +3904368357 1049432684 +1558186346 4183986342 +538132609 2309724112 +2602779696 713305518 +3261683421 3906190818 +3410924600 1152603181 +3146682976 2708499763 +2167060850 3359764083 +3539759501 2959524082 +306431200 2695818419 +198521008 2997669300 +2125833848 3260834816 +267668763 949313938 +319375730 1772002917 +3535800037 4208324106 +1559348780 1409557436 +3536837635 3761723580 +1566957832 390879629 +2978813153 757768352 2710753040 890602297 2320245479 2515290990 2953959171 2643642554 789936573 3058754943 3356622045 +50192798 1403661247 +587149763 3669710314 +2196867469 2939914468 +1102374512 2598628316 +1031446770 3121306867 +2040504602 1152651574 +241130667 1260314914 +30550535 1279827431 +841606305 1013286086 +2184949849 2393545749 663094534 +2603793575 4158585568 +3958380807 1912038934 +576675992 3022327629 +3727826267 3359732571 +3999403367 2874874166 +2402540045 2074100324 +60854292 229412169 4001638397 +3248291609 3810890824 +2724823418 1276090286 +3305780643 1434449929 886728410 4224699604 1124442035 +1827895225 1011185704 +3882358726 496116743 +2099419496 1702330045 +2955783712 2011765875 +3606995557 3959748756 +1320115634 2417000229 +3165815224 3165815208 +1853153126 3794544794 +342929237 282943344 2187592412 +3723769387 1011923535 2456896948 +1576244912 2524329749 +2904543285 3189031804 +3898642127 2667630542 +3205160438 3458747841 4101795018 3458747862 3021695559 +2499766731 1423869592 +1683975422 3707862 +1995731041 2748115126 +65279962 3927012077 65279946 4195454013 +2874111922 440615956 3002844446 2064049997 1612279091 2886732861 +4116981393 915861558 +2298618846 220125761 +1190027582 3879933065 +3464096532 3464096516 +1938308673 1913553178 +1978953627 1296024377 1254863108 3265767752 3265767775 1426739822 1341745445 +1012258157 2059695058 +926897250 1521604163 +3264778477 2062134303 +2079495695 769800590 +1043588887 45402406 +1518017196 466287831 +194042148 1493554111 +2178794189 2841181808 +423497213 423497197 +2069915106 391501558 +1860189816 50484973 +1798106869 2898013098 +626207864 456435200 971964667 +3781370449 537855366 +421325732 2643286984 +3524549492 705427353 +3304647359 1627992978 +720747277 2916447588 +79511713 79511729 +4005436679 3695686145 +1279252902 2927861847 +1880713876 501106292 +3116666027 1526543576 +4099444266 1882581306 +3580709833 2127288179 +243089520 1059876931 +2180457919 1460693928 +1221818562 1726421347 +194042158 1661330297 +1896442369 1896442385 +1288755807 3430466570 +63075652 790534687 +446641046 2124297511 +944191254 2921052071 +3255786665 657382926 +3540780249 2229696875 +877627076 489760393 +3021650410 955194067 +2062080106 3867979483 +1748379644 1111259568 155251121 +3702522544 420756227 +1711294403 2094424496 +3577414406 3253066673 3577414422 +1504639468 2837548284 +521515363 1378238154 +337525130 3924260789 +1407461601 4046215734 +632369403 1357912882 +675429720 2685868711 +2088981264 133177232 +2470471462 4100088023 +3099631940 457039369 +3119394995 1693886938 +1287861592 53270771 +2090290008 2049678235 +4262915863 354050352 +2247381748 1853176268 +3775417736 3356626187 +3472266187 2569709716 +1749161775 1749161791 +810875714 1472694499 +4230912233 4048975738 +1031478800 2297627320 +2790380343 164593552 +2474777618 1776426429 +3700187343 3461631167 +1595613573 1018545242 +190705881 3185714568 +318676301 199330144 +2812432542 758797979 1347845003 +1073072428 3689656385 +47408470 3368584807 +4025559202 4025559218 +2128138326 2128138310 +1376741680 1581422211 +78774140 3761582119 +2235248650 3324813229 +3676748369 1215724845 +2364562685 2364562669 +3723536378 1540910749 3569492920 +1580896508 1379024049 +956797740 3610456083 616435712 +1287964435 2595923619 +3910123605 851991788 +3346707891 1280432439 1280432416 3106670810 3106670796 2394631373 +1295203712 128569477 +297952202 3204650747 2900176178 +3843808156 3387019818 525167747 +1295813334 3928666730 +1563529320 486953908 +356111114 1946630331 +13173514 1181731003 +3516796094 3516796078 3117289247 +1345449346 3531016353 +4175698680 3340137595 +251675977 2880649646 3865907704 +3555388009 63898446 +3231260830 3473823935 +3001951672 1692754107 +670468966 670468982 +592608824 3537678907 +2074615683 2264881444 +3970826028 50400220 +778482848 3208187266 +3405236123 3405236107 +175539415 3097030800 +3578344214 1225047338 +514663186 115208634 1552823635 +187301017 3075675514 +2815186039 1708091370 +3165894163 1067494819 +1001163831 664844944 +2826217335 531282514 +3121241033 3121241049 +2008205507 829557472 +2586320526 1339462046 +592403036 4058726087 +3434556891 598880671 +2212900182 4004486177 +1247069377 3295787968 +522083212 974348294 +41156539 719669307 +2011382208 2181791643 +3569364725 2974719914 +2976723334 448573657 +1745793878 623136871 +3851599019 285147426 +1390065515 3497208046 +1822570948 1721308335 +3604818446 739964535 +3099205543 2075822500 +1322320938 3787575148 +746799914 2402061189 +3360097213 1734422416 +1452538918 1452538934 +3242395468 2290384033 +2442580343 1403366958 1975825135 782300457 3734804451 3734804468 +1625126052 2192767640 +3522128002 4259415221 +2819674156 393368897 +463807897 502935496 +2659019399 2770141871 +1844452935 1476372928 +3546607517 1692742690 +1619960964 2223832031 +124263447 124263431 +975785539 465767472 +3098532938 114804859 +3405316080 4087222152 2398708043 1979377347 +2632651436 2987287745 +1888750554 319727677 +1664151475 3014404813 +1788836168 554429533 +1406682944 1031285203 +1860764054 3565103735 +4273980285 1527687552 +2758949581 3245983794 +503191636 1576494524 +3732023679 2897695486 +25376400 4109501103 +2281460318 1882565119 +299033778 3237872677 +940683057 2503817115 +627847260 3995314439 +747390746 986967549 +1998277464 3623328667 +1428290296 4236121211 +1204580751 2513880078 +2163494236 1553319879 +394481842 30154911 +3150342130 2337645029 +143209685 1157507914 +3934938643 1256108012 +2559942377 478750936 +3263952620 777368983 +283279432 3700420939 +522387899 3206265202 +212493413 3010951116 +88846318 1143337903 4139687022 +3847460639 2827729372 +3279884826 1714622631 2466532 3376472880 3203584561 3674832637 +1801826475 1228732622 +2686503495 1520332246 +4146025802 1347634029 +3994882360 264379172 +384460354 1425996277 +594919815 1499441046 +4096121333 1284906172 +2351919095 2680068707 +271162711 2512058051 3364007920 +714105582 4014718127 1664747385 +3820034026 1506321755 +572183444 1643989759 +1338968366 3505091439 +197108339 4054629132 +151681282 2978034759 +570625088 3402385605 76975629 +1091143500 2919234743 +2554284004 2409507817 +1936567328 3108167931 +2696260596 4059934991 +966373284 3273437732 +3307540238 3162235033 +197167300 3115154360 +3662824138 2038375419 +1818894723 375457386 +2620741689 1863145390 +1785994098 1134128530 4021747294 +1492721109 2781432553 +2111132342 4099256470 +3802244149 4185227114 +4277354486 907485898 +3020996241 2792013868 +2483867534 2483867550 +1207621994 3942846112 +2841605703 1720622434 +166949225 2334060544 +2475905272 2845068865 2475905256 +2587000748 1769929687 +2152420119 2410414740 +458541384 1433516158 +3136581822 1031324603 +605024835 135946090 +2112190177 289023030 +2477002990 808998731 +1752818341 525764451 776638410 484428204 +3782705895 1025917599 +3663157728 2541910949 +444143627 3080771906 +4266032176 2029354901 +4096415702 3420850871 +867064860 2004549649 +3046416913 475305889 3925549254 +1436536725 1603520412 +3245934704 25708611 +469818159 1146686190 +330261228 3910711681 +1534125645 2225676196 +397091170 2644282286 +510515092 4214333649 +3238879033 3192861196 +18866573 1378881778 +2036327495 1492409280 1492409302 +447419091 3461259820 +617066364 1650016295 +1980252131 1980252147 +666998929 1262400032 +1232395516 1933500467 +1816563190 2911075777 1792193102 1762753105 2493188520 1792193106 1175802539 +3757217316 2934069951 +399550188 1769391489 +1132959041 1132959057 +2686779591 3625590738 +3660219448 2834179117 +1364053451 3017772405 +1607024316 2481475184 2244854247 +3476084180 3476084164 +3077992414 658665499 +1998277462 3589773425 +1535335821 2630632676 +2431647560 750797897 +3996345344 4256959451 +1585983995 1453597375 +1902723883 2575634264 +3837325354 958534157 +2875929206 1391457857 +1142448814 727936302 3764606959 +2671272698 2680410013 +2265989924 3425149997 +2811766472 2625965277 +2937940051 4266343098 +1441896668 659792465 +380830477 3368930660 +3691113963 202892954 4060259934 1107921122 +2193464312 3363604347 +1799868804 1918227065 +1671676810 1691144763 +949162736 4287025091 +2085505479 1983784000 +3636714489 894650600 +3259011632 1448650824 +2386737580 1958590091 +4059864355 113578803 +2799355718 4033327905 +4144082726 4255561943 +483888015 3844291821 +2025680625 53847398 +2698886015 4064961835 +2872308391 2956994439 +870263050 1797952627 +1800818687 4158647934 +2432888802 698327253 381258542 +707363328 2082822712 +1976654706 3092697357 +1119771691 1017845684 +1020508149 2708155789 3058341546 +4030748612 4173292216 +2233058628 2065450460 +2162156098 577842677 577842659 +652577158 1404783569 +1358316731 783168114 +556296077 2466620146 +3767316021 2994093418 +3463177637 1392230352 +3225040010 3225040026 +186966666 353410861 +3968492577 4565895 +106253661 1430833524 +2111065930 1700327134 1597559149 +1618916488 1870017035 +1410705156 1645603679 +63877983 2365640714 +1434717874 2291062363 +3016538319 3662081486 +436550892 2852548631 +1916972572 4210562577 +1934029344 2561615987 +1329896653 2516768420 +4051216988 4051216972 +3758787285 2569431930 +136532667 2325429348 +58684028 4255201585 +3980374993 1279791632 +3647824834 3756808651 +3350725940 2595238105 +3883532513 1175413280 +4215563873 3987548832 +956952558 3097801647 +2702884126 3138893353 +3479526229 4208325769 +1994945278 723533321 +868632649 3391343342 +3161998362 3411227883 +3754336728 3598170604 710551840 3393804645 +2266827578 3971525725 +4043714153 3585806158 +560141648 3361014103 +232930136 232930120 +2979452042 443585837 +620820725 898099644 +790877275 2526772232 +2776000986 1200806813 +704955378 394294757 +972936737 1805129184 +230342062 4032346621 +902878499 2004885008 +3615336013 2278345522 +1654102860 734586231 +42288444 4213176551 +2723113575 1516272452 2232791666 +1454288920 2365535707 +2953967297 3980882368 +1094937547 2283974786 3801872632 1301470005 +627153782 1319615175 +3422011289 3656176207 4062086248 +3957065991 1382168064 +505188395 2076288079 2448880564 +2835713636 3941272153 +2625945907 2549883724 +155079203 1175212445 1459249936 +572897824 3781427315 +534333765 1745770394 +1004884458 921442387 +804141079 2067042878 +904442219 1213156194 +85604464 2017908821 2894499292 +2629352879 2212794833 +97706991 436031536 435999025 +2429708496 3409641333 +2851146217 1869781464 +3967194324 313280943 +177731333 879381049 +1857083696 1885726339 +1816963240 615350388 +3812955926 2609052641 +4235208087 2954321744 +2742969230 644121309 2742969246 711231769 +4171049944 1857197466 +2774270103 11207250 +1890360144 2948103907 +1310392466 2509326 +2816811829 3453918774 +896780910 148011759 +3595919174 2925853495 +1057014995 20305978 +1767351232 2499200837 +4018247160 16717179 +3484921788 3123291367 +1426909860 2270519359 +301852859 757548969 +3320917173 1336500458 +752005969 998386422 +2763562625 3483469056 +1140759353 3779070511 +4005511791 1175819448 +13353486 1321368601 +4083975707 1322720402 +1537302011 2247048388 4002438981 973533741 +3361745161 2833057311 +969858358 246447873 916864007 +2802636322 456464266 +1278012528 4068704020 +3453961658 3497706461 4232198274 +3262666112 3262666128 +1682339156 343417512 +722733939 1687389408 1586342328 1133381146 2115800077 +4020393316 276614444 +1190660359 3212195350 +487539023 235130712 +1512395318 515926801 +4272189225 98237848 +2270619683 304224949 +4241710017 3250155712 +2265085827 3976032548 +4272597034 759124710 1366751378 1366751365 +2575259639 3972783273 +69501710 2474266393 +679118271 1585174908 +3119394999 1760997382 +2724147437 2167798597 +618515229 2969442581 640073378 +3142662245 1224055695 1576853722 +49853386 2005075707 +2163436853 2339450953 +1804436080 3214613798 +570559125 506898588 +2799508442 2282936363 +4056731352 1827299128 +4023904399 1849737585 +3742813370 3940829387 +3360446810 2855315627 +2869466796 3934597313 +809720762 2917768726 +1969755326 604968415 +1425328484 559483007 +1243720151 4208556361 +3946317075 193669015 +3627175167 1445934440 +388730339 388730355 +3301786724 857909631 +1232357372 2651673009 +899017081 934441310 +2105743555 1482685162 +738362324 1464888372 +1568426131 3181789050 +1471237785 3445631870 +1496486003 3717817626 +39006679 39006663 +697934080 2377978060 +714829106 714829090 +967830085 351128218 +2382767891 1380653440 +497143276 497143292 +100953773 637155908 +799773429 799773413 +291696275 4055732588 +3760862708 2729331827 +2851235128 3563802941 1706361154 +3525500895 4111994667 2884004894 2814121704 +3052621759 755403176 +691683116 313619009 +1754702267 1612749156 +2234764275 2743734156 4267080055 +3310094098 4151960744 +3068506697 3099520686 +3870224085 1916497786 +2391616067 126896176 +1932824818 3737434985 +2458195272 1682575989 +2519890278 941550302 +1593834063 3690400344 +2490318735 2517182847 +2461093058 3206278789 2461093074 +528320739 1973321034 +406402974 3222441385 +1373327753 132230405 +1689795143 3573792192 +929784138 2282366843 +2606369573 3015674682 +3406543585 2222403616 +3046151213 1400254363 +37837909 1685674234 +1948401693 4008373666 +3141315612 140267788 +1216917188 4079689375 +2003070606 3405581337 +804983773 804983757 +4004071340 2907935804 +1645803850 336230214 +2298971791 2259549915 +1632274150 658534921 240278551 +287128667 1275462482 +2470234859 1104452590 +730368596 730368580 +3624575284 3624575268 +926218358 1583555015 +3552897695 2810285089 +1583961581 3439409977 +1845782143 3668215850 +2979703824 2793200949 +378791504 3754716514 +1710750316 3931991208 +3324126295 3070252482 +187121675 4063939061 +3989486799 1799771510 1421872908 +689406360 2794888996 1208025677 +147776065 514731072 +2078498374 1354436230 +1190660352 3094752019 +261605430 3253742865 +3262857645 3574096722 +67190204 166997735 +3840761197 3467252356 3467252379 +3637737855 3555214056 +1607468647 997856310 +782751170 2469993419 +3799357319 1047233591 2483975781 95264510 3696307592 545223812 545223827 712999980 1992436697 102599040 2009214335 +3398325692 2584803047 +1934780934 1348493393 +4075860547 543725082 +3749190110 1739092482 +690351206 749937815 4110588326 +142411978 651482605 +2459873717 4231075601 +339247170 384952291 +3576069572 1335360415 +817117022 162736383 +3064900156 3505781863 +3456558398 2463817865 +2364313570 844935915 +1225549765 3280427788 +94913811 3517450262 +2732314994 3523917413 +1878641802 3493657915 +961127606 961127590 +2516832874 3081489605 +899736391 4141549124 +240575848 4207616701 +3587348197 2152433813 +1053188015 2169020526 +3339971565 3339971581 +4145637447 1140795350 +2809038290 3266664921 2562655566 +2899085052 33062567 +3051309849 1736652872 +4138020821 453659722 +1952175104 747551763 +2163672163 2373330858 +2809749851 1903521743 +1476827024 576755619 +1213366347 618657282 +695604945 367389456 +763034709 3986373066 +1885099762 3325903990 +3456490351 466192657 +2019785585 628228457 +3971054166 1724133686 4049835367 +2845779135 3297171624 +912228356 2622916169 +2724047397 3195197498 +783296125 2161123415 +608979661 1032476709 4044996786 +781962652 505129040 +3789786321 1781968143 +2929703788 1366559489 +3094508937 3845064366 +2574356350 347275277 +3198414684 2014432711 +1175790316 1061550465 +1859913264 3026042243 +2937122595 3131601948 +2893390077 2049732162 +1060473210 4215761693 +1084433891 1136573639 902619894 3206912733 1136573648 2748621916 +374543926 4195739202 +1526882069 1282603450 +1059444170 848268525 +4085271477 133639651 +2301026199 3954025236 +1567774332 2533238055 +3480759178 606898747 +3570860267 2843042574 +3583657309 2665165154 +64297826 3115760114 +399929628 2727612167 +2624746774 3924462071 +1255117414 2526116124 +722714949 3502186364 +4084186603 602405090 +1920103041 2871673088 +2067914991 2067915007 +2132419000 3458405563 +569078050 146773565 +2168362434 931512419 +1892872083 2161530390 +2446008293 1740846458 +636176596 2237900207 +2334907954 1208928421 +2003204125 323949986 +1283361613 3090500132 +3969356969 463406606 +1131007640 1158296613 +342979243 3650585396 +250114222 2640653113 +1995872857 2771612740 +4119552398 4153960324 +4012333938 3975476325 +1682753495 3995467263 3762515428 862481296 +1041520416 3657770867 +2935130388 1509275180 +1761074621 4214362260 +3744443198 3517239369 +1577246842 3260530864 2686735619 +4061983214 294705583 +1467642348 609955095 +2372814915 3885744508 +3727053238 2344101266 +178109327 1431198558 +4244974688 3691313979 +61552485 3112999843 +3183066052 2243600260 +3202620400 1897396949 +2970025515 3640794530 +3162154078 319864809 +4237713100 3024374234 +586578671 881607647 +1285159967 3043484894 +81719220 3457420748 +2861721642 2927229453 +483869655 1460583360 1820760173 +3900334003 2879694554 +16777622 1895218346 +2807803690 2807803706 +2629864913 4202715776 2485075984 +663962569 3326514642 +3978223514 3784966013 +3073218170 559732546 +2591945631 3544613726 +2622035973 1950494180 +1054310152 4096870780 2885481013 +804421967 2337915313 +3653831537 3653831521 +2140170721 1634905105 2975247670 +1924177404 2282271665 +4200015434 4200015450 +2104940765 1595368427 +4014812817 3573233718 +3093509519 3811404126 2287277531 3093509535 +3397871599 3723460396 +1667665629 1942539528 +3158521022 466355977 +3336739091 699857132 +3041888326 2989721143 +450314388 2241094011 900940471 547302991 1520989070 3844935312 +1577894058 3088272283 +553625810 3296117381 +2285203939 1596088730 2285203955 +3465817530 3465817514 +4155295490 3283652381 +1428315013 578198937 +716522785 1549521632 +99151975 3031593526 +3077735067 1682151940 +26841155 1727522435 +465053377 394388454 +1631715649 1541929280 +116995502 3827824687 +3454721025 1127136038 +3626382969 1133774430 +2890034255 3698985612 +4261392945 181587384 +3005118410 3844694323 +992320850 1849075732 +2109228863 1174877930 +1706122040 1311938875 +2890900083 3025976090 +2276987933 3578792450 +1811798163 1811798147 +3732564994 1018693411 +2798186077 3947838562 +3659046551 3955337136 +3563760468 3238938793 +4246548326 3673267607 +3384650254 2744300569 +3012073033 3012073049 +3686956972 2670656471 +4159064062 2826186656 +1702377864 1787931056 +683874954 3038955309 +3203681697 999699574 +3316455192 1199266523 +1131792603 3820864648 +2787674502 399539681 +70649256 3465896209 3482673831 1865043190 1225451371 3331675259 +398876090 658869195 +1844895251 1161565603 +4231543584 746918771 +3612789310 2088142686 1000365983 +3557626713 697660702 +3540506346 2977342789 +2062554482 827939474 +524966749 2629770852 +3238285519 2414199578 +4279169246 823988137 +2180128061 2180128045 +1917788700 244494865 +1760246737 2358568794 +2705671448 4161520845 +4007053336 2673078349 +2797041135 2797041151 +779431824 2994331573 +3341607152 2074483157 +3014417916 3014417900 +628340288 891807443 +3796126982 3787751842 +3221643556 3828415247 +4187195155 2282188390 4171672901 +787925185 68215191 +3322431233 2025252893 +2835451905 242594176 +1962486121 2369531992 +1211751088 206739996 1662206741 +3372721856 923500627 +449852160 2729636571 +572461657 2422443628 +3615588168 2296077917 +2579546565 2298886124 +2122719125 522677700 +1078288941 3667439236 +3235434931 1213340890 +3716933882 3175072139 +436049006 2599662638 +988266485 1040707337 +2441768350 3135934377 +4134609487 1125712472 +145895215 895312138 +694265758 2110760266 1261114281 +959372047 331536536 +589637414 2038210775 +2187019535 1152235150 +374416629 381496746 +2123806857 943931707 +1735420289 1458968086 4217685169 +2919688163 807227088 +4198527698 2985080702 +602385963 2964794786 +419978834 3123477253 +3297906477 108898798 +518954481 2728567408 +499081013 155377770 +2115973883 2250064178 +3076078568 2306428477 +946252872 295777629 +2053197005 2535207054 +3115351491 702051539 +2183164934 2812705361 +2700407537 2410706413 4129638419 +4291107141 3936313748 +1684660965 932144707 +2509551375 2283547800 +1109225445 4183238010 +2459210145 1625374816 +3624259766 3341258385 +1926230639 1926230655 +356995595 2319853378 7334200 +3219382611 1723577772 +4260958070 1158895310 +2285125929 2470613912 +3646627438 2557536057 +2967545615 740181981 2414870652 850593722 2725872800 +2396740577 3293684534 +1026765351 1026765367 +510560346 2449787939 1107338667 +1794444620 2573177593 2690099667 2573177573 543255991 +4164145519 2532164794 +1986422533 1748249818 +2603101611 2375304235 +1330314731 3188570338 +647623369 2371433070 +4062704253 4062704237 +2029703905 908180752 +3938020879 2431140238 +1270377324 2672892695 +3055398674 3267008837 +3142729839 4249832378 +258616386 2250484725 +455678440 1661220885 +3360779907 3980495193 +2026947678 2393186303 +3456030866 2282059654 +1062294177 1308955510 +1208249629 147726985 +3338905200 3133080149 +3380263109 3387794173 4046511628 +4021325740 2784928820 +1891708717 2904376260 +679534558 1944501082 +571451433 571451449 +315581094 3539516423 1115179841 +3811607160 2085162794 +4167676207 1029827822 +1332107541 320748554 +2324915894 3583039910 +1997534685 2436236273 +1512399390 122917439 +3484873188 3774794239 +3073465581 1337280786 +3790158344 2002822453 +4248202860 145740801 +986513547 465033922 +34349 4159165492 +745751475 2195113677 +2080448369 2797895408 +2050178352 3465043418 +2383766109 145348706 +829098439 200192179 +2976753366 505901473 +1124986802 1089492275 +3938990516 3938990500 +3405319278 4094595375 +3343063398 346094465 +3409469670 521755621 +1610293963 3814180226 +277380603 31347250 +2378170687 2212563234 +181019379 4013229189 +2571991037 1374937940 +1054331029 2193447562 +122522372 2198984521 +281246079 3423685871 +2821631849 848298201 712909390 +3905374910 3905374894 +755854115 154379811 +3729955849 2501104568 +1374485027 610504614 +875054523 3365375570 +3813013260 4212045315 +2715926308 4200588713 +73855934 2886841353 22519928 4275997897 +1066606079 1066606063 +2015835316 3652712281 +980312512 1936733031 +3837532544 2484872339 +3444282902 1140671665 +3908890700 2306909179 2976417406 305022881 1071301216 1272632660 +2550501985 2550502001 +2352221965 766451401 +2249845629 2278399108 2249845613 +3359701429 647513544 +1590769772 1590769788 +3225606755 205375946 +29459049 1184934174 748702552 622448351 +3131185337 2251090728 +1079041475 38607356 +2570009048 4250406669 +3747682778 2145104427 +3712750312 1187103531 +3459501586 2911725139 +2112526449 2840459750 +1903201782 2318367303 1903201766 +263796942 1471399409 +3376360955 1204387519 +879168698 943261899 +2806828297 2600133115 726165368 3857819667 +77426758 2312617527 +2705618939 3653820452 +504008916 504008900 +4192323940 3262122111 263418829 +2092811142 151983559 +96472590 458629145 +291817458 2305169593 +4092527033 4092527017 +745754684 3036707825 +3021831477 3308100390 +2469927060 1431220473 +2545372863 2492528318 +3132167428 2663132176 +749323621 1298806179 +1832487960 3868061092 160926157 +2684796588 2526947521 +2061840850 1221422483 +2069863535 576090036 +1171793543 2051319446 +660280691 1734525978 +2969627973 3916792730 +3226295507 1624476038 +44328307 2613818394 +839301308 839301292 +305284204 4178674583 +4018585330 4018585314 +1466776386 697220426 +2955556583 3303039388 +258987154 3742081477 +2110407852 2976520919 +2119772271 1432004280 +1286235211 4215005716 +3126934063 2517538798 +2295621141 2295621125 +3711077746 3574092557 +3465167020 888769442 +464460153 228923774 +1861412927 3882064702 +2184595603 2902447894 2694960237 +2732966146 1907283509 +427675962 2781114389 +3936374349 2796210085 2807776050 +1377311815 4025185650 +1321565564 2095352359 +2015458495 4232425034 +445706441 2603289720 +2509365870 4237972206 3802624815 +134131115 1089168436 +3445279266 41111789 +554528805 757565996 +555679203 113880138 +2122638408 2234249200 +24493025 760660768 +4117125403 1797146002 +1904262325 1042654886 +3069657812 3678286767 +2426945923 13837185 1421185725 +450903 4058241748 +1714908665 3795984126 +1802412763 4197080772 +3711760644 1258029385 +2439492563 3107984684 +3903569054 3831098559 +2866489853 4093843796 +4083718019 2963702588 +2333117260 2333117276 +3452961691 3452961675 +4290995009 3784654656 +4149881681 4149881665 +27331894 3330788359 +649910986 145440209 +3730183810 2920098461 +3132008563 869263863 1408445708 3132008547 +1772063451 4115814024 +1716658524 1977255957 +1678267398 1373128450 +737684811 2192526612 +677858324 693884270 +1058064800 1058064816 +1114268025 108491112 +582499050 2449784397 +3160672075 3698817794 +4203112199 1786951215 +3669561004 3711975860 192531218 +667444124 3168874065 +3881023052 2211318612 +1021748830 1024976383 +3973178242 1349068195 +623481739 3157645534 1961987151 3174423140 4231519593 +312029406 3883080794 +570045442 2128600867 2128600885 570045458 +29442191 1379442968 +2771121973 959850620 +569339017 4108835768 +4191766568 1880659420 2345775189 +3927415488 2444051297 4042491473 2435687502 1927479323 228431739 1672351905 4233226907 +1716467083 959846371 681064053 +736666774 2526598 +3863641280 1195532869 +2300312396 588028065 3453240672 +2728271157 870840956 +3234100182 2936630664 +1315235614 2262291519 +544099684 1239898876 +3240643953 2205280496 +2736675804 2764741457 +426809723 2420741672 +600780321 2973215302 +4127230057 2882977112 +1207948084 2344188633 +3638473423 791409932 +1246982966 928931335 +898385056 3956279269 +3591297732 414474615 1420936062 3620449607 1689244122 4076499330 +1666392948 3622227423 +3557761169 4191910454 1691370576 +2463614078 3837611746 +2019883281 4043513161 +2622035987 437315052 1272529958 2757288497 4103729792 437315066 2365999041 3627753197 4103729815 +1743882213 3078843176 199340011 1527045988 385873720 2248383927 1087568089 520094674 503317068 919791885 2978177487 1087568078 +487869834 1358303277 +1952439411 2783447322 +4093098716 3942328391 +1761097211 142460607 2323243698 1761097195 700244194 +3421599877 3362459651 1669580970 2451618124 +3924575372 3404720247 +3716450441 1084420024 +564573583 2289029144 +8766921 1538387502 +250817281 2311893654 +86116550 1560387042 +1599985856 1599985872 +2286184000 3460855835 +1299393528 3830331245 +4022915345 1008854269 +1499304076 977964151 +4090325576 341725021 +326771587 559307137 +3178955556 1822814633 +3251514290 3381578035 +2091133860 141166991 +4099508320 150056741 +3246930873 1651901480 +1467277370 3875339083 +1761609336 3941143548 +3666837476 4091958249 +3838141993 3838142009 +3915961843 1661521292 +1794420757 1949380892 +979340724 979340708 +3859366906 446038667 +1087847853 2631539380 2673346895 +2525833038 1312088025 +3895116532 301877908 576703681 1431976264 576703709 1431976287 2577574352 1867572761 +400832334 3930263513 +353275759 3123857063 +3814798005 2801980131 +1445615905 488261370 +1789925508 2000066527 +281798353 4047723470 +3161859908 790803368 4273241657 +83652508 1559370311 1969468049 +1175787851 608903790 +2155280363 642270946 +2910519629 1705184292 +709601338 1353162498 3474576203 +4058103017 2942067416 +671528702 9572809 +3061188406 1909283335 759478529 +3374370069 3871966771 +516609426 2669488173 +2063476685 1796777892 +3685640242 93193893 +2968725500 2328359345 +2663498755 3993473194 +207677222 207677238 +573728291 211719952 +2387795461 292782540 +4161050443 3124374292 +669533173 3349347004 +3905660158 1989458889 +2051327696 1603580715 +1121121089 2146747494 +3266527887 4284245119 +3998991021 2898477828 +2068712875 3336537140 +1895606942 2076219049 +3925494496 889446067 +4134849829 3237118476 3253896082 4075056015 +4200949440 3206128100 1494133901 +115061449 3252822841 2497344110 +2013346990 1259942440 +3899181355 3899181371 +908132187 2431777874 +4137582729 1901016373 +2187014478 759879321 +476707108 2190520523 +3975573875 2809177472 +1429308383 2749301830 1325671653 2985964407 4226979848 +2031634022 389475281 2031634038 +3083157438 415480030 159602719 +3031796337 3939037158 +1800276963 3470571100 +2911778819 3675024368 +3956985871 3640947788 +1691188335 511369902 +2925238223 1227881176 +1073644592 3435582164 +2287022891 3268644002 +1915044008 4234643936 141008084 1487194237 +498203939 3794894346 +1566159508 1566159492 +110582447 3892038932 +880938784 3367882611 1659454811 1741519867 4186182296 +2941089613 4132747518 +3867145155 3198148069 +2023624231 1462837925 2900384818 +1648705487 2181264078 2205010444 +1374228420 3051606431 +2178885669 2538353210 +2909289461 1661647105 +1277666606 1146532782 275318639 +3496399543 3369973273 3369973254 +4064484448 3603721005 +3326122116 2612008905 +4289358926 4289358942 +2659984200 3734735453 +3326640915 925259514 +1299509794 286862229 +552517956 2585508868 3784288303 +3970192835 13377456 +1719178620 246047537 +1727306471 168817350 1727306487 +4128669711 3616520637 +1433163040 3547198175 +3382734136 3382734120 +2912702242 1511433277 +1430681020 4009054086 +145642650 2652159683 +1852096393 3511494272 +305037775 994535623 +2358204385 258886160 +203554306 461561123 +1975252891 996469516 +2291934356 2714604793 +2145114239 3323318248 +192930106 71106581 +4099015147 862112782 +3545802480 2760821717 +195744404 3415400959 +4056900600 2709151611 +3581853649 3884447248 +1219415936 3945834131 +2017847597 2198737348 +1051575918 1051575934 +3984692531 3574527535 1697258580 3951265284 +4245648428 2337530177 +2763268422 2375049505 +2585513490 2881840709 +1358380922 677156272 +922341924 2940587711 +3467163956 2275118297 +359039147 1532792116 +2402069609 3428018520 +523671363 1710235260 +4237525734 2184646679 +1700598624 4052058163 +737967036 4202088689 +4081107792 1056143075 +286957772 992290529 +130608036 3065693455 +701978668 17394398 +1301710312 2031692240 +405383447 3859621045 2061060226 +480436369 2506582784 480436353 +532835068 3903976615 +1189219465 1052930809 +4277626938 3002223974 3827870670 3959250367 4037390533 3351143041 1610748086 1581861778 3351388186 62322214 2817934411 3430031698 2229251442 255344232 1323698403 3857427788 608724770 +1536437742 3800451705 +236641449 3712572942 +4016927696 318397817 3108851811 1778491944 699770923 +1912678952 2681560299 +1769317495 2272058482 +2349520563 3293436407 +501731458 3186850846 +3752857461 2536002876 +1364652731 3336576100 +4085753486 750106636 +1800619615 2262674785 +939812900 951573007 +760827245 3499418258 3965758418 3024893275 3499418244 +566969352 989599901 +2451797891 2429887292 +353601802 935377595 +4261377943 1089731331 1881752240 +3054459930 3022912765 +3663434169 3663434153 +2149924553 2781122350 +3875692571 3283962514 +1117318293 3289705916 +3096017679 663152418 +726461869 3608815442 +3984692522 217960717 +1468344439 1356089059 +4229196489 1061378363 1797622111 +3621038835 387040909 1251471456 3066633356 +3816280192 2510109075 +860674943 1090357502 +4020575841 2716783286 +2759202539 1238523285 +366798439 366798455 +4165098851 3009608631 +1017126994 443183328 +3243293503 2434188328 +3581896317 2492356308 +1303561751 1735251494 +4045037765 1819903137 +2131816246 2131816230 +3096609453 2832481159 +1888846022 22656951 +186147704 4016346619 +2925342435 1605422922 +1296140642 2969681581 +3773405867 3133045538 +722035624 2137067960 +781697509 1038498668 +2284154230 3370864838 +553267833 1658680424 +3617986459 360130834 +2459419240 3905119056 +3674619431 4057192288 276565028 +1234091097 1234091081 +4287050279 4287050295 +1586874417 104364737 382346534 +657503312 28039651 +398577610 398577626 +1039943824 1326918436 2671958833 112340999 1949610017 1364487296 2647896670 3328462686 +2314805900 3207684705 +3192939308 3297517121 +3688404810 1609967995 +2130278480 850945507 +4153233258 494142413 +1362094638 1074914225 +198774347 3504651413 +1421345879 3031356646 +3287984681 2895765144 +761741499 761741483 +1469729201 2564948400 +2602302334 2869749577 +367835041 614797942 +482595980 3561461879 +2799379381 1610167786 +293926077 3304270283 +2546584086 983034228 +4255340266 3872702906 1178477907 +1319456725 546427415 1115895916 +2766214203 2033725231 2173163417 2300940450 627694470 984795033 +1525437260 1845960865 +883682897 1000876422 +4160195852 4160195868 +4244587156 3834958335 +532479337 1602415694 +3159504540 3632489612 +1298399594 579146693 +383658354 2093174541 781391966 1908096627 +1492850616 3410384571 +1846311592 3852801661 +2276741829 1995558140 +1976184275 1078338348 +1910593995 4073625326 +3470795521 2883000982 +2583340019 2383180961 +239798 3150091921 +2152909782 3629572593 +3925553967 164256876 +3527450010 2511870333 +3082839267 2982416349 +1363082339 1227313098 +1206577974 1390296321 +1446328782 437603009 +1099846308 1099846324 +3073605886 1788148745 +650295757 3515514276 +3965620059 1943776338 +224560470 1151317046 +3479514215 3812943392 +871165776 234666741 +2882895365 2249548236 +3700736939 1251591118 +2068941151 1194619153 +1067140282 3681366237 +2772687921 2247032487 1633807327 2152328838 552124726 556183232 1523818790 556183233 2347698231 73934865 3845911684 4024768595 556183254 +4223249925 3508582954 1246556620 +1594890855 223973430 +878598253 1253060306 +875013629 509058786 +723351388 1504697060 +3059849151 3668042174 +4194724391 1082534663 +1513052360 3230188235 +2637715387 3546360974 +2610309356 3069131799 +19276068 4077267881 1001831192 +3043882824 30054562 +669339801 4289265000 +1030423905 276395958 +4139990421 173666698 +146246592 1697121681 +2371029637 1478273706 +3568244796 195241585 +3740658997 841247338 +863196110 1356436302 +936346769 1823322182 +108170632 346310064 +2575608119 631925353 +385757540 4039633102 +698074538 708323995 +1471603847 2615787670 +2663290343 3439721142 +2642884249 783043874 +3788219508 583905420 +1271352626 1271352610 +264882566 1621638647 +2824563173 3974607724 +1926695037 1166171330 +1491699291 2458590883 +1098968448 1538064252 +2313116367 3650876366 +4092942803 3728500538 +3794600800 1826377779 +1713698011 2804774098 +4242843136 31727067 3761003063 +1749841008 2421895987 1749840992 +1291486240 3270998252 +2297264568 2446889328 +3951368713 3414686766 +366183206 2180478167 +2707696026 4189687478 4241113775 438071138 3439134599 438071157 2579727609 4241113779 130700264 2863496555 2707880302 +562462161 2545422342 +1326034838 2966587510 1326034822 +3524186201 106036254 +596135096 2811282875 +835679787 835679803 +1053659457 2383126676 +1079759526 3899337818 1985513958 4136409943 +211635866 2672257345 +2844975526 2553886785 +1440586633 3034306744 +951968776 1026697674 +411810126 931362770 3006936281 4059346393 +3064602346 2010032717 +762156268 1870753687 +84133913 4260626248 +15825378 2820274478 +4188542005 2163966924 +2786972646 1727304449 +2225226271 3193492081 +3298166845 3039754260 +3834538755 3476190634 +3944228478 2500106326 3963342705 4097255146 +3850488441 1366638069 +2077579325 769255444 +2946403751 2010621874 +1543506309 1494154316 +1902342284 193604727 +1688770029 1696876679 +3135708909 1761363329 +2847256665 1212975017 +2954048602 2954048586 +2745153144 208420589 +1956924530 2847256665 +1275312244 926985563 +1791066391 631125798 +3559306316 593765984 +275074110 275074094 +3249348777 2357881358 1273295897 +47667215 3978342277 +3421397213 3846339572 +703832265 3548781688 +2914778298 1795114901 +3156019833 2595716222 +2002780294 2695633617 +4160984134 413782037 3013765687 +479617098 1253676155 +1215447013 4040856954 +2741092285 645917641 619820286 +664166955 2092730786 +1511559596 1373090519 334605352 1940668988 +349764070 3079759105 +423952327 423952343 +4106367264 1840469349 +1795723845 3279831692 +615242704 937834289 +3084725944 691047355 +1400531457 2428238118 +730034914 1642977731 +3409126432 25288293 +4277168039 1896058537 +3941844027 3539310764 +2317765021 3506638441 +1436671386 1741674877 +303960236 827604673 +616774931 4065928421 +1924667210 3788286331 +3695531025 3525531334 +2735234076 3079346887 +1012302597 3849344047 270452757 1590986222 2054237100 1936793752 +2101261698 2880945059 +1541329043 851597164 1408212759 +1032575848 1261069501 +2970117180 3962948199 +2159580209 3549514022 +1267433415 3239182345 +1129841996 1334859425 +847216255 4256440808 +2148710013 443893460 +4072584230 3675236469 3943678363 +577265357 4149034162 +241775337 171634776 +769077617 2596459760 +855082109 3917424110 +447651961 2045156968 +3985929743 263575960 +2631345554 3561619065 +1289945029 3461915418 +3809924705 474623110 +1993436473 177395920 +3138216613 1472860125 +1221773107 3619967607 +1663685059 3721737725 +976449317 3109695580 +837929984 2678334469 +1110096653 3821332686 +4149737570 3644297067 +1526801212 2127198065 +2498684672 1947575557 +658757284 1942676521 +4063289255 3924825056 +586644223 177643368 1448267328 177643390 +792088627 2239774810 +790132124 3212911761 +1938753110 2913942304 +1969886238 1465160745 +4052518357 355905098 +3368568342 692475057 +3302019004 3306999203 +1035213240 3666115771 +3188722854 3188722870 +3829093753 4072412092 +344965824 3234728946 +668165630 2707567180 +2868392189 565517890 +2256746979 3727618247 2744393820 +2765421046 1900379729 +762511040 1751590114 4094821531 +3619219139 203063016 +3934130132 3588718911 +2087897424 3702065894 +442439929 1306127582 +327284452 2998855375 2273006052 +2885482321 272192646 +3202279482 3001520989 +2540291958 2606568257 +1152102677 2012847021 +3583886523 2076430083 +1491150162 634421608 +160776593 4046224697 +867899630 1569210041 +3398428219 557255173 +3227674445 10565343 3247109310 722065178 2895163738 +1223726841 1876535015 +3742925623 1788252048 +4224187190 3268918922 +1552199407 2480890424 +1698559261 2106121396 +3413881688 3413881672 +1104389223 120311350 +1661531196 588806759 +939069114 1553967509 +3201477071 2985444378 +1789824992 1458162363 +3298933892 245089225 +812098992 3017335640 +4083645486 1508408422 +3170068979 1445965898 3170068963 +627483770 2136992225 +1290854758 2234700695 +1797202354 4220108594 467247879 +3856487164 3427474599 +79874671 3986992302 +1992775945 1992775961 80816440 +2807117442 2957304774 +4069090589 130302740 +26608781 382535652 +2841398774 2454633031 +3987944564 2770047631 +510434867 402459226 +1166363413 3097347501 2245341706 +4250492216 2407789523 +4277642697 685374328 +2368409606 2108896088 +245760476 2980953318 +9015199 9015183 +421864475 1353101768 +3285662671 3195973147 +898495539 2172087386 +694354668 316512641 3680911947 +1896757817 302347000 +1100982956 3693802455 +3996400175 8665964 +3764363596 3764363612 +372282801 2675680688 372282785 +1227955285 4012680161 +2847802706 2283954195 +1318383254 1249089070 +4196294887 826158786 +3768112779 463060180 +2406265404 3523509953 +980605752 2625353898 +2192803027 2476349498 +3356949144 2485943629 +2297832445 1877387835 +1767792800 2140281843 +2116172155 182484146 +1298081850 1611401110 +718756300 3813310925 1525885751 2940651769 1072854045 1095252406 1484443650 2103917513 3922667410 3909615774 +2064693839 2621704347 +3209554065 3097828432 +1715240012 4288884321 +2594258451 2127869932 +3319187702 2613686465 +2167626855 2045246112 +2710117676 1747951804 +2411735039 3393627969 +1070545845 674954723 +4263859111 3150098422 +1185478778 2046580733 +1149335781 3145840214 +401054690 2207933635 +2165835955 224846880 +301503182 407837273 +3037476175 1362619214 +1560091340 779169569 +657208147 3744262173 +2985174043 887281298 +2015711645 3216996898 +3893072293 4013311674 +495111776 1455453064 +802413717 3749985948 +104110263 2076993542 +2964422083 2964422099 +2160628159 3425624705 +661126116 3875862912 +218071770 1346043197 +1483048142 4124053583 +123776234 2268083291 +1755384755 1753574092 +2946547259 2946547243 +1610293968 926445355 2933974824 3898068323 +1574842703 1574842719 +2028094879 2267275391 +3839395121 1910090800 +1612824499 2543383351 +4281259260 2998487207 +4157770225 297345757 +486402635 4005024770 +3097112964 515633865 +4182267539 974361879 4292888940 +3613317969 1532182662 +518642785 187034784 +3882487631 2599819598 +2475158877 4053314462 +3397069151 518135966 +354831815 4045026483 +701203444 4164041934 +639235020 639235036 728510967 +2204451603 2175112599 +2617052174 2639919641 +2385321954 3003723989 +2540818668 2540818684 +3150691218 867714771 +497763669 3992185325 +1462902742 2942767777 +3939132868 2567639705 +3418431605 906369066 +1283911759 1718827547 +2976061164 4079581413 +1786452064 3353002239 +2308260728 234436091 +3292941230 2829656825 +2526675107 2801246915 +297979257 1272177701 +2367444520 4143864672 845797427 +1673118525 1741640227 +1508548493 1508548509 +4027680622 2904170343 +748352143 3337344782 +2588186330 2092547747 +2153770824 1594207819 +370230687 3215831308 +3785484504 3510432922 +2336133031 3513547172 +4017643499 1194930302 +4204721154 3162440714 +1780266765 406071666 +210553924 94736159 +1645897824 2884633865 +2259819860 3021409720 +2459903341 1861632978 +3283410287 2226689464 +3278732365 1869222799 +3177354352 895618930 +651840820 1571260623 +1503017046 2401378081 +1329725879 2078847750 +128005409 600220384 +1638056365 1614209860 +2880207140 2224424060 +4168039191 3270912643 +4076052136 2260603690 3006109107 3856144352 +3189078779 1851855784 919640370 81518149 +876282743 2951115846 +2904268034 2490909509 +2711735723 481739810 +1615183716 4056697471 +2743053724 4261301393 +1766328140 2207422492 +322856389 272250124 +79762555 246943040 +3160563950 3717620071 439179418 3619986103 560747466 +2516957009 2080347270 +1066234115 58406130 +1808981350 586319745 +3221393509 3238791513 +3643695895 3046865478 1584240848 3616055960 +1815275286 2690152746 +4056224659 223286196 +940144932 717963406 +1815531778 1548420643 +188141056 188141072 +2120667331 1848545968 1832077949 +2965261039 714077742 +319040273 2757608042 +212851429 3721762426 +3121411556 3328644607 +815695867 2433737481 2063763913 2816552354 3536414910 +2469627079 2469627095 +175018493 2783341300 +732377419 53647636 +2297049533 1168919682 +340831437 340831453 +956422351 2847050522 +421540582 893551654 +2968324873 4153267566 +1031295652 55538468 +1856013129 3120079186 +2064916193 4286233872 +799759864 3372335763 +2734361335 2284995280 +2740885275 1223155602 +3287180622 3908295338 +1373719179 1890080962 +3509614662 2504873505 +3153232283 594603936 +4185134693 381632762 +3194055670 3830746071 3693217482 +3701959891 1436565447 +4123916411 3225697106 4016655368 430515291 2228002149 +1848291064 1697738875 3166515217 +3839136381 3080886996 +3541006212 1951721583 1800723017 +2251444831 597307745 +485971834 324973853 +3921564508 3733062663 +917528160 2007273765 +2445045349 3500263660 +957302750 943738345 +3126226365 319733890 +1216873112 835156143 +804757288 3719911671 +4255116504 673650215 +1247456092 2962365447 +4186625360 2227810984 +3521072099 1166308938 +1528152828 3038180419 +2653842953 202848312 +1752343224 611723181 +1315567984 3771968341 +1608170620 1633072945 +3684443964 3090593265 +2343867348 4230720395 +3718545114 3718545098 +3324741503 2659022544 2920738065 3932885291 3932885308 1971735784 +529279558 3733955222 2459547706 2049882759 4020669473 +644280003 923393258 +1426430754 4191368853 +3327483223 157540206 +242000931 3624297226 +171790133 1401139324 +832048327 3577255262 +3972784736 1396810029 +1923355753 3231128383 +1276693921 1812706400 +2736940173 4280313842 +3588981064 2661163971 2814660645 2965659235 3993169648 163349579 +1803101973 26852969 +2397991493 1180557964 +368345631 2934494942 +3012664134 4097273655 +2951618785 3571302966 +2269702885 3704211066 +3922942365 3031831092 +1526782717 1062779970 +2126687294 3396674975 +2240567051 1189938754 +2771926841 2309299465 1351321278 +3907763265 99171245 +1932283497 1932283513 +2617836825 3140683336 +3712848581 639503386 +9661319 1863468438 +202344118 3814202634 2993754247 +3225040025 882953416 +844963146 355271494 +326339674 1632641282 542163247 +972370873 672419954 +3520711561 3806030008 +861308844 2100794305 +2569368085 2783167674 +1768332242 3737509956 3318069480 +3484000535 1386939522 +3962579071 1322237928 +4273858471 2884873206 +1953413717 2672776156 +2866100549 1397312613 +2637601600 1021457691 +1018500793 1242744104 +3233599590 3476820126 +1340329106 1436223955 1995158002 +4095004407 868339408 +66163796 2514731444 +1586076883 3922978112 +4191485461 1598814986 +1824062051 2318543324 +2472906667 3017878050 +41175926 1393740487 +1692859009 1523243431 +2516581006 2441181199 +1595885714 3362408157 +1140202595 1601089500 +2463797306 1980482418 +3306672748 4080695932 +861833859 2848932464 +2266870072 3955096365 +434366734 3485982991 +519276837 3730892090 +2670331503 4264042670 +128216403 1524111802 +2747978420 1885431527 +1812555109 2009767418 +2821516720 1678992651 730986184 +2821093698 4136690403 4136690421 1668344398 152382301 +4201790770 1943426469 +13066366 3664662560 +3270916358 1534872186 +96650692 2849398985 3982396414 +2190794710 410039814 +524974137 2067481022 +258484384 3774346213 +29521092 2300432543 +4230416913 3946110733 +3842528194 1310448227 +3893409907 3310509324 +3592471900 457093184 +3407952389 1397827133 3394131418 +2272474311 22811990 +294466657 38368416 +3399305739 10194754 +2602603408 552663951 +978118282 1359932205 +2861358652 3072834032 +4048145240 1036762403 3252440080 +3749144083 4013659204 +1722905925 4041497667 +1667834604 1786902913 +1799782483 855376570 +575588757 2533840266 +4116391932 981463473 +2102846050 508135805 +2902315309 1092896889 +367190676 1590455924 +4022648430 4031680238 3770140463 4031680249 2123192370 +3237532610 729631197 +1962324668 3696975335 3696975345 +1555479651 1249933136 +3664051720 3851159843 +3809488373 1735940266 +274737853 2221098900 +4277626914 2892890116 4029510495 4202547105 +3517067580 4008685932 1045660017 2390017255 +3154254146 961397475 +21439964 3741358417 +763495467 3467415458 +541131277 3545643634 +3668970448 2423650799 +3928888747 508578178 +3156674087 1483648886 2520650788 +1792424699 2767180712 +248824741 2060114122 +2667252922 2340214677 +433477361 893028246 +3845980525 3845980541 +4005424751 400356758 +4038004184 2633349283 +1585976317 1585976301 +3084786628 2290274503 +461444917 2861796432 +980083119 2772518510 +787053824 3650078483 +442571288 3778028512 +1738185324 2220955649 +2024216506 2836027851 +2189882736 1714556047 2665654871 1976706790 +857261038 857261054 +2317383780 3575481705 +3893248501 3893248485 +3650450569 3118996217 +1103893278 2990676031 +2373378506 2082828525 +4177707441 1053937728 +603874063 1143810859 +1145500219 2113897275 2486932978 +4163925995 4163926011 +4157935867 4157935851 +936021144 936021128 +1833010247 2524385092 3951740953 1159936960 +980969356 2542469495 +4118866857 310458126 +1624481265 591876388 1331428181 +2727597328 2242655632 +4091519899 2215546130 +1424022657 788215888 1424022673 +2454644938 1346482075 +4276494093 3417871168 3493606435 2747518534 2160784276 1274640960 2926614437 2435683672 2028728211 +2152136679 3603224758 +2822095482 457568353 +1507977615 228764689 +2606138552 1093856699 +827868513 250951606 +2416603984 276006633 +3806308110 873724697 +914622186 914622202 +2596395611 575401829 +1693858284 1388140659 1783948307 817964854 +1760088227 3599790561 3509667206 +2932538828 2932689888 4119693345 +1213952655 1249237038 +2226648303 2510183123 +2121332106 2513602605 +1952224154 3351010173 +2416549259 1183361054 686599797 2300305592 +1110020491 1110020507 +1439457856 3777418252 +3865016114 1599718830 +1659386228 663908761 +3376407360 3376407376 1224785164 +2435624860 626553479 +1989035759 1896281659 2432281144 +2937227398 2713053474 539814647 2645942982 +1546154346 2108328397 +4121187978 934886885 +1322371324 272589991 +1012994187 3418885039 +2157278741 2152260362 +2341975902 500541673 +2868556887 3899876820 +1160226811 3631050802 +2313163144 2907834548 2478545181 +1830094241 3402605815 +4209998187 1912349538 +1394799088 375938802 +475722217 2351616462 +3776884957 935173806 +1553414555 1561308932 +866828250 1764396962 +3077084923 3502196745 +4286569662 3431273993 +3195830029 3195830045 +962573267 614995244 +1311869547 2197612130 +4134827839 945272872 +2459452935 1525445417 +3689698297 1759841525 +723378548 3835345887 +171627651 2644281898 +4074033729 4074033745 +1828325791 3188534293 2137106959 2780745408 +158830609 2793915661 +1340738397 711975778 +674600481 482890310 +2262125421 4029305778 +1409738664 251449436 +2237612552 3331971648 +2139213675 2901218703 609846644 +2613964184 2061560613 +2884258463 2728960533 144465096 127687474 +391256335 3309138584 +3107514966 3115394930 +4083932008 1771869571 +2057523842 273860253 +152203877 1625228682 +2646507888 2053193669 +1365766090 4036918011 +644576564 2938732751 +3110601144 3907672432 +2469019714 119351735 +3117528879 3022216952 +1167709304 1497980164 +4134184160 2346538914 +3684731293 1522049570 +3040555868 2821839313 +4007308415 1541619243 2168294376 +1475879974 2711676865 +955524577 1794295825 +347256908 3780648865 +1394539156 3309783551 1841592057 +2598952567 1402352985 +3971139467 678436820 +2398943119 2805577240 +1476621989 641745866 +2091744670 3810312127 +2875201368 541376411 +3292332068 3846096804 +1615124739 2405539754 +2577842750 997408585 +570318672 1865498612 +1376437885 2750838466 +1683739826 2928661555 +1441270159 3410430990 +3425157535 3335661643 +3097376360 152020395 +2179620929 1686272368 +3638200712 3892740363 +1178574653 1178574637 +4277235865 4011081950 +3253472505 1809416050 +253887174 253887190 +2768851793 517496336 3553266336 +1361857929 1361857945 +2605152753 1623949175 +3846811693 536893138 +183226088 423016253 +2431777871 2822154753 3141386470 +2353612155 1159733800 +3480308242 2706872901 +217300878 4055272591 4055272601 +4187496692 415421198 +1317226832 3903613155 +3473874275 1472938698 +773308181 2757873180 +577111023 362295608 +2868246144 3127723230 +1165029027 3624755482 1549542515 +1550690252 1144647093 +207042418 713155381 +697307473 3200991888 3908683524 +1276386927 2090817978 +28428696 1121999451 +1147996938 3249037485 +564835545 3420822462 +3769629901 2181756594 +416113165 407984740 +492734036 2423328137 +151125536 1714193147 +2218539551 1238335198 +802910013 3300413945 +4120946306 770055861 +2533268577 332410038 +662825249 1384251104 +94048612 924606591 +4270380562 990349736 +1366798990 3446543759 +3842010532 598513983 +9160895 2601321640 +3628475652 2053915999 +3690558599 3501355136 +2368491803 1472441732 +2532255216 2323167445 +3613559673 713124100 +1505160537 2482479880 +940144946 1760151987 +1250905547 714569346 +2749406012 915693415 +2079117704 3776967932 2282539189 +3089254286 1811326095 +2573077997 1544547346 +2718168784 3695020387 +2604205937 2949770240 3346433043 +764910863 764910879 +2887056880 3574317251 +3797376192 260506195 +1864181527 31754544 +2743670288 2160966453 +2830828520 2254906941 +867463890 3804956465 +4081250762 924304582 2319674149 +4275453559 4275453543 +681592051 2070275213 +318605684 1495228825 +4177432646 1052581431 +1992037184 4250481300 +1870119419 1954962980 +2333767479 2333767463 +3441717906 2187353043 +911263580 3710506449 +2220020524 2220020540 +3768635539 3768635523 +1756742937 3584935422 +620918993 1597586068 3402102508 333721872 +1202838538 1541668709 +904791003 422311816 +2876746002 2876745986 +820572632 192686451 +2637330090 544263565 +3996237604 474998207 +2260682016 2260682032 +1501852012 2167255075 +3605689531 409094533 +3012356408 2179011763 +1353928938 4098383963 +503180275 700084122 +949162740 59168280 1062007957 59168271 +1002599037 2605350773 3930497935 2417638082 +2897944717 3679743931 +2344094140 2931249905 4221014384 1018666732 +3143736332 111716087 +3358683870 64476031 +2379094301 1483835554 +431176989 2452174004 +2516576036 1171840447 +1222394510 1086113167 +3778746512 554810108 +2209102066 975021285 +3377179432 169766891 +803590526 3838363999 +3400193199 3789963835 +1385729861 3965951357 +4193297116 1372610631 +3641707733 2302948163 +1675632456 2177973835 +1200568799 3182462327 +1160967142 3577082625 +3128598816 4099235308 2936776037 +731574503 2347318198 +1212793025 4137553382 +668803814 668803830 +2235175128 2456323076 +740706832 1411385468 +1204340205 3993998340 +2179935904 1552086548 +307113858 1393871285 +3286975385 3118966910 +305902893 3774756292 +2434881056 2541392997 +150980864 150980880 +1783987183 3338515258 +2814483310 2189810963 +2155860626 3677912019 +1905549396 546546735 +725130454 2211522612 +740793518 811312623 +2909027472 2227918499 2227918517 +2628184280 1925221403 +1570871918 3546684217 +713642513 713642497 +1120035063 1792897908 +1772488534 3080725619 2791148657 +395077189 2531052650 +1593575199 2492753313 +851000897 446496854 +792376610 3433724477 +1796944407 1796944391 +4161098948 52242351 +3312388566 1908588960 +1694263657 563432142 +3164712956 4001892785 +1496428305 703655094 +1937678512 1427691849 +860478855 1196098861 +780410876 905861543 +3042196562 1712394098 +755157637 13899267 +2342977123 987919818 +3322815501 2734368383 1696596641 706016100 706016101 706016114 1998124603 3577921650 +2911234961 3134313798 +2741785162 1144586163 +264810476 3303862401 +732767174 2274316449 +1926143632 812626173 +1140971178 2875329285 +62215124 2434806272 +183095291 689072164 +3529569970 2062088734 +1650652925 3737833547 +4051468669 4051468653 +3259435529 3247617299 +1240123997 3943602436 +219473431 2934322726 +4208942357 2200193923 +3856504903 2550350674 +2860944954 3328963843 +2956598102 3245934695 +3046847835 1045757522 +1665804897 2931865270 +2325868823 2325868807 +896231485 1427445780 +2492057209 1306751080 +2357954430 2357954414 +2152855892 1426816815 +870619254 757728314 +163698038 606433098 +3381981168 740119282 +2269948733 2269948717 +683581356 74358179 +500113553 3046863850 +3589215732 2458622868 +581058177 2976393877 +217787597 1013417650 +3282852089 3282852073 +32910414 280059865 +3095450545 35336769 +2915773158 2576497713 +1885255125 1042943610 +2177583820 523886236 +1113527071 2594904542 +593344607 193543582 +2404167547 280510116 +4277377803 1446600182 2229525039 1685918292 +1754977065 3568986510 +240549621 1894042778 +198008103 3142165622 +3903097628 486569124 715383428 2751305183 +3132130868 400769999 +391465801 71664632 +538651892 3587341600 +1314350542 563430214 +4288106410 1632488103 +2520511694 1315070041 +3334942189 3180317378 +200516948 3277902504 613237561 +3770027001 2908526819 +1729419754 802360155 +2069060166 1925281161 1781996606 +2971078694 3981339585 +1131763306 2612463835 +2047638500 3943647460 +84814630 458091713 +2031798051 3358030858 +3340727928 4001857261 +1643378737 2864327361 786418310 521878583 1678751014 2864327382 +3386543377 3271650621 +2261787145 413680750 +2017350373 1910516259 +3495647378 1473307437 +2317597206 1820448481 +4037934690 677119357 +875062233 4103417502 +1771719838 4123547092 +600790495 1068791434 +3285171471 4285245787 1325833880 +3113794868 1601296601 +3783981481 1359390864 +286593915 1596828324 +1857171421 2057235413 +2137873032 2137873048 +4276881309 3935304756 1856633961 1567567895 4090793842 2660784472 +3651382648 1958567429 +929217096 3990142819 +4047157477 2758873196 +193691438 3420970385 +3828044768 1805875780 +1588908284 312802471 +2537429787 611278185 +1906051404 579871167 +1214838203 600920910 +2090120534 1947825777 +1429881894 1354319809 +3393806738 1555862587 +77297664 4025761755 +1304127608 4123401480 +2763824904 1559124363 +3045186895 3310969740 +4132122083 2767712989 +2354415601 3685023856 +322732144 1631510889 2519738697 +3373443197 90127554 +1061447136 2623180973 +274601986 3323972405 +515208390 1688160529 +3399384964 2072165599 +1710860185 3919990403 +4240005310 4240005294 +1053887718 2796547622 3373747735 2796547633 +455743415 2051233040 +3423965427 955461274 +311791467 3528207531 3102363938 +1590458069 283054428 +3309412089 907606876 +146349490 1886911834 +2509306002 713631422 87510469 152011565 +1565437688 2636341632 +3597573371 2334203684 +1641133126 3765982343 +1430400966 4247860385 +2865370569 1263893073 +137429592 3592134383 +2248076857 693175230 +1824660371 3364972652 +773746530 4226373443 +1024153514 328211774 +2533164080 3763181443 3763181461 +2244628789 3323496666 +3627055191 2873979120 +1936142073 582128495 3634819806 2758734334 3634819785 +3262019384 1273343291 +3291319199 1924320094 +967630955 1517094163 +1966748386 1822300611 +2313479051 2656187330 +2357231100 709252007 +223440444 858818673 +1699423599 461846700 +591960667 3863674180 +4003064092 3091855121 +1515963667 1366768876 +2046017082 884241739 +3320709712 743367080 +4044088451 4172855868 +1914764422 1844149538 +3928399869 2546850626 +3491052312 1980670416 +36542704 1987453515 +2096209426 2096209410 +3758787288 2291700251 +3668615006 2560155903 +2881521090 171528745 +820159730 1114961549 +4191661498 143031243 +721414987 4225722132 +225257063 2312336438 +796281829 1752840989 +530743388 277510416 +1204588602 1090980701 2916188054 +113900171 989161684 +3344980343 1403835984 +1430199000 2352866489 +1830884761 1679097822 +2293134670 3004254877 +3140568937 395536984 +2414769136 2220917443 +1390486977 122117902 +4290506398 3387417278 3389534911 +3519517970 4211782573 +1359238934 1131690999 +1108792354 737145237 +1879208869 4175170746 +2528779836 2528779820 +378876780 4175426327 +321622977 1909168358 +2646880095 3134624414 +3982614587 3960732900 +3955760386 772123189 +3100795012 1999499209 +2254287977 2212301149 +1936540501 167837404 +74625149 1696591202 +4282288909 3698648434 +3488860819 1876999078 +3067077232 960591445 +3030891572 2707312487 +3222674269 2562186736 +1885729246 3464216703 +2725146028 1437054524 +257081577 138784472 +3583453302 3002380753 +1126248305 2165986305 +1490817958 2289233473 +978936278 452276147 1417655837 3052580714 2964653041 2964653031 334832801 +2857334524 387468967 +972075411 2961106967 3370617452 +107064545 3972212256 +555028169 3710273134 +4196951851 4170868898 +3369813312 4033867547 +2900457209 535710184 +3417219763 1458184140 +2566216470 3762185137 +3209008431 1233770744 +1991917589 3167993337 +1514310758 2093155479 +2960203571 2939339769 +3430408398 3430408414 +2405113412 4033914143 +2559023782 3279450967 +2669246266 2669246250 3954673154 +3377250040 3687882875 +2533164067 3545072394 +3277388247 724330896 +3341546390 540046631 3544738913 +6879351 6879335 +702092304 4038759733 +1250294209 1250294225 +1181293942 2579462735 +4173899507 2531184780 +2432148830 2480493311 +3165384750 816519279 +2587922101 356130835 +1563551610 3921416259 +2844120475 2048197742 3118746405 +626010025 1714319128 +3126621205 1955249418 1955249436 +4124098749 3841141385 +4042741336 1645698887 +287501241 3002668072 +1925279273 3481299608 +4034370141 1301843883 +1677143639 237334466 116321909 2700663587 304444944 +1347014542 4131570013 +1990836280 87660589 +3537376099 1977800825 +2717327813 4015430259 3171559706 +188354652 141017287 +2284312782 55818618 +3077729386 1466758853 +2809853479 4228613156 +1196734455 1884364885 3059294818 +2544651158 1513815345 +192160300 869387095 +26871529 2715483274 3417422243 +1350500711 518993206 +2921597016 1110573909 +836025036 1038225207 +2770871517 4056049877 3677489122 +1576080704 579105733 +2852183888 2622023299 +2014351487 2165536744 +62165526 4292505334 3946969255 +6654033 786879895 +1637931022 3863336464 32858065 +2867484652 4209535127 +1836509634 766529501 +686332251 686332235 +1224780907 1460628605 +4132727766 2632303089 +1311903553 1506673494 3041869937 +75612739 693280806 +4177610313 1174512888 +535122534 2617292417 +2759315902 1804966622 +3028572583 2505069476 +2071215495 2070859225 +4254567211 1620055202 +2684162638 694407385 +3975978591 1890406302 +2267819118 948564281 +2307446079 3244798526 +1106772260 4251569087 +2830741337 4115597576 +3071890253 3317063729 +957531163 4085954180 +223430578 2566112277 +1704559973 3646148765 +1240714816 1240714832 +1175000276 1660930158 +2498878030 3334121689 +2806249223 1459478550 +3461915920 3851147317 +2838888153 956313502 +2776465149 2173626434 +1952439404 2666003991 +896793010 3616674597 +396294386 557966579 +2341271837 2797860610 +3019466809 4134071817 +2450480061 4202605237 2871880322 +1317595978 3951715693 +1235189176 2652039341 2227456083 +1566182938 247739115 +1084854196 745519723 +1274734630 4000419369 +3439682857 2159933861 +658745540 2474814601 +723678303 508886888 441776395 1178415496 +1700403887 1004011896 +3268657691 3462041746 +2080780914 1478528870 +3606836622 4238577295 +2802352306 20292439 2757924901 +3160669482 3102117075 +920608496 1369600981 +4078414057 1608279425 1884066262 +2241495953 3812433232 +833255169 3810382631 +4161177821 1330213876 +1359103014 1112406450 +1284501910 479809329 +509416204 461660123 2557943320 +3440457621 1729789852 +816506948 3775636233 +3337697155 2965005116 1142400189 1902786407 1902786416 2965005098 +1114643440 2318130507 +3853645639 652572953 +589640650 1203573547 496010989 3196525254 2240052517 911580141 1208806090 +2918702294 3006309617 +1302816342 1302816326 +2218005344 2113568805 +3293926958 1079421551 +3202099535 999985051 +3664077680 765161523 1340764505 2514411820 1356411100 3664077664 +1828393885 742383650 742383668 +3943794558 3423201825 +1959561316 1106949481 +1979139020 1646948931 +3143496909 3253231282 +732983822 4275403662 +4044061837 34935268 +67640435 2998923903 +336724183 1867993702 +2731467527 1387226112 +1749208087 942098470 +382162291 375447264 +1095510916 1323860191 +901134224 2911213369 +491688926 466367661 2356045578 +2701772666 3621949128 +3318824474 2187641597 +3191504031 3507058667 +3436377159 4169006931 3071708096 +3927687277 3908032210 +547675595 547675611 +187838942 3858070018 +3471317813 2308203226 +3794450829 16859835 2081244389 2081244402 +3274268365 3921644594 +1140027332 3157848457 +2409182619 2838455058 +2434603770 1792112541 +3546671762 3607386406 +831864337 519091398 +3989944669 3989944653 +2116215614 2059374882 +2730127764 1891703017 +2807001665 160095089 2735791190 +863075702 1906868433 +2369840931 3574295859 +3195664631 3617246068 +2511541683 2133932343 1542138060 +3055729944 1368196787 +2165376724 30261177 +3043578231 197869136 +3053089546 2202212525 +4242554196 2601871827 +3480784331 1707554434 +3113147842 3117115945 +3256434673 2126489702 +2528939753 1138037224 1715711065 2528939769 +3130054861 2790438375 +1135002702 1135002718 +3049025146 2443307549 +466003668 2377686960 +3296916878 114846479 +2219247927 2066911308 +1976104129 744049600 +1472369670 760153441 +3064736734 1245827583 +3453961642 3229264525 +3216870499 2290950749 +745626928 2511697625 +535395834 915493003 +4221981528 2127901595 +3146104005 4169673235 +3475714303 3306067644 +20364400 3790473918 +2786600668 1409625168 3725009245 3795420532 1409625159 +3271677733 59955293 551923514 +3074457827 3074457843 1569383754 +2544622928 328033507 +1575144432 3154578133 +2986623578 2949232078 +3373007591 1692963254 +1390069153 1390069169 +758863703 2339012080 +379778717 1066023220 +2338590808 293907443 +2072619854 917927641 +3449705577 3449705593 +2201475183 2201475199 +2197964328 1687449853 +1168321246 2111601513 +291139529 442366318 +791953497 2822851614 +3945519270 3691384129 3945519286 +22798503 3725374131 +1371962763 1182245314 +2294387385 2294387369 +2404569577 2288021976 +2069252490 4053645830 3246647538 3000353851 +520810408 3254934903 +3693785092 2603816521 +4092922864 4191785864 +1520327952 3379420781 +3370365186 2462222621 +1310387290 258068533 +2752682651 2752682635 +1917243328 2776173381 +3655438502 2797565926 2797565937 +3410392441 3620986206 +426260593 396673132 +2006920748 2073407297 +2447381099 2961481438 +4243720068 1854381869 +2590653521 1715270544 +2036368903 435354880 +1667848680 1725466685 +1278749430 731446218 3866026710 3866026689 4067139911 +2523175298 2523175314 +1093561107 2251750784 +3034388166 2114640311 +154207218 1781085683 +1234692602 3559216285 +1529922413 4207125636 +3173996444 4234363473 +3625586270 1647705088 +2896673675 1460419540 +1206052653 513165784 +1688193106 1419985512 +4077205056 4077205072 +2485905556 3575587055 +4185198963 642414618 +3594978634 4260090442 +3282931253 2077834852 +2373476606 2994778057 +2583497379 207077020 +1107331288 3201788941 +3738911840 3024409389 +1743360034 3206144827 +25982404 2470686895 +41200508 1841192520 +3489382400 3204193610 +481039932 1592197223 +3894127606 1502590033 +4179093605 2242041594 +628433249 1482918816 +2543981256 2082705629 +1135137436 516131719 +3220017684 922547567 +1301620091 2130645060 2630484141 +2640640310 699410329 +4092585778 883487653 1578457851 +2414895535 1181337198 +1683367243 622061052 1422111669 +2669604142 2954048893 +2487851559 3740583987 2531109728 +566489978 2709014813 +3690697556 3690697540 +2713626106 2713626090 +2308420670 3620781471 +2435807187 1831591353 +4291205344 2242029747 +623469347 2737246208 +2229606688 1455898335 1439120697 +4033507931 3370014766 3219016200 2901964645 3532784978 +4050801231 1423849887 108614126 2177810606 +158944066 737245439 +1533965411 1373714378 +3940155173 2806723920 +2388731686 1223729367 +1885039340 293319088 +480294962 1124202163 +361611343 1025883217 +449461307 1734136050 +277307519 2216486910 +1691726526 2053660937 +3195548654 407454508 +1875662115 564790794 +3635428323 7226972 +2840109456 3018386411 3393852600 3018386428 2840109440 +4118794160 1590040331 +1427610814 2111415494 +1145557091 3758951370 +471438958 1040918254 2856832815 +324445908 1164484537 +3002046665 2016248935 +3924298354 3924298338 +929444660 2293875592 +2616623872 2106180315 +3990576557 120586553 +2283184000 3147634323 +301711905 301711921 +2746364241 2067323104 1988581527 +115884061 1854660838 +118823922 400409997 1003813987 +20079179 760265730 +2466216464 2016225077 +2866963222 409074599 +3795614471 3124716959 +3961457218 4141688309 +2755076610 2227865909 +2019419628 558290048 4008558849 +1592102185 2227074201 2354919310 +2848577749 4194776947 +1016175368 1630997899 +64352136 72371852 +4027255459 2220998282 +2029533443 1908522922 +1308410874 3201665766 +1972025478 2883687110 +1846871741 1112526260 +2401467872 887039909 +3565648482 4081428565 +1216699543 3237003686 +3458006956 1558346406 +30993695 125650888 +2385251800 664058019 +3338594944 3276482451 +2596193575 3243269216 +2096636255 429688968 +476426978 196742653 +3376859254 1349358023 +1321647148 1028413760 42475841 +1946516751 3013861006 +1781347514 438255509 +2538275255 3792941830 +3538131754 2440007869 1670931294 3383333492 2547893508 4124582580 2986031985 912923196 2065047533 +1856531262 1897976457 +3336547383 2892834211 +4167570372 3030612060 +2406074834 2412728665 +3611311605 3475081404 +3398085216 944387365 +2846428946 656587077 +1941989356 71899475 +1243685902 3224093209 +729098982 1332906007 +787550336 1702689157 +3217088210 1073520168 +2215546125 3097668769 +759067744 2077457663 +2913028866 2978079589 +3629836151 236609606 +1659730006 3723780924 960516571 3833192121 4205428440 +2080475995 2439929938 +3005971647 3430244520 +15787144 53985821 +1120829014 2165367143 +1259002481 2467684326 +2625368431 3323793838 +3142265168 659687651 +2138649790 1775109919 +2574959749 558062924 +2418455384 1156338587 +3071719412 751015183 +948887486 1945110812 +1645115744 3167294003 +1274385528 194558203 +1481386329 2132348303 245589033 1491408670 245589054 +2734631780 2703126360 +3790187963 1574731108 +430964438 1175333617 +3175238215 3741360887 911928768 1361331539 +1038305134 3670635055 +3535111788 6002048 532847617 +2625877631 888951279 +4034243983 406861838 +4226553130 2982205176 2739003931 2396529875 195117120 +1348775077 3319491036 +2955841446 4283179585 +2876152331 2802853877 +2887664712 1597706224 +1351500873 3471625845 +3821266835 543526010 +2133770862 2761691961 +2341764463 1938575547 700544440 +2370819574 3108251722 332031021 +3049408666 2600051638 +2173851149 106788466 +3087579569 3087579553 +3779043235 975719818 +959889469 2649297819 +3109964434 1634690003 +626473621 626473605 +21555783 2686182738 +3791713590 4253156369 +370407118 2406319695 +1352320692 3689849812 +2935192223 139069534 +2875961430 3336589525 +1822972393 4127558087 +3525723423 4047425480 +49770123 3937046318 +371344523 1660020436 +2042872329 3089789998 +3429794989 1955026271 921228548 +1758570477 1758570493 +4148372565 2477928924 +1587234835 858759831 24278508 +1096781057 3932878998 +222085943 222085927 +2565345516 2182575860 +3926847025 1124405462 +706661632 2538873640 +1382143310 2841881245 +3971798635 2843276430 +225205190 3885267105 +1039909201 1039909185 +869525307 3516203492 +785479869 1891701131 +3947619101 2239137460 +412176849 2109983760 +3870203515 2919736159 +3904963048 1339424829 +1814295378 2354568187 +1244758592 2413884443 808070392 2413884428 +3023201564 3634413700 +2712664846 2712664862 +3892932571 568006084 +1040810656 3412518541 +357379440 949310660 +4001398811 2403969682 +686619067 671949170 +3653796637 821268757 +1244439024 2589643613 +2195743457 219007472 +2633782746 4214957629 +2158115586 3937136014 3517784861 +4210908904 1677068318 +1795553693 392688162 +3802268225 101289046 +1104617095 749014656 +267208719 1408843355 +3612182889 1477398599 +533975489 2082205532 +3807034428 1938182759 +2057125401 512278878 +2110325096 1802319531 +997311052 1641604192 3759463841 +907841453 4162915859 4114980570 3250508864 280399124 1746163930 3927663887 +1714421176 2509007021 +2383671886 4150685903 +2483035053 2838204740 +3158857217 1725916054 +1034029446 2081147847 +1076261577 3582380936 1076261593 +1068306659 1593103440 3195162769 +3766278405 4122597145 +2734303730 2014422366 +179852939 3196490281 +50844921 2561081986 +1905897212 1407109292 +1771701204 292816559 +2545527434 3002064486 2308448666 3851298054 2554963418 2223026674 2223026661 1746715827 1665627963 +1149785191 1235017248 +2413731856 201641140 +3886429284 245660031 +213851163 735657618 +1725762606 469380217 +1537265636 792716126 +18913896 777195947 +1254052218 1871702508 +3475722469 103831660 +3072788579 3044160458 +486402631 3937914304 486402647 +4011303613 2928069850 4050185831 1607989373 3747347705 4044291353 1781328491 +4197188062 2974216319 +292633338 2894090179 +3051606420 2687464308 +2946117290 431453581 +778056269 2869382066 +2231429946 4291375642 +1549900993 782877632 +953628009 933545535 +424000529 3653701327 +452707319 1901428166 +1738982973 523917804 +1586340148 217367759 +906713458 2245906035 +1718135666 2831541349 +2620327127 1715825236 +872126354 2401465309 +4166226846 4166226830 +1742397918 1536266345 +4048009964 2807572747 +422994098 1654274085 +819356534 3908704435 819356518 +3576427353 2159099454 +532549953 1832305639 +3259011631 413956423 1547368895 3525977422 +3511705942 3020353569 +762417108 1573218991 1388772076 +3774617449 2514016846 +204769843 2344742477 +2193466630 3599419489 +3171575678 3171575662 +3356786921 3779522264 +387971804 387971788 +2156384662 2156384646 +3292197917 97405346 +1453228395 3330653026 +397682436 2341525527 +309827462 2554562529 +3785089030 868824954 +2147586453 393751964 +2320685021 2640957684 +1486975028 3122897359 +3782141804 1301696264 +524859882 696036173 +2122416986 1877060973 +794785035 2655338580 +99421442 3379643677 +2688361199 2516188049 +2711494579 3362442003 +675035571 1016659232 164549850 807220538 3468220621 1016659255 +4050168932 1673887281 +1065345352 1751100288 +516073052 3161890870 1456870723 +3971739002 3149478830 3416829477 3213501484 +3879843173 2385477789 2318367297 +3780752564 1949792079 +3518203475 3518203459 +701989570 2688735093 +2654057274 1058670860 420725189 +1589721326 3560018573 +2516815139 1846909597 2281543184 +1943369311 1943369295 +1446532802 2091946869 +4128191466 1139718477 +3077676574 3856394559 +2839615009 3515592146 +401616964 4078697225 +3077928072 1441165835 +2893754427 2633560379 +1459102259 463328858 +544496139 573161300 +914226893 2505579684 +7399510 289244722 +230372331 1301598895 +3045213709 3373549179 +822250427 4286973573 +3817344171 2102846126 +155834954 2934294450 +185135735 1933305231 +3470516819 4146415802 +3162696079 3172854235 1360374808 +251280350 3588645374 1911307903 +2513762789 3762002186 +2540823149 3578229124 +524078503 524078519 +2855215343 3917047591 3610302520 3766049019 3900269969 4192493612 2971492982 +2724823861 1216955710 +927361088 927361104 +569735644 3000883276 +137230211 121730433 2798974822 +953629962 953629978 +3530158729 3318271416 +3734708329 3610510680 +106786901 2642775277 1511511498 +3180291123 2612706380 +3664330590 833536255 +2076600146 726967813 +2266653513 2629142446 +3422948520 3582323819 +2834457521 3303877650 +85712401 85712385 +2483470980 92316956 +1220022482 1271036549 +4050362858 3136532782 4134527821 4134527835 +190713892 4069376536 +3059845295 3398052718 +620368081 17505795 111704336 +2348314617 1360545000 +2153180471 2910981635 +2666086761 1923736270 +2773061823 1353014396 +364623932 1921189479 +615722648 1675793445 +1503733603 2075197642 +432502399 3712886465 1665538108 +331795788 1844784801 +3699659457 3847112128 +205721125 1921991724 +3561599696 2081521451 +56134637 3563739543 +4277636755 4071977324 +2771217392 4135643868 +3342242158 697043905 149352486 +3437106555 1296659006 +702125776 1633821358 227618278 399556629 740165005 +3443656417 2723871227 +2212719323 2046899908 2046899922 +1499604568 1499604552 +3588981074 331125765 +2904792547 1913752650 +1669071355 2536971826 +760827239 3398752566 +1862312088 234359648 +3393806736 25466293 +3870296633 3870296617 +271075963 3933028274 +3919516127 2758353416 +1604116190 693571722 +2900767824 1308329896 +3566041075 2377372556 +1628326810 2482077814 +3502574664 3864871148 +600075786 1480145325 +3339334506 3339334522 +3608678422 36076180 +1167902060 30066945 +2799006116 1174529321 +246071654 2093904769 +2878208322 1384080099 +319491654 1080522785 +1578443894 4174015302 3970359073 +3080021133 2368555506 +1981405934 418472057 +3203350512 2038014283 +2828950567 2555056480 +3453560588 3453560604 +3017423562 3934948347 +3970284392 3321255504 +2963985589 1641642074 +657666089 4249116886 +2505801060 2198234239 +3816308811 1632450077 +1092959927 513273200 +1323470157 3626090465 +3495854503 510862137 +1729402575 4126044863 +921477334 1283535089 +2812499689 3560677733 +2147978077 2147978061 +1137011759 3737734648 +1488448749 221452101 +3788803515 1016798564 +3434070323 3448672438 1299041937 +1610619542 914387129 +2640435557 3666232458 +2754399589 3615970796 +69441831 2869565536 +790703754 3141288749 +4283258622 4113152973 +1800196936 837851723 +1234506267 1643859935 1643859912 4037771396 2695398565 +2958648277 1907894346 +2487443838 3826415967 +2690640113 1850508900 +1629412587 633772252 3465922036 +3233993366 1112790130 +3624130214 3020613441 +2530653403 1325315282 +3704868473 423059038 +4014937342 3078491081 +3806126292 2254780991 4122340793 +2486902771 1276332954 +3201432472 3593901648 +2146453624 3745649915 +2951802605 3846708996 +3065419586 3815775459 +2045739730 2045739714 +2331079180 3061414432 3323365601 +3260263005 574711939 +3343789644 202564023 +3483394746 4131986837 +283023942 3563904055 +4097234190 102893675 +81747504 729967688 +4079439665 1581177281 +3516196884 3050617291 +3888521633 2827782598 +1935246821 3649116963 +4100540914 3015665658 +2559617170 3183041989 +4282202783 62583414 +667796506 3289239010 +3318859396 115199900 +1119971961 1543789128 +2480608805 3873692716 +119381623 1002901836 827536831 +142328053 1339081130 +3304967133 4169657588 +2642652574 4260315984 +2056084361 2980829678 +1213040507 1292650148 +2322924501 3773149191 +2514271703 380657207 +1109455311 1801309210 +4145639992 2806939120 +2909328289 3126663267 +3730132102 3730132118 +505623384 3379155853 +141457633 652757536 +2619068724 2692977055 +1554762271 168207580 +159711760 207765283 +3067926021 2812029046 +1843387448 795323451 +2526284423 2526284439 +1829835751 1279997939 2564969632 +3236528830 362063902 2794533855 +567621118 567621102 +2546045134 3015111769 +3795715852 866457591 +1952959586 2707865155 +2191607126 3269227574 +609659433 609659449 +642516703 322113419 +3959544576 2263597325 +3381927763 3511967910 +2251802074 2245920163 +964868755 766417175 +889527391 3591088520 2086396171 +612661658 378236285 +40851351 304946172 597089044 1816584870 3835207817 +1727985699 1727985715 +2476935531 942792591 3567768436 +1937659874 2984532181 +2312188789 1767113002 +4235203749 158367660 +1904758641 1143048688 +1772303931 1363109691 +2312970610 2031855205 +133421090 4056061986 +2447032279 1460078763 +957387417 1690821427 +2886497978 136663445 +2104840818 2104840802 +2735008670 1052699071 +972150866 2310506771 +4134403704 1730647789 +1627912802 3489745913 4253753006 +338932179 2690707244 +3732022021 850206938 +3720781376 3720781392 +3084560869 2383188079 260860692 +4210210599 857100896 +2970108056 2639982567 +1889787500 3455532327 +925340159 3528119422 +3268236443 950496130 +3935405280 588524709 +2584279751 782185457 +1092129254 1605217559 +3449452898 992977670 +634449524 634449508 +3292197902 4140708377 +2368908615 4025147475 +3713808556 3713808572 +2239204025 3559874878 +685919819 2806071298 1538775356 +751287297 2137847190 +3574937321 2293273678 +3184454607 48059931 2612868824 +244010039 533943896 +1348014311 1664457632 +3199762299 2612640146 +451165197 760531813 +803190355 21715648 +137917104 1341678023 +1507200598 3254292849 +2919372168 2865301843 +2715311228 697047958 +1877623776 231266739 +2612903480 1672639035 +1106831256 1926534221 +3220459125 2727838250 +3510067267 3910954544 +2295074496 1602426866 +3267924161 1656479680 +1483947333 2187948954 2499478956 1140888288 3741380720 2187948940 +592304785 613356102 +1442780447 1906258338 +3612916664 3098510011 +2694296568 3067098667 2694296552 +3096557349 653556130 +3955515560 4293639363 +4285931141 2884766540 +123952630 2809449921 +2313457343 3863183210 +2818656802 2617750421 +1729206102 2161896006 +2091755322 3428791811 +2833926369 3385899552 +3786960132 1498651999 +1785701872 3569329121 +553267563 1423690594 +2406071725 1886754642 +4037475852 3806457057 +664763553 3455553816 605084870 +263961955 663429834 +920314635 1704159810 +1926438829 2810156520 +1774686819 3895161290 +4148080951 1857091984 +1368010043 1789964264 +1085144831 3504892798 +1179739182 1115425465 +3170762213 1758900076 +3171221023 1743382635 +4042252906 3013700813 +2198960059 367149095 367149115 +148320545 197285622 +1851364729 1851364713 +798164167 2876278102 +890683322 1288688093 +3591297750 2485068501 2903053388 +2816946412 1912308759 +3498821231 1293436365 +65063583 542517015 +2797965782 1594135527 +1509435106 2208642517 +922500504 4029090297 889921405 783916831 3021818840 +901102377 839733913 3054870926 +3081614574 343134905 +1500580145 3978308125 +859019947 1161591586 +3052156253 1661611330 1661611348 4045600939 +3586173357 726342482 +3394390660 1565225839 +1640404564 1067361849 +4026564344 3368542331 +938344157 3903337954 +2150897140 3321794319 +2010999535 3663283478 +1286237332 406425933 4069915923 +3362415772 461136273 +2028837609 4070222986 +1490190813 2959240930 +1386776879 1313862904 +363339944 3215681643 +3001951658 1457867405 +2081033592 2524624839 +4183898872 2349847661 +3165323502 4013061817 +415515869 3656935412 +3001951657 1441089816 +3746947021 2944038194 +2061407120 3194785571 2505979003 2588017037 2566495164 2571286335 +154647862 3681836801 +2531892484 162351599 +4294079754 4105060013 +3630117070 384383065 +2676045709 2775216868 +2776000983 3201304814 +1193836966 3868991792 +3934381893 1870598540 +228254770 2631219877 +3341398264 3482189766 +1243548041 3369865445 +2230518637 2267566546 +3587523888 3468421781 +697850558 953604383 +2517797450 3743448393 +561406421 2187067996 +1847509142 4033424423 +503182672 2261331189 +3707475196 3691743409 +3188676196 2519007081 +2899027891 3080257242 +30415287 2442689286 +150910852 418785779 +3999188901 3828631724 +1900964991 3715419112 +3038345332 2277612713 +587846097 4185213968 +3312162407 794674208 +1229876154 544445917 +999161251 1669744522 +4093940670 3778319391 +226121192 529873963 +3379855786 1750464640 +1367607398 1802888290 +1813601605 1894634394 +4155862822 2054646288 +666634226 3888946327 +2246370088 3128050499 +147502464 147502480 +416759145 1730997212 +3985245740 474462039 +2002223029 2478705148 +2564000185 1308741182 +2841761496 3694401139 +3950206604 259553975 +3503347732 3435407225 +1505557198 1822757465 +3067660987 3067660971 +3034976650 1345166395 +797050697 313620472 313620462 2991966020 313620463 +3374098263 1479413955 +2033784919 736186598 +1597245943 2449851490 +196834509 1159257778 +3890330383 391739534 +88315192 2170808109 +3065211213 3916350500 +782668546 2323705742 +3950628173 2758139570 +3730008499 2957993178 +769914338 802958309 769914354 +935515274 3662080997 +1878029546 562564173 +3538705145 51590654 +2605385744 1671829700 2266870051 +1031868377 3892017493 +613055537 4152354871 +1446251088 65813475 +3021670718 40727553 +1705339552 2741426675 +3147254906 3375195147 +2937833113 371003953 +3405741465 2936765519 +678671651 3508938269 +1607494794 1595596077 +820202693 820202709 +4002515759 3189644024 +4230991923 843366476 +2068983557 3227256707 +1066606052 4170714623 1079895512 +2745308533 220710716 3634265098 220710691 +3546161256 623707051 +3104978517 3104978501 +2623878911 2623878895 +3749583543 501359395 +1136270256 1308202517 +3853739418 862515563 +486042176 228640529 +3347077620 44468116 +2266419303 266998304 +464803309 2313372676 +2472555439 2472555455 +1210379529 2602640696 +3473501109 2698284522 +3460528287 1396105800 +959543016 4041092907 +4057983577 4164390184 +2260317304 2388072685 +1331253637 2022033852 +2600408924 58358500 +134169901 3668375878 +3447811984 314744739 +815598791 1312496960 +4094581404 3466109831 +910257488 2684999493 +2558508471 222035508 +72942462 1444970335 4096295582 +2473064002 1319676387 +1231558531 299696956 +741466409 3038041509 +222139776 1475500179 1743942051 222139792 +4056559190 4148621681 +2427184464 3983093615 +4248746687 1757412030 +436960871 1729625142 +2540344950 159971914 +4294758803 2382228090 4072146966 +3205453836 3509033697 3509033719 +2819622153 4094320494 +2562577110 1221781223 +3456467787 1282055288 +1412454679 305165096 +2285468281 3950759016 +902889129 3261530648 +360398308 3036835305 +332897519 728501304 +3048637351 3042000886 +2848023316 1332672633 +1816685804 1644394369 +3536158623 3536158607 +1714482078 2097342889 +3776189304 3732091923 +3315841658 3315841642 +3539866297 3740760360 +731804872 731804888 +2073937885 2073937869 +2115973875 2115843226 +2364824462 1923883151 +1497440786 2475205189 +3172917128 1067049739 +2501764155 4178462962 +2514734130 226886920 +1047782861 494059954 +3759026435 1092426225 +4240317581 1816588786 +952342452 4227262293 266850383 +2125799150 1696575673 +1098580118 2862738471 +3689981123 4275265258 +2529231796 98096217 +3291520460 2760402999 +1876913074 3468069171 +2989227466 1161856251 +1970781185 3736509222 +2907052994 2271064693 2071974347 4022352510 2071974346 2907053010 892813954 2071974365 +1767078658 3496649781 +2149462094 3785446220 +1844528026 194829886 +628842360 3003731248 +1244195740 3880318545 +2089877372 243217456 2503073073 +80568845 2622577266 80568861 +1599637566 301188254 2511959391 903211042 +2518430595 2518430611 +2928041169 1610199158 +3820893163 1869331170 +776325542 2111598679 +1828795780 3805394268 +3387559380 3963531049 +3030452735 3184433084 +2590511183 1624353870 +4006352687 1478484090 +2740504337 1701430433 +199401702 2920875102 +1791756128 2133826611 +2859443100 3921579672 +656968412 2136943414 2560630732 3656971376 31278324 368513188 1116043960 +3550195908 2007034363 1297110578 +1827437362 3206043341 +1480706697 3338110779 +823953350 547816445 +3692220088 698051501 +3476138932 3744549977 +692090565 3044734988 +2964610919 2465345312 +346178569 2886481529 +1223467678 1660857220 +368345601 2431166358 +302285195 3893882306 +1382078847 762733310 +681592046 2095660978 +2474128158 2749713214 1144551487 +2636899344 3536405736 +2987780401 1048962899 +4260567281 3065004912 +2577756258 228969880 +3906227564 4063617303 +752151437 2611988196 +3694433499 2177258706 +3045274519 1974502607 +495723300 2811974057 +3042161725 2948906004 +3081834227 3953456246 +643824793 569472661 +4214296809 869520862 +1060260319 1529498142 +1296067611 922339085 +1810197420 2250801111 +2111071456 2434298328 +1005683720 3960143668 1697831069 +86198959 1875289189 1520791042 1689574063 1537568664 +582887077 1283113881 +3204904204 3287532008 +2587786233 1140437422 +175323823 3028662884 +4164023468 1654926039 +3972069389 2409325052 +2946403766 35914816 +3829572597 1462411142 +2427038949 2686135418 +721195886 429659705 +184857899 4254133366 2204709538 +2629518710 818829518 +2186983163 802032932 +1738097838 290266461 3707958437 +1022884191 910853643 +3718736728 1183710093 +505122789 2523905199 +1976782619 2527430546 +1312719899 1198126724 +1627912822 898582471 +4286238898 1647866701 +2444156582 668688079 +3253884577 4051591030 2683324113 +613177188 4114565572 +819659190 1964013463 +3292167516 1142118353 +1389385717 1392146083 +3653796638 4104546367 +1983991767 4291866470 +4013319612 1319249649 +408704160 4183373811 +872275920 2829538421 +2524650735 3536751662 +2220115722 2004869733 +728568597 237487457 +2086333172 1680517035 +3340051762 3271524087 +2699244000 3887347327 +664998228 3115599673 +2374972394 2374972410 +3639764639 3868318632 +2270308212 2052332431 +3637516510 764880233 +56576718 931063187 +4063953127 971140022 +3538716627 2573483302 +1861958259 679281420 +610754357 2210062442 +2795589879 1190294736 +1727036872 3566600669 +1835462252 3467591041 +689186613 2606583514 +2026650435 1267220775 +1623918615 3998172624 +2041897676 1673594657 +239244084 2683630563 4152248176 +1204842828 1495423649 +2638111532 3040222807 +4089147682 4234380375 +1110722623 2001582910 +2116391478 3408210705 +1046800873 568080856 +270769644 75479160 +742703801 1765706024 +541353404 2385154796 +1399046307 1005884747 +218605649 711483325 +3630920586 992404007 +4078125324 3008325111 +111569760 3089228599 +3878050500 2774590111 +1681529226 2179013918 +3209949676 3209949692 +3845651384 2401321645 +1995024196 1976717343 +4109688854 3011297969 +3633085506 2254071389 +3007240979 1743602213 +3913281503 4189259098 +524290653 871270978 +4074951009 3624380784 +1703998551 3899519093 +3158019215 1858772149 +202421312 4169388792 +3701891505 183224742 +4043607113 3005798136 +2276381614 1178024678 +579014100 676250799 +1285445405 3124961972 +3014832311 1726984048 +3002554068 1769709609 +347206370 1981897173 +2865283783 2701827926 +3874558049 4001155232 +3242660867 1172603068 +4024490960 1861879924 +2634467725 2678279898 +2837334396 3865469862 +4110813008 142443235 +2693611772 3126676657 +1568371183 408181560 +1697206268 1007217063 +1069305058 929892291 +4168091485 1968936802 +1425547038 3768122409 +1807424135 2490380179 +884649752 434217691 +3820459928 302228557 +1956933920 2218557543 +1731602221 1628035066 +2800555935 1715220296 +3967161953 2665822902 +3798081164 3967161953 +829359251 1690579820 +1800723912 416702020 1568040223 2944536567 115137436 +935367180 3492145377 +3272729608 489289885 +3972897389 2110146350 1922766731 +133353238 3015699079 +3374982323 1982619680 +2800499515 14761458 +2132901809 2044765380 3227700981 2891586812 2065486256 3670269888 +1468119060 3354325765 +2677093663 2770175964 +3320056813 420597330 639509448 +3413959432 4118476323 +943163698 1093209237 2976709029 +4183236386 282457131 +3427423653 3427423669 +180471498 3104567277 +3464123385 59912424 +89162957 4293534258 +4146027319 1029478297 +3793258470 3533565697 +3819252794 2533662557 +491848941 422412200 3782083129 +1025874560 3258070917 +3379492690 3284934824 +2886725712 2886725696 +144008332 254625911 +4177449993 36162094 +873565028 3781251940 +4234674524 3015320519 +4215478961 1000539302 +4201990187 2480217176 +4109471032 4109471016 +1065850232 2881979923 +2273488183 2310450576 +55968324 55968340 +2658341434 2438338819 +1069758103 4149145524 +1106846409 3696558149 +320001889 3844117905 1739132342 +1469314607 1319084263 1348491116 +3909798625 3101586694 +73625886 2347612478 +342536701 553005396 +4104842188 4111544865 +1739810480 4192536093 +3598538261 564735718 +1567267243 3058338264 +2907670926 1358838418 692657945 +432307964 2354308785 +4072438415 2345951962 +547372143 3409912494 +799836001 973717306 +2820385173 2387839020 +2953274988 2275818519 +4254720792 3177055968 +2100494411 3449347659 +2122456902 2379364241 +3475387141 3475387157 +3664681152 2618979909 2618979923 +1093340375 1841641062 +2790789856 3164976805 +2323006091 2200617172 +4005990047 4005990031 +2204479323 1039945502 +650427170 3692133861 +3992184462 619966863 +2546603516 636765507 +4261283699 971350218 +4048648225 2800485457 +3062584259 3784723888 +3482039196 1075641937 +1522535373 1123977102 +114298123 3808811659 +2969594886 203570042 +4102525933 3731742226 +3128194087 2891110752 +1332457815 761080514 +4264335415 1463000710 +3042559009 2592813136 +2680987788 455130231 +2389768616 731938260 3822650237 +1152605934 341733561 +2626275152 1360979883 +1996233782 2229299463 +1048560942 3851457138 +1392524679 2893648064 +2433597847 4020748454 +1790978819 2065247130 +585126867 849015895 +184294880 677710011 +1142230396 2837723687 +2705544716 3909121271 +2274663039 3991877096 +1634075274 3717594925 +1441082046 4123150601 +4051108867 559632554 559632572 3323325753 4192059502 +3471091585 854831126 +1900448183 1274915363 +3776730566 630916769 +1490556306 1848243411 +2361792760 2480492141 +905748476 2438882220 4172274087 +1737696576 1285792723 +1988141159 2030103367 +1613568281 2147385950 +3326245036 1964863936 +801691239 1096482404 +1611882344 1692345756 +4116643916 2425190327 +2967223198 2449741451 +1050171562 1050171578 +3324413445 4087675340 +1401225552 2412623864 +3679293349 3759743148 +4182290756 2319785287 1456673244 +616461381 3472888131 +506229225 190170969 1761038798 +3959009503 980534095 +2016009535 1759988264 +1763354422 654989590 2868197895 +2197070386 4177941978 +2287576650 4011902573 +1220999459 2430425586 3550274055 1871745332 3550274054 436225675 3550274064 1300962824 3023712796 2044346013 636997473 +3355165612 2102724545 +1820904036 441884668 +119519652 3468902716 +1756576810 4230460941 +2105036805 2305161178 +501894319 2080559596 +1295656789 910355762 +701269743 3153619512 +4225752414 2987171689 +2585289095 2592624274 +3936414624 3936414640 +2307435283 3048947072 +1201355815 1790067191 +2146119280 2774075787 +2607897736 2607897752 +2727644481 1036054118 +1960431480 2847733708 774197253 +2444298014 1569812747 733600136 +4276523149 3982376891 +3571673608 704637579 +4196826403 3986095644 +641535378 3181530558 +3918096929 3293712886 +3612182908 1796173351 811027500 3125442343 +2285613865 2285613881 +3309299384 961138938 +2994931061 205584154 2034341692 +3454754440 2978336797 +1680461860 3520243903 +2596315028 825964025 +1676769178 4011804522 4011804541 +3547385439 966057886 +3783340977 3502731631 +3842608814 114494254 +761461553 1644610093 +3175913894 32516337 +2426996568 303468429 +27515686 569443953 +3585093362 1448732403 +706104778 706104794 +2772687917 1456708306 2555660187 +2182813454 3735374607 +4223249921 1179446144 +4294055301 1863835724 +1566728958 4292990431 +3446856534 3251587175 +4195264457 3028983854 +864143666 1111247906 +3303190698 2598116251 +1546710217 1546710233 +1456261897 3824581663 567514478 +1701653824 3940432851 +755433219 3842208170 +3608116678 4225169926 1398996663 +1616101451 294887791 4007114260 +1653857898 1099121171 3221288448 +4063085661 2601262690 +3696121835 3696121851 +2364364802 234118354 +3969263897 278455957 +2087406991 1810569230 +2901881616 1495622179 +3673854528 4168366803 +2292974270 3838333193 +2109255074 1544660280 +667166787 3704316266 +1708378750 1708378734 +1144790103 3218542019 3248528624 +2608849221 256876428 +552188222 233741449 +2816223704 770580836 +2983550926 2434927394 2156834967 3257428173 2755179284 +384540869 3144950125 +1218421405 3535973693 +4099071781 3279243066 +773891362 3210998915 +4257315866 2442550506 2442550525 +3503791615 1941520554 +2518748774 2518748790 +3561361831 3511536118 +1228854743 2430861642 +3219572247 793368112 +4094959093 816523434 +512306132 3857710777 +3189557822 2236768137 +2660102988 3849715873 +1105781184 3668559205 1352279528 +496884091 444423332 +2461130410 2550236571 +858438320 4091443723 +1639121463 63732870 +2979088472 2864746768 +3542250011 2050597010 +2780134280 1689351947 +2068359550 2439172447 +421864457 2658646584 +751520008 2349070219 +3060175558 3917024695 +70474512 1301676395 +1477111534 2268471481 +238724781 3218523922 +1101660451 2174732810 +2334323291 2334323275 +2797437865 626410254 +2129753879 1996015252 +1617071254 3071302282 +746512723 3474062784 +879304059 4235815090 +3128124791 2124313813 4205361744 3885845492 3885845475 1522290985 3885845474 +3274771975 2497451328 +2694927626 3888554099 +3446476948 1372213247 4138801391 +3236838325 1812463100 +587980955 3333592082 +3300067359 3302344904 +2443876076 813805440 +3202118678 2297045239 +4034445207 622172848 +829764697 880896008 +1374424406 1285095015 +4195480435 490880538 +2679607766 2679607750 +1808528406 1808528390 +1153285269 3417300618 +591425952 3621054664 +3133042046 2409213534 +2559077419 3503743054 +2775589535 243695688 +254783950 3054823257 +1920128740 78442980 +1158013009 4181729168 +594298395 1528633785 3137843694 +2230590441 2923331918 +3890747241 1553792453 2418244876 +398245884 398245868 +69154385 2860175524 +1614130460 1594006540 +362268473 933487881 921607870 +1419753768 1601206763 +2927556595 149625041 421758304 421758326 +1929831591 3134845686 +2825404981 1361066364 +1750399498 3071757669 +2284560390 1655499105 +3241052813 2839813106 +2946029115 2526777289 +1127119821 363491620 +740088874 3390459013 2607715867 +2403952111 9219387 2139846456 +133707238 1908201751 +3499805780 3081742393 +2389683322 3016524829 +3516447572 1198449977 3223400116 1198449967 +1012723598 2488081551 +381789043 381789027 +3233281280 3762294436 744756824 +262589762 1315590190 +603094839 3451798417 3451798406 +1763129403 2861401316 +1412767145 775797006 +2519378959 1949096856 +2523214540 2370762529 +1339661088 1936584264 +1900482807 1239397574 +4285310402 2668784605 +397843003 2406796018 3101385960 +78608685 2369503684 +3103427109 3103427125 +187304848 434202091 +3895161301 1365520963 +2532349591 580891156 +3806616540 1143506627 +1394547056 1240795989 +3119394998 1744219793 +4149770507 873392184 +4143840374 1205104071 +879729999 3669271384 +885330558 2631999178 +1182602385 2280087622 926715446 2958928983 2280087632 +1065699677 3998966082 +123897067 2333556194 +3897468060 1338843537 +168686714 1308089373 +242923747 3380732045 2469922758 2268347553 242923763 +3434402262 379999217 +907575431 1950989165 +2772657836 971706327 +3954395867 2405670704 +1968976808 1747276157 +3633975732 470353439 2536152276 724860984 +3805179402 351746491 +2559197137 4070733328 +2040152612 2980755597 +225739576 3709947968 +4209251231 1428408924 +447612615 3337923392 +362916264 3044938621 +589458494 225390177 +3558718104 2194455899 +837077 3910889034 +637576383 2449692840 +935539942 2019558718 2621581506 +145897174 2330455398 +2591990118 2606240663 +425312561 424353830 +476178021 297638301 1870178239 320712954 +2668795528 3335644970 +3385060044 3385060060 +1567421002 1551985275 +138821489 3347562244 3871439151 949900515 3783776058 +573920917 1861700746 +1568971829 1824647018 +1866780885 4266966876 +3362551736 704303685 +427186994 1196527525 +1138247887 1138247903 755399436 2625281486 +4042647203 4042647219 +1754131143 4291120584 +981017096 2505345309 347116189 +3766621860 281650239 +3508322452 3292735737 +1652871827 2853666170 +527250930 1793846245 +1666360601 1666360585 +1662981378 301839695 2190239886 2975895522 4127339105 821549732 1851162831 1965653323 950484584 2745650739 2090748023 2633945723 2576876275 1401826742 402790082 1477049832 3647862050 4261771262 1563943407 1911153911 +231096138 4178944379 +655280871 2982886594 +808988624 1901566068 +300166606 4164164431 +772792495 737445356 +2331264691 431728589 1904954330 +3311562548 1028088770 +793139269 4103914703 1095082292 3178063996 +2959977110 1047690081 +1494715801 3918620925 2152212380 1357068354 2900903508 2125408743 2354442133 1340290748 +1364324319 97239172 +3001257740 3029950240 +3182837390 870611343 +578487996 61577713 +1298532051 2862399034 +139114896 3795111661 +1397029538 83884971 +2407474502 724020535 +2846724322 2786619527 4261421641 +3213515215 3213515231 +929805971 1381365015 +809790469 809790485 +327524235 1448755474 327524251 +1124260489 108922296 +3134313321 2169491022 +3260537470 1850537055 +1526893118 3680234502 +2895830746 2446119229 +4224647918 1424071865 +2961161977 3524895208 +3591297739 3774282539 2540320509 +1250130785 1250130801 +1204476473 1269084190 +3146189558 3834168022 +2418833360 2418833344 +1525461482 884111429 +543051288 208990157 +3830977140 3936685199 +1813367829 995116298 1767681722 +3150831651 3357005578 +3876285586 3766821566 +2162242847 25599966 +1653992760 301663172 1728667200 +3538070417 2345932102 +682439370 3534156795 +2061407112 720681687 3307997231 +1754451037 1837512107 +1379442227 2720074330 +4123543071 3040194341 +4124867959 2165932624 +326221681 1992647680 +3098510604 3360584183 +593057300 3114434928 +3040922899 275763265 +3335850036 3635486856 +284892959 1880258240 +1846823815 3505579414 +1530529358 3931630799 +3966623380 3304415983 +3261229673 4132671782 2722696757 838562045 +121157325 2840034145 +1412309573 526519107 +433697500 139900739 +2132937158 3660211718 +3755394564 1662629983 +1328625775 1328625791 +2391990792 1213221500 1929809205 +2948831651 2998382660 +103910868 4014425331 +2668161392 4007982098 4070240603 +3443462758 3443462774 +3338146561 600853040 +830106080 3283397555 +105689743 2042435352 +1856778311 2148532182 +2182757016 1732918605 +2024177455 3427045048 +3727407802 1969910550 +550034499 3638577712 +360502541 3766707058 +1107054302 1034425463 2220106935 2124470334 816603172 1300180786 3564811308 3167632876 3862425884 1996801242 1792891198 1961062902 3189303266 4060132379 3103227738 3917853811 3334076523 2024391371 +2158659875 2943738378 +2988948672 2988948688 +936144638 3862918593 3570579907 +735196492 1206511265 +2105090066 2105090050 +4087593978 2227235467 +3426678506 2443346368 +3336205859 753400074 +102185826 2442660477 +1427575410 1699875187 +1239943105 423900352 +413150432 2753995955 +1264499591 2336700548 +2009669717 3869107676 +1147152237 274600084 +3405999532 1191440064 1749988924 1113957825 1191440087 +3064629790 2893507881 +3717594922 856084032 2507384709 +418430930 3693245341 +2977493464 1720461668 962901773 1519130256 +1719775310 2888338137 +799080018 1742692090 1282431763 1944023502 +449197513 472711775 +1929158127 4071399214 +1342396458 1780979182 +2594258445 792844901 2832113010 +2821510080 2123454291 +2286109512 2528768948 +2197744000 3075052677 +3568929757 1103548459 +2649002774 2765327271 +3155523531 3771438210 +4141499105 2056734783 +1902257522 4018205299 +4285904121 1115154654 +596832889 3503879 +379888080 3879962155 +2096766904 170179155 +2609686182 2245890339 +3946046030 1500674770 +691101104 2293660675 +2360942152 3479874379 +2492702962 2492702946 +521785561 3922728894 +3810210981 3810210997 +1636789037 1636789053 +2980527995 1439673407 625536676 +3491372077 2910648452 +1419435708 3956056561 +976035496 2406329027 +388803981 139801842 +1055633629 1269748930 +776426612 3613976287 +3771626172 2701041127 +1523732043 1410423122 1523732059 +1856211997 1215664564 +2357273288 639278051 +3318891694 402791929 +2415388372 2000707503 1935061055 644705588 +311485494 1084162442 +3202579388 2201774205 +2979368270 549338574 +3522204957 2404045926 2595929268 +1128120505 2469815102 4238228105 +2476824972 4076861281 +1487435552 1487435568 +2917371743 4100392399 +264060724 4209671897 +1901796175 3245079886 +1987052144 3377630857 +2119208852 1825703417 +3558070732 3394245770 +273900129 339992246 +3931433079 1731493187 +1075130025 2484229113 +468308128 468308144 +1081681806 2755201608 +870011814 387869861 +3245347715 107919146 +2811631751 2811631767 +3830377691 2683668638 +301623019 3881055663 +1833636466 2133723507 +1527243557 1919587116 +3149355097 1207937854 +2116426288 3321575811 +214386208 1035166821 +2333165375 724772926 +3543271882 1103456493 +2410041933 1007315890 +1954281173 77439944 +3024563510 34352145 +600906437 3322926314 +3694654041 85099038 +1708345603 2071618800 +4037926046 2142391487 +895039846 1635081089 +1464508215 715880358 +1373447202 18866563 +811414952 2317465602 +1687358575 494627472 +915725091 257226762 +623932224 3343635304 610127019 +3307506518 2928105585 +1449600536 476116955 +542566951 265460598 +1185877711 1940278870 763869127 +550694802 2228474413 +1687873497 515409598 +3442937858 263074613 +266850380 3768075144 +3502228449 4072838672 +2289223931 2178027967 +1402769373 2088138978 +911803429 1411985889 +1994396834 3187778986 3300948739 +2201224702 1613596937 +408444465 511967425 +2159453906 352053702 +441061572 647521439 +3771384603 4197524370 +663338660 3556060336 +3009148121 2132332716 +3016749406 3037516671 +1192133323 2207954038 +1213058216 2054761579 +1935399357 3190198321 +3747544185 461861495 +493102650 2124950877 +2443441024 3306705541 +1710205104 3999252424 +958638286 3240279119 +2141897224 3409955084 +2330394194 2330394178 +740276741 2062669260 +3296375019 941916642 +891914587 4160059998 +3758106129 151015021 +1043403895 1581463366 +3254238402 452863349 +334050981 4246799788 +2973873226 1550984047 +3010189156 3603173993 +671869769 1405314030 +161025687 3002202022 +192243384 13325788 +1000359293 1515021268 +495697261 1564653383 +1444580632 2748062939 +990193113 2929600706 +4210032640 131072019 4168186088 3111628395 +2932576569 3152275520 +1069811545 2473662351 +1996296021 1512926359 516146156 +887820156 3389612071 +414675468 1018134643 +2806404293 113812790 +3825085810 3825085794 1528924787 +1265610526 25110334 +1637935275 1531856162 +3840419827 1282859930 +2238022649 1967625923 +457041218 1059616587 +3562744965 2594608737 +376793542 1729938961 +3603377456 2191159435 +1834837226 335928397 +1819619122 4000926629 +832038672 4002114940 +3084836863 3925373581 +2673947854 4066977362 3030703182 3030703193 +2725833228 3495457015 +831698079 2834454088 +300954763 3802517422 +773007633 2569643472 +2429532840 255712784 +1291633700 1441318079 +373436156 1509949879 4055088982 +2081690803 2081690787 +2388037556 1835312617 3326359641 1986311199 3326359631 +3475094394 2350522635 +872698103 2873680756 +628516707 1318820432 +1796426950 896781789 4264589635 1432476577 793793466 +869035791 2580731022 +602659418 863990897 +2320229974 682385913 +23327257 3499113192 +2305936478 3156522985 +596866644 1428375097 +2642628334 3820306607 +3075825499 401328698 +1909392414 3608871998 +3022735068 3022735052 +2107400699 4276521797 348902056 3090038322 +1115975810 947723445 +114883062 3180428881 +3535843668 425142073 +2877487737 2016431208 +2529373608 4248887147 +2645693570 3243657397 +2264722171 2264722155 2066082098 2066082084 +937807262 2239408574 2630004671 +2019899868 4292230648 +1647229253 3566053274 +4028184150 3102233879 +2369237881 3350169448 +1532988105 4041587512 2642930015 +2978880918 2955735210 +1862144053 1531578593 +1315329907 3726354956 +327694013 3130054623 +4263130294 3108043409 +2564063569 3884421776 +375388842 375388858 +622711098 3054666401 +1422189675 3706950772 +3674296134 152030007 +1889627574 1889627558 +3146949567 3255574133 +3629951436 1709132833 +649105315 1462017168 +1235866984 1583018685 +1382880243 3306788644 +3539796785 1903326519 +1388510265 1335796254 +2422303739 2422303723 +1268255409 2975388838 +2868102719 1572106909 +1449879186 2635233221 +1584932794 3937069717 +2257469231 1775387167 +2626936946 3552884062 +1774686826 4012604635 +3891040880 1383625819 +2743538580 3391745854 +3797219349 1696800563 1547549370 +3328397986 4032501013 +4149033790 2358526601 +2435419113 895315355 +1043205594 3162492477 +698354687 1128952641 +3946382293 532744266 1189088365 +3815002840 303181650 +1151537348 3501417631 +4279030653 4264619458 +282030224 114938603 +3685199236 1291200201 +3999072631 3010022982 +2278540232 2484155357 +3998704783 3264433432 +3059678593 835154522 +3245350555 3245350539 +1980651244 3297957271 +404885748 1293884346 2029336392 4053839897 +3065978752 1298592603 +2702946456 118864320 +112420514 465719981 778735882 +2375241743 1586538941 447804506 +345534826 3589966285 +1702380506 3479024546 +3106675851 191950530 +3644714039 863689350 +4257839279 2827770577 +4205094714 749614613 +1449436135 3882747062 +1186577975 2372300944 +345085997 3029787352 +4259496543 184023966 +3508746250 1148270523 +1736010067 1956890048 +1763742954 2284360517 +3162770924 2950818433 +2989216492 2706765313 +2562417848 654282171 +23105022 687834847 +1649720424 862230461 +1131011662 1839789273 +3092071882 3953450221 +3410441535 2630277326 +4105960724 3873329257 +487337699 2637025098 +3225040022 1192957302 +2947136691 993267148 +109930770 2402723771 +1288296232 1386370900 163427325 +3107574964 3867017503 +3178759839 3807538248 +4021116482 2414567914 +2441546460 4086700103 +1943672353 2679220075 +413042370 2207130475 +3366599467 1811004501 +266722847 266722831 +652298843 2410155332 +1813384447 613400129 +2227904848 54935041 +920803002 920802986 +4231432354 3945458797 +3192969689 1917251742 +3069657817 3762174856 +2869747269 2319574668 +3983356064 1659079653 2436184428 +3119878851 2157316330 +1161758492 506999057 +1490062415 525131864 +1227806388 3904634201 +799451347 2851260988 +210268616 2194349515 +301668041 3390155397 191504594 +3882591672 3633360979 +4070184428 3566240407 +2401553911 1307589574 +2888211501 768072388 +4215867100 1878379591 +2396611940 3578019739 +1810714936 1810714920 +2328307201 2021708672 +2106607095 1920098420 +916308831 1499106974 +4204456893 1054939796 +4106575436 1018092642 3176677387 +3557095352 2077357755 +17848574 2769916937 +1951476827 830143694 +1033592609 4057346418 +3942093024 3283685541 +2070266232 3106901997 +1093021849 673087711 +3699640958 2715583583 +2040308135 412252662 +2549941686 4182769041 +2428196854 3437983825 +2666119336 2469225308 +2884962775 2310962534 +2347832877 533561988 2038819026 +3555260446 3049166655 +144157021 3820985698 +1678245664 2560008037 +1527591348 163921487 +2633152017 2633152001 +2999045752 533915396 3742893819 +2817148742 4263287747 2817148758 +1994852327 113886222 +3135927913 2820171608 +100953763 469379722 2150026921 2683935298 +1649395845 1217964364 +2890272124 2923903527 +2465202810 717838073 417356296 700932861 3189835817 +1425465317 952037130 +2368468966 574045953 +2590490682 1263770443 303794571 190415917 2547560200 2001707233 303794588 529236965 303794570 2154708466 +1840134395 2755900205 +2807793953 2518212320 +3297367276 1358573463 +3346292483 4281438652 +2701550869 4210388922 +2529482534 306907061 +1503471045 3613553932 +1899826465 2374902096 +1281072191 1664540142 +1914179904 3952581403 3952581388 2427654648 3689097157 +1578689884 3930793571 +2701716786 3003999667 3003999653 +560832991 1188665242 +1401287371 574314478 +3172985956 490807679 +2134192771 1625959024 +902391012 902391028 +2923458983 4134726134 +271466130 4069435582 +1247327049 56907694 +559968966 1356115361 +2742556359 487316310 +1654497872 2384888821 2204467457 +2618809015 156400451 1114761584 +2569523110 3215712833 +1294661034 361470761 +1350862777 2883179439 3078347145 3078347166 2040637502 +3895571872 641788659 +2884778487 3027899049 +3531008462 523374425 +892050882 1974032501 +1253826718 3610153472 +1998130350 711915001 +1877651999 3110325450 +3570199724 2156613479 1143204668 +1167641555 2745002552 1653136684 +1922548267 2414258612 +2976229036 4010107073 108482496 +294076498 3924443411 +429661031 1642351474 +165101331 724845334 +2959368650 2013655277 +2634600476 1356831751 +540208913 2572817421 +779894051 4049452996 +3707690810 1767841791 +3066109380 1979833225 +1140327492 1131329311 +3371059271 2518403030 +3924271938 2040922357 +4218640236 1116905239 +2594107634 3901501604 +2734246389 2205117628 +540066256 2764524148 +1049034689 2747458801 +3908827710 3524736863 +3665753851 390286668 +3164421084 3347397447 +2649557357 153474692 +3851140237 541425650 +3193130172 1495387111 +2452631066 1004049131 +469392539 2560611154 +641979673 1754420734 +779431837 3212440610 +2897911195 1110631205 +945903062 945903046 +400991179 1519952514 +2525473084 3776043372 +1411784564 3959653264 +2804414013 1337455793 +1958944576 254423493 +3136949541 2091036972 +356122401 2337054944 +1514857257 1289984398 +4132992903 1413753216 +3036943549 1661504436 +1339437556 2721096463 +693822915 3709317610 +912645018 912645002 +1831265114 775415467 +1695512709 2094123178 +3672704141 3672704157 +3754155584 1616194263 +3470603043 1760246941 +1913313643 4061414242 +1878319508 1528368971 +1748492081 1748492065 +1733078614 255100214 4088820071 +2095541884 3108209573 +3344190023 694747213 +2928113225 138360046 +2961489294 1861641881 +3888695585 34905846 +1235803155 599432075 3969731298 131232250 +4068445695 3184298088 +3444848937 1687550862 +828859266 1203873205 +797039594 797039610 +406624098 2304921429 +2836851547 2316599364 +3453734707 4131693340 +68571232 93054180 +3226304732 2516703815 +1834512105 2645892799 +3696169152 2968086157 2423742035 +1687945175 1687945159 +3323718422 2930241505 +173127168 1050771987 +2172924380 666060423 +875062215 3801420361 +213783680 875203723 +3154682278 2811656257 +1924417672 432942621 +912240823 1843702068 +223592991 1050014995 +3593019563 3451809058 +416759152 200063106 3110369863 2386233626 671625401 2521698719 +1140949965 3680664484 +1287993656 702926940 +4176019221 1011523590 +2707472185 1145898664 +1371737693 1670590018 +4075545570 1264041155 +3688348583 1619339945 +521426554 1445354485 +91176668 1780479057 +2706442427 2911944292 +3936983866 2734644317 +2940544649 2110528760 +2957469123 4029542781 +3258700179 2760837120 +3765649403 1349367858 +1514538955 3879617684 4167078585 +3610313982 1652039689 +3364618304 2131403291 4100220115 2932283128 +2240207938 2240207954 +2802463651 2551138716 +922813869 3519276723 +601504355 3726320976 +2560613402 2918521822 +3340392295 3581384480 +3567453324 1519054846 +694171529 2876730552 +613757684 3514636948 +450335999 450335983 +3407490299 3040136996 +467798480 3033887331 +3306496491 1381974751 1467365798 3750887065 +1384692062 463632338 +312440620 2097715799 +1003480888 601065411 3018226416 +2266237654 2056064743 +2509554385 2509554369 +2044791144 1161940651 +108460343 1682592134 +3000764768 4033004083 +4167420275 286603447 +530265719 530265703 +2978305267 1743043212 +3964466736 757566869 +529671490 826297934 +941252030 941252014 +4097821114 348498205 +2185337442 1849622890 +1627914524 3288844231 +2292531898 3573469036 +4072369599 4072369583 +2656912994 3786171054 +282122729 1640434136 +3471353115 189831880 +3920805982 2209987199 3697317374 +292607452 1352706385 +4029979900 517152945 +3670106327 896234096 +7588197 457574892 +3974491403 1012628536 4176750658 3974491419 1012628527 +4082920394 3833442029 +3818755659 2618529812 +2422494617 3874668488 +245268147 567658998 +1755334067 1801054519 1733146828 +150131081 2671762104 +2829307230 3621538537 +4231590876 3920094033 +2627118502 2704276826 +3745089739 848451458 3745089755 +3703095035 1438644136 +830183417 3733994750 +568330195 648827180 +1874204821 1890103946 +1404691726 2129106557 3409267866 +2187386484 2443606668 +3580082478 1266865370 +3249268341 2835876579 +3041921674 284037618 +1477664221 3949386921 +216636785 3301103856 +2953501121 3793013462 +2695658018 3464237509 293880707 1903976685 372655933 +3697113021 2753789570 +1508002303 1812766017 504485820 +2210974948 1494911721 +444165817 2652799151 +1702330044 1998356967 +892231976 3363956956 2711810389 +4244711114 315625453 +359236851 814307959 +1487245574 2460175457 +2950901645 1873009380 +1073820185 4019157758 +1276151795 1276151779 +4056502715 3593092681 +3378432422 2788651095 +2194219448 2594182331 +4081019194 651339339 +3990277538 3990277554 +2561543458 3236537630 +2811434886 1385039841 +1318222135 3106298473 +1271958294 3657273313 +3771531876 19755555 +1638314952 2171405277 +3460084827 76540754 +600876052 261914942 +3255743468 1764048023 +4198626715 2429920018 +209062405 2731656666 +4170204759 3676877261 845175479 +387122451 1710292218 +1335311046 286361015 2509602566 +2036900227 2729853226 +3168429673 2249335116 +155763880 1166906475 +97767399 326125728 +1681403155 1681403139 +3048092654 1175370301 +2129750076 3525858288 302454385 +2989572952 966896952 3545082488 3683451789 +599293026 2641088085 +1599392886 723279335 +3717822136 1932994240 +1785813187 1399765756 +1420623016 1916154896 +1719105374 750978885 +1974559810 2285949923 +3018729264 1877454979 +3196936305 1770967536 +167668944 332776175 +2108323070 3512085449 +3005959286 2200526289 +1123831922 1554547738 91678685 521650356 +1249208347 1372775058 +3324531826 1669132147 +1110335591 1153734770 3011246949 +286482779 1015169604 +4230484705 4230484721 +429936164 2069562047 +1661737923 1594966909 +654319508 857288812 +1331698069 1331698053 +973207960 3910920781 +1055905806 563158543 +106676569 106676553 +99712198 556231585 +4016471715 2170116746 +2770928697 2770928681 +1678683869 2064868327 +3906764556 2669412321 +2193155095 3759083568 +2456457474 2143438389 +1373349924 1373349940 +4250436245 1733660828 +4120736495 2514218542 +2994946634 2318981702 +2132267280 578690101 +4258824381 236931816 +36781955 4136041276 +1008241162 2762034605 +1041098432 1877098579 +1863059214 1852283022 +3391580178 1309201477 +654396654 654396670 +1828674758 1828674774 +2150349965 1373229554 +964029585 94595152 +3461009172 3599135336 3552836729 +3725792377 285817448 +805472806 3052503357 2375118554 +976157677 2230752786 +975731532 1626654048 +4235982121 3682440470 +1111471327 375753953 +679754550 4264113681 +361903696 3631902396 +2458543388 4108783560 +2229580096 1946355667 +2313729133 2253653906 +3959532494 1419867481 +2964970388 3365186041 +2440742786 108249995 +2223020139 24113250 +3452085042 459728819 +2115312952 1443214291 +391689741 2215091397 +946112939 2744665991 +3829597781 2860709834 +4262967879 355422012 +1881507536 3879220008 +3380169854 3829793630 3274732447 +3852449877 1443173612 +2871123171 4131010525 +1772107498 3551921490 +2846021428 1062782681 +4166883682 1421957797 +337390648 3584041940 +2951618809 3973965800 +256720599 2236565303 +329871258 323818426 +180832406 2377598001 +3222032144 1667266101 +2725252054 3068879282 +1775159815 2542274838 +243492234 1658378285 +3241081861 2047831379 +3440646543 428513740 +3570406627 3570406643 +4083606770 486172915 +484179308 1606676672 +2255243529 2476164854 +3400751721 2169983832 +3664920242 2480452147 +1726168379 851010546 3185065983 3185065960 1568048901 +1461753822 1836719615 2048875522 467682067 3224588778 1836719593 2060055373 105845375 2060055386 484459689 1836719614 1446852734 504108568 +1130932993 516240022 +9762543 2644846124 +3808927620 3909098697 +1713152593 269714832 1589212055 3569037814 +947578202 947578186 +1801921112 2220556229 +3516724740 4262938719 +1702710704 1950436355 +2015055077 4160359532 +3147939160 3147939144 +3275803635 3711820599 +2247527663 3295283601 +4239197024 4239197040 +3408439145 973048408 +2813376692 2939339609 +185340477 2701178370 +1947821353 2616331416 +3035051124 3381660436 4290496223 1006080655 +977667223 489248375 +559496625 4183993409 813440422 +2785153409 432311558 +889288930 3959047165 +2043782345 2382784632 +4064677383 1799886102 +1758693062 1133030151 +598089559 598089543 +1272182393 3205455909 +3759310933 1715234028 +209861108 2768321305 +2977206325 2977206309 +2729677629 1571866900 +3137799509 1142587031 2920653745 +607444594 4077773172 +1040814692 1948064373 +2437767466 3872388379 +4206472319 826969086 +1752380116 3683451449 +100869966 3304513497 +2074208429 1289832516 +2470611377 315681870 3997841771 987520589 1391287822 +4098083840 2260345861 +2487930122 1563606752 +3977229118 1840720543 +159368553 3914203250 +3877995235 3272411978 +1963281059 823692762 +3592136986 1185048886 +2881840706 2025278644 +921818084 1156746200 1655738367 +559804410 2162214539 +2929851175 1585141779 +162577309 3728169012 +1551575165 316718292 +1093422825 2176858328 +4110909029 68741953 +1079646754 1876370325 +1053188005 2001244332 407223512 +1592229420 2456526679 +509668840 3130426429 +4164960011 3626188354 +3725018459 3765579346 +1192488687 3546358318 +3673039639 3643244175 +3806797993 3671616024 +2803959526 4278049793 +4207595927 1682436272 2369774851 +3689210124 3409445153 +1357219915 1581111170 +1113038519 1711364631 +4194358713 1372499375 +1952096485 262883436 +2844624676 1622905103 231456169 +434387578 1011355165 +2436137453 2192082948 +2507212916 2507212900 +1466930347 1336346914 2549316815 +2976289571 4235658692 +4249076451 2494286684 +2495510610 3776604397 +3296017467 2956973800 +2429450204 3506876231 +3546424451 49803377 +3218197617 1749341670 +3212556768 1338350501 +4045747962 2543160194 2543160203 2543160221 +3117610227 3117610211 +3379084923 3293808043 +2359644888 2321220250 +4248592047 1430270956 1426656622 +140213331 4013374893 1416335552 +2220807347 340317644 +1443473512 2835851495 50178369 3644070844 +2368010427 3962801764 +72843651 3116650915 1489035562 +1253111376 3834888163 +4202837537 2080060927 +866959967 2932503266 +4250912911 2813289223 +3408556268 629303398 +1288674516 3201556920 +3728932079 3530828846 +1524410600 3642649296 +500647240 4255387533 +1055588621 959059932 2900854638 4130481019 996057529 3110833967 96452457 1608158709 2311050489 3928679255 902324627 3759775102 3711780200 1967459496 4230622763 2308621620 4132031207 1433451461 +1221258435 1221258451 +3155523526 3687550135 3687550113 +4114609944 2519584947 +1218328060 1292827559 +3774798595 3891087078 +3052284521 3471623000 +3350926937 1819098249 +771471252 4148297199 +1138001273 1083055486 +721578609 1169782007 +3175497879 46558211 +1250046423 569668976 +3313658289 911120557 +519712597 416842442 +2702645856 2702645872 +1740785405 1406517314 +531019159 1785715878 +2493244255 1038474202 +600047348 1170986312 1103875852 1099586073 +1709815726 1697258994 +3413032843 3663175954 +2391439961 2731318590 +3608542415 1629310747 +1100544037 3363460067 +3299891578 463264523 +1352325198 834831055 +2398092337 2449920470 112813200 +3801270699 1477670946 +4017328384 1887469772 +1001637160 2818635093 +1124073724 1124073708 +4149838759 149569526 +3474881260 3697970348 +1190680818 2868118771 +2374713747 1698183802 +744128490 3161939277 +1722992590 2037418329 +174031709 2975583074 +507919728 412268355 +2254370095 3061577969 +265368008 2924568011 +3525974015 3611543166 +319796195 3837275740 +3202070506 1575126349 +459389064 2265950092 +3564574012 3010882936 +3536213000 3564392227 +3068256302 328460409 +3147413545 2080172174 +3366989694 1801110345 +507196673 814562342 +639333818 3074053085 +2993816613 1680284477 +3084433505 56775768 +2024980420 3311657353 +926166949 2351366316 +1383747667 697070252 +1551492677 1551492693 +291848705 1667688320 +1061379589 2618098138 +1853931528 4239281309 +790047712 4163487419 +3148853832 803065595 +4289174034 2262272595 +1132528746 2920936155 +443682461 1049428276 +3077624984 1587456859 +1868582540 3768297057 +2781668780 2911735233 +261087599 726684844 +1136647378 2371798398 +360351141 2994686051 1960862394 +2327982815 2863227352 1320555796 +1366953326 3292462298 +3250356688 818831343 +1435597786 2847515642 +1333299626 1715265984 +158534064 3635423944 +3549231395 971787098 +691340637 2162682027 +22089927 3536629715 +2371481091 2371481107 +3415823478 4167038417 +1995898252 2575531228 3536921463 +2311328044 2633106579 +3659054400 970334431 +1561895909 2244456951 +1272015754 1272015770 +1963056022 3354176817 +2819453840 2729905661 +147057320 3229570773 +3482416091 3482416075 +2444891729 3102810512 2632426095 +1178849236 1232846732 +990006400 1688104339 +476062489 3294052446 +32143478 3093931105 +971031964 3101103249 +280683428 158040473 +4093063931 2309327784 +2014582204 2014582188 +2149076968 2386938429 +60910993 3482259254 +3522225400 1983410797 +2742909140 2292120768 +1580799380 3266742777 3890018287 +2048237279 2307379969 +3204813183 885263102 +3424293534 4278286015 +3754249698 630823637 +2801215935 2722398877 4264436537 2518071230 +1877753715 2749882906 +2975705332 3906375496 712046617 +1817296258 635087261 112022435 635087242 +2778112006 1920956282 +3891998136 3899193517 3899193531 +2407195398 3832767073 +460779814 1648205505 +432072936 3320717059 +4099636000 2373109740 +2193568474 2902265131 +233421467 2180039186 +218549229 1439862341 1857226258 +465800676 2308693019 +3382859780 359051512 +576675989 2971994780 +3111561852 1491271729 +461190694 125131111 +2571033500 2571033484 +99820930 1012408590 +2408995279 1387557885 3635372238 3977603354 +3869931096 1985498267 +3410966914 2411169699 +2494594947 2368651110 +2090396495 1941597528 +2951948701 2563408436 +2131370945 1114626135 +1869031584 4284806131 +2466515099 830880805 1324837470 +3320232998 4049736516 +3897137486 4191966671 +1193731566 3714302585 3714302574 +2868012751 1298411744 610205552 +3268358103 843308789 +2516445419 2195636898 1190828744 3031202588 2223089867 1023052568 2977097003 3362982239 2960319381 1023052559 162900468 +4036526489 2198047678 850101695 +3065217421 1735871717 697626866 +968908102 802346295 +788020184 3368432909 +2988073810 2978634245 +2028853699 560844266 +1516637370 1209767774 +3923691797 4031309266 +1420659555 870346058 +2052079819 1786645363 +3128587744 1858572197 +1284415095 1072803060 +2478556624 1620600419 +734480190 3497345720 +1137068214 198838818 +3371535507 3985394540 +1558584724 3527446521 +4057985373 2577025346 +2781824571 2781824555 +4010859402 426145321 +2934841193 3655043944 3386602072 2934841209 +1546983911 244827830 +232520178 204015626 +1693285229 1569876320 1029406311 690876916 +1233127663 2540002705 +3571900068 3413146687 +2162045734 63603927 +3588182591 3985537342 +2537895245 1861412900 +3480725961 1650476910 +1325134406 3294085777 +904907216 3095048821 3844536637 +2996906959 45610702 +1404714508 3660557559 +1034523328 3304896667 +3390194737 1270962470 +1494599442 569456045 +2937379461 767228604 +2603445838 2525275353 +2418243221 1511370419 +1178930931 2444658828 +1238419883 3205773774 +434531082 3485106349 +541486323 3252519564 +1536715738 183617579 +2955886801 4260863776 63939472 +451125229 451125245 +3018729276 2078786407 +1725714273 1305540022 +1918668922 2176282653 +3374764782 1722003597 +1137011762 3788067507 +752604075 1225668130 +2041300791 3228212102 +1413500587 1278990114 +174003808 3014670643 +1079440267 3554763732 29733038 1607476911 +1670179395 288436666 +1318219769 3495856373 4191263164 +2143980517 282737004 +683734265 2719780981 +513336475 3316637700 +2384990334 1078384521 +3754168376 3754168360 +797057786 3758061506 3286044555 +4005950756 2303505755 +3729776755 362799584 +3628080861 1240503796 +3968758871 642003882 +1822909182 1180974300 +1326072673 3458732470 +3822413704 3072714492 703483573 +4031819399 4031819415 +2284850233 2284850217 +1127624681 1558230350 +1530039772 2070679675 +3097158618 2832290722 1976873003 +1483947338 2271837037 +3906601791 3459456062 +132776434 1734414309 +3390161664 2090428580 +3052769381 3599912684 +3220729791 3507767303 3597111750 +1606573169 804750832 +1724058622 3272335583 +4013695718 2175463447 +1241406795 3329023234 +252603506 3464284698 632600435 +988478116 2273433724 2955707675 3852892689 1954500880 +5038315 1678119394 +2782342295 1387216464 +303763993 2577235294 +2481450172 2451155943 +3713518495 3427418698 271944542 +3138343337 572361998 +2330424148 4267347247 +2707936887 1985768911 +4280516553 4280516569 +2362516650 1463596955 +3714333911 1540081254 +2300569610 3149851507 +3766003852 3924907127 +1073499062 997383563 +1733198056 2291461437 +4125514189 3202383666 +2180363805 1767782080 +1828800459 2265337653 +1685439002 967951317 +3270521202 1377687155 +3502424355 657582599 +1643494636 2082584596 +3995409830 1101417702 +4287986931 577545271 +1154959770 4176010603 +3628045863 2467913568 +2963099535 2527346190 +805933293 1646427099 +1449416986 3369264294 +3984268900 3408034312 +4011322293 663611213 396889578 +3497614823 318591127 +920048458 2653855085 +838424082 2808929466 3179445843 +1057876059 2649016146 +1569412860 3633496231 +2415574029 2662432705 1446077670 +2747285297 93915447 +2052812069 3270299962 +2909695084 2528447271 +1510922972 2707589191 +1622810623 1140874856 +2159594655 2159594639 +1457933806 3129781679 +898495551 2373418814 +3138842566 4080581649 +3805326348 444520161 +4223878514 3440629271 +4242960900 583367775 +332772837 3547540259 1870469895 +3085974557 311858478 +978267153 576261847 +2945380028 2534505188 +2649824361 193968462 +609095192 1054879707 +2648494061 1872450066 +821975715 969596806 +1699396502 3912791159 +2642054285 1961574884 +70951042 406220773 +2077908746 1751286554 +567150215 3193194134 +2096328933 2553985139 +1034260690 3718445715 +33843285 2180005340 +1395787487 3334702565 +1190350751 1106994780 +3486216693 1806333837 +2506738281 2928262248 +1522961341 4202781346 2743990932 1522961325 2743990914 +192241906 1312559757 +1138276228 526395503 +1932014125 1732457697 +803972166 2462887010 +2178270717 2095975760 +3968910233 1154033769 +4251309822 3728097823 +2002316157 2002316141 +4030746552 3980230317 +3235600618 3235600634 +104000585 187299566 +369625673 4154994926 +3123689308 1964877265 +2206798542 3737688655 +2086386855 1802107616 +3701423547 162409828 +96569526 3316266641 +3056836620 1519015969 +2524045996 2168968385 +1888690154 563821901 +2879319086 1496173679 +3586096257 2070845624 +370407122 2473430149 +423324620 2223682080 +273228401 2521497344 +2060318023 2570657472 +987547488 987547504 +4251423206 3490360599 +2019549908 1209337324 +3422217749 3594164496 +3102810498 2778185653 +786400004 3453697887 +429812158 308311583 +2409255683 317763004 +396174587 1430822469 1212713414 930002450 337415350 +1648901239 783757136 +3269591538 3150516218 +3633173878 466976700 2580728565 +3786219583 3911026665 +2689672811 3401546338 +1684441439 1062957329 +496199501 3691748900 +4038040274 3329396602 +2921671022 2457876537 +1173320319 3192053261 +2922364681 2510034602 +2808112878 1791101113 +938880081 1770505104 +2110325095 1785541942 +2683943856 2250405397 +1721656580 4062401016 +990495856 209648092 +128424851 269017600 +1404923985 607637382 +2538278445 2575398238 +1258055446 2984301408 3370186644 +3831990218 1492828923 +3464521962 1765337054 +2450961649 4033680790 +2625105180 1399296967 +26440989 26440973 +321589016 353020068 1154007757 +1016360969 1016360985 +622071422 3700609119 +87189653 3277496970 +3588981072 3772264892 3772264875 297570549 895489704 +533254962 992245669 +3676837685 99270348 +3648882129 832153616 +1201361380 1200224996 +1720405990 1006856486 1397671703 +3545499647 2890438248 +3419304207 3841718936 +1504737203 3821825740 +1134314717 1275095028 +3470956217 1739801918 +3672423162 1608587374 +3711993319 3491035634 +1056606957 2043798853 292074258 +3054501906 2905611347 +998155603 1445937325 +1444131435 3959545460 +231179373 504723346 +2131713043 3836676856 +3318244240 3401809387 +546647049 1406423608 +932937334 2241605607 +3673124493 871041010 +1498319085 2210342241 +4159121136 3376242780 +3963879779 1376661212 +2221061005 2787561202 2787561188 +225339240 956611152 +1502240118 1792090321 +1083983881 1083983897 +1507742469 785016636 +219064809 953068645 +1307942792 1101669149 +1425710165 2986246408 +915178 1413072197 +3521700193 3533360054 +1249706439 3953476301 +2150622759 27394648 +1209865057 2661161551 +1048671402 1996871941 +2218390214 671282951 671282961 61530134 +1209844958 1754078047 +2387795483 661890180 +3775928674 127480750 2925000003 2169073325 3078035581 +113726533 1826621064 +640911641 1008783944 +3084498092 3035240568 3228382409 +3009612450 115981589 +1788155294 3197530405 +2460172932 4237456764 +2873130104 243527931 +787385191 265917541 1242839922 +4241894799 2485762062 +592815164 3687942759 +2003930255 2529183000 +892982311 3508572722 +1437894194 489636019 +3145434636 2493754912 796132577 +741320070 741320086 +2468575524 3994888294 +2868223687 4009160147 3886609216 +1659880837 1148448844 +1831603306 2530186949 +2583549443 1386058813 1109408240 +766196546 646858997 +675126362 120766736 +2787294862 1076612587 +3565147496 2399794256 +1016903333 263423418 +713751784 713751800 +3558499634 1063405778 3329315035 +2658786755 4198693857 +1157036583 3083586422 +2870259316 3314458767 +1147877204 147331385 +1249734741 3466956026 +92467105 1334661116 645189364 +1354929948 990601380 +3763194906 3482930932 +2229183316 1139871346 3278865096 2547366919 +664894089 1382584371 +3433953401 2034229598 +2412806036 624551865 1227910126 +1762059157 3940041628 +2468082653 1912661218 +2409009113 3808719496 +3744743605 3450782797 +1573294188 194337303 +2731514447 1100682823 +2958637218 1047799573 +1546293407 3432976220 +2072048050 503085861 +2539485949 1160289364 +3909052162 3423545397 +628758410 2301824557 +3736443694 3320007023 +2612033328 126732956 1187750037 +4022128542 70964671 +3441408754 3673377509 +4129509161 4129509177 +579342381 2301720260 +5170049 2831732390 +880787703 2619131088 +2768005532 1431978129 +3313955013 1772131489 +2383229607 2957796118 +3776438985 2858929860 +2744028975 2744028991 +1843899091 2630775715 2443956247 +1900448182 2826806167 +1569979976 1569979992 2591138676 +1468295372 2440100129 +3859394967 3091370150 +1702935034 3282355339 +1277173988 3130246889 +660494910 3969947027 +4138252173 3633902322 +3709205075 1895120576 +3630337305 1440150609 4212406228 1375817127 3772141252 1152616240 2698810770 3780269834 1270153867 +3093034474 364731461 +1996392931 1546338199 +202155666 1956783494 +719398269 4251845570 +3613564477 2622877986 +2453478978 2016846307 +1355328357 558471075 +2620182179 991982471 +2216965862 3942804510 +2815314042 2747013149 +3583508556 3424349082 +2110811128 119142253 +2719621154 1361089923 +2850185569 3495906208 +1793930135 3932698288 +319330444 3713090720 2189960289 +1071649464 708039251 +461023041 2199210838 +836287651 456193180 1779503495 +105991592 2583510891 +2410772637 3512786740 +3839764785 2059065392 +1805035107 3240619466 +2552526181 1719138330 +404985926 1974916881 1174976054 +3208849568 2569144811 +2133319267 2568710470 +3907843782 1929935265 +1328029288 69721533 +1022629610 970777925 +4009009587 1674285635 +4187310573 1079000133 +2247694045 3245560498 +3492920612 3796680639 +2789083302 2415163122 +1514567092 2805909555 +2874512204 2874512220 +2377156896 1792658552 1954614594 +3825793201 2870967974 +2224433621 3727729274 4092887993 +4007718717 1226349844 331295266 +3350919183 1208260928 2052358040 721738843 +944854845 3842790658 +3657528450 1428341639 +1325872811 2891509464 +316519830 430243447 +1269380660 1331712985 1331712976 +2793957988 4201596504 2361359209 +3763249150 1903866655 +1302758426 1461843197 +3613973194 3860727750 +727029692 3190438124 +3679344198 2186399799 +2610791191 2660508131 +3621065777 2204542657 +793246110 206435241 +415214572 3787170945 +3274364337 180951429 +560199118 1921871106 +3274310869 3040048493 +1319649170 2148694771 +861895519 861895503 1045378718 +1020129214 1982883849 +154852515 154852531 +867682341 3641489302 +1186950175 2119644382 +3572923048 1347368272 +1523321132 650754143 +1937041841 1639873719 +3120941159 1041922614 +3365212621 3694786340 +1772326758 2386064550 +1802933042 598440292 +4267228292 3361082968 +748214675 3349054074 +2369848732 4183544967 +3610805027 4042682396 +3210034110 3370783966 +3979931826 3979931810 +1250091734 2344514701 +2775014928 1854145256 +100433150 100433134 +2745616318 2033222434 1511289515 +3362706600 3362706616 +2197829912 1364844749 +1681106108 2500604245 +2538554944 2951649528 +1554182684 4035125777 +421125668 421125684 +1626769431 2299577081 +534870469 534870485 +4077921773 1438353073 +624103897 2456701035 +3330265940 1892397247 +1433536796 1422224135 +966444763 2309425874 +2075274053 943497142 +786449242 621414059 +693930087 2209004086 +2546261157 2414303148 +2631517126 181409712 +2018679826 2573636282 2081140819 +1337352545 1780027224 +2566335358 2284751556 +3287813292 729543383 +4127230074 2535455318 +4107171392 982057439 +3745397248 1440694840 +3050725387 1266233666 +708529645 1750838276 +4033060088 1691359853 +2054780382 2054780366 +2977550870 2026223783 +2123359327 2609152414 +1633440138 3170505222 +517330556 111191335 +1351813999 3736180234 +3917349240 3721418145 157044731 +3791972815 3791972831 +1165140852 2580696543 +1980692880 3945990712 +3078990363 40552600 +219370275 219370291 +8671385 1766514888 +676538631 2179569174 +412268375 2434284714 1035491875 +2401343741 86365287 4162404132 1508334923 880303365 4280503739 +2418620084 2766216527 +739613587 1831264791 +135595372 1695329409 2482212608 +1929602314 408424123 +969824164 263067032 +488253748 70180047 +2643155690 4002410790 +2329628161 2554055574 2554055552 +3462685177 986635742 +1464163840 1464163856 +1077298836 3054335464 2842761977 +940617758 1615150889 +4054968155 3591320658 2509951457 +1968877376 959865567 +3685069475 1759000202 +1826898614 559219857 +1498498847 1498498831 +222233591 3509796304 +96511300 2086022232 +1839273892 2667588132 +2881318125 1211267332 +3629253350 4258321447 3065903478 +4057355981 2171249842 +2717298164 3948140303 +717334046 2547217983 +2051685074 2090753949 +317649917 3408533332 +1663204710 2410288099 1135877539 +2670020636 2746254343 +3710753768 382496299 +3533843309 756005330 +2914488141 3304494642 +3065977449 1243893701 +2020943330 484330462 +3093065975 814077126 +992794690 1771597813 +338144431 338144447 +4024298681 2001225374 +2754787379 2933389388 +1008836503 1560703272 1072577209 +668080841 2025859704 +1165394537 2509474766 +2976844578 3508387882 1942914691 +264742452 2675961503 +1702161548 2442334104 +1120326853 3838875820 +3734036215 1427046086 +84458183 1984296568 1808490897 +1406012169 4133183288 +1100156976 1080593291 1786936195 2241696328 +631335613 4196075412 +2367372330 2672444851 +1655126463 470175090 1214643016 908005610 3083002961 147565599 +2172499739 4092018578 +187401832 4253324715 +3175857005 1798835332 +1927928166 2205406790 +1022623911 246534820 +3585943559 2143683337 +144403926 2242269190 +65892344 2024744083 +1426786095 1261414879 +3845599966 2963124457 +1476038473 3362754552 +530267896 1144366749 1900122106 +644057810 1085507717 +1370571783 2702055190 +1839280757 1384257295 +91273993 2574675758 +3599281715 3962190426 +1073933363 4154053722 +3111084103 827625408 +3704356182 778766386 3944730225 624999914 2316430369 2387091193 +2748382558 1073666815 +1837904563 3191983053 +2107334177 4211927431 +30377082 1403882507 +2766395665 1913136800 +2255205717 4035867850 +2702913654 2281616819 +1658597171 4111953715 +3556018047 1541148988 +2079343160 1396194875 +2085005080 3141077723 3141077700 +2754601656 1142928723 +1432157783 1432157767 +907306128 801166828 +935233965 1844624196 +150118145 384847510 +3914696622 2626630947 +3281526707 2608457420 +1740118217 265225326 +2829250251 1132325277 +1027374278 2918278074 1406243078 741895095 1406243089 +3734467460 3966425289 +2604464163 3128477600 +3786980017 114156710 +3471040764 2611436199 +2498119706 2156101858 +3960486935 1819906947 +4068611138 80077795 +1280478858 2952160045 +496919435 727102420 +3824099952 1098069589 +4063958023 1509984022 +2394116975 323770296 +999884799 1217514504 +3842730386 586625221 +3209968539 3432633604 +2167701348 3607487321 +705521977 1813816510 +516852074 3911340507 +4021858118 2780556065 +2333355888 2333355872 +1601676365 3878570235 3724086693 3724086706 2522326322 +241385387 1362967092 +2556112637 3565877314 +1608108026 3721776797 +2118639612 825291184 +3241320648 1425230325 +3912499023 1809508686 +2801207387 2566943538 +207212387 3563157724 +56068945 2479902864 +3982378849 208297376 +1017961363 1009247597 +1754188675 4220775280 +765703647 3082243592 +3510449971 2522735948 +3756879496 3005278611 +571799502 2169362265 +1830405876 590153864 +2949628252 537748433 +3669029532 2691738619 +1731298481 603185840 +124232112 1478723605 +2906946504 2328812509 +3880386361 2490160834 +1484356159 2252042536 +3550330731 2354337122 +2167833724 4278283557 1301419336 +1782020201 2656210264 +2818491297 1413195288 +922234234 2724295171 84692912 +1558454741 2925222522 270615114 +2580661704 3980024267 +1850225323 1847085784 +1749713938 1062070355 +3214117507 2553594609 +116170572 847168695 +702989378 3671918372 1027072846 944174069 +535071435 535071451 +788962184 466513772 +929729646 2864386361 +4222201033 4222201049 +1188437414 688958551 +4135598476 3209215421 +547930458 547930442 +2745908888 3477152819 +1153368891 3753582726 +3629365522 978078561 +2579316346 2129222173 +644887808 2785332024 +3024272955 637209370 +3318690042 1514550741 +2889816202 2975047981 +669229557 3226989738 +1719105800 2697404159 +367634405 1674792300 +3798597815 2285861155 601825296 +1688958842 4092400907 +3898869649 3924809882 +3684951528 2869095485 +3299489004 2213629847 +3398752546 1039326626 3251322411 +409499161 1884446441 2238835038 +1854642085 2244988125 +158308458 1152184013 +375512306 1951592077 +2460749102 316194671 +4294868826 1470266045 347948547 +1238969783 4061314025 +3002269844 1711100552 +4167146532 631819455 +1941498822 3734265053 +128296317 1250206427 +1418271023 697938540 1139401191 +3849226918 3540271959 +2297365375 3987795260 1468356877 3987795243 3279648193 +606945300 121364345 +4077284203 4263188852 +854158949 4062468929 +278860382 2288642550 +1779745889 429210915 +674827618 445533644 +2670474438 2670474454 +2175886058 1992349065 +1748596540 2571179677 +470107590 470107606 +2574356334 2253470523 +3867895174 1936773623 +176121490 1908494595 +3775821166 3083000889 +3917453293 1422558016 +2118463241 3488156462 +2116554328 4044264589 +3342822231 4292213232 +3587003316 1178256473 +356328500 578198575 4292905044 +1173955724 3395938780 +1408571765 2681672508 +1138796285 3618037844 +2727966904 451558212 2946042285 +2001129505 3618387509 4042494435 880614480 1828540295 3849954294 432288150 880614470 880614481 +3110494700 3358336641 +597051965 399498257 +2809234846 1266229695 +1306269749 3329891196 +2312912742 1807207831 +1178698335 2246783714 +1816563174 3194384523 2022309442 54215138 1494311191 54215157 3528951149 1598394576 154880842 3211162129 +3960759441 3731643936 +2179164088 821839547 +929723163 1469264772 +3478106533 3735189194 +774817877 145055178 +3399594951 3280863808 +459960211 170805957 +2789540654 3970171247 +3054301077 727525276 3877691223 3450158650 1427570443 1214909658 3332715296 1796678067 +4278493784 3427504283 +3630545996 1943379334 3745970657 +2966137410 2728206085 2966137426 +137126463 484354366 +3811779780 1837293727 +712290979 2025141898 +2477245177 1779953150 +836456591 1527854772 +809866422 3012106897 +669963625 1987811033 +3285402317 311568548 +633418070 3110879265 +3824550719 457645118 +2347875832 1166937467 1166937453 +3514196736 418886021 +3374812738 3947164149 1284037438 +1864761782 3218306945 +937803570 816577445 +2250781228 2250781244 +2128517597 3475182945 50698973 3379725623 1069733889 3169114309 +3819887102 1782655711 +379803386 3882208213 +1390250905 1435966869 +3252912248 4240732612 883324183 3043080576 1059429421 364655726 2530309813 2560573293 498080956 2816978433 3131464964 3932468232 2326676677 2368846220 +2297284490 2297284506 +3544853093 3544853109 +2577638824 1227621247 +2806125440 2806125456 1130694491 +3863113920 983006789 +2169864854 798790193 +1593290669 753503579 +316726816 3623726195 +4010211149 2829240801 +2867815751 2867815767 +1520494748 1525051579 +2971056752 919043669 +249605932 2545140311 +106936207 2544760334 +412151214 1512450297 +1469865457 3693601402 +2992194656 2129843003 +2880451074 270365194 1214167331 +3343738581 2480464220 +963488769 1755694486 +746604877 1525900338 +850537610 1484528955 +877176971 3647034068 +4134234939 639225330 +1425585360 2474943349 +1050320750 4114733038 +2936510258 4025723415 +3213316807 1225215830 +108650658 3554451203 2003325806 2270056893 +1463395449 3367889512 +3266740773 2857295916 +713385028 86578254 +319762834 2464876755 +1362975053 814978084 +1014342125 439216146 +3491088551 961208060 +3571675329 3809116118 +987055598 3485585254 3485585264 +2989048647 2989048663 +2127669374 3964017834 +1198176358 3540011159 +3110475932 3110475916 +3062746424 2570719035 +1785117420 1807237505 +792710944 792710960 +2719789793 338532384 +3451123450 3427650461 +1176851803 3351600717 +734489189 1340898540 +686932614 4204083425 +1059263599 1059263615 +936827035 1916199618 936827019 +3239804367 3443985614 +3403380806 618772614 2642302519 +1541065329 174895088 +826672991 1927964634 +917635749 3208260012 +3119591638 1608453025 +2436188273 1004175095 +983800884 4076065951 +2370762022 3830496784 +2071167654 878814902 +1798452313 2471380599 +1543376138 2174049524 +3712474757 3710077772 +2260565156 3226154559 +867560029 3294621812 +4114550037 658610186 +1325044162 3133159389 +3291205788 3291205772 +359659418 3674181712 +1789988261 1740728125 +2405456808 1555057003 +4157664647 2766531478 +1368255357 1969823842 +477650407 3095122592 +4273625180 4179531664 +1073845881 998236286 +3353191456 3253296741 +3943411785 861936825 1281786606 +4084195061 1074605210 +2234087519 2234087503 +1414212166 4166224951 +1220813940 1220813924 +1966155170 509492757 +3100208099 305917715 +2756071429 889397552 +4091114189 2890905778 +2788245582 2960425210 +956539246 3080691518 +1206773297 1820417840 +883734453 2699375100 +4275591102 2231929485 +905126932 29477743 +3644315113 4146940863 +40218460 482131464 +209519867 43822527 2748241700 +2314401400 537677587 +672921364 939914361 +4035257683 3935748269 +434280140 2343789367 +2867620383 824905438 +1955783210 2906261517 +1622541319 3496717197 +958035435 3483869428 +3065742839 2687755206 +1019122073 956249032 +1216127216 3837227124 204560835 +2230917842 2677542778 639973523 +2168834672 2180607965 2024478964 +431203888 2781781379 +1931275568 1720279701 +2648947518 3414147743 2940655906 4179583049 +3399050251 4202200386 +1608674902 3285637354 +1404881031 3859582354 +3072195359 4030119388 +4080048883 3364088986 +2612320013 716081522 +347907242 4262638091 +2464639362 3293255605 +213849947 213849931 +2757694377 1789653784 +2951638841 760813246 +661487122 593327685 +914494040 650305691 +44089387 1309574068 +1332440237 1345588056 +1185769344 3271159429 +3232258466 849395335 3942980099 +1144382458 949496156 +526241320 2292943083 +3117562771 3016000022 +4195972959 994377301 +1567910158 3119237785 +154893034 1923251803 1923251789 +2963313349 1284669635 +3916174179 3626140874 +2822891753 3598552411 +1409648962 2260144867 +986308978 986308962 +4043640012 2915272148 +2513694884 2590770862 +2210042449 451058602 +610930998 2298025991 +2955841456 3086145309 +4226553140 3366281423 +3220115365 3220115381 +3003043018 1789804083 +1369690833 1028331126 +595863150 828389102 595863166 +233741448 1990224395 +154606798 3572561451 +748112854 137126385 +1489682893 4162791218 +3485502646 2944077970 +1973482439 1606339268 4083139158 +3632769487 302730741 +471208381 2929724239 +904527203 1113187018 +2642330920 378559979 +3471097716 2465712585 +2613950830 3000690735 +2721342223 1735913614 +3072223280 2390729611 +1250046425 603224222 +404547904 2804308472 +627112675 3131765578 +2362952321 951306518 +4019996327 3926086150 4019996343 +768337128 768337144 +1700782597 2599472588 +4044370613 12262096 +1385822416 3630346083 +740375769 1364380062 +362171298 53572973 +3941612676 1546601439 +3665265742 941967065 +4042111140 3223240016 +3868486408 1290906432 +2949692801 3280087051 +2545029581 3351186879 2703161124 +3065384978 1265267223 +811895055 3609457810 +943835660 3328021025 +831113182 2004794122 +45997362 2991325598 +1055753149 743337759 +4202992498 3501464691 2020746846 4270377229 4270377242 +2114134791 2030611474 +1550200278 1255811057 +3343968208 2489117795 55065643 +820011073 820011089 +2026564614 762416481 +417250116 78591336 +44507155 806839466 44507139 +3470685188 2888868425 +2144634944 2073197765 +4080833166 3754676249 +1692455503 1692455519 +1336904489 4275768453 +3886109842 888676819 +1080899032 1139524379 +2448799062 1779280306 +4211505131 372164340 +1098932792 1427807789 +3995829516 370697439 4202852833 +547029000 1923537717 +3492942655 4258548776 +3138390015 2034013800 +2421336968 2421336984 +3844874685 1470621438 +2845667811 3856287818 +4074936552 1119270205 +224929173 483675208 2951948683 2951948700 +2501592118 4025245969 +2290095059 3030332716 +2672613476 447458364 +2013392880 2661393930 +745869215 2590749622 +2901479060 3547984623 +2710365017 1725148734 +3279141654 3308225447 +3504176897 1617008166 +1724177528 2243929363 1072107771 +2643662289 3375179812 +1728600263 2774232418 +4138904839 3033286148 +1342980321 2528369414 +315199032 315199016 +1883874275 588540614 +3199689400 3199689384 +532716674 1503275911 +2800673454 4003235769 +828340281 4064952744 +1417004213 3144678365 +1458335200 3056662451 +754497890 4129339499 +111187130 684335325 +3296722864 3283735053 +697408822 3039835274 +1602565374 1917496740 3353332173 +1049089952 265842931 +798164169 1982252345 2909833326 +2585513501 2572098615 +1762871220 492429391 +3737330687 3027136821 1054619243 +2326197407 3822261854 +3282171031 2398357926 +1881090445 3867230237 +529100251 2153246660 +1869843302 4272620317 +440379124 1177801231 +2869676080 1938563988 +1340751405 4206878930 +3337214286 1881216473 +2223352833 2674771350 +2727798394 1837945355 +2970969725 1102075586 +4075929636 809223728 +924560325 2240767756 +1787150129 3784047142 +3372750445 3837480324 +3198942814 562047081 +1217303567 304601179 1198723992 +499378014 1603160382 +2530582973 793615508 +2029941938 2653348894 +2082340637 2151193268 +556033979 3880733554 +3527541718 3555461617 +9627656 4014163083 +560182713 1224151592 +328316716 548775797 +2844664799 3959230945 +3927052446 410003647 +2171079359 323577450 +1021132667 720743486 +2946049890 4069150126 +2876571767 1613740880 +1363062151 1823157142 +2693082002 1134794437 +795661126 1608387462 3998258999 +2030575679 2372514893 305212650 +2003024712 973066827 +156776574 169295775 +3386300349 2050334338 +1603268405 200594512 +942737799 2260024512 +895018516 250753392 +144835162 4043944875 +2360798624 2223357563 +2601784062 189062686 +1378002417 1210904214 +2214479338 4002138662 3007844173 +4143201087 2045135595 +1296056262 1646552247 +234542962 1944135795 +3041245552 2883090140 +662744402 168044027 +2821282291 1790551171 +392170562 238242805 +1893262800 1461414443 +2270871257 3973738376 +681616987 1340465490 +3352980600 349749485 +356051710 1721363935 +2183607654 2706605157 +2179804460 3026066519 +1151443671 625423386 1180447512 2406640713 1637107298 3782432870 438335224 1486108756 +74416947 2443780791 +4128139400 3418992983 +4134352058 2817130699 +185599936 708588357 +1772433144 1645769292 +3836347085 201554043 +3100171304 204641021 +2481589963 2925456061 +958996279 851190672 +257061232 448786140 +760777129 4123286252 +2889582359 951429414 +1085910768 3345243719 +2477329686 2327768307 +3087057952 3375677043 +3468161902 3650369081 +3626741463 1473407602 +34617870 1300980761 +87535368 1051232651 +3881339522 726679291 +3735038204 1513153200 +1744514909 225152884 +2926131026 3785496069 +279045595 2818166245 +996351825 3761665782 +1610263975 3198115318 +2168318766 263052938 +3904080276 3869348857 +2324190303 1479722849 +2100792442 2557617181 +1866592263 734845718 +1972178259 3034897047 +1811003496 4234266961 +4038221738 2462881947 +1550311865 2944454411 +2724699868 2233406545 +4262126217 1948425646 1788206751 +2959832428 623499528 +2275709480 695667284 2953975037 +3472059974 255236158 +1596169544 219191389 +1089994653 3815203892 +3366377631 300454159 +3303948818 353501765 +3915612839 245804256 +2341136415 2341136399 +1452260795 4282887524 1104540799 +2208496804 411428001 +2072907992 1325284084 3337435739 +3648770744 752622272 +3012369108 2065775545 +3841225510 2019556282 +594754301 2118307372 +1807403943 118180271 +940144948 1793707225 +897603430 2668205441 +1822449114 3467597720 +2706186958 779536524 +2542592340 3871782703 +917886805 1199057347 +1765085572 1765085588 +1851598671 682907349 +960487680 529478405 +702125778 3060136435 2731550197 2889510546 839641081 1771324962 1144624004 515683458 1196764489 +1858574927 3006786136 +967301307 1254790533 +386073494 3485377831 +547964658 2485222254 +2731070373 3877973164 +4192527156 2538711759 +4196000562 440925915 +2419805719 2598508839 +653122191 3614379800 +3318244253 4151627828 +1987006019 2207135587 +2399278291 4081502252 +1433614481 358747216 3061255564 +2461182367 945508444 +829666632 2137255484 2355737205 3007720176 +2997727653 3962599133 3966674618 +2334702531 3558839274 +1379652801 892333014 +344638375 4252106742 +3327386759 559876484 +3995785228 4202165833 +1566768310 374189834 +803777228 3817660959 +370407130 2607651133 +2082962629 925461018 +620641181 2133585903 860458347 350829972 +2423033711 2423033727 +2049325498 1154800375 +3021381891 2191488938 +2211081460 2497377097 +2923434236 3337932869 +2880028053 3509940618 +3395123083 472068034 +1438017321 4031499173 +223732850 1882627941 +2904307927 1517124208 +129166458 2561295389 +520838057 1359018907 3175639896 +404972947 2461591148 +3530563989 3682917770 +2772964456 2772964472 +3800013543 821466852 821466866 3259844857 +4035029490 4147482001 +4189995951 4248094523 +2875013419 4005625533 +1460075613 3420181150 +878674818 1457318535 +2019859685 2019859701 +3858890154 3206697613 +4196226855 3811586678 +4116215293 2773512695 927055170 +3702153948 3702153932 +1864496324 3061076127 +1562901172 1508878681 +2460769308 22347793 +1579407358 14970561 +2472952169 2364623423 +2857868123 2196344914 +4157238787 3562201959 +1974824327 3906966829 +3015044272 1570268442 +1716051571 2144079840 +4228595128 2108827835 +1561103603 1841423002 +2192436099 2841250083 +3731673115 1078696594 +4046073527 147382005 +2626095597 2625629915 +291140033 308351680 +3335279632 61363491 +2542222356 2648937327 +1238480469 2317486026 +804215235 952782332 +2951358110 3423977310 +1394667061 299302250 +1676161937 2465350944 +2061110795 1883511618 +2989066780 2472831495 +3723536371 1423467418 4068743314 +3875025679 3270889085 +1846348656 1334479645 4270244258 +3665583411 617002828 +27764823 4227272469 +3230829849 1643611855 +3431432129 3125681344 +2166877592 3923445339 1892346675 139631200 +2876594624 3149451128 +2385291971 2471547114 +3396219246 427282489 +1885505453 3145300148 +1358405669 4046211402 +4191394075 1163858341 +50336269 1354469732 +4209547852 1015512161 +3702350073 3729093833 +1747117205 2213402250 +3505672882 2728275493 +3650417803 276625108 +1419063304 786078877 +1539121147 1187365054 +850501941 2367183066 +3679339955 4013406412 +2617877201 1948995344 +3478461676 2534997125 +1997966148 637659652 +2706126783 2851848638 +3240662686 2182561346 +629213707 354602818 +326580957 2175904244 +1283100482 2800714997 +3263702131 152815094 +3145996768 284474291 +1179748558 1619904285 238050449 1363099002 +1409057622 2504789249 +583129614 4207235090 +3336026314 3482838523 +2433647231 3637997054 +2102826402 3759574699 +2809739055 3536969464 +311030138 2837914397 +367277092 2587759807 +314878393 707443013 +650887212 4187697783 +1111407791 110508423 +1102984403 1322658403 +1262774495 3707768001 +3805204395 3062950434 +3483200001 3587039104 +740309688 2948492538 +2209199479 3245648454 +2952811379 332205280 +393159233 318357223 +2024436222 4065424073 +3426327958 347280177 +1550004908 472762065 +1580295524 1512321380 +1685265855 3761755048 +3212866878 3876301385 +2450757961 1828527217 +3445468577 3950531702 +1610725526 3143606232 +2999550449 1681362534 +1965217587 2564343130 +1976548234 277051 +3791307136 2191144626 283235323 +2483068991 2518530044 +2369774311 12960290 +3289258584 3929235275 3289258568 +83174397 2069545355 +2752222319 662279808 +454180354 2679610677 +343820929 3285141782 +3161718486 2157587175 +2312271590 1943845602 +4277426155 2051172501 2566132248 +3341258390 3948476693 +3887096869 3752699436 +591685621 2041554602 +2236301239 749228084 +1556847482 1737417813 +107685753 1050534127 +1563954546 826092133 +1926534257 900050406 +790710313 2197062783 +1806345822 3254980735 +1274830495 3310692986 2182176478 1463821663 968142011 3055107125 3038864491 558250234 +703781410 2916329259 +2339398283 2339398299 +2449037805 2449037821 +843942276 1029589615 +4132955003 1197152946 +70412967 70412983 +3681234233 2386080555 +3257969513 1566662216 +2381890935 4120828486 +1734775649 662307232 +1137534398 1137534382 +754599256 637217179 +1047374825 799383512 +3756382338 4174632117 +1742317206 3271371685 +2341357118 3494929225 +461067838 2117071469 +1490365054 3790860549 +4199864241 335074902 +775335655 2803193270 +292194178 1095336842 3971174819 +1016610515 726006561 1529136784 +390469476 4071437564 +689640976 4111419143 +2348933111 3445640505 +3109282584 3608051419 +3741735424 1230694532 +477106250 726527411 +950423871 1825695272 +1145934237 589052468 +919820643 2981476060 +3902569027 1901361002 +400832323 3745709674 +456170883 1351087402 +767767180 2521338465 +2141373999 1838393211 473824248 +4006579716 4105998409 +1149380690 719681811 +3198399814 1639341367 +819014667 686332092 3540446709 +462182465 2666458710 +2151219076 3689068740 1429057647 1429057656 1572486345 +28812367 51882072 +1474930258 2087545590 +2728175709 1503464043 +2369937543 2267963038 +4053613231 159605102 +1628210524 582348743 +977025311 2086596193 +376601935 4161574321 +3046168656 587498979 +2356684785 304537702 +4242178944 2348614277 +1572612223 238272488 +2976489386 4081473677 +832466052 2690962377 +167884101 95443859 +3739250584 3739250568 +2710818033 1286315888 +3373324356 3380900639 +2138328643 1166412848 +3246220519 115701497 +2817679898 3956715285 3948482282 1726382025 1014153491 3817161316 1433572193 1864144613 507014402 +3621991281 1269431014 +1815488450 1437388990 +4260069338 1834691748 3174651377 +1114936867 782516420 +2115846244 3042055227 +1970063725 3652553051 +114202250 1094122299 +2763876583 2763876599 +431409207 1624265456 +1207013712 2834612651 +2292918005 1169011866 +1312304786 3027324869 +183916961 4153350151 2181267910 +1182259170 3072666149 +883481439 883481423 +3985726526 2819647839 +3897867365 508780426 +364500309 2290799818 +4074777824 303378363 +169628439 26660144 +827119705 4109931528 +854626166 2796672721 +3066393937 165129872 +2100806420 851974256 +2827297953 3718918463 +2138505814 2138505798 +1812463101 227857748 +642225490 2494566405 +3128328800 3901701413 +3882489613 3882489629 +3453961639 3178931702 +3239411617 2513955446 +933177129 3096094104 +359904234 2078082086 +2231385160 2808014173 +288309972 3781571504 +1126115790 1895601433 +771430207 2705692712 +3132657389 2466309595 +397589243 1230788900 +897711479 897711463 +3182329342 2845360415 1046095714 +81908182 2239583207 +3881592058 812840349 +2094156570 178768291 +218206292 2853451199 +3012284773 3012284789 +377970929 1746770790 +2038269834 3399245371 +933919696 3966840852 1887107624 4035833917 +665328607 1285808158 +1173924560 2235547026 +1740517053 224629652 +2216428669 883992046 3919210895 463167860 +566489952 2272796723 +2152285562 3401233567 +2341301331 44140218 +3732028517 392005119 +2879421320 8276657 +382614666 2508493811 +2260667046 3300770625 +1268523731 3653947962 +2633829766 2824620513 +273713761 264885942 +3676862268 1018409841 +3405834087 4184622902 +4059267966 57681783 +2119320384 2119320400 +3798448120 2250677877 +1667740627 3631105732 +2539738642 3474250938 1614446163 +2592483207 1036675738 3752185981 650790490 +245955330 3202755982 +980707056 1337360995 3746513354 2370719583 1774859012 1505137200 4072028782 3758791689 1785209219 4114484181 3853295708 460224104 3775569327 1785209236 +2956985380 3052201742 +2013248492 3549746305 +381279771 3784877188 +323032244 3354870025 +1493858898 2705013498 2105446163 +2351433645 1215139845 +932102316 565792471 +531589488 433289224 1361247043 +2047247195 2940720379 +3028120665 2055088158 +3303948800 51504645 51504659 +1426815581 1041342562 +1305762481 910869680 4197224909 80609312 +1490109059 1416344618 +2517719156 2974695065 +4046570463 1098880139 2421643272 +4249593805 366509153 +983963009 581808000 3564362240 +3954433150 3386208426 +995203654 3582569095 +1214285197 487611044 +3128826440 3699597131 +2050441710 1392298425 +2845221277 3825668994 +1173882729 2389944920 +3557511451 3830453435 +1898778518 3220146481 +692570843 3607385796 +3379971528 3979336139 +4033831201 2689984246 2689984224 +3808326569 4287632152 +1933782729 1970007109 +1524623251 2709097580 +388578050 2011685923 +4135727095 99713488 724523619 +2583480487 267378400 +2728556147 1000793357 +2922932839 1906750052 +2266977533 2266977517 +4265000980 1144020847 +2422318962 3149568115 +3349412775 3296576946 +2839570597 358923187 +2731660405 3310449706 +337920226 1789409086 +2428507263 1566589928 3867862571 1301913658 2560529265 +3742625130 2952548094 +2558738448 2904185498 +587240106 3286688141 +909864223 4288577482 +2746890089 656751192 +2538143374 3051927951 +2831143449 2831143433 +2782172627 3769097018 2810590765 +4144538801 1042927210 4184649996 574153728 2460788443 3650399683 4182461117 2681189855 +3611905161 1902345144 +999865933 510890788 +3713530569 981453422 +2982855635 3039970618 +2557227130 2372796738 +334454319 2429633528 2969758577 876947091 3599624963 4050517883 2782136145 131172986 3391030391 876947087 +1696474627 829806250 +829556404 2323680591 +2370735300 916953247 +4118396198 3596531814 2493825751 +64715444 3330419033 +1090035201 1214299008 +1710518805 2496632586 +4180029818 711222062 +4190578731 1602501538 +1630602879 473049130 +1999296035 669286596 +377703294 1647886283 +3219826504 2189877632 +1985994648 4042062939 +693320473 794405287 3430886377 654706782 3363775906 +1452323410 2546513669 +1704141357 1182781800 +2230549409 2230549425 +171200885 2237414204 +90959973 2208281501 3991629562 +4208187330 1312419274 2642191971 +4129502815 3631126430 +2907212371 173164660 +3576981880 427952123 +1224497648 1566772440 +1385458992 799531651 51040584 2588520587 +3979108126 2061089855 +2191992687 472060856 +646317533 2180725474 +2625464639 2557259326 +1523881429 1497560262 +3224665580 2124561025 +2738226209 2690740294 +2857964543 3893431813 +1540388016 958902531 +1769865788 1297974385 +1753955952 35656948 1589511133 +2941313930 2253795899 +1423287388 3897670865 +3915078985 1033626811 3565162936 +1359321089 2362329472 +3658117677 3066530084 +3059091857 1861949764 +2919707859 3361220666 +839582982 4162325250 +2883996908 673844965 +3243278130 2592569246 +3250368383 3200453055 +3741152237 1343059538 +550661969 4232395920 +2510220617 2465817681 +1043649694 3543828670 +4069631328 1984732205 +3955802968 2859324527 +4176465476 4176465492 +3026633959 3838310326 +3669863182 2322324623 +1312786392 100849947 +2494222491 4214936613 +484222232 3495762896 +2666982558 3702946985 128741442 843473065 +820403984 4209681788 +2576451006 2115340809 +3462213832 2763246301 2763246283 604527075 3792165232 +2142735042 3488575331 +323955170 2691488502 +4159365075 2997248086 +397899392 3587148677 +1268567368 2820157802 +157818709 602493660 +1167228630 1537059559 +149772034 262142005 +247614926 3864423608 +2378703611 314047423 755962148 +620497202 3326539513 +4273214719 1222384298 +3373746478 3181917049 +464563048 4280145085 +98118021 3118226522 +1588454615 3804184176 +2325975 3644132162 +1781979478 2321031783 +2942532841 793532997 +608183400 581748499 +3821050876 3511553447 3511553456 2218102193 +2047622961 1380416048 +2258121640 2308526461 +687057920 2006434835 +2012589365 2153214025 +871815842 2998197162 1872375043 +3718293022 927625197 +1979250069 1273665948 +2637763548 3023850576 +1345419903 1118420028 +1250825552 2913701109 +2207663841 110203936 1414138972 2519490356 +2675793472 1381719769 +3477240779 279502996 +2229183318 1624486127 2808507320 2448953832 2248788657 254546649 +1348608482 2560714797 +1748889304 4051631629 +4042499683 896483783 +2279620869 3943062234 +82057572 387184767 +1159589955 287390076 +1195214153 1834121646 +1645531685 2345062444 +3060901640 3962912304 +4186003738 3768534013 2243422947 2243422946 4044473478 4186003722 2243422965 +1507444501 2262066698 +165515827 3134006874 +542419008 1390546750 +4124553170 2305065670 +955110432 3194285683 +1549308220 486679792 2607587697 +2994855167 24044926 +1029514475 2558952984 +1736198538 3038372502 +1071104664 413619533 +2959689823 347925918 +755139939 1039661770 +49227433 1199168536 +4256629865 3925663182 +2456916134 2285622687 +675721549 3024690226 +3298596360 2764661045 +147151205 866892268 +1511419642 2601165781 +3595729570 97979669 +1886388186 3599880117 +4185228323 3607036682 +3029918157 994006625 +2560750928 2280016020 2566243755 +3039947746 529945795 +61868553 160887071 +3018773908 1055268095 +664464046 115306489 +273968353 2514970144 +1850425581 2373399812 +53361921 46794902 +44888204 3258887265 +51468622 3527988441 +3768784192 2323922715 +3068405542 254386391 +1037636731 3619372452 +110203221 3433108973 2888288458 +148940213 2930039804 +105782453 3860989606 +3868071963 212857490 +1597807539 1029410899 +2664755069 124896354 +1328328845 811199982 +3119741792 441137203 +360018371 2649267120 +2904900399 1101720684 +3808287979 2956826844 +1694182054 2640585537 +2637012770 2295367454 +286737866 2980240621 +1492850603 3192275490 +1839690595 26911946 +1778020009 3334861326 +3395116492 1559930935 +1252822488 1705200397 +3721310015 1801314366 +2947131372 1947424919 +3773794251 3826435220 +1134144939 367813684 +1499442500 2958586927 +197850283 197850299 +2578273028 3702452207 +1819097158 4126119479 4126119457 +4062258546 2620256869 +3899874459 2291845124 +2911677289 2641483342 674520281 +1888137648 2266391240 +3788012191 228132958 +1136257569 504809030 +2473548458 2016751379 +2222645529 2792381015 +3487477491 2107757540 +134520770 1264451878 +1864023703 2115635110 +556271140 1442949823 +2500556859 3691922674 +836076734 1750201066 +1923245064 2107865245 +3490190977 4256918806 +3954861948 976703575 3997149484 +2869888244 2272083241 +3799057253 3706214394 +4205622736 1843541621 +3030035731 1652454650 +3521428654 1796757305 +246905625 1138149471 +3755543262 1085021055 +1108906351 1765835962 +2809875339 2947038904 3327122725 +1929992235 3860217067 +2008176029 180143650 +156409465 409214096 +1926405822 1064546285 +2762882743 4115446288 +1282645428 1543201769 +843142462 1524183199 +3836958558 3907887917 +2127874125 83043553 +3011712621 1934500654 +1066216371 3191589594 +2848199656 2848199672 +1033589017 2760651262 +1570982127 1460391992 1066977339 +2102232303 805848120 +655820691 655820675 +1748013017 3715265160 +131435333 2586459532 +2853939345 1519017040 +2315598916 2319310601 +1892384019 455172161 +3866241281 1734299686 +2767892395 1638042146 +2564235106 4238763850 +1662216578 188893310 660079911 +1421026581 1526941388 1421026565 +2947935913 1147581454 2947935929 +321602442 3072021037 +1944707790 1194330703 +1750849897 992793541 +1601370780 2888359206 +3750872340 108609145 +1945356467 1002762714 +311485483 816856917 +2803104147 3561451543 2540823148 2540823162 +1375783578 2973692011 +3777995881 3875524942 +3103052749 2650050446 +553155664 925610485 +1234362833 3183775255 +2301532376 2711120168 +2434148700 3252886481 +1922679739 2496555624 +278951574 2155882337 +988151445 988151429 +29583826 4170471438 +2829867844 498586159 +2597618825 711305977 1166844846 +3560886281 669089336 +795525058 2796497086 +2481448875 2165420596 +1307501955 1160859418 4187976050 +456565194 2701177069 +1383313141 2847767706 3239865276 +3507276247 2837174601 +1905232637 3254242388 +2292530961 3539401888 +2234292800 3845575379 +2619068725 4106901116 +4092630818 2909370349 633203331 3975687229 +1139626910 2358944169 +1875662143 1034564158 +1018601438 1904061055 +654715256 3870509051 +643474611 3130498518 +992450621 1549051924 +2781549841 263334342 +1982772314 328494337 +1587233546 4167731387 +744012238 3492742361 +1933445412 2393400233 1008001816 +2164282716 1871077319 +3227266673 4191349526 +2133261455 3548001437 2775027931 +3095114801 3095114785 +2672120683 623006069 623006050 +4003056314 1444553419 +2966495912 20549227 +3593604718 2664216367 +2775458695 662122457 +2278294356 3078576151 +536859046 95881281 +2963281969 1023808816 +996946369 1280463574 +3854145395 371812869 +2188439789 3428519384 1422614100 1154172164 2188439805 +2675246184 2833802900 +2098164169 1679915577 2823823214 +880715849 3965905656 +3327352794 255845437 +3039419349 98898012 +2863027689 2363047384 +1051207807 565690366 +223031670 894799190 1667161287 +2998870363 2262183248 +420612266 560178075 +3301262353 2645538711 +2405269901 1026748644 +3346025421 3267842994 +1689402139 3252582397 +3968000694 134931601 +2788661050 3817017419 +3491680739 1701857478 +1205679412 4219307881 +192128574 1566017466 +2570994922 1013837290 +2090220506 4202707005 +1401969021 154984386 +570161291 2598450094 +215343200 2494576435 +1157924456 236950955 +1792210633 1792210649 +4228144871 2715903414 +1736389827 2956988138 +1879424329 1049113823 +3378518894 1883975225 +1833941559 1266820230 +629421202 2703147461 +170802886 3704417009 170802902 +721087308 4110444727 +3060351999 649464446 +3045847104 189478085 +722838115 1455264861 +862656550 395772887 +2432195473 1998613693 +43471944 2146528691 +3945538485 2659770188 3715597495 1926259450 1634584339 +2887539107 2476809116 +1285141929 1056504088 +147934521 444371134 3379572783 +2950364800 1438557061 +2322790943 1134727523 1134727551 +4033444179 3372875180 +4149148372 1619858478 484935751 +1982470815 1379051850 171433788 2739398750 +1908993676 2874115703 +1142839758 3670393050 +2363254182 1693713495 +2229829180 821844455 +4290093578 495060030 +1757835659 797712028 +2743380826 1903747919 +2009971973 2648739539 +2806328438 3353673169 +2346845457 3540702383 +4270725082 2824447925 +1326901638 398175185 2506461260 331064709 +344296332 503952677 +708320297 1425961051 +1864360294 3041533186 +2050090336 1817623842 +3237646106 3832497643 +3790512907 3047860820 +2139867422 3876428329 +1384967760 2062614267 +3933654314 1124399378 2463373125 +3301757132 3301757148 +3375952839 2343027292 +1609442833 2884877238 +4202400235 2357811926 +4014411780 2967352905 +720902795 798083266 +3055844161 4235069270 3073739878 3073739889 +2093126150 1816911735 +3081782519 561811654 +2774276287 251327678 +1427704274 311891565 +3945997802 1622829271 1452911330 +4005140888 629307187 +2476135413 1791601050 +2680599784 1842268459 1842268477 +3430080178 3215074893 +4252376593 301028560 +4171098083 1195536605 +1011439240 1869821963 +3348846981 3196972122 +1248158062 1248158078 +4013010866 1027052837 +2374530165 1120883772 +351559931 4155812644 +1960355630 521088377 +2774863744 601252699 +651938236 3892220647 +3186271351 1868621648 +2980805363 2750581900 +954396733 3056194487 1896588809 +242604505 2626023575 +1288157423 1288157439 +3727991864 81691707 +3040929055 2752296924 +2847762894 53317455 +2439364652 254641473 +4261187779 2686079664 +1004340590 106340209 +3467252376 3988473179 +2545573478 1080203905 +224922783 224922767 +1688627695 577727958 +1111296238 2080401976 +4183450983 4031619360 +2132619494 15989249 +3136495559 3669891268 +3513666270 2545196457 +3382237190 1637618017 +4110285120 3956236243 +655626653 563591732 +114081587 3880844620 +1217904540 1217904524 +2264209866 1432736549 +3024942133 170159996 +697056408 655380524 2045951450 3542146621 3985986099 2062729056 4290995035 +4118189947 3225204677 +4084080404 2250392191 +2678116708 2348464300 +1918884164 1357055519 +2314727801 2857443688 +3549642354 4082057054 +2144555480 3680340339 +3868635769 3268338270 +1051730132 2202250681 +3432498743 1240270982 +2304703002 1518581501 +2263837790 2485254564 +843020262 2853464497 +3087708132 1071616439 +1872507941 1358567360 1872507957 +1563349594 3240495803 +1324964081 1324964065 +2547470747 3076828688 +1378962466 2241517973 +1988593219 3663223658 +3055416896 1535912184 +2095482042 2095482026 +3777946767 198298904 +316519839 1376053598 +371699661 3366503717 +3135341934 2667908143 +2368384079 1245465228 +190120011 2343759646 +3705508234 986455085 +1863080052 1148141199 +657657006 657657022 +861890879 861890863 +3836128390 2019661537 +2120978896 641463869 +1442125478 4141000535 +2699348388 3962137919 3996571535 3846918180 +4259204048 1961973859 +3654191022 2384434927 +3535213118 4244704513 +2789568117 2131232781 +2647417191 2811687033 +2763447697 2763447681 +2133489966 1574749039 +3277268828 2604201991 +3518164497 766297296 +3416696648 3747173981 +2047413154 2223308717 3191689226 +565377344 3276605944 +1218697256 2240200771 +3808368931 2056557066 +2343327878 3235770517 +4207718551 1731853744 +1759698746 2061708802 +3140456026 118908626 +4262272397 510601627 +3553370045 1850936994 +1357120945 748598337 133494182 +3646407999 1680572990 +537745781 2265276432 +3382519343 3607431035 2439191544 +2658091644 4014562915 +1723561712 141699599 +3895427259 1036494436 +1324058376 1153798557 +427811327 592495720 +1536484790 3144952367 +2869971153 2869971137 +3191901160 1408627639 +3970618459 3958131524 +977207785 2586837464 +4209844354 2236230837 +1625099416 335205197 +3534279736 3860325754 +1026348462 4220805369 +7600159 3582957768 +4154879365 1610508371 +2951956605 2951956589 +3476808260 2458803743 +4101371860 2021630977 +2394004351 546818280 +2368862497 2507861328 +1701514050 2143884201 +424313553 2706108176 424313537 +1145962962 1489821061 +2678495208 2678495224 +980673947 2675077906 +733018336 2029050811 +275091752 2972574547 +1214499166 1393950463 +2719535065 101659294 +2789150468 3381246315 +2139668457 2411361335 3333284300 +4082397779 1626339514 +1585028782 3420260654 +3722134796 1278063073 +635948790 2716519751 +170120115 2012948256 +418167927 685243106 +14713462 14713446 +4229658591 1696640481 +3456475148 1859849223 +2666692803 4206932714 +3150977440 751880827 +4114905982 2563663711 +2987728688 3404314616 +1614010699 40362606 +807264584 807264600 +4042921628 4122056593 635283748 +3052880203 522029679 3208366338 3208366356 +1492505744 1492505728 +3571719931 2336905128 +3592471891 1754702266 +935875145 425298158 +916471096 916471080 +812209691 1355975826 +287012170 943301499 +51131558 1916199255 +1329506664 1580071923 423559328 +1863696701 2889222125 +2733342333 2664988233 +417769463 1191359683 +3261140614 3261140630 +1784670694 1526543617 +3278811814 1296251735 +1899315352 3855611428 +511182161 1206935184 +2805802528 3866596971 +721758932 3928988299 +4161050436 3006930975 +1775958500 1655843083 +3275114677 1012498719 +2769465611 1069570435 4244327414 2554509404 1339851939 551574396 2589397310 +1905319410 1125406605 +731239151 2567282718 1574394847 +3684761858 3228866083 +269853907 3222444845 +2362496687 1539437944 +1420530636 3949384160 +2029286477 3050509604 +588235788 1037147873 +3631376500 3631376484 +1121772804 281399791 2891937092 1169982793 +3958891373 2767231988 +306146891 3041740079 +260971971 1073681619 +4282355953 3943127005 +453446400 2351008475 +3318010927 2212103662 +1138995114 4067298323 +2929826862 375970937 +3219485938 328328547 +3918135258 2117977149 +1379642940 21591631 +10448559 2851814776 +2213787912 3232515988 +4226728032 3797593900 4226728048 +742557124 1891144607 +1628842337 920855456 +2955411380 49776729 +2950050457 797826132 +2621362110 3711944905 +1610382578 209236197 +3317058355 1895326042 +237275509 1944893791 +1136872975 3144933774 +453960558 1364835321 +3139876768 1039339749 +2549656439 3533898210 +1423240404 2463770153 1449792152 +1993694310 2011198622 +3010886216 3084182000 +2201602685 284803787 +2016841470 629258761 +3280462901 65814396 +4152991921 2825471830 +891489914 540002827 +3641470480 2512485044 +3281532413 3852270932 +4248746682 3526047107 +781920747 1229126900 +4197813838 3479469818 +1188633535 1187425704 +3272012052 4287247358 602170495 +348233821 348233805 +2727964834 2576109333 +2000103008 198273331 +1630802699 268040788 +1817916205 1817916221 +3929127110 1917181879 +394023779 1838575843 +3565269133 3565269149 +1605534275 1272012848 +4149328472 2645049163 4149328456 +2154546317 3064359410 +1800813484 2764042199 +4202852854 1425461893 1385003983 +4189662695 92488374 +3253763046 1170148991 +262456969 694454712 +4068813836 2087979160 +245777791 1543334368 +4059469240 1613511226 +2201541275 763372050 +3487865820 3487865804 +733216063 190294568 +3765909245 1487638612 +912228365 2773914724 +885250817 290570880 +3163095539 2018736439 +3404802174 3977878242 +2755265826 3184730578 +891566885 3439926074 +877563995 2997698386 +2787954846 2634605321 1258126267 915171518 +2705292872 519293771 +2813552487 1537898340 +1373028741 626571690 +3586744074 4251025697 +3294369166 4242366633 +4170966543 1794538534 +2456819693 2425643732 +2232006793 4149051320 +731892102 2258602961 +793825 4094785056 +3216828826 1885584738 +1169612351 4259306814 +2805731464 2375262115 +7971437 3021360287 +802252706 3903202307 +3026689885 1545592674 +1167487202 1842590659 +3406277820 1494543335 +2479553059 79779338 +295755135 1955026730 +3824280067 4243662320 +1244119707 1469536786 +3823242469 2715438188 +4228328425 2823430104 +3532983699 329539180 +769168493 2565973892 +1242917620 1174317165 +550320955 61033503 +1597646023 3329384691 +1006042230 3687804359 989709388 2186830197 874373598 4194090196 1558004152 3532248722 3687804369 +3820180939 3820180955 +1148908912 1032871747 +3345526456 1604542789 +2169754989 66648708 +4020901022 4241606847 4267114369 +4205074667 2075654626 +2981232912 326708322 +2784936093 2784936077 +988162223 1733430126 +2053256570 2209877589 +168623043 2507166716 +2241916780 1693689495 +1447462578 2198211109 +4294366865 4121280096 334147891 +955789740 955789756 +603525219 68471772 +1169295132 3544264973 +2285577647 1351996140 +4050185979 2153193534 +522856907 3663710868 +954843541 954843525 +2831601645 2650362372 +746721397 2243946556 +4238757466 2152504442 +3048886456 3427602861 +896109330 656797018 +384054717 3326122132 +1409374474 1210002107 +3881310337 4175193826 +3928271516 867734407 +2181304098 3462648451 +3635206928 2920124935 1145471606 4043268038 +1006106529 140169824 +4119488064 4119488080 +2400361111 712727632 +1555626962 3375655827 +3964929518 4131739065 +3901132165 2429601868 +2982685002 166561184 +2860940170 4222908973 +2517916345 4089809467 +1144482459 4265398788 +299704754 2287637278 +4281141213 3662685617 +4056955876 3082499023 +4132244560 3138925756 +3249091790 2875072591 338484302 +3085805431 2778068686 +4246185861 577295724 +2644642202 3426570101 +1176441032 1546579855 +3504983877 4087755121 +3558248897 2549999975 +1006103683 3684543421 +2890175957 83353180 +4205958392 2701130378 +4126374873 122418846 +289164536 434973307 +793052340 497444697 +417817257 1446903730 +894462730 4153966765 +1524111783 2838520288 +1463513964 3197547287 +4008532885 3030854556 +3356056676 2052010611 1133429792 +3569976653 3284686514 +4267242509 1929916516 +1897848994 3046874883 3875230122 +2331132709 3764368172 +4193137897 1526549198 +1231314406 3484819685 +1363954017 3736303165 +3827363963 3193948869 +727469292 3656506876 +3219338241 329964950 +3842588773 4069547756 +1126255195 141036868 +1493271893 1919214812 +3715544977 3799605437 +2728962212 3011607103 +54273019 313304100 +1511579410 3878103365 +457637596 3435344977 +3169989346 1397103043 +1015625706 906167643 +17110564 1491810319 +1033437805 1556342981 +2311824073 2311824089 +3294256446 1480640649 +1627747688 3305160579 +146749476 1220920963 +956797742 4109152633 +320935224 404645255 +3034772793 4199024808 +3574472686 1396458425 +210407037 3535141748 +2718097242 3956149750 +1232983495 1292598468 +877433247 4085857608 +2778831582 2778831566 2607205225 +4166964773 575347756 +3354661466 523821995 +4094980911 1798394606 +2947397523 561511532 +2886352174 35540857 +786207081 295023321 +3891392029 2582544152 +1001323007 4084436094 +2659750477 193856251 +1887258766 2738435983 +2144410137 1328289118 +641149353 3520501016 +3102158876 804305937 +3855282091 3418011211 +1459295376 2101436067 +471329147 471329131 +680640417 2121312864 +864641129 2319631704 +1287481666 271364853 +2166845971 2125520023 1679332332 +3734310683 2141636484 +1160879891 1927916 +1460006133 4082369980 +1110335607 3164341648 +810469785 2768722910 +1241591754 1239300859 +4044392076 151244407 +1424538472 308217021 +3018461933 2799742290 +2050728865 2140784135 +3929127111 1933959510 +3007394221 3701551940 +2339699908 33099695 +3586200972 2693695904 +121895286 3685717335 +1344643766 693261522 +1596953013 2555969811 +554560875 2912005341 +900287698 1940951405 +1129934861 315319396 +376708166 681899589 +2600107747 3679829834 +3548642393 3548642377 3642158889 +4058103011 2841401674 +2475247262 2807340883 +2276787267 3841308028 +2835879656 3524001044 +335878757 3909651692 +7306057 504127416 +3007029566 1692325023 +1647977601 2357611885 +75151966 3236119657 +3808352624 3341830979 +2792714834 1397423607 +889241303 2749603913 +605995154 1852384709 +4029029508 2000721272 +955491299 2324364874 +2879647615 2987525374 +671120272 2294449077 +1800891561 2745175566 +1929553713 2072701907 +882922631 1600458902 +2289905519 2625312891 +3922686223 1631010545 3641998668 +1948137229 3633359218 +2813707411 3345068800 +682654052 1909397609 +1358303283 772470688 +1839944527 4088669518 +544866391 75574392 +1319626750 1319626734 +419966325 3705638716 +705997507 1717632166 +3895774592 186613893 4265550260 +2897228716 2897228732 2237749207 +4192323953 3480231152 +3682863335 2010776502 +1071255602 2628627540 +382809329 1105958273 +3584317958 1471788919 +2958992230 3182728346 +549043836 6741297 +1488761758 1488761742 +4171951967 3558265480 +224929175 2985503910 2985503920 3671025458 +522974988 1876690743 +556286864 3261225909 3246374760 3050724843 +4148105274 1917225821 +2708979429 344031852 +2498376504 4138459200 +1134799799 833048848 +4001364505 2356589918 +2322876807 826027123 +1453460887 4162544806 +3561324478 399146127 +1226971633 1226971617 +3076490068 155828972 +239524203 3834135394 +2140138320 447292584 +1529684830 3859721471 +3022291515 3837781423 +3115083813 1869083194 +3946718610 1434770101 +702135809 702135825 +3674911731 3302573978 +2078881072 1075755651 +1176170812 1669040931 +3794549365 2157970986 +795697624 1831737700 2167473933 +3167346822 1167891938 1306065617 +4270313496 1410322853 +3803805557 1593249084 +163392974 2493285260 +595755795 2113677354 +714387833 2165530984 +198072286 1943294569 +4116215267 490837066 +2473178834 3781872787 +3443851763 639734860 +3548096186 3548096170 +189218527 2686974209 +388984339 3457104022 +216526654 2401083017 +2702092663 3588595669 +1117144549 3079669612 +3399341350 477530839 +1193580935 1193580951 +3507273348 3413200861 +1700953914 494652949 +361414896 340037106 +2449535392 2004639475 +1529218525 598114855 +3049645461 2307575465 +2698585590 735494737 +3713183501 1970271844 +1935259328 1446686789 +3670864109 2949934144 +1676254887 4022649056 +342249725 437354068 +2113262348 1442528225 +2342398573 134215137 +209986245 2030222348 +1401115142 2109349751 +677217604 1063652409 +1650968360 291406827 +1353869466 2732239485 +2897991333 2427643308 +174391543 1409320144 +2512272770 578971074 +4173291201 2686966758 +3149855176 1436759499 +3494943962 3370576683 1854157986 +1656228219 3803638948 2314634815 +1876613282 3078817557 +2313922182 2750883041 +3047676901 829311773 +1171899116 914892138 +242514408 1841018252 +1916678781 1837907810 +2513643497 3295138759 +471996499 2918912331 +3783947523 267793340 +1884624384 3589382675 +808908887 1032384742 +2727427589 4020543962 +202432856 1452457371 +449085582 2975227791 +895435217 3589577734 +3015908690 2540448510 +1898242711 3020993446 +738495441 1495332726 +187876769 3000142788 +4227245783 2085135472 +1519598855 3498530308 +705758926 114144857 +3022369394 156756339 +1395209098 3792062470 +1820886597 535518867 +2835484508 1612063542 +3864924673 2803259286 +217960721 2224037328 +3140701354 216494341 +1589480751 1702349018 2509319997 +2456914620 1153263079 3494078956 +1593946803 3242303030 +3982151533 318015643 +3528628786 1242086565 +1785464146 1785464130 +3100446678 2926357810 +415261084 2463738001 +888847489 3887513375 +870862457 800295016 +4177546228 305752649 +3839452915 1528892535 +3645224613 3645224629 +151346984 1534381035 +2846334856 3956754100 +3771802253 240670180 +1341336885 2788161667 +3996896033 1432069697 +127360245 2640268499 +2692302501 1139422650 +3745106976 3745106992 +2448078827 3365726196 +354611706 1073933469 +851448215 2069606576 +1202156339 1202156323 +2346799866 766877579 +846394279 301305846 +441731059 1705853836 2613138807 +3903749303 28201990 +3221368402 2507074323 +2484327956 1449542900 +2402184781 3004670756 +1686155864 1686155848 +4293293772 2748121911 +987333611 2406132468 +821317931 1000064674 +1008507167 2719707751 2290309009 1521555622 2872842869 356647329 2941534756 +4061639282 3836117005 +1715359852 4231205624 +820604510 820604494 +2669777079 953602064 +3543607528 2985189123 +4245262563 957289820 +1386853006 2938377615 +1869781445 3218271229 232314142 +1544148606 1635559519 +4215271724 4215271740 +2197919317 1123361517 2424285148 +2700635548 2007662988 +2529590123 1242538382 +4289875130 2347579670 866973939 +909145442 909145458 +875942306 3158190763 +314773400 554798171 +179586778 3016460587 +4060895030 3758852353 +3199283920 4293353768 +4180928866 2931320149 +942931374 3554582514 +772740416 3518926051 772740432 +329513137 2969887159 +4089295157 2423732074 +787485388 2951583521 +2043039071 304860318 +3846720149 2244831388 +2218881081 1812179368 +1124042258 2319453765 2319453779 +2455098719 3156141192 +2851634088 237555669 +2527841291 997340500 +2197611683 3608931485 +1840677971 156389036 1485953239 156389050 4182914410 1840677955 +545755667 545755651 +3907743617 3350610157 +3115191678 3405725001 +3776593428 3776593412 +3331809752 2018445083 +104653602 4283010798 1652250685 4091121283 2408691204 1520131053 +2601633189 381987549 3254395578 +2369730036 2369730020 +1058840031 3193469760 +1260306976 1552649591 +1604443646 2312140489 +1840324258 280057112 +3603372421 4204018435 +2129810328 1870239821 +4200510070 3218044481 2568155089 3735105098 +1212400763 1187377298 +1043587923 1051646906 +3093034479 3093034495 +4223760630 1200712529 4041990337 2925319626 +3127711276 2780424023 +3402098899 196314170 +246071649 2010016694 +1699116743 887946048 +3037138268 3691570384 1543130641 +3092962731 3792368692 +2437200795 1244878084 +277094692 1430567705 +1500413610 2365780755 +4267514543 3948863384 3345854830 3954944687 3787168507 +3547421531 913494084 +4044392070 50578657 +3666374280 2361786379 +2289588515 4168372764 +1864312802 2149376986 2777257191 3123445399 3053579578 2192884487 2974737354 +4288359451 2493522597 278288489 +1934998983 2138783127 +4261243248 2658601528 +4261762047 993327112 +4282736469 1327212270 1011032201 1722562488 +3791779682 561459575 723021653 +3670034850 4273203715 4164510378 +2653287477 717188988 +885912217 3107251934 +1607215760 2852095458 1361452267 +212002511 3010549710 1399671067 3010549720 +3248533058 301093347 +354249580 2899912630 +1618216877 2208830802 +3227836316 3928496655 +843263179 528228846 +2559437119 1717972542 +2499415709 2881538197 +425873268 1774392217 +2018416159 2018416143 +379184252 272805671 +3251696168 3676363564 +1498075439 3737004667 +2331501489 1966829478 +166726195 4231032397 565608864 +1478423000 2427893531 +613066268 2285862875 2722332184 +2446847800 3976320452 1146797968 +1998509164 4052248087 +1161340511 1462626206 +4159748300 468904225 +2330981825 474886241 2638912453 2447763309 3427867471 +1238905270 2059458343 +3519199808 3519199824 +723937088 723937104 +2307657502 3236071209 +4249868025 3182389758 +3919516116 2573799609 +3498421475 1241390032 +2111844681 1894618616 +3476666835 3924331901 +2321993194 3386255195 +3221792751 1017142574 +1916627856 1722831779 +1205354427 3563869042 +2064658504 794894258 4091970883 907041426 +1101398828 10705474 +4277313373 4277313357 +1794168426 2976443519 +798766078 1497397602 +2279352989 2090276148 +3086353923 2605414058 +413877451 2694663042 +1669889830 1669889846 +4195736474 3127832920 +3604674766 146123855 +1730062911 2452869610 +2535448894 686224969 +2148027874 2638848234 1863490243 +1389124717 3568670932 +2855769490 2004900789 2855769474 +1134710930 176477651 +3855638752 2802352307 +376226792 3510064080 892888619 +3582143803 902934527 1484796900 +3544444409 2364514024 +3761350937 120402504 +2956520755 3620314272 +2964042006 877118897 +1658397856 1003792371 +1850944440 1693307565 +2045607476 618507225 +1974971311 4280501358 +497270909 3033693583 +148802504 2054465175 +2029891237 1721191673 +863631085 2135860176 +178297606 2297233530 +831663073 3927642912 +1833982741 712991260 +1700824331 2716954708 +169607275 2677107729 +3412996870 1133498705 +1262549715 1246419493 +4026797850 4033070589 +3711022192 3711022176 +1613886394 681749981 +1890682172 2742336871 +721076231 974557897 +263322580 3894839421 +1055009854 1612376521 1007396255 +3260857475 2063385130 +2338125092 2270554025 +232147018 307481709 +1338368249 3226596553 2374051838 +946156205 1951319630 +3836578903 2109603284 +1425547017 3415792440 +3510946064 2485657469 3089732052 +809775921 744265264 +754783227 3446043684 +73558084 719987487 +1676474061 453543076 +3433982532 4223007033 +80638729 2593226094 +1823630436 919261272 +3080853346 1978418355 +3791952619 718121391 +3791779686 3246466995 790132097 +3576898571 2860629314 +3586064020 262849263 +3701190375 1543691719 +940268720 1161096220 3923962133 +2595929262 1106707961 +172868792 2877830506 +1976213491 1626983308 +1677796568 4004975717 +912969416 912969432 +2411087995 2141754053 +84101547 2402089012 +4044392081 235132496 +4267821517 2643785898 +2925894506 1269751336 +3131338910 1859995817 +2879721395 3298083638 2888781329 +2794843882 671554139 +3576827116 2311739287 +1822141492 3444730603 +3760547489 2021775046 +2537219447 2293709382 +3544015305 2170087982 +120651976 438581963 +2793504424 3319423595 +768080254 3219613855 +1853061896 2165263907 +309820393 309820409 +3984795182 3167241307 +2676038238 650298538 +4194562911 1268210785 4080541342 1767378972 +1230360256 840202323 +672305465 2887457839 +617196171 1953986772 +2317992226 3085473624 +682220500 682220484 +2115489204 863556185 +3252565893 3050399308 +1447775952 3406986045 +3620734145 1852495127 +2725497299 2403776314 +320518068 400690888 +3202297359 916128332 3202297375 916128347 2321928865 +3158372377 1933178696 +786364078 1096687918 +74518186 162530053 +4008052204 771157322 +3356390451 566291532 +4234147448 3272670961 +2301275307 1461736654 +3559881681 505324691 +1423467399 3091013779 396668288 +3254535789 3441614226 +3023132980 3719261391 +2671041392 271937859 +3196332973 3196332989 +2578097498 2578097482 +3838496701 375102488 3896837780 +3324670049 3401078406 +3865258607 2019340199 +2495590909 1248627445 +3790686146 1892939381 +3796116595 2756010252 +2839278306 1264540117 +1614795614 3799629055 +2545348087 150392489 +1704202530 169277571 +3467600331 689369730 +2142933551 1102323694 +672830118 947343441 +190865847 2679755536 +238595355 345909342 +4021164492 3209414624 454204449 +2471511879 778056918 +569248879 3343994312 +2882790587 3456913225 +559089866 1068946925 +1591486686 3949436405 3276366940 4171028028 1277013169 465143359 431076493 1057491399 625055212 3112047837 1703123333 3217904497 2185197709 3413407071 1695641519 3873024046 2207152115 2432857958 3482232538 3506265210 3662041842 +358647329 3354600950 +2114801838 2252671791 +1886925032 1063954197 +199963617 3472067661 375774500 +1780597148 4267992022 1179958343 +1841719819 3663261506 +1946968063 1757391382 +276089417 3588212408 +989610975 1073548528 +241706786 3488979605 +794054788 96124895 +3996764366 2078689321 +2803353733 677025962 +4052699389 1099949634 +2527949128 212848227 +2297775305 1662732408 +3288533892 4035708572 1215195015 3752814365 3769591971 1215195024 +1950205405 3661527787 +994404714 4018715602 +1701171060 323326863 +1259154312 2914748171 +2751868697 1320952904 +1598578520 1458444187 +293280236 1892273815 +4077717259 1454446325 +4146025794 1213413091 +4138822691 2085436188 +2790480855 2393053506 +210243376 3635985223 +4161416560 192341000 +3976724116 4190236159 +4028837089 3898582560 +3207232406 3883807863 +152948785 2330901798 +3503701834 189112685 +2588437219 3509655600 3391845117 +1263770439 3684528320 +893893524 1944865263 +588147980 2488772444 +47290062 3656773282 +365767043 3573045564 +1362742887 3988731237 +1442465000 2068629536 +220726156 1107137911 +1127586808 708915347 +3324748497 3324748481 +3186920896 3497004193 +2839612721 3227474343 +1325790714 1017050303 +758397541 4273149778 +3425836747 1038514562 +1713972980 106511688 106511711 4140672281 2993788174 3010565780 3335016985 +1347182087 1865942272 +1566877097 2926627086 +1524681445 4108281466 1096897059 4121842186 987040588 +2507113818 768525690 +4135105080 939560484 +1225794806 4201262929 +1643946800 1890903171 +1670814152 2383680971 +2897399013 3262680172 +3087971179 707031394 +2851917634 3673834730 +1934657772 1942457239 +53855433 3601123448 +4117686404 402330768 +2499206457 1128209293 +3164306775 1069961200 +1122832710 1122832726 +4227654344 1499225077 +2820534354 3220065105 125638902 +2114621848 44249677 +2463773575 3028229504 +801483015 992548374 +1612365852 1867803012 +3086481814 3721585271 1040475306 2851766598 +3502558612 2147801726 1761916449 2019636223 +397269519 397269535 +486157081 3067205704 +3525803288 3962170587 +561242466 1236546398 +1224440521 2900511342 +1993300639 2808850526 +1205791080 1118117351 3505263286 +4158449122 1139538173 +2262584643 2496255169 +4215657443 3009682128 +3708972654 1912854329 +782216298 3478940365 +1896769483 3299697794 +2970971153 3585679046 +2320051341 1043407332 +2844812424 1513231284 +4140003510 4140003494 +2995014117 3946861420 +2537962401 3297762912 +4292453692 4288617831 +3951520400 1567841515 +2992741924 1152321115 +3890590344 3890590360 +3355029122 2828436125 +173753654 173753638 +1695799261 4215066850 +1721010048 4018051931 +2982334956 542312526 +4062301541 2419480058 +3424173545 3460906732 +2186664997 2186665013 +1583073219 368800839 +3777823209 1798362969 1658454488 1798362958 1103441855 +3848552806 2194862999 +836441401 2120934153 +2453364951 175731312 +2347875821 1065603141 982383620 982383634 +2631423861 1985190170 +319170978 430064299 +2271757481 3704535054 3712876031 +1116356326 2778792983 +2220446445 1167952658 +3898242411 828823394 +3781858502 2697474977 +812944758 2804493894 +1183694007 3357545478 +2788285359 2788285375 +2669999187 2379493783 +981604499 2915872620 +1791774022 1704830263 +2859034601 4172836903 +2995651671 1821431024 3623826883 +3740212215 1079256692 +135477875 692388634 +3664681168 2887421813 +3416868179 4000850348 +2585752181 344010282 +2412898812 1066601383 +3409511691 4123193428 +228409156 2995427359 +1955815054 301848985 +1748122521 2685653448 +684371304 2668559019 +893620234 3814440877 +4080880281 3715992399 +4060474187 371542731 +1241138397 320340779 +3670944045 716167201 +627726012 2724628967 +1437225385 1238534693 +3989438389 167610858 +2070400888 3161168365 +1933092086 1131179218 +1024675037 39976948 +4121040402 3223895635 +2661537443 1592451740 +1618751453 1852112759 +3578774075 3510342705 +2111394648 2111394632 +2003311523 2615378314 +1720047269 1720047285 +3393689049 1202775198 +3303245090 3405438544 3107998041 +3845538691 4257357819 +2564969826 239888707 +233112492 2340734913 +1418568207 2792396378 +3775430288 3775430272 +1060550724 1060454115 +639804735 639804719 +3090544571 2551884421 +2978656920 3845109796 +117348405 935959402 +3041623529 3821643868 3919000404 +96920405 2257827834 +1066695854 2398147436 +1601861882 2513880081 +3221869487 196797435 +1804856485 4275931052 +1299892125 2504539188 +397452602 3383059458 2232687179 +1684938787 1012700956 +1873717489 705179613 +2905089901 190478418 53874834 +3907538320 900864419 +3951982101 3863208714 +1223647217 337949421 +3056737017 3386930686 +3800466450 2881611859 +175929935 3235951793 +3174761088 1897554718 +3594684371 4027572081 603069485 +718851339 599350328 +218354865 772264624 +2661033490 1901343481 +164471312 1912991464 +3111422565 3111422581 +1688380968 2483785981 +901362885 3461233856 +962754100 2954446891 +474351017 725281039 1924324516 725281048 +1604122306 1176007541 +3454347212 1217173716 +356944249 1667502408 +3041556141 3075148571 +4288237470 4110837530 +2492328265 2972784863 +2621927221 963907708 3686127322 792159635 +3407043041 2693209104 +128167559 2134522014 +1549350320 2584152834 +4137917267 1012287639 +1509435112 2309308203 +4160843868 3326337223 +1554200120 2285368517 +905142340 840993567 +3162707234 3831121045 +2256192448 991702596 +2108717344 440082584 4241403251 1583019515 +3489123209 1404291566 +254196305 720850310 +2079620498 4282585147 3182435774 +4044127542 2896763911 +3767434742 4209142118 2271538647 +2338465487 981669838 +1550565583 1285588430 +84439609 625725367 +1375496207 932642642 1860448226 2231971038 1619456062 2364417849 2786409545 3038960738 1081578649 4259737458 2094892877 574339778 1475792200 +2645170293 2814672938 1146470925 +2109455596 3666503553 +1171024829 4162324171 +4014336337 4228795024 +536999573 626653699 +4246241769 432559960 +106917481 1899679576 +2890447049 2969723743 +3150655061 4124700611 +1404365057 3335179392 +4219558966 581183761 +4069481435 178568105 +1405470366 2734803646 +1545027297 3650616374 +2600437396 1528346088 2487278329 +1675741797 2708577516 +2255586146 2766351533 +2530549616 1071216545 +3072766221 1592309604 +3941927479 1808600637 +1446677222 2754127873 +2724858385 2724858369 +519962635 3571061076 +3726486321 3642920842 +1508966462 3563282847 +3070593838 2767587758 +316266130 1055705029 2799454555 +791140148 1874314969 +211295799 175607952 +2578013934 3663910886 +141314278 678871575 +1226468853 161159356 +2476629390 4031596175 +703910919 2407810308 +1357030324 3632499656 +332575232 4080994764 +3832739152 4042796277 +2100123425 794831072 +3714752296 3067644925 +2741658305 24737216 +3855395623 3895553632 +2509285151 2444694984 +2776747499 859175573 +696709375 1584226664 +4258610376 1588506333 +364681003 1658976436 +3406572473 1419014965 +1258052881 3917327606 +2495042630 1654237751 +3160047906 2759411843 +1532404593 979585776 +2854988215 2094226541 +3846315605 1008058332 +994131636 4222989657 +4192873337 4238347503 3835850600 1773503326 +1016267060 2406147289 +2929597772 786964129 +1131327195 3747758189 +3941315512 1791127109 1427347084 +3071635455 901729918 +2772687923 1714133132 1889614442 2087400745 3314873421 1557374028 1557374021 1831576480 767893827 1831576503 +4223249927 489008900 +1743563640 2360966645 +2131347144 360303472 +2527536647 807460105 +1370441944 1370441928 +66423986 3985407013 +1268308336 1906199363 +4173333718 1816632551 +2501763340 3389605345 +274536159 2710241566 +3843527413 285956074 2865160522 +1188473605 1855358326 +3406277090 2131783381 +459687132 4261307985 +4246228100 3240445502 +4161007649 566603655 1666137158 +4231910179 944988170 +1818751712 841052375 2275628716 +1205358361 847545416 +2999271347 528697036 +3760521070 1212029497 +1082480632 793890819 +1798077386 416351538 2164711163 +634411229 1677452258 +565801884 156986585 +2480177388 2743530369 4000404503 +4246169184 3419810085 +1241876939 1371007636 +4261700097 3789965184 +936890239 936890223 +3546449209 311587248 3897139401 +579814763 3532277620 +1548412496 2582155253 +1753229622 3082870801 +1277771046 2920341466 +23487997 3029622516 +3586283220 1424928687 +1933735472 2711620995 +3594422537 403080046 +428215136 3039195707 +1263769916 3499768177 +878839014 80564176 +1598451069 336233801 +2757368151 282452985 +1888843927 3203687426 +975930620 137469607 +4125213483 1030110370 1542557519 +3908794116 3907236857 +2147681104 3569235683 +406798979 2929046588 +898447498 3612344635 +4012776860 563649671 +1934813932 2005389719 +3192916795 3271660706 +2782200920 1716901531 +224269139 1578658746 +2710353947 3349833183 1803932292 +1673620612 2249483631 +2812384417 2220685664 +2999742282 340135142 +3054305541 2497429217 +553689155 553689171 +570290723 2781097226 +961465169 2916614902 +1284782610 698114221 +571779851 571779867 +1606818025 1861301093 +1979488640 1017488517 +1913642070 2937066218 +590704620 1495216279 +3154263412 3812234656 +3082649540 55583135 +684241763 2532467932 +3819055177 3460781240 +4057702717 4190032642 +354172398 4076132975 +2521736836 61157240 +314247091 795680474 +1266183316 1653796079 +1188285146 438912590 +3239153299 2152434944 +1231401169 1544902928 +2622417673 4215086779 +2747710241 4074280182 +1687285085 4165839259 104499198 1924311966 +2065691860 2700314420 2806933935 +4160700425 1876020782 +568536149 2912864732 +3591923788 2270100065 +492108494 368906830 +2574048881 4150406118 +1301522406 91311895 +3253763043 814941770 +355096207 3768992529 +1451437970 3263423173 +2779999260 4117966855 +4211711567 2114030747 2133079640 +2770195034 1207051179 +2466178820 1799727967 +2871706705 666575862 +1962614841 876207775 +609603226 3440655467 +3410599027 3282435552 +1595095666 3070366558 +2265860670 3648970655 +1596985361 1596985345 +3143991660 1825226013 +4125213502 1348885129 +2032500636 3010046535 +1718033009 2773393392 +2919052694 2073778983 +3775657518 3069817082 4205502627 85039498 4222280249 1728192424 +1600160378 587967651 +3483795578 1562132509 +2629333625 2629022757 +1653709697 2889337856 +1034784621 2235091090 +2235883904 1265564819 +1944491799 3033587381 +2881497045 3631674601 +973700189 3119433314 3119433332 1937255458 3898328491 350374978 +1883673635 215053584 2292033827 1872593367 858866186 +2851752569 235093096 +1234215813 373974369 +2386122526 1340260746 +3974749959 2630494840 +2560849751 2689916400 +3036283835 2694045540 +609342113 3624074556 +2997083416 1341459675 +3332054637 1708178689 +719104465 1247761424 +3366708695 3181039984 +2821892305 2078071926 +2190886228 3311295989 +4130399729 2147089008 +1533036723 2341630426 +508754564 1084251615 +2247185081 265886878 +159710838 203095572 +2404035312 2404035296 +1813803170 3536146197 +1158254003 2396549408 +2094747311 105124149 820804098 +3709952820 1569131805 241198441 +625519832 1541266533 1462002208 +1139476708 3045229479 2798096016 2904015104 +2278759312 1519716200 +3097777926 125375204 +4089029882 4123077133 +3095596780 1649442177 +4237194418 4237194402 +1721019268 605415068 +3913117976 1136199885 +1801363166 2268906401 +1305218389 3669357050 +1193764579 3859216202 +3958963249 2851406128 +1141966016 1205529572 +2296293791 4254420696 442550427 +1063302836 2034212175 +2942720814 2075662201 +1228954784 4031893491 +3284299607 2182432240 +1858639955 3100101306 +998676307 301441984 +545413828 4046774921 +486694976 2141262532 +3380116392 4188590019 +1756864734 1756864718 +4192280173 732914898 +1871530231 2456411334 +1575755836 150809176 +183991052 2271161104 2799996198 745293613 942640699 2578225637 2732190581 4074036402 2609321878 3431448538 4058255290 +1426687590 1426687606 +3592458767 2987722330 +3133321652 15826132 2062722569 +1574157724 1347648647 74258512 +3018874503 1912578834 +2375065270 2375065254 +2790277403 3655251177 +2490238648 3352600577 +750855036 4027243569 +4137287540 3167685087 +670153823 1082886558 +101377186 623242005 +237261753 4230990888 +3256326067 1042534092 +366183211 2264366242 2264366261 2525981302 +2006978351 2208533600 +107655212 1173574999 +3194930372 2210142137 +739973504 4004062341 +1643721362 3444218835 +2256422981 2256422997 +1031781662 3994465855 +865833776 380958747 +3932281732 2081198281 +962676256 898697979 +1954792877 410005330 +1633310430 523681641 +3641795964 1784668227 +2755051958 4281481111 +4004492883 450068758 +2145500433 1633460688 +3405541481 3405541497 +803245697 3976589734 +2115807167 1176244670 +3516998066 2997357363 +1876036829 3123157803 +2863451909 3003770060 +745525857 1426599606 +2589856302 806788719 +1184167799 2474741830 +2039494417 1862709190 +4083908343 3230061655 +856456571 602020392 +3220342738 4115017738 +38894337 2806293142 +405470976 405470992 +1005548486 1005548502 +2750612261 1012507157 +2701023971 1399395146 +3562922043 2328362212 +2774109779 2667252922 +533935697 723903968 +3595696860 1057876049 1057876039 1342325151 +1514108622 3175209850 +1890237897 633914232 +653444738 3526262453 +4218626863 88105720 +968524061 4254679202 +2713936830 2319818042 +1020058095 2776306478 +2108152531 2193133521 +1727268391 958771062 +2574121292 3558830775 +3382237201 1822171856 3217735073 +2744114431 2054743422 +3515699300 1165331817 +3016095863 2007376710 +656649925 1286242103 +2685499881 3833784792 +3151900182 2504223479 2504223478 2217428522 2504223457 3569519783 4028719814 +3388818392 3582288256 +3045847115 642473810 3045847131 374031874 +1312020857 3237210603 +4276394417 4213990193 +545710808 4112528026 +4234198765 961318674 +3198231748 2717612072 +3504206284 651669587 644679521 2868837719 +4063817472 1581256411 +2934841185 3252381088 +3535610427 4206682852 +2090409346 3142323941 +1536551912 23870577 +3569026286 3496526521 +1476536986 2591949962 +601496006 911643297 +3862279631 898446542 +2729049682 1671125765 +2651229832 1118653877 +4178230844 2777192935 1126695020 +971707158 1125059495 +3532974152 3362367819 +3211518815 1843047521 +4248770949 794111052 +2391801497 95275742 +48433613 3731140402 +2916700351 1813650600 +1092430134 4060456117 +1472882734 1638006905 +4076052156 1179765589 +1540854376 4233853373 +331879773 2163843444 +2436993182 1211541673 +636868300 636868316 +663154116 4251470729 1949231288 +2106798800 2511059490 2238954827 +1143252763 3185667272 +3315118310 1522151975 +1769178529 1112706502 +2541589251 2108583338 +896131756 4244188058 +3230340636 3230340620 +591853257 1370914414 +3768077590 3768077574 +3024890320 2749747811 +4111601292 24029879 +264532867 3846684903 +1987118480 65782179 +718481992 1797928252 +4190098889 1612873273 +321933545 540163662 +3782378627 1783011882 +299830944 3257140709 +1792135022 1792135038 +683288626 1452155174 +1902586841 1055419049 1055419070 4223813903 1584006814 +166858320 4161570805 +2267217033 1158908846 +4222224598 44820721 +225464595 986685669 +2672120679 2672120695 +2276664120 3607130427 +18424413 395384930 +3354301983 3304727364 +576124879 898694262 +2150161045 1431312515 +1159295396 1796072736 2799677811 +375468809 610142858 +410401275 3200308037 +1173815801 483924712 +1433042368 916714821 +2435016170 2435016186 +224088373 1514445608 +3384208859 1710780356 +2112918242 4235193853 +4234114420 3192251801 +722554662 4064254145 +3101421010 2788072045 +2547592437 4292986300 +705920155 2241198092 +3516458143 2461001310 +1126094408 1126094424 +384903570 2946789587 +2758581928 2758581944 +2725205859 407277770 +1251470833 1579913840 +827491347 1794064000 +3749021449 3473117998 +3556719948 114130615 +1098996152 2336195667 3453986752 2336195652 +2637189165 2685286098 +729629741 2737984210 +2320267475 124452188 +1522179039 3258411717 +1389733622 2719923905 +917799465 1193862791 +1213004936 1496418844 +2250430003 1540829772 +3393365097 1925963504 +3077203912 2223071179 +1073775107 4147168743 3284970172 +1275462291 277561610 +3706022913 4036217638 +3837512554 2680876498 +1063667234 4026558357 +2523299088 3871535979 +2360086220 1054559009 +1906310028 1792605559 1721755356 +768425940 2386702655 +3367499728 3382385763 +919821101 2075690948 +1952404044 367590067 +689474345 3668119950 +3409069985 2166801014 +1705491982 779852139 +1769823058 3260437758 +558718968 558718952 +2643896119 1260993424 +357721859 2478320042 +1159958046 1159958030 +2579219177 2896066533 +3153356737 2730448086 +2707250364 3254320113 +1272079397 2167645754 +701919296 3245472931 +2100780033 522573184 +254893191 2288340914 +3287837217 3408803102 +4170660182 2886681201 +3331595131 2211309608 +3011496148 2839721111 +2741028936 2036025675 +2496094546 4123785709 +379048760 2589874643 +1783956452 1205149695 +1986706132 1501013033 +1512502948 2404795433 +2085948776 387323796 568597181 +1753744483 1753744499 +3500693567 2985324203 +3692799733 2832092066 3319715883 +2826081686 762636665 +1941356458 2906829306 2768112486 1168088083 +2872773596 664191844 +3301392855 482901346 +546280201 1174904184 +3565572667 3396563684 +1889506031 3408585053 388025233 3629589036 976506414 3629589050 +290567513 2929840168 280669931 +1711903840 1711903856 +153586651 1145121220 +4014297984 706900613 +4027786758 4096056183 +1267603145 3115179630 +2474848418 1963354725 +1445807281 3182398272 +3205643661 3205643677 +803777224 2127706978 +2571698598 1443287270 +4285637561 3638869047 +1158712613 3725472050 +1007396238 2244511802 341155481 +846282118 1940006357 +4235183717 4235183733 +1646203774 1482137310 2014794015 2673910352 2921634498 +1743737986 532809909 +2041616272 553555893 +270544170 2248967571 +3161902528 1862657363 +3977281623 2281310448 +2281499797 2821222044 +1404729487 2085679473 +1766570527 3778412232 +4110138374 3555131985 +493244679 2023918084 +119017667 3907062397 2002899622 +2763425142 2763425126 +71204198 341796759 +2677236700 2677236684 +2622447866 183871901 +2968140933 3680004768 +3124991164 2836501616 +2037297705 211853721 +3597734955 1632879132 +114602786 842235630 +1044809393 2105515350 +3326801275 4107430495 +993416306 3211457050 2827415411 +2300668236 731431585 +3471770512 1380096949 +2109923137 1755913703 +1635394985 3185766152 +3636596814 2273290969 +2420013159 2420013175 +1272018263 2981869552 +1525883907 801222844 1525883923 3924375527 +1532109495 2035066384 +3957996136 1251370860 +3596220300 4278820036 +1167997669 368931015 +1101860578 265734634 1164864963 +1914645678 681708009 260303785 3481190534 338080291 +2763446454 30877319 +1334192290 3886537149 +1135165570 91262133 +1981326739 3038238385 +3285587425 859569863 +673972514 1598408863 +3381975591 2085841760 +230790465 4258674859 3904763200 +1331854876 336365063 +2243729239 2974161352 +3160792938 397436521 +2731573232 1043949251 +1444087047 1832934916 +3692496355 1530807370 +1144155667 1852000250 +4066723367 827494985 +3856079825 2728446470 +3332784567 3332784551 +435232833 435232849 +2986859248 844998595 +3725733209 4020069128 +2798120597 1394957424 +3107494700 1102285500 +987163187 3545411148 +1793566881 3954079072 +656532406 1348040593 +3540477002 2124603501 +4008260767 2331685131 +3520070908 1182259367 +3579617360 3439585469 +2090118743 968816144 +1064280187 1334420074 +627797295 627797311 +4243999258 2374550517 +398752709 793696012 +648467961 2269542875 22573534 +2574768648 2678864541 +3691210457 3810172328 +2559536213 1579018490 +3838548681 4119112302 +3152239412 3152239396 +4075528699 1676672562 +3558430740 4261234559 +3526265202 99514146 +3728078013 3443354530 +3199920948 3028371240 +2423451778 3874528437 +2175341910 1932301934 +1202247919 3184361518 +2564095294 1669821023 +3647866405 576200522 +3781889480 2743513547 +1628448974 1028039250 +130157462 71843349 +238331197 3746433831 1387607590 +2912567109 1844759914 +3001281738 3437778902 +3119394977 1391889760 +922108279 4109051114 +1933458638 3233971794 +383287226 606012053 +1527584887 3432874841 +667819909 2258257852 +4197555372 1071520090 +1362318837 3387882381 +3770849005 3209926418 +1623194078 3377926658 +1587051081 1147336366 +2017183394 3893997845 +3354128417 3647669216 +3993844890 1490445949 +4036213475 2609853258 +3725279941 1354374170 +3037871266 2914349845 +885077861 885077877 +3498960156 1801431825 +3953981874 3008172837 +1008241152 1892983244 2594258451 2594258437 1008241168 2862700323 +1991365257 1659792814 +2062367057 3564190352 +160754447 1482682459 +756090048 2982836819 +3524228579 659262672 +2922440379 4059773042 +1749433411 2869733936 +30978668 558873379 +1251479724 1251479740 +1161035765 2268642278 3293563649 +84181974 3155921393 +1424957818 3435779077 +4130271559 2504760034 +3423246587 3099376173 +4262008585 4048503608 +2034112746 1026275141 +3938796808 215951395 +2604997006 4224137881 +104083776 69830611 +2573111564 3758174519 +702322370 702322386 +1068668917 992294570 +33173097 3624732512 +3520194109 2322428418 +729705915 856079716 +2421199875 4088731767 +2045762332 2013421274 +3412301288 365231165 +1920062431 137398302 +2280768962 2280768978 +2188249807 574292942 +3706509662 678951806 +519354472 940653204 201422160 591285181 940653187 +3786946768 2023884120 +1772277318 2437593143 +4293294592 3620867589 3299611084 +1520387581 665337589 2780507458 +1042837815 1042837799 +4214256102 1396919575 +3275665429 2169357527 +774362517 1035286940 +3368182217 3539988334 +3893289077 374690643 +3115782309 3115782325 +1090045147 580773074 +2636239100 342430896 +1595314141 2374269163 +133857358 3713530585 +3460915345 1317209178 +1549277397 2795612538 +3951662633 4070007448 +454876742 2919274607 +140484548 4069032329 +1200081895 2177236128 +1110502601 734759878 +149168054 3038636945 +987054353 552215364 +3120109713 1411492944 +1384554125 3929378706 +921566545 4126639328 +1235439940 806940160 +3481147878 313778097 +3446723784 3446723800 +2612667925 990507804 +3098090856 439962301 +2481930577 849597072 +1497706085 3947241885 +4055084969 1018927886 +3265472891 3789180068 +2564230397 2542367316 +2086762384 61955434 +434387569 860356582 +1938040004 3108009903 +1684520226 1749380334 323648185 +127287022 3750039727 +874703448 807063063 3307784616 +2559070868 1167054682 +1536485543 3530178294 +1037573838 787402781 +2089343844 1869700713 +1793974280 761576227 +166644617 736782510 +632180253 583956715 +1496665031 904284736 +2967163591 972407236 +3699016047 1670184899 +1703196294 1710988176 +1600516506 3346748779 1915189090 +2834574304 1301079202 +944935413 944935397 +3091898608 226187733 +196827255 4008461126 +960820011 1384828066 +1752447104 4009030035 +2934962958 1908946703 +1511605870 4033425458 +3672922504 2759760825 1106721250 1370196567 +3590779329 2918093526 +3476584894 4092044831 +3783195103 149338763 +1194215160 1194215144 +3894045156 1981028379 +217485484 2020297152 +570045450 2262821805 +896481871 369526924 +2149306207 2147044363 2079933903 180843144 +1012302621 422602402 +4025630352 2401467988 +2726730589 921080692 +2525431170 1028309262 +2498626555 1964442331 +2232828534 4161445841 +694310995 3709062336 +2639980178 1209595845 +2925071183 3308047704 +3018729274 701736943 +3974107364 2770236967 +4294898079 2639682888 +2250716947 1119597285 +630551224 3513234032 +3962970134 4013195953 +4210223536 1120324296 +1413032261 1420216189 +1099504732 1099504716 +2419217396 4080675087 +1662981387 1613721518 3234027321 1912592762 +2787391753 2483407160 +2691422276 332822398 +1211461662 2012182210 1855279145 +3121160781 1437711268 +3080533548 947668801 +195985347 1406554407 3867113622 +4240091077 2664831770 +1828886258 2366873317 +1497349438 3176589471 +3181716858 83492637 +19809886 198025992 464396892 564398554 3828934633 255832190 3091683048 4247389405 19809870 +3115656452 1546208607 +419207210 3469867082 +1221097531 419132136 +4099432986 3240259307 +1108556751 6421245 1895966234 +161144649 2755707296 +1479268132 748836810 273995641 909939505 35373861 2823098737 2648303862 3240066088 715297961 2203783868 1336085718 4110768221 2250926561 4218962435 3175982158 273526524 3526632388 1012599414 653049166 3045082469 2592639273 158545008 4067140369 3699076921 3494863387 1453016943 64992088 455394911 1359523631 2884099938 1133167635 985865083 +766265373 53839284 +2230316151 767754619 +3948544690 816987699 +1628710325 2276940796 +3227893342 3677349577 +3338743395 1096628560 +259482581 3747999977 +1279095549 29099092 +1210787014 2975112122 +1222135982 1518797305 +880766240 880766256 +3127919767 981316797 1661357208 +658750408 2195016192 +1444011492 1646284265 +4002036428 1901023479 +12578044 706875569 +694798729 3641072507 +1869359665 2554751782 +3833522401 1648021447 1842004742 +3856522490 3594706306 +1988281627 2153068425 +3164571893 3827603900 +156049584 4121552840 +4116215284 4061389885 +1377191868 4111658225 +1495823906 2092038037 +49558487 2104335216 +1525613581 860053604 +887281293 3457662948 +2805627062 1861109398 +3611840708 2866226335 +220970444 2279327777 +2962117197 1024167730 +2048608812 3310102264 +322737472 2287924165 +579370044 2564526695 +1025091774 3982795529 +2267735665 965264368 +4046005704 1808169419 +1371769792 3984833395 1993670483 +3989879825 1889013446 +3295899696 1907989379 +3101422769 1282790317 +3060612613 855155162 +2677525010 145911981 1307777605 +471072863 3739391813 +2329932294 2760507262 +3394853708 3601512631 +3260472557 2464923611 +465356478 1747770655 +1375358555 1995561917 +3209322990 84516463 +1449630503 2474928063 +3963957843 1863275249 2617456342 +570269945 2912531661 +2743973802 2517680151 +4044385458 197054997 +816936879 1449093240 +3543571490 1018562478 +3765034545 1064803895 +4191660256 4191660272 +2527186889 525663013 +1435633793 904094486 +1480250507 1872533186 +3433012976 256324572 3910574919 +1501655662 1501655678 +2201515513 2673021385 +3347322447 2842477708 +1456991824 99362787 +992320853 3460813262 475927271 660481095 +3453339990 1569452647 +3223166167 3223166151 +4158906630 1102789729 +3752687013 3272618668 +595276299 4126138514 +3040850347 1729252176 +861548681 1610246072 +4191409700 1832384536 1819941545 +3413714132 3940882412 +4118416107 1511993314 +2047716365 3635659214 +346228578 346228594 +3221782875 2825101892 +3456982684 3301581127 +3118206937 1937895102 +3819104386 3681813695 +3799390024 3353781853 +3372024606 3372024590 +1790033522 1741606259 +1332686309 2187658191 3728925200 1766937785 +4211674893 4211674909 +2534224793 1657289160 +97384680 188667179 +1809767246 500382671 +2970677843 279804090 +3095162098 1574928627 +2643325209 3746550249 527600222 +1793878313 1885778062 +1305156337 1740335472 +2283265385 2794556504 +4028973427 1129590967 +704725035 1257767842 +690233181 511518548 +4214088922 1128219435 +2898583886 1206824409 2898583902 +3576827112 2244628797 +4036483026 2433269651 +2359378792 2215918997 +2023432192 3694354451 +2195500527 4033204014 +1681557676 1948591809 +3483000737 1896122976 +113750667 3108754805 +4102796178 4102796162 +2787945970 1880873234 +3595370147 4264876700 +854361726 1628913055 +742901614 587133497 +2386110980 2088771321 +3889203550 3840376026 +1768526171 860356895 1278202436 +3740596006 1576338818 237109476 2573774547 1914787869 +1610963977 829415982 +674704715 1078528949 +3687849673 3516954222 +4244521000 1816067819 +100064459 1557830494 +1788755204 855828985 +499193823 499193807 +3000401199 3229691488 2976830824 +4176135254 443640815 +3798763689 2945344960 +4222449539 3037930300 +1089768244 1962353369 4195081096 +2501766189 3944401604 +2614691438 3069184628 +1732480974 1566269785 +3843819971 2889730502 4172520821 1562762747 2644275762 2644275749 +3876331375 655719352 +2061720736 334155763 +4173201146 2825171925 +3463657047 1449036528 +3806742844 1188207856 +1977284637 4242671602 +3488267739 3092848884 +2268571290 1989887101 +4281424583 1930368596 +786063370 3418697659 +212444609 212444625 +462851593 1996593198 +3200836728 3460278509 +1300475991 1565432038 +1050241940 528767471 +2099080585 2119397048 +2116028019 538671072 +1312424163 139421020 +1522018959 1860900958 +2671118845 2668738882 +2233425422 3985293210 +3967634293 3191720234 +540350323 3336138976 +3693065906 1014414939 +2244579098 3669498752 +2225102495 1735717960 +2954879755 1295149652 +1013360964 2373888555 +777636398 435095922 +2036069839 448684791 981102604 +624607641 2056145772 +1635919825 1357164048 +3861647311 3861647327 +2834771157 191421805 3525022538 +2385291975 2538657600 2538657622 +1514401387 1514401403 +1170610583 2661313795 +2518928704 2589727699 +1974362687 2027309546 +3870813121 3360403697 4102562006 +3896753071 4086780575 +1575646345 1628795832 +3401504073 3401504089 +2449334975 1672749355 +3574264140 3065290840 +3399558480 1269677283 +183343011 3607475594 +4055139948 1022530944 +1489406108 1552485767 +385055970 2462277110 +1310420453 4033424668 +1107621040 2647470339 +2989305013 3527382694 +621183927 1600077198 +1084247832 3562832603 +639637089 1547113277 +3592468064 1971263795 +3097533818 517465885 +2678146526 685833321 +2178024290 3833860714 3214627651 +3877197850 3873812715 1721074165 +2437689076 2038924616 +1980521918 2474086943 +194469894 2380613191 +1107037335 1992806822 +710258489 3722630824 +2101158608 2873782059 +910569115 192634386 +1819332030 1939071497 +3111833272 1757662268 1693692224 3025365933 +827388342 1483506065 +1317307531 631023298 +4277626933 3494347861 4265294792 3444437292 2792530838 3455880326 3993245909 465129192 802969474 +3881546132 3378023417 +1709853518 3184823257 +707706783 110602078 +1402356205 2190067730 +4263139799 3685166325 +4258643541 252283642 750313509 750313529 +1036704510 1146535369 +1945876603 272853426 +1592747417 1592747401 +737420799 737420783 +256236670 1693014676 4105662634 +2387290029 2500861100 2546475941 1745574068 +3500459750 3509270577 +2099419508 1903661465 +2019937645 1853207899 +1042347396 2883173934 +160629080 1785404813 +3755560284 2977914897 +3406235624 2215735860 +796513476 2160717961 +249353464 1684956808 +362685030 3872133009 1844455063 3829170512 2819407793 +3526494265 3526494249 +4053712224 2149282861 +1366160471 2266473702 +3116415364 3999533791 +1403360825 3869998007 +3567001459 616923660 +183394381 2185337124 +247219002 3870636113 +1439073238 3716254193 +1206632300 2753451799 +1470873924 1729407023 +1466377666 366013387 +302192710 2698982945 +3981363942 2697911345 +2840961313 2999756534 +866390287 241964326 +2545223851 4122480856 +4162540846 4162540862 +1735765493 3150981593 +643520665 4207704264 +2042562304 2813854981 +1384970919 1285016685 +1761725861 4074158778 +552578325 3998054410 +2410637247 4028649918 +875511006 73191807 +2215821000 2978108619 +1366182337 4053670592 +3463859627 2939962402 +3871159849 3066300136 3648794516 +207401311 3058302475 +4009801349 3273610060 +3152950224 2818281571 +476823017 1654277055 2795238862 360969049 360969038 +275874871 83847348 +1463760599 706267209 +3623347903 3124772542 +2551855035 365297278 +525465058 751855350 +1670975421 582489169 +1595749566 2029651743 +4103907240 3130781035 +2183659208 2901808331 +1266780310 224692577 +249934270 831966751 +1081361827 436838282 +1945820323 921261212 +1089629040 2912887125 +3417531684 3479713705 +4111165947 1917167327 +977447054 331798041 +415874092 3861545926 2704115059 831732040 +2791454713 1911004546 219451706 +3781534283 1622311883 +2642705979 560373085 2230710075 848475890 +196568694 3887483854 +1002081036 1155449203 +3132334683 1022986085 +2230316155 1756043434 +683205758 281451684 +643604101 3465696176 +1916218048 4056371087 +2749429975 69377609 +317127330 202826955 3783517069 +655910003 2194014100 +2194667837 3265079217 +2218813110 3318277249 +4216880992 206603301 +1887403417 1887403401 +63479066 248467426 +1183047308 2375505505 +1250491178 1250491194 +3626164324 3674582095 +34781438 1098463190 +3037244184 346379981 +2020571077 3663234983 +289904861 280339426 +3214374824 1131502955 +3785918389 3785918373 +884605974 383020721 +2811891332 1535433161 +2981019806 1410939071 +3391118423 3391118407 +779657190 3150281342 +3207982376 4017315139 +1115841759 2453981982 +138424443 2014073252 +3857829370 1095408341 +1187838660 3223074652 +1263583314 157937915 2028203006 +958355608 2220390220 +4007164398 3972526511 +44224443 339500219 +2888107628 1783176193 +3318244227 3715409706 +2397287147 1769891096 +1688434780 3377887441 +1808163191 3095692867 +2771712046 1080209519 +82653250 56817635 +1274680419 4256045020 +300166607 621373467 4180942030 4180942040 +4197903494 1786140407 +3208762867 1805124738 +4246533800 4246533816 +4113992055 2077910598 +3022438959 3355684846 +1587462956 3824907019 +3402048925 3565172276 +2008374674 75648211 +4084608272 1393094709 +2306673745 3235537808 +2467155569 3425092127 2428982521 3988617507 974219190 33204689 3286919777 2670246951 +879111830 316364327 +1171541533 171374516 +30875465 403933876 +4087845062 2758486074 +76491194 151962321 +504500369 3882882118 +3192916787 3549484995 +3616429704 3708958731 3708958749 +2552545888 3232708905 2966515061 +3721719945 2970220280 +4236541486 2995954287 +4174458539 1548515106 +69926357 69926341 +3191901174 1973179473 1813556182 1973179463 +767207581 2581032756 +3401176669 941312297 +2259929572 1455190479 +2608908366 1357077454 +4075211525 1967125892 1206658159 1027285074 2489201143 3967000381 1967125907 3824798555 1821503360 3858353773 2269685702 1716623578 +910191759 4134200590 +4015528390 1390683094 +874719244 525863671 +1549087581 1549087565 +3246330218 84437453 +2664064807 530604640 +670320250 1602941469 +253945322 2922422345 +358742720 1765653573 +2129650419 2684376136 +96569523 1894661499 3265933786 +4160091279 3878681880 +146316753 4063426483 4181454554 +3234462029 793407301 +1864140937 97747103 1927999416 2513915630 +831385061 3882712954 +2911626146 3577174019 +4235601194 507769318 +870670880 3500565400 +3894577318 341646686 +1214089561 49553867 +219206012 3358950083 2702528172 904229872 +2470966605 2470966621 +705627234 4194532221 +1029530743 285550416 285550406 +416137392 3768053771 +90199346 3977798405 +1666265589 1305584828 +1454045379 1454045395 +4149310001 1848980672 +4033716627 261446252 +3046559021 157613522 +2951618804 3890077711 +3249409430 2063557415 +3218923608 1511573884 +2381582022 1026769335 +51343156 800808840 88870617 +2057711822 3785282639 +1860541391 3574302220 +3345522296 4113758083 +3056533305 83609256 +356876242 1315452805 +3609573039 1600034158 +1994022335 3636564926 +3192969214 4078147626 +2417883508 2241241043 +990957337 2412304802 +1804952968 3828274443 +2752279942 3315401185 +2917107760 1816565004 +1304507535 231217981 +788437584 1254943733 +893405950 3526757833 +1270745756 1166365989 +829247807 236381736 +436180785 4272932775 +1197491721 1703821368 +2957839350 2957839334 +3547367947 3844689748 +1900206656 2352845523 +2423501914 2423501898 +676724914 828577850 +2203377438 3701161001 +865240356 1403492265 +3953650803 1817786650 +1018286061 2028622340 +3830156661 407944973 +3582649001 3919761308 +3887011081 4192726905 3248364846 +16110375 2851825248 +593187796 588277032 2093283001 +3314264745 3439584776 2434391732 +2214916461 1950433627 +2784384830 531345237 +777206412 2030381687 +598042958 3584251563 +1945536894 186282313 +3835420645 3312185098 +999237141 1968731787 +2058105900 948723132 +3035311627 3644422996 +2442151437 857622116 +1417004613 979836556 1886904890 1622337815 2320837757 979836570 2320837738 1050989267 2752190275 3836224876 +4210564295 4210564311 +1930988527 1956594476 +2470020688 2931458322 +4009920036 1694050985 +2915600012 2843075233 +1724956307 2472826122 +3590903377 1089036687 +2227918519 3273228816 824688436 1605353193 2677149326 3421305566 +3646487918 2501309487 +3067688317 1424962498 +1211598428 2751177471 +2600423351 3068820742 +1507531884 1507531900 +3505768587 4063119221 1311001337 209159086 +3756694370 3763510101 +4042033820 3764269969 +3379506595 3171211164 +2901627455 3732716011 +370407134 1821508106 +858678414 117770737 +4077826209 4218761414 +1717463692 2996943479 +3392659041 3069383328 +3347955380 3626186063 +3162571204 3678998163 2199242624 +760531834 3598471453 +1232574642 1497718821 +2987064576 1108593883 +564259793 3530379562 +1801162984 1047330999 +1055632358 1055632374 50312273 +268614275 3154567059 +2389464587 1552321848 +1105583163 1025804166 +3792616117 3792616101 1517464016 +296540812 1595673207 +3649884615 2135480530 3989503129 +314871710 695080361 +2806709819 2517513956 +2116880082 1927396485 +1250312819 3025830346 648156151 1250312803 +2562701356 2714692929 +3987396084 3320841289 +1906252315 4012303986 +432420606 3787863774 +2471005193 1754249234 +2674028535 3740680646 +3145474091 1332126644 +3574347931 4248640530 +3588182571 3649984930 +2892958064 1542080203 +2457590331 3556281060 +1806439922 1910934501 +4114698893 2731865070 +1530042275 866432405 +191373925 1508779244 +295998390 3679541655 +3211129971 3064796087 +2207708749 1072017330 +2116400125 2116400109 +2811740869 2565315596 +3050140576 3530360036 3530360051 +4162293797 2987911738 +4204817515 4076988949 +1345197427 2878063628 +321261134 1329579055 +2994459448 853694917 +987188509 2918075236 987188493 3186517154 +3867214691 1075336394 +759935809 1378389479 +4176820502 3035950583 +4164023460 3646651033 +2777792532 3094437753 +2796191833 3077049374 +3861172502 1173014511 +2725745726 19751241 +4204740371 2612022010 +2179349075 754949579 +2974614189 3376100932 +1312393002 1318045453 +361363904 2821990725 +2111398490 1488731249 1421620770 +541166850 3375430179 +1483824633 37370313 863432446 +3890014395 4143617896 3150077540 +2348489633 4249648736 +564021609 1622811762 +1856868717 1750634450 +1102537477 3631347498 +600167112 409653451 +2735430596 1860269449 +1611690250 1138881197 +1227087258 2773218196 +2530310346 4064694438 +3675716939 4038698606 +2876247680 1634128773 +2504328604 1312006215 +242192031 1486718046 +822381273 52859784 +2785862555 21646610 +45322817 2052493031 +2507113507 2902189319 1636631324 +1377861017 3747639934 3630196588 +3790276367 319772949 4058057112 +3704018183 2483116566 +694119318 3073793319 3073793329 +2675936056 1304963387 +804455130 3636202147 +2057700581 899741150 +2152065142 4276774994 +1462062472 1280284261 +2084794205 3329555870 +1545070312 3785391915 +4073091227 3378725892 +2468433141 2456561084 +1370135658 4187241179 +2992074265 671887125 1636176034 +2550679219 2251146667 +1350870065 4056840496 +294076502 3991553895 +1564269387 1564269403 +570045444 2162156127 +1089728592 465657644 +3145431894 2036541553 +568608527 1767627918 +920354249 612828014 +2948191007 3230095838 +3488882911 4186552732 4186552714 1573852205 +4126141016 2158880923 +719312342 382199475 +1431467144 3987447075 +1000345175 4206451122 1311130883 +3390643953 378254694 +3989683865 4091742920 +2786824722 2405888581 +493632687 6522737 +4107932387 1447803740 +1902360477 486149172 +2953635389 1034119755 +1649948736 1649948752 +1253240434 162356581 +452560644 2060421952 +2395117033 2395117049 +1504857949 3428488875 +3474459461 31188775 +4278030868 2100098415 +1789107447 3599767760 +3835250703 3964432270 2421401087 +496433272 212411629 +1453177001 55161358 +2125194639 4154089486 +3863035247 3199545979 +872504878 203899513 +1584006793 703089080 +1289674827 1306203650 +3925050874 1146873995 +3310965791 3399445704 +1768064374 2155074898 +514337698 3837571082 +3384368163 2982939413 +3129396268 2639681968 3200496773 1440671164 3459475799 3689853271 +1411998645 841479676 +1935822431 46227358 +528320744 2057209131 +3597674478 2156846009 +369880033 2512671542 +3304368194 1327816693 +1979355548 1433614471 190813611 2596570728 +1914851539 2131049516 +4135696606 3962963305 +121915323 2884349082 1580675249 +3760425643 1493131982 +3457091655 2483844543 +1665851641 1205872616 +1863514060 1863507283 +4151950811 1873141700 +3570370946 2226485162 +2328284648 1593189437 +6518198 3792445962 +2186079415 76067049 +2853264232 559080637 +3716199902 2409516159 +2535240445 1159521897 +3119038688 2305269925 +1601032814 2016396025 +3952056949 3952056933 +667194614 2423684935 +4074839379 3471140427 +2281755159 899881346 +49535995 2699250738 +1696571990 2718082099 +3216134261 984918058 +510363917 4031299428 +3268303377 4076517064 151072538 1253170803 +559953817 595035592 +2794421110 832300887 +2079343155 836873909 1312306778 1887700856 +1658597166 1239429805 1874309114 1087048793 1113627508 +1967628437 1097653723 +2766189718 599541806 +3316635457 1959779136 +2321177878 3848612593 +1285309208 3425707744 +1337733601 1679501476 +4189744637 494609748 +1478654826 675825627 +3455624882 3167830318 +288184054 2423930578 +1496812791 1769138374 2194826153 3487858548 +793148414 2885414686 1777676511 +177147736 4147455899 +2039865052 2909092743 +2756672337 4196343952 +2626799654 937597146 +3040679225 2284349608 +2804798613 725953338 +1884967986 848320475 +267732653 2929882456 +2043408697 4111252648 +4011376534 4193622311 +3993737368 1413560155 +2211367483 3112721124 +2724805560 1672020653 +1433860715 2600056984 +1551467108 1401663588 +3963190726 3963190742 +4170219708 3071696999 +2663800345 3059524811 +3804947330 2103888654 +1650720949 2557287658 +3556442609 2770603632 +1968495399 868367447 996130358 1361794632 +3455978199 501944432 +1870874321 1318630493 +1259622866 50122117 +194880664 3259562532 +1116267688 1702884459 +1991039867 1257025631 +3525023537 3401605590 +1943205386 1876666725 +2974725320 3200479304 +1948540898 3074617539 +2523458863 4130169080 +1942058117 3196743002 +2724854629 3061581731 +2485924302 261252953 +3332604270 560250927 +2511864252 4112336620 +4071108051 3197547809 +1291608109 75988556 2122067372 +25446085 1870979325 +1397915260 2799508785 +2668799877 3341515756 4065723775 4149236138 1153768364 857444815 +3097728552 3515179253 +549041998 3529215951 +2545634532 3913229948 +1309540628 4094407289 +3284409085 716602452 +3651718777 498927742 +656366544 2587742268 +1931055687 2532518419 +800765599 3253566558 +1914108253 575352827 +2122589327 1472009855 +3872152488 4222896509 +3702542846 1737560777 +1954382778 462839261 +3275936764 1580447153 +566875992 3491318515 +1678370098 2912144819 +402643357 3453951593 +1554723003 1554722987 +2331583542 4231266577 +3985205504 4015016723 +1710403248 755564291 +414789212 2830585297 1675336822 +3373672842 3373672858 +826542117 3004748346 +3130701409 2982480777 +3403469534 933229430 +2663143361 898890992 +236893371 1383141746 +1698696020 3083982127 +3628531938 374279146 3628531954 +1246379863 3091580361 +1845399666 2579325811 +82174798 3828964346 +445386302 4088882445 +1932783035 4152605829 +2278727546 1251020061 +3108602319 3214990348 +1574071114 2449686706 +155328782 4261354770 2868658830 +1812947603 1298822131 +4268002190 809455717 +2684108843 2684108859 +3852617124 4001539108 +3213110890 2703853779 +1514562964 2966546415 +4120627346 882823981 +1350759485 4213603348 +658741924 1936486463 +2824345098 1010162272 2938896940 4037461849 1992269627 2947927969 3473039753 585656956 1412825150 3047288117 +1355452196 1390368191 +4170282637 3657277412 +136186003 1514635116 +1440844369 1440844353 +3371838920 701895115 +2989331730 2699080621 +178478748 1863512183 +499813721 119690581 +2436836254 2112763838 1148299711 +2818920469 2505904412 +2936780095 3463336510 +1490209572 926746252 +6963231 3814787786 +3257381331 2004676396 +2618393896 1069764851 +2381302753 1367208736 +4210516478 2299694002 1926985899 2989958325 1402580609 3248436318 2207360583 1738852516 2598843219 +2599617436 2160611449 +432248147 1174917591 +1291608111 1640231907 +961824880 961824864 +1851219299 1344043524 +2883877644 510798647 +3061799555 151628396 +1040385718 1422102673 +36660357 177423323 +3346425044 2051300905 +1120972425 2430002414 +2623060036 1672090377 +4121178615 4121178599 +1682325515 3851866452 +207552891 879871429 +3367590393 4106789608 +2976243014 3038882743 +2222066368 1065806917 +2184949838 1375111897 +3974568918 1320840887 +3070356452 2868668955 +2364443946 3140229785 +1172027227 1412799835 +4124172387 1550072789 +3137082411 2245246900 +664645782 4080860209 +616397475 2034765468 +2491404861 2216184702 +1187355723 1187355739 +52050578 3889142649 +510495961 3212097928 +2568632599 492122377 +3202604977 834216880 +1954201650 995407534 +4133475331 468516413 +3030681590 489885202 +383852997 687387626 +3878137195 924120341 +3908512517 3427765015 +404544071 3714667858 +2898095734 1412745857 1681187793 +1200412473 2596761282 +1686842582 1165633642 +4014807251 2723878908 +2028689835 92153890 +103164415 3735599019 103164399 +1074843756 1074843772 +1542004608 805082771 +1747452274 3158143417 3237804526 +1348305507 3862184394 +526700824 2209687757 +2016864485 1145872394 +1519529932 1612791329 2035602483 +4168182857 1670215406 +1005757086 1561460011 +1971760824 2896764363 +1673321115 1048691237 +3054020125 1576004628 +4183266062 1075578009 1075577998 2463923983 3204285202 +1569383767 1056014019 +1245166432 901511205 +3711018079 2485502366 +2197464582 2197464598 +2085649500 246662353 +830328853 4262367498 +769780094 3097661769 +2207963580 1790899268 +3200540514 1618623789 +2752343363 2216886378 +1510684423 1797154393 +755831878 4009513680 +962417352 1035701571 3738685296 1531595747 1531595764 367612125 +1869450937 4265464092 +2669931069 1238772546 3263806987 +118807853 1389899227 +3117639006 1261892192 +964428850 2956630707 +1731450647 2375784752 +4057053631 1814521768 +1814902873 2754589704 +3181765305 239129960 +3096163470 300759951 +337637514 3553585139 +3816600065 508311424 +2482639072 1264303831 +2209231999 2209231983 +3802833756 3915182600 +450598235 2845227109 1492362504 +1770077025 2003859872 +2919043877 3400482019 +1266667594 2380999208 +1200412464 367388935 +3777287097 216624147 +4273528420 1627789183 +1844684435 2844735866 +2039925792 2288211557 +2937354347 1721656984 +82057584 588516163 +136583 2319967104 +1688308529 2605588006 +2937455362 2692362601 +4102785380 1478846268 +600430408 1106355316 +2853515855 241054286 +10151469 314473360 +317453410 2801920893 +1003132755 2447089012 +1094268446 4135353709 3715986250 +2051576301 1832761348 +929068198 3537346903 +2512862959 1435807276 +828322606 2096989733 +1933191543 3683599952 +504764963 2144019722 +2222162586 3880942312 +778314665 2963546904 +734231558 3938205025 +2641387339 585499412 +517338760 3729574908 3209622965 3705995610 +3073115567 156037752 +3022446198 981961426 +1055905809 1450818977 613491398 +612809552 3491290869 +3200406031 1525099918 +2493974726 222100753 +4168988596 3790090319 +1607481190 986133918 +3845234210 4011585411 +3359465413 4254974732 +1726840470 3328786162 +1609764829 419089346 +4024601241 4024601225 +2628214996 1870491065 +2999329214 736566793 +332702354 3384536019 +1424459234 3179780349 +1581482398 38079401 +3123525959 1546726102 +1410919210 1839100805 +2277124812 1980849975 +1679987163 2104204242 +4179228032 2749200517 +2945351077 1503403137 +459612135 4068221939 +1331886187 1674383476 +2495025434 2495025418 +3902527121 3193095760 +867778118 2996635681 +4259880318 6808034 4084378783 +865730421 2959942972 +3620714727 958325988 +1288828406 3833999943 +508381777 78380422 +422779942 3514126273 +569432199 4112833686 +1957738323 87070636 +3063648406 216308775 +1513771333 1513771349 +3867694930 983660051 +2804329913 3524882313 2804329897 +2522967922 3841393947 +1525789755 3706949448 +358837871 445044920 +708854263 1020507437 +3506564337 1201081750 +2642184419 3456859484 +2749748745 198176824 +4145490988 628787543 +702125788 1112811775 3037030958 540138152 1500839986 2101706778 +820757826 1160218339 +76454194 1585129893 +671995441 1053306662 +2747710240 4057502579 +1601798360 1601798344 +407695995 3156326322 +2410433068 1480115009 +2419871091 2179853324 +3609472169 1458720270 +268674858 3684558014 +3686522670 2557353209 +3952636542 3385903072 +2574292488 673182623 +2751284249 170927055 +3082623877 103556729 +694073281 3776660672 871193830 716376935 +408560898 408560914 +2850703745 270638682 +3976843441 3614672550 +2749892654 876929135 +2747298659 720741578 +3737557348 379811967 +416148111 551651547 +3367243208 3144790475 +4172715276 4110603552 +2677190692 2180757040 +1284768603 3892398148 3300247490 +277260945 2499707462 +82192521 472379177 1440845561 2759912154 3305695287 2684990449 2936375167 3669252145 973665556 900433281 3044160734 2442284043 3428805370 1144741671 +1611784906 103285755 +553922558 3655134802 +2493488729 1346782728 +3882832451 2373045159 390156716 +1929980374 3983334385 +2254716655 2432910366 3556354015 +3993660 2616077927 +3165900632 3393192676 1729062797 +508720451 4274952316 4274952298 +3667328185 3643717643 +748046212 2079352360 +1733804826 3374850557 +2220678643 1362191770 +3285254191 1896040942 +3597571189 85177404 +1584194058 3681908083 +1012996359 3545078873 +3895443603 1401032470 +2350904628 3394175193 +1279757626 1319326301 +2783582994 1099472211 +2687742112 2040509247 +1184589188 1184589204 +1215374978 952547979 +2600395375 1849586862 +2257469236 769568649 +2898358934 2324128295 +1887936379 2692746916 +3069414635 434294543 3069414651 +2127102718 2127102702 +673402560 1593088484 50239096 +3081667518 1798262751 +783376561 385155933 +2022441506 2108618550 +730003039 3458842190 730003023 +3130486012 4043556519 +153963216 1112327523 +1710501481 555159922 +4246736859 1417213380 +3944444256 2083748389 +505671551 4052878590 +3669480786 682857529 817078478 +1602507078 2739663137 +3990202587 835755596 +1515358424 1391113763 +1072191095 297803088 +2410166494 64062847 +1434651441 1434651425 3849778646 3849778625 +330647169 2271083776 +1809277288 2261574990 +413935397 4227964730 +3199021362 3961471166 2418383880 +4259572921 3963919713 1183733949 3963919741 331237022 +1288238115 1288238131 +1036620600 2085798203 +3554525080 2809269540 504667213 +1161124302 3237764943 +3148134273 3847020544 +300619495 471141792 +3424630204 300619495 +2632426095 393455238 +2276357048 1335896763 +3731681818 2545520923 1065426685 392982971 817950680 +1078889598 3114740319 +174227119 135097710 +2709251966 937771729 +2456751902 924575806 1526598594 +318435357 4261936564 +2216968365 2903179090 2987511899 +1359739484 4057669329 +3642919157 3328022954 +4084244173 122289316 +3239985267 1973384460 +805636955 4075872338 +202792517 1685278703 +3988295887 143390158 +1345827908 4031337263 +1478820791 1914117337 +2289530695 2289530711 +3242797541 1908623645 724366202 +2095905885 101795444 +1169860321 1428193240 +4074097123 3030886109 +22276933 1545297292 +2333763650 1016209397 +881717921 186339572 +21575240 2356517731 +611276770 1028085962 +2651813480 2492803220 +3446613548 484385024 +3647121352 979706521 +3532985572 1776432344 1689248489 +3534961404 2888161969 +1722364978 3462212261 +1083377543 779409792 +2230316149 3718123709 3516060533 3682829428 +923634401 923634417 +3090734109 511869364 +3558188518 3289655553 +573192005 225771930 +241679444 3379838649 +2816754571 3612758996 +4177073518 1578941497 +761595204 3648618009 +1563485525 1563485509 +1473387432 1473387448 +3174805742 2031937201 +106974322 64072205 +3173615374 572259724 +2187032609 3115112959 +875840461 3349102283 3383679073 +2542830331 2542830315 +3930730818 348883701 +1006435681 3494043552 +539689514 3992969875 +1248887747 4062145532 +688745231 1252265368 +1498936336 3044357429 +1603733734 1711031269 +398563657 2932100590 +3018815674 1999971221 +4064887391 3815470876 +3342373317 1661827354 +267386804 3402598479 +3744096033 1890828534 +1710058087 922565470 +2034085804 73203927 +2249387389 4030060303 +939599517 3335506228 +2164319518 182991129 +1801984430 2907401739 +1083274882 654151349 +3736538881 2603392662 +2915318720 3034262338 +3078339716 3299542063 +3046182988 1143311059 +189502761 4043034510 +469405523 1584373676 +1160904196 4055031903 +2557664098 1590647626 +3029252389 3029252405 4262431325 +1307877307 2926433775 +202740066 587701880 3957675721 +499782149 2671660148 +723903317 478851505 +1651732305 1287142543 +3189106675 1282143584 +2003650960 2433404341 +1415678760 1859991260 +26507971 1069367548 +277301581 1375233074 +3669036510 582538367 +857318863 520164296 1080034500 +3842201602 2252573493 +950070110 2203223273 +4182109153 4182109169 +12521590 3147527701 +330545377 3840674336 +2737224390 2616722849 +2230703633 1175117015 +3688848292 2895165848 +1865788606 3481202441 +2394098921 2363314887 +2938837871 794712209 +2780950042 2780950026 +3045710465 1224931606 +160879728 2289069123 +1615937990 658005511 +2912861463 460256082 +3368366985 209938172 2540708024 +4203368289 3367695776 +108051630 3514369529 +507353927 3791352000 +2301907208 89886612 +1232316603 1544724077 +1570323481 1899600712 +1826217576 1826217592 +2585912245 47490470 +406734660 1846161417 +1882873858 2917475107 +1419586351 3865646202 3603924309 +315161125 3076638778 +1385181051 4160386441 934943806 +428515695 1118377147 +2104253769 2776173394 +3588191842 2899721597 +1579754270 712899244 +3085308968 3553191336 +501858911 1979513736 +1089994654 3831981503 +3395634426 3915147715 +2647007469 1273353476 +1810530548 1896150164 +2527015939 1253814017 2661162557 +3115924854 3566977223 +1897216684 2959826135 +4188852593 2081273062 +3384022411 3384022427 +48502345 3591312632 48502361 3591312622 +1876577088 3542618104 +918734140 1889303911 +156872109 2852186738 1697408850 2531698194 +189514816 1795261176 +3415461634 2075058211 +2722864969 2301639221 +971323790 2291027737 +1607982038 2935566007 +3864741318 4080797794 +3077297344 2126506579 +3296655076 3699631833 +665998280 124918384 +3315677706 3315677722 +3686742078 2499508258 3954681182 738560415 3954681161 +2497654770 3041393050 1297644019 +447538255 1294690385 +702869654 3612483610 +466297310 466297294 +3950822363 3930480037 +2448553392 1001631005 +651556923 1574290674 +3892321343 3271529451 +3199724678 2721310417 +876639800 2038045229 +38646648 407995885 +44872236 44872252 +3132542840 1439203499 +1076542403 3326448636 +140805175 2242537652 3915420521 1832657542 +12315956 1540778201 +1624570315 977615490 +3213760842 3601977197 +4004583451 4228925093 +1595799694 995713514 +1362672689 223363366 +2571744725 604585546 +3846956720 3846956704 +2621380549 2330044089 +222289453 222289469 +2354553343 1358259521 +432575981 2210661380 +376234822 1300539011 +2737116138 2737116154 +1291925912 41514684 +1140609537 3886289216 1802515605 4015140427 2257089860 1566646836 3984549778 2607464671 2450622819 2588085729 +1994898557 2567902417 +3677968403 776316396 +1672023271 3391049632 +2151936726 2890177953 +658314405 1780973498 +290312981 3945547827 +666255672 4031079664 +3689282263 2978767671 +3048392565 3048392549 +2662141690 2662141674 +370433574 4178111111 3893376449 1445391436 +1079631807 209402280 +2533249834 674584740 1556845068 2533249850 423928305 +1991277812 1882835092 +4226687194 1910355746 +3409924635 263078034 +543461378 2665742347 +3445104185 3976041502 +4108356263 53012248 3637956521 +891433579 265641570 +4271063198 1607383209 +2094051916 3364400567 +3092221192 758842251 +3282872908 613551223 +401290329 1547892233 +3773147007 3439470138 +2390374739 2390374723 +273501886 1471339513 +587733994 745861714 2869918758 +1924333151 4005982110 +2219179672 775545907 +3185356343 426131590 +1059145769 1784424344 +4190443600 1963794620 2168800757 +968010078 843095807 +4054359840 2101251067 +2606737697 3096919776 +1147787675 2138275273 +1076024673 458114517 +974685935 121321019 1671195192 +3039678888 1913247998 +2308049952 1629106584 +2923172633 4142908414 +2049342184 848526123 +2915879380 1835120825 +1790941781 1621095388 +3587196852 1256251471 +3642535412 3156596495 +3344155597 2514303908 +3486825322 3416027309 +1979447805 1979447789 +4028185056 3619036083 +3100226578 4152784979 +1596413867 3447077891 +2429950927 3490563790 +2852049451 3341081012 +3644947256 974453051 +4207325372 2194159601 +2977845542 2413412055 +3730651959 1136932742 +2578918179 509143050 +2728119170 2101435829 +1180195887 3961069048 +3996855553 136829078 +3882892706 4155573763 +2795589864 2638767596 938630461 +2415137264 2369273045 +4210527670 226354071 +1553598824 581551232 +834862667 2009075576 +2548221254 1610386721 +2668799879 2532823814 275056406 1626163265 721999516 1055822542 1977690346 1806427786 +2055675892 3602337039 +2330812295 984441238 +2924506967 3214886374 +2613013311 2613013295 +3143398822 2559390785 +2699825677 2559029697 +942480531 33815397 +4049962500 4049962516 +1750299466 2237562221 +819919926 1360213527 +2673581753 2520440126 +1002681952 2045744443 +1135321563 1430111624 +644322256 1158525045 +2865646641 331477295 +2850947336 2309726109 +1752261697 2877346368 +3298801516 4084055831 +2632376149 1416729308 +4292014150 4279254583 +2723552998 181950082 +4079631617 3430811776 +2756094457 1525573064 +1300690329 3247942249 +3173035920 1249140643 +1318383262 1129642379 +1821812720 3777650371 +553522098 3222923346 +2502734754 3845246490 +2629811068 2629811052 2247424295 +1422911661 1078682004 1695202612 1484970245 1422911677 +1529957188 3533274143 +1899815974 1759193047 +4186509033 3150084295 +3172256988 2896180104 +1764582368 3522608827 +525498349 1003670020 +3046033186 4056119957 +2514610077 4282446187 +2922904890 3129044630 +2865765564 2711436263 +796622219 1248240084 +3421053427 4076892570 +3952721611 2919717250 +3750390001 1084877184 +3014269500 281496679 +2579170072 3361586341 +3600293240 1232495597 +2364929964 2469716929 +500862691 847430364 +4160643770 1943895097 +3335458192 2280806844 +3125171664 2086558268 +41042773 786431708 +1662981380 2847068933 2003018950 4261491012 3198625850 +4030607083 3087826360 +3924186149 3598206947 1519810092 +3223634566 4292753633 +3422107553 3125973600 +1180204141 709615492 +3513218239 1970561921 +3012750137 3913829054 +2628665944 4266815629 +3974950768 818563016 +3389224108 740415191 +2262738546 1200001745 2695536618 3753426984 4112276558 407716063 2010375135 1067793807 +2267926536 3575544971 +2586441488 3222269500 +842412183 2723052976 +1644648370 3442591565 +1226149467 1743722834 +2051385743 178908184 +1659775359 1005277928 +1979355543 1349726374 +2667283017 2397968622 +1655286690 1180290158 +1577812706 1141222761 2849796318 +3705407405 1533023570 +742467175 294614048 +3950802955 2086174511 3220240724 +2210232310 1497618513 +1349837743 1892729068 +628613893 12214490 +838381622 1885737042 3766314257 +2661960423 481499991 +3010593351 3279525312 +3686913519 3507002409 +2231681810 51286445 +3668746156 3921632193 +1227623928 3664459392 +3375105922 3601269661 +763447120 2829208801 +1511209412 353140744 +970038527 66725224 +3127782888 2076621983 +1731003047 316353782 +3802913320 4236799229 +3890590351 2643990286 +306899792 793183063 +1908086439 3302350560 +112619552 1404009474 +3126838124 3502285569 +2812100064 3163056051 +1070381921 3494574496 +16589727 763302750 +2592538787 3850764426 +2707173829 3205646902 +491729166 833239311 +3713337212 3244893488 +1199186386 3778018430 +1598906679 3223343721 +3785471531 1553057204 +3518290046 2645610057 +1731632902 2218532167 +347738846 2129376105 +1878022963 3228678816 +517731985 517731969 +4246513331 2358889563 +3757786018 982218755 +593285051 1713046386 +3015455596 2553338143 +497876165 2085743116 +3793098659 3793098675 +2044573096 2664916752 +3912249496 2665244171 3912249480 +488935815 1737561984 +1265232052 2300825067 +2226634133 2480913453 2480913466 2032892851 +799418084 799418100 +1006993822 447417257 +2407578189 305075108 +2759837328 3391554475 +730056502 1030256897 +1837173568 80356635 +1029568415 971820872 +799749160 847452925 +3880031756 3178016660 +43218611 3413307203 +1646307521 2764467101 +2231166927 690023118 +406158195 1990882551 2402375180 +2750956742 2284232546 +2814125953 2385653782 +168769852 301406567 +1006388576 3421638819 +2881328162 2104504725 +1114990500 1121068841 +427688437 375198908 +1618439626 2513121659 1340229413 +703278190 4135431417 985240114 +3369903901 1348145826 +1674468769 3202180192 +1244922025 1308020146 +668190470 1741395935 +4153052742 4060286485 +4054135066 2165066731 +4142509505 1927055040 +368938512 2921767715 +4073061224 1423159095 +1887468048 708847395 +3178931692 873673345 3178931708 +1087497261 237895812 +3241509661 3241509645 +3251672317 2559026658 +813144084 3360685656 998327081 877009652 78570344 78570367 1615095673 +4144525396 910742575 +593163772 2754689969 +1149852175 4080584078 +1245605499 1531440050 +2218947250 2308477973 +3594456332 3594456348 +1062209438 1224474047 +3074457826 1552606165 +3388850020 1584679551 +560184939 560184955 2625510543 +2139950934 554640494 +510230342 638802721 +1314736317 433684866 +3507353824 2652232635 +2260881138 367150821 +1462795343 3640867553 +3845648024 4178879086 +3825278293 1119956170 +3640533948 1064254294 +753244580 1366351167 +582040910 3942875609 +2976817094 388334775 +1123549877 560743164 +2367731000 1652377389 +2322422554 69626365 +3230454216 1205880634 +43471959 1798948070 3153135042 +2926610935 2926610919 +501780084 3511801228 3570131745 +3181527356 3261903207 +2309080371 3702091589 +4231230666 3472939501 +2149216031 3365727710 +4137944454 3392451063 1207183302 +551486967 1967071330 4099930709 +4215937237 4085052959 +1246292644 1246292660 +3378037735 3720111264 +2809656333 3080410713 +3160381408 1786516915 +4145580709 2574088138 +2683772591 2683772607 +2999029450 2785267749 +1923918702 4090617391 +2640695822 3578375183 +2300536611 944635910 2831812961 2157552883 3944197453 944635911 2300536627 944635920 +3031524402 2772482725 +3262987869 2284399732 +452826619 2016614962 +2714994400 3015478153 +2569557747 226549914 +3179484892 828177489 +1593516349 313504587 +187989573 3650289881 +1450919272 1450919288 +2454622404 363717769 +3127939590 1586453882 718194759 +2834628872 28352413 +22937445 1460527318 +2183506906 3312208016 +3422365475 3535912966 +2233451100 3976132295 +2776029743 2837018616 +3687386653 444676002 +31579738 1351681981 +1651961948 2534172945 2510753740 +3512893961 3313583520 3439904984 2485245273 +2324702353 1554916477 2984874064 +768478286 4084070323 3288966394 1677379794 1767726799 2902212569 2684331108 482852023 2902212558 2734436365 1660602188 +3600083228 3600083212 +1542004625 1090302288 +4068484307 650227008 2361793325 +2734553698 4157679683 +4184942769 1579355824 +2323491957 1248217612 +1095612345 1985486616 1095612329 +72444598 72444582 +1557420269 256376082 +4147956609 552400560 +3271198943 3479533342 +302285199 2180866614 3960992782 22773237 +2092944446 2683209097 +1284655604 699914132 +3938818371 1020865343 +410939946 3104684045 +2678251034 1734583037 +1530321780 2046641608 +751627759 1973063470 +4127106986 3383608338 3923898523 +2044301934 669090553 +3284750343 515433681 +2518403017 2508538751 1600684644 925679673 925679662 381387118 +375936080 2520562165 +2444153621 1798720010 +2013723384 3942454395 +2223145247 3094430686 +206996288 3582483725 +1090778975 3091098248 +1386860297 3481446431 +11524148 1221679577 +773915038 773915022 +1104786158 3685120044 +4268595393 593622631 +2908703154 2667643699 +344864314 966778115 +2454396907 4074510863 927153908 +3393596030 3933529183 +517590047 2950452424 +1319134502 3967761111 +4118459799 120315056 +877176580 4100744184 +3598969067 2628233698 +1026667755 1077923316 +2783494102 1083093686 57015783 +1055375822 3570800473 +3284832125 3034571220 +92324243 4130699264 +328561541 1497684570 +1876830690 4240174787 +518960774 935941367 +2826851898 2028059979 +697347678 3435298303 +689374302 4248553177 +160539926 642179505 +2816963739 431404616 +3341988327 2237728228 +897242418 1650302387 +4082007304 1854533680 +2065676146 4161909342 +1267029123 1709443626 +3104788114 3843600325 +2274620144 1575448515 +3935641609 1371631160 +1328563524 3976006153 +3415864834 375838237 +3171329495 237184121 +2509169038 4260172441 +2959832436 168650310 1673668471 2918476172 +69430274 2244151093 +858690133 3880803274 +3127225227 2209269877 +3866513802 17601839 +2696072079 2289463822 +2147264846 3538724046 3367929295 +1682420942 1682420958 +772096407 155599014 +2575268798 3371581537 +130016864 3007268140 +2542086348 2542086364 +1058840007 1969117647 +620371057 2797258224 +2492669567 1165001867 +1341217015 3488550086 +1375111883 3525082516 +2048969034 2342313837 +4150450850 312356127 +685738195 719610938 +2985491141 3194943683 +3997667990 2964046375 +2279668009 271072152 +1666447591 673820937 +1660913735 524519360 +3569063547 1582162873 +3592471887 1687591758 +2221283227 1874056937 693473630 +19500271 3278429240 +341444983 2159863376 +1659170552 3471319424 +2233757473 3109744886 +1624403280 3141670115 +3402500386 2048912957 +248929060 2138143145 +1974771135 173298622 3938431356 +2355253535 2788819914 +1133822678 1133822662 +184825265 144737702 +218893066 2789688946 2482331835 +3503518945 2648768054 +3927204795 3607424825 +3004388611 3363262704 +1706526446 4057961906 +2476018070 3342341290 +3718541675 240486296 +2771817943 1243625514 +3836207481 1833431415 +3128426219 1978026978 +3297241872 2632257917 +2132192251 2486713038 +4226583814 2606891105 +2156748737 3741815453 +1633843653 319140122 +1325677047 1520910288 +14499041 916033933 +1904370438 1622638929 +4081040344 2975400819 +2208003021 4206316466 +3692942054 1418276643 1760755735 +1401233938 2700839099 +3866047987 3866047971 +3172730890 1170867738 1969752947 +1607361620 3288641582 +637380423 253891225 253891209 +2542929150 2338838302 +1434490044 1433019367 +579703101 1659274059 +1645800356 289076031 +1348182663 3944216467 121690752 +302285185 3726106112 +2459970226 2216900133 +2019238939 2457458308 +3292025819 2076623180 +4132661759 3293568104 +4132315893 2986411964 +4011656114 1749602389 +959900801 2457227008 +2420643731 3028098156 +176146324 2930593987 +4056931831 957363442 2059735447 +1424698013 2731577963 3020530978 +51437060 2857592284 +3755834853 1319972730 +3541689642 2076426523 +179180390 906529175 2792396966 +1468279048 1468279064 +2124339851 3742501058 +1475821904 1361703356 +499133920 3045603251 +4166524051 590701289 +1266296743 1078841764 +2303132925 1615026962 +324260606 988452813 +318585497 966573643 +3860945069 2485621751 2722744581 4085160018 +974174500 2354279337 +3107115454 1224748553 +3176136036 1760289919 +3786243660 2146500705 +1916146198 3776870577 +612923110 460220455 +1712945827 1562119818 +4221816471 3118348198 +928999218 1563390899 +1372251954 4112248734 +446022806 420615359 +1272642546 1506190733 +701978674 589188616 2994859466 400509766 475830582 3122117475 +2023878526 1693188937 +60377680 7230976 +2806553720 3478016237 +3198938697 1618739254 +3509180499 2548009644 +1454044727 1454044711 +810388101 2400259916 +1302382486 847429290 +1061866737 4265274774 +4159788499 2978529268 +2849555410 828561094 +1266699661 1744442619 +2459072696 1955858861 +4013264477 4013264461 +2493702206 979829129 +1860075694 2317601520 +330829175 2176660048 +2347227955 1895698764 737491616 +190545344 2701587781 +2484073647 3766621136 +461276346 1758568324 +3720129908 2214923673 +1095698700 1255303479 +758531133 88152585 +3574053306 455199875 +3305763608 169749683 +2834521183 328474908 1444571528 +1061630293 3714037242 +1597086812 924394704 +469390719 1181323068 +104758561 4116642528 +2450075907 2239577174 +91096854 2721392551 +3121810397 3371937012 +4194686729 1542553966 1542553977 +2152519099 3019142514 +2461234017 1367253430 +1324891274 3301828750 +99488036 2042952617 +1258987380 2108903501 +4079587325 3345853250 866425077 +2836435750 221806193 +893014696 983563989 +1183715069 245471316 245471298 +819864037 671942486 +1262053718 3244348007 +1955687981 2743179922 +3448047771 594316306 +104757754 3462005899 +3856712122 2597386187 +1623389813 3746877466 +1622352215 2432531440 +2349528610 2081449138 557632810 2081449134 1374818354 +3477979614 3477979598 +2095899078 1860659873 +3821468846 1077921263 +1297684644 3046194841 +3512264642 3512264658 +4221981674 282466651 +2035383478 2739337405 +58413422 3911266351 +2023899739 1114535236 +2593630827 3351332468 +1280550558 3316599487 +1637830136 435091072 +3564179698 1610460410 +3784133319 4079253970 +2580419412 1936223525 +571632810 3618346817 +4048103755 1212525628 +4157690284 2384360151 +2612706862 1425629807 1425629817 670205298 865465529 +3977839964 2590207953 +3950516550 4094675255 +4288048422 2144195265 +3535271073 1486231904 +3565188482 3565188498 +4057095415 2770884816 +321056460 3959286583 +4155754573 3757624211 +3875776046 2735545518 3636370031 +1083920757 2172070872 +3951691052 4131791937 +688445342 607996226 921398719 865977257 +818021882 818021866 +1868243991 1223577479 +1166308944 3213246435 +2229328095 217409288 +264044555 3515289922 +4276954820 4131801519 4131801528 3046897796 +1825032722 1825032706 +2083348808 109657716 3278906461 +2524956129 3424944438 +4148105267 1799782490 +1477155082 2755783355 +1692152409 415420630 2786891106 3754451070 3876764037 +4154026597 729971948 +3148748580 2534305192 +2030045003 3322641154 +897852652 721821591 +59629138 4140252923 +4041411463 481036420 +1295754222 853218092 +2121562749 1105223288 +1114400957 1302913410 +2259846249 4028913522 +3329782720 990970267 +2435343381 2859271866 +4255858258 2794658565 +2326617710 1217673266 +2425881252 1129064511 +1410591609 3277142092 +3416932337 2712015423 2382538855 4247725732 2382538864 3142374380 +1968791395 514926794 +3851599630 3851599646 +1011403019 4053040212 +2286610961 2666428624 +3339306105 3432334430 +2418610813 1839733442 +1525673407 382866099 2199178454 448680918 +1844907725 3907800228 +573209540 1391471867 +461321889 3930259296 +3739187391 2563445950 +1208513027 1749777084 +2962053647 2952990299 4253336984 +1989824321 4125803328 +98720133 3096057846 +3187125436 3370445809 +770099871 3780180062 +1594298549 1380324442 +3226267270 1329969361 +3242350039 309141881 +1430663420 1278941988 2491363803 +2915466158 1031058169 +3087587977 3170042933 +3782951570 3454728836 +984030965 62315768 +2672375844 2672375860 +3128227232 639544037 +1243055547 1926695566 +998269173 2965798540 +3680386974 4083033535 +2802924932 2216941279 +3383510360 3383510344 +2145540805 3014662339 +2908883540 1163280943 +3048165344 629952395 +2388416282 1362873309 +3707567250 1950456261 +3197069034 112244050 +4141315410 3878531077 +1196227315 556725066 +3748391545 539256086 +1888497130 486033243 +922246771 2712344615 +3523213052 1890082983 +4254546709 1242694154 +1309255307 1680944322 +1884949264 3988744757 +3488729906 2342707109 +1398315802 2020998389 +2300294784 1453345676 +3125012261 1575280442 +2437257720 3386662533 +1853553536 1805249157 +543067262 543067246 +1124986807 1173380358 +1138136169 868983118 +1917891066 4010290315 +3540159387 3865470766 2023482142 +650967756 3769552673 +1722287691 3169989497 +3043019975 1315069248 +3533457963 3070804404 +1582805752 2081340525 +4231101714 333964122 +2112326598 2885176330 +4115054683 957174523 +3695865091 1452797715 +303265497 3545311074 +4029279915 3209062095 +2902967286 1496939591 +2280841873 3034650227 +1821704758 613579527 +4294473725 4045726530 +4209650975 497354718 +3889724925 4140717378 +464657654 2760434122 +1304333806 514301003 +1907979052 647446653 +705921769 632755406 +3196502835 2041733792 +254389975 3107668778 +3080336222 712369534 1707007231 +2474538716 202710087 +131296566 2278878215 +3221266520 1650179044 +186638236 523043473 +2688246565 1652364076 +4173395169 2025946656 +2205211464 849949259 +3173809197 4194794194 +1338125402 3900375583 3903574461 +2425009307 626675730 +3672481285 646325217 +414942364 1592436575 +1462916344 1010549357 742107435 1462916328 1058214276 +518010432 2900849881 +3348232022 2160614503 +1699585756 1429279825 +2851634973 2851634957 +1207733875 3314827020 +1523088952 564048429 +3754407648 280458818 +2231213784 859901467 +3797752837 1569922010 +2409100847 839145338 +747042209 738260215 3111431286 +3188164437 2061109980 +3521072107 1300529890 +3659764373 2862356781 4211064970 +1537690934 4124471041 +4176902317 754182405 +3755637529 2112866398 +2418173707 4045944386 +2306286056 1317691453 +2484422018 2675731381 +1459102261 496884074 496884092 +1579982428 2621262535 +1526405862 525031447 +667966450 2667625971 +1254957890 49185013 +695073308 1411430919 +115747758 1831587234 4051739002 1190453075 4118031429 +4093206758 4153641495 +1656086664 531230645 +1164092279 2974241872 +2233682884 1519404425 +1411320857 498197758 +3179041983 4141858940 +2586573525 1275715624 +2518092057 1598247496 +3973079704 1678456155 +3480972199 3050556814 +1903823239 229605061 3488253830 +1549973139 1549973123 +1267054751 2898760581 +2339412284 4054674672 +643148030 1457063903 +2083786668 838118344 +2854721982 2589394463 +1073339149 4009296484 +2050410599 2050410615 +3845118736 3928392060 3663059509 +636001055 69199901 1966571638 1158762288 1585200799 2999248616 1296493672 +1963139268 1963139284 +1817875548 4278459340 +4207833650 1336169979 +3751636396 506326720 2966660567 +3888599332 46447529 +1614689612 3454920353 +1310108454 1310108470 +2250345175 1054606596 3759176844 1561110910 1809160206 +3707132767 3707132751 +1964801254 1104715287 +1870379836 208822001 +1985311497 1367611192 +2755382146 642466404 +1367683811 3916356786 +928583074 3274733059 +408054744 566215949 +4069768827 2840970047 1502927780 +1965637241 732057160 +874948810 3687014432 +2713660258 1373207165 +3927649918 3566951650 +3143052897 991476020 288345017 2810592243 +2146428047 2585172052 3875670327 +2160063076 33951311 +1600670530 1932425443 +2258881162 4237263258 +235046263 2230852176 +1246197835 964845076 +2044629496 233363759 1553047824 +1145358561 1497905696 +555829964 4083728161 +3151900160 3200412165 2161900691 3200412179 3527664000 3295095127 694961535 812404851 2329676844 678183897 3027330814 2161900676 +3718428668 1214482864 3811025329 +2877109623 1830496848 +4285237605 308247254 +3683603698 232324565 +3589644570 3953957885 +1727847892 2559694490 +1935661802 2313526861 3240484844 1272077157 +2191602642 2032426870 1975817093 +1374840083 328539372 +1310675033 1414233118 +1774308406 1564116503 +99208415 3795823138 +4119554799 1912781356 +4235138490 484389853 +31310193 1628931312 +3229360162 1669160253 +837563186 3369375667 +2935486516 1687127166 +904907230 904907214 +2173000125 2716615828 +2106247987 3458837175 3565019468 +3156124230 3156124246 +879373149 938480450 938480469 938480468 386665131 +1173186316 549009399 +2114210044 1287572375 2114210028 +4122401645 3593161217 +1698918583 2934938831 +1135101624 1092331404 +2704987398 3583858807 +2805216702 4113603081 +1785297023 1785297007 +1640725035 565981525 +4049162926 2644322297 +1118121509 1118121525 +3706703050 2541707757 1871130607 +1125159226 3440680523 +1739590175 356836554 +377490941 1754662210 +3485269884 2856181031 +3440441199 1023663976 +1003123497 1219709336 +1755283275 262862968 +848249690 2144266173 +1098808723 1836204257 +1685916258 1811935595 +1984483387 1872743666 +3308207533 544626715 375265106 2283714053 2283714066 +1910217161 594126692 +2966491925 1847659036 +416238287 3713188814 +899977814 3873014150 1541998903 +4124089123 1976534024 2814661639 442775580 +1559665666 1513592611 +2169912672 2169912688 +3014570636 1961133020 +2559756846 1286004813 +4134311811 4134311827 +2603335962 3660354274 +3390392269 3967813540 +4266004797 3664649269 2236424962 +4138553176 2023064293 +1948312195 2272615024 +4045816552 375651023 2268812084 +3007567262 3519629225 +3214222197 1115939600 +1153051489 2831813008 +482244382 4129238825 +772828900 1742639337 +469158552 2642472269 +1065131602 1127037701 +1830878926 2565938777 +2793251071 1533789778 +3124266373 2885300314 +2583496921 1112862088 +2501526679 1331892527 +2628629367 1093825767 +4151304432 1964972501 +3353560690 482862451 +1745715605 1648557468 +3383753398 906472593 +36463024 4079089931 +3557033038 273860294 +1559311022 4200833329 1332788537 +3996145298 288952634 +3719971297 3979719968 +4135356649 4233079057 +2465063424 1283114515 +823237522 3501713093 +1974971302 4129502785 +1988805942 1414702871 +720641457 1330298288 +4275035894 389807441 +2853353701 2232244394 +2281620897 2783956432 +2295058038 3470132177 +1029707277 2873276004 +784488283 756360744 +2765536579 1640731440 +3168124603 4286267492 +3895733879 3895733863 +2965527272 703929140 +2608766493 2608766477 +2764944455 2375731134 +2879080235 1349585058 +3708161609 2145168057 +3382528770 2252780298 1688015925 1688015907 3382528786 +1601664736 1383869399 +2042014336 445540243 +3950105430 4197429361 +3194907019 2199417461 +1054791370 3819881137 +1079135482 1298444757 +1390933681 3205924618 +62116509 735773821 +61523496 3990221053 +1806345796 3720516921 1381034152 3248733449 +1269388831 1269388815 +794440054 16506065 +1623826722 348210731 +1510433707 1688331810 +1306372767 854825054 +2788235644 675317552 457907761 +1618343899 3031772612 +3615515056 4011444227 +307496184 3527660155 +628613895 45769750 +2093183472 2093183456 +818914002 2833076371 +3185156241 643739735 1525281770 +529120858 1776939573 +1335161571 712661834 +3963319048 3963319064 +2295380263 2274588768 +3920258731 2185207586 +3979836714 4038874515 +129294427 1588638053 +1209261012 1262685871 +1708106349 3000807812 +342756462 1156287727 +343387979 1578443189 +11010753 4137495085 +1595870921 3979773942 +3689570752 4070188920 775397275 4059554117 +2229296112 489732821 +2786097169 2752810720 +361358400 672288979 +1591486678 63909969 604798477 1268707191 2615940978 +1271387695 3475840659 +1882878783 1848671391 3942870056 509821692 +49832731 49832715 +618090569 2150781467 3728563395 616000398 +1747917097 723819416 +1838788900 4180908235 +1676231880 863270047 +1221400986 887049597 +3536353294 3751083535 +3320902843 1431388772 +566489963 2457350498 +889010008 3265142683 +2941619148 189630967 +3758900506 3444623339 +1976217486 4229061775 +1840292148 1840292132 +3118267018 551446331 +3134874437 1791640972 +4027208717 3980546162 +676771498 713133453 +1940708912 1226950037 +885086859 216330027 1827957972 +2247107167 3181206888 +2894791054 752054927 +813715332 982350364 +2226512073 3058368814 +3432546815 1904136107 +82192512 3118910020 +431171306 1594245709 +3168566538 3295123998 +781053540 3178127503 +796617510 796617526 +682562460 2812010129 +759690578 759690562 +2930183292 1828235057 +2033352754 808608730 +1861104845 3730233697 +3547720394 2896206843 +2566844418 3679703861 +2465059486 3932327593 +3160609816 2818089435 +3367264751 3807783736 +3246903383 4291623142 +1148394945 2184697536 +4261700123 4226183300 +3247140360 3853515043 +300166620 104083783 +1355802039 1355802023 +501858885 1543295642 +10086344 3125272523 +1776078140 3801552241 +488691694 2721842287 +3676884482 2161004006 +132922477 2139799832 +446341431 409717126 +2224956449 3857899488 +2303975928 655145339 +1168324917 2644485578 +2440247132 2757462023 +2271637457 3502596667 +692916481 692916497 +3233648117 1600551082 +3813124833 2865889334 +777343107 910718836 +891824753 523948006 604550391 +1049653326 3530266026 +3374218712 371889509 +1308864355 852302037 +130048943 3819333988 +3020451105 691315828 +1477806205 3954371792 +4147266471 3407904758 +3689622756 389524201 +3535366520 1916762629 +3732632869 1633249580 +4203483888 1518456771 +2938571293 3614763938 +3012764694 3332492977 +2808487746 3492318286 +3104788127 4061709406 +3204916334 641620281 +1827090319 792668596 +2458468702 202499817 +2961617774 2226491697 +3811064670 3347524990 +1206229128 2483650224 +188518423 1881518557 +3207063938 3579915790 +2931927535 3409086609 +1896618683 1896618667 +1989227210 844502067 +3279588057 3793772990 +4229854892 4229854908 +1302541022 367596415 +691408509 691408493 +2512565932 1837469889 +920371801 3035820552 +996116455 3723324878 996116471 +1240643717 2928852967 +3589315396 230976543 3373570564 +2105031457 2105031473 +2973963379 2140746010 +2158263160 4209925613 +2915709700 2572046175 +3787810819 1824701610 +3398572559 2175411420 +2733299308 3819932673 1851352448 +2287305101 731574500 +4060119568 114081589 +3312530209 4063460576 +3529215258 1382295586 +3417913586 2794759397 +3376928465 823402087 +369090291 3373810784 +539256363 449664341 +3935596893 2762896738 +699155798 2571367046 2220848183 +1175413280 2589099756 +4004066195 1197224037 +697488379 4080309438 +1614033279 2280255425 +3332814366 3597709631 3529967166 +2090918192 1631747715 +1208786959 2061498264 +2582912577 2622201920 +689585310 3524613226 428483276 +329243507 118215927 1470526988 +4262642190 4262642206 +2668891662 380322277 +1942058139 3565850637 +4071606546 481920851 +459064066 3697919374 +3324080607 750383772 +1189802082 98069059 +2735008667 1002366212 +3450506122 1299819053 +3959431964 3889507852 +1175037731 2865923338 +4241321464 999964592 +3491656636 1542467825 +3281888907 1327337912 +1348325034 766268827 +3717424614 3037292801 +337276196 3382300576 +3698053292 2847506113 +3491917156 171062399 +2860500227 1780687786 +3315639948 561271007 3742451988 +3977281606 2625697488 1382873740 2121398853 +2647426836 1578222891 946532555 +2109378320 4239341091 4241642876 4239341109 +2913516770 2868719177 +1565825114 570514466 1177277867 +574227292 1528640519 +3719878562 2242010284 +1877124162 1674089450 +559374702 1830906351 +2631803774 1873928031 +865466112 890492179 +3790136909 3688964018 +4161596993 1884994989 +2465470129 121616560 +1572174040 967321120 +646313396 1491192408 +2885104014 3525117710 +519704687 849862318 +2428707846 2420156999 +1506990308 3140716516 +2674806857 3220940992 +1096964429 986879035 +1248375648 372070957 375715012 +4075528025 1682360872 +830976158 830976142 +3713942201 878905662 +3682072451 2486105968 +451165212 1900716049 1900716039 +2858911371 3422080194 +2878492208 2878492192 +613415774 3970479359 +515132885 4138255106 +1025775514 1329663331 644354762 +224403992 635270067 +46455935 3672579070 +3593737974 1698344662 704652615 +4181191375 4181191391 +2280138906 2412121265 +2236131036 1655899980 +3538143593 960211662 +3665736832 1970677139 +805597945 2415984126 +1301080855 735450406 +1899562697 2217842478 +606881046 129024423 +841378194 841378178 +2077503278 467617661 +2824395269 3512845885 +33068730 3562358475 +1966286737 277301584 +1102733640 1063140981 +1633637950 2266284937 +3565688454 406549751 +3973637401 4067468872 +3761448610 2458243349 +1288114709 4066473756 +3689981146 935571606 366183229 1606316565 +3824177154 3578655530 +2274068337 2274068321 +1357696370 1125498996 +4249838350 3522752271 +1859159323 2369882514 +1473864599 1473864583 +2280416541 369446788 +2365672510 1163516254 +1737579854 347240654 +4289379202 4201043850 +655129413 3181776282 644311421 +2872213030 3978289510 2793182679 +2458903160 322959360 813794043 1222712083 +1399368382 2082054198 +3193548257 2284632374 +1326987639 339754996 +4233663609 2249775462 +2349731507 757146572 +3207786829 3207786845 +535490862 1826204537 +399738457 3673980424 +2237428080 1289352472 +3829968077 113412658 +2403542024 2394011787 +32457661 3366429314 +2598091649 2598091665 +2050625363 4281684019 +3017493766 378027395 3017493782 +972733974 3476649514 +1001381749 1792853308 +2289213800 880023211 +193957453 2147287844 +5870131 1800986573 +1981456723 1981456707 +585216672 133335931 +2550420144 3377171912 +2994339155 956936298 +354999083 2662347015 +2745279009 3094493686 +1273052816 523389032 +1037518070 1340182343 +1247231868 1247231852 +1527037462 1663520864 +699378643 1921744186 +3906915696 4046039773 94487560 +2554925502 2030497289 +3655471114 148848557 +3023313079 1694689296 +1559954033 3492075494 1272315127 2415910678 2415910657 +3670428365 858243250 +3432308446 3965376361 +725642756 725642772 3806528249 +1382615223 1918416912 +3986467404 1503663521 +2436869429 3695028860 +1957326220 2989728161 877294455 +3930837616 1163675221 +1574954233 4142242014 +2428293498 1396556555 +1370808203 432927416 +1698476426 3901455419 +2267122765 1560360928 +1221915713 3896279616 +1464497955 2369358876 +4067140505 3125741673 4266434127 3125741694 +3313152625 4121422022 1361504230 1364102391 1361504240 2789150486 +1637258922 1242508685 +720509041 4141081856 +1021066595 459038791 +994898551 3508646224 +3432907985 3432907969 3988886790 +3986103915 3986103931 +3531117192 3687754763 +1041171949 3520485445 +1213068930 91753098 91753117 1421545123 +2320877728 1027370140 +1521062603 2213680532 +3501490709 2254880899 +3787003092 710658489 +2473922823 2473922839 +2728479368 2347258909 +2491388225 2131595888 +2506706699 504508149 +2823719967 312906952 +1766407605 1792837964 +2389302246 379923223 +2564021696 1434850643 +3466914812 1235189159 +3742570014 3388020930 +2338857700 1492053225 +1451019678 3296178089 +546234222 2934553135 +2600408901 2336318826 +1794195561 3536354920 4017584601 1794195577 +1934271291 3112105458 +276470501 3454015249 +3370414804 2668895295 +2520081292 102588124 +2065094569 662110990 +2508041409 366408662 +1474593801 1706809902 +2179066049 4069013717 +1438739876 2329811855 3582924283 +35561514 2151031309 +57346513 2710592548 +505588849 3784668656 +3426427219 3558176172 +846571099 3392463172 +3262674220 2027317436 +2170429392 1999377507 +2812143945 2894298552 +3257944469 1359553009 +2581487682 2064746485 +1801983248 618211381 +3813113172 3115608767 +3880593802 2803182878 +753801058 483315541 +284156206 3617553273 +3645109061 2218310201 +3431363873 3392784721 +4257814567 2861630816 +830605930 1505125581 +1627827060 3238452827 +597961757 946958772 +1672061531 1057658180 +246071658 2161015245 +68469467 3643247845 +2554925500 4002145896 866211474 1572418404 4002145919 1357109616 1996942065 2085919291 2303042587 1608274490 2152044015 2286264965 4169922104 +1531680939 1661031714 +3056712384 1743069320 +2642191983 1513750702 +282381389 3422395684 +1374865979 1010064114 +3635273222 1613427783 +1868352910 2602697497 +838617146 3928339293 +336246781 1292763362 +2501461999 948199212 +767116942 2998510606 767116958 +4290972683 2869687636 +2186551006 141334377 +2051144467 2051144451 +3623193372 1706741205 3661196497 +3768248696 2596076036 +1537240063 177243717 1015677544 +956265713 2871334758 +2018247266 3248996437 +358490099 2519485324 +2898702936 1422573723 +2598145382 3819217574 +349242541 3746273359 +1304870299 4024286318 487958367 +1597472935 2338293494 +1638868114 1488359891 +1013290010 770188523 +1597976483 2474114460 1597976499 +246159222 2397630161 +3098170258 1176604357 +3805466228 2245722255 +1091700220 1801415591 +3729575815 1819634820 +2187359321 2461280040 +544720946 1318069925 +474428540 1548071 +1661440652 3113113024 596509377 +243908851 730693290 +3845358623 4011392222 +1237183117 3148164168 +311711944 1021113155 +3283219683 4096033116 +3757373638 1283608635 2828920625 2056466380 939875424 1426313620 694095183 +3988412126 3988412110 +1519728765 1041872244 +2289055626 1386704443 +944501551 3465532142 +2803020862 4017794459 +3177420807 1566224192 +2715293858 1764673283 +941130152 4136901501 4136901483 +2860513519 1450500152 +168727237 1886784746 +1200964314 1405631647 +3368739502 3311589369 +1982681507 2891416458 3652693021 +3590785474 2937347189 +218824259 2218014180 36754943 +1696016306 3767293214 +983186480 1892466581 +3314014968 3314014952 +2487379105 92563808 +1157486198 57391742 +953565671 873928164 +1834375464 2788665667 +3205734154 1877670501 +1983424041 1143837336 +3120112650 3442719661 +875716867 776910762 +2157150397 307484578 +2799769425 1489011677 2886056858 461432903 587334737 +1901555423 443594635 1269008648 +210496194 2185400163 +977799915 2859020258 +2988992066 3080255971 +722386859 1373852990 +47013584 961298787 +1007023504 224498083 +889211957 3186042003 1390050266 1390050252 +2591564409 2753447016 +3260548957 1301518178 +690306397 2740754048 3812521301 3250655152 3001790979 3201869598 3278917803 580884834 3812521282 +3099781886 3638029791 +1254551882 1445607090 +846948801 846948817 +2009404427 3631774510 +1140972886 1693412967 +1526267610 2288892494 +3716982854 174908983 +3793867732 4187412043 +3100392506 352117232 +3870636088 1732739117 +1492461472 1773113032 +2745856736 3868756952 +2638465343 3153989157 +1349076895 884719432 +2570009028 3914854303 +707060963 991187292 +142088852 3910260463 +2334014627 2744743050 +2624956810 3610895405 +3736536246 3951298314 +3846694567 3971431303 +3952354037 3476228003 +3049297911 355416518 +515547768 1879446074 +2124233332 521023769 +3754299790 3536691855 +458939746 1921815316 +2810535286 2284427585 +2579151620 83126111 +327045161 4253634700 +2595500225 1571159536 +3541715544 3336992228 +499651141 2906582070 +3028722484 1676864207 +3764314296 3764314280 +1012431467 1783150196 1783150178 +3025830350 3095025487 +3122311530 693322693 +73156874 3557167840 +2432403769 499369007 +2029469879 902297549 2541404213 607838214 752036390 414103860 2534890819 481214320 3643493609 4282276920 752036401 4056124054 414103843 1014310695 607838224 +1905995717 2622239514 636776957 +2420644325 4273021984 +3642863599 3204969774 +465553766 350882711 +767454053 574648829 2387620634 +2585671615 2585671599 +3809285914 3809285898 +1499592766 2197316958 +2374082387 370003898 +1861681908 3767863956 +2221263059 2937710124 +831617946 2043089269 +1533552993 1173955510 +493224291 13247334 +1335753867 3769929410 +800007433 2844688238 +2681376008 2282458132 +1412335894 261537271 +659039746 330860042 3633567011 +1389582126 2427600239 +1036534194 536854892 +3762650006 1502688353 +3443185430 698390449 +4040841878 4040841862 +4266135787 1824039698 +1284079135 3602256523 +1222687920 1774782741 +145217386 3120555834 2885669132 4048804306 +813603431 3192721440 +41294108 4226385671 +4228118151 1094522518 +607419930 413303549 +2725918994 3630683973 +637925952 459862739 +1143827916 528734263 +1075289630 1075289614 +2597618829 1233955300 +316978425 3070813160 +2128094675 2168687404 +2534837835 4188413807 +4141039539 138886003 4251349792 +841754497 2088906752 +3979550006 3914252054 +374415755 2897726914 +3970384557 2059630996 +1352555845 2407814211 2096175978 776786828 +1872046577 2563835504 +2392213575 3180578752 +1935843388 3170986480 +1803839110 133439226 +1402288684 3219821377 +116853416 2665858685 +181333724 3754034257 +2532703725 2453584914 +3030404899 2069664796 +610948650 924533513 +1081323895 1976218765 +2162156126 1047615999 +1896104518 800347169 +3141377324 3992874077 +1161813273 1170315170 1908519957 +3928049541 2510754425 +411629919 411629903 +1075519706 1075519690 +2470486988 3224003041 +1180579741 1666288674 +3250933617 2965974892 +1700447649 3011427741 +2901324259 516032604 +2306520021 1093212234 +505982141 595256244 +2840923507 741431008 3146654221 65285132 741431031 +3557384926 977523970 +4095678233 1710316638 3164730575 +1509984017 3218382800 +2262415500 3569190007 +415062443 2635343906 +2959313906 2662682099 +3495752072 2320513291 +3290307668 258381881 +3596399078 1508642049 +3427616470 2366013506 +3489748411 3040109947 +3182359515 1969873348 +2726656730 2988467517 +524009109 4200129468 +343977830 529072 +1260695663 603929516 +3287171180 3691997719 +661691835 3511176562 +3467563003 4123454060 +265535575 2680261638 3643892919 +1643292786 2734631781 +1525352480 679847959 1073597036 +2797718686 555031743 +1404397505 2274514112 +2834455059 142855162 +632845036 632845052 +3292623454 758511947 +3945099663 1522721905 +219281197 3225951172 +1478913279 8117825 +3959844484 2452375531 +3578700152 1120415739 +4069256224 1801630196 +180684786 1232966029 +936969669 1751519260 +3630337295 1294526382 276026176 +1866074829 835095100 +2481504258 3647357731 +728613497 1824298647 +718756316 3252012156 681580126 1919665336 +4124671751 207812630 +1603481544 2233082503 +477514781 3993305620 +1845787505 773026564 +2207909207 1348837076 +2943314229 1354469968 1633853052 +374048648 201556912 +2170641076 3542318830 +1713752090 3883532523 3883532541 +3645932499 3971974444 +2562719768 2386568667 +1798355908 1782546128 +1230649517 638007364 +1891599443 2583903563 +3538308952 1485760411 +2787617483 1534188930 +3386443896 950555899 +2964487376 3296480999 +3927087443 1599629990 +792302191 61428099 1162926887 +783136742 1635286807 +3428838709 574372487 +3447953567 623460958 +1513697962 3867187310 1248851257 258677525 1340949278 241899919 4034963518 +509130165 2057702396 +984868848 1496719061 +1140609543 2770042279 2458771999 3936840901 3847254153 1594562501 2061840116 3672054423 3443382209 +2267845580 592436449 +513695299 1794292453 +2931125706 2227260790 4082124581 4082124594 2931125722 +3933964173 2910216946 +4212040437 4001430711 +2333682767 1201717326 +2684736757 1000623881 +3961884528 2242067677 +3461935225 1325567592 +3578319134 1237457215 +3115874631 3115874647 +1896524048 63448099 +4206210 3320637986 +3694596430 1282493647 +2565862739 348074412 +3887553779 996602464 +3491050318 3899034637 2591293146 +2618257467 2582420406 +3337578754 3410034954 +1991009803 1181556014 +2782616399 1024598579 +3212527837 1276359650 +3329430545 2015925968 +3150271957 1822826058 +1228145704 1692568317 +1730865083 3182230149 +1742624527 1808582746 +940388340 818052367 +1253742936 4223624589 +3194338108 4129668967 +2620546414 1363743791 +87123024 2093017589 +229792749 2093397531 +2059443460 3326846735 +4193263747 2835466343 4160958012 +4205023191 3293605204 +75857495 1520713666 +3772819169 3772819185 +2095196136 2147799595 +962796578 3728993173 3410200517 +236996777 236996793 +2479591921 2151454611 +343458437 3206166362 +1448846173 1448846157 657083221 +1187172464 325457561 1051120711 +4011341287 3519706487 3416784314 +608277331 2596339671 +2331727609 1870355166 +119428214 2442979414 2864641479 +2621836783 4048023342 +2899913047 1893471216 +587625904 2115774159 +1395139812 3425833727 +4265308813 3298120676 +3515974255 1460688056 +111678456 1922527085 3513018515 3513018501 638617932 2045966464 +26249554 299626735 +3240017480 1136363190 +4000530395 4000530379 +1470117289 2605205915 +3863152999 3800550710 +258710480 375801955 +4083962049 1420418663 +1179581269 55944924 +3795402292 1411181519 +2506420238 2506420254 +2168509156 3008613826 +3237408029 3786884258 +3235376664 2884358107 +332177460 2193749658 +3422003633 3422003617 +2772913112 121398555 +2915748504 384405555 +1128831815 1270061464 843870422 +3682187560 2828958205 +4058489768 2007409003 +3962202998 1019685575 +839186058 1204820795 +324949937 3755890262 +3916595414 2231018491 +3838602631 3033557910 +972486982 3634604002 +948828412 836448945 +3308499197 1871061474 +712755070 917243245 +231655464 3129159765 +1679257508 887406399 +2556373684 1349991348 +2057006677 1471066058 +3094085878 1208320849 +2369669541 4262325932 +3812480979 2371535148 +2581889751 431618160 +136152625 4151983920 +169970331 2379035154 +2072060398 1514695087 +2564397285 2206969978 +2504908333 3257635054 +3924154236 2347660593 +3072491536 3208008105 +2370902355 3383418298 +3924174517 3292666458 +471092211 653496218 +1058897807 409436265 +1916299621 2267501724 +1762562184 2250983857 1488060315 2267761479 +812987081 293532270 +1639870871 1976357030 +954348304 3963394411 +3378350165 721560051 +2983544126 1458895433 +778648376 1202207021 +2209154361 4192621342 +2146428038 3603364240 +1467838946 2961416088 1999912027 +3830315650 3904985763 +195566 4071790511 +2397630721 4189283456 +1732286599 296754326 +2513079094 64562705 +831997401 788991586 +831824468 3690629529 +1191006309 633704172 +1808328764 3913651815 +1810922759 4069839360 +127991843 127991859 +3566591615 653083134 +4148684093 2201358370 +3297507867 2203760786 +2265789589 4101903064 +4041304285 4009463595 +1050082184 263059211 +4009594591 248764316 +855123738 1369336035 2984836969 2353469150 +3926413818 1696140445 +48657465 1700452872 3790052655 1700452894 1700452873 3385390526 +3128594195 2716809964 +3756681269 1511844003 +943580158 1422065482 +2258389757 3842640971 +246141369 3514508862 +3337041463 840412881 +2680609088 3322412997 +1416987657 4261337656 +1423239356 1193959409 +843639876 1825304329 +3472048543 1743801672 +1457552026 1408918445 +3278981975 518885657 +3593201236 2065405497 +1398024746 1288595686 +1410116771 297697680 +2001635080 2661235253 +3925416110 3097244398 +3783893298 3488401060 +241014927 3778390655 +426572036 176947551 +1689854763 3128056994 +2528233947 806705670 +1207958374 2978806082 +2891288196 825233696 +513143409 2534189030 +2125371653 505861960 +1552177177 1836454120 +1279980635 1962847058 +3189506821 1259913434 +3823133333 1329279114 +2909734140 29677735 +1749392062 1590102985 +1193142596 940979743 +47288538 2175813795 +3506294404 3733755759 +3168852293 2599815052 +2538511508 3300949241 +227780762 4185025122 +1247217473 1207987008 +62615895 924019686 +3719802979 2418838343 +2183466207 1443898164 +4284453889 3631501863 +3615549045 1993064044 +2766461299 2036597495 +419587556 1120298495 +4120699622 2348363806 +1007905622 2227833377 +4007601440 2444958772 496969429 +660790266 4204808843 +2074863407 3734826744 +231889326 1985985583 +1422282769 1822486378 +332223401 3110592270 +5207098 1328588886 +1541543870 304942855 +3053417355 203613122 +3778525424 3778525408 +1022884163 1029530730 +3939745074 3713193381 +1431178976 2444683001 +2080021253 813828300 +3598718859 916787138 +1878347677 3107563903 2608456092 2430176661 1316285220 2329510929 2329510918 2928970935 1333062842 +1147532819 3212992506 +435214035 3544203565 +1150291990 2568208703 +302468043 746344578 +2731575408 2262420311 +820204518 872746289 +1787764653 3525732370 +2262157881 640143151 +307496182 3494104913 +1615042595 2433093030 +2114473099 34641938 4061167316 3824658351 2114473115 +1086040548 3412881897 +1555615871 2123123045 2502428808 +2799177074 3996443336 +3654460938 4036714939 +2366410563 1304790645 +3755581352 3131610069 +3038255268 1290290395 +4015098520 1432169819 +389039376 1926626155 +2103497138 292166437 +460726872 341276915 +769412277 3872178410 +1513888842 1513888858 +2107545187 598130140 +4006003661 2951101348 +2088975208 2280846740 +2006659100 2006659084 +2357713090 4225382773 +4058713472 1574408539 +3432861640 3819214813 3819214795 +1652343472 1747247968 +2189646303 3916569244 +2743990931 550844140 1904209173 2295060759 2731080301 193033580 1491507987 3524790373 193033594 2295060736 +2734825482 2790813627 +1245150325 1247341610 +2511884550 1280186114 +4224469798 2291813569 +809215981 2941831762 +2624943202 2934322773 +4043581087 143182920 3076101451 +4188043331 983388522 +2146742199 623942928 +1823322634 527386043 +3691578982 3263972273 +2004385698 1971554493 +1677123502 4126987762 +3006286540 4043692103 +979338847 1130399624 +2590728541 237713730 +2651590015 2170423083 1274625768 +2593657460 3513060505 +3050119027 3050119011 +280769965 88637252 +714658862 1016464495 +3628317996 2661469271 +4227012042 1772834029 +1522166989 1357531684 +1296489424 1988888693 +1156294174 2633400639 +1870250204 3851480455 +2860810428 714516455 +1680196837 2356474988 +2549306254 3524043177 +3591297733 3015693503 2159066371 3468154071 2260357629 2965072004 2716818453 1383147699 660146017 4200207855 1380753932 145384955 +1210529122 994677885 +3956296568 2967916013 +2050170184 2792822859 +2697793176 3134060891 +2516386459 2052182841 725221998 574223455 3091929618 +1764992574 1222951753 +1911640509 467905684 +331551688 4110179907 +1686927803 1371009695 +3493212988 22194023 +264380945 3751518406 +2232490835 1201259628 +551582075 2917955112 +1760556678 1005846727 +3977211872 256712101 +2824720809 3821484805 +1321084245 1247069404 +3351490598 867798852 +158391654 2358866609 +1556792846 2620197499 1302978923 +1033151722 1880136634 +1318161393 2001028224 +1851832631 4116587938 +1189959772 60954840 +2012429120 333858245 +1734806038 3711230119 +3105414282 1182499296 4200610337 +4288276002 2168801173 +1521152344 320466317 +2420231011 3517947462 +75259531 2596852930 +1972663938 2595655349 +2852345848 2604890980 +1176625078 491989905 +230831402 3906591999 +815517875 1740893239 944343500 +1957730664 2925486160 +3696744912 2924208739 +539484145 2412087398 +4204086676 217876463 +3403393276 1405813937 +2709117842 2720280834 2720280862 +347455704 2854421077 +816795866 2113685291 +35111060 1145677136 +462774369 475305123 +4268337967 969582161 +3629696398 566165135 +1391991800 2492729211 +1202630165 1202630149 +2578309969 1035786384 +3644749689 1985352552 1985352574 3347099465 +705753354 1118532283 +2347375143 1753688950 596516473 +3149265464 3078153787 +2506139288 708360528 +1034894075 2314261439 366598436 +3171898582 1965198577 3171898566 +3321859252 1699381071 +2894265359 2704460696 +3564995664 3794364015 +415366935 275026214 +3116301524 1000866233 +4141967147 3486869666 +2078184725 3505809894 1769574041 353153276 4294407658 3106415731 +704687558 704687574 +1163824693 3771886626 +1893947819 1811363202 +3825326834 3773541093 +1170273026 3502148643 +1603703675 3455531846 +1833531632 4205404611 +3460658229 1967645658 +339444985 2897885385 3534902270 +3846375402 3531961677 +3637299405 392174258 +2885857735 400544461 +1541649526 2834620646 +1278849664 2127822725 +3659964141 1215174994 +3607046643 831260512 +2824305192 699747581 +1534640593 3491306502 +2828698232 3812319995 +3202579378 3979617531 +1644625981 2382716930 +1425287377 2371633414 +1823206210 1419991285 +443745688 35299546 703280957 +4280956025 4028054443 +586069547 2795906347 +474497110 3548471018 +1413496111 3491778798 +2459250328 697603108 1490573645 +3884391181 2259653988 +3542863251 16031354 +24954768 713976680 +4237236421 1514405388 +2799769438 3314208305 3778933760 2496347637 2764566399 2342171275 2015643091 3872459651 +784754122 2155216677 1817328891 +298236006 3957439386 +1061043469 2616859506 +2856260942 3028358606 +3377308515 3723269727 2289774596 +2616576248 2079022715 +4174822477 118123812 +881486425 249915912 +232111035 1920364066 +3182175082 4294688731 +2859181815 2140709827 +848489824 1633415000 +3696072948 660104122 +2576014899 2034202039 +1651316885 2260578954 +1719909220 1419542595 +3478240794 1448304177 +1956560156 3142123914 +238722442 4031119419 +324968581 72954045 +961880820 889587215 +434163618 1592187925 +3283753592 2516036333 +3117564979 2510907322 +4209133010 4279750734 +3085414376 2896936451 +1851773707 3420011074 +2139707152 2591440547 3576958499 +2113140139 2767380437 +3659582374 127964737 +492619327 2014057768 +3381292159 1333329468 +2243560311 4208161862 +2308749221 696507975 +1268903092 3286736719 +3322656828 638788583 +3796320315 1898585330 +2491713763 194410517 +787343119 2731467596 2731467611 4018322584 +3089254282 1744215611 2549818374 3829077746 +3551526016 2944637004 2944637019 3188358533 1026735544 +2518078408 3436852469 +2749339794 359794366 2676957997 +3616944655 1886440846 +2542399802 3357982301 +1653524182 616762515 +783620289 1209399254 +794382467 302413927 211402300 +3365377378 4127094770 +760314666 2168775437 +3661233959 292396525 +967456618 3977066949 +2704066728 1635770493 +3197544690 1559403575 +3385176995 1161415050 +2897851801 2170085342 +1056807083 3560396084 +3933028739 1617728189 +1606572179 1374777189 +3047622868 3388138927 +1277437570 4038801708 +371069129 1424399941 +1832698845 609747466 +3213700533 1077867516 +457321446 3475708695 +3368488399 719088433 +1433340112 2796130261 +900069725 3511127412 +495060639 313551966 +3896978618 137025814 +3216833129 1065235288 +192926691 4248473162 +2583206617 415900515 +2257355442 2167520805 +1141245860 711280015 +3160584501 4065966995 2363628104 1113202969 1868035814 +1276479466 3046183592 +3237989730 883970371 881847402 +1709780809 3071635448 499067068 +4264872001 32199629 +4067468612 2694152233 +1185793425 3566076752 +1088086280 546324363 546324381 +1375496216 286467190 +2773832454 1263645303 +2639426321 3117097926 +937327906 4014980649 +2226956027 386773983 +3889620094 3405351774 +284312910 2037545938 +3443452954 873311485 +3577240466 2951028269 +374867172 277852905 +270232681 515605966 +1205454345 1814970818 1900388773 370354905 2200125275 1891885953 1561017671 3016211450 3557873037 2545279717 243479816 2535980246 119616499 268647122 1900352335 4126765507 +192585764 906631337 +2377022210 195798051 +3294784901 3655469381 174331731 535726661 4046943980 2855407273 1644151469 3663630496 384413971 53644093 +1882454111 4247245665 +3734566541 4157349860 +824162450 3874459091 +14663077 4033831626 +3297214293 3058528970 +988706276 2841875967 +3701478369 822037280 +4140382323 1930042671 2367896387 +3650859023 2669029272 +3215600901 3185893082 +2070957374 4183507550 2412353695 +1659324314 1276491627 +3612001919 1773566462 +3436993723 2587472885 +1039969410 381915317 +2652050836 239361279 +2905414640 2172495574 +562126941 464171636 +4012313224 4229441955 +1837037803 1116347160 +2347190153 3323305134 +3231302814 3490743487 +3000885270 2840052401 +393228563 4171055354 +4267348519 4267348535 +596499728 139657269 +1542667170 1642520597 +693940455 3849634921 +3057761632 268623298 +2418947130 692783893 +3540434422 2755859922 +1932126576 3136977731 +2500211481 2982309982 +1897712909 492227428 +3924043068 3620329703 +2256968948 3119059993 +3376030809 528955422 +1174593719 3985096720 +391046262 657565127 +3035506882 2498374005 +520369330 2801953301 +1411493079 3638322487 +3231430385 3231430369 +2381464690 518021659 +3710797124 1943472649 +1014079922 2378708895 +1035162971 2145674444 +3639015152 1670822851 +1384314698 774588795 539270767 +793288492 2605879895 +1248794014 3403614143 +637373201 637373185 +3360030353 3610230342 +862684675 4114871978 +3311934754 3840269443 +791517619 2137021040 +1379489819 3921348261 +3618626303 2295709566 +986931909 986931925 +2287723932 2840952903 +2628574875 1121366323 +1809962585 2535115824 +1832443875 1630442311 +1110275667 2157003962 +366705526 582032133 +568691270 2723720225 +115919086 3765690136 +2258558956 3625615511 +155730112 1140725389 +4252167016 4252167032 +1295662154 1295662170 +2600960438 911275927 +4290169982 1976219093 +2531363814 4027654262 410364496 4027654250 +3897880380 2286990065 +2034117556 2430520399 +391957053 68312578 +366881768 1831394188 +3283915612 4064953351 +1235684615 4177101312 +3100767020 1196929111 +2525291653 2473792701 +2692517864 1469696063 +3558249934 2235802959 +3071789405 3396460866 +3806274673 2521193968 +2827554798 504215730 +2854658387 2761563653 +679507113 3600443416 +3766015297 2671228246 +441731211 4256051906 +2374949218 2531771142 +647694414 336466639 +3980286257 3980286241 +4260000288 2295076588 2295076603 3625035877 3931247512 +1517974640 3737472067 +1312198833 1312198817 +270338823 2979234393 +1209192080 94055605 94055612 +3260460270 3067240825 +3206851040 2008970427 +538494850 538494866 +2592970587 2448062216 +12810227 2084308320 +1123558886 849556866 +3108105838 4012269470 +1298707859 1859507820 +2355624104 2546059692 +200360125 2311645588 +3775749900 1410113505 +1477700133 3943342941 +3640708049 3343955780 +987198771 3559751514 +3730205705 2195436469 +1996898246 761032470 +4201224801 2795802758 +4288210100 296748889 +4111991373 566992676 +1379477040 1728287132 2683772309 +1249258491 2019798184 +2834206686 3448535657 +3904528786 402145988 +3799308919 4109625670 +1815306544 2229403285 +4133819275 1813890004 +1491057169 261189558 +479984263 2425053824 +3801162528 3397012339 +616774266 1498746379 +1315704838 2048735607 +210228032 165817627 +1551323447 2433908148 +3093712874 856673627 +1670301351 1049172871 +491269587 3953140538 +703285445 364423152 +59039434 1412085741 +1663614509 1349025179 +1542734342 3610499349 +3187187833 3554424419 +1743716082 2403030771 +1829551754 1829551770 +542947363 351657756 +3086964726 1620203478 +1948200921 160811591 2084039069 +530346672 1934134037 +2769548875 694990868 +1227505314 3481311509 +373389227 3020907042 +3653063572 1967398620 +1713353384 1810251371 +3862391775 1212076040 +1833541819 3132045401 +483587588 483587604 +1406689781 4070716604 +2478055827 2231883776 +1027493823 3306009468 +354957386 2555419757 +373874130 2153456700 734169303 3325890745 1056436363 984933313 +2591221056 1658774483 +3145990120 1172868611 +2106045183 3689766977 +216233359 1484174084 +1621313984 2359216027 +3355247685 407746714 +4203228941 1902252411 +230534793 714719672 +827119697 2436716534 +2177435560 225065940 +1359406448 4259000131 +1909506321 1017114054 +442800460 3629994679 +2207011156 2294908800 +2916901121 3001857174 +1460632328 358526347 +2282615030 3648590453 +450389895 3383425408 +470277190 2634138929 +1474431601 3386273776 +594029698 1056837795 +1077475686 2584014513 +2146428060 3641508436 +915273156 2776228745 +2717266716 311588103 +877321556 1339476671 +2706441021 797448450 +941514646 2995544902 +1287207713 3902280928 +737045764 743808351 +251820213 536067149 +3744548014 1749819193 +1407882260 776412015 +2732681011 485338445 +651086490 2978541675 +3025110714 2469467869 +2146956940 1087298152 +3220253839 927294683 927294668 674475377 3081315608 +2403837146 2135442717 +4225169394 2520318363 +2051777292 1137809779 +3841979708 1131683180 +2855742809 883570500 2855742793 +4114003317 1775511322 +2336943809 4082264771 +2645335635 2310880442 +158213229 1164138372 +632768301 2357529554 +2738438377 1164485823 +566226964 891744121 +18317665 2022767943 +2882093729 21268650 +501498051 3511808764 3511808746 +3676720864 3676720880 +2175838174 119030399 +745418192 3880132648 +3235029566 3382011807 +1711835702 3580990225 +2931705084 294033585 1206017712 2931705068 +3670474860 2544541569 515306620 +3452032933 3452032949 +3180070200 3629833171 +311977971 653423968 +559729805 1940201016 +2001272294 2917642497 +1610443714 1777956302 +3396233798 4057025569 +2776483153 1681951969 +2954938516 1664141289 +3167991972 3748156708 3846941225 +3804731278 2385745039 +991284301 2699523506 +2836245032 2567567824 +1234539586 410543075 +1138388838 920477057 +1082886559 984196446 +2777050565 2248845763 +2822908799 1596618984 +298086999 1329594086 +3736582462 948947858 +2753458357 283864316 +2260484924 1448990567 +3036781161 2850825069 +431026717 2391614388 +4014440831 4014440815 +3745649899 518559503 1611066868 +983736956 3389376807 +1681981293 1279049913 +651897650 1560608691 +1154959747 808108629 +1344965818 1344965802 +2982641328 2982641312 +449518744 3317564237 +1945251763 3983991606 +2012868566 4202390198 +3948680568 1794115076 4193635309 +4281079638 141081703 +575471314 3920139130 +3715071827 1225706432 +637111721 1893335320 +4254855858 4254855842 +3376183285 3376183269 +2120893790 2120893774 +4280654027 3889327599 1932494740 +2079069053 85428322 +2136558265 3618493576 +586821702 1440349751 +1063277503 2208552360 +350499472 1933285539 +3496496608 279230651 +179413047 3592389018 +1095612081 2119604390 +3810622496 3676516603 +2857761666 2807754165 +3061204577 768549581 +3184332873 2356182201 315663096 +962489689 1291778447 +4044943050 1413474285 +2361094828 924157143 +2275695370 618665573 +4197212884 1354250631 +1588336652 350870263 +2235970737 1400927671 +3734182274 3766576541 +109412734 3257588063 +3859702846 2186383817 2657101229 2169606195 2657101242 3288683018 +3769431820 3158894583 +4252779555 765412106 +3416578475 1260891993 +1984347369 1272744526 +3065041763 4217160906 +3909021258 324083309 +2923804406 1304364369 +2234983628 2177821985 +2754502545 100692294 +2139552797 3820827156 +1120298490 408062109 +1064614064 2495528213 +275978420 2570052431 +137113221 2002019258 1653422931 3193385645 +4113880489 2871810328 +4118826995 1811798924 +2964326287 3021727246 +2598460084 4028104660 2227292495 1443886879 +3427846752 4090427154 +3783529046 1491656046 +1655588481 1655588497 +1159789570 635985757 +359608825 3070995198 +653594925 947270898 +48502358 3809421681 +2325684102 3464411441 +1705513764 788186317 +4181222592 331782739 +841021697 3941072000 +845454672 845454656 +4130489940 3953069509 +3668931763 3455725623 4113872332 +821071119 83949900 +3123684310 2413913891 4009683441 1322191114 +1409918280 2469343325 2469343307 +1510331697 3895368752 +1693121878 871157361 +3395454057 2337557221 +2341383205 3600350771 +2569654765 2366374980 +1663336427 4089739790 +2164323328 4261003320 +170291089 294166093 +938286542 3155255073 3628460870 +1701635619 3073213621 +3521755444 2575805289 +2053554274 899127147 +3363489620 3763246035 +2778457281 1929101688 1945879310 3283707786 3283707805 2399296931 +769494620 2008662984 2247344537 +3647099740 4090892086 +3937014173 112835106 +1024019034 1872759723 +2283225575 1518352287 +1102266118 1932277345 +4085187435 3153224052 +2685294800 3331706723 +3585582037 1159129162 +1747536811 1599440284 +1990015355 880901284 +3650172155 2056677156 +332702359 568368660 +4187499548 109932561 +820839904 1455698107 3890388184 +2985313320 2437447207 +3628624080 1241317219 +3041193917 411395732 +2786636541 3563582434 +1674504418 2688613357 +3805826021 4286544250 +449201999 1965179224 +3952753440 63640435 +3366968312 3839313787 +1496352051 2590093146 +1229516432 314212587 +2344216727 1295663246 +392494889 1371545983 +3506410860 1851275543 +2904949886 3837258654 282661471 +1097948867 2318321078 +1696815846 865987622 480778263 +1487315910 1995542534 +3648805477 3648805493 +2338450336 187034867 +2854508585 3590296 +3049577009 1440971558 +1074163350 1612715569 +3163854277 929667950 +4179835652 913696607 +3782781484 485745495 +1274577785 288814952 +3897798462 739719929 +3775056687 1717951217 +2971955835 1465923506 +7919922 4030589349 +3827836959 3827836943 +1084254914 2122846051 +2175697488 291629893 3207877906 +1832580781 2698138180 +4291324634 2597565090 +1709780810 3088413037 +1821431033 802687198 +3078308077 3288806674 +1319647350 1221648849 +1975755152 2713602408 811330557 +2501490681 2960956670 +945785413 4104032362 +3980741741 96264435 +2171689628 1634837393 +2306216614 1956432358 +2873609787 3708397298 +2999434703 4096389478 +226454048 226454064 +3673718083 723735335 +2965819296 2763878523 +3502271875 569140540 +3154169754 4151870818 +735355883 1916555314 +1014749490 1761012154 +2366047952 3524245877 +502521944 1470168037 +432504794 1863205931 +2270609651 3986663841 +1388229673 1798675608 +3533809404 1277730680 +623841026 271190414 +1132830404 257486465 +2040555721 4216111826 +1421496409 2458229533 +2960656632 2960656616 +1960930959 2380335886 +782219631 3564169656 633334971 +848798836 414704271 +3982285925 1189639312 +1915567904 1915567920 +3174429366 158637760 +3019308465 4275133862 +3658650031 955719478 +2638691197 3356604859 +1829619623 1404128224 +25236701 993253364 +810193362 3613625747 3613625733 +4090386506 4019866694 +2388206987 2706774484 +1670362104 3006812027 +1966150045 1639744832 +981156217 442794403 +3809994231 2757560314 1973355462 +1358610679 912161251 +1298257062 3079913668 +47965205 3624699578 2502429980 1269711667 +4200778267 1149511821 +528546012 2643004342 +2885104003 2885104019 +1542131392 1542131408 +3170641453 3708808243 +1014262524 2590497558 +2102414552 493418523 +1066718815 2065035711 3287493404 +1118771648 2224494476 +2386196764 1458246308 +288173608 840935677 +3345934441 1101633260 +1936326808 1894954547 1190603616 +935736470 1303908025 +1101292983 214703888 +726284193 2016776144 +2879127110 1821460535 +1145142180 387294015 +2822765213 2042070306 +111348706 1420539075 +4253983094 2642947281 +3286422959 219570798 +1233881182 614968319 +3618973118 1344956937 +1028955577 1161054760 +3590199141 69710474 2339650873 +253456906 3526657453 +3901194994 4283638515 +3143056722 556894568 +1368591209 913665139 +626915354 3974992107 +4275628721 3766056112 +4274592723 2404942625 +2711105470 2711105454 +672680885 3544133098 +3825422408 959930717 1865303412 +1413352924 3771105927 +2631417839 1409814751 +3845411217 1650222918 +3098859456 561905503 +2038434300 1083160487 +3496778289 1274460976 +1684319312 1518027235 +344221406 231142054 711847807 +2156559246 3892347023 +2799351207 1363932640 +2654896724 1105463885 +574698376 1956912925 +4240516766 393841699 +2692420550 175341574 +2257839921 198505007 +3571559727 678846495 +1148394946 4092175306 2414517198 4092175325 +4089120611 309108956 +1383361269 3259260860 +587981687 587981671 +3396343045 3010533068 +1870801252 3991349375 +1337475880 4259619669 +2451164400 4003306965 +1906124945 1491911222 3099560023 +2100604026 3871399253 +475347237 384845213 +2261399261 223632884 +418452280 4218767964 2426015927 +4073218302 2372197385 +3767436912 4032668245 +2552063788 2722720321 +1405517998 2407305721 +3090923016 235677341 +1863640735 2095516766 +2821343689 2366902840 +4145571316 4145571300 +457429225 3569475288 +3576427481 1831919262 +1316458914 1316458930 +2381570872 2395007429 +936369791 1530610152 +798267140 817413936 1257571889 +3486176239 189505848 +838598994 3298925050 +2651873065 3462127697 +2049547426 838495658 +330729037 2980082273 +2612475196 1567149415 +3160326940 3714977292 +3603727152 1408402563 +1445047040 2533372179 +1178032361 1914762968 +268404781 269370514 +1311964788 738342798 +1080820600 3792270843 +1922831377 2092144336 +1693522219 311074484 +3945939718 1525206626 329712235 +1044988643 3628951556 +3181402925 2960099282 +3153560712 1856348683 +2328186392 592740275 +2757924897 3895819254 +1645674046 1712577374 +2682373945 3916209854 +3573670627 3573670643 +3775656371 3404388097 +2605072894 793789950 2778286719 +4116626887 186957888 +3936949500 1680607409 +4096774225 3091525520 +1431060851 2941673363 +526193827 3180669733 +2438659874 254600990 +2887899919 2887899935 +377950357 3581331258 +619961896 221589495 +1112820946 1018490515 +3962929719 255589520 +912471773 103248497 +2403825261 4202655108 +531133804 870685847 +1018286065 855705363 1091871965 +611547649 478383981 2955527214 +1788257494 2703588583 +2066705431 44509232 +1701298002 4099026451 +1738305664 1738305680 +2080021272 1132603099 +1103943395 2021017436 +662746298 3919347933 +2798295915 4226984290 +537074262 2575225142 +2245306436 2447071773 +1695898295 3617443353 +4133118162 2722523795 +2150787183 4221155361 +2231719827 4201176186 +3026174029 1069267236 +3565575238 3582149175 +3674350520 2086550189 +921967501 131258031 +2967073159 3363965118 +3056306587 55314213 +4261700098 3806742837 +3562531979 2055356354 3877294965 2095073208 3513343682 2246071806 +3546449210 676651954 3574763353 1961494622 4143931226 333628951 +39540903 1556909803 +3624069887 194506600 +2476140633 2945434654 +4054145953 4054145969 +622809367 766193794 +3920641677 2125151931 +1231441798 1692959174 302985207 +1322750422 4082799601 +2106136912 4158547523 +4047305009 4093397030 +4089673594 705699925 +864478601 2791003832 +1163479758 1182864017 +1075617632 3995349554 2530883577 550011543 479059441 3039158530 3178973677 +3751755807 2988313308 +1408859523 3032519996 +1834653144 4254720795 1347331360 1178627443 1178627428 4254720781 +135759352 3037193581 +2093879711 422113807 +1651716876 3241277715 +2087685325 2962925220 +3576984321 2727414400 +4013246494 2322917417 +2770895822 3435625807 +285983830 730207079 +1567417360 1858131521 +1300821048 1184396347 +1916147799 1226397897 +3057851465 883263214 +94371062 3504027463 +4173836127 2805476362 +3566892743 1982397270 +2436429722 917358443 3403870833 +2028718715 2028718699 +1866334628 145991221 +693384972 462596087 +3443777291 752361044 +4089163247 2675101496 +2172892674 3830940981 +875895174 3046583799 +300547083 2016125743 1045939540 +2048077612 2048077628 +775438184 713806013 +2384740989 1075096258 +3573948336 1495185289 +1179518018 3700111693 4006654954 +1030622955 3488622626 +3625715637 3760936676 +2324201226 517995707 +2543307337 3975377134 +1789233381 3348529274 +3385750837 3842146940 +3659157910 3685792667 +1418525244 4015564780 +2246999364 1862614142 +184081607 214142294 +2918345612 4031417228 1353243577 +493997885 4256663209 +3819094791 1614349334 +1310971986 4218341627 +220975287 1928957968 +1161903740 2176146737 +3454892615 1943502294 +3692645202 3453063699 +1245124453 968479731 +2640347897 3085839848 +3042406543 3042406559 +2821571102 3808787650 +3401671512 777631461 +2021839105 2420389936 +2312186305 3309622288 2312186321 +3150392556 2257303447 +1209738632 180098315 +1381115235 3913844816 +4191276485 172420364 +5779086 416369049 +2664556209 3436817363 +3586387199 2188252542 +2321929755 4182772882 +1923144337 1923144321 +2202949931 3746979517 +2947820065 3114160630 +2081252802 186069109 +1037602147 1126788835 +2701561081 1037074654 +2485221898 287460414 +2071539308 3418625047 3418625032 +895767841 3315108067 1241164102 1101153927 770835190 +1992681860 1887283833 +3377567881 1953701806 +1297595492 2769634928 +1170143871 1756576828 1746784961 +484810392 508078144 +3900577606 1149149985 +1893863074 771043261 +3034356209 2823181926 +38683906 302071050 +4167418212 3081631055 +3275677551 3275677567 +4086416064 242651362 +2803253204 3691412143 +3336338468 2313812293 823618751 +533267471 310364251 +782270682 1556203958 +3885034568 3885034584 +3510142539 2801494036 2801494018 +2716546131 943939244 +2560041766 1542214849 +588700988 2029929831 +1502651893 4088742076 +1331180795 3806029618 +3108240303 396574978 4043946961 1328650476 1328650491 1426404472 +1479384376 2348625591 +771917588 378595967 +3274603964 376776039 +1035813346 1035813362 +284095517 284095501 +1915891305 771690328 +1397619006 1981247734 +317306555 1213437296 +2211095838 2516708927 +2964984318 3835176086 +1803912156 1803912140 +3299605691 1438571108 +2409126949 2409126965 +1130979146 2503300275 +2361828061 1573170392 +3805218728 3034594261 +4141573413 3227531578 +2553664525 2553664541 +2949854028 4028389728 +2567857650 1482760090 +2020575681 1486215872 +3806742831 1602565368 +1806193322 603595163 +3829443955 3302034458 +4067205128 2835344541 +1407322655 3675277367 295808646 +4101272929 4101272945 +318798178 318798194 +622122660 63824937 +946199102 957112810 +3601057517 2054645364 +988997120 3428848147 +1222417596 220448394 +1130776104 1107325163 1107325181 +4140502036 2510553967 +213539472 2506194024 +697512136 4020959088 +1401522379 208712167 +767550001 907088678 +766891601 1178624400 +2676352840 1741362763 +1974046417 183227142 +2840786613 3755009479 4078952227 604937520 +2256100140 3923238487 +2541691088 348990770 +1022884181 1331527882 +2954253296 638111503 589701845 +4039407871 3125354613 624760943 227666424 +4261663891 3958990594 4170407830 3958990613 1073530469 1925049163 +252731085 561941554 +954043012 2431169401 +2352663666 848287589 +3092159694 3092159710 +4005073001 898323790 +3982145498 2144300093 +3866859734 2861668593 +3361895374 3029785089 726366110 526709457 4030190565 2832876392 +2531079642 286848419 +242484320 547545900 +1860018787 185647702 3924206026 +3709883088 3923926389 +1832124162 1832124178 +2264283729 879398973 +193033595 2584465960 +1086232540 3356036935 +3069255251 2197750487 1351793836 +160452156 3085266148 +3906353869 3906353885 +1633449370 3733791083 +3641547366 937347271 +2367318214 3868389303 +2516386460 1111254352 +3868655601 1285968621 +3688848300 3432861655 +2682348144 533591619 +383203909 3746763271 106542211 3910195378 3952629986 449894178 555736306 2239792556 3767212931 +1213740032 3805928453 1213740048 +4238684068 4059771428 +3374726648 2670955899 +2081014875 1837978943 +3221089525 834405802 4110215834 +1009889569 3812218592 +1349875847 2532855053 +3034014105 1208918984 +1472749333 1164815882 +212240696 4045601159 +789147621 4040893804 +3173117048 879182061 +1428544556 916035927 +1725816383 776265022 +948828414 92207049 +2703233699 1216173724 +200028524 819055873 +3866522674 385842696 +562983575 1782473638 +724165245 4162285428 +1547672191 3072341502 +4241279995 3122042685 +1343095848 2164968532 +3884215129 539653694 +835814053 298887610 +1551151441 3702727302 +3923587350 1026835886 +155031414 3697107799 +862242572 4087699425 2973580653 3564391302 2593260892 4087699447 1850300215 2941156315 3544584728 +2678730804 2364137945 +2620968752 493758613 +561682588 561682572 +3997314046 271270089 +1878265419 2071961464 +755428501 755428485 +510106465 909305643 +3464868667 2545329663 +1258720992 1149721471 +2128401049 1319077576 +158528421 2230684858 +1316141923 1098835805 +3726827943 1474902518 +1651290701 1042067250 +3370763520 1208033029 +716069037 3715471428 +711399590 711399606 +2807001684 3054565935 +4170682203 3559993096 2876700261 2979441746 +3376746800 129633949 +3561157651 3035442816 +55286942 3456601279 +3110148387 2478151833 +1177004416 84643163 +807446595 107536764 +3023623638 2339938279 1977858209 1283180550 1872782465 +3416181548 3069826647 +2336403279 2298083662 +30168791 2880222320 +2693080102 3617056727 +2632380619 1880065519 +194159922 1775898035 +3661230276 1295385737 +3880634194 1903216147 +1359803947 831234633 +1863727875 3808355772 +3271056629 3791279548 +3288113360 3990953277 +1435309198 991386511 +661815934 2537778249 +3972931919 394162008 +2868062982 583842423 +3121236894 1422770049 +3785811070 4005489299 +2574761271 1186956879 +1564313752 2617579329 +3797089919 1882142955 +1772646303 1772646287 +2553092932 532416644 +3042666255 4105724762 +3317110926 3443238809 +1213282279 2384930415 +1102585028 1221943727 1102585044 12660664 +682530771 3721986348 +2345433790 3504683295 +505241277 926728159 +196555872 3470412168 +649877744 3934257603 +2733547461 1118143258 +2520664877 2970638290 +2428145722 4273260291 +1343181441 2300502272 +3018729278 2112341641 +3459708428 2894419191 +2738231952 3051536699 1475973944 +3820446666 2354720037 +1041522166 2246086905 +2592558243 3163924278 +2077402252 1088961441 +3363728859 2047274962 2047274948 +2695342814 453676961 +2708544712 3977268939 +3497088859 3743190629 +4192106586 3343791590 +1283769167 3288298840 +2551022191 1200709051 3427030200 +3410384575 3199897278 +2161289516 4154478679 +546983395 904436828 +2852872017 15142022 +840623629 3981977202 +1054539065 733782184 +3940963768 2157506733 +4177003464 697263820 +181040633 3459584478 +2147414949 1610123485 593071290 +3617172516 2330590399 +3712145815 3879504048 +2166470661 831575082 +3390450461 1038474932 +1747661486 2852177913 +3053417374 522387881 +559719514 3738614205 +621802461 891086050 +1320781690 1320781674 +2169755294 888855209 +1514166291 642426348 +1968691518 4148886665 +2220005449 2886026414 +1586897736 3544605940 +607019923 2282143852 +2352801150 2276696696 +867306680 2022107399 +3560738155 3893429144 +1439899719 2436892718 +1400349559 2292229866 +3318003596 553700376 +3297770435 833180668 +1695088870 644998370 +1087056442 1390932245 +1548624601 1548624585 +2793396335 2319562414 +2824358934 419415719 +1235803140 4174535263 +41181976 2287319100 +1189565841 2163324759 +206960535 1533967107 +1467169715 1567029978 1467169699 +1802832668 1161854225 +2112803232 1600173026 +3958863007 810585359 +1331319005 21918932 +139757973 3737067581 +1024137335 206523944 690206434 +758932353 4230473149 440114343 1093814362 3071321110 1160924838 +2122509058 3343022989 +2555594206 3716874023 1453479036 +2879221784 3159992478 +161527837 161527821 +26874747 9218724 +3808207867 1320559652 +922301963 494924081 4155891577 3725828220 1628335406 +239908345 2076342014 +4036850884 2346635401 +2023789489 1822485514 +445257065 445257081 +858380647 4058070326 +4142576659 1564143232 +2005887036 1925256817 +1322801686 882233521 +498603008 3003129912 +3143398843 2575133800 2575133823 1300942156 +4007545044 490523840 +3725145455 125777662 +1210526702 4091312249 +1367335295 3411016424 +1590764731 4265398893 +982974799 2327252804 +4118050477 3282900741 324457042 +1280911679 1868295720 +2099940502 2460760000 +357467594 1090003142 +3155523534 3821771087 +3061488367 838985262 +1709671106 762500981 +234205043 1824731660 +631259211 140156085 +1964399708 248169205 +1454074425 1454074409 +4217136963 3852619056 +1345698818 1184298787 +2750260644 3004940607 +3809085992 4047848020 2429418749 +3976485136 769143861 +3524228585 2539036110 +584194652 750747345 +153293531 1026993874 +2853469393 2290405473 2403368198 +4255716814 1666852174 +3471021305 2888106336 2966330298 199955440 +872193230 2762659919 +2804027773 1967699554 +1257204476 270988464 +517570035 1579187040 +3516055322 67294699 +930708181 2229100980 +2359307694 936620078 237496559 +3761967257 2516263134 +1652263 1064551460 +2317052200 2091596116 2435222013 +2279795619 2369319324 +4034535798 1914185120 2260098913 +1992969710 4000886191 +1518967360 1869794317 +2201360978 3760942853 +2121120066 1048558598 +2541609710 1764506809 +3714019766 859832721 +1948200903 1612396616 509533708 3691809357 3829852145 743527931 626541904 867486946 924466440 696291822 1452253573 1746128338 2637461430 +1992615106 3119783285 +2133901367 1891538576 1891538566 +170036677 3110415642 +1494801793 336928226 3273961984 +2328165920 2368176891 +3112071209 722112664 +2138585571 3165384902 +3844548159 4221646142 +3973383244 525714359 +37979102 1850250879 +1400355450 3749350923 +915451318 2507366662 +1261152750 1136427439 +2031536121 2547830014 +2622448182 2622448166 +2517785415 2246422720 +901186636 3676029879 +3415599054 1258023247 +1083597549 2579348228 +4136517497 3386088892 +1265137965 3246058804 +3143458542 2072074152 1334954553 +2751938230 3982997639 +4236560379 1347317061 +551185216 4158051781 +2742332872 414028253 +1557050090 2900286198 +3864192823 3864192807 +2460611743 2760315740 +3723328348 3101241799 +1953704959 1347306110 +3858890145 3055699040 +2265341888 1325972293 +2481335205 2018948268 +1794533306 468011467 +3358885224 2460877483 +3491351902 976228201 +3412026157 1411981252 +122321698 2621429379 +1498003713 2416852118 +1253822317 1253822333 +2447177840 2447177824 +1803002415 1354359660 +2867923829 2390034748 +16445522 118989037 +3316180095 2816455678 +3852641433 403250376 +2775095910 3383430807 +1022504262 926762273 +2826561611 2196286978 +2908877719 4033337610 +3791363636 356650582 +2548667098 4273089835 +4247560890 4283392977 +1026817392 2163890908 3369596757 +891583786 3530623259 +2991555462 959187959 +3093412999 3266468037 2986123666 +166666820 1659990319 +1378235418 965280654 +2879985590 3929677095 195341185 +3187460464 3187460448 +2080560126 913553609 +3139083019 3139083035 +981052112 770584815 +3661095376 841307727 421867235 1442347619 +1632764219 1863839716 +3173781276 3173781260 +2697915312 3585934851 +4179778189 743984612 3003293183 +3660694881 708588432 +1520821939 1890356639 2252862959 2613258355 1890356611 1714039770 3852830669 2690839072 +2186441056 2278062629 +2927066155 2927066171 +2180168528 512801321 +1913872394 1053500274 +620333554 672259550 +2917257729 3145570176 +1496094335 3761302014 +2538188593 3524803008 +2687462424 2921773776 +258618439 3708239699 2335198144 +3854760174 2683166383 +671928309 1454243777 +1271193160 4273483248 +271813353 1780722894 +1635412630 1882012535 +4267279957 2474199447 2724631290 2724631276 +3805548847 1121389816 +3482337070 1672625559 +4202106761 4031688174 +3992857831 2384506784 +1159020971 1802919970 +2368514373 1385181048 +1174475692 3752982465 +3020362534 89325158 +3305735696 23368118 +150013646 783679055 +2079035529 2631174072 +3611048976 2956081641 +965335165 965335149 +1626458024 2035194035 1151159659 1956702432 +1266411518 3524146377 +68413632 727148115 +2618310717 3935641620 +704807072 2927743768 +1038221896 1038221912 +2260536664 1939603867 +3329262604 3492535351 1864359671 +3846785584 2982827403 +1442152219 2602529701 +1005323461 1214441155 +4267760631 4267760615 +2211241395 2215465451 +4161752702 4263022687 +300504678 1977235295 +3007424927 3479045470 465748063 3214258330 +3948699246 4033390393 +2262738537 3412741671 1643752101 1621472393 2988950132 2755965523 3091271878 1737247817 2474761207 +2301302596 2548755972 +3492983163 986539186 +994447179 1638623103 +3733595126 3971482583 +3405730133 1004110750 +3205090 3189479081 4000197656 +660177557 1703158686 +3310375782 57887127 +3821443252 1168270159 +2905763017 3222824658 +1463240344 3825475931 +2969828720 1631508956 +1870493639 1233358422 +3945343773 1322180258 +1671063636 538065977 +1351829318 1259275332 +1608719802 1690685570 2894580683 +491572622 2277637485 +1500809610 1551139899 +3638982645 345763226 +773482835 3868446124 +1371077192 3996254045 +948601873 319678160 +1788537454 3139345145 +3916132153 2904561320 +2477209974 3125126853 +173455347 304168724 +2126387716 2302866496 +881176374 3192355060 +4216881011 525378060 1475287287 +2273632890 3492840971 +212196438 3165938465 +3118761655 1499230004 +3230822239 2240107166 +1363149338 29576957 +2612763196 1683213415 +890004650 2825011894 +2846244980 2226615951 +2739891185 1978016897 117894246 +959891816 3075674161 +744417298 4183524351 3869884077 +3510291492 3215906748 +1458044159 1524698689 +2974924687 2997915160 +1537843030 1830868586 +189311496 3734090525 +2284170920 4216451691 +1864289596 3808155699 +735382972 2892269015 735382956 +1505453621 1996612988 +1800005045 3711005018 +1046511521 3538479712 +2166079763 1370550508 +2112297600 2999891859 +2132804994 2707991459 +3709618977 881476854 +1767603010 486738165 +1442528367 3380617912 +2448479628 1119732956 295979425 +1316633143 3244926096 +492028466 3746199003 +425276328 2406240619 +386366403 63427562 +141965456 3793423011 +943049502 3071841553 +3770331119 3034772792 +493696627 2678335479 +1097059864 2320953749 +4194808693 4194808677 +1550730625 43477504 +1145894472 3441931083 +3069382887 2814407493 +2654726290 3985371962 +3470420166 1741877153 +2007752852 1649594043 1952143553 +2168580542 2045342431 +1074395881 3098934488 3098934478 +2232689875 35792839 +3973728798 4188187967 +2620182207 2575922856 +988909115 88270564 810647355 +3578171919 3440897425 1839922000 +1218674067 3965628005 +2258611351 2258611335 +1512232523 2105446069 +1978391031 1978391015 +2218076169 682493486 +723550739 4146906106 +922222627 2660068874 +3057080512 4168291353 +201956682 1025678203 +1911696537 2189541711 +812987094 511641329 +495655039 1306827969 +3421162600 1174684465 +3190642911 1672589724 +1167773017 1167773001 +2326078251 1003745103 +3642271314 3642271298 +1092186409 2752324504 +1494601500 1498745113 +2971427205 1420657740 +1104442537 1108240398 +288526732 2660966263 +2017165000 229151965 1566726115 +330376518 855092615 +2506759083 3775499810 +3622642340 4033552653 +3806124253 4272514018 +2887403062 1209459218 +3497008753 4066401025 2441079782 +3628236923 3954196914 +2418051789 504928306 +3017783433 2989457326 +2232518510 1251405082 +636001054 747986113 80194709 453961456 1036569383 261582844 +1621546221 329330948 +3091638298 825925885 +2568343040 3631849892 3474818509 +1217189562 4021683915 +1759935090 1759935074 +3341061509 59426892 +4014846352 1196328355 +2257328273 2907517494 +1882549896 740098059 +1736940310 2511544310 +1676586693 364716044 +3321124614 2779053687 +552121418 408146029 +2772396254 2974334955 +2088273306 201621776 +868749790 1643389055 +1400256515 1712991420 +2816058986 2040829950 +1115976099 1501488010 +2022490885 3398893786 +3591339061 794855292 +3734459303 3594313124 +1720481585 1256711524 +3175885713 4129188183 +3891383168 1375852201 +2903135239 2903135255 +1524576658 2673543365 +1098296813 1098296829 +143984028 3120799824 513266833 +3189161225 1187747118 +909904285 930003861 +1804856487 1019322020 +3712826276 194688548 +2073421436 150590769 1380621351 +2020158072 1050767951 +1330344556 52847764 +1873354176 2163161976 +3005546527 3005546511 +3023358626 2960935850 +4130471188 2763089509 +398404115 3009958794 +635668191 3736816661 +2271881995 924959316 +179911494 2344924049 +2533875490 2111093385 +1417420042 157398701 +321415859 3963742895 +3343765900 1266736993 +3474400616 2790155344 +2878473498 819857405 +1845717622 2774570961 +1100267866 2536267965 +2237573962 621381345 +823648289 823648305 +1274830486 2278824781 3194598187 +2031758434 111600509 +2165637864 3368470465 +3354033440 3592616293 +1204253701 66823130 +577198643 2044833888 +3562713955 2915591381 +3780263669 2843286442 +927175487 1516331754 +109174122 2825883085 +3569908515 446289948 1479627933 4230951943 +3410118423 274065721 1255875129 +2629252630 1209511061 +1961562230 2821589650 +1032047355 3514337572 +3868148555 2188008559 +1539496695 3660807540 +2114844786 906311181 +2718035090 1994992104 +3549411396 1467996365 +2880506552 4289978299 +330347925 3459085356 +148941208 2443901531 +4240375036 433973636 +2208066420 2738694031 +4045998344 2878945163 +3478432238 1346863545 +2692570978 1754183086 +2039455497 3847901732 +1230474923 1362953944 +2572628753 1967481808 +3748054354 1389626425 +3571581978 3889958389 +1623165587 3766953338 +1047644563 3760214629 +2370802522 891472374 +3229933666 3454059384 2536685001 +1931379769 1632857724 +1078569783 1794672518 +861193002 4168039181 +3587191315 2847855596 +2853955395 216862314 3576548646 +2624300371 345399767 2423603628 +479758238 392550722 +4265433068 647063703 +694885417 1553814680 +2987631131 2927910878 +947507174 3452061441 +3440216867 3440216883 +3260366547 3207718458 +2183494513 3443526173 +3295101526 2223861105 +1943111332 4141282345 +3843990868 54412079 +319443395 1387822000 +2955634047 3545286376 +2918626385 305314199 +1211455564 4287457888 +3934112716 179384965 +3344391353 1150106287 +1698415059 806494010 +2326857678 581912921 +1446455775 2547444254 +2240045312 3234654703 +3972876 3972892 +4266425460 4002827977 +2592325160 1701075179 +3345316291 2814291434 +3345657207 1676612166 +3349116044 3349116060 +885512526 885512542 +842279276 842279292 +2827550116 3109563289 +1711473656 2537873999 +2669521779 4004832794 +2982703442 2094762477 +1239274999 1136575171 +4087654442 3056908813 +4222196316 2281569991 +208266048 3400580563 +431916893 3824097140 +1425071112 1425071128 3207225501 +1781587483 2568616926 +1307923996 3746832140 +3691978334 1130248233 +2188608695 316271622 +1198188122 1747786486 3343425469 +1553327018 1777689741 +1970978227 2738397402 +3661744168 1729642035 +35378415 1069691963 1087386670 1087386680 +3529835546 1325757675 +1661413053 2705456020 +4191076977 1280941824 +4115317788 3931620049 +1731807030 3039500817 +4074357448 596514252 +1800115565 1425816196 +3153143357 429863444 +1788356121 3867408712 +2575215646 607579177 +2929382430 4223396649 +1294300915 1294300899 +596343327 2510673099 +3923257668 439694340 +4212388934 2255063607 +2087734096 885427957 +2895830745 2429341576 +2332069165 3159058576 +2708166040 1926327609 +2646428959 1879074760 +2391690171 620836722 +3153143353 362752936 +3820491800 2462556635 +836650888 575809623 +317975893 2026951148 +79328353 3860454823 3531114584 +3428002965 1005530780 +3926568804 2665475937 +3170174220 335463712 2176250337 +3070218946 1742856394 +495514035 495514019 +3170323550 2604383618 +2160740696 376534427 +416538458 1871223467 +3440504907 507332098 +1663445399 2886957232 +1236428608 1138264531 +529132638 2079508095 +3386326269 3134521940 +1064444910 3467546543 +2839256289 1238890016 +1119264671 2759673672 +2622447850 4210397261 +2904792550 3783746166 1638360871 +2571031860 1911136473 +2303504509 1241634244 +2998349303 3266032213 +676297015 3932662286 +1776674653 300627828 +335419285 2310206640 +871232523 3398905172 +277380601 1824047853 4292759272 180070081 1349617610 +660254263 3604799849 +3713284779 1130244977 +1078196265 3379976089 1409263758 +4202576776 3956954609 +2301005508 3546411449 +2040606405 1035771916 +1903470536 1654923211 +2069319330 1546751342 +471764276 132781732 +1296499242 1660661568 +1658275078 1658275094 +2457350520 188080123 +2448364620 2448364636 +3957770324 3267898815 +4271816652 2682777121 +2559157587 1940865466 +44959453 351587828 +3619484563 1153038848 +99612092 348116721 +3654517550 368542073 +648250278 3476289381 +1381213326 665586585 +320079659 864503970 +982240116 2258499680 +3203811864 3048645581 3615741287 +1793197383 2295221952 +3999097756 838741575 +2630160128 1492725467 +1884561870 2725328729 +3730621645 3641298596 +2308420653 3335561938 +2520036180 2495320232 +220719012 2450140123 +1341151919 2254356846 +102028995 1929455579 +2139525601 4235793424 +1341266873 3488971445 +2232168919 1228043632 +3855145124 1596787263 +2986502665 1120726062 +2272846649 2085466792 +1142347604 2213869871 +963707815 334020576 +4244938557 2336664834 +3691113975 1309252560 +1436028688 3462379043 +4279214754 852045315 +1004406345 178752630 +2187516058 1862960606 +2875097666 1018032827 +4206905768 1689514859 +3030269636 291054008 421318281 +3704016604 1761059921 +971354149 2208057465 +1869568151 55080358 +1341430769 3474029670 +850992781 748073458 +1289723802 2651340651 +3134533427 1352224090 +1199413157 1068880380 +790253679 2475652438 +335383269 301534145 +2185593436 1869362897 +3680386337 1985624822 +3969184447 166476768 +674636866 1560301149 +3671210186 112628166 +3994991798 3994991782 +1353613156 403696027 +4077509286 1048785729 +1251485266 1251485250 +580505226 2476176869 +698083823 386196998 +2369135402 1983470363 +2179701247 2229496958 +3493473248 2878542245 +756576890 2004629003 +2879156532 2357540843 +3807877767 1363193746 +2228999477 3308235981 1527816810 +3380463685 1979860108 +3580893032 1735710891 +546669596 3414196935 +3769794850 3674294421 1174742589 +1737140368 2403818147 1112787708 2403818165 +2262645429 220286554 3454878918 +1924388481 730829724 +427246658 4213876937 +2830114255 1547627736 +3284582179 1423893532 +2895828795 2895828779 +4217396368 1219606179 +3022429338 1403751519 +191170262 3322528497 +3697220259 2360798858 +2247177054 951311615 +260003951 260003967 +2834457522 3137485934 1587209122 2443603388 2353716710 3928366088 +2130826037 1976621772 +1363828719 3876914478 +3531198008 2378146363 +1524002363 982484722 +206026753 1441180032 +1880435687 2892566514 +664730535 3147661608 +1263770447 3818749262 +3997841177 936688734 +3250684412 4194217255 +2061251238 1414803147 +4125777956 3471038233 3844725518 +294793207 2686550470 +1375276696 2660974815 +3112388681 1386924792 +3839744879 3312443052 +2068565093 2102575866 +2019865960 1066532739 +1288225647 1326163886 +1991025359 2697219022 +1526405859 474698570 +3778166452 994756620 +1165848596 2021093241 +3271307871 1375947656 +3591312615 1794351347 +3655470758 2765950807 3741263334 +885082769 3021700695 +1686585981 3186469570 +3095816998 2711268567 +434387557 659025132 +145781786 145781770 +3779104116 1913480608 +1293237397 3983433372 +1830527531 1276914695 +1113183866 3396103150 +1724674954 1574560315 +512241691 727956100 +1556516568 2852886560 +301541787 3862724370 +206255704 2993065101 +3741945520 1263234588 3423313685 +1200497238 4206890353 +1378964094 3785677897 +4043340182 4190070577 +2835906672 2885172935 +650379418 975342518 +2902407994 2412395595 +1334345078 783399254 +2593125592 1526817945 +642095486 3180372319 +2934841200 3504045379 +3909846493 95128367 +3078557562 1678116669 261525722 +467788061 2979392623 539434772 +1295343005 671243810 +3460982964 1931662159 +4034751008 3043889253 +1556516573 3918718452 +1204875027 1204875011 +471466174 4209978121 +2573446961 1150491182 +3686270816 1119067173 +1008241160 2728479389 2728479371 +1448009779 1385711520 +3782086480 782844039 +314519206 3471916965 +3719915842 1289794293 +794408281 3812129544 +3671667535 3538800853 +4165218317 2761367910 +4167081121 4167081137 +4128624174 2454950511 +3606539447 511714310 +3748848188 258432496 +2013811399 108934600 +2104900167 3357392342 +310374426 963049707 +2018616904 2961752925 +1527834899 271100800 +1367717169 2256288806 +2659872545 3035427040 +2570942794 2839269756 +2126332051 384608108 +2776560131 2312567466 +685949844 685949828 +3513813423 1663614574 +3433610484 3031730324 +1945003220 1736203839 650119667 +49081696 1908020514 +2237202945 3550979605 +49693886 1739470601 +3743369833 2806129496 +2521954070 4069188146 +3541912904 2669717597 +105215395 945908941 +3792465646 3469926554 +2455716687 1541837479 +1242764625 3976892038 +3194408804 534280809 +3109213906 2405969043 +177771600 4264655331 +3041542080 602037061 +809984887 2002883654 1251773655 +4162291092 3828428660 +2624197907 3031676800 +2113699691 2113699707 +1495118350 1472154649 +4036544116 880830607 +2246811709 250429460 +1512385856 2421167885 +4072313055 2924325276 +3656755056 2377553219 +268884740 574076921 3602291944 +648642174 1523720265 +4021527406 1249790533 +991729558 2734926735 +2800262872 2553417229 +4252900072 4119092011 +3920686775 2559035910 +1956513761 1975936800 +4122699114 1073784269 +3373034559 3180226344 +4018616931 3779927133 3658491216 1960896988 +1875285329 2872956586 +2992213608 721104299 +1669103225 1669103209 +4211391258 1114802667 +3987906174 2922348617 +1304106464 2062074028 +1938424708 2456744683 +2692412588 3764410571 +443712123 3038521128 +3165850476 3568902784 2044394241 +208169545 3512684782 +3209657261 3609178450 +4004976128 1519652300 +4225031999 2937811006 +1611495570 3342126547 +1831721608 1731134493 +2025507263 3440089000 +882929177 2444277448 +1925023435 1882834379 +2810267462 4135793463 +1623086838 1623086822 +956922567 2431403862 +4174038136 1048980992 +4180955456 1286462221 +3725734647 2376481478 +2272059849 54879839 +2443609385 2443609401 +4064771017 797433208 +76806473 2112974328 +2690348743 3467412946 +1557142027 647561044 +299746184 3207858851 +4235247241 4001100206 454915321 1048204190 2608286517 4056638588 4001100216 +2046088394 1432847922 +374832461 4135443841 +1712642149 399550188 +1518434134 1518434118 +4011609195 3565964404 +1116096800 392580340 +2822633384 2276227126 +4183443161 192705196 +1278701758 3371422153 +2732681019 2748678628 +526055939 526055955 +2804621147 2212650052 +1829513511 844368805 2632412978 +3664120885 61159292 +2641934130 2306334622 +4045747938 2140497365 +2504955403 4140767465 +3603463773 2057235554 +1022784614 2352149978 +991656674 3665769261 2028813302 +827370324 2003060927 +3239170599 398704676 +3102899395 3752721551 +4152820170 4152820186 +3767805059 204831274 +2903485925 1420738412 +268245312 156283678 3763854559 +1627815650 3260672527 +4180850345 777217413 +2711089744 2053933756 2989650933 +196298058 3040220013 +4033634824 2191413899 +94994748 634810737 +723287645 757754312 +2806718792 2739233885 +751064221 751064205 +2712116705 2580875330 +4034708289 1203442801 +4052001589 4052001573 +3604007716 1320143295 +159927782 3885146369 +2557470894 2233819951 2787854841 213743858 +3202683917 2409533540 +1677068991 2877777514 +3301711837 128080834 +3300674239 1936304808 +1518772607 15743720 +4048993445 1153694154 +286671703 166137044 +609018815 3825894824 +2714233662 3954659977 +703195805 1029022257 +1752899115 825618580 2765127101 +111246146 111246162 +3422516133 3357740204 +2861965000 1959655395 +3106320155 806913339 +3951448270 2616215257 +3860831378 3640603326 +3984824339 4180174330 +2048307171 1340268902 +4165352957 3549664596 +865351736 1783922747 +2853735370 3075305613 +234146286 3864650159 +2488481776 1446279048 +2945370762 472568293 +692572571 3499023199 +2747494263 1135114310 +2796953101 1344175461 +4093151186 3125658746 3795701651 +2609213113 2349681960 +173344917 2008756823 +2437037887 4191022844 +1545161117 3607144299 2563695138 2947414933 2947414914 +558405419 2420504756 3525739352 +559443017 3341973240 +1424169074 327121765 +1922043181 166306459 +2320926060 842270977 +3585239223 517658640 +3458361903 2938972152 +1720039387 836532189 +3083728167 2151214176 +279267922 1457162989 +395699541 1979188426 +1249222545 1617662241 2237621591 1617662262 +1341741700 1770618335 +4149770515 1934006522 +938698895 3369025905 +3180948173 1166221476 +3559671443 2112945844 +2439016628 749468936 2396089167 +2396089173 682358474 +1315108570 801800173 1070242091 1315108554 +1322544689 1231648560 +4275725152 2757966415 +817435567 1269330156 +1861427425 1283172842 +3869871287 3968568358 +2545657616 3966238243 +1135043135 3212814654 +2271334443 1241166754 +2799125959 1810028630 +928348388 928348404 +2504805616 4145880515 +1528478236 3040110966 +2977137977 2447030462 +845171033 2794682135 +336975122 2958977861 +1021789802 1242814669 +2574383749 4012710570 +130336538 490462606 +3924659491 1677012490 +367277093 2604537388 +893858078 2732030271 +3175363147 2860934008 +1749906021 2383545738 +3002632673 2655063350 +242794926 3559939581 +521692398 2213992825 +1059500025 2880230786 +728679196 2069701905 +4009176251 3978853246 +333831202 1960413571 +519833548 2462074423 +203703978 3340451213 +2822428397 3248510738 +3366839219 2201725964 2629661381 +2712460747 206064405 +4014774061 2110745477 3801218002 1705250971 +2353143179 1460961730 +770633296 3800783823 +1061111330 2996529045 +3699377178 3699377162 +520124950 3821023409 +3010533083 1443298002 +2678638566 2756288817 +3525955070 1951174921 +2667688591 3735820046 +177330190 3247912745 +3981510324 1250790735 +516912998 1962848410 +286739175 3467307446 +3761224135 935130265 +3904066793 718725721 +1618142763 2116477980 +2105295024 983160067 +848590913 431378801 3770240598 +3392954142 957652606 +3527169399 1265089507 1265089524 1811581520 1919590697 +1446958342 1446958358 +749611797 3273762221 +834014058 2878601165 +1512776083 2229656165 +1544191692 122895155 +1280814733 3776853332 +1031349450 2594469794 +393785600 4076774163 +2079022543 3800345806 +4218203753 3766720462 +3044334549 3044334533 +2408355751 2408355767 +2554012587 1343825460 +3819780588 1437740680 +3606900065 2986404020 +4246925098 1110121594 +3152950238 3053168233 +654414254 360207609 +19404278 2099900774 +3991321670 3359269431 +614286046 2067166466 +4268761608 4268761624 +1645075781 2698204058 +535053285 425124204 +3524835269 2504077040 +2722777155 2722777171 +2632160263 21104406 +575641027 545873831 575641043 +1708870976 1708762616 +2323474858 2585743286 +1586289691 1586289675 +1932209163 1475761492 3435680568 +3865047574 2671505438 +460169737 915805230 +3725400405 3818840284 +1540910749 850796834 +1147364481 1705756116 695678720 +670139749 2396318098 +1429834418 3683997221 +962386700 100942996 +459670469 678271939 +1834141953 441609344 +3606460164 1771608927 +2645817349 1196388294 +2186272297 1287305863 +1929293859 703547146 +224693278 860394303 +3362562563 2914474045 +3683044684 733506995 3778358945 +1917225821 1108173666 +2074673328 1761947659 +3169512151 1020244070 +3477159958 1505223335 +3800876181 949581450 +3544416542 3544416526 +2083305625 325490888 +3119394979 1425445020 2806230593 +3185455385 4257696328 +699024711 869094752 +3741565141 3741565125 +4034167777 4203766199 +972216079 1647661915 +2148662962 1314124325 +1360607281 3685971248 +1420097217 11563478 +3609199403 3975796139 +544480777 990027897 +942745476 883371078 1556737237 2935802824 619217232 1393600511 2246163822 2360531997 2532611093 2986869644 2859785317 1143055910 2588758944 2353739270 1166075098 835519505 2372354785 1215386571 332129832 1059253428 4040187637 2602367553 2722569531 1367516285 2799120693 2734437879 4038032600 1209276262 2968413798 1011632036 3957577819 1005181668 3547171855 1839916229 3478749145 298161651 3290204680 989734458 956831005 3134766454 146571466 2201256815 2184297737 3673744957 2181491125 1949894194 3086672014 702238248 1240558899 764091436 2226408757 1905476152 2579212703 2908651145 3877541053 2805911396 4131527953 370166159 136515174 3769856650 3980067984 3354204924 197693659 1831144117 2202187610 3333844069 1517177271 3751935692 2210761108 447805623 2360676926 3805029130 3437150047 602321706 1229605701 835824390 3423093327 3175294184 2913813884 251882073 2392978755 371573782 2554345007 614965269 3409384162 3197155605 1959689557 2849832423 2204353279 2740499046 763830046 3596599696 1209074245 1867823554 1825090622 1529423173 1461120456 4279106695 1369609695 516347495 1944365813 2889017629 306596073 1415337421 47020077 4131424278 2054605466 3978706317 3227176502 3939322474 1973324862 824985528 2066394151 4050389717 853583309 451547604 1779209347 143798647 228248590 336150651 552843285 1176853031 1195189981 1286885505 156641587 3919103597 1482202642 1225701736 2158886509 1594526845 3671306837 216630862 534869593 3164672722 3307409048 217451042 1162345439 2895868264 2997837834 3838635752 110733187 1173192518 403932478 1926476517 991516428 4127371715 628515376 2503809101 2009145267 4003627629 167476265 588957293 2216934962 3388889657 1479081948 7388957 3808278419 1753729225 576241740 1214376112 1936615502 2780902866 4056519398 57252642 3976349198 2918292894 3834217865 2405312257 321274036 3510820810 1224336271 1652037470 2658206091 4071968231 2726483558 633814798 3347337219 2814361048 3353944370 3744291395 1657630524 702886575 2596740906 3804302102 4128978551 4037387536 2578392625 3798069198 4148897071 4035823976 2902883428 4286379192 2695417837 2749310891 3222294719 2540462668 2515966216 3494521472 2972617122 789746502 2533036098 3009235940 943721723 3901127464 2593379880 3433934617 1000771392 3454934039 704524922 1068471716 1006259469 818298284 2430371252 2032371286 1182084987 2988465070 2965836515 +1872952083 2774354497 +1521033428 3859101384 +2458195759 2835406956 +2674362009 2298012360 +3539145024 57318171 +3498678702 604567037 +1244288354 3419518059 +4075811279 2521091098 +2588355157 1856752348 +1151394217 2916687128 +105713615 3125797582 +87382717 4026390420 +178430891 1762108962 +3549932659 364225645 2403254452 +1223507185 1370788829 +2926138103 2261621456 +1962728360 1962728376 +1084066358 1938072258 +2511109474 2511109490 +4079875512 3848503364 +1650511238 1650511254 +2087512929 1081510326 +1192516902 1481850842 +917228913 2171889904 +2092135715 2092135731 +2786304455 213725748 +1095538514 2687180795 +944019550 4059814911 +341693911 341693895 +84293654 4274670257 +2442051594 767053741 +2615157527 2027371824 +1050961298 785114309 +3750170211 3708164422 +2627489175 2627489159 +610225730 3808842062 +3392441206 3333917393 +3018169676 3018169692 +3034425378 3673140629 +80902671 2154160625 +2342772275 924554149 +1853845771 2570757771 +35801142 1327301650 +4106083289 3445004990 +3137485556 1484967449 +2102508046 1217122460 +903044758 1371399719 +1771060542 1813014687 +1243960758 3902073729 +823290985 2835392846 +3207475244 1379841344 565564737 +2725338040 3610873677 1657002754 +2735657651 2735657635 +1189809564 647633049 3741752014 154988196 +3892216468 3383201519 +3967615256 1623767259 +1043491159 1079759846 +3577813181 238930101 541258987 +969291809 2119089658 +1356905264 3770789532 +2850008786 1025520773 +3885012791 3214805894 +2163996396 4171609473 +2201004058 3424004812 +3925934526 1950436905 +1963815873 1774158025 +1821319081 2387531544 +926376277 1093548252 +276445717 90795804 +2443469140 2579838767 +665418866 3610077534 3954596365 +3010736212 3478640041 +1395050059 822749186 +3437899622 4205354369 +2264722150 1713752065 +840791828 80441332 +4077141301 3299629674 +96569507 2997491850 +748571357 2371339563 +4124677445 4008384950 +3230170823 125678857 +407039598 2673694521 +3387635479 4098341158 +2985047455 2343418955 +3391267072 3391267088 +843963982 326984143 +497259564 3456941971 +3843520562 2135694299 +2374007158 3212842326 +2291551952 3567128949 +1894788931 219833962 +3267358152 1394358384 3902398179 +1695372402 1587147277 +945016115 848261510 +1069873741 4109925115 +3944193134 2698054143 +809214827 1613564312 +751665057 679471734 +2114031231 1468654890 3681767934 +2905372639 672902625 +1757103343 1757103359 +462998027 3256382588 +2181433248 1333657829 +4069798672 1618610608 +3784258736 4093112795 +2602786672 683501359 +1416313729 1708043264 +541618615 3428176418 +3835559035 1605662130 +2503456136 2915396635 +3183774558 4150933293 +1700355284 1605181881 +3820933134 620825614 3008851057 1487276492 +316272956 3910582641 +2923750563 1300068752 4185123996 +3324782190 1702919983 +1190727236 4262556959 +1417442399 1592471944 +4291048576 568239507 +1342264030 3491066751 +3963755377 1561408240 +2361358199 4252564547 +1134932247 1763268873 +2154744819 2154744803 +126413662 982156543 +1128560397 250281572 +3690908658 697759117 +4279745523 2018698535 755068088 2750048236 2280263963 2911473672 527393545 1407125402 +4082117910 490142119 +383081040 2754359979 +799709309 2257456322 +656520785 3943825798 +2609986617 513920424 +2237316002 2413125653 +3544217488 511457187 +276291589 1526152234 3542737539 +1474431599 3352718510 +4121689963 1519985790 +1634913423 900919314 +3064293474 391806845 +1815717214 539993961 +3082105573 1329748396 +1224978086 2529947457 +1268863303 4192135059 +484720427 2790224053 2790224034 +422291614 4048452111 +1360529157 254429689 +500879214 1836354105 +887677009 1277868424 +1272761368 2224376269 +1050888329 604712878 +2069611885 3656214612 +1115367591 714447950 +3145008002 4138622858 2603910563 +2696957246 1730888286 1287231647 +3937631525 965469008 +762235779 141188906 +1216744273 1216744257 +568608523 1700517442 +2498944365 2593820242 +2925762497 1204282582 +4066723382 3412952839 +393280596 1710824728 3812589993 +735263752 92766365 +711917797 711917813 +3427065835 2070707938 +660079158 629898001 +3969152113 3736292848 +1199831231 1405129896 +2139030354 38890490 +4013884318 736610066 +1118121233 280177056 +2824624077 3596498866 +854194365 854194349 +3985146330 3353635362 +1713152576 430887577 +1831925424 2484360981 +842715160 714446285 +951317084 2672199367 +1977155640 4237605159 +1254435491 1173307555 +2980230197 3626086268 +3613996786 211910373 +2013847737 2975355728 +2537142995 1343414374 4190178791 237285185 2227168064 +1011355136 3849194003 +1034315263 200446056 +3914860244 697483183 +1691267538 1691267522 +3990757639 3990757655 +1566453500 3555743046 +1141211253 2309568554 +282357703 1164703318 +3110231125 3076101671 1952776039 +304566133 3616601737 +2332161790 3524776415 +3967809426 3748838099 2493258298 +190545375 1396760203 3221693960 +1792818106 449186649 458762364 1648373436 3706572345 1495789380 3037792947 1660947670 826469831 1847218612 3301896357 307487212 4023452205 3136390682 +3094657730 3094657746 +2922838020 1149791839 +4022691900 2948798055 +2716701884 2768315377 +3635427120 829224388 1298587797 +2312143804 2312143788 +2209088464 3892230187 +3039163926 1086481582 +1320369049 2099696072 +3438625366 4229393767 +1866099693 100132356 +3927205709 3407781412 +4266422812 3304333511 +1780510937 3927025054 +2972915666 1609749627 +4092564224 35940620 +3511509344 3704637989 +4022557560 4238851091 +2893189459 3411723706 +1114100347 74471332 +3617608109 509645650 +3103824166 1643189975 +2524501235 1988629645 +1118072635 1441382910 +4097016493 437696082 +2689202435 1711838448 +1956606147 1509851882 +614819000 1528807758 3237825998 +3803414566 2590731381 110279639 +877175811 1364865212 +2868326373 136340858 +2297474540 1047644416 +1975646227 3931170177 1935246842 2062403430 +1541238531 1243319345 +526578499 309795098 +459480495 3423058542 +2923886283 1598946286 +3108423967 3108423951 +3802051896 4158080813 +730243017 451893294 1307412846 +2773446412 1268268855 +1158275954 546376805 +4061648091 4135851218 +27121201 3610392768 +1691529640 852576972 +1815176735 1277927627 +154963450 3980905538 +3028072312 1816522103 +1928852267 2699773355 +709103067 3470509932 +2365974140 946947880 +1761155858 3895115944 +42720637 2133699522 +2251247980 1041094807 +107579332 344201467 +2659648486 1206816834 +2510124829 2677253378 4253711339 2749530804 +771110581 771110565 +1583549815 216937030 +472119825 1570941136 +1376854444 2607465175 +1267603154 3266178181 +1661198662 2709440913 +2224441443 1172890439 +1963139680 2481921331 +602027132 4179140391 +3111284962 3509040085 +1022600188 4018873777 761979492 +4242266782 2887329449 +2791171762 853044826 +3596001944 39974235 +1597934062 3715309999 +802615195 3931844882 +2006377857 2073818371 4154831527 +4257581726 469317311 +1058840025 1890910179 610555904 +1148592252 1106584369 +2818151129 1189227422 +428562935 761176006 +1593238662 78233335 +2888255742 4292339657 +788157390 3510145881 +862623575 4135944404 2991033801 +720126783 1490311413 +3256189228 3017431105 4080856252 1639509591 3017431127 +1475671060 1475671044 +1524647102 3440129801 +3446797397 332902637 +2259266486 2274828178 +2824572509 1696668788 +2866595228 4210122832 2508919953 +1126889248 3701671781 +1786628643 1764924167 +3283345172 673721445 +3599384148 262151727 +2036069828 2036069844 +4252552089 3418643861 +2360650470 1718159361 +3785618390 3785618374 +2977329548 3086052479 +478464250 3741868445 3707911804 +76049159 700480534 +183734029 893803366 +1370054409 2527107896 +3022878033 4103057040 +2235341151 1766580653 3467650570 493187230 +147693975 1132934403 1924489392 +1382435595 3335391791 +3965371913 468041784 +4039560170 530486654 +2049793072 1173739080 +2074868357 884694874 +1408769405 2895539156 +2954790425 622098895 +2787390815 1444244744 +2480434740 4055202777 +328518232 418934295 +2324830815 2197783454 +4244442067 358194490 +3895982072 3895982056 +3632259247 2152641390 +3720628010 647101579 +73989839 3226017742 +1821431028 3690937359 +141041067 3873879092 +3845654368 232855113 +3339906589 3514266644 +2479046115 3612906694 +1069815098 3139777503 +3195853400 915126427 +3774646148 3774646164 2864968685 +1605547529 807336056 +3828054170 394384995 +474364501 3616396234 +604410117 3268924732 +1106707960 2820254341 3487458669 +2115253216 1506650547 +2187366277 1443510205 +2051500545 2137776022 +3402799007 3402798991 +3054857811 4139560108 +2392005622 1452653505 +3439791076 2786572287 +3609957148 1345497543 +1165335060 3256266996 +1296418274 313519070 581960990 2262205151 2112275032 1296796589 +146759690 1494502302 +1932265213 3479005154 +2177952751 1256417592 +1863349198 2766556505 +1299486760 378242785 +2023557231 3561706426 +3220860782 3349098967 235614636 +3005559197 850773297 +3661571790 3661571806 +4198355822 1565775407 +2188034082 1879864725 +1204218245 2200018010 +1177592413 3683620980 +3377116219 463059172 +3509237031 2185304003 +2995916814 703546895 +2410019810 72058069 +2269598214 2269598230 +447948776 2411156074 +367968625 4158293222 +2185321522 1055138483 +1534769236 1445997625 +486622323 486622307 +745876593 745876577 +1374489408 756426011 +2330981831 2753843204 +797481849 1292681086 +530819163 3457249288 +3659871693 898871716 +134113689 299777640 +3485935178 1619084923 +1995252718 2270926002 1799303289 +292554400 1972314628 +2473946396 1037746961 +2491412629 1248305484 2491412613 +3173287448 3632207821 +1794548472 1514310779 +3969008014 4164760217 +4149722999 3947742275 +2998044090 151552989 +2273108954 597340203 +3676633182 1496513513 +1081427651 1000236266 +3941154508 2569919287 +824116711 1062697459 +320076022 4268813127 +4221796205 2405537924 +1858839693 1160485605 +1422356801 3069659478 +2237784612 1949492239 +1691710798 168274393 +3281310934 2619692530 +3794726386 31495155 +1522961340 2727213287 +1986421780 416845695 +3910297968 2956238544 1476131676 1817331916 +2949655153 900911078 1853703936 +854864552 3731603051 +841786796 2879121089 +389567001 3127614184 1600445227 +4052959314 4052959298 +3047526852 3081009055 +3758874089 2611893702 +3151540066 926457450 926457469 624895406 404494147 +2345499353 3290965351 +4025900841 3923234190 +661321804 659696431 +3081000340 732019004 +3808685542 3808685558 +42035007 817203262 +935233952 1155757592 +1693718090 910104173 +3075672234 3075672250 +3642027809 235758727 +11645340 3015350407 +1953855863 3421386320 +193194816 1621841363 +1655193164 2597982647 +1629426147 1972154009 2479034843 3943141851 2290154853 3646862511 1275569027 3173293887 581300942 179574898 +1798286727 1125002134 +2199837153 916024007 +3384413156 1944107007 +1440876373 2564652012 +867776411 275007262 +2659733629 1905683478 2309260882 1637241592 842965065 +429243795 264080749 +1475879888 1268801653 +2550312617 768310007 +2202451601 73198746 +3403298353 2256752432 +3162229751 130422979 +4198617220 2040217545 +3097920984 2250552091 +2405151386 1197090941 +1598456481 2633999222 +2209947569 3362414145 225239974 +2536354875 3732041170 3504940407 +401496990 1043443943 +3121050361 4214390639 +1556525510 4033810479 +823116657 4068280321 +3095468422 4181405153 3095468438 1328110534 4181405175 +3724252810 3724252826 +3366849516 1575573249 +1379503480 3902387195 +1330044642 2433554922 2928729539 +1438470058 936699238 +1838118221 3319113778 +3454909713 1044423120 +1037129073 3247014118 +3882684223 1589025360 +4053322357 392567863 +362977873 1610149264 +3324801364 1274439471 +3243999093 1093599514 +3933717440 1256771995 +1286797425 784144880 +3991296612 3852487529 +3890413461 2673366940 +2827196117 472281418 +3326799554 3925203811 +3720049196 718523658 +1460008579 2170753084 +1993159473 906466854 +1696997889 176259931 +4036262580 368210231 +690009030 2222653601 +641106341 577619677 +2376316063 2545243720 +627795263 655385128 3871693057 +1969928276 721431599 +1163467549 87001067 +2956091027 3554727604 4064993658 +3493566791 349326016 +1279678525 2288073506 +3843408578 2738966749 +3107578663 349259602 +1769115723 1247356418 +1641145303 3563694950 +2736675858 175747846 +4125515645 3975722100 +521937791 521937775 +3730363740 2431919414 +2434922637 2591828536 +3512122294 4249058054 +3487911674 1073435531 +1255501594 1255501578 +3517292301 347693412 +985553181 2527479970 +3365284194 3037966025 +3232378551 48728582 2726188852 3405842153 +3690132202 2638029125 +1028577137 803486742 +83325359 2516047572 3532147745 1475370350 1872568938 2250269952 2242055655 2682441245 3480025136 2530772801 509175348 977461595 3960894177 3084408858 333036990 341600311 1661895164 1161018184 2237834656 448273424 1698044293 +1725324194 1725324210 +1574231269 2602024044 +3137545589 3673421628 +3803337639 1666178468 +4165632274 53837741 +1998262985 1218351726 +163888642 1656167733 +2738594218 2699001485 +1443844847 3031228972 3031228987 +3253242826 1804834098 185863931 +620977377 3949352720 +653834647 1554255107 4035717296 +2325577958 468838935 +271643837 2349039539 +1134062599 1878134528 +1434620153 1721115848 +3467257689 1648136745 +959729189 2080091141 +682344657 318223456 +3717906330 3326646188 +4094208538 1708270581 +1207437969 3698893392 +2815023137 1136606198 +421586353 4165689555 2488619191 +3773027893 655205725 +1861450442 1934248955 +1327606271 2432605288 +1632396557 943919972 +820476122 3596828459 +3159018699 885023618 +2157390763 2204694590 +1339071807 3831990846 +1577642158 270048600 +3035640281 3035640265 +3715435592 1785487733 +2147514523 465427474 +4100562974 4100562958 +1763027613 1763027597 +2326306074 2326306058 +3884865384 355469904 +2381040016 3529165208 +1740669117 1950953297 +2841710066 3937503304 +398753533 3880528632 +2983583084 1605079319 +672333539 805879239 4175904604 +3941458971 3941458955 +335759268 3646836680 +2436376419 1452497488 +2777919094 494642119 +3605230566 772764417 +211259727 563724110 563724120 +3039560308 2823281817 +202617698 2015042857 +3383225845 1750833340 +3188676220 2921669927 +1093095247 3364431244 +2693590162 2226034477 +3805790239 4048194250 +3722782399 3656508010 +1643905646 3958624188 +3569341668 2070383528 +2936901202 2282123003 +1052796167 1297362095 +557195625 1190249166 +2484360977 755306448 +3168310992 3327462957 +757307975 757307991 +3499160690 4209348552 +1600464512 4237960124 +2140534271 3625074792 +4225879220 3420006775 947208015 603586588 +339555911 593261014 +3688848319 2249374749 +844179082 665679258 364547571 +3373670073 1188191550 +608298470 996339505 +3514455652 664141695 +993297745 2607730253 +3516831525 777882970 564653875 +1842667152 1981439139 +2124044507 670687428 +1626516266 4167971717 +577850554 4066101451 +216874226 1266086131 +1551052321 2857475574 +2187964560 2711491307 +2561683695 1920202360 +2722684318 380952489 +3905576984 67116979 +175528948 2672163423 +1987866788 486561432 +2881930398 748206146 +1697982491 1840128658 +699640282 798762006 +2489842698 2846999483 +2166388786 3372030938 2015180467 +1375047378 3932922733 +1181813132 2801905812 +289478852 3984194719 +1569010119 2192514201 +4029564380 3237837456 +464451122 293259738 +3369379656 1865434205 +946416242 2134947853 +3904435207 1646798592 +2580460159 2674064872 +3721299160 2209576051 +4117060939 2576473346 +3235794371 522723168 2126091937 +916589908 1427831609 +3094313231 3968320859 +907575446 3197266993 +1370690020 2162502143 +2351154725 1210528672 +3376553162 4125777350 +3987698384 3830267691 +3713457905 1354816544 3713457889 +3289080323 3498607014 +1153739960 1738668224 +2679527819 4144952788 +1318545109 2371281244 +250860307 3485377920 +2951900834 3084023453 3837232428 +2810960439 4163404934 +282217166 1225507417 +3307334135 996357814 +1046718052 2598301545 +2664333334 3572042977 +469951120 2827659427 +1266826384 1040066151 +4044858838 933471892 +915982069 915982053 +4263100284 2122870823 +791868644 1667437775 +1500066778 2593955883 +1756859589 3894132419 +940573455 3729518171 3743704472 +2692730611 2620573850 +1079265721 1079265705 +1336279925 749153126 +2422645031 3789713664 +2146994526 2146994510 +290561559 2707776455 +3627530457 951582088 +297878475 3191715970 +1385454112 529129573 +1894741797 3992489786 +2264808660 1978398271 +2086812 3458230929 +2325429352 2589988797 2325429368 3259326100 +2400172232 2400172248 +926091340 827723681 +2131271983 697679086 +1190689396 757646479 +262171306 1132980635 +2978845660 1973120639 +3603678055 2311363360 +1305631513 2602920030 +4009266035 144382446 +658512392 3521706635 +3866592475 3866592459 2569407362 +2816546606 666531246 +2014654986 1562204038 +1140305738 3184609586 +1732716744 1391188940 +2492745014 2492744998 +3364844667 3364844651 +179418807 2791644980 +651739204 2380600411 +920477086 4235878335 +995184292 102458511 +3564626784 3636129829 +2318750866 603201989 +2709406513 1791215152 +4141138080 820722661 +3214317839 1069048890 +1747609817 3552775560 +1089994650 3764871037 +1189258192 1189258176 +671842656 807393339 +2876233320 1225688491 +1713085962 3346647469 +717410438 3601744638 +2614831314 738280069 258242738 3145861502 +4196822398 1216240969 +3200264289 3833578626 +1586799399 4113104142 +2329982653 2329982637 +4052663869 2679050549 2159376898 +3124118737 55264580 +1882633491 1474385792 +2880220432 1936499563 +1580297658 2768543893 +2731339706 43868637 +3240568696 2292392429 +3181252677 3302202508 +48547784 3361089068 +3991247251 326156922 +3558050086 12642007 +3977019759 2813195436 +4003824374 2760714567 +1551288568 2264817275 +1654183703 1301977392 1516185219 +542224513 1637407510 +1361235201 3133716608 +3774515216 979644725 +2364145738 1169250134 +3305764676 1924153353 +1588037469 2364727849 +2353611860 1625037655 +2725247103 893661182 +878149730 3033945962 +2269705051 1389828164 +3794974111 3033786718 +2252594870 316119175 +291919524 3935022223 +3981618012 1974702757 +1773782401 2572386480 +4048584772 1823276856 +2131622467 1174468476 +346330604 1796735617 +1753903126 2337317697 +125911864 2306689491 +1291307351 2165437414 +522966032 3106513533 +2879692075 1958802204 +1350964355 2395111859 1865559258 +3572251410 137284027 +1213721168 1402293681 +2066107925 1986579800 +1670980070 530266819 +2436554461 638890708 +537231322 3670838145 +1423116025 1590854786 +2762269368 3769062234 +2540050463 1958213854 +3901379039 4039041566 +1704611140 904372745 +265808580 4100945351 +334154757 1604266956 +2884526493 2884526477 +2861180538 4051341853 +2527641523 3735406284 +1758435539 3519910949 +3048228450 4073578822 +2716888822 1735050966 +1396199501 956669701 +2059570489 2034520254 +3310831462 241526145 +4019683829 545363114 3980993491 3590129549 3590129562 +1786081201 1205785510 +4109092477 3073313488 +3879956252 13886928 724035857 +107249924 2157467784 2822407549 4012779844 339155295 465358319 +2009167058 1566016870 1155126697 +4125137753 1390028350 +632755818 632755834 +2146280929 1131296852 +4178416612 4099919871 +903721761 903721777 +1189061211 1053327820 +2083297754 1412837931 +33843265 1844452928 +176167124 17248808 +797057766 2950492161 +3542742941 3564198292 +2571199599 2968591032 +1401395068 3240322604 +1084174925 127676196 +1126972782 1126972798 +6586795 6586811 +3384660017 3335437606 +3920060585 4133437077 +2676398352 820180003 +2359687388 1600382352 +2281250686 2334954313 +3843527408 1997152159 387948562 672390686 1078444220 +3470510068 2549859599 +2527506419 573964497 +1768341737 3586240199 +972817565 3837477666 +22031931 1278789348 +2072818954 2290155195 +3206913568 1852569496 +1576323883 1576323899 +1468551389 2828487650 1210873026 +713762024 3775600939 +215023252 3442666985 +3763918802 935151821 +2742403571 3631630033 +3193585768 269706173 +1951396233 2732145326 +3302725954 2867381389 +1603659229 1442372340 +734504480 726559483 +3051903367 4089776294 3051903383 +2476036477 3708679797 +1074414512 2150141443 +187056508 154736177 +78281651 190888652 3041267511 +3723536358 1205358337 +2531107072 2128900883 +4259226541 917217017 +627652502 814452394 +2313922185 2801215928 +173184578 195323832 +900178681 147729611 1877315048 610174664 +1718670570 765406285 +1393383597 1795332178 +3294781932 937204993 +847632361 1907549144 +902452122 1199676285 +2256486947 2298270471 3713342748 +3674735235 562133616 +2717551080 1430985167 3848738868 +689867941 1612146604 +2872909100 3174362199 +2883803879 2112362912 +2146071701 1929764799 +993559653 2667080442 +2241444181 2784936138 +111893811 3055127735 +260097392 1736272904 +289692277 2744804924 +2928351290 817584022 +3840745798 2806735159 +2110325091 1718431434 +61395709 3217302603 +1509517917 4077954417 +3031343587 1374214236 +3656808102 3304900417 +2343770128 4209959203 +2866692019 2933802714 +4047436194 1050585816 +2934093540 149792463 +3055288113 3742546470 +397211812 3914033696 +2705521496 879864717 879864731 +1078049033 2658359763 2016752494 +2460323009 3377380221 3380392858 +2475430425 655392207 +1938542183 1276505142 +3131952816 3567704132 +1636689386 2086727501 +2287305119 765380017 1033571678 +3587761279 594523105 +4011792995 3505818058 +1686881743 372685247 +1315410587 182696319 +1712407833 1530217982 +2482132616 1853765661 +947698107 4084957723 +2378353181 2514531723 +3665493500 3665493484 +2086096411 2086096395 +2803020834 3992668633 666655022 +386628025 1089086 +3303245118 3181844314 1807801310 +3177522827 2973478100 +3418952535 3418952519 +2035925061 28125795 +119308622 2145357263 +4204817523 4253726988 +2013064681 770742364 +2262392189 850325640 3308137428 +4212038831 3875579768 +1739266456 3394849357 +391277380 3279184441 +3441469634 2892605813 +2570345069 2590661010 +2145102822 751803159 +1784320296 3751977283 2514892176 2492629483 +2463774053 2562456129 +3640032820 3221793753 +1363715741 2455652660 +3972276244 3435036537 +1022212197 1329153779 +630982009 2912722302 +144694413 547893732 +198419442 2418742771 +1322483942 1257865767 +3799374785 4125813323 +1223364817 571578696 3544311510 1317435443 +3202260579 3681768924 +2668935207 1418729011 +794168554 1853248603 +1349768290 139941443 +3929740587 3858911906 1169940526 +2071929792 690308933 +1489145582 2823225529 +2166178277 351035855 +2836094255 1273213176 +4257257649 657481392 +3943411807 1650894238 +628355974 2072534007 +1063109536 271469273 +633198098 2077752915 +294076485 3706334348 +4238673310 3365446057 +2166964448 1944785504 2500566112 201882105 3073837796 2776293489 2859965720 3122250958 2225627830 2454887903 1005798796 2359827740 1438980610 2628108418 1114054051 1587574659 32674878 915937651 805063772 2608805052 881946189 3709877637 2770123770 3755846687 2374727500 2946005170 2868707883 2348166712 3723451330 3146907537 3173293555 3885443397 1857698215 2909296102 1444546914 1915883920 2425185722 3861676939 2025624142 4114577217 4014584401 1777907368 1953472968 1229213139 4258539728 1710865509 2606389663 634522006 2521247806 314300587 1339423597 2811874800 2985549483 245426505 1584493093 3021987000 1174078730 1286178669 176092807 1813618059 2367747235 3025068275 1977410392 1035889984 1955253546 3776683551 2354136497 26242502 814563864 1602244368 2407282818 360822425 6068716 3051298432 2226579551 3229711746 941962067 3085958459 3386121425 3535541981 2321477248 1562378947 440615945 930394900 3392948096 2798479800 3785688735 2751010039 1147301774 2886504677 60613335 1502103146 2709730318 3408353988 882118590 2713081874 3031684729 3310455498 4275282398 3950487357 3990084884 3914666230 2714939211 131561309 2556887383 1119047323 1367293299 3778131764 400762633 2174440101 1673850869 3161811279 1567262086 3612129314 247934563 3049640279 470850491 4118856086 815463918 3795706051 971377737 1952033662 335565814 4151889552 420741558 1257549325 95321302 1489848882 592350898 2077506470 2995739617 2503550660 1263390490 3117046151 3187128651 1335042686 2854076917 1919056601 1972896169 1523883676 2326899430 920079047 3419940379 2364826969 3825020897 1078064002 1932424294 934252578 1805169856 3697459823 355191004 134550378 117387604 3786365140 1281971435 1337212906 1789212103 2131941714 2741061333 1433890681 1431215017 4102811471 3280089717 4198569394 2036016895 532229530 439622705 4061793311 4248139690 2380994611 2983120190 256892106 2688872752 1952985821 3889981856 3179411379 3061476183 448482821 1558593394 778225582 3539102341 2156997302 1073415582 3303801355 1872624266 3443292044 1787519556 635121193 3255187980 2752815401 1727216053 3616416406 2900373809 894502220 3474922555 1467085655 3930521539 1335907395 281153778 4235585790 3047875472 1130855136 99420814 1118819878 2324251561 2093723731 3292350143 1935521298 1772786638 709609321 3036914815 3908072508 3477495320 234780429 1179340477 424186889 1916905325 4099858621 1577215212 2016058768 2800503742 691811774 3156018646 116782895 2123186205 2989015466 1675973232 1043516641 2234444242 1762410583 1043328329 3489491275 1706230365 808500375 1391032404 2007061530 244114381 2362648916 3472375261 2038756544 2133284069 2933906063 1247396531 2316182461 3846391764 3104849556 221176895 3559507548 2935590642 1769681542 1655756442 2277675158 3724871107 977747224 1259193061 3635866656 3513129 66167432 1098366229 915296772 3529858537 1122734219 214003250 2862515028 2461158426 3421933922 2228098749 716555562 3333912787 1272816325 300075062 2250098923 2275222209 4183350308 2403148117 3563915088 3395873431 994865142 3285360380 4042226151 3477330385 3011051509 1927609907 2770143770 890784428 2110143246 1455714443 305817506 1644683263 1983284846 3084980492 1021635325 2284466831 3114571002 566502611 3085603457 845800517 3630759041 2701838461 57873540 3814870533 2423424868 819475950 1458836630 1317707703 927370755 214714918 1033995039 3737019901 595638776 200664955 4139638071 113095878 4044996601 2564463548 3181175059 2257622039 139402072 2069897149 2158918699 2919933127 3912437113 2709810343 3423095898 2242874809 3102912804 467944172 3416364303 2680430794 1990168894 809922724 2219007994 3259589545 2283374551 3670855912 1734429479 419543629 417768067 3379498064 633792613 3456800107 1014200796 2227694480 1789834794 2051187279 868766373 2200491286 3254888861 1834654239 299129512 1551283906 2834132321 4026292904 2045682259 109051049 3710884061 210206967 2260598252 361465142 491021849 3462835765 2659924788 3096614609 1573764643 986994915 3801844298 1529736672 1651491564 1478366046 504457772 3489631510 3644246072 2263003510 803396852 3357149482 1970599400 2986305884 4247347813 3784920489 3252475507 275958419 4272695718 2421568111 1409457005 2278846992 3500638946 3880641003 1807407819 3208307385 1267744806 2015480389 2913278440 3748967299 1281506621 2065473720 592226624 449197785 2572172573 451464034 3433731954 1438273005 1120112761 2065647270 807572087 3224756339 1111071097 769697392 2682052865 3732966775 3471895976 3519342600 4165043792 1535013408 2990031119 2483000241 1656738603 1928570029 3295553627 2022618873 3652674760 2647161282 3121022565 416048295 2125268832 124716096 1798985713 3746823332 960151488 117297071 1409041148 3771784514 4148395398 3537127797 4170178947 874881991 3806825139 392008253 4234564303 2248124612 4253355186 2663412073 3858771012 157000712 886999766 1645976077 3000553517 725533687 914485227 2025983848 3484726385 4007211641 1578141703 3363444386 3799071785 171409269 570211654 3941616014 1171021708 2596820866 158194188 2371032988 1889786939 2429543893 3794568039 4287928615 1338414471 3655294486 2820616726 2253231052 1029406301 3622959760 2108520098 3763459411 3145731994 3749702230 2243222267 2585257123 486313590 3969583387 877613757 1538531028 1129391394 442026390 331199111 4089232754 3690949708 1784415685 3810436695 2731486159 986349761 1002021876 3183469236 3438993911 2916864315 3375857235 3944698177 3744910231 1372622092 3883956127 3788842742 3227092872 1881987881 1968921282 3697179719 3441773867 326835738 1462049264 4252607769 3405158765 1942439772 4034793193 4089977857 864413651 3033029766 912638051 3231575294 1297098907 2159198562 1865298 1054103351 1869152940 1246793230 2509304913 3709952927 3006780387 910227345 3069889509 2751333695 1874710437 2238802851 108594593 2762386124 571927978 4176046055 1166362007 1186546698 1849944953 3038978016 3387073261 2183888212 3623345814 3206879395 3471011927 2392013374 4159238023 439693812 1612834924 4012161969 3612497089 1493855726 1487669391 2400714550 907336139 3533983786 4038267157 1826777956 1795835868 1173695740 2519156248 1996163131 3059514153 3966563035 1484941762 2436223109 2841605770 391270653 2880646280 2847429512 2695874681 4057609997 2507855691 1001709218 1846202644 3795661518 1440426257 1846178305 786204977 2839778093 897239276 158852312 1401454651 806422636 2425096856 3746067789 741211218 2960010859 4057108684 4034786887 3876197669 2546374473 552655980 1624772858 511766599 2124100666 4237165791 59067068 497168327 3858121617 2270082035 1351664794 1228309351 439966720 783581498 2117125164 3980715306 2731582066 2348714233 4210566877 2689645834 319457764 2465708791 2761784357 714500490 1326353683 35764914 1058414847 1713435716 1498701249 2305490986 1635096050 1046454929 1514768994 365967583 3547803795 614790462 3630763754 1784705861 2917406873 3018952458 2133355782 2253470463 2774138924 2085311897 438870190 2364498975 3407524565 2422859234 3823168027 1040447603 1452518733 3503046425 2304319265 3218009296 2778805063 1127230140 1420429337 3133153411 3395194876 1182906677 1736536112 1098898372 2159077097 2534370460 245199562 3798159421 2360326671 1858038725 3846740776 3788480447 2467683627 213440268 405431938 141608419 4253001553 1087148865 1843997180 1271817502 2077972936 4085169442 179182722 1067419637 3782932349 2985477926 76796053 2799376357 2478304222 2248645848 2283524313 399715259 2193957648 2332983760 4121005815 2019979838 3910377744 3474955382 1423488367 2775247358 2348876182 3935140986 2695977922 3727578594 829077261 735471984 3105487050 1303498457 1818542740 4047541080 2957350266 1509335620 2867394840 48859141 3546080277 3878684913 1806826920 4115752721 521085368 3760121651 2869335396 1297348948 3986056235 2505571116 3591410760 1053620629 646419482 671385252 1152259851 2455265384 592265973 3851130412 513361891 2045506386 2260528178 2178360016 562751989 3495779014 994975142 1313507471 3121963752 2184519717 3109411300 3866665800 2184975982 1521760701 773719088 2845698167 4219540675 2303594585 1952958182 1729891200 50307373 1388660314 2469042744 2751681375 3204908604 700911731 2135386596 3215589585 2232190527 1546112113 2978631325 2274901630 4209534386 2268956281 436607450 1375665718 1787243343 4136100440 3433471310 1726006291 4103737088 1764087825 2199323747 548961555 3761619219 3080959449 3449864234 4184837349 3922043949 4243373902 1600449462 1843423886 2878558679 2463341793 327692806 799630356 1029345091 281408875 2589224501 2133513112 4052609887 1428071870 1636414672 3220191295 2057629348 3098281678 2958254902 3379424268 2076701136 655888750 125233359 2901857730 1105609792 866844561 2263352811 1661425792 4024741714 286519392 806270227 3572556500 1831396845 1408611666 1444290547 3919736025 2278930419 1903108853 4224255828 3324551674 3333468578 3073729688 2804753883 4136141924 2498181085 1529914578 2962026540 2532856848 2821863991 910236331 3756207233 3034694051 2328810006 3085100273 2311235637 1032257548 1451782118 1801158459 2903827277 1214361959 3026143032 4288624196 66359548 792303185 3624078779 1779614377 +2702365016 3902770573 +3643506815 1585137662 +899405971 4149604218 +2119102420 2856553145 +4239779799 2841376624 +3025173170 2917081691 +929398143 3016003326 +1795289654 3381139956 +3995516213 1869494240 +3489300314 102964003 +278972102 4078496161 +3951317229 2740501467 +3686729739 4172917058 +529098032 8159910 +4240067279 4240067295 +4278574791 1027453782 +2067280520 3962671540 +2751922267 583043103 2449837892 +3591339049 593523854 +106111699 389055789 +1104916753 2845822164 3185032656 +1405730194 3722282165 +2708885783 1145153318 +1192639695 4021784332 +469164704 652603932 +943174057 2722754181 +2765714944 2186592787 +1065783554 47597091 +3263189181 3976141186 +1831822740 1831822724 +3607057581 552750148 +3718720745 3609965262 +2080146053 3011606362 +3301744765 1260430548 +1757808828 2881470439 +2548064905 2671451576 +3833475894 3903495694 +1929806306 977384182 +3956808412 3956808396 +2121124617 3392001316 +2835164974 91005042 +1034009668 1234919177 +1301882885 1301882901 +317721182 769675753 +690023122 2429659269 +1574102287 5651185 +670008563 3507374746 +2837020881 2373678176 425210675 +4084376370 3130208820 +2578882287 3917230648 +1822340862 4225372617 +4246020734 3863301193 +3016523566 181935545 +3515608204 4358620 +3798446003 984113952 +356906370 4280384437 +279898330 492343101 +3458579803 3764983378 +1565306278 3548404977 +3674743012 2034011333 +1558394648 4122920640 +1920812874 2234988923 821001394 +316859299 1579964810 +1731537712 2830302357 +3065661749 896661555 +1226692227 1467838064 +3558866665 3412887909 +546546738 2053864101 +3681561776 3637443113 +1434989173 442986026 +1208990120 415318909 +3660834194 2933176378 +4132986541 4019585819 +2747370151 1237547736 1890403561 +4076355495 980789683 600585184 +2694102026 3559130043 +4253154526 3496256333 +2660364421 616407386 +4065445046 750299803 +2725919004 2056306641 +170496315 980393970 +3759201931 1937097506 +383203905 2645793353 1728225513 +3411995064 3731483835 +642127203 2740169418 +1174191253 3252477578 +336878339 2668316074 +2134179645 2104347924 +94953709 3587839259 +3033950044 159692241 +372828557 372828573 +658586592 2880520627 +34644328 34644344 +2517616342 1675893338 +1467924932 3671903897 +3191137838 2478059736 +4096329703 526377562 +2211705869 2477338724 +1986175386 4148454781 +1151550493 2140291217 +512390125 2665646393 +801097845 3843748365 2682818602 +721029866 2443128411 +4047852386 787473003 +3598745385 1319089806 +2573944427 2120541327 +3226835431 658648562 2068577785 +224718551 1525048404 +4048876395 1404776821 +217718713 650113064 +4290982595 1665722620 +3734778141 2363576482 +3559658191 3785905435 +974833079 273460862 +490055884 2667547680 604729057 +2145970698 3273964901 +366144262 1032803411 +3675690734 3678416049 +3557923361 4255978237 +4116985288 348170717 +3542155996 955744327 +1844478002 1134153381 +1390183011 3361384196 +3376837315 2632362218 +10056447 4035970942 +4127764110 2195409945 +2186166256 2186166240 +2833059 2833075 +2082698250 3218858550 +3789601638 1581744294 4207346071 +79669989 79670005 +1651892523 714176180 +2709399669 2929307690 +2742602805 2742602789 +1938291422 521124073 +515557506 724376006 +4022870205 53049250 +4265769063 2846067241 +1525818611 506473114 +228755895 1169795636 +3511237026 952357565 +2211514402 2643420654 +2469703371 778247055 3925498526 4177959209 +3820137168 3293525820 1111680373 +3075339872 4021999923 +2461849896 1219701721 +1712877073 1712877057 +2474128139 825776706 +3383098798 508451055 +378570449 1451506438 +645406068 51797391 +1816162478 418205548 +905376522 4257257650 +2484855246 4125390671 +3783359562 464325878 +2835859655 544090052 +4225558413 163611364 +282533002 501773285 +3141980157 3362682156 +3597139813 3937864698 +3061739245 906534660 +4033622705 2084298679 +2487498986 2487499002 +1851861104 2298412508 +2433667676 3059033799 +85929268 4223418211 1142171856 +466900667 2319747186 +1638366065 4177031159 +3608549055 1455804094 +2682146974 2664850601 +1705017847 3585277026 +2478547156 2011617215 3934146304 851929235 1857600621 2137366974 3537044890 3833480576 2179393388 3934146327 1874378227 +854360420 2387587199 +1945483283 2664482277 +1003344299 2779546062 +268631701 1286244019 +2482174101 2298483132 +496903261 4243799668 +3575225280 70972656 +3232743027 3349729036 +225092291 1892911283 2161353171 1183968244 3789437152 +164046942 3263466473 +1298786540 357264101 +3210560855 2951480167 367378128 +3798770554 3969937693 +3471581318 1136079585 +755757137 986402694 +2524646331 1470282838 +1173002003 2086472064 +1730714453 3119285980 +3620241383 2543933622 +1092156282 4099137821 +3967945245 1840638900 +1313959024 1794302411 +3106959002 3284583089 +3376042750 2366390394 +3615209089 3099610368 +1069766391 502087797 +2996585877 3238103434 +3954115898 3065693186 +2262329220 3400201439 +3961914744 3659757075 +3250364543 2062591998 +3640155525 3464082858 +2725512888 1957073851 +3510672384 1756730387 +3183656081 3183656065 +3983851645 1865096337 1848318731 3798847466 +1829106465 1552971601 1910555959 1552971590 1829106481 782523011 +1474593815 1624972180 +3449450495 2837335656 +1409014028 4006852896 +2455314131 2189946818 +652027054 2480265768 +2729859578 521118859 +2202586861 2560474898 +1380636312 600822107 +674550873 674550857 +2541953791 1141978104 +710766254 710766270 +3458679610 1200418966 +317178732 317178748 +470808725 690876204 +2641117875 2221735884 +1716487432 3364681887 +1888410877 770040386 2195926517 +3657309627 1950093950 +113912457 960558510 +3704547442 3850872346 196602739 +1800382179 3512973130 +2184421764 3684705515 +2211918111 2211918095 +3193834094 1399241465 +3031899601 1599480343 +1099504746 1925157503 +223944967 172949014 +1874051003 2465649508 +3282763221 3235157040 1271106410 143107837 +3136445694 1233675231 +3848064989 3994761460 +2674714584 3497064731 1996663584 785911667 +709676905 741023950 +1775753681 133692349 +3183255368 4159618653 +697887975 1656549280 +1882777202 462603621 +3514745923 3557585456 +2939691927 1818232496 +1321384913 2617419638 +1878347666 3509338821 +562500469 1017356586 +3134874439 191927410 +1104122220 1104122236 +2715325240 2913075264 +2881211396 3409060420 +1919097010 3288326181 3201167437 +759754178 198068323 4173067210 +167968229 2097364252 +2227081460 1985333854 +1522552418 1052468291 +3035370302 4247409125 +716416448 716416464 +2989900023 438588259 +223440442 825263435 +3412658079 3412658063 +4151773721 2573519928 4151773705 +4286814936 338477595 +523274057 3471983954 +568932641 2200235766 +4005358095 2489627121 +569668975 3805601198 +313901068 2149405431 +3902087885 4022716580 +55845994 2809483981 +841826479 2889667438 +2020207488 4224061956 +1123549883 661408882 +1439283210 378320827 +177564042 859120699 +2740570530 2740570546 +1370985436 2147337041 +398531309 1375560452 +3296715456 357692499 +2724623916 3544975191 +2883407938 3479525347 +4127894899 3318680588 +2576879832 2455923403 +626368525 1199492978 3536516196 +3898410269 3882814626 +3751244286 1211474786 2121061641 +3380192318 3380192302 +457278752 136614245 +3006311172 429733705 +2995920882 235424229 +2369557556 4212218995 +3708750708 1924073369 +4265124975 871977621 +966082134 1923729642 +2763995125 1308956330 +3867653531 810156368 +2048348405 1417774711 +2402515189 2830074473 +554207285 896428906 +1908888857 902493768 +2075714277 2836213356 +2187378977 16446790 +4120927049 3855030507 +2370180274 2047010466 +1492718232 2920483055 +2894122105 4149254952 +3753599115 5886219 +1138679222 2379679111 +1553522301 1101414091 +3704777727 2654995048 +4067418228 3133298987 +3208457597 2320407490 +425792694 1956386962 +1832256783 2445318897 +2185025320 767996925 +1381059803 1895562436 +4189145857 4189145873 +2222032982 2091394610 +1198992682 2862356749 +4116026526 3552113855 +1527738315 609025172 +2034841607 4114821888 +1410207611 3441581746 +2868059869 4189689314 +3243497412 452766089 +1436358222 850861103 +1298818743 1298818727 +2495319139 2297897565 +968850126 990745817 +3139332209 31353318 +2763030001 852902502 +1631523676 1917548999 +1660922286 2652212270 +759768423 2972049696 +819721772 373589825 +233651835 1736006578 +1248249746 2982947525 +2632645441 1189709632 +647319418 923540747 +762838662 3146729681 +601492173 1027539122 +1692480168 1692480184 +2152698458 169207349 +3757862564 3214535834 +2845295123 216433658 +2638780413 2521252692 +3588182583 3851316358 +4135134037 1437769430 +973227065 2324784574 +4286306253 3879546162 +4094797766 1972771266 +3923570865 3620660911 +2119187943 3627516722 +2646350352 1595737909 +1195096616 1258687741 +2161314868 935904392 3945945 +2372293128 2685608605 +1413552576 1652263237 +3533586348 991837143 +179961111 4190726960 +3479695684 3298872841 +893643938 2079163139 +1961505213 1961505197 +3782557694 3918773471 +2976336603 547018445 +423986701 3581019748 +2513434903 3753284789 +4202298581 4202298565 +2191260724 3482191311 +3014941907 3085836332 +3915922837 4249107514 +3537026634 734105211 +1615939918 3992348121 +1850782932 2481925695 +2780737386 1429087195 +3033817493 1816479063 +1673180649 1311042495 +3378916991 2131726396 +2241673299 2147069120 +4140131773 901720212 +749261509 2755284202 +1397950634 3585516429 +1620573592 1769366488 +1114052835 2373368474 954946803 +1029316921 3644772104 +3251538757 3167473219 +108886503 2925334002 +439594163 4065910220 +2631174072 2593236653 +387022531 1621144982 +621591329 3615048701 +1026600415 849458718 +3551249282 2091065245 +2651691757 3161121554 +1874357922 2651188590 2644676541 +1903030013 2366584916 +2572799522 2321514371 +4148105250 1514562947 +1410057061 3011811322 +3060702546 2183243781 +1336556016 1492726979 +2941400708 414924655 +3750727148 3781748988 +34121416 489917626 3295059334 2983467315 +1720909898 436362661 +8205242 2132307421 +2313575065 2929762014 +3716061695 2907466856 +4101813913 2035512030 +1601375666 1601375650 +1555029622 1260587730 +4249965804 3003690881 +3381323345 2975667702 +54108389 1708481 +161648393 870787886 +4081347771 2948016754 +1690458616 2072452755 4206168908 1318550144 +2615832818 1678757107 +4132385306 3635142379 +2182292073 757017415 +2634927278 1888479022 +4049865084 2088431153 +1154867178 1154867194 +2845978985 2572196415 +3510734754 1184574366 +843039347 2371820314 +798076767 798076751 +1289300208 3752165452 +2097589050 2097589034 +1256788804 820597769 +386649524 4220834393 +115144714 2280291186 2280291173 3306576262 +3152366993 3152366977 +3638051581 1500607572 +630054979 1633159530 +3149342923 1280653186 +3119990662 2525903302 1178966007 +3446790175 2302097630 +252587141 944772428 +2579175578 1101690485 +4267941251 2849012772 +2727937340 2360981735 +1067734194 1614934866 +107454367 3603969628 +4046522241 825151488 +873201691 372174280 +2845646869 2845646853 +3296879901 1984244926 +478072001 1679294509 +1645731389 2828196354 +3398753210 2723538397 +903573966 819588997 +3552042861 3077879940 +1397816480 3363680229 +479370135 1299811465 2136488888 +1104868796 1739642599 +3223125113 3869340286 +655618758 1248275873 +3131581601 2008131958 +1430599565 1430599581 +1371076297 1865186936 +1123067632 1290861704 +314432924 196360263 +3230810721 3447359965 +1145065808 3838911664 868322471 2700005036 3242197244 716208807 +4166897050 2510989675 +1346011434 1981371675 +1186913074 404862682 +810956732 1046769520 1155677079 1046769511 3552165105 1698240748 +2871107561 1324268504 +2670391150 4136806383 +2737828301 2977539506 +3940923182 3770822842 +156025825 2228771616 +3628693398 296173873 +3531505052 4179606673 +4117234445 674720357 1606208882 +3365840560 2176870147 +2311397105 2105185757 +758187206 3928654753 +105732331 149912344 +3195699175 3252115616 +3805288000 1301481171 +2279673074 3645333747 +4213818474 3435147995 +1957608579 1957608595 +633988995 3870757233 +2173882158 672933241 +1684827634 145822714 +1515877168 1521718857 +1673244829 2641823522 +1049648431 2890051832 +3521898599 4278146638 2622578803 3521898615 +1299363683 131025953 1538374493 +3506853428 1090106329 +3759508541 4276864020 +1172890463 1822289566 +3311725807 1580010540 +2413511805 2441912674 3657087505 +4165150162 2746517893 +723697584 3841623836 2545140245 +2502980790 1105898905 2437397134 +3126404255 3965414059 1225613772 +2432942940 1969027651 +584462103 2473672660 +2749225328 1199412957 +2206561574 2973583322 +1655634394 1655634378 +3003647129 552918296 604666977 +1063511802 2197871555 +831385063 3916268192 +4211892865 3045003520 +1686725199 668001680 2470822481 +3129096662 4219335254 +976080812 1109257175 +1367470086 2937086186 +1830757593 2453939691 4086526558 3842986598 24492227 894423738 1442841960 3798770016 +408383668 94792537 +2501305851 2920024612 +728108424 961758674 +3950269630 3851769310 1713465119 +1841870494 1895266985 +3023002884 1500552516 +1307539267 4076387964 +3751082557 881192468 +381384532 488429881 +3315728642 537368099 +1178696643 1544934378 +1427374297 3346879902 +2291842775 689484884 +2250684721 14866259 +1419197845 3325670872 2381033000 3688445124 +2862496663 773312176 +2410103935 2739983336 +3307393905 3335707376 +4091264002 4221171010 +840642401 1103861152 1103861174 +858006192 2629444125 +3042495848 3072312480 +1994348935 3998485696 +470760406 3651636586 +3393229053 1687028213 1621376578 +3800486268 4235364879 +3990954551 2959662224 +1696479507 1100208378 +4156113445 3788225354 +3317561328 3317561312 +4170682181 2610334092 +4046516287 4046516271 +2459447520 2778001587 3591976408 1316410299 962470471 206379228 +2428838379 2880149141 +226348127 2617817480 +4270040466 993895635 +2566808314 2566808298 +513228939 3004865218 +2331446501 2817084538 +3636810425 4154538280 +53811598 3943771919 +2814579631 1206184902 +3400974247 3299849206 +730542861 2569100644 +3053754589 1715250146 +315533467 911436804 +2356743858 3143694182 3566346789 363125597 1047208841 1757413918 3574322765 3559618110 1740636296 3678459403 +2962701090 538056341 +1395409311 1286252636 +3514670275 2344470268 +1355947636 2932207759 3130638536 +3810390513 2032393840 +1292658966 1619619239 +3448268811 3281907512 +115480921 787343112 +3666314210 3847527637 1275914030 +4190034545 422218444 +3887574728 2788296693 3383018352 +1613568265 1878944056 +2787437469 2190573551 +2639919642 3466901245 +4208076086 248550407 +1576381692 3854520497 +1584611205 3784599466 +3374986554 1285543574 3882994269 +1623521130 3222371291 +3849488722 2236492819 +1121816513 1121816529 +904441712 65756380 +2312635131 2312635115 +903577047 2676431216 +2436787673 2436787657 +1946349685 901143066 503710547 +1412303341 1903796242 +3580228563 3263092012 1504285783 +1108151328 445257317 +2472765631 4079937898 +1069241403 1069241387 +3068762151 414877024 +397984899 3671939644 +3400447645 2919856418 +46100045 2846815736 +2038429117 784141953 +1393561610 98590234 +2531633683 2659892204 +2754304924 3752389763 +11587544 3998691611 +1733654358 1734571827 +2948621592 2810977504 +3689120698 3689120682 +3836978413 3709964114 +989636568 989636552 +2170423092 2724706207 +1332281106 2153680446 +2444891731 3136365754 +700170694 2022836897 +1723415255 2358747238 +899250825 1852477688 +4052004013 1276067090 +3304425025 1333942336 +2193259982 178520977 +2193346230 3388379858 +2848469618 2821148757 +255512216 2952223676 +3098722827 3429332802 +3754657696 3982917875 +1243843469 1123331812 +2750686741 3236928201 +1160394873 3878475870 +2868108248 4125299995 +3237743611 220096735 +611064274 3511199354 674014611 +2553101864 60001168 +3323789723 2057930500 +34562099 2646808092 +3366806004 3706794777 +1079767079 3681947172 2008747360 +4253260562 674045253 +2346065978 1067636501 1067636483 1544862539 +3376227859 3728928748 +3109966592 3481053459 +3690962968 3813941683 +2600274537 3400084799 1700225880 +2102414549 443085635 2666718717 +3091271847 3043833590 +749931960 366909627 +684454171 684454155 +2077590250 3628181798 +3263519946 3690860917 +2115590692 1203447204 +973700188 3102655687 +1766770926 3396572590 2817383791 +1254689614 142396367 +3699083127 1154501373 +4124266067 4113023917 2024059607 2024059584 +3744758049 2157620982 +296877246 1190084041 +1959100602 2364122333 +2286116905 3636985742 +2496088196 609460601 +1688268221 3687287970 1665146059 +1483169683 3183178874 +1362145644 3077621647 4116597620 +3024377640 618714947 +4038110886 4060005873 +3586064024 329959771 +2012229125 3162192445 3558371802 +426260582 347224986 +1199824124 2425675953 +2941951166 2941951150 +4232896011 1369667788 +1210727696 1210727680 +3058784053 307625690 +3571184532 2856350191 +845866126 3963997081 +2071993820 2796524680 +2490318747 2442138939 1176576269 +36129593 2631625406 +1693692398 1201368687 +1123050881 3782199830 +1768436837 1182767005 1409972986 +1020510822 1020510838 +3737756987 212962126 +398247824 3996002211 +2080021249 746717824 +3570221931 1361978530 +3068716231 3080725833 +2696255583 3003244800 +1692552451 1421953911 +1408769398 2778095825 +2235028863 904206056 +1357466848 1061422259 +243951261 3077114641 +417682660 55343899 4283200728 352625407 352625385 +2459156725 3013132732 +3006330881 387344790 +1758619286 1499174753 +3791903127 1661962416 +1487570902 1632283552 +2070355112 4014135491 +525890489 289287230 +2644603323 1071695976 +2358053342 3913867262 +201232966 1337273943 +789446969 1959112478 +3120929675 3565358776 +3660235741 765173716 +1361696155 1608205074 +2705904364 2319121491 +3469922358 3420308743 +2594258435 1859428010 1859428028 +2834092841 3843435150 +369521804 942241911 +331185030 1168215505 +699186454 824318002 +1075014975 496302632 +35613874 158866483 +973783143 3018324083 +2554909562 3936017474 +1095009176 1013115140 +2387456495 148562007 1032313132 4082047800 +4178869442 2862510286 2942278365 +2992721995 439444994 +1852628709 3591950968 +1673124255 3512766753 +2095324297 2168128249 605612974 +3192969692 3192969676 1967584593 +1400173281 1316547380 +2611008480 3727526323 +3220078506 3201158250 +3055962798 1816629241 +1157291055 3320356334 +1831038023 365130688 +2467777329 1304769985 2467777313 +2565484474 1923686859 +1246530210 1560323603 1593713006 297405354 1055549253 297405373 3354837294 2558409987 +104653611 4067750571 +1690614215 2378404186 +456827375 4178260519 +3899404606 245348553 +3797028270 4113271033 +198039011 1035414237 +611348881 660026842 +981216968 1163132170 +3251880065 328823729 +2366290172 65090737 +4193913287 1268606016 +2080472171 2706824290 +2417737306 900507581 +694114095 184885356 +1762504717 3852296036 3669830271 +3750542485 2139938442 +2851442477 2269981166 +3902875117 2869262405 +4231274884 2316354271 +1446707718 257840994 +2410694453 403345567 +281560045 56411716 +3760626139 3083088836 +737114230 2684002769 +3034356202 2705738573 1017684050 +3707411438 3431167929 4155824970 +1278296072 4186426507 +2444902090 842061819 +1917327788 3098098556 +1802481285 2781854554 +290528066 2225989877 +904325253 4088111453 2437636666 +2462105717 2054092860 +3464476311 2852941744 +829669123 3601625883 +3587196863 1440805310 +331262760 2422723472 +74284322 1760371254 +2766678199 874121761 +3577906902 2377794289 +3993009105 2076371472 +414620714 293066267 +2660915199 1789019280 +1174164776 1594598910 3092630678 3261186559 4197704554 1876616952 3968013740 8750834 4207662148 592714668 1140882468 1457675061 +67393576 2060895979 +2800772574 2997926421 +1725965622 685413393 +883781912 3800061048 +193406508 1371608897 +3048310301 594943924 +3395732698 3769277621 +1231995002 324599837 +625696012 3248716257 +2248282027 2688461364 +1408519379 1249467734 +4248770971 625696012 +360971382 1422290385 +189034483 1301249421 +2436644684 192424288 +1721446608 2146200572 +816127156 1206660943 +1598476048 3705184359 +456772382 456772366 +3199835628 3199835644 +767187117 3926575378 +2357478985 2100995320 +552385236 552385220 +2044105294 3591381809 +22223213 438874329 +2050727303 2602877043 +2666406985 2044927726 +1412116947 3558605376 +3477920794 1017031729 +3128250268 642120273 +4191961151 2495161128 +372735846 3074811057 +2706051450 554843199 +959774016 959774032 +3497219925 2056420042 +266831485 1913107298 +240068745 261935032 3209844021 3481821343 +2543324585 1297973518 +3628035962 3856432413 +3609532131 2455963456 +2186639407 1535914478 +2234541848 734919740 +2518843700 2354144473 +4005844508 4212362769 +1066208407 2718618022 +612951014 1769915137 +1197357245 2871612926 +2181179515 4028841279 610646436 +1601335166 3206906710 +2752031348 4071697631 +3408154431 153665576 +401714226 401714210 +1929668462 1895741767 +3509757283 3830861719 +2241265247 3521483530 +1446119313 743584909 +566489974 2641904337 +1634351249 3946253392 +1561089410 3357233438 +1227674586 194084925 +2578108383 584941724 +2683078714 4133714118 +4223677099 4203725602 +3702963922 1149784954 1169056915 +434703155 1532095159 +1186871573 1920195594 +2940005342 3510363241 +326295980 3339825724 +3226576377 3112716008 +3171237817 3325541295 1212370984 +3309411284 1514688175 +1971202138 1335461291 +1899262010 3849430805 +192067434 1872149467 2236201413 2236201426 33917606 563032735 2612439827 17139968 +3944367668 1314685913 883134088 +823618750 98578185 +3816743114 2743424358 +1351934597 1600165722 +2799729673 3160621607 +2207607081 1295289230 +3614589969 971056848 +840319853 840319869 +2692432283 403163976 +49151378 782642373 +3113345226 3936673275 +2283266826 1201301677 +4094740001 925524359 2391736902 2391736913 3861187992 1466426870 +2463463012 3049337423 +1930137640 1127476971 +2727123559 2334239837 +3707545318 3128363813 +211729382 1936897318 3286354689 3286354711 +364775087 2088639483 3911484792 +1277674941 2677819540 +4217190075 3416085833 1336352645 +1734427123 500630803 +1510651821 1809786194 +2504871418 2842946736 3369212611 3854573802 +2346121322 2002936517 +1472053852 2075719367 +1491249415 3499270674 +4196613267 1484282732 +1723038606 3030080221 982220943 +1826625473 633693398 +693222591 3400278184 +710688824 736169669 736169683 +690683279 1571629070 +756743685 866178776 +625709958 50990271 +1014982141 3688193781 965578050 +1150907479 227101897 +1595870913 722477711 +1871574594 3732580853 2032765262 504983645 +3189324054 1471471015 +2129071831 2629590128 +283352607 2301586098 +1515395510 585969162 +2334233265 1072805573 +1264276169 1774408312 +2827071690 237587963 +3902714950 3700249735 +4231633516 554682775 +829776342 3329303713 +2144054824 1436756203 +3647191802 4034872790 +982121339 1675035589 +2061720744 468376701 468376683 +1173882722 2272501571 +2881081079 1283509968 +2602998469 46507034 +2658164096 1218797915 +1244689072 2051312387 +399738434 1765900362 +49030310 2862491045 +2183065950 2354036257 +2703940277 1897285407 +377126762 377126778 +1350912485 2798867315 +2902071489 2215343719 246740928 +1473644909 3002128004 +2498543301 900747276 +1140327519 1584325022 +3203082902 4276878177 573835825 +1850874823 494416580 +1947686673 4096971958 +2863865213 142039563 +888105688 920128154 4028149885 936905760 3117271667 +2600488254 1064933513 +2762077472 3681932063 +2290316248 3203357979 +2264722164 1948638735 +2520178501 3177281946 +4207139916 240372663 +3298549934 794997231 +2762057562 935494435 +3920362796 96439383 +2921155922 679595065 +2516329303 2516329287 +1089977919 505315438 +1655726828 2650164838 +1086258459 1225956078 +2804636975 2804636991 +1009422892 3808697153 +3515049129 1252023807 +3556240095 438263927 +2902756304 622758701 +2863673446 2199944614 425472151 +1019688867 1352439196 +1749120261 2544326972 +2094869243 1351071904 +2973386511 230546574 +1912618428 845229799 +325785220 362049993 +1897400324 215260745 +3132314288 2125473654 +1376157199 1376157215 +2202549032 2954976067 +1635856588 1585985108 +469942302 911503167 +83782913 1708819597 +1152408365 2602751470 +694472948 3272761632 +1607879993 755219927 +3608360298 354710272 371487910 +2544263065 1466336899 +1492657492 1654833967 +3661929044 1784751565 +3236838330 3399040534 +2440226259 3403664186 +3806742825 1501899672 +2050040079 1625401179 +1457036381 335423092 +2007827986 657562430 +2291392201 2864068024 +3705995792 3431087925 +2022760817 1024648422 +2244239021 3707979118 +471848704 1820671272 +2885782409 1332652216 +2440479934 32849805 +1722741937 460371383 +3646305905 3646305889 +3942713067 3718112226 +2385493339 2385493323 +146612738 1271655687 +1681946029 2546077519 +957356759 2874818672 +2445577451 1983417123 +2713277735 3183545440 +3552521584 4226880973 +3513866295 3966623366 +2889059366 992321495 +641705552 4227856116 +1185579837 1185579821 +3965268324 1953022057 +972489826 972489842 +4145637443 1073684842 +1436146333 1580410164 +2806294492 1735122149 +879302073 980234792 +4046099567 867848228 +1511247653 4063172410 +3117276424 2266166155 +3218359378 1707754039 +2411375443 2514203578 +721379419 184856388 +176294603 516533501 +3571178121 2669217198 +2734528267 2734528283 +1600465900 3024451351 +2327972171 2327972187 +2226114634 717546619 985988541 2226114650 +1066080070 4038061959 1811288470 +2607793613 2113167794 +3213577912 3860267347 +353397487 3247422010 993530769 400053806 +1894403450 987232011 +651339343 1822150222 +432233232 2659736117 3315990908 3383101368 +2682610325 3292162348 2842433111 +651512240 1257840925 +4023532807 2156206880 +1672044406 3823268242 +369446767 3183909597 +2262717251 2262717267 +2834405455 1397429914 +4076149580 819711010 +482200286 567676771 +2670148602 2227399325 +3563624503 2544344720 +61039521 3426682375 1530254966 197172166 +347070703 1999848939 +706362918 1108043247 +2101061735 2347375136 +636851821 915943030 781962628 +2069774659 4232623920 +796685230 2156419083 +2346337843 1536983642 +2382653773 2509757106 +3473916039 3598888023 +2535062782 3689497545 +1378229339 1378229323 2564490271 +3118108252 4010678983 +3732366268 4059168999 +2234951718 3674911681 +712276653 2187140690 +1740406154 1642788358 +890046058 3107592822 +30741981 3211881186 +2764120979 2557541741 +1837031826 4038924485 +2664689164 329235681 +3423664544 3736663781 +2654804426 3828324603 +2878404878 1950533562 +837795478 2304031347 +2587346671 3633083948 +4242667897 1434779998 +740603248 2842022603 +3665246144 2846671699 +2316714610 3540687219 +4175850445 190333363 +1424334447 343435448 +2053983500 3322956279 +3995156425 3701143609 +2530549610 251845318 +3917126404 2027680476 +1255341745 2219627862 +444285975 2284837763 +2534327666 3789868126 +4175684177 3033387906 +1185153808 3330105268 +1435521627 220672091 +3379115614 1856017897 +2862218877 225156820 +3618870337 3501351510 +3258132099 3378200167 965058620 +1534992405 478970122 +91001855 3679341377 +801661534 801661518 +11357724 2676382919 +197952431 1308714808 +2707472184 1129121083 +1346346635 2103966969 +1042330421 41557116 +3544838444 854170529 +3065814034 3169431621 +2501706588 1754616328 +4102989040 939265611 +3995155863 3059590957 3335455869 1961103555 +1329912467 1550062956 +1057715925 336335178 +2091997967 1513248910 +3150520860 2660539592 +3169543490 841354830 +709872129 2627403648 +669419243 538136621 +1402409256 941602192 +3302597060 3437411513 +3128626462 2914362921 +4165705663 3968165317 +2354924220 2388217156 +1988997992 152136875 +2041867074 2241949021 +2125739579 188244200 +3191006859 4112575682 +3640532024 2803649235 +450609906 972284645 +508023662 2627957400 +1672900350 3025039242 +2051370035 2763662413 +3186329314 3131441643 +2569615173 499680637 +4009558453 3981029372 +2839060119 4213286832 +293659292 293659276 +1889139150 275005263 +3280737639 1015394614 +1855077987 2238120550 +373449188 4001372649 +3114956037 95967530 +1376284620 390197254 +3896956028 541609220 +3329323172 1212497188 +2529540743 2349584275 +764067746 256288878 +3531443922 1983097273 +3839091729 3773685974 +2152916524 1208366834 1729044124 3885382614 3474802228 153522602 1221382868 4212296093 2207179433 2429042970 780162890 1929951522 3435994275 3440378512 2348406248 872814463 2450204804 2768597123 38466501 3505223332 821348738 3440378515 1104791419 1962521029 3617919371 1358379674 4060506396 2044143472 2462598182 1423224473 117527392 3654437974 2246607728 2949899528 1567816140 3553437629 4027212762 1406446846 +3077935141 671055868 +2898603620 1583875967 +1332176506 3123912966 +1425306169 4124037032 +2381452726 2381452710 +1816826481 3932456944 +22110775 1016952482 +4205187112 3144380157 +4159064058 4291632407 +4123785726 3994716895 +2115074646 2115074630 +2704084444 2515325255 +2034314935 2195540326 +462968919 1963515818 +273220939 3992147202 +3840136997 2638534730 +2039039802 1823725058 +1007200371 4104203546 +1856820200 571577899 +4218139069 2273889428 +1788257486 2569367641 +979931891 3852424346 +1755709329 1313952070 +1798769646 3047671727 +2728232082 2415374803 +1326783050 3359138413 +1726431213 2300409473 +592336599 2322493876 +3415019493 3476594461 1410336122 +3024017980 3157636863 +4252482304 366424192 3787544979 +3149698820 2380381023 +2731546826 499018290 395773435 +492929141 1971197535 +530087154 2668402645 +1930844454 905098353 +1139764032 1372554523 +4291852485 2049842714 +2413973038 1383072953 +2175981848 3501191962 +4069252332 3783135255 +1831170107 1095576296 +907599818 4079504109 +1343390978 3273471307 +2810687502 3365545497 +366400963 607289834 +1272396950 1272396934 +971147664 731452395 +1602994991 1602995007 +1832995881 650830994 3707853846 +1929185555 391465210 +2716376571 3299372712 +903892383 1863987550 +87821556 3047746329 667744014 +2003746263 3662993766 +1199095432 185856029 +1207720014 3368536742 +31948547 827388913 +1389912174 3634351417 +9560968 1839804171 +3308949675 640793908 +1029492857 664102261 +388603159 2840626451 +2549941692 4283434737 4283434727 +36003720 3906298652 +3864221541 4197618668 +339155269 339155285 +614291672 1672444532 +2680642304 1159879373 +4230640783 3339971803 2245360920 +781906359 350913286 +1321629917 3748676596 +1733729256 970283270 1369605047 +129130214 1414988570 +2243413205 1430969180 +1901005865 1451854744 +990023455 528445899 +399738462 3757868543 +2751233244 883891093 +3179364720 3262776149 +2420361783 865738420 +272533923 896707466 +3727825695 2707964321 3890262494 3468156380 +773784189 399567554 +293895114 1569644269 +3839441629 519547362 +1848291067 1748071730 +1924612528 2044886511 +3906637697 4293394013 +1529846545 1114996749 +291870216 1270128667 +1669108628 823939577 +3040753750 1878591210 +1481416889 3114337086 +3380567095 882704547 1786653328 +28261915 3400016413 1360480547 +354433298 1404688197 +2234879822 701179835 3772709583 +850551157 762256979 3917853452 +3351147462 919617697 +1100272432 1833464963 +2767000686 584439033 +551612401 3004807270 +2217994789 1516846862 +1778946155 1450924130 +962529462 4142553226 +3066951139 2839155786 3060660723 +1939397693 220294466 916632587 +4067165325 3448978363 +1356593576 3884154324 +1519805083 2632078408 +3818430519 1919014536 +1706399790 2531156850 +1681349267 1445172588 +1925011864 1339528892 +2967089743 2736146136 +2581128967 930328598 +1737215927 3088579856 +3497955019 3497955035 +1412383039 3311646248 +3126560699 3126560683 +3962518821 4082975020 +853949838 2926765711 +1727780287 1727780271 +3358798741 62857773 3180999562 +418046931 766575810 +2587786236 3428658599 +3256691080 468214027 +3196683329 863711808 +443278718 443278702 +3237703065 3215958040 +3241668107 1752687928 +1100084643 1100084659 +675817554 3147266323 +2751705286 1088402114 +3596782060 4012667533 +2000091671 1911128468 +3295701179 4160020068 +2034846676 3261226681 +3407555546 568580521 +469942675 691207830 +2077456613 2149824086 +3042595686 1033296038 +2132968106 3444814221 +2368532793 2916491017 +356434039 3905485648 +3823308617 124850158 +2347223743 422548865 +1824793150 1992419231 +4255338261 2346016416 +404175598 4082254508 +3398979164 1237539537 +1724123059 3566762218 +3469717869 4260646532 +1958456382 24126879 +1129913392 1952151452 893869973 +442677650 602911166 +2661749088 411953211 2949810769 +339085965 1578277874 +470716233 1944817656 +1581983691 4066383087 995075220 +3172275559 798919922 +4204398749 640150540 +710750943 1161173916 +2892300738 620872803 +2489566422 1863245031 +823529900 1322332864 2960179772 3562202560 1322332865 1322332887 +2555799761 43485263 +478077690 120207317 +1597818865 3719217264 +3077087747 3492144624 +3917220972 4288973719 +2422733986 1835251424 +3384933198 3932068825 +3215339459 1973235690 +3529927716 1530674336 +3132873548 1102723233 +23538208 3601043181 +20771280 3344215400 1548596601 +3217340768 1118818853 +3714350210 295955143 +314602239 2213873512 +4016060171 466081336 +8683762 951526600 3409897405 3264675055 +1803901235 3986286752 +2730980597 1299051529 +2366741959 3963164293 +4029792842 1750391405 +3102462185 70901464 +4147062429 3895043740 +3779982815 2361003550 +2833001707 3189561186 +3708868264 649285968 +3240219834 3259097283 +61552497 931677926 +3062285913 3716139326 +674427049 3186050073 4046510606 +3617573776 9270179 +3975372153 2082219368 +3484804197 3484804213 +4105806600 1211868555 +195099738 3472777251 4252063498 +4031964209 673250589 +3194760606 3927394004 +44649302 44649286 +1935660510 3943984964 570029599 2666956205 +905844495 1962139889 +2856664724 1576110142 +3285884430 3642328974 +4034173173 2580566711 +1657988653 1657988669 +2246656559 2408874860 +1650075858 2782235590 +2756674125 3122648293 2777278088 +2860568276 3100335756 +1307404759 2210241904 +992320833 2071811290 +482166167 3572796593 +76984148 2231626921 +1544320653 3926321070 +1969217034 3488254381 +455724520 455724536 +3920437175 2426988675 +3171898576 1864532835 +3691216375 175499792 +2863092568 390759386 +317770734 3205564345 +634065191 2741264221 2779512928 +3417388644 2478402660 +504530884 455850377 +4285365063 1616449728 +1456872915 2249257772 +3596113755 865284300 +3759189574 1102151766 +3460380799 4088048171 +3867119215 1238186168 +1199480049 2102464368 +2291551944 4190218211 3432907979 1421714288 +2199608869 2299868204 +1505282874 491243670 +2617414997 4226005485 2617414981 +2749484440 63425331 1818704480 2490803803 +2267866035 2125099724 +2337400645 2532250010 +4134347448 1115589312 +1473146467 2633483740 +641955950 2855703855 +3253763049 915607512 +3162647467 1810546210 +1575987192 3628428141 +1102323705 51366857 1737381118 3854577263 51366878 +3420490570 1014711661 +404944544 2668248549 +2132082628 3524174217 +4155454450 3670984165 +3430173448 3809615243 +615545597 3201408066 +1071299667 3629545146 +27488556 4149239360 1889680572 3876041677 4149239383 3226150977 +1340050026 764988736 +1775841186 1393277098 +3853181195 39057529 +3812843288 2770565299 +2467597481 2467597497 +17828603 787743151 +2857708837 1226182970 1203576413 +589640655 579899086 +3392019920 129983019 +1039240316 4282394417 +1594974704 2556243139 +268256461 3013964137 +104143044 2308308127 +1404772137 1404772153 +4001300338 1068963085 +2596565579 731951550 +3701703303 1968363396 +2940431659 304405154 +1365775058 1365775042 +261079054 2090367385 +2645557378 3614581899 +2735791169 4102732352 1348688813 +262849269 2664490922 +1719636861 3621072340 +3105747399 824417366 +714429875 714429859 +308054248 671268628 +365094193 1926155312 1926155302 +759935110 3559318263 +2483731254 1493865298 +2011624164 2760924393 +47009871 1462860606 +2290642613 2747680490 +2083541700 1142049439 +1296489420 1921778231 +3837912788 4047396783 +1587512976 1202641149 +983654659 1326167996 +1606610056 1205492253 +2493556494 3969726607 176163086 +1564725223 3099609270 +1377731960 3188464635 +1138911487 3698018664 +2207464494 1936564921 +237238825 1805831822 +3591649426 3883563357 +3875778345 3553410456 +3156895864 2931979501 +1422295621 3112112780 +441073779 3239133664 +942417422 2340421929 +3842965051 3653527806 +2127436734 1551215625 +864161169 2797296454 864161153 +864991469 380443922 +1833416269 1833416285 +3876446731 3587895442 +292398976 3150756699 +2833740952 313477683 +2881470460 1524316593 +786716970 4218969371 +1463273215 1271808872 +223295903 2461513054 +887173793 3749884790 +1123129230 4031878287 +2376028815 3721329370 +2113929165 377591077 654290866 +308681578 1623009229 +917169334 3305507473 +1694712003 1907917488 +2804250131 855171052 +1621049555 3987934252 +389074863 389074879 +1796057751 2006449679 +2940701278 100961837 +3554267562 2392194565 +4180365130 2301481325 +3652954726 678248087 +1980692616 1636908555 +1262212496 4281414051 +2095922489 3799474366 +853571817 3596805184 +2708105309 63238552 2417699625 +3886126467 643718460 +1011277972 910204927 +1145450206 1484506985 +2598625456 2226828547 +4172257068 2544206400 +3086865753 4254522120 +1369943588 2935431871 +1547199913 3586656519 +577277712 2183809314 +3667071623 3667071639 +4211211242 236949837 +3269763990 2553760145 +1645750187 1761462680 +154196962 1508517077 +2739891178 2465059468 450907 1708442181 +189821160 3080830269 +3245720203 392249538 +561454177 260156598 1214027251 +1890017902 3313496879 +1644625975 2282051206 +764111184 41339125 +1528595029 3269536714 +1086623512 225264347 +563806326 817329238 +1931958623 3648378738 +898511015 4124481270 +4081515813 2297254048 +654753338 183869211 +2466053580 809732151 +3121815516 3357222727 +2195759301 2195759317 +335374358 2380978865 +3610033646 3839739646 +3881263869 730911828 +4150159663 2560595192 993493627 +1020937028 261612553 +3014577843 2504608097 +2189514500 1973156681 +457573399 104362032 64530850 4208499587 104362022 +3334313854 1517648735 +1349710728 754278173 +4103149954 4256135294 +169270070 1519607434 3343101185 402331153 +2319173126 2719529825 +1092029673 1615418072 +1156473208 1292457614 +2980743425 2612599079 +4287412191 696611870 +4278419675 3398319240 +2919259592 2996019659 +1492657482 1487057773 +1846402382 2357081910 +298997898 2552324411 +1362744486 2215231831 +4222577092 4179853215 +4249900506 2675385917 +3306810148 1808607679 +4113684053 4113684037 +2786423278 2482187887 +1482957257 4003540846 +1961289935 404499227 +2850165555 642134710 +2433446375 1006915254 +1799473997 630393380 +3917730314 2556825226 +1959782888 3410835509 +1287578157 4252896452 +2450725515 2131937492 +1407863883 1691752962 +1929256878 1618810746 1370480474 +3270333682 1198479070 +1398732455 3850258678 +749541973 2389812631 2671134444 +2962640966 2568668310 +2582753406 1429820245 +987188506 3136184299 +1805740108 3494913090 +3594904926 2919764735 +811411895 1339274133 +4224493149 3824322132 +1253850075 1253850059 +1348098560 2117840389 +437162047 439692872 +3900145372 209745608 +1812907107 298270242 +2384332166 2384332182 +4237828060 2138711879 +526685880 1043804782 +1524098258 3404918228 +948834146 1772238677 +3687919933 1196458772 +2300776105 716149272 +2308786465 3281657590 +2195941717 1627312330 +2852997270 1223246887 +2587199249 3544424390 +3276519197 2368815796 +2332650883 3574881648 +3232220723 2065498714 +391277399 1170165283 +3186220545 4271720445 532344064 +3345598775 579322265 +1327948011 2234782196 +1455399632 315682603 1605193077 +2431015995 1436758244 +2730146970 775500254 +375732281 1438727688 +1853963565 577981892 +1982452784 866578333 +510681495 2179571888 +712321373 862985588 +2764690217 2461493646 +1291364384 1265674853 +3155063325 235366255 831035412 +1732671999 3205074440 +3615751627 264799892 +2815763569 2074857750 +1184053711 1184053727 +3207715677 1484542836 +1490828796 3736441777 1222082480 +2964510047 2964510031 +1144390222 2936381647 +539297655 2293022196 +3767629117 1627529250 +1284992373 123817788 +1418323716 420916063 +2684579280 3043352163 +1825970294 3406332369 +3009177880 1920561371 +3969152123 4133251368 +3790339401 1813544255 +346205773 3373818674 +3873461015 2317536550 +3152676271 2154230392 +2826331287 3378534822 +1711086370 2943465109 +193595970 1644536907 +1163750100 1122096169 +1690597599 2152351489 +104110257 1445774263 1976327856 3159700822 +2985174037 786615562 1951009114 3636921139 3641231021 +1271946467 3548400592 +2640894665 2640894681 +4067971879 177885131 +3351487741 4275647970 1445503633 +2309912282 2544179499 3823541922 +2717524102 3379930837 +108310998 4289983473 +1064457555 872173996 +1928295496 3744532835 +3022961386 210571558 +2481335230 2438388745 +3703625674 1301525243 +1477280433 1313127600 +2496547535 2732674316 +15996583 2906054368 +2479254235 2248423070 +3430549330 1026428922 907642387 +2915727789 1962368444 +1376946211 1445744394 +2004520068 1525926033 +1290314904 2856000347 +2117107577 3600152414 +1773530573 1401697061 912611762 +2815538651 3060005256 +1809241524 1999792719 +3596532375 3596532359 +2328518208 2674601996 +182592611 970858320 +1285445385 3917349230 2789409592 893288479 +4135727091 32603020 +3140748140 518087425 +3460501257 3123215490 +3778006245 1665109114 +2739891193 252115176 +1201652158 2122186271 +1553518607 2733798490 +332951845 2767979082 +1284209618 1368648595 1530092158 2462847133 4275820666 4275820653 +538349589 2558841098 +980743032 2882888321 +1912678969 2966779838 +739328564 2469083087 +3877197849 1184043241 +1633607823 3613098254 +2515393190 2876191553 +4154427841 2435177174 +1848885085 4286525393 +3201048212 4015268592 +4002631919 635179066 +2748003004 2231345238 +371038919 3900000708 +1143618931 3246308364 +1021009434 369489891 369489909 +4027622572 2519939777 +2914012969 2509020568 +76874171 4052859236 +1629985444 2505601087 +2964074981 3744565953 +2526320618 4125828429 +686038831 2194055761 +2423842548 3129567642 +2556553707 3441638626 +3739416285 1535533571 +2270177517 3849513519 +4165251403 522393858 +3542619438 47186546 +1962011818 3557808777 +2378852937 1279157934 +561250664 561250680 +647189915 3111124831 1424999172 +421504669 701712674 +564347327 564347311 +2221195481 1134269832 +4052555951 3399747855 +1042830019 1350624422 +831678826 2803743685 +3616364617 2625764088 +3553762871 2761427887 +1860672833 3617361216 +307388627 313428387 +488276545 297471062 +178114210 2768377856 +449853659 4055925695 +3134486318 3134486334 +1213373621 3195836847 +3718481059 2338966684 +1546794846 448231050 +1176891159 2214953737 +2160625211 4138422002 866988264 3685607941 +3296449155 3521930282 +2898095738 1748298269 +2666019652 1116377000 +1200412477 785469986 +3562504324 1630181753 +3297940890 214008171 +2562802707 2336107002 +2468095248 2773375029 +3436865914 4124314379 +2753261765 473073178 +2577863329 1168364605 +2691480310 2627596993 +3358828757 4266837852 +1061240919 3937945840 +1042925038 3384972719 +3117429306 612194464 1808283925 +3457242651 2152369284 +3518512225 2248608928 +4177538937 1951054696 +3694183186 2999129427 +2370381071 2309782383 1372018584 1304908122 3401912509 +1500355148 624015316 1631871672 +1827890250 834094780 +2707636529 1077911590 +904249948 884012743 +3521072104 1250197035 +3779973419 4046622969 +1968500244 1713685761 1785932136 3367160165 3367160185 1960835169 +904443495 3039682163 +63127570 4267564115 +2188971199 596578472 +986204913 2051930470 +735624996 373654204 708109759 +3290277851 2511289796 +15359250 1939782573 +1145476405 2954683004 +1922149890 1565846837 +3284688997 2842679356 3284689013 +2750968395 2968822639 1796992020 +556102759 2728644881 +2250673226 2250673242 +257562460 1776424310 +1132603440 1977959299 +1923944848 376612259 +3007200270 955812377 +726041067 184452322 +2237349892 1140270319 +2280377428 1278388261 +602754395 65550300 +3899894973 2779288369 +2215758649 3046607134 +3928314148 3376507663 +2687001074 294793203 +4282880018 3420606261 +3093195841 1866400059 +4042590284 2646347703 +2695269281 2267926112 +1955316012 2751535169 +510759482 382277645 510759466 +1426430779 315842034 +1240527804 4261555030 +3452598425 2394675400 +2739595666 690838573 +1256744015 987097166 +1367594068 1609177512 +212401628 3389497681 +1134307451 1250688039 +1087372585 812353432 +2086257382 2806894593 +166874015 1198328648 +346431882 4177366989 +3534737693 3534737677 +543861458 2901159366 +723747132 1841437087 2658340814 1435384059 2426316740 +1199831681 1485127078 +1819796486 3334206817 +2375523137 1110632582 +2932064026 4193095383 +253946008 2690327392 +2966133603 1620803013 +3654234010 2066214763 +2126953592 182104315 +2696076095 948905000 +188979905 3036444657 +4238897832 1697414763 +283228390 3299906806 +4075677232 2625723779 +546114702 3423257497 +3916835250 922985253 +1885737165 3182195364 +346099034 2035259727 +4015098527 3254917938 3449056289 1549613128 +2704266387 1645362356 2691719257 +3722362312 3096655114 +2260858357 2260858341 +4174328073 3072995640 +978007434 978007450 +169397888 1695355781 +106623209 1827528270 +1545598702 1545598718 +1674680907 1844831234 +1903714239 1602140606 +2838417104 615485795 +554555420 617296903 +2802338554 1856874606 +2653270308 425057215 +321152697 3679302952 +2834300220 2834300204 +2811075898 158800917 +2947001236 418585081 +4155110818 2190323221 +4101501588 2706318191 1586808750 +2133981539 2662045386 +1614259952 1469821619 1614259936 +582050031 4188013627 +281788264 3636351165 +509591876 3001593467 44054653 +3403106832 3403106816 +1161520305 568690509 +2307547296 618011621 +570608244 570608228 +3413029631 1907247499 +2822172387 3005618931 +604825461 894459196 +3841388767 1337798408 +301743552 269825349 +2197435098 165547307 +1423905789 397676939 2553050964 +1367010832 170555628 +1473800267 2494311938 +451363509 252576490 +4124460429 459811479 +348419864 3376904909 +3091828976 1813961291 +3848064985 3927650952 +116311999 538829818 1121686207 +4161560735 4183646027 +2378588635 172755922 +3756668418 2142438691 +2744145703 2738434656 +2205724630 2205724614 +1909663334 2506453633 +1327052057 2645464648 2645464670 +365033011 1935053402 +1487886980 1058474427 +3835827389 3835827373 +1363750154 3270317 +3586129689 2520683614 +1170774478 86985049 +2166522692 2371134495 +1940555174 3144705111 +705813554 1813881509 +77375032 2056890939 +3296868693 1837432457 +1662157860 438699199 +440077372 2264154737 +1139994269 2205375648 +4025035508 2685312537 +2471919172 1973885700 +2520425754 4199003529 +3295386038 1503309322 +2447322606 2689951433 3846785646 2447322622 +3027166955 4120216564 +3540777965 1745520340 +3718081158 1691267297 +1858705542 2641064657 +2792889608 2353517595 +2979139195 65850290 +3572991117 3735405364 3572991133 +1067909925 1067909941 +1096901030 2881895029 +1872843341 133467940 +3792399641 2837365803 3151998440 +761884452 2700735913 +3385278062 312952633 +3278751334 198136471 +1163860882 3333973715 +2668205049 2668205033 +2266827556 3602418111 +3200626591 1761920586 +17961577 3204548837 +801817038 170858319 +3053417366 388166961 +2567170226 3722659481 +1309909021 2527878289 +3329766461 2889497620 +3203986055 686148246 +851405523 3059034661 +852848895 83943784 +1216793169 2100329872 +228308141 3830551378 +3858613283 830194442 +1009715041 520658336 +2204763101 3169064180 +949539867 865461892 +371443224 1111734180 4065384397 +2156803516 467572472 +987311829 2028255580 +3143786339 3234939509 3938337229 1403538175 1314760307 3317376506 +3846107550 2148948927 +414212183 883402982 +661988492 2842200161 +446513974 446513958 +1275843578 2496860373 +2871842235 62180456 +3692063454 1308263023 +1910680621 1960118994 +2435493725 2435493709 +3057706659 1810625550 +2716682783 3239701136 +758043625 163026904 +3031449656 1229655441 2843023419 +2143611634 352180979 +137665472 137665488 +4166371666 1091300357 +1241962253 2512685426 +4167295517 574419892 +3840352942 98277359 +2501064436 2685676835 +1858977305 3022841576 +1417998155 136702072 +3236388650 1502873490 +2814121704 3448043852 +2487797133 3691032783 +79013376 1777619461 +2618901419 2203516846 +2469833173 1527063162 957051507 2483903068 +4014124863 3841581096 +181085174 4090076241 +1801294451 2196778224 +2844402820 4052193220 +2901470710 893819473 +2877497343 3943013803 +2831151299 2180820068 +3778997072 3859574499 +3330241817 2477086295 +213027185 1895800436 714884189 +1560866987 2981247183 +4228159087 4228159103 +1629916268 1538199041 +4271294910 2237634057 +4275272369 2614491063 +4270949044 1930477903 +3662377306 3098172725 +2429324475 2634117410 +1380066317 3184164001 +1970760862 1778049215 +2485236537 1779245736 +4157829018 3151540075 3151540093 +122437463 3557275120 +405182918 3401847479 +3655557462 1458715249 +463560148 3460039709 +4057107888 1584729109 +1892966911 2639676542 +212603258 1826587421 +3797140033 2747982147 +2050689666 3975252661 +2625058444 788271776 3685408353 +1897417403 3292374116 +1386054522 2281044253 +1072499339 757569748 +2878265725 1041948424 +1365441412 2731667679 +1626397309 405271234 +2122293311 1642677054 +2022510970 1485751382 +1911921382 1515370 +1316685996 934192855 +3832492346 2860830723 +3383385345 4243076391 +1470622823 229812093 +2264558226 238404563 +2392755996 2677754119 +1164067031 279712368 +2966059130 2966059114 +1881090438 865364032 4170815880 1665335022 4053683759 2306889671 2762646711 2492248380 827474844 3861529646 3639178411 1909780954 2448711786 2579682746 3999071519 352836628 1230701237 776600067 3245459492 4151282368 3934599293 1627506422 763367649 2857454343 1652069633 2967531137 2535813623 3022065833 2959599288 2097243665 2489928247 1272846865 +3326118586 3516555997 +1097531015 2627334078 +297888823 1591049475 +3517217381 1793895660 +882237260 882237276 +2562201628 2244867079 +379441302 1716392289 +3484305283 1918538538 +907084784 214512341 2960339460 +4034751022 3278775919 +3766877805 403653842 +2468069302 405431681 +373611697 4123845462 +688029473 2951618784 +2755097622 2571878065 +2954662304 3707322099 +2050395647 1658947710 +1909638633 128398149 +2757010333 1044215524 2757010317 +3671998836 1749162975 +583761322 1884738189 +4168039190 756679601 +361956793 2943484456 +1762075405 2847640178 +2346761878 1076735862 3368814119 +2878336792 1454789209 +1794581501 64164140 1078206436 +1352391820 1901867127 3575654560 +3412369716 1146025335 +1914078204 2507261351 +2656430119 1748792672 +3697486779 3032990879 +2591753177 2591753161 +434480903 3414552576 +1571515378 3718550925 +3662478055 2431637598 +1057588276 1878728153 +2922230704 1413344306 +2354664598 354366817 +1786410014 1542693570 +2337201619 2337201603 +3685854885 2674211786 +1740185702 367295586 +775911294 3740669577 +1158753716 1856882459 +2845715131 3204269170 +2249027162 2546803234 +724968633 380575568 +1138970235 234333209 +3855900297 2622567071 +1741458896 922959477 +989229806 3770062713 +3779157895 552165760 +2891255069 3342167531 +169635515 1424264552 +3965341932 2926819060 2725487616 4264387457 +408628921 408628905 1209817225 277515582 +2523599511 1636713392 +779350161 3917750359 +2539808101 3212292253 3034947066 +3200412161 1292689280 +724493406 1490124777 +4036333289 2758801614 +2239668872 2490728885 +3382237203 3467394524 1742235733 +1629863994 678271837 +3204246026 2988731821 +290497909 3069474602 +1085470910 45355021 2665252772 +4153848634 4269985068 +117419481 1281997992 +2270608264 3370632900 3610087371 +3421018026 3808506898 2837889179 +3278002435 2530353066 +444849100 2308112951 +3483281910 2650731381 +3581161988 166378569 +2218844126 2218844110 +946545471 2643851606 +2262738534 3758934626 3238446363 3450689155 3042411004 1424209670 4132709092 3878412065 1011120924 2513519237 1560920640 3711136673 2773738701 2742051901 3379734342 1915038128 912410136 3620755831 4220556451 +2458498690 818564771 +3544546007 1835032688 +3336161742 3604524879 +484414282 3186941293 +2341195903 3236328658 +172353540 806108767 +2967988418 1058236771 +1136962425 1361275487 +1337883678 2799526691 +4294692112 4246782845 +2520053666 392287235 +3890372288 1388629315 +422892705 1328200032 +2512433770 1591979205 +3645317853 3892044258 +2225840633 1921523144 +1633372175 870689883 +3773562933 3773562917 +4101098035 2792243616 +1343997581 2384304612 2451415118 +1552199422 1154275849 +1476043016 2274066315 +1768472719 2129076494 +1527444391 4181561334 +4056243650 1538431075 +649463550 4002218441 +3634802382 3697618511 +1375005346 1375005362 864644010 +3227636575 956284552 +762948624 2794052917 +391834406 3645684042 +505105521 3179428097 3589887462 +1154296003 301411068 +2188196741 169771328 +2876470081 666791766 +3726648070 2996249185 +1778903691 1970682050 +1097053523 2591748269 +2523577840 24340694 +2965410993 4029289126 +3205441997 2447297970 +1666165364 1020275935 +1591552378 1591552362 +3957275818 3553419525 +1490104310 244579027 +1209952850 1726294322 +4030904942 2802547513 +2535842240 2963431749 +3504760106 2047440694 +1583128610 2469614317 +2435169501 2435169485 +3293900539 213136676 +164653135 3721291419 +3305116415 505276286 +861895514 1795408374 961490603 +2575315678 1821290729 +1453962705 2344585764 +3413120662 3614674481 +99809491 565834070 +1447761460 204731353 +508814336 940608460 +239464018 3390450437 +2331261586 1350054867 +583640941 812814482 +3157177938 330295758 +2837424821 4057578236 +3141959834 4208855568 +2253194831 2698885297 +2086660352 3405499155 +872777502 822259201 +317786585 317786569 +1100308410 1100308394 +1954424497 4078590903 +4002521314 187345917 +1332948774 944978113 +2427614664 1849823344 +4073763891 182467488 165690835 +707284960 1031126451 +3825007582 3365719496 +2523686757 2125168951 1729413714 113859663 +1456991838 334249449 +2163411602 3374093463 +1207437978 3849891965 +3044332304 242700666 +759598501 3943758522 +242867248 4191526787 +2009708671 2009708655 +3155335587 3024608138 +3259827462 3846105185 579735162 +457959392 3632137637 +4049230057 3661231822 +3013530447 302425422 +142669714 4110793413 +3346951686 302461815 302461793 +3218289534 2004488009 +34915772 45303544 +1945678837 2239974076 +2352590186 337682386 +3600995014 2092064579 +4122042143 4122042127 +466411456 1311329691 1007620472 +3563286628 3163155839 +3445000456 3168537635 +4111657171 2723937891 +1049153770 3645461237 +2800965060 1666552630 +3787528739 2247894300 +174612503 1610106327 1821597019 2694441283 618395983 +1058127200 2834112051 +3012429288 2425572413 1729866192 +2809060080 2206377923 +2724559574 678875293 +347595489 33204847 +2704326413 513630011 +915161595 4293833384 +1361674601 2911118041 +187257863 814703449 +445792698 938257006 +2905418757 2676713532 +2309152618 2021812747 +2273802569 2739138040 +1958545710 4086657913 +1733242352 1460111752 +3699593436 4273490503 +3343911132 2596566407 +867856438 2759763207 +2313922184 2784438283 +409065189 572991104 +3408096334 708547278 +1614262325 2896847722 +819873343 3659714044 +4096615289 2658759919 +284999036 970869297 +4174149051 1692226930 +2259261942 997283782 +3473943334 477359319 +4214826339 3619550557 +1949499606 3259650289 +3807616494 864132527 +1742104742 4097252954 +4161956211 4160487436 +3414016514 1492674851 +3054921298 1368852219 +1476043008 2139845395 +329324285 2298542050 +2408497744 431364859 +4005510709 1702870476 +1435069529 2763120425 5607454 +3417529338 2774125213 +2251657418 273870317 +2112619286 1351146417 +754922303 754922287 +1926318044 1147756168 +2329628160 2537277957 2537277971 +2566719303 491943126 +3202638346 1601762661 +3807616499 948020620 +2164307642 3458180823 +2413412043 1053251970 +2288900283 2146184804 +3890951595 3259333672 +2864861564 1273382439 +542116451 1090542044 +135205102 2646058681 +781282790 888144129 +3372837248 4191229075 +4001947213 900585380 +3428501385 3428501401 +1908712452 479081033 +1888998090 151049211 +3941927473 1122559701 2292740251 3997954625 701782467 3831475546 1863732460 722857627 3311504669 1033658054 3890131895 3800322052 3215775034 118020325 1747225187 +87769702 2722727575 +2901908411 3996910207 2901908395 +2778211262 1820345375 +109560808 800679467 +1069191514 2897399997 +2298918077 1921942914 +2625069715 2685890083 +2879633076 3870858575 +3462590219 4039003714 +3778711743 1311890622 +3303629039 2009736593 +1771788525 1771788541 +832416469 4029934922 +513346519 32351078 +922333064 319771421 +2925188185 3728370362 +413163427 813584135 +1550469169 2890900784 +833316018 3805250597 +1942151016 330031696 +1620149770 253100461 +871695746 1287105443 +2067008642 1961865397 +752341926 311787438 +3098351004 2869934476 +1958399052 656619515 +2320062860 618294711 +764389621 2921789866 +1622510793 114073710 572558638 +3023146041 3808411048 +262185702 2145415169 +3190806057 2387485326 +1374228426 3152272109 +2650473966 2687129007 +2449312473 2871104414 +2081483982 480561241 +304459424 827450867 +2516445427 253256034 488149324 1700872325 1669399403 1568733669 502218637 1829658231 253256053 297121420 2723644598 297121434 1712214854 +538437773 312677874 +2797506697 117278638 +2907573128 1766315799 2920038252 +4108765746 4108765730 +1354807721 2787448027 +2447570886 1488454673 +2897542552 2605082704 +64381213 662364322 +3528229203 3528229187 +2193927574 2959954112 +3453744479 1105519132 1883456648 +4073433080 3364101267 781806445 2161857664 3364101252 +3001594346 2387612493 +208380530 4285577573 +3422940156 693271985 +1268367909 1172323164 +1735412311 1781132227 751109872 +3203535247 115473511 +1068331496 638210091 638210109 +1659894360 398923917 +2282799026 2996662106 3831350579 +2521792432 1191751923 +2249941756 421319335 +1398800685 1830934980 +2417721921 3839716198 +235545613 3362845554 +2549907952 1432204107 +146312185 3011795198 +2540915687 1367375008 +3810762706 1662293893 +2414052928 63739931 +3336650483 3812434573 +971964641 971964657 +262087232 3615681235 +208192565 3186417514 +1907860830 1645826793 +2161726474 2161726490 3760147373 +747301216 2532412253 +191148688 1819903796 +2410483599 167920701 +384054705 3124790704 +3907176405 3236524140 +1954666245 281250620 +2624696163 2851543260 +2774943173 1488746492 +3643412699 3090712786 +2718168792 2718168776 +3389234350 2981078511 +1636226531 2667701892 +2210364091 3508106585 +1869691265 4030563840 +599152514 599152530 +3829540954 2921694635 +1822112350 1137321933 +3904052737 1391999872 +1482471938 469291299 +1930646996 4218428591 +474826359 3489233713 +2404561345 1023101287 +3251587179 2219769954 +2215235705 1416834686 +3569200776 1855569949 +72149650 3917071674 1461011397 +3283543067 870913682 +2233493891 352721194 +2213663079 862534985 +3125884654 3864591214 +598990701 1507574464 +743389756 2448184022 +2329704400 356525008 +4032229785 4057879496 +2821751811 2429914364 +3923065214 2983635081 +1800388782 2707331021 +845556583 4167359347 3184939808 3184939830 +3806169543 1307169175 +911157729 1604250912 +262218370 480858805 +3462834620 4008377960 +81302738 1928480389 +1060276451 2022020177 +2047444377 3053277150 +2760957527 1728971494 +1311260188 626640391 +998424391 885677501 +906659699 1388601568 +955599738 2469275628 +2578290429 3913592916 +2021273236 1012355823 +1464711880 928843997 74773492 +710896933 3644379450 3644379436 3698170595 779181661 +2610911804 937102439 +600847866 1863533250 1522858123 +922157380 3403087391 +4225696479 1594983688 +2944290297 1020575464 +2799199510 2719611361 +4054866023 558059620 +2614005469 1049092820 +1894401392 688777496 +960044393 2112441422 +1071586178 897266446 94517149 +2918683551 2076009310 +3262301422 1237853850 +1572547855 1572547871 +2416460895 470000008 +1059801510 2143566239 +2564318610 782755013 +3495183397 2622721372 +4090371309 4090371325 +1187096520 719003595 +3495752070 2286958049 +537733105 1680763311 3344918153 +3364101270 1039728689 +1669153493 2428438852 +1831364647 1355098809 2494005413 2625848882 +4002538462 22958277 +2811001519 1898258808 +53803049 3199187870 +1321253715 1281811386 +3941138244 667941800 +589869637 589869653 +1156571078 3214093318 +1196034268 361493073 +1309267487 1398614567 1537531818 3067302593 1655266145 4168880862 +271669487 1333614650 +1578005369 2311047038 +2759877849 3474899351 +2212744070 662199751 +358902310 1437542280 +1682476475 2038837893 +2356050510 3409602201 +761303705 1093378895 +11768788 4004624047 +636229851 2376802514 179987368 +1525451337 3713868275 +2669921931 2669921947 +2760730922 882674971 +203008609 182321223 +282557789 3761920372 +3481577184 4032210500 +403744647 4150254553 +1563952144 3475924259 +969235557 1908735901 1454404346 +3492328027 2942732830 +2030564770 497270853 +324486270 4032877129 +1907860818 1444495365 +366775953 4214517328 +3805721591 251481542 +543572539 1257719468 +735852 735868 +2257480083 747012339 +869871239 635715200 +1814777151 1542304683 +2387505016 1933242373 +1748565555 1152920154 +823892804 2323206325 +3547407242 1696264763 +2057243581 2057243565 +299033770 3103651725 +1068306673 2129709898 +3609730041 2377787358 +1396194852 629789375 +915268179 878397612 +4221574206 4087163209 +1120550462 2085064024 +2187892938 346588653 +119596004 119596020 +2935291110 1370103297 +363349991 363350007 +1295458861 654662475 3812652270 +1391366580 1099914831 +153685099 3600714868 +371926545 4142722247 +412287345 4007491094 +3155523524 1913883848 3491434429 2953270685 1684636344 386839428 3653994911 1684636335 +560836792 1470968237 +912928380 1508171820 +3273484511 105649928 +599900799 348547777 +3341926447 3260123630 +1898743790 387578799 +2203536421 2549673955 +664951520 1150619301 +3334468611 3811385514 +1744926872 1381029700 +2837784061 2837784045 +1316319527 3446011684 +3384531021 3384531037 +3936572553 3894285240 +3953865853 842404194 +3556218175 3988779582 +337762112 337762128 +4106663914 2365272102 +3827204186 1979977131 +3674677280 3963064933 +734124548 3861525577 +3252676702 2440743935 +3717951156 614580024 2313825033 +4224990712 3930146042 +2425449914 2808013846 +2976796081 27545008 +531372324 4293628841 +2605357793 1467076662 +2632335341 3139871077 +3285381747 3034614546 +3011110009 31631976 +1493783874 2109431374 +214944339 2748585901 +881895230 4256646793 +3146452865 3169413142 +1413970530 2812649134 +1118428033 1919192064 +4255909172 2311860441 +947182083 3807589034 +605727556 435919881 +2396967570 2059762643 +1735406357 3936381468 +2040806035 1779284589 +3739008095 3180262603 +2458580172 2092916023 +2458234306 3389705166 +1513001587 98029221 +1939800231 2857240288 +2817002969 1330273092 +1742163156 1009929646 +2648505009 3625875383 +3758961977 3989489832 +8865251 777709978 +122136366 1080784779 +282970883 4238153030 +959830645 2227627562 +1257201366 3217739370 +2840402981 3154606003 +2767771121 2763573862 +2437642024 1913452355 +730447448 3788940443 +4235626425 1575057785 874494424 +1060283434 2797104653 +680295815 1546230678 +3069365210 3661031467 +3803216759 1389517904 +4187819751 3644749216 +400414118 962599018 +197962254 2704258063 +4147571056 4147571040 +2938250587 230739524 +652498568 3245619229 +3529757822 3505782108 +1489406109 1569263394 +1902370113 3241495872 +2442251500 344299393 +4069817833 3368170968 +4005140891 1764544260 +124296153 1183478292 +2211964334 987664633 +2293069911 2148823280 +4152979738 3376936511 +3346766092 328330743 716705222 328330721 2948167968 1610850842 3015278451 +2732681009 2732680993 2580902438 2580902448 +3578112658 2868938029 +449062956 1526883640 +1163795045 1163795061 +2193712939 4292072270 +2124178316 3694179703 +3231294645 3231294629 +617585283 2932788260 +3177270137 317001027 +2997939375 1773826540 3061274321 +2164056449 2400648704 +1398062666 2020052589 +6124949 673192348 +2802797425 790351872 +697854371 502156181 +2646463415 2646463399 +4125213498 1281774685 +1809824102 925948801 +1616657941 3325410076 +2196324760 4078853925 +1638624614 652031895 3309208230 +29064314 874837003 +753508132 3620046249 +1618864864 3325607603 +3121942719 1740052302 +1664290462 1664290446 +2404917893 750671706 +193664512 737387013 +532440259 2328905382 +948517057 1562901405 +2906203652 764838203 +511134769 650965286 +110967807 4061338044 +2151323245 1228590468 +860897199 1580050385 +706640963 3141462566 +876246258 3516911670 +1433142396 1239251214 4251516164 +1447763353 1899993054 +4108551840 3377054386 2434629157 +3728867746 2213057045 +1545242755 2547339676 4059459687 2160387616 +4150305467 673197170 +3891251833 2104663356 +495222438 1427088259 +3369368898 1717358411 +4173507348 344434732 +1220397386 3545812645 +773365581 3720529458 +662495947 2699282414 +3428559282 1716265786 +2171454143 2127139496 +30543603 3501033626 +3414577878 980707057 +2396521307 4201968635 +1462280412 284506695 +2866879911 3223391916 3223817669 +1104692641 1215667296 +3090383123 2534157078 +1702768731 2843949087 547757892 +2338470439 2460060534 +2171154994 3935962277 +2923932343 298958342 +2070680921 4138791324 +3512351402 990534043 +3384541843 637013370 +196176122 1508592748 +1388740381 1803164340 +886608047 3756770158 +4214184833 3968666646 +2742785563 1988971666 +961490603 3802560308 +468804486 2197793783 +4252059727 1213518936 +2795589872 2208080024 +921342018 2256940233 +972468591 1526344513 +2481573162 3925812613 +1558468861 947394123 +143358122 520713910 +3775286780 955040679 +2756538477 317193092 +3139758005 1343799786 +1084616944 532822620 3040496085 +752066785 752066801 +2556103841 3073945293 +987428598 2628961607 +2661382610 2318583187 +1301437498 1466380125 +4228384463 118125565 +453602939 181988274 +199045563 1748322674 +1408520615 1181551539 +926210478 2519903471 +1203239256 318319120 +2814110151 3553690688 +1511247649 3996061942 +3691512381 500430132 +2743951720 3750778557 +3286624058 1358001685 +4065860156 3305319289 +4273590337 1065539158 +3050199520 332888997 +1744728303 2760624184 1074540603 +3240252887 3758956912 +4281069435 3393725196 +3862016640 3762028421 +1547481368 1547481352 +3607113398 726239367 +568890568 3317162275 +1022895812 2798209455 +1433265821 3450387018 +2489346559 2462506110 +1795193497 3781026688 +3987663455 396063649 +730560257 2374784662 +3510112366 1379042980 +3873367281 143937524 +1008040404 1775159471 +3035506896 2733260643 +3935949119 2401527358 +4039535986 2052999781 +3539612923 450979620 +1559530073 4042072614 2918566423 +1551575155 148942092 +537407107 2111268853 +2581475167 2692411489 +2812859521 1875281695 +1250673422 1745096473 +5362507 1445572021 +1807634988 227583831 2010458044 +4078186760 1381084208 +1649548189 1682012212 +2225227076 1528351791 +2960711125 802342177 +754052574 2665051263 +3522976968 3544802805 +2208859101 1764849707 +4082415223 2237349200 +801703280 367698653 3781700616 +2145169619 459955258 +1654731631 1406423313 +2583811159 2583811143 +726166099 3915098915 +3732606304 1150829613 +1737958320 3270323733 +2427096325 3246128844 +2877586790 2772005530 +952814063 4165382458 +2869257569 3105734143 +4005140892 1781321863 +3998742371 1371515463 +3833225220 2760080964 +1125094440 3112581867 +502986827 2098519554 +472630494 921102719 +2962346895 3334464460 +2350296014 1437627727 +1234532298 1814306654 +3566529306 3228441085 +48380354 48380370 +666269524 3627931961 +1184376792 3541385541 +908721590 4196033927 +3483514641 3483514625 +116854997 1409638778 3421470556 +1602974812 3297258695 +921445859 1488954460 +4061837197 1619555045 4061837213 +1514595200 2643993221 +4176203258 3577036939 +1721592256 1937106843 +4276141985 3704466016 +3123197674 2790810918 +35718233 455607067 +3972883844 1504147545 +2757924919 4264926854 +64432832 3417852997 +1270445198 1270445214 +1426430764 64177751 +3553344969 851166062 +1691969166 3114805353 +3795580704 342546223 +2384100324 3031397336 2544961513 +3597571185 2616903517 +3484645936 3484645920 +2875883354 1729305379 +3265869185 669607171 250114225 4049549846 +1260538117 1274606298 +452754457 367318249 +2750636035 2750636051 +3589706951 1241674629 +1910527521 860951110 +3784450981 3457037820 3784450997 +175512204 1574456221 +4021865969 1357656678 +3677037567 65645182 +1704217903 393576686 +2126866155 2566837602 +210076783 610599494 2432865313 +1640059760 1398167893 +3400154747 59786024 +2867643955 2446149009 +3467495113 613412472 +2191768372 1921238356 +2466731842 3062783203 +100499329 2613049160 +4276658346 4147927661 1117985443 1117985471 1999804041 2123301372 +2837682853 93784028 +2596792809 776601422 +2218479413 1583198314 +4093073133 2371125469 +557734890 586339842 +3952537823 3181195016 +4139516627 1022915130 +1853861166 1581382575 +1228759681 1228759697 +2691599928 3322536507 +3130676815 2014119066 +3074825468 3074825452 +2259619306 2067934710 +1429577259 1315437986 +1116568529 3335777091 +2314659693 2628669586 +870772630 1250634033 +1917536079 675185071 675185075 +4129264858 746086126 +3554954365 224684244 +3657889820 3562084049 +1944296723 2186298604 +3357923187 2257725964 +4055016110 4200070077 +459566107 974532228 +744452180 775803951 +1190942397 3488768528 4062281515 +1750097792 3062257285 +2663933866 2675650701 +945152779 1954767406 +2706599297 2002084352 +2730464051 1721022796 +2994878608 478010108 +2841217222 2608037137 +1615592148 458939884 +3539298840 3502640559 +1631530563 604222912 +3671500193 551992438 +2113174581 2095023996 +3346878603 2504379101 +1409645770 105672243 +2979358611 556928122 +3463916877 3318680296 +3159261217 2425598944 +807470865 807470849 +3348548367 2241562229 +3194119198 3807675652 +2096513447 1588156918 +3840773153 2197002230 +359804796 1052819505 +762353999 3611383640 +3494868332 1494604055 +52390722 1014362629 3766775114 52390738 +3497561948 2311695815 +2861782129 4142788070 +1137985985 2284853952 +2132004869 3914116138 +4151343510 399631530 +2341040684 3579755351 +382401526 3669954816 4055840052 +561923607 3502790192 +1165113911 2312217744 +3996580862 443617634 2835897986 2577428255 4270764255 2577428233 2577428254 4136562142 +3429706488 170973060 +228258459 3101249825 +1016487073 28561760 +3221505944 3458163900 +4073373902 53314639 +2893257819 3573490514 +3201550253 1277740571 +1279918757 579728519 +547028703 855587080 +2740195676 2740195660 +2399863532 441817495 +2048809542 2210929697 +2270859427 3063001244 +2608684426 1348091963 +642227774 2159942531 +403405639 554897622 +281495685 609622186 +3296928406 4033835559 +2997927249 72892074 +1685715224 1141055707 +985509507 4221155360 +3510624634 3510624618 +3132766029 2186979772 +2533681395 787308151 2948249228 +399169376 4123122660 +3460576312 3628868307 +3410598675 400498412 +215488567 2509905076 +3386256242 722169430 +2043711857 877982950 +3226524916 3008091151 +40061458 3561855557 +2159412018 3498510259 +630482249 1906012664 +2606068841 4049128920 +3484425202 1030800781 +906340038 3504703905 +3368733025 2017133494 +266870820 778737833 +1510950822 1812843073 +1861658946 4031542005 +299036358 467292945 +1755184658 590506244 +1480048255 1519075009 +2648319754 1932047407 +3984745978 3729164427 +2642267099 3087519874 2642267083 +2718530552 216934267 +2863780521 1940251429 +2806193832 4138287723 +3026856340 2535420911 3749941480 +422312427 2335862004 +4149883242 3439053261 +2281718013 359026242 +2689494027 1718883650 +289931435 3747155252 +3262822638 2131046168 +1352487641 3702806229 +1526375882 163127678 +1717985646 2703974457 +4013501579 570498772 +2135533420 3438448407 +553492327 1447161654 +2169205346 2169205362 +3033982923 2035213442 +3536353288 3650417803 +1275697318 1275697334 +1680917822 4140204191 +944914974 3346928959 +4288645274 35916395 +3938628882 974227606 +4288299408 2659950281 +423081601 867454239 +376471115 4058615672 +4085313387 366032280 +1085617569 975420870 +2993241492 1873539055 1873539065 +2714431507 1330472685 +3591547683 576940042 +3183423903 1392188766 +2934642636 672560673 +2266256591 1985963802 +1389972616 3897244336 +3190551012 1127074303 +299199715 4126828885 +714065982 3286414665 +3403020280 1188387707 +2720107863 710947108 2420063914 +3425109477 1503298826 2520098745 +3934872250 4031146717 +3953203148 3741447649 +1077420094 1448788383 +128190857 1656313909 +3661350200 3289872187 +1285259194 2029122602 521798275 +1669862186 3644205851 +1017811576 632507141 +814961167 2263494030 +3141255883 2316543362 +1863281013 1245905724 +54055967 3963803204 +4200510058 2366823629 +2590676761 785112136 +1369943208 3026053315 +2567000439 1410547270 +1012159836 4028800767 +831057379 3717102666 +2184949836 1341556663 +1176750446 3057618643 +3923001369 3923001353 +1413236792 747919044 +171192762 171192746 +2439705819 2439705803 +3059356901 1369615566 +516031270 3328144578 +4005436628 2840027577 +1200139879 53120054 +2270895995 2406649508 +3797721452 1271116673 +3596015203 3451092426 +947719241 947719257 +1488307799 1958856643 +552112932 804297277 +2741719122 2741719106 +1405984630 624995159 +2840318788 568966107 +1965969540 1483073913 +4078414079 2453131454 2470486835 2089389721 1092445185 3420005507 1201494446 1713830880 2238944521 +2875492131 474798237 2011701255 2011701264 4064328732 +1954450973 2094797845 +3578409852 1070533671 +4124359333 595404746 +1218090624 3411733381 +436606397 3344233634 +3022849055 4155207388 +564016820 1314794700 +3212934605 1171851684 +1464802586 2525318901 +2070564950 4269686727 +845161712 1776914012 760876211 845161696 +362159843 3729956700 +2906995971 4286544112 +1709434541 314843716 +3171527441 1807318218 +528592402 2871330373 +2254571383 4082214710 2254571367 +1039198259 1039198243 +4214594005 4214593989 +1012029101 2728292932 +1573595765 1074447134 +527011242 489292434 +537733088 2916830482 +64761333 144464042 +3601461863 923238560 +1130768092 4123995207 +576282658 2204450572 1425372101 +1069660507 1954574171 +2703537741 4190829362 +542566973 2082379339 4021270075 2361466165 3187730695 3358129680 1544215584 2099156945 1180692238 944631647 2361466146 634568194 1494225668 +4242987307 3032074300 +1120065226 3805960229 +1754729336 1754729320 +2423534009 535447102 2077004681 +3107484024 198877165 +1725003765 3502233258 +3962929718 238811921 +625495751 2216663961 +253171002 4216744523 +1984922064 254368355 +3614340545 1670853752 +2356684795 472313906 +4067310391 3666294662 +732900059 1073411720 +494328957 3743226068 +3133459470 353527193 +1900793046 810775783 +2636200172 1196202903 +3360252200 1938026987 +2905611343 4055666766 +3070243559 1600131539 +1564619217 4145085975 +2893738597 3935016172 +830129108 830129092 +2961225777 195163440 +4208764439 5862950 +3709679801 2790829743 +2197774558 1867669011 1884446633 +2401489632 911408159 +2639445440 1765848389 +3460720164 2044751962 +1583478043 2939476356 +975283899 1039759460 +2112716914 2933994341 +2459966378 2081131675 +400373453 208281068 1581073586 3332105573 2522856520 1581073572 410203929 +2614780518 3200837271 +3796129470 3796129454 +428122064 1955560612 +741822526 3641921929 +3112777905 3288612528 +611302060 723616727 +304000119 4249452368 +3412157972 1287170623 +4260567270 2880451073 +420590005 2486326304 +3945990631 676894368 +3536130207 3536130191 +494960481 2366313331 89799456 +3064053129 399901925 +609269194 2933210462 +325793727 3557350250 +2377124973 2316738202 +370583374 329867215 +690740059 722096210 +1109410852 1019954367 +3771887320 1909616229 +3089547301 167803436 +2450905732 2087124425 +1894234405 3805689518 +2147754183 2147754199 +405389321 314134072 +3219895603 191734966 +3759273630 3759273614 +383528655 1513866778 +4018266077 2771610667 +4030198454 3725792391 +916418084 553280169 2315000214 +2510043897 1075896008 +3774756907 3774756923 +3692611413 3489778378 +2190169509 643289786 +3673242917 3673242933 +1670332911 1670332927 +2169417549 3688756772 +499057702 3902722341 +2469180087 1717392902 +1684876202 607017318 +1159505748 1198002198 2409019279 3838201501 +723321236 723321220 +2728479371 2397591764 +1345361237 2440762588 +3709529239 3271096322 +2705113140 4215932000 +3516168910 1648740394 2003336058 +509728705 3791481703 1869970662 2500240576 +2075637020 3727825671 +3412684697 3489312222 +1791247822 3774473049 +1078590929 91918352 +3773304182 2202874065 +1953530223 3618763948 +3608499033 4019336479 +1676507606 2372807668 +624902033 1498498391 +2987685612 1110914455 +800550962 1192809435 +2344669719 3579666659 +2684390215 3110532255 +1527468445 2982367656 +2511214828 694388515 +2778050447 3559727052 +3102126889 222533911 2775618263 1129514034 4167696166 +1672662711 3712481058 +3486064867 166768582 +3503883423 1688356446 +160396801 1595270449 +4191119165 616456738 +1036286906 2298568341 +953451999 3082102411 +1203686050 4162210731 +4105211883 485658338 2178352092 +896785934 1043056776 +4058523375 2933925777 +581878343 3759920576 +3602937287 2409105561 +1754629383 2858445334 +3396799279 3899038446 +1048715005 1675020372 +3724035716 4057399753 +2556202861 2337464583 +54938224 2544315971 +2332419547 1052443001 1982989102 +515585449 1454215438 +2039816911 3948930330 +3881899227 2044302053 +2969121655 519669091 +2599588096 3956949779 +3114063771 3548968632 +963771751 3581012284 +1670721855 2837917931 48006696 +2556489948 1905177526 +1401470441 2187916110 +1251452610 784040821 +557126615 495860592 4142371139 +58394418 50752633 +1020074831 2596393356 +1044804250 2733009003 +2613925986 2613926002 +3082747349 4143421050 +1834388963 37837898 +4059517874 3037949116 3814667912 +454521368 3186138061 +4166528213 3352204106 +640597276 932426513 +321913508 2829697210 805797891 +2703892650 2754371254 +3841964723 831711180 +2645273721 3448597577 2923463294 +251557046 1351727751 +3520855411 3494902810 +1486125733 381489580 +24496017 778247511 +4252541950 48900319 +3118447336 2201172797 +1179349607 615771423 +661580616 2486098019 +539144052 177877913 +3724280848 3724280832 +558239104 3779543173 +3373117909 1435431498 +2533959822 1365956505 +1472151202 2811092907 +2457350503 4197827894 +3209968538 3415855979 +2381541105 2381541089 3801702273 +719970178 494184071 +3126505806 2739793103 +3980276027 3980276011 +3528528253 2459862978 +1988732821 2692527661 800247690 +526065507 3211946204 +598325325 1544241586 +4227398375 2415065526 +216734658 404533859 +2949905121 4116650972 +2363319590 2328544566 +2126329684 3621656889 +240668252 961145187 +3522204959 2629484510 +797516079 64961774 +2786072646 1639405713 +3873475350 538883594 +1098112328 3595524187 81657841 677873748 2304611224 3595524172 +1654610722 1658615427 +4040221457 701854662 +185296578 185296594 +3984807521 1187052192 +4227778386 68404762 +3082623485 3082623469 +1704968070 1063402861 +1528576410 617343965 +3099783248 1947908284 +100605560 471381764 +2970774561 3774887904 +2185252585 4083256987 1221422169 4097587406 +139282262 1739017329 +3181371371 1840086754 +3465327357 1235290383 +527039537 2718550154 +2136181102 3733018671 +1694071699 1694071683 +4074980118 1908579249 +2765012643 4233571297 +1012509621 3056160252 +2370951303 4275559574 +1251066879 1848567816 +1868716998 500594849 +460658023 2689642793 +3685547120 1095853141 +3404012196 178843689 +3752990990 3944282766 861761807 3742951354 +1919209458 112417267 +1117146204 1962102269 3260985648 834743107 +3046559685 2708017932 +1908843413 4217036211 +1645293521 1091016955 +2783616685 1309733727 3274931972 +2732082651 619035085 +263947304 3459533891 3258202464 1048791551 2535115946 3459533908 3962637053 +421143401 4294064835 +3122173376 3031678291 +3333297377 35375290 +1861034601 1558885549 +2496890948 2496890964 +562981209 741332744 +2369958126 1308395193 +2596081368 750983200 +3168316665 1108888574 +903918230 1723408945 +861895511 911157734 +411059180 3117567767 +2378172055 3158990768 +3867643984 2134587415 +1392645594 816743798 2398672309 +813665910 3469558727 +3366842113 3366842129 +3145314940 2626943271 +1937377935 1478401806 1478401816 +2373131222 2373131206 +3043938329 3043938313 +1774686829 4062937490 +2804329911 3638785798 +2189131204 3911477486 +2282027798 1759477751 +2396163578 553212629 +1884480283 1634733851 +1638599360 1638599376 +3118111201 1948269878 +2390240040 4083022442 4280994627 +813835398 3806297825 +2254713154 3518597877 +3967441586 4137469477 +3247854689 490851911 +423167067 1033059685 +3144510913 3661923117 +2702951953 2901945965 +3316612389 1193027153 +4227012049 1824235412 +3469046710 3633133974 919938951 +2972556067 3538506768 +3321792653 1018230266 +1093896814 304278319 +2084284105 3785484433 2585870090 2290431801 1525124718 3785484429 2290431790 1301814623 2962044960 +3688756479 2949182575 +2758202231 1155458118 +1182955534 937992876 +2520789055 3322671912 +3822533036 1473235393 +1644143871 628763324 +1938809287 1143631616 +2885899273 3832728508 +2781274091 3585031855 +1053109692 1053109676 +1968710666 3815212915 +695923786 2525925485 +1450847481 2612787676 +449046612 449046596 +1200094631 1108626912 3858143155 +3144575463 4124096182 +3159329518 2477879161 +2398943117 2772022002 +492619314 1941775821 +3001252192 3001252208 +2960785870 2651903823 +1093622075 2537753177 2005486111 +1808354164 4091806624 +580119045 1062688320 +1300788433 1300788417 +3849901039 3849901055 +310055828 2881475065 +32152497 399391318 +2425526209 16006374 +523090276 3402419556 +2390939609 821676680 +556858359 924624326 +271864775 3638612957 +4042696655 4088280995 +793064092 99527569 +3591984697 1122155432 +2157991958 2456464039 +1846193759 2580578206 +4219007452 3143941447 +3516497103 1389456871 +905900535 281542269 +939282849 3274997878 +2946862046 1604005481 +7346912 2733563250 361352635 +415238061 4201995915 2147448366 +796209460 3917247695 +2727213301 3665750460 +4001440300 3826581304 +757390153 1553989343 +235132493 1560959794 +2560490321 2444402832 +52270089 3770680942 +805029837 1448839076 +586269592 2593581147 +2365935025 2958642598 +494972898 1448989437 +3725188405 1670355437 +340371667 3917672813 +1186359903 1186359887 +2923990570 1908231548 +143853177 4168298600 +492659038 3773866760 +2335433086 2695625033 +2774125187 2791080560 +4281139684 2547644905 +1229391033 332164904 +3231555159 2401256166 +4285927660 3648413079 +3229014888 3240072579 +2403868570 680116066 +4187499532 1497341020 25150497 2099363808 +2277973346 3142616694 +3852528311 3645469475 +1961356267 4095238882 +1907574104 1429612941 +2964713533 1802055700 +3651470555 2008375454 +1546011280 3174462568 2688207029 +1403422998 2424258418 +3117361961 2854285710 +926587671 138552633 +1189099965 2529561218 +2335430015 2711164670 +2200277516 2602211895 +2631745351 927636694 +2504866005 3717232458 +2151311685 552843162 +474553317 1813440890 +460891610 418190891 +1511884323 4286195978 +1106702304 3082526117 +4255812234 3715635003 +2544986065 2638638608 +1006228231 1394007044 +4034817322 1341953965 +2009771892 135410585 +1430965141 1647860816 +4034476465 2725729090 +258484410 3751105410 3751105429 4210564299 4171790769 4144540950 4210564317 +3654888530 1725321166 +1011606510 110882937 +3811218847 3806045473 +4033379140 3956226270 +1033755256 2717247720 +1724622591 3516392318 +2831393791 4143971543 +1178615229 1178615213 +1090765265 703208454 +4064728123 2376543976 +600707200 157404251 +3960069529 2338001814 +3425703957 4166902022 +3078920816 2894844680 +2243465105 311034192 +426631007 1727439518 +4264524289 4271868208 +2381975651 1025895239 +2157253371 791045484 +1337896817 4197330662 4197330672 +1281174793 1068361006 +2266341646 3037497625 +5588537 3208481726 +4198496604 1320520647 +3258605749 3822930073 +1000965434 635222621 +3391591226 1984742475 1984742493 +4132954997 1096487228 +858648254 4095310221 +1029386400 3318954363 +2543933614 1627298287 +672807703 811655991 139560818 +485002465 4093511081 +3300676749 1098455524 +3737907786 84830829 +3322671726 3322671742 +2122158806 2821143991 +1517501557 3590161946 +2233731877 1482828892 +1728594584 3925678557 +2784827412 3614466943 +2357682902 3075313079 +3195543287 1089757556 +2225389157 878164204 +1590246532 3580409199 +1239798943 1341319665 +2124178305 3509625878 +350427090 3011411845 +2625879504 862178915 +3020141367 609922978 +3990080625 2191074579 +1327720639 4028686615 +1844781074 719420485 +4097748110 212444057 +1165323229 323651540 +1649051747 508867530 +4265182171 260739538 +841627570 2859838778 +4128565101 3702969810 +4058341175 3901067711 +1370371361 3229543381 +3669169730 2313947619 +3552534248 1044539179 +3659406842 1466511517 +3923414614 3923414598 +246646477 209318962 +4210698061 1691082276 +2976783476 2913005256 +738897569 1947550145 +3916714377 186407608 +1689336864 1106962399 +2479813607 2479813623 +371882630 371882646 +3182389746 3182389730 +1387338104 2764773371 +3072090930 905450221 +956428608 4262381523 +2768982242 2999997379 +1921491782 2441479969 +1827589163 4014022195 +1648826364 3314477479 +1653216647 1760764548 +1764239633 539817654 +515454928 1405253829 900380200 1329594770 1490274757 764599395 858852395 1463815720 1447038098 +698245109 2761561484 +1711054602 1865104553 +638410452 609540617 +3837973335 1974645222 +1026787209 281798126 +2988366228 4203774969 +4165363114 1742777695 +3417600822 3809566215 +4024768585 4272247816 2619065529 4024768601 +3173938225 3976069754 +962001394 904624115 +2100302086 413846647 +1431570175 1380385640 +740312400 3335331061 +1850715193 873395560 +3095840855 3095840839 1617926595 +124851915 880318464 +701237604 1290896283 +2073515709 983594372 +4098972689 1012982177 2903764678 +674553423 2587489870 +2497502491 1134689701 +1530494826 92509147 +1706713553 1488043382 +1769324728 898876229 +3488797547 3326267764 +1695482337 4154455350 +1317623732 1446318159 +491294961 171715440 +3382756306 974406547 +1179805295 2893664578 2910442200 +3728286693 3102966131 +574334639 2464638328 +447444558 1240153305 +1943348289 3359151939 +3206796787 3630812570 +2403177305 3605984542 +667275851 1986553401 1609630574 +3783229620 2948045647 +2710872087 2093513205 +2596958799 4222743128 +1184269122 2110604619 +303763992 2560457677 +4108981724 3743800676 +1741427859 3534258944 +3603916269 3866998853 +1844080395 1844080411 +1402236580 1475469140 1059545212 2931427819 920880280 304365993 1159699086 917122089 +1155979988 4179910363 +3124231987 1495711052 +2916366521 4279788937 +849717007 3704879381 1051503000 984392539 3385195672 +1506862407 3011500115 2866343616 +1149236963 3068818886 +3866363921 1283458256 +1633798891 938635234 +133647220 4266379161 3930797512 +935613970 935613954 +2780715485 782247381 3349640930 +651910255 2589098680 +1380390753 3874082208 +4178560138 2647811387 +2837983522 1816483971 +1097920391 2374405252 +910115153 1535591021 +2707061956 3675006945 +3252565897 850269688 +1923748725 4139557180 +995963180 3107605282 +3210254971 787218216 +3441293459 1303776608 +2459994971 1082681843 1735195898 767254610 +2489100390 2081273265 +970575717 519449226 +4091151702 909534833 +31203661 982019122 1455575717 +2234833837 1597362500 +1698568604 1994708049 +2548913583 1754597889 2299477921 +1356626470 1897155031 +896825655 1566232966 +3323538608 3254731352 +2825732540 3822289275 +2396858700 2516329313 2516329335 1198834380 +841368342 3716350589 +2031545448 3839921795 +540252367 2151255512 +1902272675 551428252 +773354486 773354470 2256440401 +1494312163 425840970 +1286273764 2487106893 1286273780 +2188292292 3056329657 +3788528283 369009170 +1930017332 1572992792 +2170394202 1231705422 +214144471 2186208066 +1427495865 2859000894 +3085577469 3950444020 +474700964 782423615 +1050913720 1403474619 +193857772 479726487 +4204980981 2679445658 2047600339 +1186550636 3250475777 +574194883 584469658 +3575597125 466583164 +1826097354 4277645939 +2429633524 3983407385 3714965503 1021276890 1021276877 3309560755 889940669 1524588446 3776915627 252511522 3709805128 2429633508 +966274478 1485826287 +3245704351 4171572060 +1758750171 2287872392 +1119935669 3769812646 +2760817417 2257629378 +1963077488 2725293379 +2956730539 430402868 +1529922410 4156792795 +2831243235 2342638570 +1934066831 144026904 +3872680292 2401295695 +4204884585 4112980824 +3112580721 2135405552 +2358246975 2545370603 +1134918933 2458118172 +3870381092 3289339662 +2875843409 2489637622 +3428527924 3884666585 +4041229543 403470240 +1367008798 3670748030 +3042729568 3764949299 +1771672018 3424575098 +1848454270 4011657801 +1907597356 700786007 +756583372 3382972961 +891816978 3221946437 +1315329895 3525023520 +1398243899 1841431282 +51095829 1032215046 +3391511717 1916143956 +1865377992 3483497181 +4011303589 2635167349 190865610 1059108912 1847390305 364744006 1588548881 3711394643 2210988418 4017120326 1795899509 +2299455164 2121611751 +3032667830 4045221665 +1184186993 2381813734 +4211682500 3298869177 +1258678592 1515073491 +2910639065 2245677736 +199670694 458853201 +418258006 2497092455 +3279434491 2973253924 +3732295477 2699661674 +1809280517 3374461388 +1597697609 851778798 +3709036606 4062138125 +2671438606 3082815257 +2175689277 416372002 +1965468815 4209091864 +2914006320 3506858312 +1617409764 4183498200 +367277107 2839424090 +1317837830 1527964231 +2584744988 660968135 +3068784455 3068784471 +3725756922 2435789963 +3276929131 47703704 +3876303469 3836614866 +3908469007 1035603291 +630021013 2995202954 +2896653844 3769217088 +2237260315 125759634 +2150620882 90761268 +1646667760 1913708227 +3417155814 1244738015 +3639668288 3276213957 +3405862872 1797081357 +1013288078 2715567001 +2504720002 2265884341 2265884323 +2470652201 4223257496 +3648413161 2887505843 +2803235249 3760252499 1337536 +3352124591 3352124607 +2046480441 1054198184 +1979355542 1332948785 +3164740558 3241264473 +2273270943 3967733342 +2922151400 353385493 +1395498876 2142207271 +2349380419 469771773 +302891297 2359756512 +894113301 4165717055 +3516642246 3189506209 +228945624 2448898080 +2128517598 1128370654 1648276573 2801590068 985851311 1692091385 1396600347 3511259257 +1260042290 1829762739 +1743217092 3137764527 1228866613 +1979789436 1071600423 1979789420 +473370073 1394231069 +307425310 1672400959 +3277407482 2139592093 +4209343419 467889870 +1079601985 2378422102 +770224848 1628856366 4749551 +899924598 3872071633 +3825605092 3650798079 +2665570528 4241195173 +2055176483 4189604380 +2658885586 1934204406 +4055589107 4055589091 +2842118246 2842118262 +923945125 1836794510 +2675445875 2097276186 +1555829 2676932715 1877706446 1216296597 683081566 2213099526 946924263 4076253892 2043697864 388217528 2496231240 3880043086 3183180975 1422331776 626282005 2924360960 1669279834 1342411762 1722220992 458840997 2531191217 754735917 2860992670 2091749545 3655131567 3001037291 5197580 632920764 2144472031 1413040021 2837066145 541979883 2968569695 3996138433 4038030823 3501126752 487877103 1019639029 1882151002 289668096 2904899838 1008615471 +1607930466 33498798 +1653992083 2339195136 3337374317 3305129338 +1137095346 1674268197 +1894810853 2946577523 +437677395 1682839994 +1441207594 1441207610 +564372213 1655736913 +1711509626 3225705222 +266481478 1192258359 +2754466997 1575576528 +140424752 587964829 +2072739067 2006302514 +2307755014 452723202 +2196904961 606213526 175778749 2007497510 995285652 2158496084 561663981 606213504 +3247127070 3425467711 +511159354 3351228777 +1117136897 3546347926 +353397975 2763679129 +3926193755 1424746177 3234845010 907839782 +647211142 1081232119 +683702616 2130642317 +3851316377 4164220104 +1932050060 3575903841 +489615907 1894515462 +1397860023 2438896962 +1894177733 2154559258 +1000844567 888253945 +3378778601 2852208453 +3500696366 1940955577 +2900927456 1581517659 +2638956222 1535139081 705861599 +564204190 3844017303 +2627813679 3235486968 3235486958 +3681840314 4043650946 +2538757757 2546617205 +1460174636 2476396819 +591800462 728485778 +911380646 4176233822 +3746724306 296457433 +2020507100 333574219 +904051652 2548929951 +1084247838 3663498281 +2618484020 3854487759 +1603970686 3854716354 +2768847374 3683843087 +705729213 1496596478 +3897153271 2738710214 +845885265 707069686 +2897562377 2897562393 +3788340260 3552118716 +1159585727 2366060968 +1918626501 3417478156 +1927798734 2969915718 +4142378732 289092119 +2992172720 1912586005 +937111428 1368612984 +2691862579 2279058295 +2939150033 2572927750 +46806139 803744062 +71912850 1365580997 +798404383 3008129202 +3937461745 1702492784 +2186731594 1488069702 +2109767462 470296791 +1380658364 3310087302 +1906777579 1906777595 +3097500460 3490367041 +1943691484 4252142993 +2433274911 2813517772 +1553673591 2636003534 +2976347139 1841170416 +793662452 584127520 +1746004483 865514578 +96569529 3366599464 +1387496291 2476201162 +4219136537 4219136521 +1425576855 3765992784 +2452971808 1242031475 +1275788193 1222998752 +2080472188 2992043815 +2918000037 811556115 +1485339895 1440528592 +670479599 4202157917 +2501148337 921762984 +2793059241 1768903387 +2392892279 4259402832 +1126128864 3901041367 2095048200 +715585922 2799355829 +941609353 941609369 +498555007 1184911358 +2012724134 2164024919 +1162896187 1152962476 +3153700883 883227700 +116147827 1492313868 +717262935 3582372813 +3587821620 3595553252 +1345918208 1248568539 +2642223976 1409203389 2731134544 +2588741082 2588741066 +3762610286 2053983535 +3030462560 3116312371 +2481310928 2389583674 +1950233685 3675817459 +510025049 1044224570 874836744 +98790375 3115225235 +3557757380 2545481631 +3739266692 140505390 +1561296670 19624173 +1324964093 1940392437 +3077812981 1997438675 +3807590241 2782932406 +3520221637 650470378 +3395103370 881865189 234136838 +2312058795 450582478 +462367427 627069162 +2455685142 1860244463 +3402839183 3648765208 +1027783634 1479493990 +1403349291 3630468770 +3905638902 2371871169 +3007424900 3026049737 +324023539 2682184097 +2036233172 34595326 1023460041 +4046060498 283008697 +3593715871 3531094600 +2740637382 2015979962 +2802893262 3445692239 +98739941 684505708 +709237695 1264430526 +173145395 1913755468 +3475539002 1455957853 +1580539188 2174548185 +1072482538 1521608517 +837466591 3734534812 +4271644106 4271644122 +4033169499 3396396868 +3557257883 1656318482 +2134806069 2222579050 +4181813990 407301858 +2900231346 2665231612 +1737775720 1342519438 +2035746899 3016573357 +798740286 809975455 +966485296 2930949222 +3144298960 1445444212 +1413066697 1607448942 +181327438 1369136345 +3164248755 2590083020 +2050311615 1603572527 +3924702313 3215657413 +3942168546 3347675331 +83305569 2188782225 +1811248519 2053637014 +4166077180 2450248880 3824749233 +534311247 3279735727 +2004159060 1335181224 +4210957073 3326161514 +2552994636 2645464259 +2884680130 1074759894 +2268692784 2751880229 3563302216 +3098704359 135925235 +4223287658 4122206974 +547596743 220488026 +2883307252 4175222540 +482997212 1346423432 +4196613266 1467505107 +121447121 910020358 +1776781584 3346842677 +3504230180 2418907407 2418907416 4059469225 +1242958272 1242958288 +1233740260 2806323689 2806323711 +3746283817 2906723214 +3064501117 140520898 +2273678508 3975933399 +2451107766 1538696082 +1816516180 3320866351 +4155953804 2113830113 +4099058847 4099058831 +2255210545 3433833766 +1887382054 3146411377 +466910392 1068745466 +3342939429 2172579048 3654227304 +533642844 3225156068 +1233254512 664410197 +66615406 1344918205 +880590 3810984281 +418167919 2880217774 +907035018 2778147885 +2554839906 452498261 +1392194625 1805531289 +1880730350 3839397742 1718097071 1718097081 +719312322 3466055670 97236183 +3788700139 3788700155 +216812408 1423059987 +94721710 94721726 +2559740487 1974447552 +1115058205 3711682050 +763312483 38229724 +4147064568 390525051 +652088638 1838903433 +3993167488 3473509407 +2447665267 496004364 +608216092 767711249 +3769867323 2045076946 +1097014875 3457604453 +1971605625 2018160232 +3996855558 489159089 +650774941 2903319074 +774971475 3845374435 +1263334267 4112724322 1263334251 +1626839433 2803314995 +3226227514 3209869723 +2929301553 2929301537 +12139977 2566412895 +1959250819 1501912874 +3584245434 2186107266 167493323 167493341 +3004499367 239145302 +2915093006 2487590540 +970461421 4230128914 +1400199926 1667730549 +3471021287 3863321320 1959176588 +4252356460 1819641623 +1383924646 2160901697 +201062926 201062942 +4189133805 4274976274 835542597 +568608517 1599851724 +3490248933 1663029370 +2168694947 545421450 +4258071453 381458148 4258071437 +15679097 2791676220 +3897915180 3996593730 +3076254106 3076254090 +1489472559 4045516270 +3698172835 1545759441 +1278494299 1018052126 2240501979 +2916508339 1340168197 +2381972436 1418987183 +1712446995 2509337355 +732608617 1119461093 +2636974146 3337343562 +39693419 611740788 +4280005453 2775135397 +3928605597 1019146274 +3393419267 1798696124 +2345564089 493933544 +2877014617 3209588380 +2840179888 789016853 +1788085603 17655888 +1177286247 3980598899 3728008224 +807133763 4276432764 +2425433771 1193260308 1066170173 +2874021973 15748554 +272904637 1482312852 +1003473262 2182041858 +3634443087 3358566796 +2272949647 3569815576 +753906175 3159700606 +3801760437 1842807548 +429048138 3840049238 +1309709173 1309709157 +3416845947 3587254319 +1632274163 458387596 +1922478434 3308862787 +2503206076 3035511108 +2186272316 606255600 1606080615 +2055016169 4149878866 +3171889276 451498791 +3291731845 2583873014 +858550304 1612722711 +848001391 9447854 +3004415646 2249527977 +1053188013 2135465284 +1229916891 1440380351 +2899655806 1292183341 +331773689 443369960 +3392696793 802896030 +4098039689 246064312 +2539230647 562407703 +2108800410 2026731901 +2714304540 3412798471 +2134806057 2021247640 +3426309501 4215378900 +2528367665 1864680628 +1862898320 1544665269 +1935984330 1906634747 +2791917160 1854634132 +1390122262 2242621873 +1246933738 3928991309 +1512076485 85565928 +640214481 4176339318 +1022569344 1926068883 +2608710820 2749924648 +3770992554 3224429586 2143703195 +2578619519 2380239660 +301194156 4007841751 +111404532 3059678173 +3788478911 367594876 +366444363 2906481410 +874521517 3147311442 +3678975978 444923228 +640987326 640987310 +1800157225 301754520 +1995735889 1995735873 +3523759374 2970701071 +2607330584 3184858331 +1335581302 3988807254 +3451243624 982406685 +449153154 449153170 +4002649819 310489778 +1459041519 3592967214 +3575903420 1134183399 +260086078 272789087 +2392868767 626048840 +3019059160 534008091 +1913325558 2103281735 +480575653 3695566282 +1246509561 4009706216 +4162092351 1779917057 +2831545849 2829203176 +3274678311 1794710880 +2600827464 2600827480 +2610684645 3680906874 +151522185 4192078329 +2655937891 204636532 4206343517 2557057738 +2825931030 1947106785 +1629678944 1241862628 +1328775524 2438355944 +3066198573 1096255122 +1632238137 1618274216 +1541845644 1541845660 +1782049581 1661417426 +842788855 2950634082 +721044023 3740679302 +1313166615 1311044390 +587969351 3737802308 +3704567877 3744830618 +2951618805 3906855356 +1726526413 3954927922 +2076196939 447034882 +1637397349 686401601 +1813270210 3425970294 +1905097633 3761533894 +937883364 3257657039 +2733376650 2733376666 +1514371933 1966814068 +2579612371 1106737984 +157858639 1201581114 388405624 +1966900767 2398863580 +950054727 741944883 +1000464824 2547406011 +2287150462 2381608095 +1465026980 3200670204 +3808954404 1467251224 2309279913 +2191857921 2867223702 +2199703258 2199703242 +4015326825 1421848537 +4417602 520609682 +1329084382 2474635903 +2089177844 4218721808 +1595709268 235026745 +834937075 1254088346 +2912035338 1191941563 +2438996367 923038833 +457974628 651418078 +2977272636 2551629681 +1471545005 1471545021 +2795001254 3559994276 1100498161 +4074878387 4074878371 +4287892278 2155633943 +3025654311 222286710 +838329297 2050728464 +2951190382 1434632717 +3085213457 3196764119 +501498065 2485400694 3746695440 822633239 +3396742351 1785790234 +2118211497 3034940184 +2892161886 2493912425 +3031718817 418135648 2984661969 +297475154 3538005243 +2985471980 154704640 +1735840091 926368030 +1621531378 407235301 +1158762670 1749156335 +3659597436 2795158567 +254200800 1262591298 +2066871328 262360677 3324062980 51669228 +177890971 3228563550 +844028887 153359216 +1380741996 4200182551 +3722007517 438240482 +2036948365 2917025019 +3187471614 322284489 +2326384839 273918294 +2413370138 2361764331 +350932370 2141297861 +1598125166 2234594553 +2680085263 1753116711 +805491543 3950162406 805491527 +3206493315 349759891 +1944548079 3464392792 +2627806362 732733035 733831778 +4022930996 2910936025 +2859047314 3594305747 +4227984942 4255687854 3842634351 +860806499 673612508 +2496234507 1079365442 1144708418 3528504821 3165285166 +3478148081 1282679910 +3470711962 1121273469 +35817783 2472411526 +4279147770 4279147754 +1004667641 1036692968 +1350360708 1350360724 +2644591280 3571186453 +938780168 1538288876 +770394689 2321933376 +2599507030 14195510 2348570502 14195511 +2629943238 2332091575 +2063414730 2063414746 +1726160805 2430329223 +3681687169 4120472854 +3498724055 3157196729 +3885238592 597711208 +3138613642 161201211 +935233967 1878179448 +1217806489 2476434022 3716657367 +910869332 3417406767 +2434933192 1086008779 +794336366 966288741 +2114010378 1024027966 +1609008067 3161746410 +2955637338 872728098 2189041398 872728117 2925855659 +685199981 3086401924 +3540111896 1138605019 +3781109544 4039812093 +556427893 1047183753 +3399731349 2496971420 +2296072943 1614214702 +2533164086 3863847185 +1172624334 2686828573 3966173306 +2040920927 3746215560 +2782569173 384844666 +1937926320 77463496 +2330243862 3154504625 +2011009544 3117212317 +539522647 1823148323 +3195081795 2639383123 +686984288 3587373875 +4022515992 709059237 +4077162343 4146970422 +1731791072 2357435381 +1882415715 1882415731 +1900926424 1517697397 2461191037 223503258 +1183407417 1128120488 1128120510 +3565439019 3074268066 +683650341 816722457 +2827154876 1464491376 36230897 +2831824067 2035355370 +4181220266 69244933 +1578147985 2771174470 +15525397 2314089226 +2708956872 2743369699 +809633733 1035508557 2337475050 +639801926 1316543543 +176687352 2351308397 +386628014 3087916078 4111502575 +2295253221 1116094572 +3660777755 2572637586 +2660533283 3335258890 +411366685 2155252657 +4150124794 229402069 +2313922200 2968306678 3052880219 +79109041 2997795414 +2355549300 2044752537 +2067027539 2067856064 +2572296562 3460998757 +1181856305 368804656 +3638196637 1338683870 +3808667754 3835073221 +511873042 428395589 +1056266126 4288386194 +1688855040 2003748371 +2412645927 2990613157 +4157539897 2055653914 +1418133754 176589195 +55064427 3986488521 3356426238 +3866680680 4021620636 1357277077 944016043 +1134339280 1066890101 +398752715 894361730 +511850897 2550177606 +4046353189 1078353123 3696250055 1849087068 +3904375196 1615348807 +3127852091 3016347820 +3281124590 3436260015 +918161200 1457082499 +2013518822 2325588886 +1042654676 790628137 +546188094 2858897481 +261194510 2417053465 1690751762 3661591705 +3209183361 2679999232 +470760411 117127634 +394742214 2705027543 3489211041 +2994271070 1382489321 +4073227311 1621628398 +1226231332 1461117239 +3691113952 923367347 +1407255441 924818301 +4131635819 440905086 +996360529 996360513 +2507967882 3708997677 +1168947663 3781807921 +212649750 464329002 +306725302 306725286 +3587264312 1711945171 +3302607129 4225208904 +2527059698 2662711437 +396679185 474057997 +983246799 289385176 +2809073413 1824488673 +1587752295 3561278294 +1405517996 2373750487 +2510386933 2510386917 +815470600 2351355019 3277874819 1042330403 912021808 +2052287416 961706347 2052287400 +2947561557 3882397130 +1295541117 3423873963 +2154557649 1198382166 +768198873 778913807 3157053374 3987156360 +2970348 861505921 +886167255 1025608771 4250219632 +2205818978 2205818994 +4215127505 4251613537 1395773446 +1060642486 995645575 +4148188268 2789533207 +1353150448 1353150432 1625639695 +3501225384 2428656067 +491326519 4268539320 +2825749086 2663214078 +2805529674 206212053 +2735880759 3971064966 +2816813403 2831161924 +2289713619 1834195501 +1167137826 4046502205 4022659301 +1310499283 3390226234 +1933103158 4277348887 +1395281528 1147136064 2880394288 3126268814 3081725715 2181143552 1671005947 +529751863 960216169 +365559031 3713303127 +1011087292 2600402151 +3153727162 2762288861 +3298299150 2304544025 +2508489236 1939391855 +2633173929 3147520782 +297774795 3965868197 +135714578 3455357253 +231519460 1978848473 +2584099992 2584099976 +614738988 3664873793 +1614165165 1571816722 +2001622521 3377551102 +766954703 624071706 +931932785 1758811164 +89054958 1227419833 +3437383704 405688755 +1964711578 183037045 +1207437971 3732448634 +71959893 2957716716 +663100090 3979449749 +3162673672 3381387915 +2463145875 1971450979 271186598 3083044374 1590432945 2976593018 3083044352 2460897645 +1417420024 154665204 +180781794 3632269781 +2244038490 3914328765 +3005289556 1360199737 +3118560671 4279199681 +2005045084 2122821073 +2348165983 487220115 +3884716195 612249738 +3461895010 1546808930 3921338987 +2918885390 4019621391 +3580773014 3580772998 +4220970980 4069460991 +4104932937 3652694373 +2519939789 2519939805 +1066919497 513688238 1696564472 +4090998868 1853378010 +2193086118 1835460417 +138469145 387920990 +386628000 3876615923 +3847709062 2391705079 +149763730 3413176634 2674714579 2674714565 +3611508468 159192392 +1058917266 1449135661 +3571323148 869839708 +3633060229 1770794060 +4273313232 3353007715 +3259061187 2413222890 +3179857873 793939462 +934715255 3319010804 +1387726428 2451505873 +1940040793 1645563912 +704861233 2972708379 +868167838 819086505 335120553 +1469282946 2028157325 1596578474 +1960758532 4273782111 +900541303 2259386850 +1579130395 1187374212 3985030111 +841398217 3153285496 +2780008921 3671731669 +3382334560 3011649476 708993837 +71532275 2839599258 +3808441472 2837093245 3646072197 +2537721966 2345229625 +1602327369 2717572088 +3045388844 3964222273 +957049936 2498598059 +643868273 1474397496 +1978392234 1280279949 +1151426628 3818446639 +2861388132 3297248591 +3647997273 2757257992 +3069344162 1907685954 2091713387 3617050211 3153741813 +1838752934 3784518630 +1338976564 3609058511 +525657819 2727154312 +4178220390 1906913153 +3765083453 2228586260 +2612793774 3608138991 +702575856 2947176463 +47332719 47332735 +1446108345 3859856047 +213441921 2282009088 +3677462844 1260441959 +477505413 1739022745 +2403460234 247121197 +1136695115 4079889154 +2502692882 4158596794 +2301225937 557145533 194823903 +3297268343 2659242914 +1733781090 1532211136 +600403928 773525773 +2703788007 2580410550 +544349457 614711760 +1865389443 2330484028 +333721862 855703366 1446587511 1167848058 3087715095 1446587489 1446587510 +1478538322 226221317 +2387695266 1787268272 +1230600563 3940167706 +517424871 3416256220 +1280128991 4237227038 +665496241 581612710 +940502898 2978148453 +2733299309 3836710276 +3173554201 3545516706 +3978038517 942171562 +4074362198 2733299313 +2542603250 2232012275 +4142107098 2184315435 +276808582 396432849 +1998971589 3878016673 +3910400038 647886618 3183408755 +1052358438 1052358454 +2291423383 4146260873 2559014310 +638183903 3231394334 +642161362 321239173 +2536187247 1743515064 +4020263538 2876137829 +3087330850 3519209365 +3989176445 3417490644 +1036758656 3251434418 +3368467158 1295558070 +2680972443 700604434 +2911319199 1680072550 +618767839 173491851 3996655112 +505150858 4027588653 +631539818 2672979062 +4271433602 1200486158 +955240068 629283295 +2519257123 1757542775 +864104747 1063282338 +1356099132 2053736551 +89883706 1895881474 2836473675 +1846018321 1201253840 +3467265196 34216663 +2767380437 3203614828 +3145584908 856692215 +528116149 3983219996 3679129915 1935803192 +4257416294 3220176794 920744358 920744369 3758091415 +2273355985 545898768 +520220625 2360802144 3826104371 +1519502139 3897112040 +592608822 3504123665 +582911648 3800925640 +1076498366 3040676063 +216215256 1067383936 +3707040794 63742017 3888205588 855977160 2284070151 1185199456 +117426916 3903612137 +1769169758 4251620734 1587899647 +3203303127 1753105510 +1279423502 3937156987 +2924139616 3217838899 +897134398 1808096905 +2879984176 2879984160 +829764676 2709705528 528566025 +268078292 4218139065 +1565931027 28778490 +4163384687 374087086 +2097700002 3575104900 +1794548453 1195535994 +935423742 2687996877 +1069965616 2504720003 +937153072 520872323 +2963927053 287995107 +1680907208 1254651922 +2764951038 1642271563 +1444401259 4068284514 +3780034357 3805733226 +1945212720 2847153992 +3007713072 1732896917 +2107879863 2107879847 +554896270 2667262095 +1957959533 612425874 +566367682 2428463352 +2876203731 2947082870 +4243747556 2190507885 +2860122251 2860122267 +1233687386 469759659 +1387597756 4010263783 +2360485592 1416832539 +1407105963 2996923938 +3099646932 808545861 +3266008478 297256873 +2700344635 2602017764 +3920586993 198633878 +2933990373 2162205310 +774576002 802554275 +3650466179 161902908 +2647730964 3027906175 +2000692683 2231074452 +1884481707 2105820450 +1316506135 2077446548 +402024552 515339628 +2927365151 1541781212 +2361496783 4032609039 +132390413 2031832690 2031832676 402423154 +2926379848 3717999179 +1954842254 412541966 +796709953 42082880 +3746694632 809829397 +2895864272 2291858037 +370090224 684124747 +3730005481 3862746574 +2685317228 1663023617 +999161274 2055629789 +2575964368 2221215605 +2296850506 1600814175 +2390240007 249099268 +3873236780 3388591804 +2871434879 2891808810 +372898895 1279799374 +3817491745 1404529376 +2021755473 1081583520 475848947 +541737908 3743516703 +4017658309 508095485 +119056757 4006534732 +2260139367 2031151401 +271492837 1584446074 +2371937055 2927987166 +796863291 3260137789 +1715829253 3148834346 +1630466707 1885202030 +648051963 3383017266 +1723176424 1723176440 +919896783 3935002930 +1596929478 2639373985 +2246811692 3405160269 4260177239 4176442858 +3722103115 2322260244 +2743591371 3102496956 +1132720476 2763322321 +324258701 2271581872 1352634504 1752807897 +1230600554 3789169101 +3728078015 239980946 +22815557 22815573 +2482964750 142295311 +3295576917 3295576901 +2230575740 3354233127 +1405307536 1317102628 +3881608664 249107213 +4228512262 4266291270 +712342967 898444093 +1996766943 984545566 +3130688624 1613928212 +355597222 61810241 +3033291794 1015139646 2947870789 3973468845 +1257961616 2978257643 +2342328642 3729055303 +832450619 1460006130 +2133742671 2230237262 +4181442324 906135150 +1361769421 325560612 +2063877401 3233334856 +3521702591 1122322026 +3955937354 4144410034 +2639225492 347206143 +3438694751 730635804 +639010986 1730593156 +3384668227 3640736106 +3463452412 4134809255 +2193778326 1845984817 +3501151806 209711967 +2277331868 1258987149 +525520578 291208053 +2846454475 1640683512 +1312538765 3037732324 +3547870723 3876690416 +161842583 883037638 +968095151 968095167 +1256201529 927673118 +2914456066 2033277237 +2205049079 2205049063 +1351970590 1351970574 +186867474 3556019629 +2702350892 3051241404 +2926644993 2633670272 +4257455548 1927236515 +3598062019 2536583643 +1339729972 3912681945 +1077046384 2137044035 +4065251466 4229056818 +2906946232 4261547333 +2491388233 231847416 +501448202 1718250015 +3275897486 808301021 +2937371590 313945538 +939303708 1052034311 3092164108 3348249031 +2232323749 356324737 +541977371 845510544 +3908118216 2074086603 +2479176959 409247395 3254048358 +1622293944 4036438203 +1712910836 1571621116 2906972953 +471069768 471069784 +3272827538 2987459449 +622071418 4195618626 +1395600727 1873002415 +1685038857 242733422 +2956442273 146459488 +571253098 571253114 +4277899020 1912745953 +81333909 917632156 +4192988917 1667836842 +544377849 4137818078 +3933518783 3569585576 +2410604590 833758127 4072615609 +2278656711 2200601989 732084690 +1030599250 110965498 95401747 +815470598 1998948887 +2612410214 1341088514 +4168288415 3040670382 +2468189660 1939007825 +2177803170 4199258115 +2662188503 2923022378 1446810452 +2628120702 4003968905 +3604858187 2317194498 +4208048491 1126622068 +473041557 2545635629 4156991626 +3722106761 2632275515 +2398856872 56776620 +3191927610 3124683851 +1276867568 3208086229 +4265548600 1968691501 +2156284799 3530086654 +3417565306 864581955 +184381947 1933271720 +652857444 1023183460 3640532047 4043743240 3640532057 2786266495 +487879362 2301667171 +606824235 458451124 +1836896664 4085117531 +3804255818 1053283963 +2799003729 2799003713 +3895571882 809564813 +3673360808 1419260797 +4200114726 3442265818 +2033556374 1701047601 +3039258728 2500418475 +2448692533 4164772476 +4290740157 1467356820 +1162728053 2390904362 +825335770 1260299307 1260299325 +1090276674 2202416619 1003117489 3401477922 2254087480 946286515 3619437034 136026833 285586806 3429753321 4073310203 3898886239 330423530 191563671 2963206051 723348259 3924275416 +3273209933 1840488740 +442891449 1200412456 +1120270010 2912847093 +1733168053 2046884944 +1291488940 2635757505 +4151627827 3219374170 3219374156 +283777732 190016264 +2252447004 3739181071 +3669931286 3629634346 +2502677383 3386254183 +3557705313 863554208 +4274277764 2466645727 +273126943 3216069342 +100357817 598312254 +56677 497477770 +3380598292 1212023151 +204683747 396632138 +2533858707 1409093228 +2576573158 3104098641 2576573174 +1059950748 225538888 +4077162351 4281191342 4281191352 +3052880192 3023812549 +2821084561 1163440976 +1802203402 606270125 +5083666 3834738875 +584927703 3109764464 327031866 +3673081939 4175780538 +3969519850 1377070931 +2406862675 695558074 +2771405439 2315601406 +2226748871 1452500178 +2321166213 1358483020 +1889575183 1541245592 +1704363940 2415363881 +2468372285 3639995650 +365507005 3938619689 +433815540 433815524 +3876894085 1251590234 761589507 3389640106 3389640125 +2994244053 2194896617 +3123425004 2417963543 +1273426354 2102128973 +3759024801 3759024817 +3993003072 3936211155 +2177033639 365594830 +1149125127 2909138718 360148009 +1541855970 4106450410 +343405965 3319237874 +1424410148 2925291535 +1642670327 420183238 +1300435920 1322534955 +2928296416 2745545651 +3930616084 3825861241 +448091330 3511169757 +3573032406 413372398 +3340437521 950680108 +3618163710 188294952 +189582765 2162083332 +4058871191 4058871175 +753256896 1841076563 +495569839 787195000 +4238877557 4238877541 +196568682 307066869 +2175043096 1312161632 +170057894 2598872385 833177585 +4267930265 260925150 +3576178781 141196936 +2805070534 1776518114 +2485933387 3060448888 +3979459980 4048380791 +3156471833 3831195902 +1022117133 4109415282 +3293308 3407577895 +451315247 2279947246 +1678966614 3756520561 +3505312027 684762846 +165181440 2143610899 +1207275698 1226849764 +1600179474 2634156738 +3269155857 3069895073 3069895094 +1531340573 3436466850 +2130306792 1801078455 3412492075 +417658664 1483805693 +816615095 1453632016 +3446572597 3446572581 +744554243 3562403859 +2187269752 2187269736 +1162122928 3136894741 +124801075 3905831002 +2303495665 816234733 +3154636444 2625412999 +1526126383 1637138158 +2006659095 2595540893 +2008561358 2246657085 1865186329 1848408707 476086234 470244168 2246657066 +3653327121 3697227206 +2153139603 3745294106 2598116986 +805380553 1523068775 +589733102 589733118 +3841261732 1267268600 2392795948 +891889417 294474104 +2521771618 449010350 +3387621573 2717005338 +802274950 3442404599 +3721645053 3721645037 +1791539840 2583533459 +1969314964 1548008687 +3986751342 2292135919 +172542509 2314775961 +3285366875 2679650125 +1509517898 3986838139 +4107677394 1059828869 +2822785204 693232344 2449355538 3830249703 +2165812737 960949142 +222318182 3385089488 +1600217924 3863640912 +1969429879 1100989428 +590635070 1607798089 +2562934738 591786166 +4071083431 3810717152 +1689825224 1746235637 +1393418062 215386063 +865321448 429539389 +1295924618 3915809327 805536030 +2432815713 2799578806 +2011723858 290744571 4009677822 351627525 +2123622318 258931257 +1303919898 1929916413 +3712530722 2071687299 3864141354 +2963015930 4256389040 +2572070507 3252458082 +2875600354 3017423562 +2182657823 621550443 +2460566809 558329551 +2066828521 951163470 +3006617937 2030002576 +4292397745 251621342 +146502003 840144908 +3613838087 500276246 +1408769404 2878761511 +594708075 944347764 +1919260100 2509361337 +3249698768 3153239139 +2076002497 2348386240 +916569491 2476568186 +4110005561 4110005545 +3407580215 530049897 +1182278371 464287446 +4218635985 322447309 +2096359320 1274385485 +3394913217 3394913233 +2306991714 3648891971 +545041393 356691046 +186897150 4282030029 +1332908539 4233868514 +828808844 750631585 +958077383 2896794710 +1410297178 2924029099 2924029117 2655587181 +1617120588 139636392 +233187497 2320630296 +3557651489 3557651505 +2504489519 2122533713 +3741740717 280743698 +735204039 3273150294 +566421431 3704800518 +1376093737 1202860696 +3040400929 1769543158 +2144580272 1765917093 +3050922125 3628450788 +1015877443 514272996 +81520444 1671779191 3878865909 3794600807 2229040625 +342303408 3462109955 +328147961 3277168894 +620750597 1138273484 +3265933765 921458970 +3229094823 2751918048 +1768848571 3018742372 +4043609253 255197114 +2866364186 4066459875 +1280741509 2974122316 +100953775 670711150 +774323549 3843061077 +2523194978 519123913 +3588981057 45906262 +3415010459 3415010443 +517008901 2280042956 +1479899845 2972736860 2704294924 +3546449195 3143804389 1322151187 +3568930485 2501617386 +453753194 3657403347 +1401233941 2408883971 +3721821868 3836307671 +3586934128 1086320077 +2522260177 2070040336 +4179694909 1813278466 +3538113479 1636546798 +963948484 917549471 +890797825 2526015104 +2207509687 2028555120 +2993294676 3856539967 +844040518 844040534 +1250199654 1250199670 +1618546944 1791099099 +1917120632 1518767341 +3337419361 3829854352 +3254930320 4187812771 +851910022 1970502135 +3286201956 3167182719 +2230977101 2727452452 +1207867470 509329595 +3931043421 927847540 +691439244 1825951329 +3330569757 2676354978 +4017978432 4017978448 +1141065044 2013886731 +1423485607 81026157 +2978672076 2002222304 +468947391 1606940398 +4269841798 712505847 +1979418079 1468975073 +1625943027 2210321171 +3758417572 1270289471 +2515893967 3765870545 +2241034722 3381655854 +569464344 2263517147 +2914448128 1996523795 +2907876674 2701033309 +1718483572 3005301913 +2899615962 3971561277 +1390602604 1286691584 +1519626253 2742127716 +353193168 4092586876 +2463385298 4130045061 +2442921672 1209174506 +4190148672 1870110456 1781509317 +1754933805 3618661572 +3190796504 1024680987 +319762838 2531987239 +564630447 2848816248 +1350403854 3281754905 +4117046211 302815076 +2472260259 2623157898 +1343353635 792838172 +527699389 1388611088 +974904127 3101303848 +680918027 4011574621 +1067031896 2595061988 +3866990099 2109081837 +106476214 3013694609 +2251883012 3512710905 +3774212211 1381337978 +3092856191 3092856175 +693885631 3667483304 +348711363 2305531261 +106259297 2049180038 +639386280 953029185 +1480359459 171610378 +706484284 2251957873 +2386839359 1909195677 +2732878292 1100126383 +961896267 2355430173 +660819914 660819930 +475187732 2857639289 +4043487254 2220722982 +447518452 2543989675 +1516590258 1884327003 +1752818361 2927119828 +1063570511 447586382 +445680902 3616407671 +2028363718 3648548785 +1087610175 1277200958 +2502202115 3415436732 +1422773781 2499504924 +3084659911 3574530995 +4258393051 1819691460 2184585119 +3380066344 1333192427 +4175142081 443105753 1823647903 +3302969504 2341202917 +3787395443 109834649 3536353306 556767762 +3076640813 3690641092 +4253418320 1777809141 +3562896851 3881527300 +1668943373 4242271588 +1259610962 2192808453 +3079903720 1202893239 +1025018762 3080956475 +4139369159 1836620095 +48120245 1961045338 +1705858876 1272992615 +2692960440 4244444253 +56710762 586080927 +417103134 513808287 +1313626345 1313626361 +2883512119 2953513456 +1371452054 1160978983 +3158195810 2730845737 +342440691 69660035 +1551588227 422645564 +2639513269 567553985 +4138150647 4138150631 +1677483114 3093325523 +1959992307 3679780762 +2589468427 1138312750 +3566417676 2948573153 +4078299356 2611828113 +2371633408 2285523717 +3513510007 601813849 +2298181504 4282829348 +1658597160 1146661536 2989130652 3980098916 +845120328 2489035357 +1826156550 1602345313 +146593191 59977650 +619305440 2390697133 +2315605237 697733786 +693760423 3214371318 +1264958122 3104258810 369266451 +1604425601 1309057547 +2881251185 3625177891 +1524304665 533887070 +1433860706 1055089021 +546137599 1570263979 1033343080 +4008602125 777056868 +1600077893 1743924378 +985474011 123738014 977612201 3192846309 +4117463574 1849542823 +3615513659 2047946980 +948195067 2493274514 +1641483464 3448315595 +855194093 727068690 +2106537281 3916485952 +131296555 2094324386 +3540371132 3994540519 +861249147 2557409929 +231427161 1484175586 +1837668048 1040542051 +783295547 3125348580 +3020010969 934364296 +1829198618 3163843042 +2112354312 1009480861 +3519370742 799429191 +873668775 2142630564 +2138282001 2138281985 +503892218 1104437661 +3005457084 3172543985 +1662841964 1922352663 +832590631 1180886646 +395815530 465948034 2663486122 +843020268 99207297 +1115389743 245465631 272609921 +1258114699 2983732252 +1975959582 2246078271 +1492657496 524503268 +3549492364 4139693097 +3647545375 447408843 +1963696754 1963696738 +785362056 955030036 +1687771725 2119211771 +1128530619 2668645476 +2833995865 1515432766 +3872015012 2968877230 +3506088784 1746168747 1251716853 +4198339583 4173803946 +986171865 1635958920 +3407925597 564761972 +1598969940 2464300457 +2614951315 4024643194 +1634767071 3606294504 1299571712 +622071423 3717386750 622071407 +1979355550 1467169705 +750320719 3325381022 750320735 +408400668 2133614092 +946222298 2732929835 2732929853 +1853506805 2012021388 +3611370750 3649911753 +906619697 1117601328 +2461177347 3888314855 +2377823641 4111263189 +3575187190 1818621265 +245189342 955059537 +848545325 3416324292 +3261998273 3563314112 +4024978669 2544965906 +626207858 871298917 +4051108873 660298296 +3506937743 2650811928 +906006202 3168841419 +2697421285 1032748807 +3484354899 1579849367 +3815541817 1021361598 +3210982964 2113393625 +3677729131 2156284770 +2449386032 2449386016 +2158608552 859457643 +2743577054 1284532329 1284532351 +2535163834 1750236256 +2825172475 3305000187 +1665785489 1723317476 +3242761516 1901030487 +1617191316 1376099321 +2406882051 3796656240 2301405169 +912130386 3892057107 +3476899709 1278073972 +1634127947 3087348078 +2487725235 3893962784 +1372134452 1347769481 +2818843905 3980519302 +1207973010 1207972994 +150693414 4078373233 +3244637717 3244637701 +3977055222 562680903 +2563945666 3229666356 +2062885004 2062885020 +970121377 2818022752 +2912653026 2912653042 +4237838605 3026203481 +3640182157 4731122 +2265006604 2465921249 +2059268355 1006790570 +1999952336 2381636212 +3992576158 1982196802 +1184722324 3184754681 +3929687833 3811107391 +363982306 152664771 +3148376539 3928914811 +2410990227 3432703354 +1579764911 3051885587 +1650321575 3014787296 +2058962254 2141723097 +2683200486 1373023946 +1393120306 3920595635 +1382225527 687627590 +3677046437 2854237612 +3108993895 1403877791 +3629085122 1192236149 +2225042095 1979812216 +1559489590 717043130 +646105969 2155565056 +3105677704 4034332957 +4053403232 3739970388 +234869659 2763660548 +232796490 967031806 +1161835703 3138583558 +764474935 3812179351 +1814176414 1555793577 +2392637299 2392637283 +1656518732 1134476596 +1599116401 1890369793 +2621669230 2621669246 +4046244355 3925545021 +2698404553 532501691 +31137228 3085953079 +3074347761 2088604685 +2339183811 1069827836 +978374034 1597217989 +2408228891 306619026 +3469172846 4088821806 +2638331542 2599858017 +1732854354 3931334405 +2347285303 1985918854 +1151260483 1225580156 +1982066358 1982066342 +1881528273 1553120784 +1132603081 249761390 +3384882473 3290869646 +3265212837 3265212853 +1779337291 2659164988 +538282423 954714896 +695305587 2964657178 +749606549 2421439789 +3849926602 3884859160 +316213680 1537884181 +1937633488 4084695120 +3747043359 3747043343 +4227309991 3048178489 +1329715516 11073905 +964826886 1454396538 +2539208918 394334449 +2844749354 4222103173 +1315329902 3642466873 +2039746774 1483533217 +1440360996 1248876201 +1598940557 3933360356 +1772046490 2703368230 +2983269222 1377929623 +3919418561 3860429643 +3206697617 1946679888 +3553774148 3087722783 +1610526027 1760218370 +2039230731 1655780436 +2372126756 1888893464 3088322729 +1444341211 2460268452 1628166093 +1185531279 1185531295 +2132967754 1834059643 +1654289210 1931699293 +2930534750 1466556159 +2137825082 1580393622 +2362119183 2997916568 +1947356319 2118329615 +1388377586 935537651 +4114493398 3873787377 +3363456429 1165733714 +1642081347 3536319196 +58222820 1519197929 +1774755778 1221820003 +329903152 329903136 +1127816014 551943119 +746964412 3533063911 +2189148436 2094068345 +1082031370 780929138 2434717371 +3435095046 326671760 +1001581870 682319737 +3244905789 3050385172 +2241202657 741444896 +4062790523 2985638564 +1509261845 4225386912 +1668360205 2552368242 +966773338 277580715 +2242454074 2738938205 +2265454163 3837469882 +1662652048 2449796259 +196177135 196177151 +2499817756 128140918 279139494 +596690091 596690107 +1532219998 1532219982 +406192851 103136087 +477614180 882707839 +3920112528 2928282856 +964528717 3449861938 +4260112898 3167101219 +1126912804 1125780494 +1137634650 1137634634 diff --git a/data/small_articles/badfile.txt b/data/small_articles/badfile.txt new file mode 100644 index 0000000..845d9ba --- /dev/null +++ b/data/small_articles/badfile.txt @@ -0,0 +1 @@ +don't parse me \ No newline at end of file diff --git a/data/small_articles/folder1/news_0011592.json b/data/small_articles/folder1/news_0011592.json new file mode 100644 index 0000000..2d13a43 --- /dev/null +++ b/data/small_articles/folder1/news_0011592.json @@ -0,0 +1 @@ +{"organizations": [], "uuid": "cbaa8f7a259fb6624a36f0e33ac7acbe58916c74", "thread": {"social": {"gplus": {"shares": 0}, "pinterest": {"shares": 0}, "vk": {"shares": 0}, "linkedin": {"shares": 0}, "facebook": {"likes": 0, "shares": 0, "comments": 0}, "stumbledupon": {"shares": 0}}, "site_full": "www.cnbc.com", "main_image": "//sc.cnbcfm.com/applications/cnbc.com/staticcontent/img/cnbc_logo.gif", "site_section": "http://www.cnbc.com/id/10000027/page/3", "section_title": "Press Releases - CNBC", "url": "http://www.cnbc.com/2018/01/09/globe-newswire-hitachi-vantara-to-open-new-santa-clara-headquarters-in-spring-2019.html", "country": "US", "domain_rank": 767, "title": "Hitachi Vantara To Open New Santa Clara Headquarters in Spring 2019", "performance_score": 0, "site": "cnbc.com", "participants_count": 1, "title_full": "", "spam_score": 0.0, "site_type": "news", "published": "2018-01-09T17:00:00.000+02:00", "replies_count": 0, "uuid": "cbaa8f7a259fb6624a36f0e33ac7acbe58916c74"}, "author": "cnbc.com", "url": "http://www.cnbc.com/2018/01/09/globe-newswire-hitachi-vantara-to-open-new-santa-clara-headquarters-in-spring-2019.html", "ord_in_thread": 0, "title": "Hitachi Vantara To Open New Santa Clara Headquarters in Spring 2019", "locations": [], "entities": {"persons": [{"name": "hitachi vantara", "sentiment": "negative"}], "locations": [{"name": "santa clara", "sentiment": "none"}, {"name": "calif.", "sentiment": "none"}, {"name": "santa clara", "sentiment": "none"}, {"name": "augustine drive", "sentiment": "none"}, {"name": "santa clara square", "sentiment": "none"}, {"name": "hitachi vantara", "sentiment": "none"}], "organizations": [{"name": "hitachi vantara to open new santa clara headquarters", "sentiment": "negative"}, {"name": "hitachi ltd.", "sentiment": "none"}, {"name": "executive briefing center", "sentiment": "none"}, {"name": "hitachi vantara", "sentiment": "none"}]}, "highlightText": "", "language": "english", "persons": [], "text": "SANTA CLARA, Calif., Jan. 09, 2018 (GLOBE NEWSWIRE) -- Hitachi Vantara , a wholly owned subsidiary of Hitachi Ltd. (TSE:6501), today announced it will be opening a state-of-the-art headquarters in Santa Clara, set to welcome employees, customers and partners to its new campus in the Spring of 2019. The new campus is another step in Hitachi Vantara’s cohesive strategy and unrelenting focus to inspire employees, attract top talent and help customers achieve outcomes that positively drive business and society forward.\nAll Santa Clara-based employees and contractors will relocate to the new location at 2535 Augustine Drive in Santa Clara Square, approximately two miles from Hitachi Vantara’s current headquarters. The new sleek and modern space is designed to encourage intelligent innovation and collaboration in a number of different environments. On-site amenities will include a cutting-edge Executive Briefing Center and lab facilities, a gym, two cafes, open-air gathering places and casual workspaces, and it is walking distance to many restaurants and retail stores.\n“Hitachi Vantara’s culture is second to none. We want to give our employees a workplace that reflects that culture, builds on our new brand, enhances our recruitment efforts and inspires innovation,” said Brian Householder, president and chief operations officer, Hitachi Vantara. “Our new campus at Santa Clara Square will offer our employees just that. With these incredible new workspaces, we expect this move will assist us in reaching our goals even faster.”\n“We are thrilled to add another world-class company like Hitachi Vantara to our workplace community, and we are honored they chose us as the place where they want to grow and enhance their brand and culture,” said Todd Hedrick, regional vice president, Irvine Company Office Properties. “It’s exciting to see how leading Silicon Valley companies are embracing our vision to bring best-in-class office, retail and rental living together, to simplify and enhance the lives of their employees.”\nAbout Hitachi Vantara\nHitachi Vantara, a wholly owned subsidiary of Hitachi, Ltd., helps data-driven leaders find and use the value in their data to innovate intelligently and reach outcomes that matter for business and society. We combine technology, intellectual property and industry knowledge to deliver data-managing solutions that help enterprises improve their customers’ experiences, develop new revenue streams, and lower the costs of business. Only Hitachi Vantara elevates your innovation advantage by combining deep information technology (IT), operational technology (OT) and domain expertise. We work with organizations everywhere to drive data to meaningful outcomes. Visit us at www.HitachiVantara.com .\nConnect With Hitachi Vantara\nTwitter LinkedIn Facebook\nAbout Hitachi, Ltd.\nHitachi, Ltd. (TSE:6501), headquartered in Tokyo, Japan, delivers innovations that answer society’s challenges. The company’s consolidated revenues for fiscal 2016 (ended March 31, 2017) totaled 9,162.2 billion yen ($81.8 billion). The Hitachi Group is a global leader in Social Innovation and has approximately 304,000 employees worldwide. Through collaborative creation, Hitachi is providing solutions to customers in a broad range of sectors, including Power / Energy, Industry / Distribution / Water, Urban Development, and Finance / Government & Public / Healthcare. For more information, please visit http://www.hitachi.com .\nHITACHI is a trademark or registered trademark of Hitachi, Ltd. All other trademarks, service marks, and company names are properties of their respective owners.\nCOMPANY CONTACT\nStefani Finch\nHitachi Vantara\nStefani.Finch@HitachiVantara.com\n408 499 7349\nSource: Hitachi Vantara", "external_links": ["https://www.globenewswire.com/Tracker?data=9w2vukuphtyTIkzttDdeMwOfBTE7an5yMyOBsL03GYHzzy4znQR5n8qba5VU_KVdcFGO1R19mYwTEsfovxqyPg59KsMdkafe4WY-hrTmexA=", "https://www.facebook.com/HitachiVantara", "https://www.linkedin.com/company/11257500", "https://www.globenewswire.com/Tracker?data=ZfNifvKMiKpAXYz3nEn8-kydqy1B1xWRwNrvSA8wk-XsNPX1mn88qB9ZUSr7fingKd28mM71lDCYz9WqDOrYcrL31GhOMd1jqv6MVrHUGsw=", "https://www.globenewswire.com/NewsRoom/AttachmentNg/6b012674-d45a-4ebc-8429-3cb8f858bab5", "https://www.globenewswire.com/Tracker?data=XgyqTGuKzkY_pF1u29AxQmEiNx46QYKnR5_2AGXFJSuY1wbxIKvRRBW0MIlSo2Q0GdskakLhejwjChKySKvu4frOVlLwcnIExDCOMsN6AI0=", "https://www.globenewswire.com/Tracker?data=wUTbquz6dQX4yCIOpc3CpTFO6wHtceoVteOgSfy3XhgR172450RVJVnSP207fhXTJOWb1SIDN_mXtNd6zzhCkyEUaTqiNGlZrh8lqFHE8v0A1S-OWneDq-yFecxUorGq", "https://twitter.com/HitachiVantara"], "published": "2018-01-09T17:00:00.000+02:00", "crawled": "2018-01-09T19:03:32.000+02:00", "highlightTitle": ""} \ No newline at end of file diff --git a/data/small_articles/folder1/news_0025548.json b/data/small_articles/folder1/news_0025548.json new file mode 100644 index 0000000..b709a85 --- /dev/null +++ b/data/small_articles/folder1/news_0025548.json @@ -0,0 +1 @@ +{"organizations": [], "uuid": "8599d39ef565b2ec59588f67c2bd69608e092a29", "thread": {"social": {"gplus": {"shares": 0}, "pinterest": {"shares": 0}, "vk": {"shares": 0}, "linkedin": {"shares": 0}, "facebook": {"likes": 0, "shares": 0, "comments": 0}, "stumbledupon": {"shares": 0}}, "site_full": "www.cnbc.com", "main_image": "", "site_section": "http://www.cnbc.com/id/10000027/page/4", "section_title": "Press Releases - CNBC", "url": "http://www.cnbc.com/2018/01/17/business-wire-the-standard-promotes-brent-stephens-to-second-vice-president-and-associate-actuary-eb-actuarial.html", "country": "US", "domain_rank": 767, "title": "The Standard Promotes Brent Stephens to Second Vice President and Associate Actuary, EB Actuarial", "performance_score": 0, "site": "cnbc.com", "participants_count": 1, "title_full": "", "spam_score": 0.0, "site_type": "news", "published": "2018-01-17T17:00:00.000+02:00", "replies_count": 0, "uuid": "8599d39ef565b2ec59588f67c2bd69608e092a29"}, "author": "cnbc.com", "url": "http://www.cnbc.com/2018/01/17/business-wire-the-standard-promotes-brent-stephens-to-second-vice-president-and-associate-actuary-eb-actuarial.html", "ord_in_thread": 0, "title": "The Standard Promotes Brent Stephens to Second Vice President and Associate Actuary, EB Actuarial", "locations": [], "entities": {"persons": [{"name": "brent stephens", "sentiment": "negative"}, {"name": "brent steph", "sentiment": "negative"}, {"name": "stephens", "sentiment": "none"}, {"name": "foon lew", "sentiment": "none"}], "locations": [{"name": "portland", "sentiment": "none"}, {"name": "ore.", "sentiment": "none"}], "organizations": [{"name": "standard", "sentiment": "negative"}, {"name": "standard insurance company", "sentiment": "negative"}, {"name": "standard's employee benefits", "sentiment": "none"}, {"name": "business wire", "sentiment": "none"}, {"name": "eb financial reporting", "sentiment": "none"}, {"name": "university of idaho", "sentiment": "none"}]}, "highlightText": "", "language": "english", "persons": [], "text": "PORTLAND, Ore.--(BUSINESS WIRE)-- Standard Insurance Company (The Standard) has promoted Brent Stephens to second vice president and associate actuary for the Employee Benefits actuarial group.\nThis press release features multimedia. View the full release here: http://www.businesswire.com/news/home/20180117005030/en/\nBrent Stephens, second vice president and associate actuary for the The Standard's Employee Benefits actuarial group. (Photo: Business Wire)\nStephens joined The Standard in 1999 and has held multiple roles within Employee Benefits Actuarial. In his current role, Stephens leads the Employee Benefits financial reporting and analysis team as well as the Experience Rating and Refund team, ensuring timely, accurate and quality financial reporting.\n“Brent has successfully led the EB Financial Reporting and ERR team with key contributions to analysis of profitability and reporting to ERR customers,” said Foon Lew, vice president and Group Actuary at The Standard.\nStephens earned a Bachelor of Science degree in applied mathematics from the University of Idaho. He is a Fellow of the Society of Actuaries and holds a Chartered Enterprise Risk Analyst credential with the Society of Actuaries.\nAbout The Standard\nThe Standard is a leading provider of financial products and services, including group and individual disability insurance, group life and accidental death and dismemberment insurance, group dental and vision insurance, absence management services, retirement plans products and services and individual annuities. about The Standard, visit www.standard.com .\nThe Standard is the marketing name for StanCorp Financial Group, Inc., and its subsidiaries: Standard Insurance Company, The Standard Life Insurance Company of New York, Standard Retirement Services, Inc., StanCorp Mortgage Investors, Inc., StanCorp Investment Advisers, Inc., StanCorp Real Estate, LLC, and StanCorp Equities, Inc.\nView source version on businesswire.com : http://www.businesswire.com/news/home/20180117005030/en/\nThe Standard\nBob Speltz, Director, Public Affairs\n971-321-3162\nbob.speltz@standard.com\nSource: The Standard", "external_links": ["http://cts.businesswire.com/ct/CT?id=smartlink&url=http%3A%2F%2Fwww.standard.com&esheet=51742580&newsitemid=20180117005030&lan=en-US&anchor=Standard+Insurance+Company&index=1&md5=f89a348e8c8011a0fad1b81c3c7211e1", "http://www.businesswire.com/news/home/20180117005030/en/", "http://cts.businesswire.com/ct/CT?id=smartlink&url=http%3A%2F%2Fwww.standard.com&esheet=51742580&newsitemid=20180117005030&lan=en-US&anchor=www.standard.com&index=2&md5=66bd5100aef88f3c0a677abaea7f4e6c"], "published": "2018-01-17T17:00:00.000+02:00", "crawled": "2018-01-17T19:00:54.012+02:00", "highlightTitle": ""} \ No newline at end of file diff --git a/data/small_articles/folder2/news_0031579.json b/data/small_articles/folder2/news_0031579.json new file mode 100644 index 0000000..3c21d46 --- /dev/null +++ b/data/small_articles/folder2/news_0031579.json @@ -0,0 +1 @@ +{"organizations": [], "uuid": "3b62fb76d46fc2e3e9d575f8e276ba676486153a", "thread": {"social": {"gplus": {"shares": 0}, "pinterest": {"shares": 1}, "vk": {"shares": 0}, "linkedin": {"shares": 153}, "facebook": {"likes": 131, "shares": 131, "comments": 0}, "stumbledupon": {"shares": 0}}, "site_full": "www.wsj.com", "main_image": "https://si.wsj.net/public/resources/images/ED-AX174_CROPSE_SOC_20180116144852.jpg", "site_section": "http://www.wsj.com/xml/rss/3_7041.xml", "section_title": "WSJ.com: Opinion", "url": "https://www.wsj.com/articles/the-u-s-navy-lowers-its-sights-1516234039", "country": "US", "domain_rank": 387, "title": "The U.S. Navy Lowers Its Sights", "performance_score": 1, "site": "wsj.com", "participants_count": 1, "title_full": "", "spam_score": 0.0, "site_type": "news", "published": "2018-01-18T02:07:00.000+02:00", "replies_count": 0, "uuid": "3b62fb76d46fc2e3e9d575f8e276ba676486153a"}, "author": "Seth Cropsey", "url": "https://www.wsj.com/articles/the-u-s-navy-lowers-its-sights-1516234039", "ord_in_thread": 0, "title": "The U.S. Navy Lowers Its Sights", "locations": [], "entities": {"persons": [{"name": "john s. mccain", "sentiment": "none"}, {"name": "richard spencer", "sentiment": "none"}], "locations": [{"name": "pacific ocean", "sentiment": "none"}], "organizations": [{"name": "u.s. navy", "sentiment": "negative"}, {"name": "navy", "sentiment": "none"}]}, "highlightText": "", "language": "english", "persons": [], "text": "The U.S. Navy announced Tuesday that it will court-martial the officers who commanded the USS Fitzgerald and the USS John S. McCain last summer when they collided with other craft in the Pacific Ocean. They will face charges of negligent homicide, dereliction of duty and hazarding a vessel. In response to the collisions Navy Secretary Richard Spencer ordered a fleetwide review of strategic readiness. An independent team of civilian executives and former senior military officers delivered their sobering report last month. \n\nThe... ", "external_links": [], "published": "2018-01-18T02:07:00.000+02:00", "crawled": "2018-01-18T09:07:33.006+02:00", "highlightTitle": ""} \ No newline at end of file diff --git a/data/small_articles/folder3/news_0023465.json b/data/small_articles/folder3/news_0023465.json new file mode 100644 index 0000000..da69618 --- /dev/null +++ b/data/small_articles/folder3/news_0023465.json @@ -0,0 +1 @@ +{"organizations": [], "uuid": "0aa6e8e500720036a8e7808204e3742750442394", "thread": {"social": {"gplus": {"shares": 0}, "pinterest": {"shares": 0}, "vk": {"shares": 0}, "linkedin": {"shares": 0}, "facebook": {"likes": 0, "shares": 0, "comments": 0}, "stumbledupon": {"shares": 0}}, "site_full": "www.reuters.com", "main_image": "https://s4.reutersmedia.net/resources_v2/images/rcom-default.png", "site_section": "http://feeds.reuters.com/reuters/companyNews\r", "section_title": "Reuters: Company News", "url": "https://www.reuters.com/article/brief-qualcomm-urges-stockholders-to-rej/brief-qualcomm-urges-stockholders-to-reject-broadcoms-undervalued-takeover-proposal-idUSFWN1PB0U2", "country": "US", "domain_rank": 408, "title": "BRIEF-Qualcomm Urges Stockholders To Reject Broadcom's \"Undervalued\" Takeover Proposal", "performance_score": 0, "site": "reuters.com", "participants_count": 0, "title_full": "", "spam_score": 0.0, "site_type": "news", "published": "2018-01-16T15:22:00.000+02:00", "replies_count": 0, "uuid": "0aa6e8e500720036a8e7808204e3742750442394"}, "author": "", "url": "https://www.reuters.com/article/brief-qualcomm-urges-stockholders-to-rej/brief-qualcomm-urges-stockholders-to-reject-broadcoms-undervalued-takeover-proposal-idUSFWN1PB0U2", "ord_in_thread": 0, "title": "BRIEF-Qualcomm Urges Stockholders To Reject Broadcom's \"Undervalued\" Takeover Proposal", "locations": [], "entities": {"persons": [{"name": "broa", "sentiment": "negative"}], "locations": [], "organizations": [{"name": "broadcom", "sentiment": "negative"}, {"name": "qualcomm", "sentiment": "none"}, {"name": "qualcomm inc", "sentiment": "none"}, {"name": "reuters", "sentiment": "none"}, {"name": "eikon", "sentiment": "none"}, {"name": "qualcomm inc", "sentiment": "none"}]}, "highlightText": "", "language": "english", "persons": [], "text": "January 16, 2018 / 1:22 PM / Updated 11 minutes ago BRIEF-Qualcomm Urges Stockholders To Reject Broadcom's \"Undervalued\" Takeover Proposal Reuters Staff \nJan 16 (Reuters) - Qualcomm Inc: \n* QUALCOMM SENDS LETTER TO STOCKHOLDERS AND FILES INVESTOR PRESENTATION \n* QUALCOMM - URGES STOCKHOLDERS TO REJECT BROADCOM‘S “UNDERVALUED” TAKEOVER PROPOSAL \n* QUALCOMM INC SAYS “FIRMLY COMMITTED” TO DELIVERING $6.75 - $7.50 IN FISCAL 2019 NON-GAAP EARNINGS PER SHARE \n* QUALCOMM - TO DELIVER ON ADJUSTED EARNINGS PER SHARE TARGET BY FY 2019 THROUGH NEW $1 BILLION COST REDUCTION PROGRAM, ACCRETION FROM NXP DEAL \n* QUALCOMM - ALSO WORKING TO DELIVER ON ADJUSTED EARNINGS PER SHARE TARGET BY FY 2019 THROUGH RESOLUTION OF CURRENT LICENSING DISPUTES Source text for Eikon: Further company coverage:", "external_links": [], "published": "2018-01-16T15:22:00.000+02:00", "crawled": "2018-01-16T15:42:28.032+02:00", "highlightTitle": ""} \ No newline at end of file diff --git a/data/small_articles/folder3/news_0050887.json b/data/small_articles/folder3/news_0050887.json new file mode 100644 index 0000000..bd4fda7 --- /dev/null +++ b/data/small_articles/folder3/news_0050887.json @@ -0,0 +1 @@ +{"organizations": [], "uuid": "158173aea9b773afc5eeca382f7bd2e5308c456e", "thread": {"social": {"gplus": {"shares": 0}, "pinterest": {"shares": 0}, "vk": {"shares": 0}, "linkedin": {"shares": 0}, "facebook": {"likes": 0, "shares": 0, "comments": 0}, "stumbledupon": {"shares": 0}}, "site_full": "www.cnbc.com", "main_image": "", "site_section": "http://www.cnbc.com/id/10000027", "section_title": "Press Releases - CNBC", "url": "http://www.cnbc.com/2018/01/30/pr-newswire-liveperson-to-announce-fourth-quarter-2017-financial-results-on-february-20-2018.html", "country": "US", "domain_rank": 767, "title": "LivePerson to Announce Fourth Quarter 2017 Financial Results on February 20, 2018", "performance_score": 0, "site": "cnbc.com", "participants_count": 1, "title_full": "", "spam_score": 0.0, "site_type": "news", "published": "2018-01-30T19:47:00.000+02:00", "replies_count": 0, "uuid": "158173aea9b773afc5eeca382f7bd2e5308c456e"}, "author": "cnbc.com", "url": "http://www.cnbc.com/2018/01/30/pr-newswire-liveperson-to-announce-fourth-quarter-2017-financial-results-on-february-20-2018.html", "ord_in_thread": 0, "title": "LivePerson to Announce Fourth Quarter 2017 Financial Results on February 20, 2018", "locations": [], "entities": {"persons": [{"name": "robert locascio", "sentiment": "none"}, {"name": "daniel murphy", "sentiment": "none"}], "locations": [{"name": "new york", "sentiment": "none"}, {"name": "canada", "sentiment": "none"}, {"name": "u.s.", "sentiment": "none"}], "organizations": [{"name": "liveperson", "sentiment": "negative"}, {"name": "liveperson, inc.", "sentiment": "neutral"}, {"name": "company", "sentiment": "none"}]}, "highlightText": "", "language": "english", "persons": [], "text": "NEW YORK, Jan. 30, 2018 /PRNewswire/ -- LivePerson, Inc. (Nasdaq: LPSN), a leading provider of cloud-based mobile and online business messaging, today announced the planned release of its fourth quarter financial results after the market close on Tuesday, February 20, 2018. CEO Robert LoCascio and CFO Daniel Murphy will host a conference call later that day, at 5:00 p.m. Eastern Time.\nThe conference call will be simulcast live on the Internet and can be accessed by logging onto the investor relations section of the Company's web site at http://www.liveperson.com/company/ir .\nTo participate via telephone, callers should dial in five to ten minutes prior to the 5:00 p.m. Eastern start time; domestic callers (U.S. and Canada) should dial 877-507-3684, while international callers should dial 928-328-1244, and both should reference the conference ID \"8299121.\"\nIf you are unable to participate in the live call, the teleconference will be available for replay approximately two hours after the call. To access the replay, call 855-859-2056 (U.S. and Canada) or 404-537-3406 (international); please reference the conference ID \"8299121.\"\nAbout LivePerson\nLivePerson, Inc. (NASDAQ: LPSN) is a leading provider of cloud-based mobile and online business messaging solutions, enabling a meaningful connection between brands and consumers. LiveEngage, the Company's enterprise-class platform, empowers consumers to stop wasting time on hold with 1-800 numbers, and instead message their favorite brands, just as they do with friends and family. More than 18,000 businesses, including Adobe, Citibank, HSBC, EE, IBM, L'Oreal, Orange, PNC and The Home Depot rely on the unparalleled intelligence, security and scalability of LiveEngage to reduce costs, increase lifetime value and create meaningful connection with consumers.\nFor more information, please visit www.liveperson.com . To view other global press releases about LivePerson, please visit pr.liveperson.com .\nCONTACT: Investor Relations, Matthew Kempler, 212-609-4214\nView original content with multimedia: http://www.prnewswire.com/news-releases/liveperson-to-announce-fourth-quarter-2017-financial-results-on-february-20-2018-300590384.html\nSOURCE LivePerson, Inc.", "external_links": ["http://www.prnewswire.com/news-releases/liveperson-to-announce-fourth-quarter-2017-financial-results-on-february-20-2018-300590384.html", "http://www.liveperson.com/", "http://www.liveperson.com/company/ir", "http://pr.liveperson.com/"], "published": "2018-01-30T19:47:00.000+02:00", "crawled": "2018-01-30T20:38:50.002+02:00", "highlightTitle": ""} \ No newline at end of file diff --git a/external/cereal/access.hpp b/external/cereal/access.hpp new file mode 100644 index 0000000..5e36b1d --- /dev/null +++ b/external/cereal/access.hpp @@ -0,0 +1,351 @@ +/*! \file access.hpp + \brief Access control and default construction */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ACCESS_HPP_ +#define CEREAL_ACCESS_HPP_ + +#include +#include +#include +#include + +#include "./macros.hpp" +#include "./specialize.hpp" +#include "./details/helpers.hpp" + +namespace cereal +{ + // ###################################################################### + //! A class that allows cereal to load smart pointers to types that have no default constructor + /*! If your class does not have a default constructor, cereal will not be able + to load any smart pointers to it unless you overload LoadAndConstruct + for your class, and provide an appropriate load_and_construct method. You can also + choose to define a member static function instead of specializing this class. + + The specialization of LoadAndConstruct must be placed within the cereal namespace: + + @code{.cpp} + struct MyType + { + MyType( int x ); // note: no default ctor + int myX; + + // Define a serialize or load/save pair as you normally would + template + void serialize( Archive & ar ) + { + ar( myX ); + } + }; + + // Provide a specialization for LoadAndConstruct for your type + namespace cereal + { + template <> struct LoadAndConstruct + { + // load_and_construct will be passed the archive that you will be loading + // from as well as a construct object which you can use as if it were the + // constructor for your type. cereal will handle all memory management for you. + template + static void load_and_construct( Archive & ar, cereal::construct & construct ) + { + int x; + ar( x ); + construct( x ); + } + + // if you require versioning, simply add a const std::uint32_t as the final parameter, e.g.: + // load_and_construct( Archive & ar, cereal::construct & construct, std::uint32_t const version ) + }; + } // end namespace cereal + @endcode + + Please note that just as in using external serialization functions, you cannot get + access to non-public members of your class by befriending cereal::access. If you + have the ability to modify the class you wish to serialize, it is recommended that you + use member serialize functions and a static member load_and_construct function. + + load_and_construct functions, regardless of whether they are static members of your class or + whether you create one in the LoadAndConstruct specialization, have the following signature: + + @code{.cpp} + // generally Archive will be templated, but it can be specific if desired + template + static void load_and_construct( Archive & ar, cereal::construct & construct ); + // with an optional last parameter specifying the version: const std::uint32_t version + @endcode + + Versioning behaves the same way as it does for standard serialization functions. + + @tparam T The type to specialize for + @ingroup Access */ + template + struct LoadAndConstruct + { }; + + // forward decl for construct + //! @cond PRIVATE_NEVERDEFINED + namespace memory_detail{ template struct LoadAndConstructLoadWrapper; } + namespace boost_variant_detail{ template struct LoadAndConstructLoadWrapper; } + //! @endcond + + //! Used to construct types with no default constructor + /*! When serializing a type that has no default constructor, cereal + will attempt to call either the class static function load_and_construct + or the appropriate template specialization of LoadAndConstruct. cereal + will pass that function a reference to the archive as well as a reference + to a construct object which should be used to perform the allocation once + data has been appropriately loaded. + + @code{.cpp} + struct MyType + { + // note the lack of default constructor + MyType( int xx, int yy ); + + int x, y; + double notInConstructor; + + template + void serialize( Archive & ar ) + { + ar( x, y ); + ar( notInConstructor ); + } + + template + static void load_and_construct( Archive & ar, cereal::construct & construct ) + { + int x, y; + ar( x, y ); + + // use construct object to initialize with loaded data + construct( x, y ); + + // access to member variables and functions via -> operator + ar( construct->notInConstructor ); + + // could also do the above section by: + double z; + ar( z ); + construct->notInConstructor = z; + } + }; + @endcode + + @tparam T The class type being serialized + */ + template + class construct + { + public: + //! Construct and initialize the type T with the given arguments + /*! This will forward all arguments to the underlying type T, + calling an appropriate constructor. + + Calling this function more than once will result in an exception + being thrown. + + @param args The arguments to the constructor for T + @throw Exception If called more than once */ + template + void operator()( Args && ... args ); + // implementation deferred due to reliance on cereal::access + + //! Get a reference to the initialized underlying object + /*! This must be called after the object has been initialized. + + @return A reference to the initialized object + @throw Exception If called before initialization */ + T * operator->() + { + if( !itsValid ) + throw Exception("Object must be initialized prior to accessing members"); + + return itsPtr; + } + + //! Returns a raw pointer to the initialized underlying object + /*! This is mainly intended for use with passing an instance of + a constructed object to cereal::base_class. + + It is strongly recommended to avoid using this function in + any other circumstance. + + @return A raw pointer to the initialized type */ + T * ptr() + { + return operator->(); + } + + private: + template friend struct ::cereal::memory_detail::LoadAndConstructLoadWrapper; + template friend struct ::cereal::boost_variant_detail::LoadAndConstructLoadWrapper; + + construct( T * p ) : itsPtr( p ), itsEnableSharedRestoreFunction( [](){} ), itsValid( false ) {} + construct( T * p, std::function enableSharedFunc ) : // g++4.7 ice with default lambda to std func + itsPtr( p ), itsEnableSharedRestoreFunction( enableSharedFunc ), itsValid( false ) {} + construct( construct const & ) = delete; + construct & operator=( construct const & ) = delete; + + T * itsPtr; + std::function itsEnableSharedRestoreFunction; + bool itsValid; + }; + + // ###################################################################### + //! A class that can be made a friend to give cereal access to non public functions + /*! If you desire non-public serialization functions within a class, cereal can only + access these if you declare cereal::access a friend. + + @code{.cpp} + class MyClass + { + private: + friend class cereal::access; // gives access to the private serialize + + template + void serialize( Archive & ar ) + { + // some code + } + }; + @endcode + @ingroup Access */ + class access + { + public: + // ####### Standard Serialization ######################################## + template inline + static auto member_serialize(Archive & ar, T & t) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar)) + { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar); } + + template inline + static auto member_save(Archive & ar, T const & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar)) + { return t.CEREAL_SAVE_FUNCTION_NAME(ar); } + + template inline + static auto member_save_non_const(Archive & ar, T & t) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar)) + { return t.CEREAL_SAVE_FUNCTION_NAME(ar); } + + template inline + static auto member_load(Archive & ar, T & t) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar)) + { return t.CEREAL_LOAD_FUNCTION_NAME(ar); } + + template inline + static auto member_save_minimal(Archive const & ar, T const & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar)) + { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); } + + template inline + static auto member_save_minimal_non_const(Archive const & ar, T & t) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar)) + { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar); } + + template inline + static auto member_load_minimal(Archive const & ar, T & t, U && u) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward(u))) + { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward(u)); } + + // ####### Versioned Serialization ####################################### + template inline + static auto member_serialize(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version)) + { return t.CEREAL_SERIALIZE_FUNCTION_NAME(ar, version); } + + template inline + static auto member_save(Archive & ar, T const & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version)) + { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); } + + template inline + static auto member_save_non_const(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_SAVE_FUNCTION_NAME(ar, version)) + { return t.CEREAL_SAVE_FUNCTION_NAME(ar, version); } + + template inline + static auto member_load(Archive & ar, T & t, const std::uint32_t version ) -> decltype(t.CEREAL_LOAD_FUNCTION_NAME(ar, version)) + { return t.CEREAL_LOAD_FUNCTION_NAME(ar, version); } + + template inline + static auto member_save_minimal(Archive const & ar, T const & t, const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version)) + { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); } + + template inline + static auto member_save_minimal_non_const(Archive const & ar, T & t, const std::uint32_t version) -> decltype(t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version)) + { return t.CEREAL_SAVE_MINIMAL_FUNCTION_NAME(ar, version); } + + template inline + static auto member_load_minimal(Archive const & ar, T & t, U && u, const std::uint32_t version) -> decltype(t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward(u), version)) + { return t.CEREAL_LOAD_MINIMAL_FUNCTION_NAME(ar, std::forward(u), version); } + + // ####### Other Functionality ########################################## + // for detecting inheritance from enable_shared_from_this + template inline + static auto shared_from_this(T & t) -> decltype(t.shared_from_this()); + + // for placement new + template inline + static void construct( T *& ptr, Args && ... args ) + { + new (ptr) T( std::forward( args )... ); + } + + // for non-placement new with a default constructor + template inline + static T * construct() + { + return new T(); + } + + template inline + static std::false_type load_and_construct(...) + { return std::false_type(); } + + template inline + static auto load_and_construct(Archive & ar, ::cereal::construct & construct) -> decltype(T::load_and_construct(ar, construct)) + { + T::load_and_construct( ar, construct ); + } + + template inline + static auto load_and_construct(Archive & ar, ::cereal::construct & construct, const std::uint32_t version) -> decltype(T::load_and_construct(ar, construct, version)) + { + T::load_and_construct( ar, construct, version ); + } + }; // end class access + + // ###################################################################### + // Deferred Implementation, see construct for more information + template template inline + void construct::operator()( Args && ... args ) + { + if( itsValid ) + throw Exception("Attempting to construct an already initialized object"); + + ::cereal::access::construct( itsPtr, std::forward( args )... ); + itsEnableSharedRestoreFunction(); + itsValid = true; + } +} // namespace cereal + +#endif // CEREAL_ACCESS_HPP_ diff --git a/external/cereal/archives/adapters.hpp b/external/cereal/archives/adapters.hpp new file mode 100644 index 0000000..e2fb57d --- /dev/null +++ b/external/cereal/archives/adapters.hpp @@ -0,0 +1,163 @@ +/*! \file adapters.hpp + \brief Archive adapters that provide additional functionality + on top of an existing archive */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ARCHIVES_ADAPTERS_HPP_ +#define CEREAL_ARCHIVES_ADAPTERS_HPP_ + +#include "cereal/details/helpers.hpp" +#include + +namespace cereal +{ + #ifdef CEREAL_FUTURE_EXPERIMENTAL + + // Forward declaration for friend access + template U & get_user_data( A & ); + + //! Wraps an archive and gives access to user data + /*! This adapter is useful if you require access to + either raw pointers or references within your + serialization functions. + + While cereal does not directly support serialization + raw pointers or references, it is sometimes the case + that you may want to supply something such as a raw + pointer or global reference to some constructor. + In this situation this adapter would likely be used + with the construct class to allow for non-default + constructors. + + @note This feature is experimental and may be altered or removed in a future release. See issue #46. + + @code{.cpp} + struct MyUserData + { + int * myRawPointer; + std::reference_wrapper myReference; + }; + + struct MyClass + { + // Note the raw pointer parameter + MyClass( int xx, int * rawP ); + + int x; + + template + void serialize( Archive & ar ) + { ar( x ); } + + template + static void load_and_construct( Archive & ar, cereal::construct & construct ) + { + int xx; + ar( xx ); + // note the need to use get_user_data to retrieve user data from the archive + construct( xx, cereal::get_user_data( ar ).myRawPointer ); + } + }; + + int main() + { + { + MyUserData md; + md.myRawPointer = &something; + md.myReference = someInstanceOfType; + + std::ifstream is( "data.xml" ); + cereal::UserDataAdapter ar( md, is ); + + std::unique_ptr sc; + ar( sc ); // use as normal + } + + return 0; + } + @endcode + + @relates get_user_data + + @tparam UserData The type to give the archive access to + @tparam Archive The archive to wrap */ + template + class UserDataAdapter : public Archive + { + public: + //! Construct the archive with some user data struct + /*! This will forward all arguments (other than the user + data) to the wrapped archive type. The UserDataAdapter + can then be used identically to the wrapped archive type + + @tparam Args The arguments to pass to the constructor of + the archive. */ + template + UserDataAdapter( UserData & ud, Args && ... args ) : + Archive( std::forward( args )... ), + userdata( ud ) + { } + + private: + //! Overload the rtti function to enable dynamic_cast + void rtti() {} + friend UserData & get_user_data( Archive & ar ); + UserData & userdata; //!< The actual user data + }; + + //! Retrieves user data from an archive wrapped by UserDataAdapter + /*! This will attempt to retrieve the user data associated with + some archive wrapped by UserDataAdapter. If this is used on + an archive that is not wrapped, a run-time exception will occur. + + @note This feature is experimental and may be altered or removed in a future release. See issue #46. + + @note The correct use of this function cannot be enforced at compile + time. + + @relates UserDataAdapter + @tparam UserData The data struct contained in the archive + @tparam Archive The archive, which should be wrapped by UserDataAdapter + @param ar The archive + @throws Exception if the archive this is used upon is not wrapped with + UserDataAdapter. */ + template + UserData & get_user_data( Archive & ar ) + { + try + { + return dynamic_cast &>( ar ).userdata; + } + catch( std::bad_cast const & ) + { + throw ::cereal::Exception("Attempting to get user data from archive not wrapped in UserDataAdapter"); + } + } + #endif // CEREAL_FUTURE_EXPERIMENTAL +} // namespace cereal + +#endif // CEREAL_ARCHIVES_ADAPTERS_HPP_ diff --git a/external/cereal/archives/binary.hpp b/external/cereal/archives/binary.hpp new file mode 100644 index 0000000..5bc966f --- /dev/null +++ b/external/cereal/archives/binary.hpp @@ -0,0 +1,169 @@ +/*! \file binary.hpp + \brief Binary input and output archives */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ARCHIVES_BINARY_HPP_ +#define CEREAL_ARCHIVES_BINARY_HPP_ + +#include "../cereal.hpp" +#include + +namespace cereal +{ + // ###################################################################### + //! An output archive designed to save data in a compact binary representation + /*! This archive outputs data to a stream in an extremely compact binary + representation with as little extra metadata as possible. + + This archive does nothing to ensure that the endianness of the saved + and loaded data is the same. If you need to have portability over + architectures with different endianness, use PortableBinaryOutputArchive. + + When using a binary archive and a file stream, you must use the + std::ios::binary format flag to avoid having your data altered + inadvertently. + + \ingroup Archives */ + class BinaryOutputArchive : public OutputArchive + { + public: + //! Construct, outputting to the provided stream + /*! @param stream The stream to output to. Can be a stringstream, a file stream, or + even cout! */ + BinaryOutputArchive(std::ostream & stream) : + OutputArchive(this), + itsStream(stream) + { } + + ~BinaryOutputArchive() CEREAL_NOEXCEPT = default; + + //! Writes size bytes of data to the output stream + void saveBinary( const void * data, std::streamsize size ) + { + auto const writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast( data ), size ); + + if(writtenSize != size) + throw Exception("Failed to write " + std::to_string(size) + " bytes to output stream! Wrote " + std::to_string(writtenSize)); + } + + private: + std::ostream & itsStream; + }; + + // ###################################################################### + //! An input archive designed to load data saved using BinaryOutputArchive + /* This archive does nothing to ensure that the endianness of the saved + and loaded data is the same. If you need to have portability over + architectures with different endianness, use PortableBinaryOutputArchive. + + When using a binary archive and a file stream, you must use the + std::ios::binary format flag to avoid having your data altered + inadvertently. + + \ingroup Archives */ + class BinaryInputArchive : public InputArchive + { + public: + //! Construct, loading from the provided stream + BinaryInputArchive(std::istream & stream) : + InputArchive(this), + itsStream(stream) + { } + + ~BinaryInputArchive() CEREAL_NOEXCEPT = default; + + //! Reads size bytes of data from the input stream + void loadBinary( void * const data, std::streamsize size ) + { + auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast( data ), size ); + + if(readSize != size) + throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize)); + } + + private: + std::istream & itsStream; + }; + + // ###################################################################### + // Common BinaryArchive serialization functions + + //! Saving for POD types to binary + template inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, T const & t) + { + ar.saveBinary(std::addressof(t), sizeof(t)); + } + + //! Loading for POD types from binary + template inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, T & t) + { + ar.loadBinary(std::addressof(t), sizeof(t)); + } + + //! Serializing NVP types to binary + template inline + CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) + CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, NameValuePair & t ) + { + ar( t.value ); + } + + //! Serializing SizeTags to binary + template inline + CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) + CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, SizeTag & t ) + { + ar( t.size ); + } + + //! Saving binary data + template inline + void CEREAL_SAVE_FUNCTION_NAME(BinaryOutputArchive & ar, BinaryData const & bd) + { + ar.saveBinary( bd.data, static_cast( bd.size ) ); + } + + //! Loading binary data + template inline + void CEREAL_LOAD_FUNCTION_NAME(BinaryInputArchive & ar, BinaryData & bd) + { + ar.loadBinary(bd.data, static_cast( bd.size ) ); + } +} // namespace cereal + +// register archives for polymorphic support +CEREAL_REGISTER_ARCHIVE(cereal::BinaryOutputArchive) +CEREAL_REGISTER_ARCHIVE(cereal::BinaryInputArchive) + +// tie input and output archives together +CEREAL_SETUP_ARCHIVE_TRAITS(cereal::BinaryInputArchive, cereal::BinaryOutputArchive) + +#endif // CEREAL_ARCHIVES_BINARY_HPP_ diff --git a/external/cereal/archives/json.hpp b/external/cereal/archives/json.hpp new file mode 100644 index 0000000..7d2c7fd --- /dev/null +++ b/external/cereal/archives/json.hpp @@ -0,0 +1,1041 @@ +/*! \file json.hpp + \brief JSON input and output archives */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ARCHIVES_JSON_HPP_ +#define CEREAL_ARCHIVES_JSON_HPP_ + +#include "../cereal.hpp" +#include "../details/util.hpp" + +namespace cereal +{ + //! An exception thrown when rapidjson fails an internal assertion + /*! @ingroup Utility */ + struct RapidJSONException : Exception + { RapidJSONException( const char * what_ ) : Exception( what_ ) {} }; +} + +// Inform rapidjson that assert will throw +#ifndef CEREAL_RAPIDJSON_ASSERT_THROWS +#define CEREAL_RAPIDJSON_ASSERT_THROWS +#endif // CEREAL_RAPIDJSON_ASSERT_THROWS + +// Override rapidjson assertions to throw exceptions by default +#ifndef CEREAL_RAPIDJSON_ASSERT +#define CEREAL_RAPIDJSON_ASSERT(x) if(!(x)){ \ + throw ::cereal::RapidJSONException("rapidjson internal assertion failure: " #x); } +#endif // RAPIDJSON_ASSERT + +// Enable support for parsing of nan, inf, -inf +#ifndef CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS +#define CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNanAndInfFlag +#endif + +// Enable support for parsing of nan, inf, -inf +#ifndef CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS +#define CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS kParseFullPrecisionFlag | kParseNanAndInfFlag +#endif + +#include "../external/rapidjson/prettywriter.h" +#include "../external/rapidjson/ostreamwrapper.h" +#include "../external/rapidjson/istreamwrapper.h" +#include "../external/rapidjson/document.h" +#include "../external/base64.hpp" + +#include +#include +#include +#include +#include + +namespace cereal +{ + // ###################################################################### + //! An output archive designed to save data to JSON + /*! This archive uses RapidJSON to build serialize data to JSON. + + JSON archives provides a human readable output but at decreased + performance (both in time and space) compared to binary archives. + + JSON archives are only guaranteed to finish flushing their contents + upon destruction and should thus be used in an RAII fashion. + + JSON benefits greatly from name-value pairs, which if present, will + name the nodes in the output. If these are not present, each level + of the output will be given an automatically generated delimited name. + + The precision of the output archive controls the number of decimals output + for floating point numbers and should be sufficiently large (i.e. at least 20) + if there is a desire to have binary equality between the numbers output and + those read in. In general you should expect a loss of precision when going + from floating point to text and back. + + JSON archives do not output the size information for any dynamically sized structure + and instead infer it from the number of children for a node. This means that data + can be hand edited for dynamic sized structures and will still be readable. This + is accomplished through the cereal::SizeTag object, which will cause the archive + to output the data as a JSON array (e.g. marked by [] instead of {}), which indicates + that the container is variable sized and may be edited. + + \ingroup Archives */ + class JSONOutputArchive : public OutputArchive, public traits::TextArchive + { + enum class NodeType { StartObject, InObject, StartArray, InArray }; + + using WriteStream = CEREAL_RAPIDJSON_NAMESPACE::OStreamWrapper; + using JSONWriter = CEREAL_RAPIDJSON_NAMESPACE::PrettyWriter; + + public: + /*! @name Common Functionality + Common use cases for directly interacting with an JSONOutputArchive */ + //! @{ + + //! A class containing various advanced options for the JSON archive + class Options + { + public: + //! Default options + static Options Default(){ return Options(); } + + //! Default options with no indentation + static Options NoIndent(){ return Options( JSONWriter::kDefaultMaxDecimalPlaces, IndentChar::space, 0 ); } + + //! The character to use for indenting + enum class IndentChar : char + { + space = ' ', + tab = '\t', + newline = '\n', + carriage_return = '\r' + }; + + //! Specify specific options for the JSONOutputArchive + /*! @param precision The precision used for floating point numbers + @param indentChar The type of character to indent with + @param indentLength The number of indentChar to use for indentation + (0 corresponds to no indentation) */ + explicit Options( int precision = JSONWriter::kDefaultMaxDecimalPlaces, + IndentChar indentChar = IndentChar::space, + unsigned int indentLength = 4 ) : + itsPrecision( precision ), + itsIndentChar( static_cast(indentChar) ), + itsIndentLength( indentLength ) { } + + private: + friend class JSONOutputArchive; + int itsPrecision; + char itsIndentChar; + unsigned int itsIndentLength; + }; + + //! Construct, outputting to the provided stream + /*! @param stream The stream to output to. + @param options The JSON specific options to use. See the Options struct + for the values of default parameters */ + JSONOutputArchive(std::ostream & stream, Options const & options = Options::Default() ) : + OutputArchive(this), + itsWriteStream(stream), + itsWriter(itsWriteStream), + itsNextName(nullptr) + { + itsWriter.SetMaxDecimalPlaces( options.itsPrecision ); + itsWriter.SetIndent( options.itsIndentChar, options.itsIndentLength ); + itsNameCounter.push(0); + itsNodeStack.push(NodeType::StartObject); + } + + //! Destructor, flushes the JSON + ~JSONOutputArchive() CEREAL_NOEXCEPT + { + if (itsNodeStack.top() == NodeType::InObject) + itsWriter.EndObject(); + else if (itsNodeStack.top() == NodeType::InArray) + itsWriter.EndArray(); + } + + //! Saves some binary data, encoded as a base64 string, with an optional name + /*! This will create a new node, optionally named, and insert a value that consists of + the data encoded as a base64 string */ + void saveBinaryValue( const void * data, size_t size, const char * name = nullptr ) + { + setNextName( name ); + writeName(); + + auto base64string = base64::encode( reinterpret_cast( data ), size ); + saveValue( base64string ); + } + + //! @} + /*! @name Internal Functionality + Functionality designed for use by those requiring control over the inner mechanisms of + the JSONOutputArchive */ + //! @{ + + //! Starts a new node in the JSON output + /*! The node can optionally be given a name by calling setNextName prior + to creating the node + + Nodes only need to be started for types that are themselves objects or arrays */ + void startNode() + { + writeName(); + itsNodeStack.push(NodeType::StartObject); + itsNameCounter.push(0); + } + + //! Designates the most recently added node as finished + void finishNode() + { + // if we ended up serializing an empty object or array, writeName + // will never have been called - so start and then immediately end + // the object/array. + // + // We'll also end any object/arrays we happen to be in + switch(itsNodeStack.top()) + { + case NodeType::StartArray: + itsWriter.StartArray(); + // fall through + case NodeType::InArray: + itsWriter.EndArray(); + break; + case NodeType::StartObject: + itsWriter.StartObject(); + // fall through + case NodeType::InObject: + itsWriter.EndObject(); + break; + } + + itsNodeStack.pop(); + itsNameCounter.pop(); + } + + //! Sets the name for the next node created with startNode + void setNextName( const char * name ) + { + itsNextName = name; + } + + //! Saves a bool to the current node + void saveValue(bool b) { itsWriter.Bool(b); } + //! Saves an int to the current node + void saveValue(int i) { itsWriter.Int(i); } + //! Saves a uint to the current node + void saveValue(unsigned u) { itsWriter.Uint(u); } + //! Saves an int64 to the current node + void saveValue(int64_t i64) { itsWriter.Int64(i64); } + //! Saves a uint64 to the current node + void saveValue(uint64_t u64) { itsWriter.Uint64(u64); } + //! Saves a double to the current node + void saveValue(double d) { itsWriter.Double(d); } + //! Saves a string to the current node + void saveValue(std::string const & s) { itsWriter.String(s.c_str(), static_cast( s.size() )); } + //! Saves a const char * to the current node + void saveValue(char const * s) { itsWriter.String(s); } + //! Saves a nullptr to the current node + void saveValue(std::nullptr_t) { itsWriter.Null(); } + + template inline + typename std::enable_if::value && std::is_same::value, void>::type + saveValue(T val) { itsWriter.Int64(val); } + template inline + typename std::enable_if::value && std::is_same::value, void>::type + saveValue(T val) { itsWriter.Uint64(val); } + + private: + // Some compilers/OS have difficulty disambiguating the above for various flavors of longs, so we provide + // special overloads to handle these cases. + + //! 32 bit signed long saving to current node + template ::value> = traits::sfinae> inline + void saveLong(T l){ saveValue( static_cast( l ) ); } + + //! non 32 bit signed long saving to current node + template ::value> = traits::sfinae> inline + void saveLong(T l){ saveValue( static_cast( l ) ); } + + //! 32 bit unsigned long saving to current node + template ::value> = traits::sfinae> inline + void saveLong(T lu){ saveValue( static_cast( lu ) ); } + + //! non 32 bit unsigned long saving to current node + template ::value> = traits::sfinae> inline + void saveLong(T lu){ saveValue( static_cast( lu ) ); } + + public: +#if defined(_MSC_VER) && _MSC_VER < 1916 + //! MSVC only long overload to current node + void saveValue( unsigned long lu ){ saveLong( lu ); }; +#else // _MSC_VER + //! Serialize a long if it would not be caught otherwise + template ::value, + !std::is_same::value, + !std::is_same::value> = traits::sfinae> inline + void saveValue( T t ){ saveLong( t ); } + + //! Serialize an unsigned long if it would not be caught otherwise + template ::value, + !std::is_same::value, + !std::is_same::value> = traits::sfinae> inline + void saveValue( T t ){ saveLong( t ); } +#endif // _MSC_VER + + //! Save exotic arithmetic as strings to current node + /*! Handles long long (if distinct from other types), unsigned long (if distinct), and long double */ + template ::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + (sizeof(T) >= sizeof(long double) || sizeof(T) >= sizeof(long long))> = traits::sfinae> inline + void saveValue(T const & t) + { + std::stringstream ss; ss.precision( std::numeric_limits::max_digits10 ); + ss << t; + saveValue( ss.str() ); + } + + //! Write the name of the upcoming node and prepare object/array state + /*! Since writeName is called for every value that is output, regardless of + whether it has a name or not, it is the place where we will do a deferred + check of our node state and decide whether we are in an array or an object. + + The general workflow of saving to the JSON archive is: + + 1. (optional) Set the name for the next node to be created, usually done by an NVP + 2. Start the node + 3. (if there is data to save) Write the name of the node (this function) + 4. (if there is data to save) Save the data (with saveValue) + 5. Finish the node + */ + void writeName() + { + NodeType const & nodeType = itsNodeStack.top(); + + // Start up either an object or an array, depending on state + if(nodeType == NodeType::StartArray) + { + itsWriter.StartArray(); + itsNodeStack.top() = NodeType::InArray; + } + else if(nodeType == NodeType::StartObject) + { + itsNodeStack.top() = NodeType::InObject; + itsWriter.StartObject(); + } + + // Array types do not output names + if(nodeType == NodeType::InArray) return; + + if(itsNextName == nullptr) + { + std::string name = "value" + std::to_string( itsNameCounter.top()++ ) + "\0"; + saveValue(name); + } + else + { + saveValue(itsNextName); + itsNextName = nullptr; + } + } + + //! Designates that the current node should be output as an array, not an object + void makeArray() + { + itsNodeStack.top() = NodeType::StartArray; + } + + //! @} + + private: + WriteStream itsWriteStream; //!< Rapidjson write stream + JSONWriter itsWriter; //!< Rapidjson writer + char const * itsNextName; //!< The next name + std::stack itsNameCounter; //!< Counter for creating unique names for unnamed nodes + std::stack itsNodeStack; + }; // JSONOutputArchive + + // ###################################################################### + //! An input archive designed to load data from JSON + /*! This archive uses RapidJSON to read in a JSON archive. + + As with the output JSON archive, the preferred way to use this archive is in + an RAII fashion, ensuring its destruction after all data has been read. + + Input JSON should have been produced by the JSONOutputArchive. Data can + only be added to dynamically sized containers (marked by JSON arrays) - + the input archive will determine their size by looking at the number of child nodes. + Only JSON originating from a JSONOutputArchive is officially supported, but data + from other sources may work if properly formatted. + + The JSONInputArchive does not require that nodes are loaded in the same + order they were saved by JSONOutputArchive. Using name value pairs (NVPs), + it is possible to load in an out of order fashion or otherwise skip/select + specific nodes to load. + + The default behavior of the input archive is to read sequentially starting + with the first node and exploring its children. When a given NVP does + not match the read in name for a node, the archive will search for that + node at the current level and load it if it exists. After loading an out of + order node, the archive will then proceed back to loading sequentially from + its new position. + + Consider this simple example where loading of some data is skipped: + + @code{cpp} + // imagine the input file has someData(1-9) saved in order at the top level node + ar( someData1, someData2, someData3 ); // XML loads in the order it sees in the file + ar( cereal::make_nvp( "hello", someData6 ) ); // NVP given does not + // match expected NVP name, so we search + // for the given NVP and load that value + ar( someData7, someData8, someData9 ); // with no NVP given, loading resumes at its + // current location, proceeding sequentially + @endcode + + \ingroup Archives */ + class JSONInputArchive : public InputArchive, public traits::TextArchive + { + private: + using ReadStream = CEREAL_RAPIDJSON_NAMESPACE::IStreamWrapper; + typedef CEREAL_RAPIDJSON_NAMESPACE::GenericValue> JSONValue; + typedef JSONValue::ConstMemberIterator MemberIterator; + typedef JSONValue::ConstValueIterator ValueIterator; + typedef CEREAL_RAPIDJSON_NAMESPACE::Document::GenericValue GenericValue; + + public: + /*! @name Common Functionality + Common use cases for directly interacting with an JSONInputArchive */ + //! @{ + + //! Construct, reading from the provided stream + /*! @param stream The stream to read from */ + JSONInputArchive(std::istream & stream) : + InputArchive(this), + itsNextName( nullptr ), + itsReadStream(stream) + { + itsDocument.ParseStream<>(itsReadStream); + if (itsDocument.IsArray()) + itsIteratorStack.emplace_back(itsDocument.Begin(), itsDocument.End()); + else + itsIteratorStack.emplace_back(itsDocument.MemberBegin(), itsDocument.MemberEnd()); + } + + ~JSONInputArchive() CEREAL_NOEXCEPT = default; + + //! Loads some binary data, encoded as a base64 string + /*! This will automatically start and finish a node to load the data, and can be called directly by + users. + + Note that this follows the same ordering rules specified in the class description in regards + to loading in/out of order */ + void loadBinaryValue( void * data, size_t size, const char * name = nullptr ) + { + itsNextName = name; + + std::string encoded; + loadValue( encoded ); + auto decoded = base64::decode( encoded ); + + if( size != decoded.size() ) + throw Exception("Decoded binary data size does not match specified size"); + + std::memcpy( data, decoded.data(), decoded.size() ); + itsNextName = nullptr; + } + + private: + //! @} + /*! @name Internal Functionality + Functionality designed for use by those requiring control over the inner mechanisms of + the JSONInputArchive */ + //! @{ + + //! An internal iterator that handles both array and object types + /*! This class is a variant and holds both types of iterators that + rapidJSON supports - one for arrays and one for objects. */ + class Iterator + { + public: + Iterator() : itsIndex( 0 ), itsType(Null_) {} + + Iterator(MemberIterator begin, MemberIterator end) : + itsMemberItBegin(begin), itsMemberItEnd(end), itsIndex(0), itsSize(std::distance(begin, end)), itsType(Member) + { + if( itsSize == 0 ) + itsType = Null_; + } + + Iterator(ValueIterator begin, ValueIterator end) : + itsValueItBegin(begin), itsIndex(0), itsSize(std::distance(begin, end)), itsType(Value) + { + if( itsSize == 0 ) + itsType = Null_; + } + + //! Advance to the next node + Iterator & operator++() + { + ++itsIndex; + return *this; + } + + //! Get the value of the current node + GenericValue const & value() + { + if( itsIndex >= itsSize ) + throw cereal::Exception("No more objects in input"); + + switch(itsType) + { + case Value : return itsValueItBegin[itsIndex]; + case Member: return itsMemberItBegin[itsIndex].value; + default: throw cereal::Exception("JSONInputArchive internal error: null or empty iterator to object or array!"); + } + } + + //! Get the name of the current node, or nullptr if it has no name + const char * name() const + { + if( itsType == Member && (itsMemberItBegin + itsIndex) != itsMemberItEnd ) + return itsMemberItBegin[itsIndex].name.GetString(); + else + return nullptr; + } + + //! Adjust our position such that we are at the node with the given name + /*! @throws Exception if no such named node exists */ + inline void search( const char * searchName ) + { + const auto len = std::strlen( searchName ); + size_t index = 0; + for( auto it = itsMemberItBegin; it != itsMemberItEnd; ++it, ++index ) + { + const auto currentName = it->name.GetString(); + if( ( std::strncmp( searchName, currentName, len ) == 0 ) && + ( std::strlen( currentName ) == len ) ) + { + itsIndex = index; + return; + } + } + + throw Exception("JSON Parsing failed - provided NVP (" + std::string(searchName) + ") not found"); + } + + private: + MemberIterator itsMemberItBegin, itsMemberItEnd; //!< The member iterator (object) + ValueIterator itsValueItBegin; //!< The value iterator (array) + size_t itsIndex, itsSize; //!< The current index of this iterator + enum Type {Value, Member, Null_} itsType; //!< Whether this holds values (array) or members (objects) or nothing + }; + + //! Searches for the expectedName node if it doesn't match the actualName + /*! This needs to be called before every load or node start occurs. This function will + check to see if an NVP has been provided (with setNextName) and if so, see if that name matches the actual + next name given. If the names do not match, it will search in the current level of the JSON for that name. + If the name is not found, an exception will be thrown. + + Resets the NVP name after called. + + @throws Exception if an expectedName is given and not found */ + inline void search() + { + // store pointer to itsNextName locally and reset to nullptr in case search() throws + auto localNextName = itsNextName; + itsNextName = nullptr; + + // The name an NVP provided with setNextName() + if( localNextName ) + { + // The actual name of the current node + auto const actualName = itsIteratorStack.back().name(); + + // Do a search if we don't see a name coming up, or if the names don't match + if( !actualName || std::strcmp( localNextName, actualName ) != 0 ) + itsIteratorStack.back().search( localNextName ); + } + } + + public: + //! Starts a new node, going into its proper iterator + /*! This places an iterator for the next node to be parsed onto the iterator stack. If the next + node is an array, this will be a value iterator, otherwise it will be a member iterator. + + By default our strategy is to start with the document root node and then recursively iterate through + all children in the order they show up in the document. + We don't need to know NVPs to do this; we'll just blindly load in the order things appear in. + + If we were given an NVP, we will search for it if it does not match our the name of the next node + that would normally be loaded. This functionality is provided by search(). */ + void startNode() + { + search(); + + if(itsIteratorStack.back().value().IsArray()) + itsIteratorStack.emplace_back(itsIteratorStack.back().value().Begin(), itsIteratorStack.back().value().End()); + else + itsIteratorStack.emplace_back(itsIteratorStack.back().value().MemberBegin(), itsIteratorStack.back().value().MemberEnd()); + } + + //! Finishes the most recently started node + void finishNode() + { + itsIteratorStack.pop_back(); + ++itsIteratorStack.back(); + } + + //! Retrieves the current node name + /*! @return nullptr if no name exists */ + const char * getNodeName() const + { + return itsIteratorStack.back().name(); + } + + //! Sets the name for the next node created with startNode + void setNextName( const char * name ) + { + itsNextName = name; + } + + //! Loads a value from the current node - small signed overload + template ::value, + sizeof(T) < sizeof(int64_t)> = traits::sfinae> inline + void loadValue(T & val) + { + search(); + + val = static_cast( itsIteratorStack.back().value().GetInt() ); + ++itsIteratorStack.back(); + } + + //! Loads a value from the current node - small unsigned overload + template ::value, + sizeof(T) < sizeof(uint64_t), + !std::is_same::value> = traits::sfinae> inline + void loadValue(T & val) + { + search(); + + val = static_cast( itsIteratorStack.back().value().GetUint() ); + ++itsIteratorStack.back(); + } + + //! Loads a value from the current node - bool overload + void loadValue(bool & val) { search(); val = itsIteratorStack.back().value().GetBool(); ++itsIteratorStack.back(); } + //! Loads a value from the current node - int64 overload + void loadValue(int64_t & val) { search(); val = itsIteratorStack.back().value().GetInt64(); ++itsIteratorStack.back(); } + //! Loads a value from the current node - uint64 overload + void loadValue(uint64_t & val) { search(); val = itsIteratorStack.back().value().GetUint64(); ++itsIteratorStack.back(); } + //! Loads a value from the current node - float overload + void loadValue(float & val) { search(); val = static_cast(itsIteratorStack.back().value().GetDouble()); ++itsIteratorStack.back(); } + //! Loads a value from the current node - double overload + void loadValue(double & val) { search(); val = itsIteratorStack.back().value().GetDouble(); ++itsIteratorStack.back(); } + //! Loads a value from the current node - string overload + void loadValue(std::string & val) { search(); val = itsIteratorStack.back().value().GetString(); ++itsIteratorStack.back(); } + //! Loads a nullptr from the current node + void loadValue(std::nullptr_t&) { search(); CEREAL_RAPIDJSON_ASSERT(itsIteratorStack.back().value().IsNull()); ++itsIteratorStack.back(); } + + template inline + typename std::enable_if::value && std::is_same::value, void>::type + loadValue(T & val) { search(); val = itsIteratorStack.back().value().GetInt64(); ++itsIteratorStack.back(); } + template inline + typename std::enable_if::value && std::is_same::value, void>::type + loadValue(T & val) { search(); val = itsIteratorStack.back().value().GetUint64(); ++itsIteratorStack.back(); } + // Special cases to handle various flavors of long, which tend to conflict with + // the int32_t or int64_t on various compiler/OS combinations. MSVC doesn't need any of this. + #ifndef _MSC_VER + private: + //! 32 bit signed long loading from current node + template inline + typename std::enable_if::value, void>::type + loadLong(T & l){ loadValue( reinterpret_cast( l ) ); } + + //! non 32 bit signed long loading from current node + template inline + typename std::enable_if::value, void>::type + loadLong(T & l){ loadValue( reinterpret_cast( l ) ); } + + //! 32 bit unsigned long loading from current node + template inline + typename std::enable_if::value, void>::type + loadLong(T & lu){ loadValue( reinterpret_cast( lu ) ); } + + //! non 32 bit unsigned long loading from current node + template inline + typename std::enable_if::value, void>::type + loadLong(T & lu){ loadValue( reinterpret_cast( lu ) ); } + + public: + //! Serialize a long if it would not be caught otherwise + template inline + typename std::enable_if::value && + sizeof(T) >= sizeof(std::int64_t) && + !std::is_same::value, void>::type + loadValue( T & t ){ loadLong(t); } + + //! Serialize an unsigned long if it would not be caught otherwise + template inline + typename std::enable_if::value && + sizeof(T) >= sizeof(std::uint64_t) && + !std::is_same::value, void>::type + loadValue( T & t ){ loadLong(t); } + #endif // _MSC_VER + + private: + //! Convert a string to a long long + void stringToNumber( std::string const & str, long long & val ) { val = std::stoll( str ); } + //! Convert a string to an unsigned long long + void stringToNumber( std::string const & str, unsigned long long & val ) { val = std::stoull( str ); } + //! Convert a string to a long double + void stringToNumber( std::string const & str, long double & val ) { val = std::stold( str ); } + + public: + //! Loads a value from the current node - long double and long long overloads + template ::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + (sizeof(T) >= sizeof(long double) || sizeof(T) >= sizeof(long long))> = traits::sfinae> + inline void loadValue(T & val) + { + std::string encoded; + loadValue( encoded ); + stringToNumber( encoded, val ); + } + + //! Loads the size for a SizeTag + void loadSize(size_type & size) + { + if (itsIteratorStack.size() == 1) + size = itsDocument.Size(); + else + size = (itsIteratorStack.rbegin() + 1)->value().Size(); + } + + //! @} + + private: + const char * itsNextName; //!< Next name set by NVP + ReadStream itsReadStream; //!< Rapidjson write stream + std::vector itsIteratorStack; //!< 'Stack' of rapidJSON iterators + CEREAL_RAPIDJSON_NAMESPACE::Document itsDocument; //!< Rapidjson document + }; + + // ###################################################################### + // JSONArchive prologue and epilogue functions + // ###################################################################### + + // ###################################################################### + //! Prologue for NVPs for JSON archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void prologue( JSONOutputArchive &, NameValuePair const & ) + { } + + //! Prologue for NVPs for JSON archives + template inline + void prologue( JSONInputArchive &, NameValuePair const & ) + { } + + // ###################################################################### + //! Epilogue for NVPs for JSON archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void epilogue( JSONOutputArchive &, NameValuePair const & ) + { } + + //! Epilogue for NVPs for JSON archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void epilogue( JSONInputArchive &, NameValuePair const & ) + { } + + // ###################################################################### + //! Prologue for deferred data for JSON archives + /*! Do nothing for the defer wrapper */ + template inline + void prologue( JSONOutputArchive &, DeferredData const & ) + { } + + //! Prologue for deferred data for JSON archives + template inline + void prologue( JSONInputArchive &, DeferredData const & ) + { } + + // ###################################################################### + //! Epilogue for deferred for JSON archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void epilogue( JSONOutputArchive &, DeferredData const & ) + { } + + //! Epilogue for deferred for JSON archives + /*! Do nothing for the defer wrapper */ + template inline + void epilogue( JSONInputArchive &, DeferredData const & ) + { } + + // ###################################################################### + //! Prologue for SizeTags for JSON archives + /*! SizeTags are strictly ignored for JSON, they just indicate + that the current node should be made into an array */ + template inline + void prologue( JSONOutputArchive & ar, SizeTag const & ) + { + ar.makeArray(); + } + + //! Prologue for SizeTags for JSON archives + template inline + void prologue( JSONInputArchive &, SizeTag const & ) + { } + + // ###################################################################### + //! Epilogue for SizeTags for JSON archives + /*! SizeTags are strictly ignored for JSON */ + template inline + void epilogue( JSONOutputArchive &, SizeTag const & ) + { } + + //! Epilogue for SizeTags for JSON archives + template inline + void epilogue( JSONInputArchive &, SizeTag const & ) + { } + + // ###################################################################### + //! Prologue for all other types for JSON archives (except minimal types) + /*! Starts a new node, named either automatically or by some NVP, + that may be given data by the type about to be archived + + Minimal types do not start or finish nodes */ + template ::value, + !traits::has_minimal_base_class_serialization::value, + !traits::has_minimal_output_serialization::value> = traits::sfinae> + inline void prologue( JSONOutputArchive & ar, T const & ) + { + ar.startNode(); + } + + //! Prologue for all other types for JSON archives + template ::value, + !traits::has_minimal_base_class_serialization::value, + !traits::has_minimal_input_serialization::value> = traits::sfinae> + inline void prologue( JSONInputArchive & ar, T const & ) + { + ar.startNode(); + } + + // ###################################################################### + //! Epilogue for all other types other for JSON archives (except minimal types) + /*! Finishes the node created in the prologue + + Minimal types do not start or finish nodes */ + template ::value, + !traits::has_minimal_base_class_serialization::value, + !traits::has_minimal_output_serialization::value> = traits::sfinae> + inline void epilogue( JSONOutputArchive & ar, T const & ) + { + ar.finishNode(); + } + + //! Epilogue for all other types other for JSON archives + template ::value, + !traits::has_minimal_base_class_serialization::value, + !traits::has_minimal_input_serialization::value> = traits::sfinae> + inline void epilogue( JSONInputArchive & ar, T const & ) + { + ar.finishNode(); + } + + // ###################################################################### + //! Prologue for arithmetic types for JSON archives + inline + void prologue( JSONOutputArchive & ar, std::nullptr_t const & ) + { + ar.writeName(); + } + + //! Prologue for arithmetic types for JSON archives + inline + void prologue( JSONInputArchive &, std::nullptr_t const & ) + { } + + // ###################################################################### + //! Epilogue for arithmetic types for JSON archives + inline + void epilogue( JSONOutputArchive &, std::nullptr_t const & ) + { } + + //! Epilogue for arithmetic types for JSON archives + inline + void epilogue( JSONInputArchive &, std::nullptr_t const & ) + { } + + // ###################################################################### + //! Prologue for arithmetic types for JSON archives + template ::value> = traits::sfinae> inline + void prologue( JSONOutputArchive & ar, T const & ) + { + ar.writeName(); + } + + //! Prologue for arithmetic types for JSON archives + template ::value> = traits::sfinae> inline + void prologue( JSONInputArchive &, T const & ) + { } + + // ###################################################################### + //! Epilogue for arithmetic types for JSON archives + template ::value> = traits::sfinae> inline + void epilogue( JSONOutputArchive &, T const & ) + { } + + //! Epilogue for arithmetic types for JSON archives + template ::value> = traits::sfinae> inline + void epilogue( JSONInputArchive &, T const & ) + { } + + // ###################################################################### + //! Prologue for strings for JSON archives + template inline + void prologue(JSONOutputArchive & ar, std::basic_string const &) + { + ar.writeName(); + } + + //! Prologue for strings for JSON archives + template inline + void prologue(JSONInputArchive &, std::basic_string const &) + { } + + // ###################################################################### + //! Epilogue for strings for JSON archives + template inline + void epilogue(JSONOutputArchive &, std::basic_string const &) + { } + + //! Epilogue for strings for JSON archives + template inline + void epilogue(JSONInputArchive &, std::basic_string const &) + { } + + // ###################################################################### + // Common JSONArchive serialization functions + // ###################################################################### + //! Serializing NVP types to JSON + template inline + void CEREAL_SAVE_FUNCTION_NAME( JSONOutputArchive & ar, NameValuePair const & t ) + { + ar.setNextName( t.name ); + ar( t.value ); + } + + template inline + void CEREAL_LOAD_FUNCTION_NAME( JSONInputArchive & ar, NameValuePair & t ) + { + ar.setNextName( t.name ); + ar( t.value ); + } + + //! Saving for nullptr to JSON + inline + void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, std::nullptr_t const & t) + { + ar.saveValue( t ); + } + + //! Loading arithmetic from JSON + inline + void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, std::nullptr_t & t) + { + ar.loadValue( t ); + } + + //! Saving for arithmetic to JSON + template ::value> = traits::sfinae> inline + void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, T const & t) + { + ar.saveValue( t ); + } + + //! Loading arithmetic from JSON + template ::value> = traits::sfinae> inline + void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, T & t) + { + ar.loadValue( t ); + } + + //! saving string to JSON + template inline + void CEREAL_SAVE_FUNCTION_NAME(JSONOutputArchive & ar, std::basic_string const & str) + { + ar.saveValue( str ); + } + + //! loading string from JSON + template inline + void CEREAL_LOAD_FUNCTION_NAME(JSONInputArchive & ar, std::basic_string & str) + { + ar.loadValue( str ); + } + + // ###################################################################### + //! Saving SizeTags to JSON + template inline + void CEREAL_SAVE_FUNCTION_NAME( JSONOutputArchive &, SizeTag const & ) + { + // nothing to do here, we don't explicitly save the size + } + + //! Loading SizeTags from JSON + template inline + void CEREAL_LOAD_FUNCTION_NAME( JSONInputArchive & ar, SizeTag & st ) + { + ar.loadSize( st.size ); + } +} // namespace cereal + +// register archives for polymorphic support +CEREAL_REGISTER_ARCHIVE(cereal::JSONInputArchive) +CEREAL_REGISTER_ARCHIVE(cereal::JSONOutputArchive) + +// tie input and output archives together +CEREAL_SETUP_ARCHIVE_TRAITS(cereal::JSONInputArchive, cereal::JSONOutputArchive) + +#endif // CEREAL_ARCHIVES_JSON_HPP_ diff --git a/external/cereal/archives/portable_binary.hpp b/external/cereal/archives/portable_binary.hpp new file mode 100644 index 0000000..4288321 --- /dev/null +++ b/external/cereal/archives/portable_binary.hpp @@ -0,0 +1,334 @@ +/*! \file binary.hpp + \brief Binary input and output archives */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ +#define CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ + +#include "cereal/cereal.hpp" +#include +#include + +namespace cereal +{ + namespace portable_binary_detail + { + //! Returns true if the current machine is little endian + /*! @ingroup Internal */ + inline std::uint8_t is_little_endian() + { + static std::int32_t test = 1; + return *reinterpret_cast( &test ) == 1; + } + + //! Swaps the order of bytes for some chunk of memory + /*! @param data The data as a uint8_t pointer + @tparam DataSize The true size of the data + @ingroup Internal */ + template + inline void swap_bytes( std::uint8_t * data ) + { + for( std::size_t i = 0, end = DataSize / 2; i < end; ++i ) + std::swap( data[i], data[DataSize - i - 1] ); + } + } // end namespace portable_binary_detail + + // ###################################################################### + //! An output archive designed to save data in a compact binary representation portable over different architectures + /*! This archive outputs data to a stream in an extremely compact binary + representation with as little extra metadata as possible. + + This archive will record the endianness of the data as well as the desired in/out endianness + and assuming that the user takes care of ensuring serialized types are the same size + across machines, is portable over different architectures. + + When using a binary archive and a file stream, you must use the + std::ios::binary format flag to avoid having your data altered + inadvertently. + + \warning This archive has not been thoroughly tested across different architectures. + Please report any issues, optimizations, or feature requests at + the project github. + + \ingroup Archives */ + class PortableBinaryOutputArchive : public OutputArchive + { + public: + //! A class containing various advanced options for the PortableBinaryOutput archive + class Options + { + public: + //! Represents desired endianness + enum class Endianness : std::uint8_t + { big, little }; + + //! Default options, preserve system endianness + static Options Default(){ return Options(); } + + //! Save as little endian + static Options LittleEndian(){ return Options( Endianness::little ); } + + //! Save as big endian + static Options BigEndian(){ return Options( Endianness::big ); } + + //! Specify specific options for the PortableBinaryOutputArchive + /*! @param outputEndian The desired endianness of saved (output) data */ + explicit Options( Endianness outputEndian = getEndianness() ) : + itsOutputEndianness( outputEndian ) { } + + private: + //! Gets the endianness of the system + inline static Endianness getEndianness() + { return portable_binary_detail::is_little_endian() ? Endianness::little : Endianness::big; } + + //! Checks if Options is set for little endian + inline std::uint8_t is_little_endian() const + { return itsOutputEndianness == Endianness::little; } + + friend class PortableBinaryOutputArchive; + Endianness itsOutputEndianness; + }; + + //! Construct, outputting to the provided stream + /*! @param stream The stream to output to. Should be opened with std::ios::binary flag. + @param options The PortableBinary specific options to use. See the Options struct + for the values of default parameters */ + PortableBinaryOutputArchive(std::ostream & stream, Options const & options = Options::Default()) : + OutputArchive(this), + itsStream(stream), + itsConvertEndianness( portable_binary_detail::is_little_endian() ^ options.is_little_endian() ) + { + this->operator()( options.is_little_endian() ); + } + + ~PortableBinaryOutputArchive() CEREAL_NOEXCEPT = default; + + //! Writes size bytes of data to the output stream + template inline + void saveBinary( const void * data, std::streamsize size ) + { + std::streamsize writtenSize = 0; + + if( itsConvertEndianness ) + { + for( std::streamsize i = 0; i < size; i += DataSize ) + for( std::streamsize j = 0; j < DataSize; ++j ) + writtenSize += itsStream.rdbuf()->sputn( reinterpret_cast( data ) + DataSize - j - 1 + i, 1 ); + } + else + writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast( data ), size ); + + if(writtenSize != size) + throw Exception("Failed to write " + std::to_string(size) + " bytes to output stream! Wrote " + std::to_string(writtenSize)); + } + + private: + std::ostream & itsStream; + const uint8_t itsConvertEndianness; //!< If set to true, we will need to swap bytes upon saving + }; + + // ###################################################################### + //! An input archive designed to load data saved using PortableBinaryOutputArchive + /*! This archive outputs data to a stream in an extremely compact binary + representation with as little extra metadata as possible. + + This archive will load the endianness of the serialized data and + if necessary transform it to match that of the local machine. This comes + at a significant performance cost compared to non portable archives if + the transformation is necessary, and also causes a small performance hit + even if it is not necessary. + + It is recommended to use portable archives only if you know that you will + be sending binary data to machines with different endianness. + + The archive will do nothing to ensure types are the same size - that is + the responsibility of the user. + + When using a binary archive and a file stream, you must use the + std::ios::binary format flag to avoid having your data altered + inadvertently. + + \warning This archive has not been thoroughly tested across different architectures. + Please report any issues, optimizations, or feature requests at + the project github. + + \ingroup Archives */ + class PortableBinaryInputArchive : public InputArchive + { + public: + //! A class containing various advanced options for the PortableBinaryInput archive + class Options + { + public: + //! Represents desired endianness + enum class Endianness : std::uint8_t + { big, little }; + + //! Default options, preserve system endianness + static Options Default(){ return Options(); } + + //! Load into little endian + static Options LittleEndian(){ return Options( Endianness::little ); } + + //! Load into big endian + static Options BigEndian(){ return Options( Endianness::big ); } + + //! Specify specific options for the PortableBinaryInputArchive + /*! @param inputEndian The desired endianness of loaded (input) data */ + explicit Options( Endianness inputEndian = getEndianness() ) : + itsInputEndianness( inputEndian ) { } + + private: + //! Gets the endianness of the system + inline static Endianness getEndianness() + { return portable_binary_detail::is_little_endian() ? Endianness::little : Endianness::big; } + + //! Checks if Options is set for little endian + inline std::uint8_t is_little_endian() const + { return itsInputEndianness == Endianness::little; } + + friend class PortableBinaryInputArchive; + Endianness itsInputEndianness; + }; + + //! Construct, loading from the provided stream + /*! @param stream The stream to read from. Should be opened with std::ios::binary flag. + @param options The PortableBinary specific options to use. See the Options struct + for the values of default parameters */ + PortableBinaryInputArchive(std::istream & stream, Options const & options = Options::Default()) : + InputArchive(this), + itsStream(stream), + itsConvertEndianness( false ) + { + uint8_t streamLittleEndian; + this->operator()( streamLittleEndian ); + itsConvertEndianness = options.is_little_endian() ^ streamLittleEndian; + } + + ~PortableBinaryInputArchive() CEREAL_NOEXCEPT = default; + + //! Reads size bytes of data from the input stream + /*! @param data The data to save + @param size The number of bytes in the data + @tparam DataSize T The size of the actual type of the data elements being loaded */ + template inline + void loadBinary( void * const data, std::streamsize size ) + { + // load data + auto const readSize = itsStream.rdbuf()->sgetn( reinterpret_cast( data ), size ); + + if(readSize != size) + throw Exception("Failed to read " + std::to_string(size) + " bytes from input stream! Read " + std::to_string(readSize)); + + // flip bits if needed + if( itsConvertEndianness ) + { + std::uint8_t * ptr = reinterpret_cast( data ); + for( std::streamsize i = 0; i < size; i += DataSize ) + portable_binary_detail::swap_bytes( ptr + i ); + } + } + + private: + std::istream & itsStream; + uint8_t itsConvertEndianness; //!< If set to true, we will need to swap bytes upon loading + }; + + // ###################################################################### + // Common BinaryArchive serialization functions + + //! Saving for POD types to portable binary + template inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(PortableBinaryOutputArchive & ar, T const & t) + { + static_assert( !std::is_floating_point::value || + (std::is_floating_point::value && std::numeric_limits::is_iec559), + "Portable binary only supports IEEE 754 standardized floating point" ); + ar.template saveBinary(std::addressof(t), sizeof(t)); + } + + //! Loading for POD types from portable binary + template inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(PortableBinaryInputArchive & ar, T & t) + { + static_assert( !std::is_floating_point::value || + (std::is_floating_point::value && std::numeric_limits::is_iec559), + "Portable binary only supports IEEE 754 standardized floating point" ); + ar.template loadBinary(std::addressof(t), sizeof(t)); + } + + //! Serializing NVP types to portable binary + template inline + CEREAL_ARCHIVE_RESTRICT(PortableBinaryInputArchive, PortableBinaryOutputArchive) + CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, NameValuePair & t ) + { + ar( t.value ); + } + + //! Serializing SizeTags to portable binary + template inline + CEREAL_ARCHIVE_RESTRICT(PortableBinaryInputArchive, PortableBinaryOutputArchive) + CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, SizeTag & t ) + { + ar( t.size ); + } + + //! Saving binary data to portable binary + template inline + void CEREAL_SAVE_FUNCTION_NAME(PortableBinaryOutputArchive & ar, BinaryData const & bd) + { + typedef typename std::remove_pointer::type TT; + static_assert( !std::is_floating_point::value || + (std::is_floating_point::value && std::numeric_limits::is_iec559), + "Portable binary only supports IEEE 754 standardized floating point" ); + + ar.template saveBinary( bd.data, static_cast( bd.size ) ); + } + + //! Loading binary data from portable binary + template inline + void CEREAL_LOAD_FUNCTION_NAME(PortableBinaryInputArchive & ar, BinaryData & bd) + { + typedef typename std::remove_pointer::type TT; + static_assert( !std::is_floating_point::value || + (std::is_floating_point::value && std::numeric_limits::is_iec559), + "Portable binary only supports IEEE 754 standardized floating point" ); + + ar.template loadBinary( bd.data, static_cast( bd.size ) ); + } +} // namespace cereal + +// register archives for polymorphic support +CEREAL_REGISTER_ARCHIVE(cereal::PortableBinaryOutputArchive) +CEREAL_REGISTER_ARCHIVE(cereal::PortableBinaryInputArchive) + +// tie input and output archives together +CEREAL_SETUP_ARCHIVE_TRAITS(cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive) + +#endif // CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_ diff --git a/external/cereal/archives/xml.hpp b/external/cereal/archives/xml.hpp new file mode 100644 index 0000000..18e8f45 --- /dev/null +++ b/external/cereal/archives/xml.hpp @@ -0,0 +1,956 @@ +/*! \file xml.hpp + \brief XML input and output archives */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_ARCHIVES_XML_HPP_ +#define CEREAL_ARCHIVES_XML_HPP_ +#include "cereal/cereal.hpp" +#include "cereal/details/util.hpp" + +#include "cereal/external/rapidxml/rapidxml.hpp" +#include "cereal/external/rapidxml/rapidxml_print.hpp" +#include "cereal/external/base64.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace cereal +{ + namespace xml_detail + { + #ifndef CEREAL_XML_STRING_VALUE + //! The default name for the root node in a cereal xml archive. + /*! You can define CEREAL_XML_STRING_VALUE to be different assuming you do so + before this file is included. */ + #define CEREAL_XML_STRING_VALUE "cereal" + #endif // CEREAL_XML_STRING_VALUE + + //! The name given to the root node in a cereal xml archive + static const char * CEREAL_XML_STRING = CEREAL_XML_STRING_VALUE; + + //! Returns true if the character is whitespace + inline bool isWhitespace( char c ) + { + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + } + } + + // ###################################################################### + //! An output archive designed to save data to XML + /*! This archive uses RapidXML to build an in memory XML tree of the + data it serializes before outputting it to its stream upon destruction. + This archive should be used in an RAII fashion, letting + the automatic destruction of the object cause the flush to its stream. + + XML archives provides a human readable output but at decreased + performance (both in time and space) compared to binary archives. + + XML benefits greatly from name-value pairs, which if present, will + name the nodes in the output. If these are not present, each level + of the output tree will be given an automatically generated delimited name. + + The precision of the output archive controls the number of decimals output + for floating point numbers and should be sufficiently large (i.e. at least 20) + if there is a desire to have binary equality between the numbers output and + those read in. In general you should expect a loss of precision when going + from floating point to text and back. + + XML archives can optionally print the type of everything they serialize, which + adds an attribute to each node. + + XML archives do not output the size information for any dynamically sized structure + and instead infer it from the number of children for a node. This means that data + can be hand edited for dynamic sized structures and will still be readable. This + is accomplished through the cereal::SizeTag object, which will also add an attribute + to its parent field. + \ingroup Archives */ + class XMLOutputArchive : public OutputArchive, public traits::TextArchive + { + public: + /*! @name Common Functionality + Common use cases for directly interacting with an XMLOutputArchive */ + //! @{ + + //! A class containing various advanced options for the XML archive + /*! Options can either be directly passed to the constructor, or chained using the + modifier functions for an interface analogous to named parameters */ + class Options + { + public: + //! Default options + static Options Default(){ return Options(); } + + //! Specify specific options for the XMLOutputArchive + /*! @param precision_ The precision used for floating point numbers + @param indent_ Whether to indent each line of XML + @param outputType_ Whether to output the type of each serialized object as an attribute + @param sizeAttributes_ Whether dynamically sized containers output the size=dynamic attribute */ + explicit Options( int precision_ = std::numeric_limits::max_digits10, + bool indent_ = true, + bool outputType_ = false, + bool sizeAttributes_ = true ) : + itsPrecision( precision_ ), + itsIndent( indent_ ), + itsOutputType( outputType_ ), + itsSizeAttributes( sizeAttributes_ ) + { } + + /*! @name Option Modifiers + An interface for setting option settings analogous to named parameters. + + @code{cpp} + cereal::XMLOutputArchive ar( myStream, + cereal::XMLOutputArchive::Options() + .indent(true) + .sizeAttributes(false) ); + @endcode + */ + //! @{ + + //! Sets the precision used for floaing point numbers + Options & precision( int value ){ itsPrecision = value; return * this; } + //! Whether to indent each line of XML + Options & indent( bool enable ){ itsIndent = enable; return *this; } + //! Whether to output the type of each serialized object as an attribute + Options & outputType( bool enable ){ itsOutputType = enable; return *this; } + //! Whether dynamically sized containers (e.g. vector) output the size=dynamic attribute + Options & sizeAttributes( bool enable ){ itsSizeAttributes = enable; return *this; } + + //! @} + + private: + friend class XMLOutputArchive; + int itsPrecision; + bool itsIndent; + bool itsOutputType; + bool itsSizeAttributes; + }; + + //! Construct, outputting to the provided stream upon destruction + /*! @param stream The stream to output to. Note that XML is only guaranteed to flush + its output to the stream upon destruction. + @param options The XML specific options to use. See the Options struct + for the values of default parameters */ + XMLOutputArchive( std::ostream & stream, Options const & options = Options::Default() ) : + OutputArchive(this), + itsStream(stream), + itsOutputType( options.itsOutputType ), + itsIndent( options.itsIndent ), + itsSizeAttributes(options.itsSizeAttributes) + { + // rapidxml will delete all allocations when xml_document is cleared + auto node = itsXML.allocate_node( rapidxml::node_declaration ); + node->append_attribute( itsXML.allocate_attribute( "version", "1.0" ) ); + node->append_attribute( itsXML.allocate_attribute( "encoding", "utf-8" ) ); + itsXML.append_node( node ); + + // allocate root node + auto root = itsXML.allocate_node( rapidxml::node_element, xml_detail::CEREAL_XML_STRING ); + itsXML.append_node( root ); + itsNodes.emplace( root ); + + // set attributes on the streams + itsStream << std::boolalpha; + itsStream.precision( options.itsPrecision ); + itsOS << std::boolalpha; + itsOS.precision( options.itsPrecision ); + } + + //! Destructor, flushes the XML + ~XMLOutputArchive() CEREAL_NOEXCEPT + { + const int flags = itsIndent ? 0x0 : rapidxml::print_no_indenting; + rapidxml::print( itsStream, itsXML, flags ); + itsXML.clear(); + } + + //! Saves some binary data, encoded as a base64 string, with an optional name + /*! This can be called directly by users and it will automatically create a child node for + the current XML node, populate it with a base64 encoded string, and optionally name + it. The node will be finished after it has been populated. */ + void saveBinaryValue( const void * data, size_t size, const char * name = nullptr ) + { + itsNodes.top().name = name; + + startNode(); + + auto base64string = base64::encode( reinterpret_cast( data ), size ); + saveValue( base64string ); + + if( itsOutputType ) + itsNodes.top().node->append_attribute( itsXML.allocate_attribute( "type", "cereal binary data" ) ); + + finishNode(); + } + + //! @} + /*! @name Internal Functionality + Functionality designed for use by those requiring control over the inner mechanisms of + the XMLOutputArchive */ + //! @{ + + //! Creates a new node that is a child of the node at the top of the stack + /*! Nodes will be given a name that has either been pre-set by a name value pair, + or generated based upon a counter unique to the parent node. If you want to + give a node a specific name, use setNextName prior to calling startNode. + + The node will then be pushed onto the node stack. */ + void startNode() + { + // generate a name for this new node + const auto nameString = itsNodes.top().getValueName(); + + // allocate strings for all of the data in the XML object + auto namePtr = itsXML.allocate_string( nameString.data(), nameString.length() + 1 ); + + // insert into the XML + auto node = itsXML.allocate_node( rapidxml::node_element, namePtr, nullptr, nameString.size() ); + itsNodes.top().node->append_node( node ); + itsNodes.emplace( node ); + } + + //! Designates the most recently added node as finished + void finishNode() + { + itsNodes.pop(); + } + + //! Sets the name for the next node created with startNode + void setNextName( const char * name ) + { + itsNodes.top().name = name; + } + + //! Saves some data, encoded as a string, into the current top level node + /*! The data will be be named with the most recent name if one exists, + otherwise it will be given some default delimited value that depends upon + the parent node */ + template inline + void saveValue( T const & value ) + { + itsOS.clear(); itsOS.seekp( 0, std::ios::beg ); + itsOS << value << std::ends; + + auto strValue = itsOS.str(); + + // itsOS.str() may contain data from previous calls after the first '\0' that was just inserted + // and this data is counted in the length call. We make sure to remove that section so that the + // whitespace validation is done properly + strValue.resize(std::strlen(strValue.c_str())); + + // If the first or last character is a whitespace, add xml:space attribute + const auto len = strValue.length(); + if ( len > 0 && ( xml_detail::isWhitespace( strValue[0] ) || xml_detail::isWhitespace( strValue[len - 1] ) ) ) + { + itsNodes.top().node->append_attribute( itsXML.allocate_attribute( "xml:space", "preserve" ) ); + } + + // allocate strings for all of the data in the XML object + auto dataPtr = itsXML.allocate_string(strValue.c_str(), strValue.length() + 1 ); + + // insert into the XML + itsNodes.top().node->append_node( itsXML.allocate_node( rapidxml::node_data, nullptr, dataPtr ) ); + } + + //! Overload for uint8_t prevents them from being serialized as characters + void saveValue( uint8_t const & value ) + { + saveValue( static_cast( value ) ); + } + + //! Overload for int8_t prevents them from being serialized as characters + void saveValue( int8_t const & value ) + { + saveValue( static_cast( value ) ); + } + + //! Causes the type to be appended as an attribute to the most recently made node if output type is set to true + template inline + void insertType() + { + if( !itsOutputType ) + return; + + // generate a name for this new node + const auto nameString = util::demangledName(); + + // allocate strings for all of the data in the XML object + auto namePtr = itsXML.allocate_string( nameString.data(), nameString.length() + 1 ); + + itsNodes.top().node->append_attribute( itsXML.allocate_attribute( "type", namePtr ) ); + } + + //! Appends an attribute to the current top level node + void appendAttribute( const char * name, const char * value ) + { + auto namePtr = itsXML.allocate_string( name ); + auto valuePtr = itsXML.allocate_string( value ); + itsNodes.top().node->append_attribute( itsXML.allocate_attribute( namePtr, valuePtr ) ); + } + + bool hasSizeAttributes() const { return itsSizeAttributes; } + + protected: + //! A struct that contains metadata about a node + struct NodeInfo + { + NodeInfo( rapidxml::xml_node<> * n = nullptr, + const char * nm = nullptr ) : + node( n ), + counter( 0 ), + name( nm ) + { } + + rapidxml::xml_node<> * node; //!< A pointer to this node + size_t counter; //!< The counter for naming child nodes + const char * name; //!< The name for the next child node + + //! Gets the name for the next child node created from this node + /*! The name will be automatically generated using the counter if + a name has not been previously set. If a name has been previously + set, that name will be returned only once */ + std::string getValueName() + { + if( name ) + { + auto n = name; + name = nullptr; + return {n}; + } + else + return "value" + std::to_string( counter++ ) + "\0"; + } + }; // NodeInfo + + //! @} + + private: + std::ostream & itsStream; //!< The output stream + rapidxml::xml_document<> itsXML; //!< The XML document + std::stack itsNodes; //!< A stack of nodes added to the document + std::ostringstream itsOS; //!< Used to format strings internally + bool itsOutputType; //!< Controls whether type information is printed + bool itsIndent; //!< Controls whether indenting is used + bool itsSizeAttributes; //!< Controls whether lists have a size attribute + }; // XMLOutputArchive + + // ###################################################################### + //! An output archive designed to load data from XML + /*! This archive uses RapidXML to build an in memory XML tree of the + data in the stream it is given before loading any types serialized. + + As with the output XML archive, the preferred way to use this archive is in + an RAII fashion, ensuring its destruction after all data has been read. + + Input XML should have been produced by the XMLOutputArchive. Data can + only be added to dynamically sized containers - the input archive will + determine their size by looking at the number of child nodes. Data that + did not originate from an XMLOutputArchive is not officially supported, + but may be possible to use if properly formatted. + + The XMLInputArchive does not require that nodes are loaded in the same + order they were saved by XMLOutputArchive. Using name value pairs (NVPs), + it is possible to load in an out of order fashion or otherwise skip/select + specific nodes to load. + + The default behavior of the input archive is to read sequentially starting + with the first node and exploring its children. When a given NVP does + not match the read in name for a node, the archive will search for that + node at the current level and load it if it exists. After loading an out of + order node, the archive will then proceed back to loading sequentially from + its new position. + + Consider this simple example where loading of some data is skipped: + + @code{cpp} + // imagine the input file has someData(1-9) saved in order at the top level node + ar( someData1, someData2, someData3 ); // XML loads in the order it sees in the file + ar( cereal::make_nvp( "hello", someData6 ) ); // NVP given does not + // match expected NVP name, so we search + // for the given NVP and load that value + ar( someData7, someData8, someData9 ); // with no NVP given, loading resumes at its + // current location, proceeding sequentially + @endcode + + \ingroup Archives */ + class XMLInputArchive : public InputArchive, public traits::TextArchive + { + public: + /*! @name Common Functionality + Common use cases for directly interacting with an XMLInputArchive */ + //! @{ + + //! Construct, reading in from the provided stream + /*! Reads in an entire XML document from some stream and parses it as soon + as serialization starts + + @param stream The stream to read from. Can be a stringstream or a file. */ + XMLInputArchive( std::istream & stream ) : + InputArchive( this ), + itsData( std::istreambuf_iterator( stream ), std::istreambuf_iterator() ) + { + try + { + itsData.push_back('\0'); // rapidxml will do terrible things without the data being null terminated + itsXML.parse( reinterpret_cast( itsData.data() ) ); + } + catch( rapidxml::parse_error const & ) + { + //std::cerr << "-----Original-----" << std::endl; + //stream.seekg(0); + //std::cout << std::string( std::istreambuf_iterator( stream ), std::istreambuf_iterator() ) << std::endl; + + //std::cerr << "-----Error-----" << std::endl; + //std::cerr << e.what() << std::endl; + //std::cerr << e.where() << std::endl; + throw Exception("XML Parsing failed - likely due to invalid characters or invalid naming"); + } + + // Parse the root + auto root = itsXML.first_node( xml_detail::CEREAL_XML_STRING ); + if( root == nullptr ) + throw Exception("Could not detect cereal root node - likely due to empty or invalid input"); + else + itsNodes.emplace( root ); + } + + ~XMLInputArchive() CEREAL_NOEXCEPT = default; + + //! Loads some binary data, encoded as a base64 string, optionally specified by some name + /*! This will automatically start and finish a node to load the data, and can be called directly by + users. + + Note that this follows the same ordering rules specified in the class description in regards + to loading in/out of order */ + void loadBinaryValue( void * data, size_t size, const char * name = nullptr ) + { + setNextName( name ); + startNode(); + + std::string encoded; + loadValue( encoded ); + + auto decoded = base64::decode( encoded ); + + if( size != decoded.size() ) + throw Exception("Decoded binary data size does not match specified size"); + + std::memcpy( data, decoded.data(), decoded.size() ); + + finishNode(); + } + + //! @} + /*! @name Internal Functionality + Functionality designed for use by those requiring control over the inner mechanisms of + the XMLInputArchive */ + //! @{ + + //! Prepares to start reading the next node + /*! This places the next node to be parsed onto the nodes stack. + + By default our strategy is to start with the document root node and then + recursively iterate through all children in the order they show up in the document. + We don't need to know NVPs do to this; we'll just blindly load in the order things appear in. + + We check to see if the specified NVP matches what the next automatically loaded node is. If they + match, we just continue as normal, going in order. If they don't match, we attempt to find a node + named after the NVP that is being loaded. If that NVP does not exist, we throw an exception. */ + void startNode() + { + auto next = itsNodes.top().child; // By default we would move to the next child node + auto const expectedName = itsNodes.top().name; // this is the expected name from the NVP, if provided + + // If we were given an NVP name, look for it in the current level of the document. + // We only need to do this if either we have exhausted the siblings of the current level or + // the NVP name does not match the name of the node we would normally read next + if( expectedName && ( next == nullptr || std::strcmp( next->name(), expectedName ) != 0 ) ) + { + next = itsNodes.top().search( expectedName ); + + if( next == nullptr ) + throw Exception("XML Parsing failed - provided NVP (" + std::string(expectedName) + ") not found"); + } + + itsNodes.emplace( next ); + } + + //! Finishes reading the current node + void finishNode() + { + // remove current + itsNodes.pop(); + + // advance parent + itsNodes.top().advance(); + + // Reset name + itsNodes.top().name = nullptr; + } + + //! Retrieves the current node name + //! will return @c nullptr if the node does not have a name + const char * getNodeName() const + { + return itsNodes.top().getChildName(); + } + + //! Sets the name for the next node created with startNode + void setNextName( const char * name ) + { + itsNodes.top().name = name; + } + + //! Loads a bool from the current top node + template ::value, + std::is_same::value> = traits::sfinae> inline + void loadValue( T & value ) + { + std::istringstream is( itsNodes.top().node->value() ); + is.setf( std::ios::boolalpha ); + is >> value; + } + + //! Loads a char (signed or unsigned) from the current top node + template ::value, + !std::is_same::value, + sizeof(T) == sizeof(char)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = *reinterpret_cast( itsNodes.top().node->value() ); + } + + //! Load an int8_t from the current top node (ensures we parse entire number) + void loadValue( int8_t & value ) + { + int32_t val; loadValue( val ); value = static_cast( val ); + } + + //! Load a uint8_t from the current top node (ensures we parse entire number) + void loadValue( uint8_t & value ) + { + uint32_t val; loadValue( val ); value = static_cast( val ); + } + + //! Loads a type best represented as an unsigned long from the current top node + template ::value, + !std::is_same::value, + !std::is_same::value, + !std::is_same::value, + sizeof(T) < sizeof(long long)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = static_cast( std::stoul( itsNodes.top().node->value() ) ); + } + + //! Loads a type best represented as an unsigned long long from the current top node + template ::value, + !std::is_same::value, + sizeof(T) >= sizeof(long long)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = static_cast( std::stoull( itsNodes.top().node->value() ) ); + } + + //! Loads a type best represented as an int from the current top node + template ::value, + !std::is_same::value, + sizeof(T) <= sizeof(int)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = static_cast( std::stoi( itsNodes.top().node->value() ) ); + } + + //! Loads a type best represented as a long from the current top node + template ::value, + (sizeof(T) > sizeof(int)), + sizeof(T) <= sizeof(long)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = static_cast( std::stol( itsNodes.top().node->value() ) ); + } + + //! Loads a type best represented as a long long from the current top node + template ::value, + (sizeof(T) > sizeof(long)), + sizeof(T) <= sizeof(long long)> = traits::sfinae> inline + void loadValue( T & value ) + { + value = static_cast( std::stoll( itsNodes.top().node->value() ) ); + } + + //! Loads a type best represented as a float from the current top node + void loadValue( float & value ) + { + try + { + value = std::stof( itsNodes.top().node->value() ); + } + catch( std::out_of_range const & ) + { + // special case for denormalized values + std::istringstream is( itsNodes.top().node->value() ); + is >> value; + if( std::fpclassify( value ) != FP_SUBNORMAL ) + throw; + } + } + + //! Loads a type best represented as a double from the current top node + void loadValue( double & value ) + { + try + { + value = std::stod( itsNodes.top().node->value() ); + } + catch( std::out_of_range const & ) + { + // special case for denormalized values + std::istringstream is( itsNodes.top().node->value() ); + is >> value; + if( std::fpclassify( value ) != FP_SUBNORMAL ) + throw; + } + } + + //! Loads a type best represented as a long double from the current top node + void loadValue( long double & value ) + { + try + { + value = std::stold( itsNodes.top().node->value() ); + } + catch( std::out_of_range const & ) + { + // special case for denormalized values + std::istringstream is( itsNodes.top().node->value() ); + is >> value; + if( std::fpclassify( value ) != FP_SUBNORMAL ) + throw; + } + } + + //! Loads a string from the current node from the current top node + template inline + void loadValue( std::basic_string & str ) + { + std::basic_istringstream is( itsNodes.top().node->value() ); + + str.assign( std::istreambuf_iterator( is ), + std::istreambuf_iterator() ); + } + + //! Loads the size of the current top node + template inline + void loadSize( T & value ) + { + value = getNumChildren( itsNodes.top().node ); + } + + protected: + //! Gets the number of children (usually interpreted as size) for the specified node + static size_t getNumChildren( rapidxml::xml_node<> * node ) + { + size_t size = 0; + node = node->first_node(); // get first child + + while( node != nullptr ) + { + ++size; + node = node->next_sibling(); + } + + return size; + } + + //! A struct that contains metadata about a node + /*! Keeps track of some top level node, its number of + remaining children, and the current active child node */ + struct NodeInfo + { + NodeInfo( rapidxml::xml_node<> * n = nullptr ) : + node( n ), + child( n->first_node() ), + size( XMLInputArchive::getNumChildren( n ) ), + name( nullptr ) + { } + + //! Advances to the next sibling node of the child + /*! If this is the last sibling child will be null after calling */ + void advance() + { + if( size > 0 ) + { + --size; + child = child->next_sibling(); + } + } + + //! Searches for a child with the given name in this node + /*! @param searchName The name to search for (must be null terminated) + @return The node if found, nullptr otherwise */ + rapidxml::xml_node<> * search( const char * searchName ) + { + if( searchName ) + { + size_t new_size = XMLInputArchive::getNumChildren( node ); + const size_t name_size = rapidxml::internal::measure( searchName ); + + for( auto new_child = node->first_node(); new_child != nullptr; new_child = new_child->next_sibling() ) + { + if( rapidxml::internal::compare( new_child->name(), new_child->name_size(), searchName, name_size, true ) ) + { + size = new_size; + child = new_child; + + return new_child; + } + --new_size; + } + } + + return nullptr; + } + + //! Returns the actual name of the next child node, if it exists + const char * getChildName() const + { + return child ? child->name() : nullptr; + } + + rapidxml::xml_node<> * node; //!< A pointer to this node + rapidxml::xml_node<> * child; //!< A pointer to its current child + size_t size; //!< The remaining number of children for this node + const char * name; //!< The NVP name for next child node + }; // NodeInfo + + //! @} + + private: + std::vector itsData; //!< The raw data loaded + rapidxml::xml_document<> itsXML; //!< The XML document + std::stack itsNodes; //!< A stack of nodes read from the document + }; + + // ###################################################################### + // XMLArchive prologue and epilogue functions + // ###################################################################### + + // ###################################################################### + //! Prologue for NVPs for XML output archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void prologue( XMLOutputArchive &, NameValuePair const & ) + { } + + //! Prologue for NVPs for XML input archives + template inline + void prologue( XMLInputArchive &, NameValuePair const & ) + { } + + // ###################################################################### + //! Epilogue for NVPs for XML output archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void epilogue( XMLOutputArchive &, NameValuePair const & ) + { } + + //! Epilogue for NVPs for XML input archives + template inline + void epilogue( XMLInputArchive &, NameValuePair const & ) + { } + + // ###################################################################### + //! Prologue for deferred data for XML archives + /*! Do nothing for the defer wrapper */ + template inline + void prologue( XMLOutputArchive &, DeferredData const & ) + { } + + //! Prologue for deferred data for XML archives + template inline + void prologue( XMLInputArchive &, DeferredData const & ) + { } + + // ###################################################################### + //! Epilogue for deferred for XML archives + /*! NVPs do not start or finish nodes - they just set up the names */ + template inline + void epilogue( XMLOutputArchive &, DeferredData const & ) + { } + + //! Epilogue for deferred for XML archives + /*! Do nothing for the defer wrapper */ + template inline + void epilogue( XMLInputArchive &, DeferredData const & ) + { } + + // ###################################################################### + //! Prologue for SizeTags for XML output archives + /*! SizeTags do not start or finish nodes */ + template inline + void prologue( XMLOutputArchive & ar, SizeTag const & ) + { + if (ar.hasSizeAttributes()) + { + ar.appendAttribute("size", "dynamic"); + } + } + + template inline + void prologue( XMLInputArchive &, SizeTag const & ) + { } + + //! Epilogue for SizeTags for XML output archives + /*! SizeTags do not start or finish nodes */ + template inline + void epilogue( XMLOutputArchive &, SizeTag const & ) + { } + + template inline + void epilogue( XMLInputArchive &, SizeTag const & ) + { } + + // ###################################################################### + //! Prologue for all other types for XML output archives (except minimal types) + /*! Starts a new node, named either automatically or by some NVP, + that may be given data by the type about to be archived + + Minimal types do not start or end nodes */ + template ::value || + traits::has_minimal_output_serialization::value> = traits::sfinae> inline + void prologue( XMLOutputArchive & ar, T const & ) + { + ar.startNode(); + ar.insertType(); + } + + //! Prologue for all other types for XML input archives (except minimal types) + template ::value || + traits::has_minimal_input_serialization::value> = traits::sfinae> inline + void prologue( XMLInputArchive & ar, T const & ) + { + ar.startNode(); + } + + // ###################################################################### + //! Epilogue for all other types other for XML output archives (except minimal types) + /*! Finishes the node created in the prologue + + Minimal types do not start or end nodes */ + template ::value || + traits::has_minimal_output_serialization::value> = traits::sfinae> inline + void epilogue( XMLOutputArchive & ar, T const & ) + { + ar.finishNode(); + } + + //! Epilogue for all other types other for XML output archives (except minimal types) + template ::value || + traits::has_minimal_input_serialization::value> = traits::sfinae> inline + void epilogue( XMLInputArchive & ar, T const & ) + { + ar.finishNode(); + } + + // ###################################################################### + // Common XMLArchive serialization functions + // ###################################################################### + + //! Saving NVP types to XML + template inline + void CEREAL_SAVE_FUNCTION_NAME( XMLOutputArchive & ar, NameValuePair const & t ) + { + ar.setNextName( t.name ); + ar( t.value ); + } + + //! Loading NVP types from XML + template inline + void CEREAL_LOAD_FUNCTION_NAME( XMLInputArchive & ar, NameValuePair & t ) + { + ar.setNextName( t.name ); + ar( t.value ); + } + + // ###################################################################### + //! Saving SizeTags to XML + template inline + void CEREAL_SAVE_FUNCTION_NAME( XMLOutputArchive &, SizeTag const & ) + { } + + //! Loading SizeTags from XML + template inline + void CEREAL_LOAD_FUNCTION_NAME( XMLInputArchive & ar, SizeTag & st ) + { + ar.loadSize( st.size ); + } + + // ###################################################################### + //! Saving for POD types to xml + template ::value> = traits::sfinae> inline + void CEREAL_SAVE_FUNCTION_NAME(XMLOutputArchive & ar, T const & t) + { + ar.saveValue( t ); + } + + //! Loading for POD types from xml + template ::value> = traits::sfinae> inline + void CEREAL_LOAD_FUNCTION_NAME(XMLInputArchive & ar, T & t) + { + ar.loadValue( t ); + } + + // ###################################################################### + //! saving string to xml + template inline + void CEREAL_SAVE_FUNCTION_NAME(XMLOutputArchive & ar, std::basic_string const & str) + { + ar.saveValue( str ); + } + + //! loading string from xml + template inline + void CEREAL_LOAD_FUNCTION_NAME(XMLInputArchive & ar, std::basic_string & str) + { + ar.loadValue( str ); + } +} // namespace cereal + +// register archives for polymorphic support +CEREAL_REGISTER_ARCHIVE(cereal::XMLOutputArchive) +CEREAL_REGISTER_ARCHIVE(cereal::XMLInputArchive) + +// tie input and output archives together +CEREAL_SETUP_ARCHIVE_TRAITS(cereal::XMLInputArchive, cereal::XMLOutputArchive) + +#endif // CEREAL_ARCHIVES_XML_HPP_ diff --git a/external/cereal/cereal.hpp b/external/cereal/cereal.hpp new file mode 100644 index 0000000..b8da14f --- /dev/null +++ b/external/cereal/cereal.hpp @@ -0,0 +1,1120 @@ +/*! \file cereal.hpp + \brief Main cereal functionality */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_CEREAL_HPP_ +#define CEREAL_CEREAL_HPP_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "macros.hpp" +#include "details/traits.hpp" +#include "details/helpers.hpp" +#include "types/base_class.hpp" + +namespace cereal +{ + // ###################################################################### + //! Creates a name value pair + /*! @relates NameValuePair + @ingroup Utility */ + template inline + NameValuePair make_nvp( std::string const & name, T && value ) + { + return {name.c_str(), std::forward(value)}; + } + + //! Creates a name value pair + /*! @relates NameValuePair + @ingroup Utility */ + template inline + NameValuePair make_nvp( const char * name, T && value ) + { + return {name, std::forward(value)}; + } + + //! Creates a name value pair for the variable T with the same name as the variable + /*! @relates NameValuePair + @ingroup Utility */ + #define CEREAL_NVP(T) ::cereal::make_nvp(#T, T) + + // ###################################################################### + //! Convenience function to create binary data for both const and non const pointers + /*! @param data Pointer to beginning of the data + @param size The size in bytes of the data + @relates BinaryData + @ingroup Utility */ + template inline + BinaryData binary_data( T && data, size_t size ) + { + return {std::forward(data), size}; + } + + // ###################################################################### + //! Creates a size tag from some variable. + /*! Will normally be used to serialize size (e.g. size()) information for + variable size containers. If you have a variable sized container, + the very first thing it serializes should be its size, wrapped in + a SizeTag. + + @relates SizeTag + @ingroup Utility */ + template inline + SizeTag make_size_tag( T && sz ) + { + return {std::forward(sz)}; + } + + // ###################################################################### + //! Marks data for deferred serialization + /*! cereal performs a recursive depth-first traversal of data it serializes. When + serializing smart pointers to large, nested, or cyclical data structures, it + is possible to encounter a stack overflow from excessive recursion when following + a chain of pointers. + + Deferment can help in these situations if the data can be serialized separately from + the pointers used to traverse the structure. For example, a graph structure can have its + nodes serialized before its edges: + + @code{.cpp} + struct MyEdge + { + std::shared_ptr connection; + int some_value; + + template + void serialize(Archive & archive) + { + // when we serialize an edge, we'll defer serializing the associated node + archive( cereal::defer( connection ), + some_value ); + } + }; + + struct MyGraphStructure + { + std::vector edges; + std::vector nodes; + + template + void serialize(Archive & archive) + { + // because of the deferment, we ensure all nodes are fully serialized + // before any connection pointers to those nodes are serialized + archive( edges, nodes ); + + // we have to explicitly inform the archive when it is safe to serialize + // the deferred data + archive.serializeDeferments(); + } + }; + @endcode + + @relates DeferredData + @ingroup Utility */ + template inline + DeferredData defer( T && value ) + { + return {std::forward(value)}; + } + + // ###################################################################### + //! Called before a type is serialized to set up any special archive state + //! for processing some type + /*! If designing a serializer that needs to set up any kind of special + state or output extra information for a type, specialize this function + for the archive type and the types that require the extra information. + @ingroup Internal */ + template inline + void prologue( Archive & /* archive */, T const & /* data */) + { } + + //! Called after a type is serialized to tear down any special archive state + //! for processing some type + /*! @ingroup Internal */ + template inline + void epilogue( Archive & /* archive */, T const & /* data */) + { } + + // ###################################################################### + //! Special flags for archives + /*! AllowEmptyClassElision + This allows for empty classes to be serialized even if they do not provide + a serialization function. Classes with no data members are considered to be + empty. Be warned that if this is enabled and you attempt to serialize an + empty class with improperly formed serialize or load/save functions, no + static error will occur - the error will propogate silently and your + intended serialization functions may not be called. You can manually + ensure that your classes that have custom serialization are correct + by using the traits is_output_serializable and is_input_serializable + in cereal/details/traits.hpp. + @ingroup Internal */ + enum Flags { AllowEmptyClassElision = 1 }; + + // ###################################################################### + //! Registers a specific Archive type with cereal + /*! This registration should be done once per archive. A good place to + put this is immediately following the definition of your archive. + Archive registration is only strictly necessary if you wish to + support pointers to polymorphic data types. All archives that + come with cereal are already registered. + @ingroup Internal */ + #define CEREAL_REGISTER_ARCHIVE(Archive) \ + namespace cereal { namespace detail { \ + template \ + typename polymorphic_serialization_support::type \ + instantiate_polymorphic_binding( T*, Archive*, BindingTag, adl_tag ); \ + } } /* end namespaces */ + + //! Helper macro to omit unused warning + #if defined(__GNUC__) + // GCC / clang don't want the function + #define CEREAL_UNUSED_FUNCTION + #else + #define CEREAL_UNUSED_FUNCTION static void unused() { (void)version; } + #endif + + // ###################################################################### + //! Defines a class version for some type + /*! Versioning information is optional and adds some small amount of + overhead to serialization. This overhead will occur both in terms of + space in the archive (the version information for each class will be + stored exactly once) as well as runtime (versioned serialization functions + must check to see if they need to load or store version information). + + Versioning is useful if you plan on fundamentally changing the way some + type is serialized in the future. Versioned serialization functions + cannot be used to load non-versioned data. + + By default, all types have an assumed version value of zero. By + using this macro, you may change the version number associated with + some type. cereal will then use this value as a second parameter + to your serialization functions. + + The interface for the serialization functions is nearly identical + to non-versioned serialization with the addition of a second parameter, + const std::uint32_t version, which will be supplied with the correct + version number. Serializing the version number on a save happens + automatically. + + Versioning cannot be mixed with non-versioned serialization functions. + Having both types will result result in a compile time error. Data + serialized without versioning cannot be loaded by a serialization + function with added versioning support. + + Example interface for versioning on a non-member serialize function: + + @code{cpp} + CEREAL_CLASS_VERSION( Mytype, 77 ); // register class version + + template + void serialize( Archive & ar, Mytype & t, const std::uint32_t version ) + { + // When performing a load, the version associated with the class + // is whatever it was when that data was originally serialized + // + // When we save, we'll use the version that is defined in the macro + + if( version >= some_number ) + // do this + else + // do that + } + @endcode + + Interfaces for other forms of serialization functions is similar. This + macro should be placed at global scope. + @ingroup Utility */ + + //! On C++17, define the StaticObject as inline to merge the definitions across TUs + //! This prevents multiple definition errors when this macro appears in a header file + //! included in multiple TUs. + #ifdef CEREAL_HAS_CPP17 + #define CEREAL_CLASS_VERSION(TYPE, VERSION_NUMBER) \ + namespace cereal { namespace detail { \ + template <> struct Version \ + { \ + static std::uint32_t registerVersion() \ + { \ + ::cereal::detail::StaticObject::getInstance().mapping.emplace( \ + std::type_index(typeid(TYPE)).hash_code(), VERSION_NUMBER ); \ + return VERSION_NUMBER; \ + } \ + static inline const std::uint32_t version = registerVersion(); \ + CEREAL_UNUSED_FUNCTION \ + }; /* end Version */ \ + } } // end namespaces + #else + #define CEREAL_CLASS_VERSION(TYPE, VERSION_NUMBER) \ + namespace cereal { namespace detail { \ + template <> struct Version \ + { \ + static const std::uint32_t version; \ + static std::uint32_t registerVersion() \ + { \ + ::cereal::detail::StaticObject::getInstance().mapping.emplace( \ + std::type_index(typeid(TYPE)).hash_code(), VERSION_NUMBER ); \ + return VERSION_NUMBER; \ + } \ + CEREAL_UNUSED_FUNCTION \ + }; /* end Version */ \ + const std::uint32_t Version::version = \ + Version::registerVersion(); \ + } } // end namespaces + + #endif + + // ###################################################################### + //! The base output archive class + /*! This is the base output archive for all output archives. If you create + a custom archive class, it should derive from this, passing itself as + a template parameter for the ArchiveType. + + The base class provides all of the functionality necessary to + properly forward data to the correct serialization functions. + + Individual archives should use a combination of prologue and + epilogue functions together with specializations of serialize, save, + and load to alter the functionality of their serialization. + + @tparam ArchiveType The archive type that derives from OutputArchive + @tparam Flags Flags to control advanced functionality. See the Flags + enum for more information. + @ingroup Internal */ + template + class OutputArchive : public detail::OutputArchiveBase + { + public: + //! Construct the output archive + /*! @param derived A pointer to the derived ArchiveType (pass this from the derived archive) */ + OutputArchive(ArchiveType * const derived) : self(derived), itsCurrentPointerId(1), itsCurrentPolymorphicTypeId(1) + { } + + OutputArchive & operator=( OutputArchive const & ) = delete; + + //! Serializes all passed in data + /*! This is the primary interface for serializing data with an archive */ + template inline + ArchiveType & operator()( Types && ... args ) + { + self->process( std::forward( args )... ); + return *self; + } + + //! Serializes any data marked for deferment using defer + /*! This will cause any data wrapped in DeferredData to be immediately serialized */ + void serializeDeferments() + { + for( auto & deferment : itsDeferments ) + deferment(); + } + + /*! @name Boost Transition Layer + Functionality that mirrors the syntax for Boost. This is useful if you are transitioning + a large project from Boost to cereal. The preferred interface for cereal is using operator(). */ + //! @{ + + //! Indicates this archive is not intended for loading + /*! This ensures compatibility with boost archive types. If you are transitioning + from boost, you can check this value within a member or external serialize function + (i.e., Archive::is_loading::value) to disable behavior specific to loading, until + you can transition to split save/load or save_minimal/load_minimal functions */ + using is_loading = std::false_type; + + //! Indicates this archive is intended for saving + /*! This ensures compatibility with boost archive types. If you are transitioning + from boost, you can check this value within a member or external serialize function + (i.e., Archive::is_saving::value) to enable behavior specific to loading, until + you can transition to split save/load or save_minimal/load_minimal functions */ + using is_saving = std::true_type; + + //! Serializes passed in data + /*! This is a boost compatability layer and is not the preferred way of using + cereal. If you are transitioning from boost, use this until you can + transition to the operator() overload */ + template inline + ArchiveType & operator&( T && arg ) + { + self->process( std::forward( arg ) ); + return *self; + } + + //! Serializes passed in data + /*! This is a boost compatability layer and is not the preferred way of using + cereal. If you are transitioning from boost, use this until you can + transition to the operator() overload */ + template inline + ArchiveType & operator<<( T && arg ) + { + self->process( std::forward( arg ) ); + return *self; + } + + //! @} + + //! Registers a shared pointer with the archive + /*! This function is used to track shared pointer targets to prevent + unnecessary saves from taking place if multiple shared pointers + point to the same data. + + @internal + @param sharedPointer The shared pointer itself (the adress is taked via get()). + The archive takes a copy to prevent the memory location to be freed + as long as the address is used as id. This is needed to prevent CVE-2020-11105. + @return A key that uniquely identifies the pointer */ + inline std::uint32_t registerSharedPointer(const std::shared_ptr& sharedPointer) + { + void const * addr = sharedPointer.get(); + + // Handle null pointers by just returning 0 + if(addr == 0) return 0; + itsSharedPointerStorage.push_back(sharedPointer); + + auto id = itsSharedPointerMap.find( addr ); + if( id == itsSharedPointerMap.end() ) + { + auto ptrId = itsCurrentPointerId++; + itsSharedPointerMap.insert( {addr, ptrId} ); + return ptrId | detail::msb_32bit; // mask MSB to be 1 + } + else + return id->second; + } + + //! Registers a polymorphic type name with the archive + /*! This function is used to track polymorphic types to prevent + unnecessary saves of identifying strings used by the polymorphic + support functionality. + + @internal + @param name The name to associate with a polymorphic type + @return A key that uniquely identifies the polymorphic type name */ + inline std::uint32_t registerPolymorphicType( char const * name ) + { + auto id = itsPolymorphicTypeMap.find( name ); + if( id == itsPolymorphicTypeMap.end() ) + { + auto polyId = itsCurrentPolymorphicTypeId++; + itsPolymorphicTypeMap.insert( {name, polyId} ); + return polyId | detail::msb_32bit; // mask MSB to be 1 + } + else + return id->second; + } + + private: + //! Serializes data after calling prologue, then calls epilogue + template inline + void process( T && head ) + { + prologue( *self, head ); + self->processImpl( head ); + epilogue( *self, head ); + } + + //! Unwinds to process all data + template inline + void process( T && head, Other && ... tail ) + { + self->process( std::forward( head ) ); + self->process( std::forward( tail )... ); + } + + //! Serialization of a virtual_base_class wrapper + /*! \sa virtual_base_class */ + template inline + ArchiveType & processImpl(virtual_base_class const & b) + { + traits::detail::base_class_id id(b.base_ptr); + if(itsBaseClassSet.count(id) == 0) + { + itsBaseClassSet.insert(id); + self->processImpl( *b.base_ptr ); + } + return *self; + } + + //! Serialization of a base_class wrapper + /*! \sa base_class */ + template inline + ArchiveType & processImpl(base_class const & b) + { + self->processImpl( *b.base_ptr ); + return *self; + } + + std::vector> itsDeferments; + + template inline + ArchiveType & processImpl(DeferredData const & d) + { + std::function deferment( [this, d](){ self->process( d.value ); } ); + itsDeferments.emplace_back( std::move(deferment) ); + + return *self; + } + + //! Helper macro that expands the requirements for activating an overload + /*! Requirements: + Has the requested serialization function + Does not have version and unversioned at the same time + Is output serializable AND + is specialized for this type of function OR + has no specialization at all */ + #define PROCESS_IF(name) \ + traits::EnableIf::value, \ + !traits::has_invalid_output_versioning::value, \ + (traits::is_output_serializable::value && \ + (traits::is_specialized_##name::value || \ + !traits::is_specialized::value))> = traits::sfinae + + //! Member serialization + template inline + ArchiveType & processImpl(T const & t) + { + access::member_serialize(*self, const_cast(t)); + return *self; + } + + //! Non member serialization + template inline + ArchiveType & processImpl(T const & t) + { + CEREAL_SERIALIZE_FUNCTION_NAME(*self, const_cast(t)); + return *self; + } + + //! Member split (save) + template inline + ArchiveType & processImpl(T const & t) + { + access::member_save(*self, t); + return *self; + } + + //! Non member split (save) + template inline + ArchiveType & processImpl(T const & t) + { + CEREAL_SAVE_FUNCTION_NAME(*self, t); + return *self; + } + + //! Member split (save_minimal) + template inline + ArchiveType & processImpl(T const & t) + { + self->process( access::member_save_minimal(*self, t) ); + return *self; + } + + //! Non member split (save_minimal) + template inline + ArchiveType & processImpl(T const & t) + { + self->process( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(*self, t) ); + return *self; + } + + //! Empty class specialization + template ::value, + std::is_empty::value> = traits::sfinae> inline + ArchiveType & processImpl(T const &) + { + return *self; + } + + //! No matching serialization + /*! Invalid if we have invalid output versioning or + we are not output serializable, and either + don't allow empty class ellision or allow it but are not serializing an empty class */ + template ::value || + (!traits::is_output_serializable::value && + (!(Flags & AllowEmptyClassElision) || ((Flags & AllowEmptyClassElision) && !std::is_empty::value)))> = traits::sfinae> inline + ArchiveType & processImpl(T const &) + { + static_assert(traits::detail::count_output_serializers::value != 0, + "cereal could not find any output serialization functions for the provided type and archive combination. \n\n " + "Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \n " + "Serialize functions generally have the following signature: \n\n " + "template \n " + " void serialize(Archive & ar) \n " + " { \n " + " ar( member1, member2, member3 ); \n " + " } \n\n " ); + + static_assert(traits::detail::count_output_serializers::value < 2, + "cereal found more than one compatible output serialization function for the provided type and archive combination. \n\n " + "Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \n " + "Use specialization (see access.hpp) if you need to disambiguate between serialize vs load/save functions. \n " + "Note that serialization functions can be inherited which may lead to the aforementioned ambiguities. \n " + "In addition, you may not mix versioned with non-versioned serialization functions. \n\n "); + + return *self; + } + + //! Registers a class version with the archive and serializes it if necessary + /*! If this is the first time this class has been serialized, we will record its + version number and serialize that. + + @tparam T The type of the class being serialized */ + template inline + std::uint32_t registerClassVersion() + { + static const auto hash = std::type_index(typeid(T)).hash_code(); + const auto insertResult = itsVersionedTypes.insert( hash ); + const auto lock = detail::StaticObject::lock(); + const auto version = + detail::StaticObject::getInstance().find( hash, detail::Version::version ); + + if( insertResult.second ) // insertion took place, serialize the version number + process( make_nvp("cereal_class_version", version) ); + + return version; + } + + //! Member serialization + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + access::member_serialize(*self, const_cast(t), registerClassVersion()); + return *self; + } + + //! Non member serialization + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + CEREAL_SERIALIZE_FUNCTION_NAME(*self, const_cast(t), registerClassVersion()); + return *self; + } + + //! Member split (save) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + access::member_save(*self, t, registerClassVersion()); + return *self; + } + + //! Non member split (save) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + CEREAL_SAVE_FUNCTION_NAME(*self, t, registerClassVersion()); + return *self; + } + + //! Member split (save_minimal) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + self->process( access::member_save_minimal(*self, t, registerClassVersion()) ); + return *self; + } + + //! Non member split (save_minimal) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T const & t) + { + self->process( CEREAL_SAVE_MINIMAL_FUNCTION_NAME(*self, t, registerClassVersion()) ); + return *self; + } + + #undef PROCESS_IF + + private: + ArchiveType * const self; + + //! A set of all base classes that have been serialized + std::unordered_set itsBaseClassSet; + + //! Maps from addresses to pointer ids + std::unordered_map itsSharedPointerMap; + + //! Copy of shared pointers used in #itsSharedPointerMap to make sure they are kept alive + // during lifetime of itsSharedPointerMap to prevent CVE-2020-11105. + std::vector> itsSharedPointerStorage; + + //! The id to be given to the next pointer + std::uint32_t itsCurrentPointerId; + + //! Maps from polymorphic type name strings to ids + std::unordered_map itsPolymorphicTypeMap; + + //! The id to be given to the next polymorphic type name + std::uint32_t itsCurrentPolymorphicTypeId; + + //! Keeps track of classes that have versioning information associated with them + std::unordered_set itsVersionedTypes; + }; // class OutputArchive + + // ###################################################################### + //! The base input archive class + /*! This is the base input archive for all input archives. If you create + a custom archive class, it should derive from this, passing itself as + a template parameter for the ArchiveType. + + The base class provides all of the functionality necessary to + properly forward data to the correct serialization functions. + + Individual archives should use a combination of prologue and + epilogue functions together with specializations of serialize, save, + and load to alter the functionality of their serialization. + + @tparam ArchiveType The archive type that derives from InputArchive + @tparam Flags Flags to control advanced functionality. See the Flags + enum for more information. + @ingroup Internal */ + template + class InputArchive : public detail::InputArchiveBase + { + public: + //! Construct the output archive + /*! @param derived A pointer to the derived ArchiveType (pass this from the derived archive) */ + InputArchive(ArchiveType * const derived) : + self(derived), + itsBaseClassSet(), + itsSharedPointerMap(), + itsPolymorphicTypeMap(), + itsVersionedTypes() + { } + + InputArchive & operator=( InputArchive const & ) = delete; + + //! Serializes all passed in data + /*! This is the primary interface for serializing data with an archive */ + template inline + ArchiveType & operator()( Types && ... args ) + { + process( std::forward( args )... ); + return *self; + } + + //! Serializes any data marked for deferment using defer + /*! This will cause any data wrapped in DeferredData to be immediately serialized */ + void serializeDeferments() + { + for( auto & deferment : itsDeferments ) + deferment(); + } + + /*! @name Boost Transition Layer + Functionality that mirrors the syntax for Boost. This is useful if you are transitioning + a large project from Boost to cereal. The preferred interface for cereal is using operator(). */ + //! @{ + + //! Indicates this archive is intended for loading + /*! This ensures compatibility with boost archive types. If you are transitioning + from boost, you can check this value within a member or external serialize function + (i.e., Archive::is_loading::value) to enable behavior specific to loading, until + you can transition to split save/load or save_minimal/load_minimal functions */ + using is_loading = std::true_type; + + //! Indicates this archive is not intended for saving + /*! This ensures compatibility with boost archive types. If you are transitioning + from boost, you can check this value within a member or external serialize function + (i.e., Archive::is_saving::value) to disable behavior specific to loading, until + you can transition to split save/load or save_minimal/load_minimal functions */ + using is_saving = std::false_type; + + //! Serializes passed in data + /*! This is a boost compatability layer and is not the preferred way of using + cereal. If you are transitioning from boost, use this until you can + transition to the operator() overload */ + template inline + ArchiveType & operator&( T && arg ) + { + self->process( std::forward( arg ) ); + return *self; + } + + //! Serializes passed in data + /*! This is a boost compatability layer and is not the preferred way of using + cereal. If you are transitioning from boost, use this until you can + transition to the operator() overload */ + template inline + ArchiveType & operator>>( T && arg ) + { + self->process( std::forward( arg ) ); + return *self; + } + + //! @} + + //! Retrieves a shared pointer given a unique key for it + /*! This is used to retrieve a previously registered shared_ptr + which has already been loaded. + + @internal + @param id The unique id that was serialized for the pointer + @return A shared pointer to the data + @throw Exception if the id does not exist */ + inline std::shared_ptr getSharedPointer(std::uint32_t const id) + { + if(id == 0) return std::shared_ptr(nullptr); + + auto iter = itsSharedPointerMap.find( id ); + if(iter == itsSharedPointerMap.end()) + throw Exception("Error while trying to deserialize a smart pointer. Could not find id " + std::to_string(id)); + + return iter->second; + } + + //! Registers a shared pointer to its unique identifier + /*! After a shared pointer has been allocated for the first time, it should + be registered with its loaded id for future references to it. + + @internal + @param id The unique identifier for the shared pointer + @param ptr The actual shared pointer */ + inline void registerSharedPointer(std::uint32_t const id, std::shared_ptr ptr) + { + std::uint32_t const stripped_id = id & ~detail::msb_32bit; + itsSharedPointerMap[stripped_id] = ptr; + } + + //! Retrieves the string for a polymorphic type given a unique key for it + /*! This is used to retrieve a string previously registered during + a polymorphic load. + + @internal + @param id The unique id that was serialized for the polymorphic type + @return The string identifier for the tyep */ + inline std::string getPolymorphicName(std::uint32_t const id) + { + auto name = itsPolymorphicTypeMap.find( id ); + if(name == itsPolymorphicTypeMap.end()) + { + throw Exception("Error while trying to deserialize a polymorphic pointer. Could not find type id " + std::to_string(id)); + } + return name->second; + } + + //! Registers a polymorphic name string to its unique identifier + /*! After a polymorphic type has been loaded for the first time, it should + be registered with its loaded id for future references to it. + + @internal + @param id The unique identifier for the polymorphic type + @param name The name associated with the tyep */ + inline void registerPolymorphicName(std::uint32_t const id, std::string const & name) + { + std::uint32_t const stripped_id = id & ~detail::msb_32bit; + itsPolymorphicTypeMap.insert( {stripped_id, name} ); + } + + private: + //! Serializes data after calling prologue, then calls epilogue + template inline + void process( T && head ) + { + prologue( *self, head ); + self->processImpl( head ); + epilogue( *self, head ); + } + + //! Unwinds to process all data + template inline + void process( T && head, Other && ... tail ) + { + process( std::forward( head ) ); + process( std::forward( tail )... ); + } + + //! Serialization of a virtual_base_class wrapper + /*! \sa virtual_base_class */ + template inline + ArchiveType & processImpl(virtual_base_class & b) + { + traits::detail::base_class_id id(b.base_ptr); + if(itsBaseClassSet.count(id) == 0) + { + itsBaseClassSet.insert(id); + self->processImpl( *b.base_ptr ); + } + return *self; + } + + //! Serialization of a base_class wrapper + /*! \sa base_class */ + template inline + ArchiveType & processImpl(base_class & b) + { + self->processImpl( *b.base_ptr ); + return *self; + } + + std::vector> itsDeferments; + + template inline + ArchiveType & processImpl(DeferredData const & d) + { + std::function deferment( [this, d](){ self->process( d.value ); } ); + itsDeferments.emplace_back( std::move(deferment) ); + + return *self; + } + + //! Helper macro that expands the requirements for activating an overload + /*! Requirements: + Has the requested serialization function + Does not have version and unversioned at the same time + Is input serializable AND + is specialized for this type of function OR + has no specialization at all */ + #define PROCESS_IF(name) \ + traits::EnableIf::value, \ + !traits::has_invalid_input_versioning::value, \ + (traits::is_input_serializable::value && \ + (traits::is_specialized_##name::value || \ + !traits::is_specialized::value))> = traits::sfinae + + //! Member serialization + template inline + ArchiveType & processImpl(T & t) + { + access::member_serialize(*self, t); + return *self; + } + + //! Non member serialization + template inline + ArchiveType & processImpl(T & t) + { + CEREAL_SERIALIZE_FUNCTION_NAME(*self, t); + return *self; + } + + //! Member split (load) + template inline + ArchiveType & processImpl(T & t) + { + access::member_load(*self, t); + return *self; + } + + //! Non member split (load) + template inline + ArchiveType & processImpl(T & t) + { + CEREAL_LOAD_FUNCTION_NAME(*self, t); + return *self; + } + + //! Member split (load_minimal) + template inline + ArchiveType & processImpl(T & t) + { + using OutArchiveType = typename traits::detail::get_output_from_input::type; + typename traits::has_member_save_minimal::type value; + self->process( value ); + access::member_load_minimal(*self, t, value); + return *self; + } + + //! Non member split (load_minimal) + template inline + ArchiveType & processImpl(T & t) + { + using OutArchiveType = typename traits::detail::get_output_from_input::type; + typename traits::has_non_member_save_minimal::type value; + self->process( value ); + CEREAL_LOAD_MINIMAL_FUNCTION_NAME(*self, t, value); + return *self; + } + + //! Empty class specialization + template ::value, + std::is_empty::value> = traits::sfinae> inline + ArchiveType & processImpl(T const &) + { + return *self; + } + + //! No matching serialization + /*! Invalid if we have invalid input versioning or + we are not input serializable, and either + don't allow empty class ellision or allow it but are not serializing an empty class */ + template ::value || + (!traits::is_input_serializable::value && + (!(Flags & AllowEmptyClassElision) || ((Flags & AllowEmptyClassElision) && !std::is_empty::value)))> = traits::sfinae> inline + ArchiveType & processImpl(T const &) + { + static_assert(traits::detail::count_input_serializers::value != 0, + "cereal could not find any input serialization functions for the provided type and archive combination. \n\n " + "Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \n " + "Serialize functions generally have the following signature: \n\n " + "template \n " + " void serialize(Archive & ar) \n " + " { \n " + " ar( member1, member2, member3 ); \n " + " } \n\n " ); + + static_assert(traits::detail::count_input_serializers::value < 2, + "cereal found more than one compatible input serialization function for the provided type and archive combination. \n\n " + "Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these). \n " + "Use specialization (see access.hpp) if you need to disambiguate between serialize vs load/save functions. \n " + "Note that serialization functions can be inherited which may lead to the aforementioned ambiguities. \n " + "In addition, you may not mix versioned with non-versioned serialization functions. \n\n "); + + return *self; + } + + //! Befriend for versioning in load_and_construct + template friend struct detail::Construct; + + //! Registers a class version with the archive and serializes it if necessary + /*! If this is the first time this class has been serialized, we will record its + version number and serialize that. + + @tparam T The type of the class being serialized */ + template inline + std::uint32_t loadClassVersion() + { + static const auto hash = std::type_index(typeid(T)).hash_code(); + auto lookupResult = itsVersionedTypes.find( hash ); + + if( lookupResult != itsVersionedTypes.end() ) // already exists + return lookupResult->second; + else // need to load + { + std::uint32_t version; + + process( make_nvp("cereal_class_version", version) ); + itsVersionedTypes.emplace_hint( lookupResult, hash, version ); + + return version; + } + } + + //! Member serialization + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + const auto version = loadClassVersion(); + access::member_serialize(*self, t, version); + return *self; + } + + //! Non member serialization + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + const auto version = loadClassVersion(); + CEREAL_SERIALIZE_FUNCTION_NAME(*self, t, version); + return *self; + } + + //! Member split (load) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + const auto version = loadClassVersion(); + access::member_load(*self, t, version); + return *self; + } + + //! Non member split (load) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + const auto version = loadClassVersion(); + CEREAL_LOAD_FUNCTION_NAME(*self, t, version); + return *self; + } + + //! Member split (load_minimal) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + using OutArchiveType = typename traits::detail::get_output_from_input::type; + const auto version = loadClassVersion(); + typename traits::has_member_versioned_save_minimal::type value; + self->process(value); + access::member_load_minimal(*self, t, value, version); + return *self; + } + + //! Non member split (load_minimal) + /*! Versioning implementation */ + template inline + ArchiveType & processImpl(T & t) + { + using OutArchiveType = typename traits::detail::get_output_from_input::type; + const auto version = loadClassVersion(); + typename traits::has_non_member_versioned_save_minimal::type value; + self->process(value); + CEREAL_LOAD_MINIMAL_FUNCTION_NAME(*self, t, value, version); + return *self; + } + + #undef PROCESS_IF + + private: + ArchiveType * const self; + + //! A set of all base classes that have been serialized + std::unordered_set itsBaseClassSet; + + //! Maps from pointer ids to metadata + std::unordered_map> itsSharedPointerMap; + + //! Maps from name ids to names + std::unordered_map itsPolymorphicTypeMap; + + //! Maps from type hash codes to version numbers + std::unordered_map itsVersionedTypes; + }; // class InputArchive +} // namespace cereal + +// This include needs to come after things such as binary_data, make_nvp, etc +#include "./types/common.hpp" + +#endif // CEREAL_CEREAL_HPP_ diff --git a/external/cereal/details/helpers.hpp b/external/cereal/details/helpers.hpp new file mode 100644 index 0000000..d445d8d --- /dev/null +++ b/external/cereal/details/helpers.hpp @@ -0,0 +1,422 @@ +/*! \file helpers.hpp + \brief Internal helper functionality + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_DETAILS_HELPERS_HPP_ +#define CEREAL_DETAILS_HELPERS_HPP_ + +#include +#include +#include +#include +#include +#include + +#include "../macros.hpp" +#include "./static_object.hpp" + +namespace cereal +{ + // ###################################################################### + //! An exception class thrown when things go wrong at runtime + /*! @ingroup Utility */ + struct Exception : public std::runtime_error + { + explicit Exception( const std::string & what_ ) : std::runtime_error(what_) {} + explicit Exception( const char * what_ ) : std::runtime_error(what_) {} + }; + + // ###################################################################### + //! The size type used by cereal + /*! To ensure compatability between 32, 64, etc bit machines, we need to use + a fixed size type instead of size_t, which may vary from machine to + machine. + + The default value for CEREAL_SIZE_TYPE is specified in cereal/macros.hpp */ + using size_type = CEREAL_SIZE_TYPE; + + // forward decls + class BinaryOutputArchive; + class BinaryInputArchive; + + // ###################################################################### + namespace detail + { + struct NameValuePairCore {}; //!< Traits struct for NVPs + struct DeferredDataCore {}; //!< Traits struct for DeferredData + } + + // ###################################################################### + //! For holding name value pairs + /*! This pairs a name (some string) with some value such that an archive + can potentially take advantage of the pairing. + + In serialization functions, NameValuePairs are usually created like so: + @code{.cpp} + struct MyStruct + { + int a, b, c, d, e; + + template + void serialize(Archive & archive) + { + archive( CEREAL_NVP(a), + CEREAL_NVP(b), + CEREAL_NVP(c), + CEREAL_NVP(d), + CEREAL_NVP(e) ); + } + }; + @endcode + + Alternatively, you can give you data members custom names like so: + @code{.cpp} + struct MyStruct + { + int a, b, my_embarrassing_variable_name, d, e; + + template + void serialize(Archive & archive) + { + archive( CEREAL_NVP(a), + CEREAL_NVP(b), + cereal::make_nvp("var", my_embarrassing_variable_name) ); + CEREAL_NVP(d), + CEREAL_NVP(e) ); + } + }; + @endcode + + There is a slight amount of overhead to creating NameValuePairs, so there + is a third method which will elide the names when they are not used by + the Archive: + + @code{.cpp} + struct MyStruct + { + int a, b; + + template + void serialize(Archive & archive) + { + archive( cereal::make_nvp(a), + cereal::make_nvp(b) ); + } + }; + @endcode + + This third method is generally only used when providing generic type + support. Users writing their own serialize functions will normally + explicitly control whether they want to use NVPs or not. + + @internal */ + template + class NameValuePair : detail::NameValuePairCore + { + private: + // If we get passed an array, keep the type as is, otherwise store + // a reference if we were passed an l value reference, else copy the value + using Type = typename std::conditional::type>::value, + typename std::remove_cv::type, + typename std::conditional::value, + T, + typename std::decay::type>::type>::type; + + // prevent nested nvps + static_assert( !std::is_base_of::value, + "Cannot pair a name to a NameValuePair" ); + + NameValuePair & operator=( NameValuePair const & ) = delete; + + public: + //! Constructs a new NameValuePair + /*! @param n The name of the pair + @param v The value to pair. Ideally this should be an l-value reference so that + the value can be both loaded and saved to. If you pass an r-value reference, + the NameValuePair will store a copy of it instead of a reference. Thus you should + only pass r-values in cases where this makes sense, such as the result of some + size() call. + @internal */ + NameValuePair( char const * n, T && v ) : name(n), value(std::forward(v)) {} + + char const * name; + Type value; + }; + + //! A specialization of make_nvp<> that simply forwards the value for binary archives + /*! @relates NameValuePair + @internal */ + template inline + typename + std::enable_if::value || + std::is_same::value, + T && >::type + make_nvp( const char *, T && value ) + { + return std::forward(value); + } + + //! A specialization of make_nvp<> that actually creates an nvp for non-binary archives + /*! @relates NameValuePair + @internal */ + template inline + typename + std::enable_if::value && + !std::is_same::value, + NameValuePair >::type + make_nvp( const char * name, T && value) + { + return {name, std::forward(value)}; + } + + //! Convenience for creating a templated NVP + /*! For use in internal generic typing functions which have an + Archive type declared + @internal */ + #define CEREAL_NVP_(name, value) ::cereal::make_nvp(name, value) + + // ###################################################################### + //! A wrapper around data that can be serialized in a binary fashion + /*! This class is used to demarcate data that can safely be serialized + as a binary chunk of data. Individual archives can then choose how + best represent this during serialization. + + @internal */ + template + struct BinaryData + { + //! Internally store the pointer as a void *, keeping const if created with + //! a const pointer + using PT = typename std::conditional::type>::type>::value, + const void *, + void *>::type; + + BinaryData( T && d, uint64_t s ) : data(std::forward(d)), size(s) {} + + PT data; //!< pointer to beginning of data + uint64_t size; //!< size in bytes + }; + + // ###################################################################### + //! A wrapper around data that should be serialized after all non-deferred data + /*! This class is used to demarcate data that can only be safely serialized after + any data not wrapped in this class. + + @internal */ + template + class DeferredData : detail::DeferredDataCore + { + private: + // If we get passed an array, keep the type as is, otherwise store + // a reference if we were passed an l value reference, else copy the value + using Type = typename std::conditional::type>::value, + typename std::remove_cv::type, + typename std::conditional::value, + T, + typename std::decay::type>::type>::type; + + // prevent nested nvps + static_assert( !std::is_base_of::value, + "Cannot defer DeferredData" ); + + DeferredData & operator=( DeferredData const & ) = delete; + + public: + //! Constructs a new NameValuePair + /*! @param v The value to defer. Ideally this should be an l-value reference so that + the value can be both loaded and saved to. If you pass an r-value reference, + the DeferredData will store a copy of it instead of a reference. Thus you should + only pass r-values in cases where this makes sense, such as the result of some + size() call. + @internal */ + DeferredData( T && v ) : value(std::forward(v)) {} + + Type value; + }; + + // ###################################################################### + namespace detail + { + // base classes for type checking + /* The rtti virtual function only exists to enable an archive to + be used in a polymorphic fashion, if necessary. See the + archive adapters for an example of this */ + class OutputArchiveBase + { + public: + OutputArchiveBase() = default; + OutputArchiveBase( OutputArchiveBase && ) CEREAL_NOEXCEPT {} + OutputArchiveBase & operator=( OutputArchiveBase && ) CEREAL_NOEXCEPT { return *this; } + virtual ~OutputArchiveBase() CEREAL_NOEXCEPT = default; + + private: + virtual void rtti() {} + }; + + class InputArchiveBase + { + public: + InputArchiveBase() = default; + InputArchiveBase( InputArchiveBase && ) CEREAL_NOEXCEPT {} + InputArchiveBase & operator=( InputArchiveBase && ) CEREAL_NOEXCEPT { return *this; } + virtual ~InputArchiveBase() CEREAL_NOEXCEPT = default; + + private: + virtual void rtti() {} + }; + + // forward decls for polymorphic support + template struct polymorphic_serialization_support; + struct adl_tag; + + // used during saving pointers + static const uint32_t msb_32bit = 0x80000000; + static const int32_t msb2_32bit = 0x40000000; + } + + // ###################################################################### + //! A wrapper around size metadata + /*! This class provides a way for archives to have more flexibility over how + they choose to serialize size metadata for containers. For some archive + types, the size may be implicitly encoded in the output (e.g. JSON) and + not need an explicit entry. Specializing serialize or load/save for + your archive and SizeTags allows you to choose what happens. + + @internal */ + template + class SizeTag + { + private: + // Store a reference if passed an lvalue reference, otherwise + // make a copy of the data + using Type = typename std::conditional::value, + T, + typename std::decay::type>::type; + + SizeTag & operator=( SizeTag const & ) = delete; + + public: + SizeTag( T && sz ) : size(std::forward(sz)) {} + + Type size; + }; + + // ###################################################################### + //! A wrapper around a key and value for serializing data into maps. + /*! This class just provides a grouping of keys and values into a struct for + human readable archives. For example, XML archives will use this wrapper + to write maps like so: + + @code{.xml} + + + MyFirstKey + MyFirstValue + + + MySecondKey + MySecondValue + + + @endcode + + \sa make_map_item + @internal */ + template + struct MapItem + { + using KeyType = typename std::conditional< + std::is_lvalue_reference::value, + Key, + typename std::decay::type>::type; + + using ValueType = typename std::conditional< + std::is_lvalue_reference::value, + Value, + typename std::decay::type>::type; + + //! Construct a MapItem from a key and a value + /*! @internal */ + MapItem( Key && key_, Value && value_ ) : key(std::forward(key_)), value(std::forward(value_)) {} + + MapItem & operator=( MapItem const & ) = delete; + + KeyType key; + ValueType value; + + //! Serialize the MapItem with the NVPs "key" and "value" + template inline + void CEREAL_SERIALIZE_FUNCTION_NAME(Archive & archive) + { + archive( make_nvp("key", key), + make_nvp("value", value) ); + } + }; + + //! Create a MapItem so that human readable archives will group keys and values together + /*! @internal + @relates MapItem */ + template inline + MapItem make_map_item(KeyType && key, ValueType && value) + { + return {std::forward(key), std::forward(value)}; + } + + namespace detail + { + //! Tag for Version, which due to its anonymous namespace, becomes a different + //! type in each translation unit + /*! This allows CEREAL_CLASS_VERSION to be safely called in a header file */ + namespace{ struct version_binding_tag {}; } + + // ###################################################################### + //! Version information class + /*! This is the base case for classes that have not been explicitly + registered */ + template struct Version + { + static const std::uint32_t version = 0; + // we don't need to explicitly register these types since they + // always get a version number of 0 + }; + + //! Holds all registered version information + struct Versions + { + std::unordered_map mapping; + + std::uint32_t find( std::size_t hash, std::uint32_t version ) + { + const auto result = mapping.emplace( hash, version ); + return result.first->second; + } + }; // struct Versions + } // namespace detail +} // namespace cereal + +#endif // CEREAL_DETAILS_HELPERS_HPP_ diff --git a/external/cereal/details/polymorphic_impl.hpp b/external/cereal/details/polymorphic_impl.hpp new file mode 100644 index 0000000..65f0499 --- /dev/null +++ b/external/cereal/details/polymorphic_impl.hpp @@ -0,0 +1,825 @@ +/*! \file polymorphic_impl.hpp + \brief Internal polymorphism support + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This code is heavily inspired by the boost serialization implementation by the following authors + + (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . + Use, modification and distribution is subject to the Boost Software + License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt) + + See http://www.boost.org for updates, documentation, and revision history. + + (C) Copyright 2006 David Abrahams - http://www.boost.org. + + See /boost/serialization/export.hpp, /boost/archive/detail/register_archive.hpp, + and /boost/serialization/void_cast.hpp for their implementation. Additional details + found in other files split across serialization and archive. +*/ +#ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ +#define CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ + +#include "polymorphic_impl_fwd.hpp" +#include "static_object.hpp" +#include "../types/memory.hpp" +#include "../types/string.hpp" +#include +#include +#include +#include +#include +#include + +//! Helper macro to omit unused warning +#if defined(__GNUC__) + // GCC / clang don't want the function + #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION +#else + #define CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION static void unused() { (void)b; } +#endif + +//! Binds a polymorhic type to all registered archives +/*! This binds a polymorphic type to all compatible registered archives that + have been registered with CEREAL_REGISTER_ARCHIVE. This must be called + after all archives are registered (usually after the archives themselves + have been included). */ +#ifdef CEREAL_HAS_CPP17 +#define CEREAL_BIND_TO_ARCHIVES(...) \ + namespace cereal { \ + namespace detail { \ + template<> \ + struct init_binding<__VA_ARGS__> { \ + static inline bind_to_archives<__VA_ARGS__> const & b= \ + ::cereal::detail::StaticObject< \ + bind_to_archives<__VA_ARGS__> \ + >::getInstance().bind(); \ + CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION \ + }; \ + }} /* end namespaces */ +#else +#define CEREAL_BIND_TO_ARCHIVES(...) \ + namespace cereal { \ + namespace detail { \ + template<> \ + struct init_binding<__VA_ARGS__> { \ + static bind_to_archives<__VA_ARGS__> const& b; \ + CEREAL_BIND_TO_ARCHIVES_UNUSED_FUNCTION \ + }; \ + bind_to_archives<__VA_ARGS__> const & init_binding<__VA_ARGS__>::b = \ + ::cereal::detail::StaticObject< \ + bind_to_archives<__VA_ARGS__> \ + >::getInstance().bind(); \ + }} /* end namespaces */ +#endif + +namespace cereal +{ + /* Polymorphic casting support */ + namespace detail + { + //! Base type for polymorphic void casting + /*! Contains functions for casting between registered base and derived types. + + This is necessary so that cereal can properly cast between polymorphic types + even though void pointers are used, which normally have no type information. + Runtime type information is used instead to index a compile-time made mapping + that can perform the proper cast. In the case of multiple levels of inheritance, + cereal will attempt to find the shortest path by using registered relationships to + perform the cast. + + This class will be allocated as a StaticObject and only referenced by pointer, + allowing a templated derived version of it to define strongly typed functions + that cast between registered base and derived types. */ + struct PolymorphicCaster + { + PolymorphicCaster() = default; + PolymorphicCaster( const PolymorphicCaster & ) = default; + PolymorphicCaster & operator=( const PolymorphicCaster & ) = default; + PolymorphicCaster( PolymorphicCaster && ) CEREAL_NOEXCEPT {} + PolymorphicCaster & operator=( PolymorphicCaster && ) CEREAL_NOEXCEPT { return *this; } + virtual ~PolymorphicCaster() CEREAL_NOEXCEPT = default; + + //! Downcasts to the proper derived type + virtual void const * downcast( void const * const ptr ) const = 0; + //! Upcast to proper base type + virtual void * upcast( void * const ptr ) const = 0; + //! Upcast to proper base type, shared_ptr version + virtual std::shared_ptr upcast( std::shared_ptr const & ptr ) const = 0; + }; + + //! Holds registered mappings between base and derived types for casting + /*! This will be allocated as a StaticObject and holds a map containing + all registered mappings between base and derived types. */ + struct PolymorphicCasters + { + //! Maps from a derived type index to a set of chainable casters + using DerivedCasterMap = std::unordered_map>; + //! Maps from base type index to a map from derived type index to caster + std::unordered_map map; + + std::multimap reverseMap; + + //! Error message used for unregistered polymorphic casts + #define UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(LoadSave) \ + throw cereal::Exception("Trying to " #LoadSave " a registered polymorphic type with an unregistered polymorphic cast.\n" \ + "Could not find a path to a base class (" + util::demangle(baseInfo.name()) + ") for type: " + ::cereal::util::demangledName() + "\n" \ + "Make sure you either serialize the base class at some point via cereal::base_class or cereal::virtual_base_class.\n" \ + "Alternatively, manually register the association with CEREAL_REGISTER_POLYMORPHIC_RELATION."); + + //! Checks if the mapping object that can perform the upcast or downcast exists, and returns it if so + /*! Uses the type index from the base and derived class to find the matching + registered caster. If no matching caster exists, the bool in the pair will be false and the vector + reference should not be used. */ + static std::pair const &> + lookup_if_exists( std::type_index const & baseIndex, std::type_index const & derivedIndex ) + { + // First phase of lookup - match base type index + auto const & baseMap = StaticObject::getInstance().map; + auto baseIter = baseMap.find( baseIndex ); + if (baseIter == baseMap.end()) + return {false, {}}; + + // Second phase - find a match from base to derived + auto const & derivedMap = baseIter->second; + auto derivedIter = derivedMap.find( derivedIndex ); + if (derivedIter == derivedMap.end()) + return {false, {}}; + + return {true, derivedIter->second}; + } + + //! Gets the mapping object that can perform the upcast or downcast + /*! Uses the type index from the base and derived class to find the matching + registered caster. If no matching caster exists, calls the exception function. + + The returned PolymorphicCaster is capable of upcasting or downcasting between the two types. */ + template inline + static std::vector const & lookup( std::type_index const & baseIndex, std::type_index const & derivedIndex, F && exceptionFunc ) + { + // First phase of lookup - match base type index + auto const & baseMap = StaticObject::getInstance().map; + auto baseIter = baseMap.find( baseIndex ); + if( baseIter == baseMap.end() ) + exceptionFunc(); + + // Second phase - find a match from base to derived + auto const & derivedMap = baseIter->second; + auto derivedIter = derivedMap.find( derivedIndex ); + if( derivedIter == derivedMap.end() ) + exceptionFunc(); + + return derivedIter->second; + } + + //! Performs a downcast to the derived type using a registered mapping + template inline + static const Derived * downcast( const void * dptr, std::type_info const & baseInfo ) + { + auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(save) } ); + + for( auto const * dmap : mapping ) + dptr = dmap->downcast( dptr ); + + return static_cast( dptr ); + } + + //! Performs an upcast to the registered base type using the given a derived type + /*! The return is untyped because the final casting to the base type must happen in the polymorphic + serialization function, where the type is known at compile time */ + template inline + static void * upcast( Derived * const dptr, std::type_info const & baseInfo ) + { + auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(load) } ); + + void * uptr = dptr; + for( auto mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter ) + uptr = (*mIter)->upcast( uptr ); + + return uptr; + } + + //! Upcasts for shared pointers + template inline + static std::shared_ptr upcast( std::shared_ptr const & dptr, std::type_info const & baseInfo ) + { + auto const & mapping = lookup( baseInfo, typeid(Derived), [&](){ UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION(load) } ); + + std::shared_ptr uptr = dptr; + for( auto mIter = mapping.rbegin(), mEnd = mapping.rend(); mIter != mEnd; ++mIter ) + uptr = (*mIter)->upcast( uptr ); + + return uptr; + } + + #undef UNREGISTERED_POLYMORPHIC_CAST_EXCEPTION + }; + + #ifdef CEREAL_OLDER_GCC + #define CEREAL_EMPLACE_MAP(map, key, value) \ + map.insert( std::make_pair(std::move(key), std::move(value)) ); + #else // NOT CEREAL_OLDER_GCC + #define CEREAL_EMPLACE_MAP(map, key, value) \ + map.emplace( key, value ); + #endif // NOT_CEREAL_OLDER_GCC + + //! Strongly typed derivation of PolymorphicCaster + template + struct PolymorphicVirtualCaster : PolymorphicCaster + { + //! Inserts an entry in the polymorphic casting map for this pairing + /*! Creates an explicit mapping between Base and Derived in both upwards and + downwards directions, allowing void pointers to either to be properly cast + assuming dynamic type information is available */ + PolymorphicVirtualCaster() + { + const auto baseKey = std::type_index(typeid(Base)); + const auto derivedKey = std::type_index(typeid(Derived)); + + // First insert the relation Base->Derived + const auto lock = StaticObject::lock(); + auto & baseMap = StaticObject::getInstance().map; + + { + auto & derivedMap = baseMap.insert( {baseKey, PolymorphicCasters::DerivedCasterMap{}} ).first->second; + auto & derivedVec = derivedMap.insert( {derivedKey, {}} ).first->second; + derivedVec.push_back( this ); + } + + // Insert reverse relation Derived->Base + auto & reverseMap = StaticObject::getInstance().reverseMap; + CEREAL_EMPLACE_MAP(reverseMap, derivedKey, baseKey); + + // Find all chainable unregistered relations + /* The strategy here is to process only the nodes in the class hierarchy graph that have been + affected by the new insertion. The aglorithm iteratively processes a node an ensures that it + is updated with all new shortest length paths. It then rocesses the parents of the active node, + with the knowledge that all children have already been processed. + + Note that for the following, we'll use the nomenclature of parent and child to not confuse with + the inserted base derived relationship */ + { + // Checks whether there is a path from parent->child and returns a pair + // dist is set to MAX if the path does not exist + auto checkRelation = [](std::type_index const & parentInfo, std::type_index const & childInfo) -> + std::pair const &> + { + auto result = PolymorphicCasters::lookup_if_exists( parentInfo, childInfo ); + if( result.first ) + { + auto const & path = result.second; + return {path.size(), path}; + } + else + return {(std::numeric_limits::max)(), {}}; + }; + + std::stack parentStack; // Holds the parent nodes to be processed + std::vector dirtySet; // Marks child nodes that have been changed + std::unordered_set processedParents; // Marks parent nodes that have been processed + + // Checks if a child has been marked dirty + auto isDirty = [&](std::type_index const & c) + { + auto const dirtySetSize = dirtySet.size(); + for( size_t i = 0; i < dirtySetSize; ++i ) + if( dirtySet[i] == c ) + return true; + + return false; + }; + + // Begin processing the base key and mark derived as dirty + parentStack.push( baseKey ); + dirtySet.emplace_back( derivedKey ); + + while( !parentStack.empty() ) + { + using Relations = std::unordered_multimap>>; + Relations unregisteredRelations; // Defer insertions until after main loop to prevent iterator invalidation + + const auto parent = parentStack.top(); + parentStack.pop(); + + // Update paths to all children marked dirty + for( auto const & childPair : baseMap[parent] ) + { + const auto child = childPair.first; + if( isDirty( child ) && baseMap.count( child ) ) + { + auto parentChildPath = checkRelation( parent, child ); + + // Search all paths from the child to its own children (finalChild), + // looking for a shorter parth from parent to finalChild + for( auto const & finalChildPair : baseMap[child] ) + { + const auto finalChild = finalChildPair.first; + + auto parentFinalChildPath = checkRelation( parent, finalChild ); + auto childFinalChildPath = checkRelation( child, finalChild ); + + const size_t newLength = 1u + parentChildPath.first; + + if( newLength < parentFinalChildPath.first ) + { + std::vector path = parentChildPath.second; + path.insert( path.end(), childFinalChildPath.second.begin(), childFinalChildPath.second.end() ); + + // Check to see if we have a previous uncommitted path in unregisteredRelations + // that is shorter. If so, ignore this path + auto hintRange = unregisteredRelations.equal_range( parent ); + auto hint = hintRange.first; + for( ; hint != hintRange.second; ++hint ) + if( hint->second.first == finalChild ) + break; + + const bool uncommittedExists = hint != unregisteredRelations.end(); + if( uncommittedExists && (hint->second.second.size() <= newLength) ) + continue; + + auto newPath = std::pair>{finalChild, std::move(path)}; + + // Insert the new path if it doesn't exist, otherwise this will just lookup where to do the + // replacement + #ifdef CEREAL_OLDER_GCC + auto old = unregisteredRelations.insert( hint, std::make_pair(parent, newPath) ); + #else // NOT CEREAL_OLDER_GCC + auto old = unregisteredRelations.emplace_hint( hint, parent, newPath ); + #endif // NOT CEREAL_OLDER_GCC + + // If there was an uncommitted path, we need to perform a replacement + if( uncommittedExists ) + old->second = newPath; + } + } // end loop over child's children + } // end if dirty and child has children + } // end loop over children + + // Insert chained relations + for( auto const & it : unregisteredRelations ) + { + auto & derivedMap = baseMap.find( it.first )->second; + derivedMap[it.second.first] = it.second.second; + CEREAL_EMPLACE_MAP(reverseMap, it.second.first, it.first ); + } + + // Mark current parent as modified + dirtySet.emplace_back( parent ); + + // Insert all parents of the current parent node that haven't yet been processed + auto parentRange = reverseMap.equal_range( parent ); + for( auto pIter = parentRange.first; pIter != parentRange.second; ++pIter ) + { + const auto pParent = pIter->second; + if( !processedParents.count( pParent ) ) + { + parentStack.push( pParent ); + processedParents.insert( pParent ); + } + } + } // end loop over parent stack + } // end chainable relations + } // end PolymorphicVirtualCaster() + + #undef CEREAL_EMPLACE_MAP + + //! Performs the proper downcast with the templated types + void const * downcast( void const * const ptr ) const override + { + return dynamic_cast( static_cast( ptr ) ); + } + + //! Performs the proper upcast with the templated types + void * upcast( void * const ptr ) const override + { + return dynamic_cast( static_cast( ptr ) ); + } + + //! Performs the proper upcast with the templated types (shared_ptr version) + std::shared_ptr upcast( std::shared_ptr const & ptr ) const override + { + return std::dynamic_pointer_cast( std::static_pointer_cast( ptr ) ); + } + }; + + //! Registers a polymorphic casting relation between a Base and Derived type + /*! Registering a relation allows cereal to properly cast between the two types + given runtime type information and void pointers. + + Registration happens automatically via cereal::base_class and cereal::virtual_base_class + instantiations. For cases where neither is called, see the CEREAL_REGISTER_POLYMORPHIC_RELATION + macro */ + template + struct RegisterPolymorphicCaster + { + static PolymorphicCaster const * bind( std::true_type /* is_polymorphic */) + { + return &StaticObject>::getInstance(); + } + + static PolymorphicCaster const * bind( std::false_type /* is_polymorphic */ ) + { return nullptr; } + + //! Performs registration (binding) between Base and Derived + /*! If the type is not polymorphic, nothing will happen */ + static PolymorphicCaster const * bind() + { return bind( typename std::is_polymorphic::type() ); } + }; + } + + /* General polymorphism support */ + namespace detail + { + //! Binds a compile time type with a user defined string + template + struct binding_name {}; + + //! A structure holding a map from type_indices to output serializer functions + /*! A static object of this map should be created for each registered archive + type, containing entries for every registered type that describe how to + properly cast the type to its real type in polymorphic scenarios for + shared_ptr, weak_ptr, and unique_ptr. */ + template + struct OutputBindingMap + { + //! A serializer function + /*! Serializer functions return nothing and take an archive as + their first parameter (will be cast properly inside the function, + a pointer to actual data (contents of smart_ptr's get() function) + as their second parameter, and the type info of the owning smart_ptr + as their final parameter */ + typedef std::function Serializer; + + //! Struct containing the serializer functions for all pointer types + struct Serializers + { + Serializer shared_ptr, //!< Serializer function for shared/weak pointers + unique_ptr; //!< Serializer function for unique pointers + }; + + //! A map of serializers for pointers of all registered types + std::map map; + }; + + //! An empty noop deleter + template struct EmptyDeleter { void operator()(T *) const {} }; + + //! A structure holding a map from type name strings to input serializer functions + /*! A static object of this map should be created for each registered archive + type, containing entries for every registered type that describe how to + properly cast the type to its real type in polymorphic scenarios for + shared_ptr, weak_ptr, and unique_ptr. */ + template + struct InputBindingMap + { + //! Shared ptr serializer function + /*! Serializer functions return nothing and take an archive as + their first parameter (will be cast properly inside the function, + a shared_ptr (or unique_ptr for the unique case) of any base + type, and the type id of said base type as the third parameter. + Internally it will properly be loaded and cast to the correct type. */ + typedef std::function &, std::type_info const &)> SharedSerializer; + //! Unique ptr serializer function + typedef std::function> &, std::type_info const &)> UniqueSerializer; + + //! Struct containing the serializer functions for all pointer types + struct Serializers + { + SharedSerializer shared_ptr; //!< Serializer function for shared/weak pointers + UniqueSerializer unique_ptr; //!< Serializer function for unique pointers + }; + + //! A map of serializers for pointers of all registered types + std::map map; + }; + + // forward decls for archives from cereal.hpp + class InputArchiveBase; + class OutputArchiveBase; + + //! Creates a binding (map entry) between an input archive type and a polymorphic type + /*! Bindings are made when types are registered, assuming that at least one + archive has already been registered. When this struct is created, + it will insert (at run time) an entry into a map that properly handles + casting for serializing polymorphic objects */ + template struct InputBindingCreator + { + //! Initialize the binding + InputBindingCreator() + { + auto & map = StaticObject>::getInstance().map; + auto lock = StaticObject>::lock(); + auto key = std::string(binding_name::name()); + auto lb = map.lower_bound(key); + + if (lb != map.end() && lb->first == key) + return; + + typename InputBindingMap::Serializers serializers; + + serializers.shared_ptr = + [](void * arptr, std::shared_ptr & dptr, std::type_info const & baseInfo) + { + Archive & ar = *static_cast(arptr); + std::shared_ptr ptr; + + ar( CEREAL_NVP_("ptr_wrapper", ::cereal::memory_detail::make_ptr_wrapper(ptr)) ); + + dptr = PolymorphicCasters::template upcast( ptr, baseInfo ); + }; + + serializers.unique_ptr = + [](void * arptr, std::unique_ptr> & dptr, std::type_info const & baseInfo) + { + Archive & ar = *static_cast(arptr); + std::unique_ptr ptr; + + ar( CEREAL_NVP_("ptr_wrapper", ::cereal::memory_detail::make_ptr_wrapper(ptr)) ); + + dptr.reset( PolymorphicCasters::template upcast( ptr.release(), baseInfo )); + }; + + map.insert( lb, { std::move(key), std::move(serializers) } ); + } + }; + + //! Creates a binding (map entry) between an output archive type and a polymorphic type + /*! Bindings are made when types are registered, assuming that at least one + archive has already been registered. When this struct is created, + it will insert (at run time) an entry into a map that properly handles + casting for serializing polymorphic objects */ + template struct OutputBindingCreator + { + //! Writes appropriate metadata to the archive for this polymorphic type + static void writeMetadata(Archive & ar) + { + // Register the polymorphic type name with the archive, and get the id + char const * name = binding_name::name(); + std::uint32_t id = ar.registerPolymorphicType(name); + + // Serialize the id + ar( CEREAL_NVP_("polymorphic_id", id) ); + + // If the msb of the id is 1, then the type name is new, and we should serialize it + if( id & detail::msb_32bit ) + { + std::string namestring(name); + ar( CEREAL_NVP_("polymorphic_name", namestring) ); + } + } + + //! Holds a properly typed shared_ptr to the polymorphic type + class PolymorphicSharedPointerWrapper + { + public: + /*! Wrap a raw polymorphic pointer in a shared_ptr to its true type + + The wrapped pointer will not be responsible for ownership of the held pointer + so it will not attempt to destroy it; instead the refcount of the wrapped + pointer will be tied to a fake 'ownership pointer' that will do nothing + when it ultimately goes out of scope. + + The main reason for doing this, other than not to destroy the true object + with our wrapper pointer, is to avoid meddling with the internal reference + count in a polymorphic type that inherits from std::enable_shared_from_this. + + @param dptr A void pointer to the contents of the shared_ptr to serialize */ + PolymorphicSharedPointerWrapper( T const * dptr ) : refCount(), wrappedPtr( refCount, dptr ) + { } + + //! Get the wrapped shared_ptr */ + inline std::shared_ptr const & operator()() const { return wrappedPtr; } + + private: + std::shared_ptr refCount; //!< The ownership pointer + std::shared_ptr wrappedPtr; //!< The wrapped pointer + }; + + //! Does the actual work of saving a polymorphic shared_ptr + /*! This function will properly create a shared_ptr from the void * that is passed in + before passing it to the archive for serialization. + + In addition, this will also preserve the state of any internal enable_shared_from_this mechanisms + + @param ar The archive to serialize to + @param dptr Pointer to the actual data held by the shared_ptr */ + static inline void savePolymorphicSharedPtr( Archive & ar, T const * dptr, std::true_type /* has_shared_from_this */ ) + { + ::cereal::memory_detail::EnableSharedStateHelper state( const_cast(dptr) ); + PolymorphicSharedPointerWrapper psptr( dptr ); + ar( CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper( psptr() ) ) ); + } + + //! Does the actual work of saving a polymorphic shared_ptr + /*! This function will properly create a shared_ptr from the void * that is passed in + before passing it to the archive for serialization. + + This version is for types that do not inherit from std::enable_shared_from_this. + + @param ar The archive to serialize to + @param dptr Pointer to the actual data held by the shared_ptr */ + static inline void savePolymorphicSharedPtr( Archive & ar, T const * dptr, std::false_type /* has_shared_from_this */ ) + { + PolymorphicSharedPointerWrapper psptr( dptr ); + ar( CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper( psptr() ) ) ); + } + + //! Initialize the binding + OutputBindingCreator() + { + auto & map = StaticObject>::getInstance().map; + auto key = std::type_index(typeid(T)); + auto lb = map.lower_bound(key); + + if (lb != map.end() && lb->first == key) + return; + + typename OutputBindingMap::Serializers serializers; + + serializers.shared_ptr = + [&](void * arptr, void const * dptr, std::type_info const & baseInfo) + { + Archive & ar = *static_cast(arptr); + writeMetadata(ar); + + auto ptr = PolymorphicCasters::template downcast( dptr, baseInfo ); + + #if defined(_MSC_VER) && _MSC_VER < 1916 && !defined(__clang__) + savePolymorphicSharedPtr( ar, ptr, ::cereal::traits::has_shared_from_this::type() ); // MSVC doesn't like typename here + #else // not _MSC_VER + savePolymorphicSharedPtr( ar, ptr, typename ::cereal::traits::has_shared_from_this::type() ); + #endif // _MSC_VER + }; + + serializers.unique_ptr = + [&](void * arptr, void const * dptr, std::type_info const & baseInfo) + { + Archive & ar = *static_cast(arptr); + writeMetadata(ar); + + std::unique_ptr> const ptr( PolymorphicCasters::template downcast( dptr, baseInfo ) ); + + ar( CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr)) ); + }; + + map.insert( { std::move(key), std::move(serializers) } ); + } + }; + + //! Used to help out argument dependent lookup for finding potential overloads + //! of instantiate_polymorphic_binding + struct adl_tag {}; + + //! Tag for init_binding, bind_to_archives and instantiate_polymorphic_binding. + //! For C++14 and below, we must instantiate a unique StaticObject per TU that is + //! otherwise identical -- otherwise we get multiple definition problems (ODR violations). + //! To achieve this, put a tag in an anonymous namespace and use it as a template argument. + //! + //! For C++17, we can use static inline global variables to unify these definitions across + //! all TUs in the same shared object (DLL). The tag is therefore not necessary. + //! For convenience, keep it to not complicate other code, but don't put it in + //! an anonymous namespace. Now the template instantiations will correspond + //! to the same type, and since they are marked inline with C++17, they will be merged + //! across all TUs. +#ifdef CEREAL_HAS_CPP17 + struct polymorphic_binding_tag {}; +#else + namespace { struct polymorphic_binding_tag {}; } +#endif + + + //! Causes the static object bindings between an archive type and a serializable type T + template + struct create_bindings + { + static const InputBindingCreator & + load(std::true_type) + { + return cereal::detail::StaticObject>::getInstance(); + } + + static const OutputBindingCreator & + save(std::true_type) + { + return cereal::detail::StaticObject>::getInstance(); + } + + inline static void load(std::false_type) {} + inline static void save(std::false_type) {} + }; + + //! When specialized, causes the compiler to instantiate its parameter + template + struct instantiate_function {}; + + /*! This struct is used as the return type of instantiate_polymorphic_binding + for specific Archive types. When the compiler looks for overloads of + instantiate_polymorphic_binding, it will be forced to instantiate this + struct during overload resolution, even though it will not be part of a valid + overload */ + template + struct polymorphic_serialization_support + { + #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) + //! Creates the appropriate bindings depending on whether the archive supports + //! saving or loading + virtual CEREAL_DLL_EXPORT void instantiate() CEREAL_USED; + #else // NOT _MSC_VER + //! Creates the appropriate bindings depending on whether the archive supports + //! saving or loading + static CEREAL_DLL_EXPORT void instantiate() CEREAL_USED; + //! This typedef causes the compiler to instantiate this static function + typedef instantiate_function unused; + #endif // _MSC_VER + }; + + // instantiate implementation + template + CEREAL_DLL_EXPORT void polymorphic_serialization_support::instantiate() + { + create_bindings::save( std::integral_constant::value && + traits::is_output_serializable::value>{} ); + + create_bindings::load( std::integral_constant::value && + traits::is_input_serializable::value>{} ); + } + + //! Begins the binding process of a type to all registered archives + /*! Archives need to be registered prior to this struct being instantiated via + the CEREAL_REGISTER_ARCHIVE macro. Overload resolution will then force + several static objects to be made that allow us to bind together all + registered archive types with the parameter type T. */ + template + struct bind_to_archives + { + //! Binding for non abstract types + void bind(std::false_type) const + { + instantiate_polymorphic_binding(static_cast(nullptr), 0, Tag{}, adl_tag{}); + } + + //! Binding for abstract types + void bind(std::true_type) const + { } + + //! Binds the type T to all registered archives + /*! If T is abstract, we will not serialize it and thus + do not need to make a binding */ + bind_to_archives const & bind() const + { + static_assert( std::is_polymorphic::value, + "Attempting to register non polymorphic type" ); + bind( std::is_abstract() ); + return *this; + } + }; + + //! Used to hide the static object used to bind T to registered archives + template + struct init_binding; + + //! Base case overload for instantiation + /*! This will end up always being the best overload due to the second + parameter always being passed as an int. All other overloads will + accept pointers to archive types and have lower precedence than int. + + Since the compiler needs to check all possible overloads, the + other overloads created via CEREAL_REGISTER_ARCHIVE, which will have + lower precedence due to requring a conversion from int to (Archive*), + will cause their return types to be instantiated through the static object + mechanisms even though they are never called. + + See the documentation for the other functions to try and understand this */ + template + void instantiate_polymorphic_binding( T*, int, BindingTag, adl_tag ) {} + } // namespace detail +} // namespace cereal + +#endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ diff --git a/external/cereal/details/polymorphic_impl_fwd.hpp b/external/cereal/details/polymorphic_impl_fwd.hpp new file mode 100644 index 0000000..83ae7fa --- /dev/null +++ b/external/cereal/details/polymorphic_impl_fwd.hpp @@ -0,0 +1,65 @@ +/*! \file polymorphic_impl_fwd.hpp + \brief Internal polymorphism support forward declarations + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This code is heavily inspired by the boost serialization implementation by the following authors + + (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . + Use, modification and distribution is subject to the Boost Software + License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt) + + See http://www.boost.org for updates, documentation, and revision history. + + (C) Copyright 2006 David Abrahams - http://www.boost.org. + + See /boost/serialization/export.hpp and /boost/archive/detail/register_archive.hpp for their + implementation. +*/ + +#ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_ +#define CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_ + +namespace cereal +{ + namespace detail + { + //! Forward declaration, see polymorphic_impl.hpp for more information + template + struct RegisterPolymorphicCaster; + + //! Forward declaration, see polymorphic_impl.hpp for more information + struct PolymorphicCasters; + + //! Forward declaration, see polymorphic_impl.hpp for more information + template + struct PolymorphicRelation; + } // namespace detail +} // namespace cereal + +#endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_FWD_HPP_ diff --git a/external/cereal/details/static_object.hpp b/external/cereal/details/static_object.hpp new file mode 100644 index 0000000..def7f1a --- /dev/null +++ b/external/cereal/details/static_object.hpp @@ -0,0 +1,128 @@ +/*! \file static_object.hpp + \brief Internal polymorphism static object support + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_DETAILS_STATIC_OBJECT_HPP_ +#define CEREAL_DETAILS_STATIC_OBJECT_HPP_ + +#include "../macros.hpp" + +#if CEREAL_THREAD_SAFE +#include +#endif + +//! Prevent link optimization from removing non-referenced static objects +/*! Especially for polymorphic support, we create static objects which + may not ever be explicitly referenced. Most linkers will detect this + and remove the code causing various unpleasant runtime errors. These + macros, adopted from Boost (see force_include.hpp) prevent this + (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . + Use, modification and distribution is subject to the Boost Software + License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt) */ + +#if defined(_MSC_VER) && !defined(__clang__) +# define CEREAL_DLL_EXPORT __declspec(dllexport) +# define CEREAL_USED +#else // clang or gcc +# define CEREAL_DLL_EXPORT __attribute__ ((visibility("default"))) +# define CEREAL_USED __attribute__ ((__used__)) +#endif + +namespace cereal +{ + namespace detail + { + //! A static, pre-execution object + /*! This class will create a single copy (singleton) of some + type and ensures that merely referencing this type will + cause it to be instantiated and initialized pre-execution. + For example, this is used heavily in the polymorphic pointer + serialization mechanisms to bind various archive types with + different polymorphic classes */ + template + class CEREAL_DLL_EXPORT StaticObject + { + private: + + static T & create() + { + static T t; + //! Forces instantiation at pre-execution time + (void)instance; + return t; + } + + StaticObject( StaticObject const & /*other*/ ) {} + + public: + static T & getInstance() + { + return create(); + } + + //! A class that acts like std::lock_guard + class LockGuard + { + #if CEREAL_THREAD_SAFE + public: + LockGuard(std::mutex & m) : lock(m) {} + private: + std::unique_lock lock; + #else + public: + LockGuard() = default; + LockGuard(LockGuard const &) = default; // prevents implicit copy ctor warning + ~LockGuard() CEREAL_NOEXCEPT {} // prevents variable not used + #endif + }; + + //! Attempts to lock this static object for the current scope + /*! @note This function is a no-op if cereal is not compiled with + thread safety enabled (CEREAL_THREAD_SAFE = 1). + + This function returns an object that holds a lock for + this StaticObject that will release its lock upon destruction. This + call will block until the lock is available. */ + static LockGuard lock() + { + #if CEREAL_THREAD_SAFE + static std::mutex instanceMutex; + return LockGuard{instanceMutex}; + #else + return LockGuard{}; + #endif + } + + private: + static T & instance; + }; + + template T & StaticObject::instance = StaticObject::create(); + } // namespace detail +} // namespace cereal + +#endif // CEREAL_DETAILS_STATIC_OBJECT_HPP_ diff --git a/external/cereal/details/traits.hpp b/external/cereal/details/traits.hpp new file mode 100644 index 0000000..5a09ac2 --- /dev/null +++ b/external/cereal/details/traits.hpp @@ -0,0 +1,1411 @@ +/*! \file traits.hpp + \brief Internal type trait support + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_DETAILS_TRAITS_HPP_ +#define CEREAL_DETAILS_TRAITS_HPP_ + +#ifndef __clang__ +#if (__GNUC__ == 4 && __GNUC_MINOR__ <= 7) +#define CEREAL_OLDER_GCC +#endif // gcc 4.7 or earlier +#endif // __clang__ + +#include +#include + +#include "../macros.hpp" +#include "../access.hpp" + +namespace cereal +{ + namespace traits + { + using yes = std::true_type; + using no = std::false_type; + + namespace detail + { + // ###################################################################### + //! Used to delay a static_assert until template instantiation + template + struct delay_static_assert : std::false_type {}; + + // ###################################################################### + // SFINAE Helpers + #ifdef CEREAL_OLDER_GCC // when VS supports better SFINAE, we can use this as the default + template struct Void { typedef void type; }; + #endif // CEREAL_OLDER_GCC + + //! Return type for SFINAE Enablers + enum class sfinae {}; + + // ###################################################################### + // Helper functionality for boolean integral constants and Enable/DisableIf + template struct meta_bool_and : std::integral_constant::value> {}; + template struct meta_bool_and : std::integral_constant {}; + + template struct meta_bool_or : std::integral_constant::value> {}; + template struct meta_bool_or : std::integral_constant {}; + + // workaround needed due to bug in MSVC 2013, see + // http://connect.microsoft.com/VisualStudio/feedback/details/800231/c-11-alias-template-issue + template + struct EnableIfHelper : std::enable_if::value, sfinae> {}; + + template + struct DisableIfHelper : std::enable_if::value, sfinae> {}; + } // namespace detail + + //! Used as the default value for EnableIf and DisableIf template parameters + /*! @relates EnableIf + @relates DisableIf */ + static const detail::sfinae sfinae = {}; + + // ###################################################################### + //! Provides a way to enable a function if conditions are met + /*! This is intended to be used in a near identical fashion to std::enable_if + while being significantly easier to read at the cost of not allowing for as + complicated of a condition. + + This will compile (allow the function) if every condition evaluates to true. + at compile time. This should be used with SFINAE to ensure that at least + one other candidate function works when one fails due to an EnableIf. + + This should be used as the las template parameter to a function as + an unnamed parameter with a default value of cereal::traits::sfinae: + + @code{cpp} + // using by making the last template argument variadic + template ::value> = sfinae> + void func(T t ); + @endcode + + Note that this performs a logical AND of all conditions, so you will need + to construct more complicated requirements with this fact in mind. + + @relates DisableIf + @relates sfinae + @tparam Conditions The conditions which will be logically ANDed to enable the function. */ + template + using EnableIf = typename detail::EnableIfHelper::type; + + // ###################################################################### + //! Provides a way to disable a function if conditions are met + /*! This is intended to be used in a near identical fashion to std::enable_if + while being significantly easier to read at the cost of not allowing for as + complicated of a condition. + + This will compile (allow the function) if every condition evaluates to false. + This should be used with SFINAE to ensure that at least one other candidate + function works when one fails due to a DisableIf. + + This should be used as the las template parameter to a function as + an unnamed parameter with a default value of cereal::traits::sfinae: + + @code{cpp} + // using by making the last template argument variadic + template ::value> = sfinae> + void func(T t ); + @endcode + + This is often used in conjunction with EnableIf to form an enable/disable pair of + overloads. + + Note that this performs a logical AND of all conditions, so you will need + to construct more complicated requirements with this fact in mind. If all conditions + hold, the function will be disabled. + + @relates EnableIf + @relates sfinae + @tparam Conditions The conditions which will be logically ANDed to disable the function. */ + template + using DisableIf = typename detail::DisableIfHelper::type; + + // ###################################################################### + namespace detail + { + template + struct get_output_from_input : no + { + static_assert( detail::delay_static_assert::value, + "Could not find an associated output archive for input archive." ); + }; + + template + struct get_input_from_output : no + { + static_assert( detail::delay_static_assert::value, + "Could not find an associated input archive for output archive." ); + }; + } + + //! Sets up traits that relate an input archive to an output archive + #define CEREAL_SETUP_ARCHIVE_TRAITS(InputArchive, OutputArchive) \ + namespace cereal { namespace traits { namespace detail { \ + template <> struct get_output_from_input \ + { using type = OutputArchive; }; \ + template <> struct get_input_from_output \ + { using type = InputArchive; }; } } } /* end namespaces */ + + // ###################################################################### + //! Used to convert a MAKE_HAS_XXX macro into a versioned variant + #define CEREAL_MAKE_VERSIONED_TEST ,0 + + // ###################################################################### + //! Creates a test for whether a non const member function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param name The name of the function to test for (e.g. serialize, load, save) + @param test_name The name to give the test for the function being tested for (e.g. serialize, versioned_serialize) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #ifdef CEREAL_OLDER_GCC + #define CEREAL_MAKE_HAS_MEMBER_TEST(name, test_name, versioned) \ + template \ + struct has_member_##test_name : no {}; \ + template \ + struct has_member_##test_name(), std::declval() versioned ) ) >::type> : yes {} + #else // NOT CEREAL_OLDER_GCC + #define CEREAL_MAKE_HAS_MEMBER_TEST(name, test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##name##_##versioned##_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_##name( std::declval(), std::declval() versioned ), yes()); \ + template \ + static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + }; \ + } /* end namespace detail */ \ + template \ + struct has_member_##test_name : std::integral_constant::value> {} + #endif // NOT CEREAL_OLDER_GCC + + // ###################################################################### + //! Creates a test for whether a non const non-member function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper non-member function for the given archive. */ + #define CEREAL_MAKE_HAS_NON_MEMBER_TEST(test_name, func, versioned) \ + namespace detail \ + { \ + template \ + struct has_non_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( func( std::declval(), std::declval() versioned ), yes()); \ + template \ + static no test( ... ); \ + static const bool value = std::is_same( 0 ) ), yes>::value; \ + }; \ + } /* end namespace detail */ \ + template \ + struct has_non_member_##test_name : std::integral_constant::value> {} + + // ###################################################################### + // Member Serialize + CEREAL_MAKE_HAS_MEMBER_TEST(serialize, serialize,); + + // ###################################################################### + // Member Serialize (versioned) + CEREAL_MAKE_HAS_MEMBER_TEST(serialize, versioned_serialize, CEREAL_MAKE_VERSIONED_TEST); + + // ###################################################################### + // Non Member Serialize + CEREAL_MAKE_HAS_NON_MEMBER_TEST(serialize, CEREAL_SERIALIZE_FUNCTION_NAME,); + + // ###################################################################### + // Non Member Serialize (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_TEST(versioned_serialize, CEREAL_SERIALIZE_FUNCTION_NAME, CEREAL_MAKE_VERSIONED_TEST); + + // ###################################################################### + // Member Load + CEREAL_MAKE_HAS_MEMBER_TEST(load, load,); + + // ###################################################################### + // Member Load (versioned) + CEREAL_MAKE_HAS_MEMBER_TEST(load, versioned_load, CEREAL_MAKE_VERSIONED_TEST); + + // ###################################################################### + // Non Member Load + CEREAL_MAKE_HAS_NON_MEMBER_TEST(load, CEREAL_LOAD_FUNCTION_NAME,); + + // ###################################################################### + // Non Member Load (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_TEST(versioned_load, CEREAL_LOAD_FUNCTION_NAME, CEREAL_MAKE_VERSIONED_TEST); + + // ###################################################################### + #undef CEREAL_MAKE_HAS_NON_MEMBER_TEST + #undef CEREAL_MAKE_HAS_MEMBER_TEST + + // ###################################################################### + //! Creates a test for whether a member save function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param test_name The name to give the test (e.g. save or versioned_save) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #ifdef CEREAL_OLDER_GCC + #define CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##test_name##_impl \ + { \ + template struct test : no {}; \ + template \ + struct test(), \ + std::declval() versioned ) ) >::type> : yes {}; \ + static const bool value = test(); \ + \ + template struct test2 : no {}; \ + template \ + struct test2(), \ + std::declval::type&>() versioned ) ) >::type> : yes {}; \ + static const bool not_const_type = test2(); \ + }; \ + } /* end namespace detail */ + #else /* NOT CEREAL_OLDER_GCC =================================== */ + #define CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_save( std::declval(), \ + std::declval() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + \ + template \ + static auto test2(int) -> decltype( cereal::access::member_save_non_const( \ + std::declval(), \ + std::declval::type&>() versioned ), yes()); \ + template static no test2(...); \ + static const bool not_const_type = std::is_same(0)), yes>::value; \ + }; \ + } /* end namespace detail */ + #endif /* NOT CEREAL_OLDER_GCC */ + + // ###################################################################### + // Member Save + CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(save, ) + + template + struct has_member_save : std::integral_constant::value> + { + typedef typename detail::has_member_save_impl check; + static_assert( check::value || !check::not_const_type, + "cereal detected a non-const save. \n " + "save member functions must always be const" ); + }; + + // ###################################################################### + // Member Save (versioned) + CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL(versioned_save, CEREAL_MAKE_VERSIONED_TEST) + + template + struct has_member_versioned_save : std::integral_constant::value> + { + typedef typename detail::has_member_versioned_save_impl check; + static_assert( check::value || !check::not_const_type, + "cereal detected a versioned non-const save. \n " + "save member functions must always be const" ); + }; + + // ###################################################################### + #undef CEREAL_MAKE_HAS_MEMBER_SAVE_IMPL + + // ###################################################################### + //! Creates a test for whether a non-member save function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper non-member function for the given archive. + + @param test_name The name to give the test (e.g. save or versioned_save) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #define CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_non_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( CEREAL_SAVE_FUNCTION_NAME( \ + std::declval(), \ + std::declval() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + \ + template \ + static auto test2(int) -> decltype( CEREAL_SAVE_FUNCTION_NAME( \ + std::declval(), \ + std::declval::type&>() versioned ), yes()); \ + template static no test2(...); \ + static const bool not_const_type = std::is_same(0)), yes>::value; \ + }; \ + } /* end namespace detail */ \ + \ + template \ + struct has_non_member_##test_name : std::integral_constant::value> \ + { \ + using check = typename detail::has_non_member_##test_name##_impl; \ + static_assert( check::value || !check::not_const_type, \ + "cereal detected a non-const type parameter in non-member " #test_name ". \n " \ + #test_name " non-member functions must always pass their types as const" ); \ + }; + + // ###################################################################### + // Non Member Save + CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(save, ) + + // ###################################################################### + // Non Member Save (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST(versioned_save, CEREAL_MAKE_VERSIONED_TEST) + + // ###################################################################### + #undef CEREAL_MAKE_HAS_NON_MEMBER_SAVE_TEST + + // ###################################################################### + // Minimal Utilities + namespace detail + { + // Determines if the provided type is an std::string + template struct is_string : std::false_type {}; + + template + struct is_string> : std::true_type {}; + } + + // Determines if the type is valid for use with a minimal serialize function + template + struct is_minimal_type : std::integral_constant::value || std::is_arithmetic::value> {}; + + // ###################################################################### + //! Creates implementation details for whether a member save_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #ifdef CEREAL_OLDER_GCC + #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##test_name##_impl \ + { \ + template struct test : no {}; \ + template \ + struct test(), \ + std::declval() versioned ) ) >::type> : yes {}; \ + \ + static const bool value = test(); \ + \ + template struct test2 : no {}; \ + template \ + struct test2(), \ + std::declval::type&>() versioned ) ) >::type> : yes {}; \ + static const bool not_const_type = test2(); \ + \ + static const bool valid = value || !not_const_type; \ + }; \ + } /* end namespace detail */ + #else /* NOT CEREAL_OLDER_GCC =================================== */ + #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_save_minimal( \ + std::declval(), \ + std::declval() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + \ + template \ + static auto test2(int) -> decltype( cereal::access::member_save_minimal_non_const( \ + std::declval(), \ + std::declval::type&>() versioned ), yes()); \ + template static no test2(...); \ + static const bool not_const_type = std::is_same(0)), yes>::value; \ + \ + static const bool valid = value || !not_const_type; \ + }; \ + } /* end namespace detail */ + #endif // NOT CEREAL_OLDER_GCC + + // ###################################################################### + //! Creates helpers for minimal save functions + /*! The get_member_*_type structs allow access to the return type of a save_minimal, + assuming that the function actually exists. If the function does not + exist, the type will be void. + + @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct get_member_##test_name##_type { using type = void; }; \ + \ + template \ + struct get_member_##test_name##_type \ + { \ + using type = decltype( cereal::access::member_save_minimal( std::declval(), \ + std::declval() versioned ) ); \ + }; \ + } /* end namespace detail */ + + // ###################################################################### + //! Creates a test for whether a member save_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal) */ + #define CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(test_name) \ + template \ + struct has_member_##test_name : std::integral_constant::value> \ + { \ + using check = typename detail::has_member_##test_name##_impl; \ + static_assert( check::valid, \ + "cereal detected a non-const member " #test_name ". \n " \ + #test_name " member functions must always be const" ); \ + \ + using type = typename detail::get_member_##test_name##_type::type; \ + static_assert( (check::value && is_minimal_type::value) || !check::value, \ + "cereal detected a member " #test_name " with an invalid return type. \n " \ + "return type must be arithmetic or string" ); \ + }; + + // ###################################################################### + // Member Save Minimal + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(save_minimal, ) + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(save_minimal, ) + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(save_minimal) + + // ###################################################################### + // Member Save Minimal (versioned) + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST) + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST) + CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST(versioned_save_minimal) + + // ###################################################################### + #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_IMPL + #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_HELPERS_IMPL + #undef CEREAL_MAKE_HAS_MEMBER_SAVE_MINIMAL_TEST + + // ###################################################################### + //! Creates a test for whether a non-member save_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param test_name The name to give the test (e.g. save_minimal or versioned_save_minimal) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #define CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_non_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME( \ + std::declval(), \ + std::declval() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + \ + template \ + static auto test2(int) -> decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME( \ + std::declval(), \ + std::declval::type&>() versioned ), yes()); \ + template static no test2(...); \ + static const bool not_const_type = std::is_same(0)), yes>::value; \ + \ + static const bool valid = value || !not_const_type; \ + }; \ + \ + template \ + struct get_non_member_##test_name##_type { using type = void; }; \ + \ + template \ + struct get_non_member_##test_name##_type \ + { \ + using type = decltype( CEREAL_SAVE_MINIMAL_FUNCTION_NAME( std::declval(), \ + std::declval() versioned ) ); \ + }; \ + } /* end namespace detail */ \ + \ + template \ + struct has_non_member_##test_name : std::integral_constant::value> \ + { \ + using check = typename detail::has_non_member_##test_name##_impl; \ + static_assert( check::valid, \ + "cereal detected a non-const type parameter in non-member " #test_name ". \n " \ + #test_name " non-member functions must always pass their types as const" ); \ + \ + using type = typename detail::get_non_member_##test_name##_type::type; \ + static_assert( (check::value && is_minimal_type::value) || !check::value, \ + "cereal detected a non-member " #test_name " with an invalid return type. \n " \ + "return type must be arithmetic or string" ); \ + }; + + // ###################################################################### + // Non-Member Save Minimal + CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(save_minimal, ) + + // ###################################################################### + // Non-Member Save Minimal (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST(versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST) + + // ###################################################################### + #undef CEREAL_MAKE_HAS_NON_MEMBER_SAVE_MINIMAL_TEST + + // ###################################################################### + // Load Minimal Utilities + namespace detail + { + //! Used to help strip away conversion wrappers + /*! If someone writes a non-member load/save minimal function that accepts its + parameter as some generic template type and needs to perform trait checks + on that type, our NoConvert wrappers will interfere with this. Using + the struct strip_minmal, users can strip away our wrappers to get to + the underlying type, allowing traits to work properly */ + struct NoConvertBase {}; + + //! A struct that prevents implicit conversion + /*! Any type instantiated with this struct will be unable to implicitly convert + to another type. Is designed to only allow conversion to Source const &. + + @tparam Source the type of the original source */ + template + struct NoConvertConstRef : NoConvertBase + { + using type = Source; //!< Used to get underlying type easily + + template ::value>::type> + operator Dest () = delete; + + //! only allow conversion if the types are the same and we are converting into a const reference + template ::value>::type> + operator Dest const & (); + }; + + //! A struct that prevents implicit conversion + /*! Any type instantiated with this struct will be unable to implicitly convert + to another type. Is designed to only allow conversion to Source &. + + @tparam Source the type of the original source */ + template + struct NoConvertRef : NoConvertBase + { + using type = Source; //!< Used to get underlying type easily + + template ::value>::type> + operator Dest () = delete; + + #ifdef __clang__ + template ::value>::type> + operator Dest const & () = delete; + #endif // __clang__ + + //! only allow conversion if the types are the same and we are converting into a const reference + template ::value>::type> + operator Dest & (); + }; + + //! A type that can implicitly convert to anything else + struct AnyConvert + { + template + operator Dest & (); + + template + operator Dest const & () const; + }; + } // namespace detail + + // ###################################################################### + //! Creates a test for whether a member load_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + Our strategy here is to first check if a function matching the signature more or less exists + (allow anything like load_minimal(xxx) using AnyConvert, and then secondly enforce + that it has the correct signature using NoConvertConstRef + + @param test_name The name to give the test (e.g. load_minimal or versioned_load_minimal) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #ifdef CEREAL_OLDER_GCC + #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template struct has_member_##test_name##_impl : no {}; \ + template \ + struct has_member_##test_name##_impl(), \ + std::declval(), AnyConvert() versioned ) ) >::type> : yes {}; \ + \ + template struct has_member_##test_name##_type_impl : no {}; \ + template \ + struct has_member_##test_name##_type_impl(), \ + std::declval(), NoConvertConstRef() versioned ) ) >::type> : yes {}; \ + } /* end namespace detail */ + #else /* NOT CEREAL_OLDER_GCC =================================== */ + #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_load_minimal( \ + std::declval(), \ + std::declval(), AnyConvert() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + }; \ + template \ + struct has_member_##test_name##_type_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_load_minimal( \ + std::declval(), \ + std::declval(), NoConvertConstRef() versioned ), yes()); \ + template static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + \ + }; \ + } /* end namespace detail */ + #endif // NOT CEREAL_OLDER_GCC + + // ###################################################################### + //! Creates helpers for minimal load functions + /*! The has_member_*_wrapper structs ensure that the load and save types for the + requested function type match appropriately. + + @param load_test_name The name to give the test (e.g. load_minimal or versioned_load_minimal) + @param save_test_name The name to give the test (e.g. save_minimal or versioned_save_minimal, + should match the load name. + @param save_test_prefix The name to give the test (e.g. save_minimal or versioned_save_minimal, + should match the load name, without the trailing "_minimal" (e.g. + save or versioned_save). Needed because the preprocessor is an abomination. + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(load_test_name, save_test_name, save_test_prefix, versioned) \ + namespace detail \ + { \ + template \ + struct has_member_##load_test_name##_wrapper : std::false_type {}; \ + \ + template \ + struct has_member_##load_test_name##_wrapper \ + { \ + using AOut = typename detail::get_output_from_input::type; \ + \ + static_assert( has_member_##save_test_prefix##_minimal::value, \ + "cereal detected member " #load_test_name " but no valid member " #save_test_name ". \n " \ + "cannot evaluate correctness of " #load_test_name " without valid " #save_test_name "." ); \ + \ + using SaveType = typename detail::get_member_##save_test_prefix##_minimal_type::type; \ + const static bool value = has_member_##load_test_name##_impl::value; \ + const static bool valid = has_member_##load_test_name##_type_impl::value; \ + \ + static_assert( valid || !value, "cereal detected different or invalid types in corresponding member " \ + #load_test_name " and " #save_test_name " functions. \n " \ + "the paramater to " #load_test_name " must be a constant reference to the type that " \ + #save_test_name " returns." ); \ + }; \ + } /* end namespace detail */ + + // ###################################################################### + //! Creates a test for whether a member load_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + @param load_test_name The name to give the test (e.g. load_minimal or versioned_load_minimal) + @param load_test_prefix The above parameter minus the trailing "_minimal" */ + #define CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(load_test_name, load_test_prefix) \ + template \ + struct has_member_##load_test_prefix##_minimal : std::integral_constant::value>::value> {}; + + // ###################################################################### + // Member Load Minimal + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(load_minimal, ) + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(load_minimal, save_minimal, save, ) + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(load_minimal, load) + + // ###################################################################### + // Member Load Minimal (versioned) + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL(versioned_load_minimal, CEREAL_MAKE_VERSIONED_TEST) + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL(versioned_load_minimal, versioned_save_minimal, versioned_save, CEREAL_MAKE_VERSIONED_TEST) + CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST(versioned_load_minimal, versioned_load) + + // ###################################################################### + #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_IMPL + #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_HELPERS_IMPL + #undef CEREAL_MAKE_HAS_MEMBER_LOAD_MINIMAL_TEST + + // ###################################################################### + // Non-Member Load Minimal + namespace detail + { + #ifdef CEREAL_OLDER_GCC + void CEREAL_LOAD_MINIMAL_FUNCTION_NAME(); // prevents nonsense complaining about not finding this + void CEREAL_SAVE_MINIMAL_FUNCTION_NAME(); + #endif // CEREAL_OLDER_GCC + } // namespace detail + + // ###################################################################### + //! Creates a test for whether a non-member load_minimal function exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper member function for the given archive. + + See notes from member load_minimal implementation. + + Note that there should be an additional const check on load_minimal after the valid check, + but this currently interferes with many valid uses of minimal serialization. It has been + removed (see #565 on github) and previously was: + + @code + static_assert( check::const_valid || !check::exists, + "cereal detected an invalid serialization type parameter in non-member " #test_name ". " + #test_name " non-member functions must accept their serialization type by non-const reference" ); + @endcode + + See #132, #436, #263, and #565 on https://github.com/USCiLab/cereal for more details. + + @param test_name The name to give the test (e.g. load_minimal or versioned_load_minimal) + @param save_name The corresponding name the save test would have (e.g. save_minimal or versioned_save_minimal) + @param versioned Either blank or the macro CEREAL_MAKE_VERSIONED_TEST */ + #define CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(test_name, save_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_non_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME( \ + std::declval(), std::declval(), AnyConvert() versioned ), yes() ); \ + template static no test( ... ); \ + static const bool exists = std::is_same( 0 ) ), yes>::value; \ + \ + template \ + static auto test2(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME( \ + std::declval(), std::declval(), NoConvertConstRef() versioned ), yes() ); \ + template static no test2( ... ); \ + static const bool valid = std::is_same( 0 ) ), yes>::value; \ + \ + template \ + static auto test3(int) -> decltype( CEREAL_LOAD_MINIMAL_FUNCTION_NAME( \ + std::declval(), NoConvertRef(), AnyConvert() versioned ), yes() ); \ + template static no test3( ... ); \ + static const bool const_valid = std::is_same( 0 ) ), yes>::value; \ + }; \ + \ + template \ + struct has_non_member_##test_name##_wrapper : std::false_type {}; \ + \ + template \ + struct has_non_member_##test_name##_wrapper \ + { \ + using AOut = typename detail::get_output_from_input::type; \ + \ + static_assert( detail::has_non_member_##save_name##_impl::valid, \ + "cereal detected non-member " #test_name " but no valid non-member " #save_name ". \n " \ + "cannot evaluate correctness of " #test_name " without valid " #save_name "." ); \ + \ + using SaveType = typename detail::get_non_member_##save_name##_type::type; \ + using check = has_non_member_##test_name##_impl; \ + static const bool value = check::exists; \ + \ + static_assert( check::valid || !check::exists, "cereal detected different types in corresponding non-member " \ + #test_name " and " #save_name " functions. \n " \ + "the paramater to " #test_name " must be a constant reference to the type that " #save_name " returns." ); \ + }; \ + } /* namespace detail */ \ + \ + template \ + struct has_non_member_##test_name : std::integral_constant::exists>::value> {}; + + // ###################################################################### + // Non-Member Load Minimal + CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(load_minimal, save_minimal, ) + + // ###################################################################### + // Non-Member Load Minimal (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST(versioned_load_minimal, versioned_save_minimal, CEREAL_MAKE_VERSIONED_TEST) + + // ###################################################################### + #undef CEREAL_MAKE_HAS_NON_MEMBER_LOAD_MINIMAL_TEST + + // ###################################################################### + namespace detail + { + // const stripped away before reaching here, prevents errors on conversion from + // construct to construct + template + struct has_member_load_and_construct_impl : std::integral_constant( std::declval(), std::declval< ::cereal::construct&>() ) ), void>::value> + { }; + + template + struct has_member_versioned_load_and_construct_impl : std::integral_constant( std::declval(), std::declval< ::cereal::construct&>(), 0 ) ), void>::value> + { }; + } // namespace detail + + //! Member load and construct check + template + struct has_member_load_and_construct : detail::has_member_load_and_construct_impl::type, A> + { }; + + //! Member load and construct check (versioned) + template + struct has_member_versioned_load_and_construct : detail::has_member_versioned_load_and_construct_impl::type, A> + { }; + + // ###################################################################### + //! Creates a test for whether a non-member load_and_construct specialization exists + /*! This creates a class derived from std::integral_constant that will be true if + the type has the proper non-member function for the given archive. */ + #define CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(test_name, versioned) \ + namespace detail \ + { \ + template \ + struct has_non_member_##test_name##_impl \ + { \ + template \ + static auto test(int) -> decltype( LoadAndConstruct::load_and_construct( \ + std::declval(), std::declval< ::cereal::construct&>() versioned ), yes()); \ + template \ + static no test( ... ); \ + static const bool value = std::is_same( 0 ) ), yes>::value; \ + }; \ + } /* end namespace detail */ \ + template \ + struct has_non_member_##test_name : \ + std::integral_constant::type, A>::value> {}; + + // ###################################################################### + //! Non member load and construct check + CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(load_and_construct, ) + + // ###################################################################### + //! Non member load and construct check (versioned) + CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST(versioned_load_and_construct, CEREAL_MAKE_VERSIONED_TEST) + + // ###################################################################### + //! Has either a member or non member load and construct + template + struct has_load_and_construct : std::integral_constant::value || has_non_member_load_and_construct::value || + has_member_versioned_load_and_construct::value || has_non_member_versioned_load_and_construct::value> + { }; + + // ###################################################################### + #undef CEREAL_MAKE_HAS_NON_MEMBER_LOAD_AND_CONSTRUCT_TEST + + // ###################################################################### + // End of serialization existence tests + #undef CEREAL_MAKE_VERSIONED_TEST + + // ###################################################################### + template + struct has_member_split : std::integral_constant::value && has_member_save::value) || + (has_member_versioned_load::value && has_member_versioned_save::value)> {}; + + // ###################################################################### + template + struct has_non_member_split : std::integral_constant::value && has_non_member_save::value) || + (has_non_member_versioned_load::value && has_non_member_versioned_save::value)> {}; + + // ###################################################################### + template + struct has_invalid_output_versioning : std::integral_constant::value && has_member_save::value) || + (has_non_member_versioned_save::value && has_non_member_save::value) || + (has_member_versioned_serialize::value && has_member_serialize::value) || + (has_non_member_versioned_serialize::value && has_non_member_serialize::value) || + (has_member_versioned_save_minimal::value && has_member_save_minimal::value) || + (has_non_member_versioned_save_minimal::value && has_non_member_save_minimal::value)> {}; + + // ###################################################################### + template + struct has_invalid_input_versioning : std::integral_constant::value && has_member_load::value) || + (has_non_member_versioned_load::value && has_non_member_load::value) || + (has_member_versioned_serialize::value && has_member_serialize::value) || + (has_non_member_versioned_serialize::value && has_non_member_serialize::value) || + (has_member_versioned_load_minimal::value && has_member_load_minimal::value) || + (has_non_member_versioned_load_minimal::value && has_non_member_load_minimal::value)> {}; + + // ###################################################################### + namespace detail + { + //! Create a test for a cereal::specialization entry + #define CEREAL_MAKE_IS_SPECIALIZED_IMPL(name) \ + template \ + struct is_specialized_##name : std::integral_constant>::value> {} + + CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_serialize); + CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_load_save); + CEREAL_MAKE_IS_SPECIALIZED_IMPL(member_load_save_minimal); + CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_serialize); + CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_load_save); + CEREAL_MAKE_IS_SPECIALIZED_IMPL(non_member_load_save_minimal); + + #undef CEREAL_MAKE_IS_SPECIALIZED_IMPL + + //! Number of specializations detected + template + struct count_specializations : std::integral_constant::value + + is_specialized_member_load_save::value + + is_specialized_member_load_save_minimal::value + + is_specialized_non_member_serialize::value + + is_specialized_non_member_load_save::value + + is_specialized_non_member_load_save_minimal::value> {}; + } // namespace detail + + //! Check if any specialization exists for a type + template + struct is_specialized : std::integral_constant::value || + detail::is_specialized_member_load_save::value || + detail::is_specialized_member_load_save_minimal::value || + detail::is_specialized_non_member_serialize::value || + detail::is_specialized_non_member_load_save::value || + detail::is_specialized_non_member_load_save_minimal::value> + { + static_assert(detail::count_specializations::value <= 1, "More than one explicit specialization detected for type."); + }; + + //! Create the static assertion for some specialization + /*! This assertion will fail if the type is indeed specialized and does not have the appropriate + type of serialization functions */ + #define CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, print_name, spec_name) \ + static_assert( (is_specialized::value && detail::is_specialized_##spec_name::value && \ + (has_##name::value || has_##versioned_name::value)) \ + || !(is_specialized::value && detail::is_specialized_##spec_name::value), \ + "cereal detected " #print_name " specialization but no " #print_name " serialize function" ) + + //! Generates a test for specialization for versioned and unversioned functions + /*! This creates checks that can be queried to see if a given type of serialization function + has been specialized for this type */ + #define CEREAL_MAKE_IS_SPECIALIZED(name, versioned_name, spec_name) \ + template \ + struct is_specialized_##name : std::integral_constant::value && detail::is_specialized_##spec_name::value> \ + { CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, name, spec_name); }; \ + template \ + struct is_specialized_##versioned_name : std::integral_constant::value && detail::is_specialized_##spec_name::value> \ + { CEREAL_MAKE_IS_SPECIALIZED_ASSERT(name, versioned_name, versioned_name, spec_name); } + + CEREAL_MAKE_IS_SPECIALIZED(member_serialize, member_versioned_serialize, member_serialize); + CEREAL_MAKE_IS_SPECIALIZED(non_member_serialize, non_member_versioned_serialize, non_member_serialize); + + CEREAL_MAKE_IS_SPECIALIZED(member_save, member_versioned_save, member_load_save); + CEREAL_MAKE_IS_SPECIALIZED(non_member_save, non_member_versioned_save, non_member_load_save); + CEREAL_MAKE_IS_SPECIALIZED(member_load, member_versioned_load, member_load_save); + CEREAL_MAKE_IS_SPECIALIZED(non_member_load, non_member_versioned_load, non_member_load_save); + + CEREAL_MAKE_IS_SPECIALIZED(member_save_minimal, member_versioned_save_minimal, member_load_save_minimal); + CEREAL_MAKE_IS_SPECIALIZED(non_member_save_minimal, non_member_versioned_save_minimal, non_member_load_save_minimal); + CEREAL_MAKE_IS_SPECIALIZED(member_load_minimal, member_versioned_load_minimal, member_load_save_minimal); + CEREAL_MAKE_IS_SPECIALIZED(non_member_load_minimal, non_member_versioned_load_minimal, non_member_load_save_minimal); + + #undef CEREAL_MAKE_IS_SPECIALIZED_ASSERT + #undef CEREAL_MAKE_IS_SPECIALIZED + + // ###################################################################### + // detects if a type has any active minimal output serialization + template + struct has_minimal_output_serialization : std::integral_constant::value || + ((has_member_save_minimal::value || + has_non_member_save_minimal::value || + has_member_versioned_save_minimal::value || + has_non_member_versioned_save_minimal::value) && + !(is_specialized_member_serialize::value || + is_specialized_member_save::value))> {}; + + // ###################################################################### + // detects if a type has any active minimal input serialization + template + struct has_minimal_input_serialization : std::integral_constant::value || + ((has_member_load_minimal::value || + has_non_member_load_minimal::value || + has_member_versioned_load_minimal::value || + has_non_member_versioned_load_minimal::value) && + !(is_specialized_member_serialize::value || + is_specialized_member_load::value))> {}; + + // ###################################################################### + namespace detail + { + //! The number of output serialization functions available + /*! If specialization is being used, we'll count only those; otherwise we'll count everything */ + template + struct count_output_serializers : std::integral_constant::value ? count_specializations::value : + has_member_save::value + + has_non_member_save::value + + has_member_serialize::value + + has_non_member_serialize::value + + has_member_save_minimal::value + + has_non_member_save_minimal::value + + /*-versioned---------------------------------------------------------*/ + has_member_versioned_save::value + + has_non_member_versioned_save::value + + has_member_versioned_serialize::value + + has_non_member_versioned_serialize::value + + has_member_versioned_save_minimal::value + + has_non_member_versioned_save_minimal::value> {}; + } + + template + struct is_output_serializable : std::integral_constant::value == 1> {}; + + // ###################################################################### + namespace detail + { + //! The number of input serialization functions available + /*! If specialization is being used, we'll count only those; otherwise we'll count everything */ + template + struct count_input_serializers : std::integral_constant::value ? count_specializations::value : + has_member_load::value + + has_non_member_load::value + + has_member_serialize::value + + has_non_member_serialize::value + + has_member_load_minimal::value + + has_non_member_load_minimal::value + + /*-versioned---------------------------------------------------------*/ + has_member_versioned_load::value + + has_non_member_versioned_load::value + + has_member_versioned_serialize::value + + has_non_member_versioned_serialize::value + + has_member_versioned_load_minimal::value + + has_non_member_versioned_load_minimal::value> {}; + } + + template + struct is_input_serializable : std::integral_constant::value == 1> {}; + + // ###################################################################### + // Base Class Support + namespace detail + { + struct base_class_id + { + template + base_class_id(T const * const t) : + type(typeid(T)), + ptr(t), + hash(std::hash()(typeid(T)) ^ (std::hash()(t) << 1)) + { } + + bool operator==(base_class_id const & other) const + { return (type == other.type) && (ptr == other.ptr); } + + std::type_index type; + void const * ptr; + size_t hash; + }; + struct base_class_id_hash { size_t operator()(base_class_id const & id) const { return id.hash; } }; + } // namespace detail + + namespace detail + { + //! Common base type for base class casting + struct BaseCastBase {}; + + template + struct get_base_class; + + template class Cast, class Base> + struct get_base_class> + { + using type = Base; + }; + + //! Base class cast, behave as the test + template class Test, class Archive, + bool IsBaseCast = std::is_base_of::value> + struct has_minimal_base_class_serialization_impl : Test::type, Archive> + { }; + + //! Not a base class cast + template class Test, class Archive> + struct has_minimal_base_class_serialization_impl : std::false_type + { }; + } + + //! Checks to see if the base class used in a cast has a minimal serialization + /*! @tparam Cast Either base_class or virtual_base_class wrapped type + @tparam Test A has_minimal test (for either input or output) + @tparam Archive The archive to use with the test */ + template class Test, class Archive> + struct has_minimal_base_class_serialization : detail::has_minimal_base_class_serialization_impl + { }; + + + // ###################################################################### + namespace detail + { + struct shared_from_this_wrapper + { + template + static auto (check)( U const & t ) -> decltype( ::cereal::access::shared_from_this(t), std::true_type() ); + + static auto (check)( ... ) -> decltype( std::false_type() ); + + template + static auto get( U const & t ) -> decltype( t.shared_from_this() ); + }; + } + + //! Determine if T or any base class of T has inherited from std::enable_shared_from_this + template + struct has_shared_from_this : decltype((detail::shared_from_this_wrapper::check)(std::declval())) + { }; + + //! Get the type of the base class of T which inherited from std::enable_shared_from_this + template + struct get_shared_from_this_base + { + private: + using PtrType = decltype(detail::shared_from_this_wrapper::get(std::declval())); + public: + //! The type of the base of T that inherited from std::enable_shared_from_this + using type = typename std::decay::type; + }; + + // ###################################################################### + //! Extracts the true type from something possibly wrapped in a cereal NoConvert + /*! Internally cereal uses some wrapper classes to test the validity of non-member + minimal load and save functions. This can interfere with user type traits on + templated load and save minimal functions. To get to the correct underlying type, + users should use strip_minimal when performing any enable_if type type trait checks. + + See the enum serialization in types/common.hpp for an example of using this */ + template ::value> + struct strip_minimal + { + using type = T; + }; + + //! Specialization for types wrapped in a NoConvert + template + struct strip_minimal + { + using type = typename T::type; + }; + + // ###################################################################### + //! Determines whether the class T can be default constructed by cereal::access + template + struct is_default_constructible + { + #ifdef CEREAL_OLDER_GCC + template + struct test : no {}; + template + struct test() ) >::type> : yes {}; + static const bool value = test(); + #else // NOT CEREAL_OLDER_GCC ========================================= + template + static auto test(int) -> decltype( cereal::access::construct(), yes()); + template + static no test(...); + static const bool value = std::is_same(0)), yes>::value; + #endif // NOT CEREAL_OLDER_GCC + }; + + // ###################################################################### + namespace detail + { + //! Removes all qualifiers and minimal wrappers from an archive + template + using decay_archive = typename std::decay::type>::type; + } + + //! Checks if the provided archive type is equal to some cereal archive type + /*! This automatically does things such as std::decay and removing any other wrappers that may be + on the Archive template parameter. + + Example use: + @code{cpp} + // example use to disable a serialization function + template ::value> = sfinae> + void save( Archive & ar, MyType const & mt ); + @endcode */ + template + struct is_same_archive : std::integral_constant, CerealArchiveT>::value> + { }; + + // ###################################################################### + //! A macro to use to restrict which types of archives your function will work for. + /*! This requires you to have a template class parameter named Archive and replaces the void return + type for your function. + + INTYPE refers to the input archive type you wish to restrict on. + OUTTYPE refers to the output archive type you wish to restrict on. + + For example, if we want to limit a serialize to only work with binary serialization: + + @code{.cpp} + template + CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) + serialize( Archive & ar, MyCoolType & m ) + { + ar & m; + } + @endcode + + If you need to do more restrictions in your enable_if, you will need to do this by hand. + */ + #define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE) \ + typename std::enable_if::value || cereal::traits::is_same_archive::value, void>::type + + //! Type traits only struct used to mark an archive as human readable (text based) + /*! Archives that wish to identify as text based/human readable should inherit from + this struct */ + struct TextArchive {}; + + //! Checks if an archive is a text archive (human readable) + template + struct is_text_archive : std::integral_constant>::value> + { }; + } // namespace traits + + // ###################################################################### + namespace detail + { + template ::value, + bool MemberVersioned = traits::has_member_versioned_load_and_construct::value, + bool NonMember = traits::has_non_member_load_and_construct::value, + bool NonMemberVersioned = traits::has_non_member_versioned_load_and_construct::value> + struct Construct + { + static_assert( cereal::traits::detail::delay_static_assert::value, + "cereal found more than one compatible load_and_construct function for the provided type and archive combination. \n\n " + "Types must either have a member load_and_construct function or a non-member specialization of LoadAndConstruct (you may not mix these). \n " + "In addition, you may not mix versioned with non-versioned load_and_construct functions. \n\n " ); + static T * load_andor_construct( A & /*ar*/, construct & /*construct*/ ) + { return nullptr; } + }; + + // no load and construct case + template + struct Construct + { + static_assert( ::cereal::traits::is_default_constructible::value, + "Trying to serialize a an object with no default constructor. \n\n " + "Types must either be default constructible or define either a member or non member Construct function. \n " + "Construct functions generally have the signature: \n\n " + "template \n " + "static void load_and_construct(Archive & ar, cereal::construct & construct) \n " + "{ \n " + " var a; \n " + " ar( a ) \n " + " construct( a ); \n " + "} \n\n" ); + static T * load_andor_construct() + { return ::cereal::access::construct(); } + }; + + // member non-versioned + template + struct Construct + { + static void load_andor_construct( A & ar, construct & construct ) + { + access::load_and_construct( ar, construct ); + } + }; + + // member versioned + template + struct Construct + { + static void load_andor_construct( A & ar, construct & construct ) + { + const auto version = ar.template loadClassVersion(); + access::load_and_construct( ar, construct, version ); + } + }; + + // non-member non-versioned + template + struct Construct + { + static void load_andor_construct( A & ar, construct & construct ) + { + LoadAndConstruct::load_and_construct( ar, construct ); + } + }; + + // non-member versioned + template + struct Construct + { + static void load_andor_construct( A & ar, construct & construct ) + { + const auto version = ar.template loadClassVersion(); + LoadAndConstruct::load_and_construct( ar, construct, version ); + } + }; + } // namespace detail +} // namespace cereal + +#endif // CEREAL_DETAILS_TRAITS_HPP_ diff --git a/external/cereal/details/util.hpp b/external/cereal/details/util.hpp new file mode 100644 index 0000000..e4aebe9 --- /dev/null +++ b/external/cereal/details/util.hpp @@ -0,0 +1,84 @@ +/*! \file util.hpp + \brief Internal misc utilities + \ingroup Internal */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_DETAILS_UTIL_HPP_ +#define CEREAL_DETAILS_UTIL_HPP_ + +#include +#include + +#ifdef _MSC_VER +namespace cereal +{ + namespace util + { + //! Demangles the type encoded in a string + /*! @internal */ + inline std::string demangle( std::string const & name ) + { return name; } + + //! Gets the demangled name of a type + /*! @internal */ + template inline + std::string demangledName() + { return typeid( T ).name(); } + } // namespace util +} // namespace cereal +#else // clang or gcc +#include +#include +namespace cereal +{ + namespace util + { + //! Demangles the type encoded in a string + /*! @internal */ + inline std::string demangle(std::string mangledName) + { + int status = 0; + char *demangledName = nullptr; + std::size_t len; + + demangledName = abi::__cxa_demangle(mangledName.c_str(), 0, &len, &status); + + std::string retName(demangledName); + free(demangledName); + + return retName; + } + + //! Gets the demangled name of a type + /*! @internal */ + template inline + std::string demangledName() + { return demangle(typeid(T).name()); } + } +} // namespace cereal +#endif // clang or gcc branch of _MSC_VER +#endif // CEREAL_DETAILS_UTIL_HPP_ diff --git a/external/cereal/external/LICENSE b/external/cereal/external/LICENSE new file mode 100644 index 0000000..66300b6 --- /dev/null +++ b/external/cereal/external/LICENSE @@ -0,0 +1,21 @@ +Copyright (C) 2004-2008 René Nyffenegger + +This source code is provided 'as-is', without any express or implied +warranty. In no event will the author be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + +3. This notice may not be removed or altered from any source distribution. + +René Nyffenegger rene.nyffenegger@adp-gmbh.ch diff --git a/external/cereal/external/base64.hpp b/external/cereal/external/base64.hpp new file mode 100644 index 0000000..ce32324 --- /dev/null +++ b/external/cereal/external/base64.hpp @@ -0,0 +1,134 @@ +/* + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch +*/ + +#ifndef CEREAL_EXTERNAL_BASE64_HPP_ +#define CEREAL_EXTERNAL_BASE64_HPP_ + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + +#include + +namespace cereal +{ + namespace base64 + { + static const std::string chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); + } + + inline std::string encode(unsigned char const* bytes_to_encode, size_t in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = static_cast((char_array_3[0] & 0xfc) >> 2); + char_array_4[1] = static_cast( ( ( char_array_3[0] & 0x03 ) << 4 ) + ( ( char_array_3[1] & 0xf0 ) >> 4 ) ); + char_array_4[2] = static_cast( ( ( char_array_3[1] & 0x0f ) << 2 ) + ( ( char_array_3[2] & 0xc0 ) >> 6 ) ); + char_array_4[3] = static_cast( char_array_3[2] & 0x3f ); + + for(i = 0; (i <4) ; i++) + ret += chars[char_array_4[i]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + } + + return ret; + } + + inline std::string decode(std::string const& encoded_string) { + size_t in_len = encoded_string.size(); + size_t i = 0; + size_t j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = static_cast(chars.find( char_array_4[i] )); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = static_cast(chars.find( char_array_4[j] )); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; + } + } // namespace base64 +} // namespace cereal +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#endif // CEREAL_EXTERNAL_BASE64_HPP_ diff --git a/external/cereal/external/rapidjson/LICENSE b/external/cereal/external/rapidjson/LICENSE new file mode 100644 index 0000000..4546f15 --- /dev/null +++ b/external/cereal/external/rapidjson/LICENSE @@ -0,0 +1,13 @@ +Tencent is pleased to support the open source community by making RapidJSON available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. + +Licensed under the MIT License (the "License"); you may not use this file except +in compliance with the License. You may obtain a copy of the License at + +http://opensource.org/licenses/MIT + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. diff --git a/external/cereal/external/rapidjson/allocators.h b/external/cereal/external/rapidjson/allocators.h new file mode 100644 index 0000000..d375e28 --- /dev/null +++ b/external/cereal/external/rapidjson/allocators.h @@ -0,0 +1,284 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ALLOCATORS_H_ +#define CEREAL_RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + + +/*! \def CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief User-defined kDefaultChunkCapacity definition. + + User can define this as any \c size that is a power of 2. +*/ + +#ifndef CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY +#define CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + CEREAL_RAPIDJSON_ASSERT(buffer != 0); + CEREAL_RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + CEREAL_RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = CEREAL_RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = CEREAL_RAPIDJSON_ALIGN(originalSize); + newSize = CEREAL_RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = CEREAL_RAPIDJSON_NEW(BaseAllocator)(); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(CEREAL_RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = CEREAL_RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_ENCODINGS_H_ diff --git a/external/cereal/external/rapidjson/cursorstreamwrapper.h b/external/cereal/external/rapidjson/cursorstreamwrapper.h new file mode 100644 index 0000000..f3d20f7 --- /dev/null +++ b/external/cereal/external/rapidjson/cursorstreamwrapper.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_ +#define CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_ + +#include "stream.h" + +#if defined(__GNUC__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4702) // unreachable code +CEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + + +//! Cursor stream wrapper for counting line and column number if error exists. +/*! + \tparam InputStream Any stream that implements Stream Concept +*/ +template > +class CursorStreamWrapper : public GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + + CursorStreamWrapper(InputStream& is): + GenericStreamWrapper(is), line_(1), col_(0) {} + + // counting line and column number + Ch Take() { + Ch ch = this->is_.Take(); + if(ch == '\n') { + line_ ++; + col_ = 0; + } else { + col_ ++; + } + return ch; + } + + //! Get the error line number, if error exists. + size_t GetLine() const { return line_; } + //! Get the error column number, if error exists. + size_t GetColumn() const { return col_; } + +private: + size_t line_; //!< Current Line + size_t col_; //!< Current Column +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#if defined(__GNUC__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/external/cereal/external/rapidjson/document.h b/external/cereal/external/rapidjson/document.h new file mode 100644 index 0000000..91c4be8 --- /dev/null +++ b/external/cereal/external/rapidjson/document.h @@ -0,0 +1,2659 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_DOCUMENT_H_ +#define CEREAL_RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include +#ifdef __cpp_lib_three_way_comparison +#include +#endif + +CEREAL_RAPIDJSON_DIAG_PUSH +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_OFF(padded) +CEREAL_RAPIDJSON_DIAG_OFF(switch-enum) +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +CEREAL_RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif // __GNUC__ + +#ifndef CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::random_access_iterator_tag +#endif + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. + + // swap() for std::sort() and other potential use in STL. + friend inline void swap(GenericMember& a, GenericMember& b) CEREAL_RAPIDJSON_NOEXCEPT { + a.name.Swap(b.name); + a.value.Swap(b.value); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + /** \name std::iterator_traits support */ + //@{ + typedef ValueType value_type; + typedef ValueType * pointer; + typedef ValueType & reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + //@} + + //! Pointer to (const) GenericMember + typedef pointer Pointer; + //! Reference to (const) GenericMember + typedef reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + template bool operator==(const GenericMemberIterator& that) const { return ptr_ == that.ptr_; } + template bool operator!=(const GenericMemberIterator& that) const { return ptr_ != that.ptr_; } + template bool operator<=(const GenericMemberIterator& that) const { return ptr_ <= that.ptr_; } + template bool operator>=(const GenericMemberIterator& that) const { return ptr_ >= that.ptr_; } + template bool operator< (const GenericMemberIterator& that) const { return ptr_ < that.ptr_; } + template bool operator> (const GenericMemberIterator& that) const { return ptr_ > that.ptr_; } + +#ifdef __cpp_lib_three_way_comparison + template std::strong_ordering operator<=>(const GenericMemberIterator& that) const { return ptr_ <=> that.ptr_; } +#endif + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +class GenericMemberIterator; + +//! non-const GenericMemberIterator +template +class GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +class GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // CEREAL_RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) CEREAL_RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(NotNullStrLen(str)) {} + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(CEREAL_RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { CEREAL_RAPIDJSON_ASSERT(str != 0 || len == 0u); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + SizeType NotNullStrLen(const CharType* str) { + CEREAL_RAPIDJSON_ASSERT(str != 0); + return internal::StrLen(str); + } + + /// Empty string - used when passing in a NULL pointer + static const Ch emptyString[]; + + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; + //! Copy assignment operator not permitted - immutable type + GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; +}; + +template +const CharType GenericStringRef::emptyString[] = { CharType() }; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref CEREAL_RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +#ifdef _MSC_VER +CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static long Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned long Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; +#endif + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) CEREAL_RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) CEREAL_RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + \see CopyFrom() + */ + template + GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + switch (rhs.GetType()) { + case kObjectType: { + SizeType count = rhs.data_.o.size; + Member* lm = reinterpret_cast(allocator.Malloc(count * sizeof(Member))); + const typename GenericValue::Member* rm = rhs.GetMembersPointer(); + for (SizeType i = 0; i < count; i++) { + new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); + new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); + } + data_.f.flags = kObjectFlag; + data_.o.size = data_.o.capacity = count; + SetMembersPointer(lm); + } + break; + case kArrayType: { + SizeType count = rhs.data_.a.size; + GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); + const GenericValue* re = rhs.GetElementsPointer(); + for (SizeType i = 0; i < count; i++) + new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); + data_.f.flags = kArrayFlag; + data_.a.size = data_.a.capacity = count; + SetElementsPointer(le); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } + else + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } + } + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef CEREAL_RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, CEREAL_RAPIDJSON_ENABLEIF((internal::IsSame))) CEREAL_RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) CEREAL_RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + CEREAL_RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) CEREAL_RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) CEREAL_RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) CEREAL_RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) CEREAL_RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & CEREAL_RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for float value. + explicit GenericValue(float f) CEREAL_RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) CEREAL_RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) CEREAL_RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref CEREAL_RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) CEREAL_RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) CEREAL_RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) CEREAL_RAPIDJSON_NOEXCEPT { + if (CEREAL_RAPIDJSON_LIKELY(this != &rhs)) { + this->~GenericValue(); + RawAssign(rhs); + } + return *this; + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) CEREAL_RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) CEREAL_RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + CEREAL_RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator, copyConstStrings); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) CEREAL_RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() CEREAL_RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref CEREAL_RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast((std::numeric_limits::max)())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast((std::numeric_limits::min)())) + && (d < static_cast((std::numeric_limits::max)())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-(std::numeric_limits::max)()) + || a > static_cast((std::numeric_limits::max)())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { CEREAL_RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Get the capacity of object. + SizeType MemberCapacity() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + CEREAL_RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { CEREAL_RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { CEREAL_RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Request the object to have enough capacity to store members. + /*! \param newCapacity The capacity that the object at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + if (newCapacity > data_.o.capacity) { + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), data_.o.capacity * sizeof(Member), newCapacity * sizeof(Member)))); + data_.o.capacity = newCapacity; + } + return *this; + } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + CEREAL_RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + CEREAL_RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) + MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator); + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + CEREAL_RAPIDJSON_ASSERT(data_.o.size > 0); + CEREAL_RAPIDJSON_ASSERT(GetMembersPointer() != 0); + CEREAL_RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + CEREAL_RAPIDJSON_ASSERT(IsObject()); + CEREAL_RAPIDJSON_ASSERT(data_.o.size > 0); + CEREAL_RAPIDJSON_ASSERT(GetMembersPointer() != 0); + CEREAL_RAPIDJSON_ASSERT(first >= MemberBegin()); + CEREAL_RAPIDJSON_ASSERT(first <= last); + CEREAL_RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(static_cast(&*pos), &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { CEREAL_RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { CEREAL_RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + CEREAL_RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + CEREAL_RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + CEREAL_RAPIDJSON_ASSERT(IsArray()); + CEREAL_RAPIDJSON_ASSERT(data_.a.size > 0); + CEREAL_RAPIDJSON_ASSERT(GetElementsPointer() != 0); + CEREAL_RAPIDJSON_ASSERT(first >= Begin()); + CEREAL_RAPIDJSON_ASSERT(first <= last); + CEREAL_RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { CEREAL_RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { CEREAL_RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { CEREAL_RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + CEREAL_RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + CEREAL_RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { CEREAL_RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { CEREAL_RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string reference + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref CEREAL_RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + CEREAL_RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (CEREAL_RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (CEREAL_RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + CEREAL_RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif CEREAL_RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if CEREAL_RAPIDJSON_ENDIAN == CEREAL_RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION + + CEREAL_RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + CEREAL_RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return CEREAL_RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + CEREAL_RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + CEREAL_RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return CEREAL_RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + CEREAL_RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return CEREAL_RAPIDJSON_GETPOINTER(Member, data_.o.members); } + CEREAL_RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return CEREAL_RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(static_cast(m), members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) CEREAL_RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) CEREAL_RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + CEREAL_RAPIDJSON_ASSERT(IsString()); + CEREAL_RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) CEREAL_RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + // Allow Swap with ValueType. + // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. + using ValueType::Swap; + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + CEREAL_RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + CEREAL_RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + CEREAL_RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + CEREAL_RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // CEREAL_RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + CEREAL_RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + CEREAL_RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + SizeType MemberCapacity() const { return value_.MemberCapacity(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +CEREAL_RAPIDJSON_NAMESPACE_END +CEREAL_RAPIDJSON_DIAG_POP + +#endif // CEREAL_RAPIDJSON_DOCUMENT_H_ diff --git a/external/cereal/external/rapidjson/encodedstream.h b/external/cereal/external/rapidjson/encodedstream.h new file mode 100644 index 0000000..b04774b --- /dev/null +++ b/external/cereal/external/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ENCODEDSTREAM_H_ +#define CEREAL_RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define CEREAL_RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + CEREAL_RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + CEREAL_RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) CEREAL_RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef CEREAL_RAPIDJSON_ENCODINGS_FUNC + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_FILESTREAM_H_ diff --git a/external/cereal/external/rapidjson/encodings.h b/external/cereal/external/rapidjson/encodings.h new file mode 100644 index 0000000..a1c27ec --- /dev/null +++ b/external/cereal/external/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ENCODINGS_H_ +#define CEREAL_RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#if defined(_MSC_VER) && !defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +CEREAL_RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +CEREAL_RAPIDJSON_DIAG_OFF(overflow) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define CEREAL_RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define CEREAL_RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define CEREAL_RAPIDJSON_TAIL() CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFFu >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: CEREAL_RAPIDJSON_TAIL(); return result; + case 3: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 4: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x50); CEREAL_RAPIDJSON_TAIL(); return result; + case 5: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x10); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 6: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 10: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x20); CEREAL_RAPIDJSON_TAIL(); return result; + case 11: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x60); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef CEREAL_RAPIDJSON_COPY +#undef CEREAL_RAPIDJSON_TRANS +#undef CEREAL_RAPIDJSON_TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define CEREAL_RAPIDJSON_COPY() os.Put(c = is.Take()) +#define CEREAL_RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define CEREAL_RAPIDJSON_TAIL() CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x70) + Ch c; + CEREAL_RAPIDJSON_COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: CEREAL_RAPIDJSON_TAIL(); return result; + case 3: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 4: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x50); CEREAL_RAPIDJSON_TAIL(); return result; + case 5: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x10); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 6: CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + case 10: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x20); CEREAL_RAPIDJSON_TAIL(); return result; + case 11: CEREAL_RAPIDJSON_COPY(); CEREAL_RAPIDJSON_TRANS(0x60); CEREAL_RAPIDJSON_TAIL(); CEREAL_RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef CEREAL_RAPIDJSON_COPY +#undef CEREAL_RAPIDJSON_TRANS +#undef CEREAL_RAPIDJSON_TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + CEREAL_RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put(static_cast((v & 0x3FF) | 0xDC00)); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + CEREAL_RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + CEREAL_RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define CEREAL_RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + static CEREAL_RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { CEREAL_RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef CEREAL_RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_ENCODINGS_H_ diff --git a/external/cereal/external/rapidjson/error/en.h b/external/cereal/external/rapidjson/error/en.h new file mode 100644 index 0000000..ea93bf8 --- /dev/null +++ b/external/cereal/external/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ERROR_EN_H_ +#define CEREAL_RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(switch-enum) +CEREAL_RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup CEREAL_RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const CEREAL_RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return CEREAL_RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return CEREAL_RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return CEREAL_RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return CEREAL_RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return CEREAL_RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return CEREAL_RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return CEREAL_RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return CEREAL_RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return CEREAL_RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return CEREAL_RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return CEREAL_RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return CEREAL_RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return CEREAL_RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return CEREAL_RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return CEREAL_RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return CEREAL_RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return CEREAL_RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return CEREAL_RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return CEREAL_RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_ERROR_EN_H_ diff --git a/external/cereal/external/rapidjson/error/error.h b/external/cereal/external/rapidjson/error/error.h new file mode 100644 index 0000000..7e7cc24 --- /dev/null +++ b/external/cereal/external/rapidjson/error/error.h @@ -0,0 +1,161 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ERROR_ERROR_H_ +#define CEREAL_RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup CEREAL_RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup CEREAL_RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef CEREAL_RAPIDJSON_ERROR_CHARTYPE +#define CEREAL_RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref CEREAL_RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup CEREAL_RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef CEREAL_RAPIDJSON_ERROR_STRING +#define CEREAL_RAPIDJSON_ERROR_STRING(x) x +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup CEREAL_RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup CEREAL_RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + //!! Unspecified boolean type + typedef bool (ParseResult::*BooleanType)() const; +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). + operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + bool operator!=(const ParseResult& that) const { return !(*this == that); } + bool operator!=(ParseErrorCode code) const { return !(*this == code); } + friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup CEREAL_RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const CEREAL_RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const CEREAL_RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_ERROR_ERROR_H_ diff --git a/external/cereal/external/rapidjson/filereadstream.h b/external/cereal/external/rapidjson/filereadstream.h new file mode 100644 index 0000000..253a7f9 --- /dev/null +++ b/external/cereal/external/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_FILEREADSTREAM_H_ +#define CEREAL_RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +CEREAL_RAPIDJSON_DIAG_OFF(unreachable-code) +CEREAL_RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + CEREAL_RAPIDJSON_ASSERT(fp_ != 0); + CEREAL_RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_FILESTREAM_H_ diff --git a/external/cereal/external/rapidjson/filewritestream.h b/external/cereal/external/rapidjson/filewritestream.h new file mode 100644 index 0000000..44ae127 --- /dev/null +++ b/external/cereal/external/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_FILEWRITESTREAM_H_ +#define CEREAL_RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for output using fwrite(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + CEREAL_RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + char Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_FILESTREAM_H_ diff --git a/external/cereal/external/rapidjson/fwd.h b/external/cereal/external/rapidjson/fwd.h new file mode 100644 index 0000000..1b15c66 --- /dev/null +++ b/external/cereal/external/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_FWD_H_ +#define CEREAL_RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/external/cereal/external/rapidjson/internal/biginteger.h b/external/cereal/external/rapidjson/internal/biginteger.h new file mode 100644 index 0000000..77a6519 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_BIGINTEGER_H_ +#define CEREAL_RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && !__INTEL_COMPILER && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + CEREAL_RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + CEREAL_RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= CEREAL_RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + CEREAL_RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { CEREAL_RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + CEREAL_RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + CEREAL_RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_BIGINTEGER_H_ diff --git a/external/cereal/external/rapidjson/internal/diyfp.h b/external/cereal/external/rapidjson/internal/diyfp.h new file mode 100644 index 0000000..3f92a07 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/diyfp.h @@ -0,0 +1,271 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef CEREAL_RAPIDJSON_DIYFP_H_ +#define CEREAL_RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" +#include + +#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { + CEREAL_RAPIDJSON_ASSERT(f != 0); // https://stackoverflow.com/a/26809183/291737 +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + CEREAL_RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); + if (e < kDpDenormalExponent) { + // Underflow. + return 0.0; + } + if (e >= kDpMaxExponent) { + // Overflow. + return std::numeric_limits::infinity(); + } + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = CEREAL_RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = CEREAL_RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = CEREAL_RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + CEREAL_RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), CEREAL_RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + CEREAL_RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), CEREAL_RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + CEREAL_RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), CEREAL_RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + CEREAL_RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), CEREAL_RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + CEREAL_RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), CEREAL_RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + CEREAL_RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), CEREAL_RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + CEREAL_RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), CEREAL_RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + CEREAL_RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), CEREAL_RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + CEREAL_RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), CEREAL_RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + CEREAL_RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), CEREAL_RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + CEREAL_RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), CEREAL_RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + CEREAL_RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), CEREAL_RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + CEREAL_RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), CEREAL_RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + CEREAL_RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), CEREAL_RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + CEREAL_RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), CEREAL_RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + CEREAL_RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), CEREAL_RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + CEREAL_RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), CEREAL_RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + CEREAL_RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), CEREAL_RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + CEREAL_RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), CEREAL_RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + CEREAL_RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), CEREAL_RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + CEREAL_RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), CEREAL_RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + CEREAL_RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), CEREAL_RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + CEREAL_RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), CEREAL_RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + CEREAL_RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), CEREAL_RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + CEREAL_RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), CEREAL_RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + CEREAL_RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), CEREAL_RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + CEREAL_RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), CEREAL_RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + CEREAL_RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), CEREAL_RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + CEREAL_RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), CEREAL_RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + CEREAL_RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), CEREAL_RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + CEREAL_RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), CEREAL_RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + CEREAL_RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), CEREAL_RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + CEREAL_RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), CEREAL_RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + CEREAL_RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), CEREAL_RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + CEREAL_RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), CEREAL_RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + CEREAL_RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), CEREAL_RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + CEREAL_RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), CEREAL_RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + CEREAL_RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), CEREAL_RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + CEREAL_RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), CEREAL_RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + CEREAL_RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), CEREAL_RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + CEREAL_RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), CEREAL_RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + CEREAL_RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), CEREAL_RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + CEREAL_RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), CEREAL_RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + CEREAL_RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + CEREAL_RAPIDJSON_ASSERT(index < 87); + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + CEREAL_RAPIDJSON_ASSERT(exp >= -348); + unsigned index = static_cast(exp + 348) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); +} + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_DIYFP_H_ diff --git a/external/cereal/external/rapidjson/internal/dtoa.h b/external/cereal/external/rapidjson/internal/dtoa.h new file mode 100644 index 0000000..ea62b34 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef CEREAL_RAPIDJSON_DTOA_ +#define CEREAL_RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +CEREAL_RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline int CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + CEREAL_RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_DTOA_ diff --git a/external/cereal/external/rapidjson/internal/ieee754.h b/external/cereal/external/rapidjson/internal/ieee754.h new file mode 100644 index 0000000..6730dfd --- /dev/null +++ b/external/cereal/external/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_IEEE754_ +#define CEREAL_RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + CEREAL_RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static int EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = CEREAL_RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = CEREAL_RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = CEREAL_RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = CEREAL_RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_IEEE754_ diff --git a/external/cereal/external/rapidjson/internal/itoa.h b/external/cereal/external/rapidjson/internal/itoa.h new file mode 100644 index 0000000..f04e3fa --- /dev/null +++ b/external/cereal/external/rapidjson/internal/itoa.h @@ -0,0 +1,308 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ITOA_ +#define CEREAL_RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + CEREAL_RAPIDJSON_ASSERT(buffer != 0); + + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + CEREAL_RAPIDJSON_ASSERT(buffer != 0); + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + CEREAL_RAPIDJSON_ASSERT(buffer != 0); + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + CEREAL_RAPIDJSON_ASSERT(buffer != 0); + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_ITOA_ diff --git a/external/cereal/external/rapidjson/internal/meta.h b/external/cereal/external/rapidjson/internal/meta.h new file mode 100644 index 0000000..f511ff8 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/meta.h @@ -0,0 +1,186 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_INTERNAL_META_H_ +#define CEREAL_RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(6334) +#endif + +#if CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond CEREAL_RAPIDJSON_INTERNAL +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + CEREAL_RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define CEREAL_RAPIDJSON_REMOVEFPTR_(type) \ + typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::CEREAL_RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define CEREAL_RAPIDJSON_ENABLEIF(cond) \ + typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define CEREAL_RAPIDJSON_DISABLEIF(cond) \ + typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define CEREAL_RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define CEREAL_RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::CEREAL_RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(_MSC_VER) && !defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_INTERNAL_META_H_ diff --git a/external/cereal/external/rapidjson/internal/pow10.h b/external/cereal/external/rapidjson/internal/pow10.h new file mode 100644 index 0000000..7f796a1 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_POW10_ +#define CEREAL_RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + CEREAL_RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_POW10_ diff --git a/external/cereal/external/rapidjson/internal/regex.h b/external/cereal/external/rapidjson/internal/regex.h new file mode 100644 index 0000000..6c2ed6e --- /dev/null +++ b/external/cereal/external/rapidjson/internal/regex.h @@ -0,0 +1,740 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_INTERNAL_REGEX_H_ +#define CEREAL_RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +CEREAL_RAPIDJSON_DIAG_OFF(switch-enum) +CEREAL_RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 7 +CEREAL_RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif +#endif + +#ifndef CEREAL_RAPIDJSON_REGEX_VERBOSE +#define CEREAL_RAPIDJSON_REGEX_VERBOSE 0 +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// DecodedStream + +template +class DecodedStream { +public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + +private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +template +class GenericRegexSearch; + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef Encoding EncodingType; + typedef typename Encoding::Ch Ch; + template friend class GenericRegexSearch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + ownAllocator_(allocator ? 0 : CEREAL_RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), + states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream, Encoding> ds(ss); + Parse(ds); + } + + ~GenericRegex() + { + CEREAL_RAPIDJSON_DELETE(ownAllocator_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + State& GetState(SizeType index) { + CEREAL_RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + CEREAL_RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + CEREAL_RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + CEREAL_RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Stack operandStack(allocator_, 256); // Frag + Stack operatorStack(allocator_, 256); // Operator + Stack atomCountStack(allocator_, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if CEREAL_RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + CEREAL_RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + case kOneOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + + default: + // syntax error (e.g. unclosed kLeftParenthesis) + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + CEREAL_RAPIDJSON_ASSERT(n <= m); + CEREAL_RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + CEREAL_RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + CEREAL_RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + Allocator* ownAllocator_; + Allocator* allocator_; + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + bool anchorBegin_; + bool anchorEnd_; +}; + +template +class GenericRegexSearch { +public: + typedef typename RegexType::EncodingType Encoding; + typedef typename Encoding::Ch Ch; + + GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : + regex_(regex), allocator_(allocator), ownAllocator_(0), + state0_(allocator, 0), state1_(allocator, 0), stateSet_() + { + CEREAL_RAPIDJSON_ASSERT(regex_.IsValid()); + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); + state0_.template Reserve(regex_.stateCount_); + state1_.template Reserve(regex_.stateCount_); + } + + ~GenericRegexSearch() { + Allocator::Free(stateSet_); + CEREAL_RAPIDJSON_DELETE(ownAllocator_); + } + + template + bool Match(InputStream& is) { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) { + return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); + } + + bool Search(const Ch* s) { + GenericStringStream is(s); + return Search(is); + } + +private: + typedef typename RegexType::State State; + typedef typename RegexType::Range Range; + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, regex_.root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = regex_.GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == RegexType::kAnyCharacterClass || + (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, regex_.root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (regex_.stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) { + CEREAL_RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = regex_.GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { + stateSet_[index >> 5] |= (1u << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = regex_.GetRange(rangeIndex); + if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + const RegexType& regex_; + Allocator* allocator_; + Allocator* ownAllocator_; + Stack state0_; + Stack state1_; + uint32_t* stateSet_; +}; + +typedef GenericRegex > Regex; +typedef GenericRegexSearch RegexSearch; + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#if defined(__clang__) || defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/external/cereal/external/rapidjson/internal/stack.h b/external/cereal/external/rapidjson/internal/stack.h new file mode 100644 index 0000000..be77088 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/stack.h @@ -0,0 +1,232 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_INTERNAL_STACK_H_ +#define CEREAL_RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" +#include + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) CEREAL_RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + CEREAL_RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (CEREAL_RAPIDJSON_UNLIKELY(static_cast(sizeof(T) * count) > (stackEnd_ - stackTop_))) + Expand(count); + } + + template + CEREAL_RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + CEREAL_RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + CEREAL_RAPIDJSON_ASSERT(stackTop_); + CEREAL_RAPIDJSON_ASSERT(static_cast(sizeof(T) * count) <= (stackEnd_ - stackTop_)); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + CEREAL_RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + CEREAL_RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + CEREAL_RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + CEREAL_RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + CEREAL_RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_STACK_H_ diff --git a/external/cereal/external/rapidjson/internal/strfunc.h b/external/cereal/external/rapidjson/internal/strfunc.h new file mode 100644 index 0000000..44af229 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/strfunc.h @@ -0,0 +1,69 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_ +#define CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" +#include + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + CEREAL_RAPIDJSON_ASSERT(s != 0); + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +template <> +inline SizeType StrLen(const char* s) { + return SizeType(std::strlen(s)); +} + +template <> +inline SizeType StrLen(const wchar_t* s) { + return SizeType(std::wcslen(s)); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + CEREAL_RAPIDJSON_ASSERT(s != 0); + CEREAL_RAPIDJSON_ASSERT(outCount != 0); + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/external/cereal/external/rapidjson/internal/strtod.h b/external/cereal/external/rapidjson/internal/strtod.h new file mode 100644 index 0000000..d60c740 --- /dev/null +++ b/external/cereal/external/rapidjson/internal/strtod.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_STRTOD_ +#define CEREAL_RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" +#include +#include + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, int dLen, int dExp, double* result) { + uint64_t significand = 0; + int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < dLen; i++) { + if (significand > CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < dLen && decimals[i] >= '5') // Rounding + significand++; + + int remaining = dLen - i; + const int kUlpShift = 3; + const int kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + dExp += remaining; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 + DiyFp(CEREAL_RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp; + CEREAL_RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); + v = v * kPow10[adjustment - 1]; + if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + int precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + int scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, int dLen, int dExp) { + CEREAL_RAPIDJSON_ASSERT(dLen >= 0); + const BigInteger dInt(decimals, static_cast(dLen)); + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + CEREAL_RAPIDJSON_ASSERT(d >= 0.0); + CEREAL_RAPIDJSON_ASSERT(length >= 1); + + double result = 0.0; + if (StrtodFast(d, p, &result)) + return result; + + CEREAL_RAPIDJSON_ASSERT(length <= INT_MAX); + int dLen = static_cast(length); + + CEREAL_RAPIDJSON_ASSERT(length >= decimalPosition); + CEREAL_RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); + int dExpAdjust = static_cast(length - decimalPosition); + + CEREAL_RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); + int dExp = exp - dExpAdjust; + + // Make sure length+dExp does not overflow + CEREAL_RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); + + // Trim leading zeros + while (dLen > 0 && *decimals == '0') { + dLen--; + decimals++; + } + + // Trim trailing zeros + while (dLen > 0 && decimals[dLen - 1] == '0') { + dLen--; + dExp++; + } + + if (dLen == 0) { // Buffer only contains zeros. + return 0.0; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 767 + 1; + if (dLen > kMaxDecimalDigit) { + dExp += dLen - kMaxDecimalDigit; + dLen = kMaxDecimalDigit; + } + + // If too small, underflow to zero. + // Any x <= 10^-324 is interpreted as zero. + if (dLen + dExp <= -324) + return 0.0; + + // If too large, overflow to infinity. + // Any x >= 10^309 is interpreted as +infinity. + if (dLen + dExp > 309) + return std::numeric_limits::infinity(); + + if (StrtodDiyFp(decimals, dLen, dExp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, dLen, dExp); +} + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_STRTOD_ diff --git a/external/cereal/external/rapidjson/internal/swap.h b/external/cereal/external/rapidjson/internal/swap.h new file mode 100644 index 0000000..5d8910c --- /dev/null +++ b/external/cereal/external/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_INTERNAL_SWAP_H_ +#define CEREAL_RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) CEREAL_RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/external/cereal/external/rapidjson/istreamwrapper.h b/external/cereal/external/rapidjson/istreamwrapper.h new file mode 100644 index 0000000..4df7ce3 --- /dev/null +++ b/external/cereal/external/rapidjson/istreamwrapper.h @@ -0,0 +1,128 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_ +#define CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include +#include + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + + //! Constructor. + /*! + \param stream stream opened for read. + */ + BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + Read(); + } + + //! Constructor. + /*! + \param stream stream opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + CEREAL_RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + BasicIStreamWrapper(); + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = bufferSize_; + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (!stream_.read(buffer_, static_cast(bufferSize_))) { + readCount_ = static_cast(stream_.gcount()); + *(bufferLast_ = buffer_ + readCount_) = '\0'; + eof_ = true; + } + } + } + + StreamType &stream_; + Ch peekBuffer_[4], *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/external/cereal/external/rapidjson/memorybuffer.h b/external/cereal/external/rapidjson/memorybuffer.h new file mode 100644 index 0000000..0cd75cf --- /dev/null +++ b/external/cereal/external/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_MEMORYBUFFER_H_ +#define CEREAL_RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_MEMORYBUFFER_H_ diff --git a/external/cereal/external/rapidjson/memorystream.h b/external/cereal/external/rapidjson/memorystream.h new file mode 100644 index 0000000..326bda5 --- /dev/null +++ b/external/cereal/external/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_MEMORYSTREAM_H_ +#define CEREAL_RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(unreachable-code) +CEREAL_RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return CEREAL_RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return CEREAL_RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_MEMORYBUFFER_H_ diff --git a/external/cereal/external/rapidjson/msinttypes/LICENSE b/external/cereal/external/rapidjson/msinttypes/LICENSE new file mode 100644 index 0000000..e3d96f8 --- /dev/null +++ b/external/cereal/external/rapidjson/msinttypes/LICENSE @@ -0,0 +1,29 @@ +ISO C9x compliant stdint.h for Microsoft Visual Studio +Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 + + Copyright (c) 2006-2013 Alexander Chemeris + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the product nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/external/cereal/external/rapidjson/msinttypes/inttypes.h b/external/cereal/external/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000..1811128 --- /dev/null +++ b/external/cereal/external/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/external/cereal/external/rapidjson/msinttypes/stdint.h b/external/cereal/external/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000..3d4477b --- /dev/null +++ b/external/cereal/external/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/external/cereal/external/rapidjson/ostreamwrapper.h b/external/cereal/external/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000..58c034a --- /dev/null +++ b/external/cereal/external/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_ +#define CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + char Take() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/external/cereal/external/rapidjson/pointer.h b/external/cereal/external/rapidjson/pointer.h new file mode 100644 index 0000000..930970f --- /dev/null +++ b/external/cereal/external/rapidjson/pointer.h @@ -0,0 +1,1414 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_POINTER_H_ +#define CEREAL_RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup CEREAL_RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref CEREAL_RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs) : allocator_(rhs.allocator_), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + CEREAL_RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //! Swap the content of this pointer with an other. + /*! + \param other The pointer to swap with. + \note Constant complexity. + */ + GenericPointer& Swap(GenericPointer& other) CEREAL_RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, other.allocator_); + internal::Swap(ownAllocator_, other.ownAllocator_); + internal::Swap(nameBuffer_, other.nameBuffer_); + internal::Swap(tokens_, other.tokens_); + internal::Swap(tokenCount_, other.tokenCount_); + internal::Swap(parseErrorOffset_, other.parseErrorOffset_); + internal::Swap(parseErrorCode_, other.parseErrorCode_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.pointer, b.pointer); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericPointer& a, GenericPointer& b) CEREAL_RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, internal::StrLen(name), allocator); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = static_cast(buffer[i]); + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + CEREAL_RAPIDJSON_ASSERT(token.IsUint64()); + CEREAL_RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //! Less than operator. + /*! + \note Invalid pointers are always greater than valid ones. + */ + bool operator<(const GenericPointer& rhs) const { + if (!IsValid()) + return false; + if (!rhs.IsValid()) + return true; + + if (tokenCount_ != rhs.tokenCount_) + return tokenCount_ < rhs.tokenCount_; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index) + return tokens_[i].index < rhs.tokens_[i].index; + + if (tokens_[i].length != rhs.tokens_[i].length) + return tokens_[i].length < rhs.tokens_[i].length; + + if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length)) + return cmp < 0; + } + + return false; + } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + CEREAL_RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + CEREAL_RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + CEREAL_RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + CEREAL_RAPIDJSON_ASSERT(source != NULL); + CEREAL_RAPIDJSON_ASSERT(nameBuffer_ == 0); + CEREAL_RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + CEREAL_RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + CEREAL_RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + CEREAL_RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(static_cast(hexDigits[u >> 4])); + os_.Put(static_cast(hexDigits[u & 15])); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +CEREAL_RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_POINTER_H_ diff --git a/external/cereal/external/rapidjson/prettywriter.h b/external/cereal/external/rapidjson/prettywriter.h new file mode 100644 index 0000000..0c2beb4 --- /dev/null +++ b/external/cereal/external/rapidjson/prettywriter.h @@ -0,0 +1,277 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_PRETTYWRITER_H_ +#define CEREAL_RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of output os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + PrettyWriter(PrettyWriter&& rhs) : + Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} +#endif + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + CEREAL_RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + CEREAL_RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kNumberType); + return Base::EndValue(Base::WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + CEREAL_RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kStringType); + return Base::EndValue(Base::WriteString(str, length)); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object + CEREAL_RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object + CEREAL_RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndObject()); + (void)ret; + CEREAL_RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + CEREAL_RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndArray()); + (void)ret; + CEREAL_RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + CEREAL_RAPIDJSON_ASSERT(json != 0); + PrettyPrefix(type); + return Base::EndValue(Base::WriteRawValue(json, length)); + } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + CEREAL_RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + CEREAL_RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_ diff --git a/external/cereal/external/rapidjson/rapidjson.h b/external/cereal/external/rapidjson/rapidjson.h new file mode 100644 index 0000000..3eefe60 --- /dev/null +++ b/external/cereal/external/rapidjson/rapidjson.h @@ -0,0 +1,656 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_ +#define CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see CEREAL_RAPIDJSON_CONFIG + */ + +/*! \defgroup CEREAL_RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overridden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref CEREAL_RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define CEREAL_RAPIDJSON_STRINGIFY(x) CEREAL_RAPIDJSON_DO_STRINGIFY(x) +#define CEREAL_RAPIDJSON_DO_STRINGIFY(x) #x + +// token concatenation +#define CEREAL_RAPIDJSON_JOIN(X, Y) CEREAL_RAPIDJSON_DO_JOIN(X, Y) +#define CEREAL_RAPIDJSON_DO_JOIN(X, Y) CEREAL_RAPIDJSON_DO_JOIN2(X, Y) +#define CEREAL_RAPIDJSON_DO_JOIN2(X, Y) X##Y +//!@endcond + +/*! \def CEREAL_RAPIDJSON_MAJOR_VERSION + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def CEREAL_RAPIDJSON_MINOR_VERSION + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def CEREAL_RAPIDJSON_PATCH_VERSION + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def CEREAL_RAPIDJSON_VERSION_STRING + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define CEREAL_RAPIDJSON_MAJOR_VERSION 1 +#define CEREAL_RAPIDJSON_MINOR_VERSION 1 +#define CEREAL_RAPIDJSON_PATCH_VERSION 0 +#define CEREAL_RAPIDJSON_VERSION_STRING \ + CEREAL_RAPIDJSON_STRINGIFY(CEREAL_RAPIDJSON_MAJOR_VERSION.CEREAL_RAPIDJSON_MINOR_VERSION.CEREAL_RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def CEREAL_RAPIDJSON_NAMESPACE + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c CEREAL_RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref CEREAL_RAPIDJSON_NAMESPACE_BEGIN and \ref + CEREAL_RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define CEREAL_RAPIDJSON_NAMESPACE my::rapidjson + #define CEREAL_RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define CEREAL_RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def CEREAL_RAPIDJSON_NAMESPACE_BEGIN + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see CEREAL_RAPIDJSON_NAMESPACE +*/ +/*! \def CEREAL_RAPIDJSON_NAMESPACE_END + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see CEREAL_RAPIDJSON_NAMESPACE +*/ +#ifndef CEREAL_RAPIDJSON_NAMESPACE +#define CEREAL_RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef CEREAL_RAPIDJSON_NAMESPACE_BEGIN +#define CEREAL_RAPIDJSON_NAMESPACE_BEGIN namespace CEREAL_RAPIDJSON_NAMESPACE { +#endif +#ifndef CEREAL_RAPIDJSON_NAMESPACE_END +#define CEREAL_RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_HAS_STDSTRING + +#ifndef CEREAL_RAPIDJSON_HAS_STDSTRING +#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING +#define CEREAL_RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define CEREAL_RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def CEREAL_RAPIDJSON_HAS_STDSTRING + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(CEREAL_RAPIDJSON_HAS_STDSTRING) + +#if CEREAL_RAPIDJSON_HAS_STDSTRING +#include +#endif // CEREAL_RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_NO_INT64DEFINE + +/*! \def CEREAL_RAPIDJSON_NO_INT64DEFINE + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define CEREAL_RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef CEREAL_RAPIDJSON_NO_INT64DEFINE +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING +#define CEREAL_RAPIDJSON_NO_INT64DEFINE +#endif +#endif // CEREAL_RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_FORCEINLINE + +#ifndef CEREAL_RAPIDJSON_FORCEINLINE +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define CEREAL_RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define CEREAL_RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define CEREAL_RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // CEREAL_RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_ENDIAN +#define CEREAL_RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define CEREAL_RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def CEREAL_RAPIDJSON_ENDIAN + \ingroup CEREAL_RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define CEREAL_RAPIDJSON_ENDIAN to either + \ref CEREAL_RAPIDJSON_LITTLEENDIAN or \ref CEREAL_RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef CEREAL_RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define CEREAL_RAPIDJSON_ENDIAN CEREAL_RAPIDJSON_LITTLEENDIAN +# elif defined(CEREAL_RAPIDJSON_DOXYGEN_RUNNING) +# define CEREAL_RAPIDJSON_ENDIAN +# else +# error Unknown machine endianness detected. User needs to define CEREAL_RAPIDJSON_ENDIAN. +# endif +#endif // CEREAL_RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef CEREAL_RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define CEREAL_RAPIDJSON_64BIT 1 +#else +#define CEREAL_RAPIDJSON_64BIT 0 +#endif +#endif // CEREAL_RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup CEREAL_RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. The default is 8 bytes. + User can customize by defining the CEREAL_RAPIDJSON_ALIGN function macro. +*/ +#ifndef CEREAL_RAPIDJSON_ALIGN +#define CEREAL_RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef CEREAL_RAPIDJSON_UINT64_C2 +#define CEREAL_RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup CEREAL_RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if CEREAL_RAPIDJSON_64BIT != 1 +#error CEREAL_RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when CEREAL_RAPIDJSON_64BIT=1 +#endif +#define CEREAL_RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(CEREAL_RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define CEREAL_RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(CEREAL_RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define CEREAL_RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define CEREAL_RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_SSE2/CEREAL_RAPIDJSON_SSE42/CEREAL_RAPIDJSON_NEON/CEREAL_RAPIDJSON_SIMD + +/*! \def CEREAL_RAPIDJSON_SIMD + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2/Neon optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel + or ARM compatible processors. + + To enable these optimizations, three different symbols can be defined; + \code + // Enable SSE2 optimization. + #define CEREAL_RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define CEREAL_RAPIDJSON_SSE42 + \endcode + + // Enable ARM Neon optimization. + #define CEREAL_RAPIDJSON_NEON + \endcode + + \c CEREAL_RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c CEREAL_RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42) \ + || defined(CEREAL_RAPIDJSON_NEON) || defined(CEREAL_RAPIDJSON_DOXYGEN_RUNNING) +#define CEREAL_RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef CEREAL_RAPIDJSON_DOXYGEN_RUNNING +#define CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE +#endif +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref CEREAL_RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +CEREAL_RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +CEREAL_RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup CEREAL_RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining CEREAL_RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref CEREAL_RAPIDJSON_ERRORS APIs. +*/ +#ifndef CEREAL_RAPIDJSON_ASSERT +#include +#define CEREAL_RAPIDJSON_ASSERT(x) assert(x) +#endif // CEREAL_RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_STATIC_ASSERT + +// Prefer C++11 static_assert, if available +#ifndef CEREAL_RAPIDJSON_STATIC_ASSERT +#if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) +#define CEREAL_RAPIDJSON_STATIC_ASSERT(x) \ + static_assert(x, CEREAL_RAPIDJSON_STRINGIFY(x)) +#endif // C++11 +#endif // CEREAL_RAPIDJSON_STATIC_ASSERT + +// Adopt C++03 implementation from boost +#ifndef CEREAL_RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +CEREAL_RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(__clang__) +#define CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def CEREAL_RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define CEREAL_RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::CEREAL_RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::CEREAL_RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + CEREAL_RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) CEREAL_RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif // CEREAL_RAPIDJSON_STATIC_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_LIKELY, CEREAL_RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup CEREAL_RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef CEREAL_RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define CEREAL_RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define CEREAL_RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup CEREAL_RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef CEREAL_RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define CEREAL_RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define CEREAL_RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define CEREAL_RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define CEREAL_RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_DIAG_PUSH/POP, CEREAL_RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define CEREAL_RAPIDJSON_GNUC \ + CEREAL_RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(CEREAL_RAPIDJSON_GNUC) && CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,2,0)) + +#define CEREAL_RAPIDJSON_PRAGMA(x) _Pragma(CEREAL_RAPIDJSON_STRINGIFY(x)) +#define CEREAL_RAPIDJSON_DIAG_PRAGMA(x) CEREAL_RAPIDJSON_PRAGMA(GCC diagnostic x) +#define CEREAL_RAPIDJSON_DIAG_OFF(x) \ + CEREAL_RAPIDJSON_DIAG_PRAGMA(ignored CEREAL_RAPIDJSON_STRINGIFY(CEREAL_RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(CEREAL_RAPIDJSON_GNUC) && CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0)) +#define CEREAL_RAPIDJSON_DIAG_PUSH CEREAL_RAPIDJSON_DIAG_PRAGMA(push) +#define CEREAL_RAPIDJSON_DIAG_POP CEREAL_RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define CEREAL_RAPIDJSON_DIAG_PUSH /* ignored */ +#define CEREAL_RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define CEREAL_RAPIDJSON_PRAGMA(x) __pragma(x) +#define CEREAL_RAPIDJSON_DIAG_PRAGMA(x) CEREAL_RAPIDJSON_PRAGMA(warning(x)) + +#define CEREAL_RAPIDJSON_DIAG_OFF(x) CEREAL_RAPIDJSON_DIAG_PRAGMA(disable: x) +#define CEREAL_RAPIDJSON_DIAG_PUSH CEREAL_RAPIDJSON_DIAG_PRAGMA(push) +#define CEREAL_RAPIDJSON_DIAG_POP CEREAL_RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define CEREAL_RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define CEREAL_RAPIDJSON_DIAG_PUSH /* ignored */ +#define CEREAL_RAPIDJSON_DIAG_POP /* ignored */ + +#endif // CEREAL_RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) + +#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT +#define CEREAL_RAPIDJSON_NOEXCEPT noexcept +#else +#define CEREAL_RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS +#if (defined(_MSC_VER) && _MSC_VER >= 1700) +#define CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS 1 +#else +#define CEREAL_RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif +#endif + +#ifndef CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(CEREAL_RAPIDJSON_GNUC) && (CEREAL_RAPIDJSON_GNUC >= CEREAL_RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // CEREAL_RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +//! Assertion (in non-throwing contexts). + /*! \ingroup CEREAL_RAPIDJSON_CONFIG + Some functions provide a \c noexcept guarantee, if the compiler supports it. + In these cases, the \ref CEREAL_RAPIDJSON_ASSERT macro cannot be overridden to + throw an exception. This macro adds a separate customization point for + such cases. + + Defaults to C \c assert() (as \ref CEREAL_RAPIDJSON_ASSERT), if \c noexcept is + supported, and to \ref CEREAL_RAPIDJSON_ASSERT otherwise. + */ + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_NOEXCEPT_ASSERT + +#ifndef CEREAL_RAPIDJSON_NOEXCEPT_ASSERT +#ifdef CEREAL_RAPIDJSON_ASSERT_THROWS +#if CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT +#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x) +#else +#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x) CEREAL_RAPIDJSON_ASSERT(x) +#endif // CEREAL_RAPIDJSON_HAS_CXX11_NOEXCEPT +#else +#define CEREAL_RAPIDJSON_NOEXCEPT_ASSERT(x) CEREAL_RAPIDJSON_ASSERT(x) +#endif // CEREAL_RAPIDJSON_ASSERT_THROWS +#endif // CEREAL_RAPIDJSON_NOEXCEPT_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef CEREAL_RAPIDJSON_NEW +///! customization point for global \c new +#define CEREAL_RAPIDJSON_NEW(TypeName) new TypeName +#endif +#ifndef CEREAL_RAPIDJSON_DELETE +///! customization point for global \c delete +#define CEREAL_RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see CEREAL_RAPIDJSON_NAMESPACE +*/ +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_ diff --git a/external/cereal/external/rapidjson/reader.h b/external/cereal/external/rapidjson/reader.h new file mode 100644 index 0000000..43eb525 --- /dev/null +++ b/external/cereal/external/rapidjson/reader.h @@ -0,0 +1,2230 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_READER_H_ +#define CEREAL_RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(CEREAL_RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef CEREAL_RAPIDJSON_SSE42 +#include +#elif defined(CEREAL_RAPIDJSON_SSE2) +#include +#elif defined(CEREAL_RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(old-style-cast) +CEREAL_RAPIDJSON_DIAG_OFF(padded) +CEREAL_RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +CEREAL_RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define CEREAL_RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (CEREAL_RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + CEREAL_RAPIDJSON_MULTILINEMACRO_END +#endif +#define CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(CEREAL_RAPIDJSON_NOTHING) +//!@endcond + +/*! \def CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup CEREAL_RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see CEREAL_RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN +#define CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \ + CEREAL_RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + CEREAL_RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def CEREAL_RAPIDJSON_PARSE_ERROR + \ingroup CEREAL_RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef CEREAL_RAPIDJSON_PARSE_ERROR +#define CEREAL_RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN \ + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + CEREAL_RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS +#define CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining CEREAL_RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef CEREAL_RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } + + return SkipWhitespace(p, end); +} + +#elif defined(CEREAL_RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(CEREAL_RAPIDJSON_NEON) + +//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz =__builtin_clzll(high);; + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low);; + return p + (lz >> 3); + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (; p <= end - 16; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + return p + 8 + (lz >> 3); + } + } else { + int lz = __builtin_clzll(low); + return p + (lz >> 3); + } + } + + return SkipWhitespace(p, end); +} + +#endif // CEREAL_RAPIDJSON_NEON + +#ifdef CEREAL_RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // CEREAL_RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : + stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Initialize JSON text token-by-token parsing + /*! + */ + void IterativeParseInit() { + parseResult_.Clear(); + state_ = IterativeParsingStartState; + } + + //! Parse one token from JSON text + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool IterativeParseNext(InputStream& is, Handler& handler) { + while (CEREAL_RAPIDJSON_LIKELY(is.Peek() != '\0')) { + SkipWhitespaceAndComments(is); + + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state_, t); + IterativeParsingState d = Transit(state_, t, n, is, handler); + + // If we've finished or hit an error... + if (CEREAL_RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { + // Report errors. + if (d == IterativeParsingErrorState) { + HandleError(state_, is); + return false; + } + + // Transition to the finish state. + CEREAL_RAPIDJSON_ASSERT(d == IterativeParsingFinishState); + state_ = d; + + // If StopWhenDone is not set... + if (!(parseFlags & kParseStopWhenDoneFlag)) { + // ... and extra non-whitespace data is found... + SkipWhitespaceAndComments(is); + if (is.Peek() != '\0') { + // ... this is considered an error. + HandleError(state_, is); + return false; + } + } + + // Success! We are done! + return true; + } + + // Transition to the new state. + state_ = d; + + // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. + if (!IsIterativeParsingDelimiterState(n)) + return true; + } + + // We reached the end of file. + stack_.Clear(); + + if (state_ != IterativeParsingFinishState) { + HandleError(state_, is); + return false; + } + + return true; + } + + //! Check if token-by-token parsing JSON text is complete + /*! \return Whether the JSON has been fully decoded. + */ + CEREAL_RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { + return IsIterativeParsingCompleteState(state_); + } + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (CEREAL_RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (CEREAL_RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n') {} + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartObject())) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (CEREAL_RAPIDJSON_UNLIKELY(is.Peek() != '"')) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (CEREAL_RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.StartArray())) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Null())) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Bool(true))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (CEREAL_RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (CEREAL_RAPIDJSON_UNLIKELY(!handler.Bool(false))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + CEREAL_RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (CEREAL_RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + CEREAL_RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + CEREAL_RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + CEREAL_RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + CEREAL_RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (CEREAL_RAPIDJSON_UNLIKELY(!success)) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + CEREAL_RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (CEREAL_RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && CEREAL_RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (CEREAL_RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (CEREAL_RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (CEREAL_RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (CEREAL_RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (CEREAL_RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (CEREAL_RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (CEREAL_RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42) + // StringStream -> StackStream + static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + CEREAL_RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static CEREAL_RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + CEREAL_RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#elif defined(CEREAL_RAPIDJSON_NEON) + // StringStream -> StackStream + static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high);; + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low);; + length = lz >> 3; + escaped = true; + } + if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + vst1q_u8(reinterpret_cast(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static CEREAL_RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + CEREAL_RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16, q += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + length = lz >> 3; + escaped = true; + } + if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + for (const char* pend = p + length; p != pend; ) { + *q++ = *p++; + } + break; + } + vst1q_u8(reinterpret_cast(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static CEREAL_RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + CEREAL_RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (CEREAL_RAPIDJSON_UNLIKELY(*p == '\"') || CEREAL_RAPIDJSON_UNLIKELY(*p == '\\') || CEREAL_RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + if (low == 0) { + if (high != 0) { + int lz = __builtin_clzll(high); + p += 8 + (lz >> 3); + break; + } + } else { + int lz = __builtin_clzll(low); + p += lz >> 3; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif // CEREAL_RAPIDJSON_NEON + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + + CEREAL_RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + CEREAL_RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + CEREAL_RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + CEREAL_RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s), stackStream(reader.stack_) {} + + CEREAL_RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + CEREAL_RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + + CEREAL_RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (CEREAL_RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (CEREAL_RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (CEREAL_RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (CEREAL_RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && CEREAL_RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + if (Consume(s, 'N')) { + if (Consume(s, 'a') && Consume(s, 'N')) { + d = std::numeric_limits::quiet_NaN(); + useNanOrInf = true; + } + } + else if (CEREAL_RAPIDJSON_LIKELY(Consume(s, 'I'))) { + if (Consume(s, 'n') && Consume(s, 'f')) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + useNanOrInf = true; + + if (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + } + + if (CEREAL_RAPIDJSON_UNLIKELY(!useNanOrInf)) { + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (CEREAL_RAPIDJSON_UNLIKELY(i64 >= CEREAL_RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (CEREAL_RAPIDJSON_LIKELY(i64 != CEREAL_RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (CEREAL_RAPIDJSON_UNLIKELY(i64 >= CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (CEREAL_RAPIDJSON_LIKELY(i64 != CEREAL_RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (CEREAL_RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if CEREAL_RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > CEREAL_RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (CEREAL_RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + // (exp + expFrac) must not underflow int => we're detecting when -exp gets + // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into + // underflow territory): + // + // -(exp * 10 + 9) + expFrac >= INT_MIN + // <=> exp <= (expFrac - INT_MIN - 9) / 10 + CEREAL_RAPIDJSON_ASSERT(expFrac <= 0); + int maxExp = (expFrac + 2147483639) / 10; + + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (CEREAL_RAPIDJSON_UNLIKELY(exp > maxExp)) { + while (CEREAL_RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (CEREAL_RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (CEREAL_RAPIDJSON_UNLIKELY(exp > maxExp)) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + CEREAL_RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal + if (d > (std::numeric_limits::max)()) { + // Overflow + // TODO: internal::StrtodX should report overflow (or underflow) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (CEREAL_RAPIDJSON_UNLIKELY(!cont)) + CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingFinishState = 0, // sink states at top + IterativeParsingErrorState, // sink states at top + IterativeParsingStartState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingMemberValueState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + // Delimiter states (at bottom) + IterativeParsingElementDelimiterState, + IterativeParsingMemberDelimiterState, + IterativeParsingKeyValueDelimiterState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + CEREAL_RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { + +//!@cond CEREAL_RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + CEREAL_RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + CEREAL_RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + CEREAL_RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + CEREAL_RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + CEREAL_RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: CEREAL_RAPIDJSON_ASSERT(src == IterativeParsingElementState); CEREAL_RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + CEREAL_RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { + return s >= IterativeParsingElementDelimiterState; + } + + CEREAL_RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { + return s <= IterativeParsingErrorState; + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + CEREAL_RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; + IterativeParsingState state_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_READER_H_ diff --git a/external/cereal/external/rapidjson/schema.h b/external/cereal/external/rapidjson/schema.h new file mode 100644 index 0000000..17366c6 --- /dev/null +++ b/external/cereal/external/rapidjson/schema.h @@ -0,0 +1,2497 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef CEREAL_RAPIDJSON_SCHEMA_H_ +#define CEREAL_RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include "stringbuffer.h" +#include // abs, floor + +#if !defined(CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX || CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX +#define CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef CEREAL_RAPIDJSON_SCHEMA_VERBOSE +#define CEREAL_RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +CEREAL_RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +CEREAL_RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_OFF(weak-vtables) +CEREAL_RAPIDJSON_DIAG_OFF(exit-time-destructors) +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +CEREAL_RAPIDJSON_DIAG_OFF(variadic-macros) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // CEREAL_RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN + +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE +#define CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + CEREAL_RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +CEREAL_RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// IValidationErrorHandler + +template +class IValidationErrorHandler { +public: + typedef typename SchemaType::Ch Ch; + typedef typename SchemaType::SValue SValue; + + virtual ~IValidationErrorHandler() {} + + virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(double actual, const SValue& expected) = 0; + virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; + + virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; + + virtual void DisallowedItem(SizeType index) = 0; + virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; + + virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void StartMissingProperties() = 0; + virtual void AddMissingProperty(const SValue& name) = 0; + virtual bool EndMissingProperties() = 0; + virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; + + virtual void StartDependencyErrors() = 0; + virtual void StartMissingDependentProperties() = 0; + virtual void AddMissingDependentProperty(const SValue& targetName) = 0; + virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; + virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0; + virtual bool EndDependencyErrors() = 0; + + virtual void DisallowedValue() = 0; + virtual void StartDisallowedType() = 0; + virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; + virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; + virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void Disallowed() = 0; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + CEREAL_RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(CEREAL_RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = CEREAL_RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef IValidationErrorHandler ErrorHandlerType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s) : + factory(f), + error_handler(eh), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + ErrorHandlerType& error_handler; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + typedef IValidationErrorHandler ErrorHandler; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + uri_(schemaDocument->GetURI(), *allocator), + pointer_(p, allocator), + typeless_(schemaDocument->GetTypeless()), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + notValidatorIndex_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false), + defaultValueLength_(0) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256u + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = typeless_; + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + + // Default + if (const ValueType* v = GetMember(value, GetDefaultValueString())) + if (v->IsString()) + defaultValueLength_ = v->GetStringLength(); + + } + + ~Schema() { + AllocatorType::Free(enum_); + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if CEREAL_RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + AllocatorType::Free(pattern_); + } +#endif + } + + const SValue& GetURI() const { + return uri_; + } + + const PointerType& GetPointer() const { + return pointer_; + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = typeless_; + else { + context.error_handler.DisallowedItem(context.arrayElementIndex); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + } + else + context.valueSchema = typeless_; + + context.arrayElementIndex++; + } + return true; + } + + CEREAL_RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + context.error_handler.DisallowedValue(); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) { + context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + } + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } else + oneValid = true; + } + if (!oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) { + context.error_handler.Disallowed(); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + } + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) { + DisallowedType(context, GetNullString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) { + DisallowedType(context, GetBooleanString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) { + DisallowedType(context, GetNumberString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) { + DisallowedType(context, GetStringString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) { + context.error_handler.TooShort(str, length, minLength_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + } + if (count > maxLength_) { + context.error_handler.TooLong(str, length, maxLength_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) { + context.error_handler.DoesNotMatch(str, length); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + } + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) { + DisallowedType(context, GetObjectString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + context.valueSchema = typeless_; + } + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = typeless_; + return true; + } + + if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties + context.error_handler.DisallowedProperty(str, len); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + } + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) { + context.error_handler.StartMissingProperties(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required && !context.propertyExist[index]) + if (properties_[index].schema->defaultValueLength_ == 0 ) + context.error_handler.AddMissingProperty(properties_[index].name); + if (context.error_handler.EndMissingProperties()) + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + } + + if (memberCount < minProperties_) { + context.error_handler.TooFewProperties(memberCount, minProperties_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + } + + if (memberCount > maxProperties_) { + context.error_handler.TooManyProperties(memberCount, maxProperties_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + } + + if (hasDependencies_) { + context.error_handler.StartDependencyErrors(); + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { + const Property& source = properties_[sourceIndex]; + if (context.propertyExist[sourceIndex]) { + if (source.dependencies) { + context.error_handler.StartMissingDependentProperties(); + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) + context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); + context.error_handler.EndMissingDependentProperties(source.name); + } + else if (source.dependenciesSchema) { + ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; + if (!dependenciesValidator->IsValid()) + context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); + } + } + } + if (context.error_handler.EndDependencyErrors()) + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) { + DisallowedType(context, GetArrayString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) { + context.error_handler.TooFewItems(elementCount, minItems_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + } + + if (elementCount > maxItems_) { + context.error_handler.TooManyItems(elementCount, maxItems_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + } + + return true; + } + + // Generate functions for string literal according to Ch +#define CEREAL_RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ + return v;\ + } + + CEREAL_RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + CEREAL_RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + CEREAL_RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + CEREAL_RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + CEREAL_RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + CEREAL_RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + CEREAL_RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + CEREAL_RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + CEREAL_RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + CEREAL_RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + CEREAL_RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + CEREAL_RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + CEREAL_RAPIDJSON_STRING_(Not, 'n', 'o', 't') + CEREAL_RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + CEREAL_RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + CEREAL_RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + CEREAL_RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + CEREAL_RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + CEREAL_RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + CEREAL_RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + CEREAL_RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + CEREAL_RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + CEREAL_RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + CEREAL_RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + CEREAL_RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + CEREAL_RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + CEREAL_RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + CEREAL_RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + CEREAL_RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') + +#undef CEREAL_RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if CEREAL_RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + GenericRegexSearch rs(*pattern); + return rs.Search(str); + } +#elif CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType *r = static_cast(allocator_->Malloc(sizeof(RegexType))); + try { + return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + AllocatorType::Free(r); + } + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // CEREAL_RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + CEREAL_RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsUint64()) { } + /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + } + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { + context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { + context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) { + context.error_handler.NotMultipleOf(d, multipleOf_); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + return true; + } + + void DisallowedType(Context& context, const ValueType& actualType) const { + ErrorHandler& eh = context.error_handler; + eh.StartDisallowedType(); + + if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); + if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); + if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); + if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); + if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); + + if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); + else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); + + eh.EndDisallowedType(actualType); + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + SValue uri_; + PointerType pointer_; + const SchemaType* typeless_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; + + SizeType defaultValueLength_; +}; + +template +struct TokenHelper { + CEREAL_RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = static_cast(buffer[i]); + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + CEREAL_RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + typedef GenericValue URIType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param uri The base URI of this schema document for purposes of violation reporting. + \param uriLength Length of \c name, in code points. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, + IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + typeless_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = CEREAL_RAPIDJSON_NEW(Allocator)(); + + Ch noUri[1] = {0}; + uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); + + typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); + new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + else if (refEntry->schema) + *refEntry->schema = typeless_; + + refEntry->~SchemaRefEntry(); + } + + CEREAL_RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) CEREAL_RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + typeless_(rhs.typeless_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)), + uri_(std::move(rhs.uri_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.typeless_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + if (typeless_) { + typeless_->~SchemaType(); + Allocator::Free(typeless_); + } + + CEREAL_RAPIDJSON_DELETE(ownAllocator_); + } + + const URIType& GetURI() const { return uri_; } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = typeless_; + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + CEREAL_RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + new (schemaMap_.template Push()) SchemaEntry(source, const_cast(sc), false, allocator_); + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + const SchemaType* GetTypeless() const { return typeless_; } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + SchemaType* typeless_; + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref + URIType uri_; +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator, + public internal::IValidationErrorHandler +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename SchemaType::SValue SValue; + typedef typename EncodingType::Ch Ch; + typedef GenericStringRef StringRefType; + typedef GenericValue ValueType; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(&outputHandler), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + CEREAL_RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + error_.SetObject(); + currentError_.SetNull(); + missingDependents_.SetNull(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the error object. + ValueType& GetError() { return error_; } + const ValueType& GetError() const { return error_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + if (documentStack_.Empty()) { + return PointerType(); + } + else { + return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + } + + void NotMultipleOf(int64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(uint64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(double actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + + void TooLong(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMaxLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void TooShort(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMinLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void DoesNotMatch(const Ch* str, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetPatternString()); + } + + void DisallowedItem(SizeType index) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalItemsString(), true); + } + void TooFewItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooManyItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void DuplicateItems(SizeType index1, SizeType index2) { + ValueType duplicates(kArrayType); + duplicates.PushBack(index1, GetStateAllocator()); + duplicates.PushBack(index2, GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); + AddCurrentError(SchemaType::GetUniqueItemsString(), true); + } + + void TooManyProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooFewProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void StartMissingProperties() { + currentError_.SetArray(); + } + void AddMissingProperty(const SValue& name) { + currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); + } + bool EndMissingProperties() { + if (currentError_.Empty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetRequiredString()); + return true; + } + void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) + MergeError(static_cast(subvalidators[i])->GetError()); + } + void DisallowedProperty(const Ch* name, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalPropertiesString(), true); + } + + void StartDependencyErrors() { + currentError_.SetObject(); + } + void StartMissingDependentProperties() { + missingDependents_.SetArray(); + } + void AddMissingDependentProperty(const SValue& targetName) { + missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndMissingDependentProperties(const SValue& sourceName) { + if (!missingDependents_.Empty()) + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + missingDependents_, GetStateAllocator()); + } + void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + static_cast(subvalidator)->GetError(), GetStateAllocator()); + } + bool EndDependencyErrors() { + if (currentError_.ObjectEmpty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetDependenciesString()); + return true; + } + + void DisallowedValue() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetEnumString()); + } + void StartDisallowedType() { + currentError_.SetArray(); + } + void AddExpectedType(const typename SchemaType::ValueType& expectedType) { + currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndDisallowedType(const typename SchemaType::ValueType& actualType) { + ValueType error(kObjectType); + error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); + error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetTypeString()); + } + void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) { + MergeError(static_cast(subvalidators[i])->GetError()); + } + } + void NoneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetAnyOfString(), subvalidators, count); + } + void NotOneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetOneOfString(), subvalidators, count); + } + void Disallowed() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetNotString()); + } + +#define CEREAL_RAPIDJSON_STRING_(name, ...) \ + static const StringRefType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ + return v;\ + } + + CEREAL_RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') + CEREAL_RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') + CEREAL_RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') + CEREAL_RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') + CEREAL_RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') + CEREAL_RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') + CEREAL_RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') + CEREAL_RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') + +#undef CEREAL_RAPIDJSON_STRING_ + +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +CEREAL_RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +CEREAL_RAPIDJSON_MULTILINEMACRO_END +#else +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && (!outputHandler_ || outputHandler_->method arg2) + +#define CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } + bool Bool(bool b) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = !outputHandler_ || outputHandler_->StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = !outputHandler_ || outputHandler_->StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + CEREAL_RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef CEREAL_RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, + const char* basePath, size_t basePathSize, +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + if (basePath && basePathSize) + memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = CEREAL_RAPIDJSON_NEW(StateAllocator)(); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + CEREAL_RAPIDJSON_ASSERT(CurrentContext().valueSchema); + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) { + DuplicateItems(static_cast(itr - a->Begin()), a->Size()); + CEREAL_RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + } + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + CEREAL_RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema); } + + CEREAL_RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + void AddErrorLocation(ValueType& result, bool parent) { + GenericStringBuffer sb; + PointerType instancePointer = GetInvalidDocumentPointer(); + ((parent && instancePointer.GetTokenCount() > 0) + ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) + : instancePointer).StringifyUriFragment(sb); + ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); + sb.Clear(); + memcpy(sb.Push(CurrentSchema().GetURI().GetStringLength()), + CurrentSchema().GetURI().GetString(), + CurrentSchema().GetURI().GetStringLength() * sizeof(Ch)); + GetInvalidSchemaPointer().StringifyUriFragment(sb); + ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); + } + + void AddError(ValueType& keyword, ValueType& error) { + typename ValueType::MemberIterator member = error_.FindMember(keyword); + if (member == error_.MemberEnd()) + error_.AddMember(keyword, error, GetStateAllocator()); + else { + if (member->value.IsObject()) { + ValueType errors(kArrayType); + errors.PushBack(member->value, GetStateAllocator()); + member->value = errors; + } + member->value.PushBack(error, GetStateAllocator()); + } + } + + void AddCurrentError(const typename SchemaType::ValueType& keyword, bool parent = false) { + AddErrorLocation(currentError_, parent); + AddError(ValueType(keyword, GetStateAllocator(), false).Move(), currentError_); + } + + void MergeError(ValueType& other) { + for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { + AddError(it->name, it->value); + } + } + + void AddNumberError(const typename SchemaType::ValueType& keyword, ValueType& actual, const SValue& expected, + const typename SchemaType::ValueType& (*exclusive)() = 0) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); + currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); + if (exclusive) + currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); + AddCurrentError(keyword); + } + + void AddErrorArray(const typename SchemaType::ValueType& keyword, + ISchemaValidator** subvalidators, SizeType count) { + ValueType errors(kArrayType); + for (SizeType i = 0; i < count; ++i) + errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); + AddCurrentError(keyword); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + OutputHandler* outputHandler_; + ValueType error_; + ValueType currentError_; + ValueType missingDependents_; + bool valid_; +#if CEREAL_RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + typedef GenericValue ValueType; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), error_(kObjectType), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + error_.SetObject(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + error_.CopyFrom(validator.GetError(), allocator_); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + const ValueType& GetError() const { return error_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + StackAllocator allocator_; + ValueType error_; + bool isValid_; +}; + +CEREAL_RAPIDJSON_NAMESPACE_END +CEREAL_RAPIDJSON_DIAG_POP + +#endif // CEREAL_RAPIDJSON_SCHEMA_H_ diff --git a/external/cereal/external/rapidjson/stream.h b/external/cereal/external/rapidjson/stream.h new file mode 100644 index 0000000..abc0153 --- /dev/null +++ b/external/cereal/external/rapidjson/stream.h @@ -0,0 +1,223 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef CEREAL_RAPIDJSON_STREAM_H_ +#define CEREAL_RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// GenericStreamWrapper + +//! A Stream Wrapper +/*! \tThis string stream is a wrapper for any stream by just forwarding any + \treceived message to the origin stream. + \note implements Stream concept +*/ + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4702) // unreachable code +CEREAL_RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +template > +class GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + GenericStreamWrapper(InputStream& is): is_(is) {} + + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() { return is_.Tell(); } + Ch* PutBegin() { return is_.PutBegin(); } + void Put(Ch ch) { is_.Put(ch); } + void Flush() { is_.Flush(); } + size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } + + // wrapper for MemoryStream + const Ch* Peek4() const { return is_.Peek4(); } + + // wrapper for AutoUTFInputStream + UTFType GetType() const { return is_.GetType(); } + bool HasBOM() const { return is_.HasBOM(); } + +protected: + InputStream& is_; +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +CEREAL_RAPIDJSON_DIAG_POP +#endif + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { CEREAL_RAPIDJSON_ASSERT(false); } + void Flush() { CEREAL_RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { CEREAL_RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { CEREAL_RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +CEREAL_RAPIDJSON_NAMESPACE_END + +#endif // CEREAL_RAPIDJSON_STREAM_H_ diff --git a/external/cereal/external/rapidjson/stringbuffer.h b/external/cereal/external/rapidjson/stringbuffer.h new file mode 100644 index 0000000..d010477 --- /dev/null +++ b/external/cereal/external/rapidjson/stringbuffer.h @@ -0,0 +1,121 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_STRINGBUFFER_H_ +#define CEREAL_RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + //! Get the size of string in bytes in the string buffer. + size_t GetSize() const { return stack_.GetSize(); } + + //! Get the length of string in Ch in the string buffer. + size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_STRINGBUFFER_H_ diff --git a/external/cereal/external/rapidjson/writer.h b/external/cereal/external/rapidjson/writer.h new file mode 100644 index 0000000..b8da773 --- /dev/null +++ b/external/cereal/external/rapidjson/writer.h @@ -0,0 +1,709 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef CEREAL_RAPIDJSON_WRITER_H_ +#define CEREAL_RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(CEREAL_RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef CEREAL_RAPIDJSON_SSE42 +#include +#elif defined(CEREAL_RAPIDJSON_SSE2) +#include +#elif defined(CEREAL_RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(padded) +CEREAL_RAPIDJSON_DIAG_OFF(unreachable-code) +CEREAL_RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +CEREAL_RAPIDJSON_DIAG_PUSH +CEREAL_RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +CEREAL_RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup CEREAL_RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS +#define CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + +#if CEREAL_RAPIDJSON_HAS_CXX11_RVALUE_REFS + Writer(Writer&& rhs) : + os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { + rhs.os_ = 0; + } +#endif + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + CEREAL_RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + CEREAL_RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if CEREAL_RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) + { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + CEREAL_RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object + CEREAL_RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object + CEREAL_RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + CEREAL_RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + CEREAL_RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + CEREAL_RAPIDJSON_ASSERT(json != 0); + Prefix(type); + return EndValue(WriteRawValue(json, length)); + } + + //! Flush the output stream. + /*! + Allows the user to flush the output stream immediately. + */ + void Flush() { + os_->Flush(); + } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (CEREAL_RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + CEREAL_RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && CEREAL_RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (CEREAL_RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + GenericStringStream is(json); + while (CEREAL_RAPIDJSON_LIKELY(is.Tell() < length)) { + CEREAL_RAPIDJSON_ASSERT(is.Peek() != '\0'); + if (CEREAL_RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (CEREAL_RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + CEREAL_RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + CEREAL_RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (CEREAL_RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (CEREAL_RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(CEREAL_RAPIDJSON_SSE2) || defined(CEREAL_RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); + + if (!CEREAL_RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (CEREAL_RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); +} +#elif defined(CEREAL_RAPIDJSON_NEON) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); + + if (!CEREAL_RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (; p != endAligned; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(reinterpret_cast(x), 0); // extract + uint64_t high = vgetq_lane_u64(reinterpret_cast(x), 1); // extract + + SizeType len = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + unsigned lz = (unsigned)__builtin_clzll(high); + len = 8 + (lz >> 3); + escaped = true; + } + } else { + unsigned lz = (unsigned)__builtin_clzll(low); + len = lz >> 3; + escaped = true; + } + if (CEREAL_RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return CEREAL_RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // CEREAL_RAPIDJSON_NEON + +CEREAL_RAPIDJSON_NAMESPACE_END + +#if defined(_MSC_VER) || defined(__clang__) +CEREAL_RAPIDJSON_DIAG_POP +#endif + +#endif // CEREAL_RAPIDJSON_CEREAL_RAPIDJSON_H_ diff --git a/external/cereal/external/rapidxml/license.txt b/external/cereal/external/rapidxml/license.txt new file mode 100644 index 0000000..1409831 --- /dev/null +++ b/external/cereal/external/rapidxml/license.txt @@ -0,0 +1,52 @@ +Use of this software is granted under one of the following two licenses, +to be chosen freely by the user. + +1. Boost Software License - Version 1.0 - August 17th, 2003 +=============================================================================== + +Copyright (c) 2006, 2007 Marcin Kalicinski + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +2. The MIT License +=============================================================================== + +Copyright (c) 2006, 2007 Marcin Kalicinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/external/cereal/external/rapidxml/manual.html b/external/cereal/external/rapidxml/manual.html new file mode 100644 index 0000000..2c42270 --- /dev/null +++ b/external/cereal/external/rapidxml/manual.html @@ -0,0 +1,406 @@ +

RAPIDXML Manual

Version 1.13

Copyright (C) 2006, 2009 Marcin Kalicinski
See accompanying file
license.txt for license information.

Table of Contents

1. What is RapidXml?
1.1 Dependencies And Compatibility
1.2 Character Types And Encodings
1.3 Error Handling
1.4 Memory Allocation
1.5 W3C Compliance
1.6 API Design
1.7 Reliability
1.8 Acknowledgements
2. Two Minute Tutorial
2.1 Parsing
2.2 Accessing The DOM Tree
2.3 Modifying The DOM Tree
2.4 Printing XML
3. Differences From Regular XML Parsers
3.1 Lifetime Of Source Text
3.2 Ownership Of Strings
3.3 Destructive Vs Non-Destructive Mode
4. Performance
4.1 Comparison With Other Parsers
5. Reference

1. What is RapidXml?

RapidXml is an attempt to create the fastest XML DOM parser possible, while retaining useability, portability and reasonable W3C compatibility. It is an in-situ parser written in C++, with parsing speed approaching that of strlen() function executed on the same data.

+ Entire parser is contained in a single header file, so no building or linking is neccesary. To use it you just need to copy rapidxml.hpp file to a convenient place (such as your project directory), and include it where needed. You may also want to use printing functions contained in header rapidxml_print.hpp.

1.1 Dependencies And Compatibility

RapidXml has no dependencies other than a very small subset of standard C++ library (<cassert>, <cstdlib>, <new> and <exception>, unless exceptions are disabled). It should compile on any reasonably conformant compiler, and was tested on Visual C++ 2003, Visual C++ 2005, Visual C++ 2008, gcc 3, gcc 4, and Comeau 4.3.3. Care was taken that no warnings are produced on these compilers, even with highest warning levels enabled.

1.2 Character Types And Encodings

RapidXml is character type agnostic, and can work both with narrow and wide characters. Current version does not fully support UTF-16 or UTF-32, so use of wide characters is somewhat incapacitated. However, it should succesfully parse wchar_t strings containing UTF-16 or UTF-32 if endianness of the data matches that of the machine. UTF-8 is fully supported, including all numeric character references, which are expanded into appropriate UTF-8 byte sequences (unless you enable parse_no_utf8 flag).

+ Note that RapidXml performs no decoding - strings returned by name() and value() functions will contain text encoded using the same encoding as source file. Rapidxml understands and expands the following character references: &apos; &amp; &quot; &lt; &gt; &#...; Other character references are not expanded.

1.3 Error Handling

By default, RapidXml uses C++ exceptions to report errors. If this behaviour is undesirable, RAPIDXML_NO_EXCEPTIONS can be defined to suppress exception code. See parse_error class and parse_error_handler() function for more information.

1.4 Memory Allocation

RapidXml uses a special memory pool object to allocate nodes and attributes, because direct allocation using new operator would be far too slow. Underlying memory allocations performed by the pool can be customized by use of memory_pool::set_allocator() function. See class memory_pool for more information.

1.5 W3C Compliance

RapidXml is not a W3C compliant parser, primarily because it ignores DOCTYPE declarations. There is a number of other, minor incompatibilities as well. Still, it can successfully parse and produce complete trees of all valid XML files in W3C conformance suite (over 1000 files specially designed to find flaws in XML processors). In destructive mode it performs whitespace normalization and character entity substitution for a small set of built-in entities.

1.6 API Design

RapidXml API is minimalistic, to reduce code size as much as possible, and facilitate use in embedded environments. Additional convenience functions are provided in separate headers: rapidxml_utils.hpp and rapidxml_print.hpp. Contents of these headers is not an essential part of the library, and is currently not documented (otherwise than with comments in code).

1.7 Reliability

RapidXml is very robust and comes with a large harness of unit tests. Special care has been taken to ensure stability of the parser no matter what source text is thrown at it. One of the unit tests produces 100,000 randomly corrupted variants of XML document, which (when uncorrupted) contains all constructs recognized by RapidXml. RapidXml passes this test when it correctly recognizes that errors have been introduced, and does not crash or loop indefinitely.

+ Another unit test puts RapidXml head-to-head with another, well estabilished XML parser, and verifies that their outputs match across a wide variety of small and large documents.

+ Yet another test feeds RapidXml with over 1000 test files from W3C compliance suite, and verifies that correct results are obtained. There are also additional tests that verify each API function separately, and test that various parsing modes work as expected.

1.8 Acknowledgements

I would like to thank Arseny Kapoulkine for his work on pugixml, which was an inspiration for this project. Additional thanks go to Kristen Wegner for creating pugxml, from which pugixml was derived. Janusz Wohlfeil kindly ran RapidXml speed tests on hardware that I did not have access to, allowing me to expand performance comparison table.

2. Two Minute Tutorial

2.1 Parsing

The following code causes RapidXml to parse a zero-terminated string named text:
using namespace rapidxml;
+xml_document<> doc;    // character type defaults to char
+doc.parse<0>(text);    // 0 means default parse flags
+
doc object is now a root of DOM tree containing representation of the parsed XML. Because all RapidXml interface is contained inside namespace rapidxml, users must either bring contents of this namespace into scope, or fully qualify all the names. Class xml_document represents a root of the DOM hierarchy. By means of public inheritance, it is also an xml_node and a memory_pool. Template parameter of xml_document::parse() function is used to specify parsing flags, with which you can fine-tune behaviour of the parser. Note that flags must be a compile-time constant.

2.2 Accessing The DOM Tree

To access the DOM tree, use methods of xml_node and xml_attribute classes:
cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
+xml_node<> *node = doc.first_node("foobar");
+cout << "Node foobar has value " << node->value() << "\n";
+for (xml_attribute<> *attr = node->first_attribute();
+     attr; attr = attr->next_attribute())
+{
+    cout << "Node foobar has attribute " << attr->name() << " ";
+    cout << "with value " << attr->value() << "\n";
+}
+

2.3 Modifying The DOM Tree

DOM tree produced by the parser is fully modifiable. Nodes and attributes can be added/removed, and their contents changed. The below example creates a HTML document, whose sole contents is a link to google.com website:
xml_document<> doc;
+xml_node<> *node = doc.allocate_node(node_element, "a", "Google");
+doc.append_node(node);
+xml_attribute<> *attr = doc.allocate_attribute("href", "google.com");
+node->append_attribute(attr);
+
One quirk is that nodes and attributes do not own the text of their names and values. This is because normally they only store pointers to the source text. So, when assigning a new name or value to the node, care must be taken to ensure proper lifetime of the string. The easiest way to achieve it is to allocate the string from the xml_document memory pool. In the above example this is not necessary, because we are only assigning character constants. But the code below uses memory_pool::allocate_string() function to allocate node name (which will have the same lifetime as the document), and assigns it to a new node:
xml_document<> doc;
+char *node_name = doc.allocate_string(name);        // Allocate string and copy name into it
+xml_node<> *node = doc.allocate_node(node_element, node_name);  // Set node name to node_name
+
Check Reference section for description of the entire interface.

2.4 Printing XML

You can print xml_document and xml_node objects into an XML string. Use print() function or operator <<, which are defined in rapidxml_print.hpp header.
using namespace rapidxml;
+xml_document<> doc;    // character type defaults to char
+// ... some code to fill the document
+
+// Print to stream using operator <<
+std::cout << doc;   
+
+// Print to stream using print function, specifying printing flags
+print(std::cout, doc, 0);   // 0 means default printing flags
+
+// Print to string using output iterator
+std::string s;
+print(std::back_inserter(s), doc, 0);
+
+// Print to memory buffer using output iterator
+char buffer[4096];                      // You are responsible for making the buffer large enough!
+char *end = print(buffer, doc, 0);      // end contains pointer to character after last printed character
+*end = 0;                               // Add string terminator after XML
+

3. Differences From Regular XML Parsers

RapidXml is an in-situ parser, which allows it to achieve very high parsing speed. In-situ means that parser does not make copies of strings. Instead, it places pointers to the source text in the DOM hierarchy.

3.1 Lifetime Of Source Text

In-situ parsing requires that source text lives at least as long as the document object. If source text is destroyed, names and values of nodes in DOM tree will become destroyed as well. Additionally, whitespace processing, character entity translation, and zero-termination of strings require that source text be modified during parsing (but see non-destructive mode). This makes the text useless for further processing once it was parsed by RapidXml.

+ In many cases however, these are not serious issues.

3.2 Ownership Of Strings

Nodes and attributes produced by RapidXml do not own their name and value strings. They merely hold the pointers to them. This means you have to be careful when setting these values manually, by using xml_base::name(const Ch *) or xml_base::value(const Ch *) functions. Care must be taken to ensure that lifetime of the string passed is at least as long as lifetime of the node/attribute. The easiest way to achieve it is to allocate the string from memory_pool owned by the document. Use memory_pool::allocate_string() function for this purpose.

3.3 Destructive Vs Non-Destructive Mode

By default, the parser modifies source text during the parsing process. This is required to achieve character entity translation, whitespace normalization, and zero-termination of strings.

+ In some cases this behaviour may be undesirable, for example if source text resides in read only memory, or is mapped to memory directly from file. By using appropriate parser flags (parse_non_destructive), source text modifications can be disabled. However, because RapidXml does in-situ parsing, it obviously has the following side-effects:

4. Performance

RapidXml achieves its speed through use of several techniques:
  • In-situ parsing. When building DOM tree, RapidXml does not make copies of string data, such as node names and values. Instead, it stores pointers to interior of the source text.
  • Use of template metaprogramming techniques. This allows it to move much of the work to compile time. Through magic of the templates, C++ compiler generates a separate copy of parsing code for any combination of parser flags you use. In each copy, all possible decisions are made at compile time and all unused code is omitted.
  • Extensive use of lookup tables for parsing.
  • Hand-tuned C++ with profiling done on several most popular CPUs.
This results in a very small and fast code: a parser which is custom tailored to exact needs with each invocation.

4.1 Comparison With Other Parsers

The table below compares speed of RapidXml to some other parsers, and to strlen() function executed on the same data. On a modern CPU (as of 2007), you can expect parsing throughput to be close to 1 GB/s. As a rule of thumb, parsing speed is about 50-100x faster than Xerces DOM, 30-60x faster than TinyXml, 3-12x faster than pugxml, and about 5% - 30% faster than pugixml, the fastest XML parser I know of.
  • The test file is a real-world, 50kB large, moderately dense XML file.
  • All timing is done by using RDTSC instruction present in Pentium-compatible CPUs.
  • No profile-guided optimizations are used.
  • All parsers are running in their fastest modes.
  • The results are given in CPU cycles per character, so frequency of CPUs is irrelevant.
  • The results are minimum values from a large number of runs, to minimize effects of operating system activity, task switching, interrupt handling etc.
  • A single parse of the test file takes about 1/10th of a millisecond, so with large number of runs there is a good chance of hitting at least one no-interrupt streak, and obtaining undisturbed results.
Platform
Compiler
strlen() RapidXml pugixml 0.3 pugxml TinyXml
Pentium 4
MSVC 8.0
2.5
5.4
7.0
61.7
298.8
Pentium 4
gcc 4.1.1
0.8
6.1
9.5
67.0
413.2
Core 2
MSVC 8.0
1.0
4.5
5.0
24.6
154.8
Core 2
gcc 4.1.1
0.6
4.6
5.4
28.3
229.3
Athlon XP
MSVC 8.0
3.1
7.7
8.0
25.5
182.6
Athlon XP
gcc 4.1.1
0.9
8.2
9.2
33.7
265.2
Pentium 3
MSVC 8.0
2.0
6.3
7.0
30.9
211.9
Pentium 3
gcc 4.1.1
1.0
6.7
8.9
35.3
316.0
(*) All results are in CPU cycles per character of source text

5. Reference

This section lists all classes, functions, constants etc. and describes them in detail.
class + template + rapidxml::memory_pool
+ constructor + memory_pool()
+ destructor + ~memory_pool()
function allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)
function allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)
function allocate_string(const Ch *source=0, std::size_t size=0)
function clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0)
function clear()
function set_allocator(alloc_func *af, free_func *ff)

class rapidxml::parse_error
+ constructor + parse_error(const char *what, void *where)
function what() const
function where() const

class + template + rapidxml::xml_attribute
+ constructor + xml_attribute()
function document() const
function previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const

class + template + rapidxml::xml_base
+ constructor + xml_base()
function name() const
function name_size() const
function value() const
function value_size() const
function name(const Ch *name, std::size_t size)
function name(const Ch *name)
function value(const Ch *value, std::size_t size)
function value(const Ch *value)
function parent() const

class + template + rapidxml::xml_document
+ constructor + xml_document()
function parse(Ch *text)
function clear()

class + template + rapidxml::xml_node
+ constructor + xml_node(node_type type)
function type() const
function document() const
function first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function type(node_type type)
function prepend_node(xml_node< Ch > *child)
function append_node(xml_node< Ch > *child)
function insert_node(xml_node< Ch > *where, xml_node< Ch > *child)
function remove_first_node()
function remove_last_node()
function remove_node(xml_node< Ch > *where)
function remove_all_nodes()
function prepend_attribute(xml_attribute< Ch > *attribute)
function append_attribute(xml_attribute< Ch > *attribute)
function insert_attribute(xml_attribute< Ch > *where, xml_attribute< Ch > *attribute)
function remove_first_attribute()
function remove_last_attribute()
function remove_attribute(xml_attribute< Ch > *where)
function remove_all_attributes()

namespace rapidxml
enum node_type
function parse_error_handler(const char *what, void *where)
function print(OutIt out, const xml_node< Ch > &node, int flags=0)
function print(std::basic_ostream< Ch > &out, const xml_node< Ch > &node, int flags=0)
function operator<<(std::basic_ostream< Ch > &out, const xml_node< Ch > &node)
+ constant + parse_no_data_nodes
+ constant + parse_no_element_values
+ constant + parse_no_string_terminators
+ constant + parse_no_entity_translation
+ constant + parse_no_utf8
+ constant + parse_declaration_node
+ constant + parse_comment_nodes
+ constant + parse_doctype_node
+ constant + parse_pi_nodes
+ constant + parse_validate_closing_tags
+ constant + parse_trim_whitespace
+ constant + parse_normalize_whitespace
+ constant + parse_default
+ constant + parse_non_destructive
+ constant + parse_fastest
+ constant + parse_full
+ constant + print_no_indenting


class + template + rapidxml::memory_pool

+ + Defined in rapidxml.hpp
+ Base class for + xml_document

Description

This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. In most cases, you will not need to use this class directly. However, if you need to create nodes manually or modify names/values of nodes, you are encouraged to use memory_pool of relevant xml_document to allocate the memory. Not only is this faster than allocating them by using new operator, but also their lifetime will be tied to the lifetime of document, possibly simplyfing memory management.

+ Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. You can also call allocate_string() function to allocate strings. Such strings can then be used as names or values of nodes without worrying about their lifetime. Note that there is no free() function -- all allocations are freed at once when clear() function is called, or when the pool is destroyed.

+ It is also possible to create a standalone memory_pool, and use it to allocate nodes, whose lifetime will not be tied to any document.

+ Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. Until static memory is exhausted, no dynamic memory allocations are done. When static memory is exhausted, pool allocates additional blocks of memory of size RAPIDXML_DYNAMIC_POOL_SIZE each, by using global new[] and delete[] operators. This behaviour can be changed by setting custom allocation routines. Use set_allocator() function to set them.

+ Allocations for nodes, attributes and strings are aligned at RAPIDXML_ALIGNMENT bytes. This value defaults to the size of pointer on target architecture.

+ To obtain absolutely top performance from the parser, it is important that all nodes are allocated from a single, contiguous block of memory. Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. If required, you can tweak RAPIDXML_STATIC_POOL_SIZE, RAPIDXML_DYNAMIC_POOL_SIZE and RAPIDXML_ALIGNMENT to obtain best wasted memory to performance compromise. To do it, define their values before rapidxml.hpp file is included.

Parameters

Ch
Character type of created nodes.

+ constructor + memory_pool::memory_pool

Synopsis

memory_pool(); +

Description

Constructs empty pool with default allocator functions.

+ destructor + memory_pool::~memory_pool

Synopsis

~memory_pool(); +

Description

Destroys pool and frees all the memory. This causes memory occupied by nodes allocated by the pool to be freed. Nodes allocated from the pool are no longer valid.

function memory_pool::allocate_node

Synopsis

xml_node<Ch>* allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0); +

Description

Allocates a new node from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

type
Type of node to create.
name
Name to assign to the node, or 0 to assign no name.
value
Value to assign to the node, or 0 to assign no value.
name_size
Size of name to assign, or 0 to automatically calculate size from name string.
value_size
Size of value to assign, or 0 to automatically calculate size from value string.

Returns

Pointer to allocated node. This pointer will never be NULL.

function memory_pool::allocate_attribute

Synopsis

xml_attribute<Ch>* allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0); +

Description

Allocates a new attribute from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

name
Name to assign to the attribute, or 0 to assign no name.
value
Value to assign to the attribute, or 0 to assign no value.
name_size
Size of name to assign, or 0 to automatically calculate size from name string.
value_size
Size of value to assign, or 0 to automatically calculate size from value string.

Returns

Pointer to allocated attribute. This pointer will never be NULL.

function memory_pool::allocate_string

Synopsis

Ch* allocate_string(const Ch *source=0, std::size_t size=0); +

Description

Allocates a char array of given size from the pool, and optionally copies a given string to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

source
String to initialize the allocated memory with, or 0 to not initialize it.
size
Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated.

Returns

Pointer to allocated char array. This pointer will never be NULL.

function memory_pool::clone_node

Synopsis

xml_node<Ch>* clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0); +

Description

Clones an xml_node and its hierarchy of child nodes and attributes. Nodes and attributes are allocated from this memory pool. Names and values are not cloned, they are shared between the clone and the source. Result node can be optionally specified as a second parameter, in which case its contents will be replaced with cloned source node. This is useful when you want to clone entire document.

Parameters

source
Node to clone.
result
Node to put results in, or 0 to automatically allocate result node

Returns

Pointer to cloned node. This pointer will never be NULL.

function memory_pool::clear

Synopsis

void clear(); +

Description

Clears the pool. This causes memory occupied by nodes allocated by the pool to be freed. Any nodes or strings allocated from the pool will no longer be valid.

function memory_pool::set_allocator

Synopsis

void set_allocator(alloc_func *af, free_func *ff); +

Description

Sets or resets the user-defined memory allocation functions for the pool. This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. Allocation function must not return invalid pointer on failure. It should either throw, stop the program, or use longjmp() function to pass control to other place of program. If it returns invalid pointer, results are undefined.

+ User defined allocation functions must have the following forms:

+void *allocate(std::size_t size);
+void free(void *pointer);

Parameters

af
Allocation function, or 0 to restore default function
ff
Free function, or 0 to restore default function

class rapidxml::parse_error

+ + Defined in rapidxml.hpp

Description

Parse error exception. This exception is thrown by the parser when an error occurs. Use what() function to get human-readable error message. Use where() function to get a pointer to position within source text where error was detected.

+ If throwing exceptions by the parser is undesirable, it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. This function must be defined by the user.

+ This class derives from std::exception class.

+ constructor + parse_error::parse_error

Synopsis

parse_error(const char *what, void *where); +

Description

Constructs parse error.

function parse_error::what

Synopsis

virtual const char* what() const; +

Description

Gets human readable description of error.

Returns

Pointer to null terminated description of the error.

function parse_error::where

Synopsis

Ch* where() const; +

Description

Gets pointer to character data where error happened. Ch should be the same as char type of xml_document that produced the error.

Returns

Pointer to location within the parsed string where error occured.

class + template + rapidxml::xml_attribute

+ + Defined in rapidxml.hpp
+ Inherits from + xml_base

Description

Class representing attribute node of XML document. Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). Note that after parse, both name and value of attribute will point to interior of source text used for parsing. Thus, this text must persist in memory for the lifetime of attribute.

Parameters

Ch
Character type to use.

+ constructor + xml_attribute::xml_attribute

Synopsis

xml_attribute(); +

Description

Constructs an empty attribute with the specified type. Consider using memory_pool of appropriate xml_document if allocating attributes manually.

function xml_attribute::document

Synopsis

xml_document<Ch>* document() const; +

Description

Gets document of which attribute is a child.

Returns

Pointer to document that contains this attribute, or 0 if there is no parent document.

function xml_attribute::previous_attribute

Synopsis

xml_attribute<Ch>* previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets previous attribute, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_attribute::next_attribute

Synopsis

xml_attribute<Ch>* next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets next attribute, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

class + template + rapidxml::xml_base

+ + Defined in rapidxml.hpp
+ Base class for + xml_attribute xml_node

Description

Base class for xml_node and xml_attribute implementing common functions: name(), name_size(), value(), value_size() and parent().

Parameters

Ch
Character type to use

+ constructor + xml_base::xml_base

Synopsis

xml_base(); +

function xml_base::name

Synopsis

Ch* name() const; +

Description

Gets name of the node. Interpretation of name depends on type of node. Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.

+ Use name_size() function to determine length of the name.

Returns

Name of node, or empty string if node has no name.

function xml_base::name_size

Synopsis

std::size_t name_size() const; +

Description

Gets size of node name, not including terminator character. This function works correctly irrespective of whether name is or is not zero terminated.

Returns

Size of node name, in characters.

function xml_base::value

Synopsis

Ch* value() const; +

Description

Gets value of node. Interpretation of value depends on type of node. Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.

+ Use value_size() function to determine length of the value.

Returns

Value of node, or empty string if node has no value.

function xml_base::value_size

Synopsis

std::size_t value_size() const; +

Description

Gets size of node value, not including terminator character. This function works correctly irrespective of whether value is or is not zero terminated.

Returns

Size of node value, in characters.

function xml_base::name

Synopsis

void name(const Ch *name, std::size_t size); +

Description

Sets name of node to a non zero-terminated string. See Ownership Of Strings .

+ Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use memory_pool of the document to allocate the string - on destruction of the document the string will be automatically freed.

+ Size of name must be specified separately, because name does not have to be zero terminated. Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated).

Parameters

name
Name of node to set. Does not have to be zero terminated.
size
Size of name, in characters. This does not include zero terminator, if one is present.

function xml_base::name

Synopsis

void name(const Ch *name); +

Description

Sets name of node to a zero-terminated string. See also Ownership Of Strings and xml_node::name(const Ch *, std::size_t).

Parameters

name
Name of node to set. Must be zero terminated.

function xml_base::value

Synopsis

void value(const Ch *value, std::size_t size); +

Description

Sets value of node to a non zero-terminated string. See Ownership Of Strings .

+ Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use memory_pool of the document to allocate the string - on destruction of the document the string will be automatically freed.

+ Size of value must be specified separately, because it does not have to be zero terminated. Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated).

+ If an element has a child node of type node_data, it will take precedence over element value when printing. If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser.

Parameters

value
value of node to set. Does not have to be zero terminated.
size
Size of value, in characters. This does not include zero terminator, if one is present.

function xml_base::value

Synopsis

void value(const Ch *value); +

Description

Sets value of node to a zero-terminated string. See also Ownership Of Strings and xml_node::value(const Ch *, std::size_t).

Parameters

value
Vame of node to set. Must be zero terminated.

function xml_base::parent

Synopsis

xml_node<Ch>* parent() const; +

Description

Gets node parent.

Returns

Pointer to parent node, or 0 if there is no parent.

class + template + rapidxml::xml_document

+ + Defined in rapidxml.hpp
+ Inherits from + xml_node memory_pool

Description

This class represents root of the DOM hierarchy. It is also an xml_node and a memory_pool through public inheritance. Use parse() function to build a DOM tree from a zero-terminated XML text string. parse() function allocates memory for nodes and attributes by using functions of xml_document, which are inherited from memory_pool. To access root node of the document, use the document itself, as if it was an xml_node.

Parameters

Ch
Character type to use.

+ constructor + xml_document::xml_document

Synopsis

xml_document(); +

Description

Constructs empty XML document.

function xml_document::parse

Synopsis

void parse(Ch *text); +

Description

Parses zero-terminated XML string according to given flags. Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. The string must persist for the lifetime of the document. In case of error, rapidxml::parse_error exception will be thrown.

+ If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. Make sure that data is zero-terminated.

+ Document can be parsed into multiple times. Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool.

Parameters

text
XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser.

function xml_document::clear

Synopsis

void clear(); +

Description

Clears the document by deleting all nodes and clearing the memory pool. All nodes owned by document pool are destroyed.

class + template + rapidxml::xml_node

+ + Defined in rapidxml.hpp
+ Inherits from + xml_base
+ Base class for + xml_document

Description

Class representing a node of XML document. Each node may have associated name and value strings, which are available through name() and value() functions. Interpretation of name and value depends on type of the node. Type of node can be determined by using type() function.

+ Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. Thus, this text must persist in the memory for the lifetime of node.

Parameters

Ch
Character type to use.

+ constructor + xml_node::xml_node

Synopsis

xml_node(node_type type); +

Description

Constructs an empty node with the specified type. Consider using memory_pool of appropriate document to allocate nodes manually.

Parameters

type
Type of node to construct.

function xml_node::type

Synopsis

node_type type() const; +

Description

Gets type of node.

Returns

Type of node.

function xml_node::document

Synopsis

xml_document<Ch>* document() const; +

Description

Gets document of which node is a child.

Returns

Pointer to document that contains this node, or 0 if there is no parent document.

function xml_node::first_node

Synopsis

xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets first child node, optionally matching node name.

Parameters

name
Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found child, or 0 if not found.

function xml_node::last_node

Synopsis

xml_node<Ch>* last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets last child node, optionally matching node name. Behaviour is undefined if node has no children. Use first_node() to test if node has children.

Parameters

name
Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found child, or 0 if not found.

function xml_node::previous_sibling

Synopsis

xml_node<Ch>* previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets previous sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use parent() to test if node has a parent.

Parameters

name
Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found sibling, or 0 if not found.

function xml_node::next_sibling

Synopsis

xml_node<Ch>* next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets next sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use parent() to test if node has a parent.

Parameters

name
Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found sibling, or 0 if not found.

function xml_node::first_attribute

Synopsis

xml_attribute<Ch>* first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets first attribute of node, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_node::last_attribute

Synopsis

xml_attribute<Ch>* last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets last attribute of node, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_node::type

Synopsis

void type(node_type type); +

Description

Sets type of node.

Parameters

type
Type of node to set.

function xml_node::prepend_node

Synopsis

void prepend_node(xml_node< Ch > *child); +

Description

Prepends a new child node. The prepended child becomes the first child, and all existing children are moved one position back.

Parameters

child
Node to prepend.

function xml_node::append_node

Synopsis

void append_node(xml_node< Ch > *child); +

Description

Appends a new child node. The appended child becomes the last child.

Parameters

child
Node to append.

function xml_node::insert_node

Synopsis

void insert_node(xml_node< Ch > *where, xml_node< Ch > *child); +

Description

Inserts a new child node at specified place inside the node. All children after and including the specified node are moved one position back.

Parameters

where
Place where to insert the child, or 0 to insert at the back.
child
Node to insert.

function xml_node::remove_first_node

Synopsis

void remove_first_node(); +

Description

Removes first child node. If node has no children, behaviour is undefined. Use first_node() to test if node has children.

function xml_node::remove_last_node

Synopsis

void remove_last_node(); +

Description

Removes last child of the node. If node has no children, behaviour is undefined. Use first_node() to test if node has children.

function xml_node::remove_node

Synopsis

void remove_node(xml_node< Ch > *where); +

Description

Removes specified child from the node.

function xml_node::remove_all_nodes

Synopsis

void remove_all_nodes(); +

Description

Removes all child nodes (but not attributes).

function xml_node::prepend_attribute

Synopsis

void prepend_attribute(xml_attribute< Ch > *attribute); +

Description

Prepends a new attribute to the node.

Parameters

attribute
Attribute to prepend.

function xml_node::append_attribute

Synopsis

void append_attribute(xml_attribute< Ch > *attribute); +

Description

Appends a new attribute to the node.

Parameters

attribute
Attribute to append.

function xml_node::insert_attribute

Synopsis

void insert_attribute(xml_attribute< Ch > *where, xml_attribute< Ch > *attribute); +

Description

Inserts a new attribute at specified place inside the node. All attributes after and including the specified attribute are moved one position back.

Parameters

where
Place where to insert the attribute, or 0 to insert at the back.
attribute
Attribute to insert.

function xml_node::remove_first_attribute

Synopsis

void remove_first_attribute(); +

Description

Removes first attribute of the node. If node has no attributes, behaviour is undefined. Use first_attribute() to test if node has attributes.

function xml_node::remove_last_attribute

Synopsis

void remove_last_attribute(); +

Description

Removes last attribute of the node. If node has no attributes, behaviour is undefined. Use first_attribute() to test if node has attributes.

function xml_node::remove_attribute

Synopsis

void remove_attribute(xml_attribute< Ch > *where); +

Description

Removes specified attribute from node.

Parameters

where
Pointer to attribute to be removed.

function xml_node::remove_all_attributes

Synopsis

void remove_all_attributes(); +

Description

Removes all attributes of node.

enum node_type

Description

Enumeration listing all node types produced by the parser. Use xml_node::type() function to query node type.

Values

node_document
A document node. Name and value are empty.
node_element
An element node. Name contains element name. Value contains text of first data node.
node_data
A data node. Name is empty. Value contains data text.
node_cdata
A CDATA node. Name is empty. Value contains data text.
node_comment
A comment node. Name is empty. Value contains comment text.
node_declaration
A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.
node_doctype
A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
node_pi
A PI node. Name contains target. Value contains instructions.

function parse_error_handler

Synopsis

void rapidxml::parse_error_handler(const char *what, void *where); +

Description

When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function is called to notify user about the error. It must be defined by the user.

+ This function cannot return. If it does, the results are undefined.

+ A very simple definition might look like that: + void rapidxml::parse_error_handler(const char *what, void *where) + { + std::cout << "Parse error: " << what << "\n"; + std::abort(); + } +

Parameters

what
Human readable description of the error.
where
Pointer to character data where error was detected.

function print

Synopsis

OutIt rapidxml::print(OutIt out, const xml_node< Ch > &node, int flags=0); +

Description

Prints XML to given output iterator.

Parameters

out
Output iterator to print to.
node
Node to be printed. Pass xml_document to print entire document.
flags
Flags controlling how XML is printed.

Returns

Output iterator pointing to position immediately after last character of printed text.

function print

Synopsis

std::basic_ostream<Ch>& rapidxml::print(std::basic_ostream< Ch > &out, const xml_node< Ch > &node, int flags=0); +

Description

Prints XML to given output stream.

Parameters

out
Output stream to print to.
node
Node to be printed. Pass xml_document to print entire document.
flags
Flags controlling how XML is printed.

Returns

Output stream.

function operator<<

Synopsis

std::basic_ostream<Ch>& rapidxml::operator<<(std::basic_ostream< Ch > &out, const xml_node< Ch > &node); +

Description

Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.

Parameters

out
Output stream to print to.
node
Node to be printed.

Returns

Output stream.

+ constant + parse_no_data_nodes

Synopsis

const int parse_no_data_nodes + = 0x1; +

Description

Parse flag instructing the parser to not create data nodes. Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_element_values

Synopsis

const int parse_no_element_values + = 0x2; +

Description

Parse flag instructing the parser to not use text of first data node as a value of parent element. Can be combined with other flags by use of | operator. Note that child data nodes of element node take precendence over its value when printing. That is, if element has one or more child data nodes and a value, the value will be ignored. Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements.

+ See xml_document::parse() function.

+ constant + parse_no_string_terminators

Synopsis

const int parse_no_string_terminators + = 0x4; +

Description

Parse flag instructing the parser to not place zero terminators after strings in the source text. By default zero terminators are placed, modifying source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_entity_translation

Synopsis

const int parse_no_entity_translation + = 0x8; +

Description

Parse flag instructing the parser to not translate entities in the source text. By default entities are translated, modifying source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_utf8

Synopsis

const int parse_no_utf8 + = 0x10; +

Description

Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. By default, UTF-8 handling is enabled. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_declaration_node

Synopsis

const int parse_declaration_node + = 0x20; +

Description

Parse flag instructing the parser to create XML declaration node. By default, declaration node is not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_comment_nodes

Synopsis

const int parse_comment_nodes + = 0x40; +

Description

Parse flag instructing the parser to create comments nodes. By default, comment nodes are not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_doctype_node

Synopsis

const int parse_doctype_node + = 0x80; +

Description

Parse flag instructing the parser to create DOCTYPE node. By default, doctype node is not created. Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_pi_nodes

Synopsis

const int parse_pi_nodes + = 0x100; +

Description

Parse flag instructing the parser to create PI nodes. By default, PI nodes are not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_validate_closing_tags

Synopsis

const int parse_validate_closing_tags + = 0x200; +

Description

Parse flag instructing the parser to validate closing tag names. If not set, name inside closing tag is irrelevant to the parser. By default, closing tags are not validated. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_trim_whitespace

Synopsis

const int parse_trim_whitespace + = 0x400; +

Description

Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. By default, whitespace is not trimmed. This flag does not cause the parser to modify source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_normalize_whitespace

Synopsis

const int parse_normalize_whitespace + = 0x800; +

Description

Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. By default, whitespace is not normalized. If this flag is specified, source text will be modified. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_default

Synopsis

const int parse_default + = 0; +

Description

Parse flags which represent default behaviour of the parser. This is always equal to 0, so that all other flags can be simply ored together. Normally there is no need to inconveniently disable flags by anding with their negated (~) values. This also means that meaning of each flag is a negation of the default setting. For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, and using the flag will disable it.

+ See xml_document::parse() function.

+ constant + parse_non_destructive

Synopsis

const int parse_non_destructive + = parse_no_string_terminators | parse_no_entity_translation; +

Description

A combination of parse flags that forbids any modifications of the source text. This also results in faster parsing. However, note that the following will occur:
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • entities will not be translated
  • whitespace will not be normalized
+See xml_document::parse() function.

+ constant + parse_fastest

Synopsis

const int parse_fastest + = parse_non_destructive | parse_no_data_nodes; +

Description

A combination of parse flags resulting in fastest possible parsing, without sacrificing important data.

+ See xml_document::parse() function.

+ constant + parse_full

Synopsis

const int parse_full + = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; +

Description

A combination of parse flags resulting in largest amount of data being extracted. This usually results in slowest parsing.

+ See xml_document::parse() function.

+ constant + print_no_indenting

Synopsis

const int print_no_indenting + = 0x1; +

Description

Printer flag instructing the printer to suppress indenting of XML. See print() function.

\ No newline at end of file diff --git a/external/cereal/external/rapidxml/rapidxml.hpp b/external/cereal/external/rapidxml/rapidxml.hpp new file mode 100644 index 0000000..d82893a --- /dev/null +++ b/external/cereal/external/rapidxml/rapidxml.hpp @@ -0,0 +1,2624 @@ +#ifndef CEREAL_RAPIDXML_HPP_INCLUDED +#define CEREAL_RAPIDXML_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ + +// If standard library is disabled, user must provide implementations of required functions and typedefs +#if !defined(CEREAL_RAPIDXML_NO_STDLIB) + #include // For std::size_t + #include // For assert + #include // For placement new +#endif + +// On MSVC, disable "conditional expression is constant" warning (level 4). +// This warning is almost impossible to avoid with certain types of templated code +#ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable:4127) // Conditional expression is constant + #pragma warning(disable:4100) // unreferenced formal parameter +#endif + +/////////////////////////////////////////////////////////////////////////// +// CEREAL_RAPIDXML_PARSE_ERROR + +#if defined(CEREAL_RAPIDXML_NO_EXCEPTIONS) + +#define CEREAL_RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); } + +namespace cereal { +namespace rapidxml +{ + //! When exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, + //! this function is called to notify user about the error. + //! It must be defined by the user. + //!

+ //! This function cannot return. If it does, the results are undefined. + //!

+ //! A very simple definition might look like that: + //!

+    //! void %rapidxml::%parse_error_handler(const char *what, void *where)
+    //! {
+    //!     std::cout << "Parse error: " << what << "\n";
+    //!     std::abort();
+    //! }
+    //! 
+ //! \param what Human readable description of the error. + //! \param where Pointer to character data where error was detected. + void parse_error_handler(const char *what, void *where); +} +} // end namespace cereal + +#else + +#include // For std::exception + +#define CEREAL_RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where) + +namespace cereal { +namespace rapidxml +{ + + //! Parse error exception. + //! This exception is thrown by the parser when an error occurs. + //! Use what() function to get human-readable error message. + //! Use where() function to get a pointer to position within source text where error was detected. + //!

+ //! If throwing exceptions by the parser is undesirable, + //! it can be disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. + //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. + //! This function must be defined by the user. + //!

+ //! This class derives from std::exception class. + class parse_error: public std::exception + { + + public: + + //! Constructs parse error + parse_error(const char *what_, void *where_) + : m_what(what_) + , m_where(where_) + { + } + + //! Gets human readable description of error. + //! \return Pointer to null terminated description of the error. + virtual const char *what() const CEREAL_NOEXCEPT override + { + return m_what; + } + + //! Gets pointer to character data where error happened. + //! Ch should be the same as char type of xml_document that produced the error. + //! \return Pointer to location within the parsed string where error occured. + template + Ch *where() const + { + return reinterpret_cast(m_where); + } + + private: + + const char *m_what; + void *m_where; + + }; +} +} // end namespace cereal + +#endif + +/////////////////////////////////////////////////////////////////////////// +// Pool sizes + +#ifndef CEREAL_RAPIDXML_STATIC_POOL_SIZE + // Size of static memory block of memory_pool. + // Define CEREAL_RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // No dynamic memory allocations are performed by memory_pool until static memory is exhausted. + #define CEREAL_RAPIDXML_STATIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE + // Size of dynamic memory block of memory_pool. + // Define CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool. + #define CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef CEREAL_RAPIDXML_ALIGNMENT + // Memory allocation alignment. + // Define CEREAL_RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer. + // All memory allocations for nodes, attributes and strings will be aligned to this value. + // This must be a power of 2 and at least 1, otherwise memory_pool will not work. + #define CEREAL_RAPIDXML_ALIGNMENT sizeof(void *) +#endif + +namespace cereal { +namespace rapidxml +{ + // Forward declarations + template class xml_node; + template class xml_attribute; + template class xml_document; + + //! Enumeration listing all node types produced by the parser. + //! Use xml_node::type() function to query node type. + enum node_type + { + node_document, //!< A document node. Name and value are empty. + node_element, //!< An element node. Name contains element name. Value contains text of first data node. + node_data, //!< A data node. Name is empty. Value contains data text. + node_cdata, //!< A CDATA node. Name is empty. Value contains data text. + node_comment, //!< A comment node. Name is empty. Value contains comment text. + node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes. + node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text. + node_pi //!< A PI node. Name contains target. Value contains instructions. + }; + + /////////////////////////////////////////////////////////////////////// + // Parsing flags + + //! Parse flag instructing the parser to not create data nodes. + //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_data_nodes = 0x1; + + //! Parse flag instructing the parser to not use text of first data node as a value of parent element. + //! Can be combined with other flags by use of | operator. + //! Note that child data nodes of element node take precendence over its value when printing. + //! That is, if element has one or more child data nodes and a value, the value will be ignored. + //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements. + //!

+ //! See xml_document::parse() function. + const int parse_no_element_values = 0x2; + + //! Parse flag instructing the parser to not place zero terminators after strings in the source text. + //! By default zero terminators are placed, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_string_terminators = 0x4; + + //! Parse flag instructing the parser to not translate entities in the source text. + //! By default entities are translated, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_entity_translation = 0x8; + + //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. + //! By default, UTF-8 handling is enabled. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_utf8 = 0x10; + + //! Parse flag instructing the parser to create XML declaration node. + //! By default, declaration node is not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_declaration_node = 0x20; + + //! Parse flag instructing the parser to create comments nodes. + //! By default, comment nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_comment_nodes = 0x40; + + //! Parse flag instructing the parser to create DOCTYPE node. + //! By default, doctype node is not created. + //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_doctype_node = 0x80; + + //! Parse flag instructing the parser to create PI nodes. + //! By default, PI nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_pi_nodes = 0x100; + + //! Parse flag instructing the parser to validate closing tag names. + //! If not set, name inside closing tag is irrelevant to the parser. + //! By default, closing tags are not validated. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_validate_closing_tags = 0x200; + + //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. + //! By default, whitespace is not trimmed. + //! This flag does not cause the parser to modify source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_trim_whitespace = 0x400; + + //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. + //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. + //! By default, whitespace is not normalized. + //! If this flag is specified, source text will be modified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_normalize_whitespace = 0x800; + + // Compound flags + + //! Parse flags which represent default behaviour of the parser. + //! This is always equal to 0, so that all other flags can be simply ored together. + //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values. + //! This also means that meaning of each flag is a negation of the default setting. + //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, + //! and using the flag will disable it. + //!

+ //! See xml_document::parse() function. + const int parse_default = 0; + + //! A combination of parse flags that forbids any modifications of the source text. + //! This also results in faster parsing. However, note that the following will occur: + //!
    + //!
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • + //!
  • entities will not be translated
  • + //!
  • whitespace will not be normalized
  • + //!
+ //! See xml_document::parse() function. + const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation; + + //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data. + //!

+ //! See xml_document::parse() function. + const int parse_fastest = parse_non_destructive | parse_no_data_nodes; + + //! A combination of parse flags resulting in largest amount of data being extracted. + //! This usually results in slowest parsing. + //!

+ //! See xml_document::parse() function. + const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; + + /////////////////////////////////////////////////////////////////////// + // Internals + + //! \cond internal + namespace internal + { + + // Struct that contains lookup tables for the parser + // It must be a template to allow correct linking (because it has static data members, which are defined in a header file). + template + struct lookup_tables + { + static const unsigned char lookup_whitespace[256]; // Whitespace table + static const unsigned char lookup_node_name[256]; // Node name table + static const unsigned char lookup_text[256]; // Text table + static const unsigned char lookup_text_pure_no_ws[256]; // Text table + static const unsigned char lookup_text_pure_with_ws[256]; // Text table + static const unsigned char lookup_attribute_name[256]; // Attribute name table + static const unsigned char lookup_attribute_data_1[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_1_pure[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_2[256]; // Attribute data table with double quotes + static const unsigned char lookup_attribute_data_2_pure[256]; // Attribute data table with double quotes + static const unsigned char lookup_digits[256]; // Digits + static const unsigned char lookup_upcase[256]; // To uppercase conversion table for ASCII characters + }; + + // Find length of the string + template + inline std::size_t measure(const Ch *p) + { + const Ch *tmp = p; + while (*tmp) + ++tmp; + return static_cast(tmp - p); + } + + // Compare strings for equality + template + inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive) + { + if (size1 != size2) + return false; + if (case_sensitive) + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (*p1 != *p2) + return false; + } + else + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (lookup_tables<0>::lookup_upcase[static_cast(*p1)] != lookup_tables<0>::lookup_upcase[static_cast(*p2)]) + return false; + } + return true; + } + + template + inline bool preserve_space(xml_node* node) + { + const Ch preserve_value[] = { Ch('p'), Ch('r'), Ch('e'), Ch('s'), Ch('e'), Ch('r'), Ch('v'), Ch('e') }; + const xml_attribute* space = node->first_attribute("xml:space"); + return space && internal::compare(space->value(), space->value_size(), preserve_value, sizeof(preserve_value) / sizeof(Ch), true); + } + } + //! \endcond + + /////////////////////////////////////////////////////////////////////// + // Memory pool + + //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. + //! In most cases, you will not need to use this class directly. + //! However, if you need to create nodes manually or modify names/values of nodes, + //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory. + //! Not only is this faster than allocating them by using new operator, + //! but also their lifetime will be tied to the lifetime of document, + //! possibly simplyfing memory management. + //!

+ //! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. + //! You can also call allocate_string() function to allocate strings. + //! Such strings can then be used as names or values of nodes without worrying about their lifetime. + //! Note that there is no free() function -- all allocations are freed at once when clear() function is called, + //! or when the pool is destroyed. + //!

+ //! It is also possible to create a standalone memory_pool, and use it + //! to allocate nodes, whose lifetime will not be tied to any document. + //!

+ //! Pool maintains CEREAL_RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. + //! Until static memory is exhausted, no dynamic memory allocations are done. + //! When static memory is exhausted, pool allocates additional blocks of memory of size CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE each, + //! by using global new[] and delete[] operators. + //! This behaviour can be changed by setting custom allocation routines. + //! Use set_allocator() function to set them. + //!

+ //! Allocations for nodes, attributes and strings are aligned at CEREAL_RAPIDXML_ALIGNMENT bytes. + //! This value defaults to the size of pointer on target architecture. + //!

+ //! To obtain absolutely top performance from the parser, + //! it is important that all nodes are allocated from a single, contiguous block of memory. + //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. + //! If required, you can tweak CEREAL_RAPIDXML_STATIC_POOL_SIZE, CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE and CEREAL_RAPIDXML_ALIGNMENT + //! to obtain best wasted memory to performance compromise. + //! To do it, define their values before rapidxml.hpp file is included. + //! \tparam Ch Character type of created nodes. + template + class memory_pool + { + + public: + + //! \cond internal + typedef void *(alloc_func)(std::size_t); // Type of user-defined function used to allocate memory + typedef void (free_func)(void *); // Type of user-defined function used to free memory + //! \endcond + + //! Constructs empty pool with default allocator functions. + memory_pool() + : m_alloc_func(0) + , m_free_func(0) + { + init(); + } + + //! Destroys pool and frees all the memory. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Nodes allocated from the pool are no longer valid. + ~memory_pool() + { + clear(); + } + + //! Allocates a new node from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param type Type of node to create. + //! \param name Name to assign to the node, or 0 to assign no name. + //! \param value Value to assign to the node, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated node. This pointer will never be NULL. + xml_node *allocate_node(node_type type, + const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_node)); + xml_node *node = new(memory) xml_node(type); + if (name) + { + if (name_size > 0) + node->name(name, name_size); + else + node->name(name); + } + if (value) + { + if (value_size > 0) + node->value(value, value_size); + else + node->value(value); + } + return node; + } + + //! Allocates a new attribute from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param name Name to assign to the attribute, or 0 to assign no name. + //! \param value Value to assign to the attribute, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated attribute. This pointer will never be NULL. + xml_attribute *allocate_attribute(const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_attribute)); + xml_attribute *attribute = new(memory) xml_attribute; + if (name) + { + if (name_size > 0) + attribute->name(name, name_size); + else + attribute->name(name); + } + if (value) + { + if (value_size > 0) + attribute->value(value, value_size); + else + attribute->value(value); + } + return attribute; + } + + //! Allocates a char array of given size from the pool, and optionally copies a given string to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining CEREAL_RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param source String to initialize the allocated memory with, or 0 to not initialize it. + //! \param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated. + //! \return Pointer to allocated char array. This pointer will never be NULL. + Ch *allocate_string(const Ch *source = 0, std::size_t size = 0) + { + assert(source || size); // Either source or size (or both) must be specified + if (size == 0) + size = internal::measure(source) + 1; + Ch *result = static_cast(allocate_aligned(size * sizeof(Ch))); + if (source) + for (std::size_t i = 0; i < size; ++i) + result[i] = source[i]; + return result; + } + + //! Clones an xml_node and its hierarchy of child nodes and attributes. + //! Nodes and attributes are allocated from this memory pool. + //! Names and values are not cloned, they are shared between the clone and the source. + //! Result node can be optionally specified as a second parameter, + //! in which case its contents will be replaced with cloned source node. + //! This is useful when you want to clone entire document. + //! \param source Node to clone. + //! \param result Node to put results in, or 0 to automatically allocate result node + //! \return Pointer to cloned node. This pointer will never be NULL. + xml_node *clone_node(const xml_node *source, xml_node *result = 0) + { + // Prepare result node + if (result) + { + result->remove_all_attributes(); + result->remove_all_nodes(); + result->type(source->type()); + } + else + result = allocate_node(source->type()); + + // Clone name and value + result->name(source->name(), source->name_size()); + result->value(source->value(), source->value_size()); + + // Clone child nodes and attributes + for (xml_node *child = source->first_node(); child; child = child->next_sibling()) + result->append_node(clone_node(child)); + for (xml_attribute *attr = source->first_attribute(); attr; attr = attr->next_attribute()) + result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size())); + + return result; + } + + //! Clears the pool. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Any nodes or strings allocated from the pool will no longer be valid. + void clear() + { + while (m_begin != m_static_memory) + { + char *previous_begin = reinterpret_cast
(align(m_begin))->previous_begin; + if (m_free_func) + m_free_func(m_begin); + else + delete[] m_begin; + m_begin = previous_begin; + } + init(); + } + + //! Sets or resets the user-defined memory allocation functions for the pool. + //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. + //! Allocation function must not return invalid pointer on failure. It should either throw, + //! stop the program, or use longjmp() function to pass control to other place of program. + //! If it returns invalid pointer, results are undefined. + //!

+ //! User defined allocation functions must have the following forms: + //!
+ //!
void *allocate(std::size_t size); + //!
void free(void *pointer); + //!

+ //! \param af Allocation function, or 0 to restore default function + //! \param ff Free function, or 0 to restore default function + void set_allocator(alloc_func *af, free_func *ff) + { + assert(m_begin == m_static_memory && m_ptr == align(m_begin)); // Verify that no memory is allocated yet + m_alloc_func = af; + m_free_func = ff; + } + + private: + + struct header + { + char *previous_begin; + }; + + void init() + { + m_begin = m_static_memory; + m_ptr = align(m_begin); + m_end = m_static_memory + sizeof(m_static_memory); + } + + char *align(char *ptr) + { + std::size_t alignment = ((CEREAL_RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (CEREAL_RAPIDXML_ALIGNMENT - 1))) & (CEREAL_RAPIDXML_ALIGNMENT - 1)); + return ptr + alignment; + } + + char *allocate_raw(std::size_t size) + { + // Allocate + void *memory; + if (m_alloc_func) // Allocate memory using either user-specified allocation function or global operator new[] + { + memory = m_alloc_func(size); + assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp + } + else + { + memory = new char[size]; +#ifdef CEREAL_RAPIDXML_NO_EXCEPTIONS + if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc + CEREAL_RAPIDXML_PARSE_ERROR("out of memory", 0); +#endif + } + return static_cast(memory); + } + + void *allocate_aligned(std::size_t size) + { + // Calculate aligned pointer + char *result = align(m_ptr); + + // If not enough memory left in current pool, allocate a new pool + if (result + size > m_end) + { + // Calculate required pool size (may be bigger than CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE) + std::size_t pool_size = CEREAL_RAPIDXML_DYNAMIC_POOL_SIZE; + if (pool_size < size) + pool_size = size; + + // Allocate + std::size_t alloc_size = sizeof(header) + (2 * CEREAL_RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation + char *raw_memory = allocate_raw(alloc_size); + + // Setup new pool in allocated memory + char *pool = align(raw_memory); + header *new_header = reinterpret_cast
(pool); + new_header->previous_begin = m_begin; + m_begin = raw_memory; + m_ptr = pool + sizeof(header); + m_end = raw_memory + alloc_size; + + // Calculate aligned pointer again using new pool + result = align(m_ptr); + } + + // Update pool and return aligned pointer + m_ptr = result + size; + return result; + } + + char *m_begin; // Start of raw memory making up current pool + char *m_ptr; // First free byte in current pool + char *m_end; // One past last available byte in current pool + char m_static_memory[CEREAL_RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory + alloc_func *m_alloc_func; // Allocator function, or 0 if default is to be used + free_func *m_free_func; // Free function, or 0 if default is to be used + }; + + /////////////////////////////////////////////////////////////////////////// + // XML base + + //! Base class for xml_node and xml_attribute implementing common functions: + //! name(), name_size(), value(), value_size() and parent(). + //! \tparam Ch Character type to use + template + class xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + // Construct a base with empty name, value and parent + xml_base() + : m_name(0) + , m_value(0) + , m_parent(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets name of the node. + //! Interpretation of name depends on type of node. + //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use name_size() function to determine length of the name. + //! \return Name of node, or empty string if node has no name. + Ch *name() const + { + return m_name ? m_name : nullstr(); + } + + //! Gets size of node name, not including terminator character. + //! This function works correctly irrespective of whether name is or is not zero terminated. + //! \return Size of node name, in characters. + std::size_t name_size() const + { + return m_name ? m_name_size : 0; + } + + //! Gets value of node. + //! Interpretation of value depends on type of node. + //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use value_size() function to determine length of the value. + //! \return Value of node, or empty string if node has no value. + Ch *value() const + { + return m_value ? m_value : nullstr(); + } + + //! Gets size of node value, not including terminator character. + //! This function works correctly irrespective of whether value is or is not zero terminated. + //! \return Size of node value, in characters. + std::size_t value_size() const + { + return m_value ? m_value_size : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets name of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of name must be specified separately, because name does not have to be zero terminated. + //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //! \param name_ Name of node to set. Does not have to be zero terminated. + //! \param size Size of name, in characters. This does not include zero terminator, if one is present. + void name(const Ch *name_, std::size_t size) + { + m_name = const_cast(name_); + m_name_size = size; + } + + //! Sets name of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t). + //! \param name_ Name of node to set. Must be zero terminated. + void name(const Ch *name_) + { + this->name(name_, internal::measure(name_)); + } + + //! Sets value of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of value must be specified separately, because it does not have to be zero terminated. + //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //!

+ //! If an element has a child node of type node_data, it will take precedence over element value when printing. + //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser. + //! \param value_ value of node to set. Does not have to be zero terminated. + //! \param size Size of value, in characters. This does not include zero terminator, if one is present. + void value(const Ch *value_, std::size_t size) + { + m_value = const_cast(value_); + m_value_size = size; + } + + //! Sets value of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t). + //! \param value_ Vame of node to set. Must be zero terminated. + void value(const Ch *value_) + { + this->value(value_, internal::measure(value_)); + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets node parent. + //! \return Pointer to parent node, or 0 if there is no parent. + xml_node *parent() const + { + return m_parent; + } + + protected: + + // Return empty string + static Ch *nullstr() + { + static Ch zero = Ch('\0'); + return &zero; + } + + Ch *m_name; // Name of node, or 0 if no name + Ch *m_value; // Value of node, or 0 if no value + std::size_t m_name_size; // Length of node name, or undefined of no name + std::size_t m_value_size; // Length of node value, or undefined if no value + xml_node *m_parent; // Pointer to parent node, or 0 if none + + }; + + //! Class representing attribute node of XML document. + //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). + //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing. + //! Thus, this text must persist in memory for the lifetime of attribute. + //! \tparam Ch Character type to use. + template + class xml_attribute: public xml_base + { + + friend class xml_node; + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty attribute with the specified type. + //! Consider using memory_pool of appropriate xml_document if allocating attributes manually. + xml_attribute() + { + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which attribute is a child. + //! \return Pointer to document that contains this attribute, or 0 if there is no parent document. + xml_document *document() const + { + if (xml_node *node = this->parent()) + { + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + else + return 0; + } + + //! Gets previous attribute, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_prev_attribute : 0; + } + + //! Gets next attribute, optionally matching attribute name. + //! \param name_ Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *next_attribute(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const + { + if (name_) + { + if (name_size_ == 0) + name_size_ = internal::measure(name_); + for (xml_attribute *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name_, name_size_, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_next_attribute : 0; + } + + private: + + xml_attribute *m_prev_attribute; // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero + xml_attribute *m_next_attribute; // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML node + + //! Class representing a node of XML document. + //! Each node may have associated name and value strings, which are available through name() and value() functions. + //! Interpretation of name and value depends on type of the node. + //! Type of node can be determined by using type() function. + //!

+ //! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. + //! Thus, this text must persist in the memory for the lifetime of node. + //! \tparam Ch Character type to use. + template + class xml_node: public xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty node with the specified type. + //! Consider using memory_pool of appropriate document to allocate nodes manually. + //! \param type_ Type of node to construct. + xml_node(node_type type_) + : m_type(type_) + , m_first_node(0) + , m_first_attribute(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets type of node. + //! \return Type of node. + node_type type() const + { + return m_type; + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which node is a child. + //! \return Pointer to document that contains this node, or 0 if there is no parent document. + xml_document *document() const + { + xml_node *node = const_cast *>(this); + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + + //! Gets first child node, optionally matching node name. + //! \param name_ Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *first_node(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const + { + if (name_) + { + if (name_size_ == 0) + name_size_ = internal::measure(name_); + for (xml_node *child = m_first_node; child; child = child->next_sibling()) + if (internal::compare(child->name(), child->name_size(), name_, name_size_, case_sensitive)) + return child; + return 0; + } + else + return m_first_node; + } + + //! Gets last child node, optionally matching node name. + //! Behaviour is undefined if node has no children. + //! Use first_node() to test if node has children. + //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(m_first_node); // Cannot query for last child if node has no children + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *child = m_last_node; child; child = child->previous_sibling()) + if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) + return child; + return 0; + } + else + return m_last_node; + } + + //! Gets previous sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) + return sibling; + return 0; + } + else + return m_prev_sibling; + } + + //! Gets next sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name_ Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *next_sibling(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name_) + { + if (name_size_ == 0) + name_size_ = internal::measure(name_); + for (xml_node *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name_, name_size_, case_sensitive)) + return sibling; + return 0; + } + else + return m_next_sibling; + } + + //! Gets first attribute of node, optionally matching attribute name. + //! \param name_ Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size_ Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *first_attribute(const Ch *name_ = 0, std::size_t name_size_ = 0, bool case_sensitive = true) const + { + if (name_) + { + if (name_size_ == 0) + name_size_ = internal::measure(name_); + for (xml_attribute *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name_, name_size_, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute; + } + + //! Gets last attribute of node, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute ? m_last_attribute : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets type of node. + //! \param type_ Type of node to set. + void type(node_type type_) + { + m_type = type_; + } + + /////////////////////////////////////////////////////////////////////////// + // Node manipulation + + //! Prepends a new child node. + //! The prepended child becomes the first child, and all existing children are moved one position back. + //! \param child Node to prepend. + void prepend_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_next_sibling = m_first_node; + m_first_node->m_prev_sibling = child; + } + else + { + child->m_next_sibling = 0; + m_last_node = child; + } + m_first_node = child; + child->m_parent = this; + child->m_prev_sibling = 0; + } + + //! Appends a new child node. + //! The appended child becomes the last child. + //! \param child Node to append. + void append_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_prev_sibling = m_last_node; + m_last_node->m_next_sibling = child; + } + else + { + child->m_prev_sibling = 0; + m_first_node = child; + } + m_last_node = child; + child->m_parent = this; + child->m_next_sibling = 0; + } + + //! Inserts a new child node at specified place inside the node. + //! All children after and including the specified node are moved one position back. + //! \param where Place where to insert the child, or 0 to insert at the back. + //! \param child Node to insert. + void insert_node(xml_node *where, xml_node *child) + { + assert(!where || where->parent() == this); + assert(child && !child->parent() && child->type() != node_document); + if (where == m_first_node) + prepend_node(child); + else if (where == 0) + append_node(child); + else + { + child->m_prev_sibling = where->m_prev_sibling; + child->m_next_sibling = where; + where->m_prev_sibling->m_next_sibling = child; + where->m_prev_sibling = child; + child->m_parent = this; + } + } + + //! Removes first child node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_first_node() + { + assert(first_node()); + xml_node *child = m_first_node; + m_first_node = child->m_next_sibling; + if (child->m_next_sibling) + child->m_next_sibling->m_prev_sibling = 0; + else + m_last_node = 0; + child->m_parent = 0; + } + + //! Removes last child of the node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_last_node() + { + assert(first_node()); + xml_node *child = m_last_node; + if (child->m_prev_sibling) + { + m_last_node = child->m_prev_sibling; + child->m_prev_sibling->m_next_sibling = 0; + } + else + m_first_node = 0; + child->m_parent = 0; + } + + //! Removes specified child from the node + // \param where Pointer to child to be removed. + void remove_node(xml_node *where) + { + assert(where && where->parent() == this); + assert(first_node()); + if (where == m_first_node) + remove_first_node(); + else if (where == m_last_node) + remove_last_node(); + else + { + where->m_prev_sibling->m_next_sibling = where->m_next_sibling; + where->m_next_sibling->m_prev_sibling = where->m_prev_sibling; + where->m_parent = 0; + } + } + + //! Removes all child nodes (but not attributes). + void remove_all_nodes() + { + for (xml_node *node = first_node(); node; node = node->m_next_sibling) + node->m_parent = 0; + m_first_node = 0; + } + + //! Prepends a new attribute to the node. + //! \param attribute Attribute to prepend. + void prepend_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_next_attribute = m_first_attribute; + m_first_attribute->m_prev_attribute = attribute; + } + else + { + attribute->m_next_attribute = 0; + m_last_attribute = attribute; + } + m_first_attribute = attribute; + attribute->m_parent = this; + attribute->m_prev_attribute = 0; + } + + //! Appends a new attribute to the node. + //! \param attribute Attribute to append. + void append_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_prev_attribute = m_last_attribute; + m_last_attribute->m_next_attribute = attribute; + } + else + { + attribute->m_prev_attribute = 0; + m_first_attribute = attribute; + } + m_last_attribute = attribute; + attribute->m_parent = this; + attribute->m_next_attribute = 0; + } + + //! Inserts a new attribute at specified place inside the node. + //! All attributes after and including the specified attribute are moved one position back. + //! \param where Place where to insert the attribute, or 0 to insert at the back. + //! \param attribute Attribute to insert. + void insert_attribute(xml_attribute *where, xml_attribute *attribute) + { + assert(!where || where->parent() == this); + assert(attribute && !attribute->parent()); + if (where == m_first_attribute) + prepend_attribute(attribute); + else if (where == 0) + append_attribute(attribute); + else + { + attribute->m_prev_attribute = where->m_prev_attribute; + attribute->m_next_attribute = where; + where->m_prev_attribute->m_next_attribute = attribute; + where->m_prev_attribute = attribute; + attribute->m_parent = this; + } + } + + //! Removes first attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_first_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_first_attribute; + if (attribute->m_next_attribute) + { + attribute->m_next_attribute->m_prev_attribute = 0; + } + else + m_last_attribute = 0; + attribute->m_parent = 0; + m_first_attribute = attribute->m_next_attribute; + } + + //! Removes last attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_last_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_last_attribute; + if (attribute->m_prev_attribute) + { + attribute->m_prev_attribute->m_next_attribute = 0; + m_last_attribute = attribute->m_prev_attribute; + } + else + m_first_attribute = 0; + attribute->m_parent = 0; + } + + //! Removes specified attribute from node. + //! \param where Pointer to attribute to be removed. + void remove_attribute(xml_attribute *where) + { + assert(first_attribute() && where->parent() == this); + if (where == m_first_attribute) + remove_first_attribute(); + else if (where == m_last_attribute) + remove_last_attribute(); + else + { + where->m_prev_attribute->m_next_attribute = where->m_next_attribute; + where->m_next_attribute->m_prev_attribute = where->m_prev_attribute; + where->m_parent = 0; + } + } + + //! Removes all attributes of node. + void remove_all_attributes() + { + for (xml_attribute *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute) + attribute->m_parent = 0; + m_first_attribute = 0; + } + + private: + + /////////////////////////////////////////////////////////////////////////// + // Restrictions + + // No copying + xml_node(const xml_node &); + void operator =(const xml_node &); + + /////////////////////////////////////////////////////////////////////////// + // Data members + + // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0. + // This is required for maximum performance, as it allows the parser to omit initialization of + // unneded/redundant values. + // + // The rules are as follows: + // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively + // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage + // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage + + node_type m_type; // Type of node; always valid + xml_node *m_first_node; // Pointer to first child node, or 0 if none; always valid + xml_node *m_last_node; // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero + xml_attribute *m_first_attribute; // Pointer to first attribute of node, or 0 if none; always valid + xml_attribute *m_last_attribute; // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero + xml_node *m_prev_sibling; // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + xml_node *m_next_sibling; // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML document + + //! This class represents root of the DOM hierarchy. + //! It is also an xml_node and a memory_pool through public inheritance. + //! Use parse() function to build a DOM tree from a zero-terminated XML text string. + //! parse() function allocates memory for nodes and attributes by using functions of xml_document, + //! which are inherited from memory_pool. + //! To access root node of the document, use the document itself, as if it was an xml_node. + //! \tparam Ch Character type to use. + template + class xml_document: public xml_node, public memory_pool + { + + public: + + //! Constructs empty XML document + xml_document() + : xml_node(node_document) + { + } + + //! Parses zero-terminated XML string according to given flags. + //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. + //! The string must persist for the lifetime of the document. + //! In case of error, rapidxml::parse_error exception will be thrown. + //!

+ //! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. + //! Make sure that data is zero-terminated. + //!

+ //! Document can be parsed into multiple times. + //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool. + //! \param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser. + template + void parse(Ch *text) + { + assert(text); + + // Remove current contents + this->remove_all_nodes(); + this->remove_all_attributes(); + + // Parse BOM, if any + parse_bom(text); + + // Parse children + while (1) + { + // Skip whitespace before node + skip(text); + if (*text == 0) + break; + + // Parse and append new child + if (*text == Ch('<')) + { + ++text; // Skip '<' + if (xml_node *node = parse_node(text)) + this->append_node(node); + } + else + CEREAL_RAPIDXML_PARSE_ERROR("expected <", text); + } + + } + + //! Clears the document by deleting all nodes and clearing the memory pool. + //! All nodes owned by document pool are destroyed. + void clear() + { + this->remove_all_nodes(); + this->remove_all_attributes(); + memory_pool::clear(); + } + + private: + + /////////////////////////////////////////////////////////////////////// + // Internal character utility functions + + // Detect whitespace character + struct whitespace_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_whitespace[static_cast(ch)]; + } + }; + + // Detect node name character + struct node_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_node_name[static_cast(ch)]; + } + }; + + // Detect attribute name character + struct attribute_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_attribute_name[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) + struct text_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_no_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_with_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast(ch)]; + } + }; + + // Detect attribute value character + template + struct attribute_value_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Detect attribute value character + template + struct attribute_value_pure_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Insert coded character, using UTF8 or 8-bit ASCII + template + static void insert_coded_character(Ch *&text, unsigned long code) + { + if (Flags & parse_no_utf8) + { + // Insert 8-bit ASCII character + // Todo: possibly verify that code is less than 256 and use replacement char otherwise? + text[0] = static_cast(code); + text += 1; + } + else + { + // Insert UTF8 sequence + if (code < 0x80) // 1 byte sequence + { + text[0] = static_cast(code); + text += 1; + } + else if (code < 0x800) // 2 byte sequence + { + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xC0); + text += 2; + } + else if (code < 0x10000) // 3 byte sequence + { + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xE0); + text += 3; + } + else if (code < 0x110000) // 4 byte sequence + { + text[3] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xF0); + text += 4; + } + else // Invalid, only codes up to 0x10FFFF are allowed in Unicode + { + CEREAL_RAPIDXML_PARSE_ERROR("invalid numeric character entity", text); + } + } + } + + // Skip characters until predicate evaluates to true + template + static void skip(Ch *&text) + { + Ch *tmp = text; + while (StopPred::test(*tmp)) + ++tmp; + text = tmp; + } + + // Skip characters until predicate evaluates to true while doing the following: + // - replacing XML character entity references with proper characters (' & " < > &#...;) + // - condensing whitespace sequences to single space character + template + static Ch *skip_and_expand_character_refs(Ch *&text, bool preserve_space) + { + // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip + if (Flags & parse_no_entity_translation && + !(Flags & parse_normalize_whitespace) && + !(Flags & parse_trim_whitespace)) + { + skip(text); + return text; + } + + // Use simple skip until first modification is detected + skip(text); + + // Use translation skip + Ch *src = text; + Ch *dest = src; + while (StopPred::test(*src)) + { + // If entity translation is enabled + if (!(Flags & parse_no_entity_translation)) + { + // Test if replacement is needed + if (src[0] == Ch('&')) + { + switch (src[1]) + { + + // & ' + case Ch('a'): + if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';')) + { + *dest = Ch('&'); + ++dest; + src += 5; + continue; + } + if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';')) + { + *dest = Ch('\''); + ++dest; + src += 6; + continue; + } + break; + + // " + case Ch('q'): + if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';')) + { + *dest = Ch('"'); + ++dest; + src += 6; + continue; + } + break; + + // > + case Ch('g'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('>'); + ++dest; + src += 4; + continue; + } + break; + + // < + case Ch('l'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('<'); + ++dest; + src += 4; + continue; + } + break; + + // &#...; - assumes ASCII + case Ch('#'): + if (src[2] == Ch('x')) + { + unsigned long code = 0; + src += 3; // Skip &#x + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 16 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + else + { + unsigned long code = 0; + src += 2; // Skip &# + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 10 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + if (*src == Ch(';')) + ++src; + else + CEREAL_RAPIDXML_PARSE_ERROR("expected ;", src); + continue; + + // Something else + default: + // Ignore, just copy '&' verbatim + break; + + } + } + } + + // If whitespace condensing is enabled + if ((Flags & parse_normalize_whitespace) && !preserve_space) + { + // Test if condensing is needed + if (whitespace_pred::test(*src)) + { + *dest = Ch(' '); ++dest; // Put single space in dest + ++src; // Skip first whitespace char + // Skip remaining whitespace chars + while (whitespace_pred::test(*src)) + ++src; + continue; + } + } + + // No replacement, only copy character + *dest++ = *src++; + + } + + // Return new end + text = src; + return dest; + + } + + /////////////////////////////////////////////////////////////////////// + // Internal parsing functions + + // Parse BOM, if any + template + void parse_bom(Ch *&text) + { + // UTF-8? + if (static_cast(text[0]) == 0xEF && + static_cast(text[1]) == 0xBB && + static_cast(text[2]) == 0xBF) + { + text += 3; // Skup utf-8 bom + } + } + + // Parse XML declaration ( + xml_node *parse_xml_declaration(Ch *&text) + { + // If parsing of declaration is disabled + if (!(Flags & parse_declaration_node)) + { + // Skip until end of declaration + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (!text[0]) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + + // Create declaration + xml_node *declaration = this->allocate_node(node_declaration); + + // Skip whitespace before attributes or ?> + skip(text); + + // Parse declaration attributes + parse_node_attributes(text, declaration); + + // Skip ?> + if (text[0] != Ch('?') || text[1] != Ch('>')) + CEREAL_RAPIDXML_PARSE_ERROR("expected ?>", text); + text += 2; + + return declaration; + } + + // Parse XML comment (' + return 0; // Do not produce comment node + } + + // Remember value start + Ch *value_ = text; + + // Skip until end of comment + while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>')) + { + if (!text[0]) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create comment node + xml_node *comment = this->allocate_node(node_comment); + comment->value(value_, static_cast(text - value_)); + + // Place zero terminator after comment value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip '-->' + return comment; + } + + // Parse DOCTYPE + template + xml_node *parse_doctype(Ch *&text) + { + // Remember value start + Ch *value_ = text; + + // Skip to > + while (*text != Ch('>')) + { + // Determine character type + switch (*text) + { + + // If '[' encountered, scan for matching ending ']' using naive algorithm with depth + // This works for all W3C test files except for 2 most wicked + case Ch('['): + { + ++text; // Skip '[' + int depth = 1; + while (depth > 0) + { + switch (*text) + { + case Ch('['): ++depth; break; + case Ch(']'): --depth; break; + case 0: CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + } + ++text; + } + break; + } + + // Error on end of text + case Ch('\0'): + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Other character, skip it + default: + ++text; + + } + } + + // If DOCTYPE nodes enabled + if (Flags & parse_doctype_node) + { + // Create a new doctype node + xml_node *doctype = this->allocate_node(node_doctype); + doctype->value(value_, static_cast(text - value_)); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 1; // skip '>' + return doctype; + } + else + { + text += 1; // skip '>' + return 0; + } + + } + + // Parse PI + template + xml_node *parse_pi(Ch *&text) + { + // If creation of PI nodes is enabled + if (Flags & parse_pi_nodes) + { + // Create pi node + xml_node *pi = this->allocate_node(node_pi); + + // Extract PI target name + Ch *name_ = text; + skip(text); + if (text == name_) + CEREAL_RAPIDXML_PARSE_ERROR("expected PI target", text); + pi->name(name_, static_cast(text - name_)); + + // Skip whitespace between pi target and pi + skip(text); + + // Remember start of pi + Ch *value_ = text; + + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Set pi value (verbatim, no entity expansion or whitespace normalization) + pi->value(value_, static_cast(text - value_)); + + // Place zero terminator after name and value + if (!(Flags & parse_no_string_terminators)) + { + pi->name()[pi->name_size()] = Ch('\0'); + pi->value()[pi->value_size()] = Ch('\0'); + } + + text += 2; // Skip '?>' + return pi; + } + else + { + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + } + + // Parse and append data + // Return character that ends data. + // This is necessary because this character might have been overwritten by a terminating 0 + template + Ch parse_and_append_data(xml_node *node, Ch *&text, Ch *contents_start) + { + // Backup to contents start if whitespace trimming is disabled + if (!(Flags & parse_trim_whitespace)) + text = contents_start; + + const bool preserve_space = internal::preserve_space(node); + + // Skip until end of data + Ch *value_ = text, *end; + if ((Flags & parse_normalize_whitespace) && !preserve_space) + end = skip_and_expand_character_refs(text, false); + else + end = skip_and_expand_character_refs(text, preserve_space); + + // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after > + if ((Flags & parse_trim_whitespace) && !preserve_space) + { + if (Flags & parse_normalize_whitespace) + { + // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end + if (*(end - 1) == Ch(' ')) + --end; + } + else + { + // Backup until non-whitespace character is found + while (whitespace_pred::test(*(end - 1))) + --end; + } + } + + // If characters are still left between end and value (this test is only necessary if normalization is enabled) + // Create new data node + if (!(Flags & parse_no_data_nodes)) + { + xml_node *data = this->allocate_node(node_data); + data->value(value_, static_cast(end - value_)); + node->append_node(data); + } + + // Add data to parent node if no data exists yet + if (!(Flags & parse_no_element_values)) + if (*node->value() == Ch('\0')) + node->value(value_, static_cast(end - value_)); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + { + Ch ch = *text; + *end = Ch('\0'); + return ch; // Return character that ends data; this is required because zero terminator overwritten it + } + + // Return character that ends data + return *text; + } + + // Parse CDATA + template + xml_node *parse_cdata(Ch *&text) + { + // If CDATA is disabled + if (Flags & parse_no_data_nodes) + { + // Skip until end of cdata + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 3; // Skip ]]> + return 0; // Do not produce CDATA node + } + + // Skip until end of cdata + Ch *value_ = text; + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create new cdata node + xml_node *cdata = this->allocate_node(node_cdata); + cdata->value(value_, static_cast(text - value_)); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip ]]> + return cdata; + } + + // Parse element node + template + xml_node *parse_element(Ch *&text) + { + // Create element node + xml_node *element = this->allocate_node(node_element); + + // Extract element name + Ch *name_ = text; + skip(text); + if (text == name_) + CEREAL_RAPIDXML_PARSE_ERROR("expected element name", text); + element->name(name_, static_cast(text - name_)); + + // Skip whitespace between element name and attributes or > + skip(text); + + // Parse attributes, if any + parse_node_attributes(text, element); + + // Determine ending type + if (*text == Ch('>')) + { + ++text; + parse_node_contents(text, element); + } + else if (*text == Ch('/')) + { + ++text; + if (*text != Ch('>')) + CEREAL_RAPIDXML_PARSE_ERROR("expected >", text); + ++text; + } + else + CEREAL_RAPIDXML_PARSE_ERROR("expected >", text); + + // Place zero terminator after name + if (!(Flags & parse_no_string_terminators)) + element->name()[element->name_size()] = Ch('\0'); + + // Return parsed element + return element; + } + + // Determine node type, and parse it + template + xml_node *parse_node(Ch *&text) + { + // Parse proper node type + switch (text[0]) + { + + // <... + default: + // Parse and append element node + return parse_element(text); + + // (text); + } + else + { + // Parse PI + return parse_pi(text); + } + + // (text); + } + break; + + // (text); + } + break; + + // (text); + } + + } // switch + + // Attempt to skip other, unrecognized node types starting with ')) + { + if (*text == 0) + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + ++text; // Skip '>' + return 0; // No node recognized + + } + } + + // Parse contents of the node - children, data etc. + template + void parse_node_contents(Ch *&text, xml_node *node) + { + // For all children and text + while (1) + { + // Skip whitespace between > and node contents + Ch *contents_start = text; // Store start of node contents before whitespace is skipped + skip(text); + Ch next_char = *text; + + // After data nodes, instead of continuing the loop, control jumps here. + // This is because zero termination inside parse_and_append_data() function + // would wreak havoc with the above code. + // Also, skipping whitespace after data nodes is unnecessary. + after_data_node: + + // Determine what comes next: node closing, child node, data node, or 0? + switch (next_char) + { + + // Node closing or child node + case Ch('<'): + if (text[1] == Ch('/')) + { + Ch *contents_end = 0; + if (internal::preserve_space(node)) + { + contents_end = text; + } + + // Node closing + text += 2; // Skip '(text); + if (!internal::compare(node->name(), node->name_size(), closing_name, static_cast(text - closing_name), true)) + CEREAL_RAPIDXML_PARSE_ERROR("invalid closing tag name", text); + } + else + { + // No validation, just skip name + skip(text); + } + // Skip remaining whitespace after node name + skip(text); + if (*text != Ch('>')) + CEREAL_RAPIDXML_PARSE_ERROR("expected >", text); + ++text; // Skip '>' + + if (contents_end && contents_end != contents_start) + { + node->value(contents_start, static_cast(contents_end - contents_start)); + node->value()[node->value_size()] = Ch('\0'); + } + return; // Node closed, finished parsing contents + } + else + { + // Child node + ++text; // Skip '<' + if (xml_node *child = parse_node(text)) + node->append_node(child); + } + break; + + // End of data - error + case Ch('\0'): + CEREAL_RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Data node + default: + next_char = parse_and_append_data(node, text, contents_start); + goto after_data_node; // Bypass regular processing after data nodes + + } + } + } + + // Parse XML attributes of the node + template + void parse_node_attributes(Ch *&text, xml_node *node) + { + // For all attributes + while (attribute_name_pred::test(*text)) + { + // Extract attribute name + Ch *name_ = text; + ++text; // Skip first character of attribute name + skip(text); + if (text == name_) + CEREAL_RAPIDXML_PARSE_ERROR("expected attribute name", name_); + + // Create new attribute + xml_attribute *attribute = this->allocate_attribute(); + attribute->name(name_, static_cast(text - name_)); + node->append_attribute(attribute); + + // Skip whitespace after attribute name + skip(text); + + // Skip = + if (*text != Ch('=')) + CEREAL_RAPIDXML_PARSE_ERROR("expected =", text); + ++text; + + // Add terminating zero after name + if (!(Flags & parse_no_string_terminators)) + attribute->name()[attribute->name_size()] = 0; + + // Skip whitespace after = + skip(text); + + // Skip quote and remember if it was ' or " + Ch quote = *text; + if (quote != Ch('\'') && quote != Ch('"')) + CEREAL_RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; + + // Extract attribute value and expand char refs in it + Ch *value_ = text, *end; + const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes + if (quote == Ch('\'')) + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text, false); + else + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text, false); + + // Set attribute value + attribute->value(value_, static_cast(end - value_)); + + // Make sure that end quote is present + if (*text != quote) + CEREAL_RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; // Skip quote + + // Add terminating zero after value + if (!(Flags & parse_no_string_terminators)) + attribute->value()[attribute->value_size()] = 0; + + // Skip whitespace after attribute value + skip(text); + } + } + + }; + + //! \cond internal + namespace internal + { + + // Whitespace (space \n \r \t) + template + const unsigned char lookup_tables::lookup_whitespace[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // F + }; + + // Node name (anything but space \n \r \t / > ? \0) + template + const unsigned char lookup_tables::lookup_node_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) (anything but < \0) + template + const unsigned char lookup_tables::lookup_text[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled + // (anything but < \0 &) + template + const unsigned char lookup_tables::lookup_text_pure_no_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled + // (anything but < \0 & space \n \r \t) + template + const unsigned char lookup_tables::lookup_text_pure_with_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute name (anything but space \n \r \t / < > = ? ! \0) + template + const unsigned char lookup_tables::lookup_attribute_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote (anything but ' \0) + template + const unsigned char lookup_tables::lookup_attribute_data_1[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote that does not require processing (anything but ' \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_1_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote (anything but " \0) + template + const unsigned char lookup_tables::lookup_attribute_data_2[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote that does not require processing (anything but " \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_2_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Digits (dec and hex, 255 denotes end of numeric character reference) + template + const unsigned char lookup_tables::lookup_digits[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 0 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 1 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 2 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,255,255,255,255,255,255, // 3 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 4 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 5 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 6 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 7 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 8 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 9 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // A + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // B + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // C + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // D + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // E + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 // F + }; + + // Upper case conversion + template + const unsigned char lookup_tables::lookup_upcase[256] = + { + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A B C D E F + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 0 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, // 1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 2 + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 3 + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 4 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 5 + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 6 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127, // 7 + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 8 + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 9 + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // A + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // B + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // C + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // D + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // E + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // F + }; + } + //! \endcond + +} +} // end namespace cereal + +// Undefine internal macros +#undef CEREAL_RAPIDXML_PARSE_ERROR + +// On MSVC, restore warnings state +#ifdef _MSC_VER + #pragma warning(pop) +#endif + +#endif diff --git a/external/cereal/external/rapidxml/rapidxml_iterators.hpp b/external/cereal/external/rapidxml/rapidxml_iterators.hpp new file mode 100644 index 0000000..736d46c --- /dev/null +++ b/external/cereal/external/rapidxml/rapidxml_iterators.hpp @@ -0,0 +1,175 @@ +#ifndef CEREAL_RAPIDXML_ITERATORS_HPP_INCLUDED +#define CEREAL_RAPIDXML_ITERATORS_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ + +#include "rapidxml.hpp" + +namespace cereal { +namespace rapidxml +{ + + //! Iterator of child nodes of xml_node + template + class node_iterator + { + + public: + + typedef typename xml_node value_type; + typedef typename xml_node &reference; + typedef typename xml_node *pointer; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; + + node_iterator() + : m_node(0) + { + } + + node_iterator(xml_node *node) + : m_node(node->first_node()) + { + } + + reference operator *() const + { + assert(m_node); + return *m_node; + } + + pointer operator->() const + { + assert(m_node); + return m_node; + } + + node_iterator& operator++() + { + assert(m_node); + m_node = m_node->next_sibling(); + return *this; + } + + node_iterator operator++(int) + { + node_iterator tmp = *this; + ++this; + return tmp; + } + + node_iterator& operator--() + { + assert(m_node && m_node->previous_sibling()); + m_node = m_node->previous_sibling(); + return *this; + } + + node_iterator operator--(int) + { + node_iterator tmp = *this; + ++this; + return tmp; + } + + bool operator ==(const node_iterator &rhs) + { + return m_node == rhs.m_node; + } + + bool operator !=(const node_iterator &rhs) + { + return m_node != rhs.m_node; + } + + private: + + xml_node *m_node; + + }; + + //! Iterator of child attributes of xml_node + template + class attribute_iterator + { + + public: + + typedef typename xml_attribute value_type; + typedef typename xml_attribute &reference; + typedef typename xml_attribute *pointer; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; + + attribute_iterator() + : m_attribute(0) + { + } + + attribute_iterator(xml_node *node) + : m_attribute(node->first_attribute()) + { + } + + reference operator *() const + { + assert(m_attribute); + return *m_attribute; + } + + pointer operator->() const + { + assert(m_attribute); + return m_attribute; + } + + attribute_iterator& operator++() + { + assert(m_attribute); + m_attribute = m_attribute->next_attribute(); + return *this; + } + + attribute_iterator operator++(int) + { + attribute_iterator tmp = *this; + ++this; + return tmp; + } + + attribute_iterator& operator--() + { + assert(m_attribute && m_attribute->previous_attribute()); + m_attribute = m_attribute->previous_attribute(); + return *this; + } + + attribute_iterator operator--(int) + { + attribute_iterator tmp = *this; + ++this; + return tmp; + } + + bool operator ==(const attribute_iterator &rhs) + { + return m_attribute == rhs.m_attribute; + } + + bool operator !=(const attribute_iterator &rhs) + { + return m_attribute != rhs.m_attribute; + } + + private: + + xml_attribute *m_attribute; + + }; + +} +} // namespace cereal + +#endif diff --git a/external/cereal/external/rapidxml/rapidxml_print.hpp b/external/cereal/external/rapidxml/rapidxml_print.hpp new file mode 100644 index 0000000..7fbb962 --- /dev/null +++ b/external/cereal/external/rapidxml/rapidxml_print.hpp @@ -0,0 +1,428 @@ +#ifndef CEREAL_RAPIDXML_PRINT_HPP_INCLUDED +#define CEREAL_RAPIDXML_PRINT_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ + +#include "rapidxml.hpp" + +// Only include streams if not disabled +#ifndef CEREAL_RAPIDXML_NO_STREAMS + #include + #include +#endif + +namespace cereal { +namespace rapidxml +{ + + /////////////////////////////////////////////////////////////////////// + // Printing flags + + const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function. + + /////////////////////////////////////////////////////////////////////// + // Internal + + //! \cond internal + namespace internal + { + + /////////////////////////////////////////////////////////////////////////// + // Internal character operations + + // Copy characters from given range to given output iterator + template + inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) + { + while (begin != end) + *out++ = *begin++; + return out; + } + + // Copy characters from given range to given output iterator and expand + // characters into references (< > ' " &) + template + inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) + { + while (begin != end) + { + if (*begin == noexpand) + { + *out++ = *begin; // No expansion, copy character + } + else + { + switch (*begin) + { + case Ch('<'): + *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('>'): + *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('\''): + *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); + break; + case Ch('"'): + *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('&'): + *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';'); + break; + default: + *out++ = *begin; // No expansion, copy character + } + } + ++begin; // Step to next character + } + return out; + } + + // Fill given output iterator with repetitions of the same character + template + inline OutIt fill_chars(OutIt out, int n, Ch ch) + { + for (int i = 0; i < n; ++i) + *out++ = ch; + return out; + } + + // Find character + template + inline bool find_char(const Ch *begin, const Ch *end) + { + while (begin != end) + if (*begin++ == ch) + return true; + return false; + } + + /////////////////////////////////////////////////////////////////////////// + // Internal printing operations + + // Print node + template + inline OutIt print_node(OutIt out, const xml_node *node, int flags, int indent); + + // Print children of the node + template + inline OutIt print_children(OutIt out, const xml_node *node, int flags, int indent) + { + for (xml_node *child = node->first_node(); child; child = child->next_sibling()) + out = print_node(out, child, flags, indent); + return out; + } + + // Print attributes of the node + template + inline OutIt print_attributes(OutIt out, const xml_node *node, int /*flags*/) + { + for (xml_attribute *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) + { + if (attribute->name() && attribute->value()) + { + // Print attribute name + *out = Ch(' '), ++out; + out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); + *out = Ch('='), ++out; + // Print attribute value using appropriate quote type + if (find_char(attribute->value(), attribute->value() + attribute->value_size())) + { + *out = Ch('\''), ++out; + out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); + *out = Ch('\''), ++out; + } + else + { + *out = Ch('"'), ++out; + out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); + *out = Ch('"'), ++out; + } + } + } + return out; + } + + // Print data node + template + inline OutIt print_data_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_data); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); + return out; + } + + // Print data node + template + inline OutIt print_cdata_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_cdata); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'); ++out; + *out = Ch('!'); ++out; + *out = Ch('['); ++out; + *out = Ch('C'); ++out; + *out = Ch('D'); ++out; + *out = Ch('A'); ++out; + *out = Ch('T'); ++out; + *out = Ch('A'); ++out; + *out = Ch('['); ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch(']'); ++out; + *out = Ch(']'); ++out; + *out = Ch('>'); ++out; + return out; + } + + // Print element node + template + inline OutIt print_element_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_element); + + // Print element name and attributes, if any + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + out = print_attributes(out, node, flags); + + // If node is childless + if (node->value_size() == 0 && !node->first_node()) + { + // Print childless node tag ending + *out = Ch('/'), ++out; + *out = Ch('>'), ++out; + } + else + { + // Print normal node tag ending + *out = Ch('>'), ++out; + + // Test if node contains a single data node only (and no other nodes) + xml_node *child = node->first_node(); + if (!child) + { + // If node has no children, only print its value without indenting + out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); + } + else if (child->next_sibling() == 0 && child->type() == node_data) + { + // If node has a sole data child, only print its value without indenting + out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); + } + else + { + // Print all children with full indenting + if (!(flags & print_no_indenting)) + *out = Ch('\n'), ++out; + out = print_children(out, node, flags, indent + 1); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + } + + // Print node end + *out = Ch('<'), ++out; + *out = Ch('/'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + *out = Ch('>'), ++out; + } + return out; + } + + // Print declaration node + template + inline OutIt print_declaration_node(OutIt out, const xml_node *node, int flags, int indent) + { + // Print declaration start + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('?'), ++out; + *out = Ch('x'), ++out; + *out = Ch('m'), ++out; + *out = Ch('l'), ++out; + + // Print attributes + out = print_attributes(out, node, flags); + + // Print declaration end + *out = Ch('?'), ++out; + *out = Ch('>'), ++out; + + return out; + } + + // Print comment node + template + inline OutIt print_comment_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_comment); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('!'), ++out; + *out = Ch('-'), ++out; + *out = Ch('-'), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('-'), ++out; + *out = Ch('-'), ++out; + *out = Ch('>'), ++out; + return out; + } + + // Print doctype node + template + inline OutIt print_doctype_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_doctype); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('!'), ++out; + *out = Ch('D'), ++out; + *out = Ch('O'), ++out; + *out = Ch('C'), ++out; + *out = Ch('T'), ++out; + *out = Ch('Y'), ++out; + *out = Ch('P'), ++out; + *out = Ch('E'), ++out; + *out = Ch(' '), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('>'), ++out; + return out; + } + + // Print pi node + template + inline OutIt print_pi_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_pi); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('?'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + *out = Ch(' '), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('?'), ++out; + *out = Ch('>'), ++out; + return out; + } + + // Print node + template + inline OutIt print_node(OutIt out, const xml_node *node, int flags, int indent) + { + // Print proper node type + switch (node->type()) + { + + // Document + case node_document: + out = print_children(out, node, flags, indent); + break; + + // Element + case node_element: + out = print_element_node(out, node, flags, indent); + break; + + // Data + case node_data: + out = print_data_node(out, node, flags, indent); + break; + + // CDATA + case node_cdata: + out = print_cdata_node(out, node, flags, indent); + break; + + // Declaration + case node_declaration: + out = print_declaration_node(out, node, flags, indent); + break; + + // Comment + case node_comment: + out = print_comment_node(out, node, flags, indent); + break; + + // Doctype + case node_doctype: + out = print_doctype_node(out, node, flags, indent); + break; + + // Pi + case node_pi: + out = print_pi_node(out, node, flags, indent); + break; + +#ifndef __GNUC__ + // Unknown + default: + assert(0); + break; +#endif + } + + // If indenting not disabled, add line break after node + if (!(flags & print_no_indenting)) + *out = Ch('\n'), ++out; + + // Return modified iterator + return out; + } + + } + //! \endcond + + /////////////////////////////////////////////////////////////////////////// + // Printing + + //! Prints XML to given output iterator. + //! \param out Output iterator to print to. + //! \param node Node to be printed. Pass xml_document to print entire document. + //! \param flags Flags controlling how XML is printed. + //! \return Output iterator pointing to position immediately after last character of printed text. + template + inline OutIt print(OutIt out, const xml_node &node, int flags = 0) + { + return internal::print_node(out, &node, flags, 0); + } + +#ifndef CEREAL_RAPIDXML_NO_STREAMS + + //! Prints XML to given output stream. + //! \param out Output stream to print to. + //! \param node Node to be printed. Pass xml_document to print entire document. + //! \param flags Flags controlling how XML is printed. + //! \return Output stream. + template + inline std::basic_ostream &print(std::basic_ostream &out, const xml_node &node, int flags = 0) + { + print(std::ostream_iterator(out), node, flags); + return out; + } + + //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process. + //! \param out Output stream to print to. + //! \param node Node to be printed. + //! \return Output stream. + template + inline std::basic_ostream &operator <<(std::basic_ostream &out, const xml_node &node) + { + return print(out, node); + } + +#endif + +} +} // namespace cereal + +#endif diff --git a/external/cereal/external/rapidxml/rapidxml_utils.hpp b/external/cereal/external/rapidxml/rapidxml_utils.hpp new file mode 100644 index 0000000..e11ecf3 --- /dev/null +++ b/external/cereal/external/rapidxml/rapidxml_utils.hpp @@ -0,0 +1,123 @@ +#ifndef CEREAL_RAPIDXML_UTILS_HPP_INCLUDED +#define CEREAL_RAPIDXML_UTILS_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective. + +#include "rapidxml.hpp" +#include +#include +#include +#include + +namespace cereal { +namespace rapidxml +{ + + //! Represents data loaded from a file + template + class file + { + + public: + + //! Loads file into the memory. Data will be automatically destroyed by the destructor. + //! \param filename Filename to load. + file(const char *filename) + { + using namespace std; + + // Open stream + basic_ifstream stream(filename, ios::binary); + if (!stream) + throw runtime_error(string("cannot open file ") + filename); + stream.unsetf(ios::skipws); + + // Determine stream size + stream.seekg(0, ios::end); + size_t size = stream.tellg(); + stream.seekg(0); + + // Load data and add terminating 0 + m_data.resize(size + 1); + stream.read(&m_data.front(), static_cast(size)); + m_data[size] = 0; + } + + //! Loads file into the memory. Data will be automatically destroyed by the destructor + //! \param stream Stream to load from + file(std::basic_istream &stream) + { + using namespace std; + + // Load data and add terminating 0 + stream.unsetf(ios::skipws); + m_data.assign(istreambuf_iterator(stream), istreambuf_iterator()); + if (stream.fail() || stream.bad()) + throw runtime_error("error reading stream"); + m_data.push_back(0); + } + + //! Gets file data. + //! \return Pointer to data of file. + Ch *data() + { + return &m_data.front(); + } + + //! Gets file data. + //! \return Pointer to data of file. + const Ch *data() const + { + return &m_data.front(); + } + + //! Gets file data size. + //! \return Size of file data, in characters. + std::size_t size() const + { + return m_data.size(); + } + + private: + + std::vector m_data; // File data + + }; + + //! Counts children of node. Time complexity is O(n). + //! \return Number of children of node + template + inline std::size_t count_children(xml_node *node) + { + xml_node *child = node->first_node(); + std::size_t count = 0; + while (child) + { + ++count; + child = child->next_sibling(); + } + return count; + } + + //! Counts attributes of node. Time complexity is O(n). + //! \return Number of attributes of node + template + inline std::size_t count_attributes(xml_node *node) + { + xml_attribute *attr = node->first_attribute(); + std::size_t count = 0; + while (attr) + { + ++count; + attr = attr->next_attribute(); + } + return count; + } + +} +} // namespace cereal + +#endif diff --git a/external/cereal/macros.hpp b/external/cereal/macros.hpp new file mode 100644 index 0000000..85cf9b5 --- /dev/null +++ b/external/cereal/macros.hpp @@ -0,0 +1,156 @@ +/*! \file macros.hpp + \brief Preprocessor macros that can customise the cereal library + + By default, cereal looks for serialization functions with very + specific names, that is: serialize, load, save, load_minimal, + or save_minimal. + + This file allows an advanced user to change these names to conform + to some other style or preference. This is implemented using + preprocessor macros. + + As a result of this, in internal cereal code you will see macros + used for these function names. In user code, you should name + the functions like you normally would and not use the macros + to improve readability. + \ingroup utility */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CEREAL_MACROS_HPP_ +#define CEREAL_MACROS_HPP_ + +#ifndef CEREAL_THREAD_SAFE +//! Whether cereal should be compiled for a threaded environment +/*! This macro causes cereal to use mutexes to control access to + global internal state in a thread safe manner. + + Note that even with this enabled you must still ensure that + archives are accessed by only one thread at a time; it is safe + to use multiple archives in parallel, but not to access one archive + from many places simultaneously. */ +#define CEREAL_THREAD_SAFE 0 +#endif // CEREAL_THREAD_SAFE + +#ifndef CEREAL_SIZE_TYPE +//! Determines the data type used for size_type +/*! cereal uses size_type to ensure that the serialized size of + dynamic containers is compatible across different architectures + (e.g. 32 vs 64 bit), which may use different underlying types for + std::size_t. + + More information can be found in cereal/details/helpers.hpp. + + If you choose to modify this type, ensure that you use a fixed + size type (e.g. uint32_t). */ +#define CEREAL_SIZE_TYPE uint64_t +#endif // CEREAL_SIZE_TYPE + +// ###################################################################### +#ifndef CEREAL_SERIALIZE_FUNCTION_NAME +//! The serialization/deserialization function name to search for. +/*! You can define @c CEREAL_SERIALIZE_FUNCTION_NAME to be different assuming + you do so before this file is included. */ +#define CEREAL_SERIALIZE_FUNCTION_NAME serialize +#endif // CEREAL_SERIALIZE_FUNCTION_NAME + +#ifndef CEREAL_LOAD_FUNCTION_NAME +//! The deserialization (load) function name to search for. +/*! You can define @c CEREAL_LOAD_FUNCTION_NAME to be different assuming you do so + before this file is included. */ +#define CEREAL_LOAD_FUNCTION_NAME load +#endif // CEREAL_LOAD_FUNCTION_NAME + +#ifndef CEREAL_SAVE_FUNCTION_NAME +//! The serialization (save) function name to search for. +/*! You can define @c CEREAL_SAVE_FUNCTION_NAME to be different assuming you do so + before this file is included. */ +#define CEREAL_SAVE_FUNCTION_NAME save +#endif // CEREAL_SAVE_FUNCTION_NAME + +#ifndef CEREAL_LOAD_MINIMAL_FUNCTION_NAME +//! The deserialization (load_minimal) function name to search for. +/*! You can define @c CEREAL_LOAD_MINIMAL_FUNCTION_NAME to be different assuming you do so + before this file is included. */ +#define CEREAL_LOAD_MINIMAL_FUNCTION_NAME load_minimal +#endif // CEREAL_LOAD_MINIMAL_FUNCTION_NAME + +#ifndef CEREAL_SAVE_MINIMAL_FUNCTION_NAME +//! The serialization (save_minimal) function name to search for. +/*! You can define @c CEREAL_SAVE_MINIMAL_FUNCTION_NAME to be different assuming you do so + before this file is included. */ +#define CEREAL_SAVE_MINIMAL_FUNCTION_NAME save_minimal +#endif // CEREAL_SAVE_MINIMAL_FUNCTION_NAME + +// ###################################################################### +//! Defines the CEREAL_NOEXCEPT macro to use instead of noexcept +/*! If a compiler we support does not support noexcept, this macro + will detect this and define CEREAL_NOEXCEPT as a no-op + @internal */ +#if !defined(CEREAL_HAS_NOEXCEPT) + #if defined(__clang__) + #if __has_feature(cxx_noexcept) + #define CEREAL_HAS_NOEXCEPT + #endif + #else // NOT clang + #if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \ + defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026 + #define CEREAL_HAS_NOEXCEPT + #endif // end GCC/MSVC check + #endif // end NOT clang block + + #ifndef CEREAL_NOEXCEPT + #ifdef CEREAL_HAS_NOEXCEPT + #define CEREAL_NOEXCEPT noexcept + #else + #define CEREAL_NOEXCEPT + #endif // end CEREAL_HAS_NOEXCEPT + #endif // end !defined(CEREAL_HAS_NOEXCEPT) +#endif // ifndef CEREAL_NOEXCEPT + +// ###################################################################### +//! Checks if C++17 is available +//! NOTE: clang v5 has a bug with inline variables, so disable C++17 on that compiler +#if (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)) \ + && (!defined(__clang__) || __clang_major__ > 5) +#define CEREAL_HAS_CPP17 +#endif + +//! Checks if C++14 is available +#if __cplusplus >= 201402L +#define CEREAL_HAS_CPP14 +#endif + +// ###################################################################### +//! Defines the CEREAL_ALIGNOF macro to use instead of alignof +#if defined(_MSC_VER) && _MSC_VER < 1900 +#define CEREAL_ALIGNOF __alignof +#else // not MSVC 2013 or older +#define CEREAL_ALIGNOF alignof +#endif // end MSVC check + +#endif // CEREAL_MACROS_HPP_ diff --git a/external/cereal/specialize.hpp b/external/cereal/specialize.hpp new file mode 100644 index 0000000..da9c9a5 --- /dev/null +++ b/external/cereal/specialize.hpp @@ -0,0 +1,139 @@ +/*! \file specialize.hpp + \brief Serialization disambiguation */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CEREAL_SPECIALIZE_HPP_ +#define CEREAL_SPECIALIZE_HPP_ + +namespace cereal +{ + // Forward declaration of access class that users can become friends with + class access; + + // ###################################################################### + //! A specifier used in conjunction with cereal::specialize to disambiguate + //! serialization in special cases + /*! @relates specialize + @ingroup Access */ + enum class specialization + { + member_serialize, //!< Force the use of a member serialize function + member_load_save, //!< Force the use of a member load/save pair + member_load_save_minimal, //!< Force the use of a member minimal load/save pair + non_member_serialize, //!< Force the use of a non-member serialize function + non_member_load_save, //!< Force the use of a non-member load/save pair + non_member_load_save_minimal //!< Force the use of a non-member minimal load/save pair + }; + + //! A class used to disambiguate cases where cereal cannot detect a unique way of serializing a class + /*! cereal attempts to figure out which method of serialization (member vs. non-member serialize + or load/save pair) at compile time. If for some reason cereal cannot find a non-ambiguous way + of serializing a type, it will produce a static assertion complaining about this. + + This can happen because you have both a serialize and load/save pair, or even because a base + class has a serialize (public or private with friend access) and a derived class does not + overwrite this due to choosing some other serialization type. + + Specializing this class will tell cereal to explicitly use the serialization type you specify + and it will not complain about ambiguity in its compile time selection. However, if cereal detects + an ambiguity in specializations, it will continue to issue a static assertion. + + @code{.cpp} + class MyParent + { + friend class cereal::access; + template + void serialize( Archive & ar ) {} + }; + + // Although serialize is private in MyParent, to cereal::access it will look public, + // even through MyDerived + class MyDerived : public MyParent + { + public: + template + void load( Archive & ar ) {} + + template + void save( Archive & ar ) {} + }; + + // The load/save pair in MyDerived is ambiguous because serialize in MyParent can + // be accessed from cereal::access. This looks the same as making serialize public + // in MyParent, making it seem as though MyDerived has both a serialize and a load/save pair. + // cereal will complain about this at compile time unless we disambiguate: + + namespace cereal + { + // This struct specialization will tell cereal which is the right way to serialize the ambiguity + template struct specialize {}; + + // If we only had a disambiguation for a specific archive type, it would look something like this + template <> struct specialize {}; + } + @endcode + + You can also choose to use the macros CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES or + CEREAL_SPECIALIZE_FOR_ARCHIVE if you want to type a little bit less. + + @tparam T The type to specialize the serialization for + @tparam S The specialization type to use for T + @ingroup Access */ + template + struct specialize : public std::false_type {}; + + //! Convenient macro for performing specialization for all archive types + /*! This performs specialization for the specific type for all types of archives. + This macro should be placed at the global namespace. + + @code{cpp} + struct MyType {}; + CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES( MyType, cereal::specialization::member_load_save ); + @endcode + + @relates specialize + @ingroup Access */ + #define CEREAL_SPECIALIZE_FOR_ALL_ARCHIVES( Type, Specialization ) \ + namespace cereal { template struct specialize {}; } + + //! Convenient macro for performing specialization for a single archive type + /*! This performs specialization for the specific type for a single type of archive. + This macro should be placed at the global namespace. + + @code{cpp} + struct MyType {}; + CEREAL_SPECIALIZE_FOR_ARCHIVE( cereal::XMLInputArchive, MyType, cereal::specialization::member_load_save ); + @endcode + + @relates specialize + @ingroup Access */ + #define CEREAL_SPECIALIZE_FOR_ARCHIVE( Archive, Type, Specialization ) \ + namespace cereal { template <> struct specialize {}; } +} + +#endif diff --git a/external/cereal/types/array.hpp b/external/cereal/types/array.hpp new file mode 100644 index 0000000..8ae2a4a --- /dev/null +++ b/external/cereal/types/array.hpp @@ -0,0 +1,79 @@ +/*! \file array.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_ARRAY_HPP_ +#define CEREAL_TYPES_ARRAY_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + //! Saving for std::array primitive types + //! using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::array const & array ) + { + ar( binary_data( array.data(), sizeof(array) ) ); + } + + //! Loading for std::array primitive types + //! using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::array & array ) + { + ar( binary_data( array.data(), sizeof(array) ) ); + } + + //! Saving for std::array all other types + template inline + typename std::enable_if, Archive>::value + || !std::is_arithmetic::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::array const & array ) + { + for( auto const & i : array ) + ar( i ); + } + + //! Loading for std::array all other types + template inline + typename std::enable_if, Archive>::value + || !std::is_arithmetic::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::array & array ) + { + for( auto & i : array ) + ar( i ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_ARRAY_HPP_ diff --git a/external/cereal/types/atomic.hpp b/external/cereal/types/atomic.hpp new file mode 100644 index 0000000..e5ed5d9 --- /dev/null +++ b/external/cereal/types/atomic.hpp @@ -0,0 +1,55 @@ +/*! \file atomic.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_ATOMIC_HPP_ +#define CEREAL_TYPES_ATOMIC_HPP_ + +#include +#include + +namespace cereal +{ + //! Serializing (save) for std::atomic + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::atomic const & a ) + { + ar( CEREAL_NVP_("atomic_data", a.load()) ); + } + + //! Serializing (load) for std::atomic + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::atomic & a ) + { + T tmp; + ar( CEREAL_NVP_("atomic_data", tmp) ); + a.store( tmp ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_ATOMIC_HPP_ diff --git a/external/cereal/types/base_class.hpp b/external/cereal/types/base_class.hpp new file mode 100644 index 0000000..c5186f6 --- /dev/null +++ b/external/cereal/types/base_class.hpp @@ -0,0 +1,203 @@ +/*! \file base_class.hpp + \brief Support for base classes (virtual and non-virtual) + \ingroup OtherTypes */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_BASE_CLASS_HPP_ +#define CEREAL_TYPES_BASE_CLASS_HPP_ + +#include "../details/traits.hpp" +#include "../details/polymorphic_impl_fwd.hpp" + +namespace cereal +{ + namespace base_class_detail + { + //! Used to register polymorphic relations and avoid the need to include + //! polymorphic.hpp when no polymorphism is used + /*! @internal */ + template ::value> + struct RegisterPolymorphicBaseClass + { + static void bind() + { } + }; + + //! Polymorphic version + /*! @internal */ + template + struct RegisterPolymorphicBaseClass + { + static void bind() + { detail::RegisterPolymorphicCaster::bind(); } + }; + } + + //! Casts a derived class to its non-virtual base class in a way that safely supports abstract classes + /*! This should be used in cases when a derived type needs to serialize its base type. This is better than directly + using static_cast, as it allows for serialization of pure virtual (abstract) base classes. + + This also automatically registers polymorphic relation between the base and derived class, assuming they + are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information + see the documentation on polymorphism. If using a polymorphic class, be sure to include support for + polymorphism (cereal/types/polymorphic.hpp). + + \sa virtual_base_class + + @code{.cpp} + struct MyBase + { + int x; + + virtual void foo() = 0; + + template + void serialize( Archive & ar ) + { + ar( x ); + } + }; + + struct MyDerived : public MyBase //<-- Note non-virtual inheritance + { + int y; + + virtual void foo() {}; + + template + void serialize( Archive & ar ) + { + ar( cereal::base_class(this) ); + ar( y ); + } + }; + @endcode */ + template + struct base_class : private traits::detail::BaseCastBase + { + template + base_class(Derived const * derived) : + base_ptr(const_cast(static_cast(derived))) + { + static_assert( std::is_base_of::value, "Can only use base_class on a valid base class" ); + base_class_detail::RegisterPolymorphicBaseClass::bind(); + } + + Base * base_ptr; + }; + + //! Casts a derived class to its virtual base class in a way that allows cereal to track inheritance + /*! This should be used in cases when a derived type features virtual inheritance from some + base type. This allows cereal to track the inheritance and to avoid making duplicate copies + during serialization. + + It is safe to use virtual_base_class in all circumstances for serializing base classes, even in cases + where virtual inheritance does not take place, though it may be slightly faster to utilize + cereal::base_class<> if you do not need to worry about virtual inheritance. + + This also automatically registers polymorphic relation between the base and derived class, assuming they + are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information + see the documentation on polymorphism. If using a polymorphic class, be sure to include support for + polymorphism (cereal/types/polymorphic.hpp). + + \sa base_class + + @code{.cpp} + struct MyBase + { + int x; + + template + void serialize( Archive & ar ) + { + ar( x ); + } + }; + + struct MyLeft : virtual MyBase //<-- Note the virtual inheritance + { + int y; + + template + void serialize( Archive & ar ) + { + ar( cereal::virtual_base_class( this ) ); + ar( y ); + } + }; + + struct MyRight : virtual MyBase + { + int z; + + template + void serialize( Archive & ar ) + { + ar( cereal::virtual_base_clas( this ) ); + ar( z ); + } + }; + + // diamond virtual inheritance; contains one copy of each base class + struct MyDerived : virtual MyLeft, virtual MyRight + { + int a; + + template + void serialize( Archive & ar ) + { + ar( cereal::virtual_base_class( this ) ); // safely serialize data members in MyLeft + ar( cereal::virtual_base_class( this ) ); // safely serialize data members in MyRight + ar( a ); + + // Because we used virtual_base_class, cereal will ensure that only one instance of MyBase is + // serialized as we traverse the inheritance heirarchy. This means that there will be one copy + // each of the variables x, y, z, and a + + // If we had chosen to use static_cast<> instead, cereal would perform no tracking and + // assume that every base class should be serialized (in this case leading to a duplicate + // serialization of MyBase due to diamond inheritance + }; + } + @endcode */ + template + struct virtual_base_class : private traits::detail::BaseCastBase + { + template + virtual_base_class(Derived const * derived) : + base_ptr(const_cast(static_cast(derived))) + { + static_assert( std::is_base_of::value, "Can only use virtual_base_class on a valid base class" ); + base_class_detail::RegisterPolymorphicBaseClass::bind(); + } + + Base * base_ptr; + }; + +} // namespace cereal + +#endif // CEREAL_TYPES_BASE_CLASS_HPP_ diff --git a/external/cereal/types/bitset.hpp b/external/cereal/types/bitset.hpp new file mode 100644 index 0000000..6231d6f --- /dev/null +++ b/external/cereal/types/bitset.hpp @@ -0,0 +1,176 @@ +/*! \file bitset.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_BITSET_HPP_ +#define CEREAL_TYPES_BITSET_HPP_ + +#include "cereal/cereal.hpp" +#include "cereal/types/string.hpp" +#include + +namespace cereal +{ + namespace bitset_detail + { + //! The type the bitset is encoded with + /*! @internal */ + enum class type : uint8_t + { + ulong, + ullong, + string, + bits + }; + } + + //! Serializing (save) for std::bitset when BinaryData optimization supported + template , Archive>::value> + = traits::sfinae> inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset const & bits ) + { + ar( CEREAL_NVP_("type", bitset_detail::type::bits) ); + + // Serialize 8 bit chunks + std::uint8_t chunk = 0; + std::uint8_t mask = 0x80; + + // Set each chunk using a rotating mask for the current bit + for( std::size_t i = 0; i < N; ++i ) + { + if( bits[i] ) + chunk |= mask; + + mask = static_cast(mask >> 1); + + // output current chunk when mask is empty (8 bits) + if( mask == 0 ) + { + ar( chunk ); + chunk = 0; + mask = 0x80; + } + } + + // serialize remainder, if it exists + if( mask != 0x80 ) + ar( chunk ); + } + + //! Serializing (save) for std::bitset when BinaryData is not supported + template , Archive>::value> + = traits::sfinae> inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset const & bits ) + { + try + { + auto const b = bits.to_ulong(); + ar( CEREAL_NVP_("type", bitset_detail::type::ulong) ); + ar( CEREAL_NVP_("data", b) ); + } + catch( std::overflow_error const & ) + { + try + { + auto const b = bits.to_ullong(); + ar( CEREAL_NVP_("type", bitset_detail::type::ullong) ); + ar( CEREAL_NVP_("data", b) ); + } + catch( std::overflow_error const & ) + { + ar( CEREAL_NVP_("type", bitset_detail::type::string) ); + ar( CEREAL_NVP_("data", bits.to_string()) ); + } + } + } + + //! Serializing (load) for std::bitset + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::bitset & bits ) + { + bitset_detail::type t; + ar( CEREAL_NVP_("type", t) ); + + switch( t ) + { + case bitset_detail::type::ulong: + { + unsigned long b; + ar( CEREAL_NVP_("data", b) ); + bits = std::bitset( b ); + break; + } + case bitset_detail::type::ullong: + { + unsigned long long b; + ar( CEREAL_NVP_("data", b) ); + bits = std::bitset( b ); + break; + } + case bitset_detail::type::string: + { + std::string b; + ar( CEREAL_NVP_("data", b) ); + bits = std::bitset( b ); + break; + } + case bitset_detail::type::bits: + { + // Normally we would use BinaryData to route this at compile time, + // but doing this at runtime doesn't break any old serialization + std::uint8_t chunk = 0; + std::uint8_t mask = 0; + + bits.reset(); + + // Load one chunk at a time, rotating through the chunk + // to set bits in the bitset + for( std::size_t i = 0; i < N; ++i ) + { + if( mask == 0 ) + { + ar( chunk ); + mask = 0x80; + } + + if( chunk & mask ) + bits[i] = 1; + + mask = static_cast(mask >> 1); + } + break; + } + default: + throw Exception("Invalid bitset data representation"); + } + } +} // namespace cereal + +#endif // CEREAL_TYPES_BITSET_HPP_ diff --git a/external/cereal/types/boost_variant.hpp b/external/cereal/types/boost_variant.hpp new file mode 100644 index 0000000..74a339e --- /dev/null +++ b/external/cereal/types/boost_variant.hpp @@ -0,0 +1,164 @@ +/*! \file boost_variant.hpp + \brief Support for boost::variant + \ingroup OtherTypes */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_BOOST_VARIANT_HPP_ +#define CEREAL_TYPES_BOOST_VARIANT_HPP_ + +//! @internal +#if defined(_MSC_VER) && _MSC_VER < 1911 +#define CEREAL_CONSTEXPR_LAMBDA +#else // MSVC 2017 or newer, all other compilers +#define CEREAL_CONSTEXPR_LAMBDA constexpr +#endif + +#include "cereal/cereal.hpp" +#include +#include + +namespace cereal +{ + namespace boost_variant_detail + { + //! @internal + template + struct variant_save_visitor : boost::static_visitor<> + { + variant_save_visitor(Archive & ar_) : ar(ar_) {} + + template + void operator()(T const & value) const + { + ar( CEREAL_NVP_("data", value) ); + } + + Archive & ar; + }; + + //! @internal + template + struct LoadAndConstructLoadWrapper + { + using ST = typename std::aligned_storage::type; + + LoadAndConstructLoadWrapper() : + construct( reinterpret_cast( &st ) ) + { } + + ~LoadAndConstructLoadWrapper() + { + if (construct.itsValid) + { + construct->~T(); + } + } + + void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar ) + { + ::cereal::detail::Construct::load_andor_construct( ar, construct ); + } + + ST st; + ::cereal::construct construct; + }; + + //! @internal + template struct load_variant_wrapper; + + //! Avoid serializing variant void_ type + /*! @internal */ + template <> + struct load_variant_wrapper + { + template + static void load_variant( Archive &, Variant & ) + { } + }; + + //! @internal + template + struct load_variant_wrapper + { + // default constructible + template + static void load_variant_impl( Archive & ar, Variant & variant, std::true_type ) + { + T value; + ar( CEREAL_NVP_("data", value) ); + variant = std::move(value); + } + + // not default constructible + template + static void load_variant_impl(Archive & ar, Variant & variant, std::false_type ) + { + LoadAndConstructLoadWrapper loadWrapper; + + ar( CEREAL_NVP_("data", loadWrapper) ); + variant = std::move(*loadWrapper.construct.ptr()); + } + + //! @internal + template + static void load_variant(Archive & ar, Variant & variant) + { + load_variant_impl( ar, variant, typename std::is_default_constructible::type() ); + } + }; + } // namespace boost_variant_detail + + //! Saving for boost::variant + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, boost::variant const & variant ) + { + int32_t which = variant.which(); + ar( CEREAL_NVP_("which", which) ); + boost_variant_detail::variant_save_visitor visitor(ar); + variant.apply_visitor(visitor); + } + + //! Loading for boost::variant + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, boost::variant & variant ) + { + int32_t which; + ar( CEREAL_NVP_("which", which) ); + + using LoadFuncType = void(*)(Archive &, boost::variant &); + CEREAL_CONSTEXPR_LAMBDA LoadFuncType loadFuncArray[] = {&boost_variant_detail::load_variant_wrapper::load_variant...}; + + if(which >= int32_t(sizeof(loadFuncArray)/sizeof(loadFuncArray[0]))) + throw Exception("Invalid 'which' selector when deserializing boost::variant"); + + loadFuncArray[which](ar, variant); + } +} // namespace cereal + +#undef CEREAL_CONSTEXPR_LAMBDA + +#endif // CEREAL_TYPES_BOOST_VARIANT_HPP_ diff --git a/external/cereal/types/chrono.hpp b/external/cereal/types/chrono.hpp new file mode 100644 index 0000000..da1ef42 --- /dev/null +++ b/external/cereal/types/chrono.hpp @@ -0,0 +1,72 @@ +/*! \file chrono.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_CHRONO_HPP_ +#define CEREAL_TYPES_CHRONO_HPP_ + +#include + +namespace cereal +{ + //! Saving std::chrono::duration + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::chrono::duration const & dur ) + { + ar( CEREAL_NVP_("count", dur.count()) ); + } + + //! Loading std::chrono::duration + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::chrono::duration & dur ) + { + R count; + ar( CEREAL_NVP_("count", count) ); + + dur = std::chrono::duration{count}; + } + + //! Saving std::chrono::time_point + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::chrono::time_point const & dur ) + { + ar( CEREAL_NVP_("time_since_epoch", dur.time_since_epoch()) ); + } + + //! Loading std::chrono::time_point + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::chrono::time_point & dur ) + { + D elapsed; + ar( CEREAL_NVP_("time_since_epoch", elapsed) ); + + dur = std::chrono::time_point{elapsed}; + } +} // namespace cereal + +#endif // CEREAL_TYPES_CHRONO_HPP_ diff --git a/external/cereal/types/common.hpp b/external/cereal/types/common.hpp new file mode 100644 index 0000000..fc194bd --- /dev/null +++ b/external/cereal/types/common.hpp @@ -0,0 +1,129 @@ +/*! \file common.hpp + \brief Support common types - always included automatically + \ingroup OtherTypes */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_COMMON_HPP_ +#define CEREAL_TYPES_COMMON_HPP_ + +#include "../cereal.hpp" + +namespace cereal +{ + namespace common_detail + { + //! Serialization for arrays if BinaryData is supported and we are arithmetic + /*! @internal */ + template inline + void serializeArray( Archive & ar, T & array, std::true_type /* binary_supported */ ) + { + ar( binary_data( array, sizeof(array) ) ); + } + + //! Serialization for arrays if BinaryData is not supported or we are not arithmetic + /*! @internal */ + template inline + void serializeArray( Archive & ar, T & array, std::false_type /* binary_supported */ ) + { + for( auto & i : array ) + ar( i ); + } + + namespace + { + //! Gets the underlying type of an enum + /*! @internal */ + template + struct enum_underlying_type : std::false_type {}; + + //! Gets the underlying type of an enum + /*! Specialization for when we actually have an enum + @internal */ + template + struct enum_underlying_type { using type = typename std::underlying_type::type; }; + } // anon namespace + + //! Checks if a type is an enum + /*! This is needed over simply calling std::is_enum because the type + traits checking at compile time will attempt to call something like + load_minimal with a special NoConvertRef struct that wraps up the true type. + + This will strip away any of that and also expose the true underlying type. + @internal */ + template + class is_enum + { + private: + using DecayedT = typename std::decay::type; + using StrippedT = typename ::cereal::traits::strip_minimal::type; + + public: + static const bool value = std::is_enum::value; + using type = StrippedT; + using base_type = typename enum_underlying_type::type; + }; + } + + //! Saving for enum types + template inline + typename std::enable_if::value, + typename common_detail::is_enum::base_type>::type + CEREAL_SAVE_MINIMAL_FUNCTION_NAME( Archive const &, T const & t ) + { + return static_cast::base_type>(t); + } + + //! Loading for enum types + template inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_MINIMAL_FUNCTION_NAME( Archive const &, T && t, + typename common_detail::is_enum::base_type const & value ) + { + t = reinterpret_cast::type const &>( value ); + } + + //! Serialization for raw pointers + /*! This exists only to throw a static_assert to let users know we don't support raw pointers. */ + template inline + void CEREAL_SERIALIZE_FUNCTION_NAME( Archive &, T * & ) + { + static_assert(cereal::traits::detail::delay_static_assert::value, + "Cereal does not support serializing raw pointers - please use a smart pointer"); + } + + //! Serialization for C style arrays + template inline + typename std::enable_if::value, void>::type + CEREAL_SERIALIZE_FUNCTION_NAME(Archive & ar, T & array) + { + common_detail::serializeArray( ar, array, + std::integral_constant, Archive>::value && + std::is_arithmetic::type>::value>() ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_COMMON_HPP_ diff --git a/external/cereal/types/complex.hpp b/external/cereal/types/complex.hpp new file mode 100644 index 0000000..b9b8691 --- /dev/null +++ b/external/cereal/types/complex.hpp @@ -0,0 +1,56 @@ +/*! \file complex.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_COMPLEX_HPP_ +#define CEREAL_TYPES_COMPLEX_HPP_ + +#include + +namespace cereal +{ + //! Serializing (save) for std::complex + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::complex const & comp ) + { + ar( CEREAL_NVP_("real", comp.real()), + CEREAL_NVP_("imag", comp.imag()) ); + } + + //! Serializing (load) for std::complex + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::complex & bits ) + { + T real, imag; + ar( CEREAL_NVP_("real", real), + CEREAL_NVP_("imag", imag) ); + bits = {real, imag}; + } +} // namespace cereal + +#endif // CEREAL_TYPES_COMPLEX_HPP_ diff --git a/external/cereal/types/concepts/pair_associative_container.hpp b/external/cereal/types/concepts/pair_associative_container.hpp new file mode 100644 index 0000000..acfd418 --- /dev/null +++ b/external/cereal/types/concepts/pair_associative_container.hpp @@ -0,0 +1,73 @@ +/*! \file pair_associative_container.hpp + \brief Support for the PairAssociativeContainer refinement of the + AssociativeContainer concept. + \ingroup TypeConcepts */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_ +#define CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_ + +#include "cereal/cereal.hpp" + +namespace cereal +{ + //! Saving for std-like pair associative containers + template class Map, typename... Args, typename = typename Map::mapped_type> inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, Map const & map ) + { + ar( make_size_tag( static_cast(map.size()) ) ); + + for( const auto & i : map ) + ar( make_map_item(i.first, i.second) ); + } + + //! Loading for std-like pair associative containers + template class Map, typename... Args, typename = typename Map::mapped_type> inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, Map & map ) + { + size_type size; + ar( make_size_tag( size ) ); + + map.clear(); + + auto hint = map.begin(); + for( size_t i = 0; i < size; ++i ) + { + typename Map::key_type key; + typename Map::mapped_type value; + + ar( make_map_item(key, value) ); + #ifdef CEREAL_OLDER_GCC + hint = map.insert( hint, std::make_pair(std::move(key), std::move(value)) ); + #else // NOT CEREAL_OLDER_GCC + hint = map.emplace_hint( hint, std::move( key ), std::move( value ) ); + #endif // NOT CEREAL_OLDER_GCC + } + } +} // namespace cereal + +#endif // CEREAL_CONCEPTS_PAIR_ASSOCIATIVE_CONTAINER_HPP_ diff --git a/external/cereal/types/deque.hpp b/external/cereal/types/deque.hpp new file mode 100644 index 0000000..8b101dc --- /dev/null +++ b/external/cereal/types/deque.hpp @@ -0,0 +1,62 @@ +/*! \file deque.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_DEQUE_HPP_ +#define CEREAL_TYPES_DEQUE_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + //! Saving for std::deque + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::deque const & deque ) + { + ar( make_size_tag( static_cast(deque.size()) ) ); + + for( auto const & i : deque ) + ar( i ); + } + + //! Loading for std::deque + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::deque & deque ) + { + size_type size; + ar( make_size_tag( size ) ); + + deque.resize( static_cast( size ) ); + + for( auto & i : deque ) + ar( i ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_DEQUE_HPP_ diff --git a/external/cereal/types/forward_list.hpp b/external/cereal/types/forward_list.hpp new file mode 100644 index 0000000..2370863 --- /dev/null +++ b/external/cereal/types/forward_list.hpp @@ -0,0 +1,68 @@ +/*! \file forward_list.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_FORWARD_LIST_HPP_ +#define CEREAL_TYPES_FORWARD_LIST_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + //! Saving for std::forward_list all other types + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::forward_list const & forward_list ) + { + // write the size - note that this is slow because we need to traverse + // the entire list. there are ways we could avoid this but this was chosen + // since it works in the most general fashion with any archive type + size_type const size = std::distance( forward_list.begin(), forward_list.end() ); + + ar( make_size_tag( size ) ); + + // write the list + for( const auto & i : forward_list ) + ar( i ); + } + + //! Loading for std::forward_list all other types from + template + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::forward_list & forward_list ) + { + size_type size; + ar( make_size_tag( size ) ); + + forward_list.resize( static_cast( size ) ); + + for( auto & i : forward_list ) + ar( i ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_FORWARD_LIST_HPP_ diff --git a/external/cereal/types/functional.hpp b/external/cereal/types/functional.hpp new file mode 100644 index 0000000..0b9cdf3 --- /dev/null +++ b/external/cereal/types/functional.hpp @@ -0,0 +1,43 @@ +/*! \file functional.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2016, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_FUNCTIONAL_HPP_ +#define CEREAL_TYPES_FUNCTIONAL_HPP_ + +#include + +namespace cereal +{ + //! Saving for std::less + template inline + void serialize( Archive &, std::less & ) + { } +} // namespace cereal + +#endif // CEREAL_TYPES_FUNCTIONAL_HPP_ diff --git a/external/cereal/types/list.hpp b/external/cereal/types/list.hpp new file mode 100644 index 0000000..00dd5ef --- /dev/null +++ b/external/cereal/types/list.hpp @@ -0,0 +1,62 @@ +/*! \file list.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_LIST_HPP_ +#define CEREAL_TYPES_LIST_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + //! Saving for std::list + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::list const & list ) + { + ar( make_size_tag( static_cast(list.size()) ) ); + + for( auto const & i : list ) + ar( i ); + } + + //! Loading for std::list + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::list & list ) + { + size_type size; + ar( make_size_tag( size ) ); + + list.resize( static_cast( size ) ); + + for( auto & i : list ) + ar( i ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_LIST_HPP_ diff --git a/external/cereal/types/map.hpp b/external/cereal/types/map.hpp new file mode 100644 index 0000000..329f033 --- /dev/null +++ b/external/cereal/types/map.hpp @@ -0,0 +1,36 @@ +/*! \file map.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_MAP_HPP_ +#define CEREAL_TYPES_MAP_HPP_ + +#include "cereal/types/concepts/pair_associative_container.hpp" +#include + +#endif // CEREAL_TYPES_MAP_HPP_ diff --git a/external/cereal/types/memory.hpp b/external/cereal/types/memory.hpp new file mode 100644 index 0000000..becab85 --- /dev/null +++ b/external/cereal/types/memory.hpp @@ -0,0 +1,406 @@ +/*! \file memory.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_SHARED_PTR_HPP_ +#define CEREAL_TYPES_SHARED_PTR_HPP_ + +#include "../cereal.hpp" +#include +#include + +namespace cereal { + namespace memory_detail { + //! A wrapper class to notify cereal that it is ok to serialize the contained pointer + /*! This mechanism allows us to intercept and properly handle polymorphic pointers + @internal */ + template + struct PtrWrapper { + PtrWrapper(T &&p) : ptr(std::forward(p)) {} + + T &ptr; + + PtrWrapper(PtrWrapper const &) = default; + + PtrWrapper &operator=(PtrWrapper const &) = delete; + }; + + //! Make a PtrWrapper + /*! @internal */ + template + inline + PtrWrapper make_ptr_wrapper(T &&t) { + return {std::forward(t)}; + } + + //! A struct that acts as a wrapper around calling load_andor_construct + /*! The purpose of this is to allow a load_and_construct call to properly enter into the + 'data' NVP of the ptr_wrapper + @internal */ + template + struct LoadAndConstructLoadWrapper { + LoadAndConstructLoadWrapper(T *ptr) : + construct(ptr) {} + + //! Constructor for embedding an early call for restoring shared_from_this + template + LoadAndConstructLoadWrapper(T *ptr, F &&sharedFromThisFunc) : + construct(ptr, sharedFromThisFunc) {} + + inline void CEREAL_SERIALIZE_FUNCTION_NAME(Archive &ar) { + ::cereal::detail::Construct::load_andor_construct(ar, construct); + } + + ::cereal::construct construct; + }; + + //! A helper struct for saving and restoring the state of types that derive from + //! std::enable_shared_from_this + /*! This special struct is necessary because when a user uses load_and_construct, + the weak_ptr (or whatever implementation defined variant) that allows + enable_shared_from_this to function correctly will not be initialized properly. + + This internal weak_ptr can also be modified by the shared_ptr that is created + during the serialization of a polymorphic pointer, where cereal creates a + wrapper shared_ptr out of a void pointer to the real data. + + In the case of load_and_construct, this happens because it is the allocation + of shared_ptr that perform this initialization, which we let happen on a buffer + of memory (aligned_storage). This buffer is then used for placement new + later on, effectively overwriting any initialized weak_ptr with a default + initialized one, eventually leading to issues when the user calls shared_from_this. + + To get around these issues, we will store the memory for the enable_shared_from_this + portion of the class and replace it after whatever happens to modify it (e.g. the + user performing construction or the wrapper shared_ptr in saving). + + Note that this goes into undefined behavior territory, but as of the initial writing + of this, all standard library implementations of std::enable_shared_from_this are + compatible with this memory manipulation. It is entirely possible that this may someday + break or may not work with convoluted use cases. + + Example usage: + + @code{.cpp} + T * myActualPointer; + { + EnableSharedStateHelper helper( myActualPointer ); // save the state + std::shared_ptr myPtr( myActualPointer ); // modifies the internal weak_ptr + // helper restores state when it goes out of scope + } + @endcode + + When possible, this is designed to be used in an RAII fashion - it will save state on + construction and restore it on destruction. The restore can be done at an earlier time + (e.g. after construct() is called in load_and_construct) in which case the destructor will + do nothing. Performing the restore immediately following construct() allows a user to call + shared_from_this within their load_and_construct function. + + @tparam T Type pointed to by shared_ptr + @internal */ + template + class EnableSharedStateHelper { + // typedefs for parent type and storage type + using BaseType = typename ::cereal::traits::get_shared_from_this_base::type; + using ParentType = std::enable_shared_from_this; + using StorageType = typename std::aligned_storage::type; + + public: + //! Saves the state of some type inheriting from enable_shared_from_this + /*! @param ptr The raw pointer held by the shared_ptr */ + inline EnableSharedStateHelper(T *ptr) : + itsPtr(static_cast( ptr )), + itsState(), + itsRestored(false) { + std::memcpy(&itsState, itsPtr, sizeof(ParentType)); + } + + //! Restores the state of the held pointer (can only be done once) + inline void restore() { + if (!itsRestored) { + // void * cast needed when type has no trivial copy-assignment + std::memcpy(static_cast(itsPtr), &itsState, sizeof(ParentType)); + itsRestored = true; + } + } + + //! Restores the state of the held pointer if not done previously + inline ~EnableSharedStateHelper() { + restore(); + } + + private: + ParentType *itsPtr; + StorageType itsState; + bool itsRestored; + }; // end EnableSharedStateHelper + + //! Performs loading and construction for a shared pointer that is derived from + //! std::enable_shared_from_this + /*! @param ar The archive + @param ptr Raw pointer held by the shared_ptr + @internal */ + template + inline + void loadAndConstructSharedPtr(Archive &ar, T *ptr, std::true_type /* has_shared_from_this */) { + memory_detail::EnableSharedStateHelper state(ptr); + memory_detail::LoadAndConstructLoadWrapper loadWrapper(ptr, [&]() { state.restore(); }); + + // let the user perform their initialization, shared state will be restored as soon as construct() + // is called + ar(CEREAL_NVP_("data", loadWrapper)); + } + + //! Performs loading and construction for a shared pointer that is NOT derived from + //! std::enable_shared_from_this + /*! This is the typical case, where we simply pass the load wrapper to the + archive. + + @param ar The archive + @param ptr Raw pointer held by the shared_ptr + @internal */ + template + inline + void loadAndConstructSharedPtr(Archive &ar, T *ptr, std::false_type /* has_shared_from_this */) { + memory_detail::LoadAndConstructLoadWrapper loadWrapper(ptr); + ar(CEREAL_NVP_("data", loadWrapper)); + } + } // end namespace memory_detail + + //! Saving std::shared_ptr for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::shared_ptr const &ptr) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + } + + //! Loading std::shared_ptr, case when no user load and construct for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::shared_ptr &ptr) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + } + + //! Saving std::weak_ptr for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::weak_ptr const &ptr) { + auto const sptr = ptr.lock(); + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(sptr))); + } + + //! Loading std::weak_ptr for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::weak_ptr &ptr) { + std::shared_ptr sptr; + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(sptr))); + ptr = sptr; + } + + //! Saving std::unique_ptr for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::unique_ptr const &ptr) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + } + + //! Loading std::unique_ptr, case when user provides load_and_construct for non polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::unique_ptr &ptr) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + } + + // ###################################################################### + // Pointer wrapper implementations follow below + + //! Saving std::shared_ptr (wrapper implementation) + /*! @internal */ + template + inline + void CEREAL_SAVE_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper const &> const &wrapper) { + auto &ptr = wrapper.ptr; + + uint32_t id = ar.registerSharedPointer(ptr); + ar(CEREAL_NVP_("id", id)); + + if (id & detail::msb_32bit) { + ar(CEREAL_NVP_("data", *ptr)); + } + } + + //! Loading std::shared_ptr, case when user load and construct (wrapper implementation) + /*! @internal */ + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper &> &wrapper) { + uint32_t id; + + ar(CEREAL_NVP_("id", id)); + + if (id & detail::msb_32bit) { + // Storage type for the pointer - since we can't default construct this type, + // we'll allocate it using std::aligned_storage and use a custom deleter + using AlignedStorage = typename std::aligned_storage::type; + + // Valid flag - set to true once construction finishes + // This prevents us from calling the destructor on + // uninitialized data. + auto valid = std::make_shared(false); + + // Allocate our storage, which we will treat as + // uninitialized until initialized with placement new + using NonConstT = typename std::remove_const::type; + std::shared_ptr ptr(reinterpret_cast(new AlignedStorage()), + [=](NonConstT *t) { + if (*valid) + t->~T(); + + delete reinterpret_cast( t ); + }); + + // Register the pointer + ar.registerSharedPointer(id, ptr); + + // Perform the actual loading and allocation + memory_detail::loadAndConstructSharedPtr(ar, ptr.get(), + typename::cereal::traits::has_shared_from_this::type()); + + // Mark pointer as valid (initialized) + *valid = true; + wrapper.ptr = std::move(ptr); + } else + wrapper.ptr = std::static_pointer_cast(ar.getSharedPointer(id)); + } + + //! Loading std::shared_ptr, case when no user load and construct (wrapper implementation) + /*! @internal */ + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper &> &wrapper) { + uint32_t id; + + ar(CEREAL_NVP_("id", id)); + + if (id & detail::msb_32bit) { + using NonConstT = typename std::remove_const::type; + std::shared_ptr ptr(detail::Construct::load_andor_construct()); + ar.registerSharedPointer(id, ptr); + ar(CEREAL_NVP_("data", *ptr)); + wrapper.ptr = std::move(ptr); + } else + wrapper.ptr = std::static_pointer_cast(ar.getSharedPointer(id)); + } + + //! Saving std::unique_ptr (wrapper implementation) + /*! @internal */ + template + inline + void + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper const &> const &wrapper) { + auto &ptr = wrapper.ptr; + + // unique_ptr get one byte of metadata which signifies whether they were a nullptr + // 0 == nullptr + // 1 == not null + + if (!ptr) + ar(CEREAL_NVP_("valid", uint8_t(0))); + else { + ar(CEREAL_NVP_("valid", uint8_t(1))); + ar(CEREAL_NVP_("data", *ptr)); + } + } + + //! Loading std::unique_ptr, case when user provides load_and_construct (wrapper implementation) + /*! @internal */ + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper &> &wrapper) { + uint8_t isValid; + ar(CEREAL_NVP_("valid", isValid)); + + auto &ptr = wrapper.ptr; + + if (isValid) { + using NonConstT = typename std::remove_const::type; + // Storage type for the pointer - since we can't default construct this type, + // we'll allocate it using std::aligned_storage + using AlignedStorage = typename std::aligned_storage::type; + + // Allocate storage - note the AlignedStorage type so that deleter is correct if + // an exception is thrown before we are initialized + std::unique_ptr stPtr(new AlignedStorage()); + + // Use wrapper to enter into "data" nvp of ptr_wrapper + memory_detail::LoadAndConstructLoadWrapper loadWrapper( + reinterpret_cast( stPtr.get())); + + // Initialize storage + ar(CEREAL_NVP_("data", loadWrapper)); + + // Transfer ownership to correct unique_ptr type + ptr.reset(reinterpret_cast( stPtr.release())); + } else + ptr.reset(nullptr); + } + + //! Loading std::unique_ptr, case when no load_and_construct (wrapper implementation) + /*! @internal */ + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, memory_detail::PtrWrapper &> &wrapper) { + uint8_t isValid; + ar(CEREAL_NVP_("valid", isValid)); + + if (isValid) { + using NonConstT = typename std::remove_const::type; + std::unique_ptr ptr(detail::Construct::load_andor_construct()); + ar(CEREAL_NVP_("data", *ptr)); + wrapper.ptr = std::move(ptr); + } else { + wrapper.ptr.reset(nullptr); + } + } +} // namespace cereal + +// automatically include polymorphic support +#include "polymorphic.hpp" + +#endif // CEREAL_TYPES_SHARED_PTR_HPP_ diff --git a/external/cereal/types/optional.hpp b/external/cereal/types/optional.hpp new file mode 100644 index 0000000..3d013a6 --- /dev/null +++ b/external/cereal/types/optional.hpp @@ -0,0 +1,65 @@ +/*! \file optional.hpp + \brief Support for std::optional + \ingroup STLSupport */ +/* + Copyright (c) 2017, Juan Pedro Bolivar Puente + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_STD_OPTIONAL_ +#define CEREAL_TYPES_STD_OPTIONAL_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal { + //! Saving for std::optional + template inline + void CEREAL_SAVE_FUNCTION_NAME(Archive& ar, const std::optional& optional) + { + if(!optional) { + ar(CEREAL_NVP_("nullopt", true)); + } else { + ar(CEREAL_NVP_("nullopt", false), + CEREAL_NVP_("data", *optional)); + } + } + + //! Loading for std::optional + template inline + void CEREAL_LOAD_FUNCTION_NAME(Archive& ar, std::optional& optional) + { + bool nullopt; + ar(CEREAL_NVP_("nullopt", nullopt)); + + if (nullopt) { + optional = std::nullopt; + } else { + optional.emplace(); + ar(CEREAL_NVP_("data", *optional)); + } + } +} // namespace cereal + +#endif // CEREAL_TYPES_STD_OPTIONAL_ diff --git a/external/cereal/types/polymorphic.hpp b/external/cereal/types/polymorphic.hpp new file mode 100644 index 0000000..e7a1eda --- /dev/null +++ b/external/cereal/types/polymorphic.hpp @@ -0,0 +1,476 @@ +/*! \file polymorphic.hpp + \brief Support for pointers to polymorphic base classes + \ingroup OtherTypes */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_POLYMORPHIC_HPP_ +#define CEREAL_TYPES_POLYMORPHIC_HPP_ + +#include "../cereal.hpp" +#include "memory.hpp" + +#include "../details/util.hpp" +#include "../details/helpers.hpp" +#include "../details/traits.hpp" +#include "../details/polymorphic_impl.hpp" + +#if defined(_MSC_VER) && _MSC_VER < 1916 +#define CEREAL_STATIC_CONSTEXPR static +#else +#define CEREAL_STATIC_CONSTEXPR static constexpr +#endif + +//! Registers a derived polymorphic type with cereal +/*! Polymorphic types must be registered before smart + pointers to them can be serialized. Note that base + classes do not need to be registered. + + Registering a type lets cereal know how to properly + serialize it when a smart pointer to a base object is + used in conjunction with a derived class. + + This assumes that all relevant archives have also + previously been registered. Registration for archives + is usually done in the header file in which they are + defined. This means that type registration needs to + happen after specific archives to be used are included. + + It is recommended that type registration be done in + the header file in which the type is declared. + + Registration can also be placed in a source file, + but this may require the use of the + CEREAL_REGISTER_DYNAMIC_INIT macro (see below). + + Registration may be called repeatedly for the same + type in different translation units to add support + for additional archives if they are not initially + available (included and registered). + + When building serialization support as a DLL on + Windows, registration must happen in the header file. + On Linux and Mac things should still work properly + if placed in a source file, but see the above comments + on registering in source files. + + Polymorphic support in cereal requires RTTI to be + enabled */ +#define CEREAL_REGISTER_TYPE(...) \ + namespace cereal { \ + namespace detail { \ + template <> \ + struct binding_name<__VA_ARGS__> \ + { \ + CEREAL_STATIC_CONSTEXPR char const * name() { return #__VA_ARGS__; } \ + }; \ + } } /* end namespaces */ \ + CEREAL_BIND_TO_ARCHIVES(__VA_ARGS__) + +//! Registers a polymorphic type with cereal, giving it a +//! user defined name +/*! In some cases the default name used with + CEREAL_REGISTER_TYPE (the name of the type) may not be + suitable. This macro allows any name to be associated + with the type. The name should be unique */ +#define CEREAL_REGISTER_TYPE_WITH_NAME(T, Name) \ + namespace cereal { \ + namespace detail { \ + template <> \ + struct binding_name \ + { CEREAL_STATIC_CONSTEXPR char const * name() { return Name; } }; \ + } } /* end namespaces */ \ + CEREAL_BIND_TO_ARCHIVES(T) + +//! Registers the base-derived relationship for a polymorphic type +/*! When polymorphic serialization occurs, cereal needs to know how to + properly cast between derived and base types for the polymorphic + type. Normally this happens automatically whenever cereal::base_class + or cereal::virtual_base_class are used to serialize a base class. In + cases where neither of these is ever called but a base class still + exists, this explicit registration is required. + + The Derived class should be the most derived type that will be serialized, + and the Base type any possible base that has not been covered under a base + class serialization that will be used to store a Derived pointer. + + Placement of this is the same as for CEREAL_REGISTER_TYPE. */ +#define CEREAL_REGISTER_POLYMORPHIC_RELATION(Base, Derived) \ + namespace cereal { \ + namespace detail { \ + template <> \ + struct PolymorphicRelation \ + { static void bind() { RegisterPolymorphicCaster::bind(); } }; \ + } } /* end namespaces */ + +//! Adds a way to force initialization of a translation unit containing +//! calls to CEREAL_REGISTER_TYPE +/*! In C++, dynamic initialization of non-local variables of a translation + unit may be deferred until "the first odr-use of any function or variable + defined in the same translation unit as the variable to be initialized." + + Informally, odr-use means that your program takes the address of or binds + a reference directly to an object, which must have a definition. + + Since polymorphic type support in cereal relies on the dynamic + initialization of certain global objects happening before + serialization is performed, it is important to ensure that something + from files that call CEREAL_REGISTER_TYPE is odr-used before serialization + occurs, otherwise the registration will never take place. This may often + be the case when serialization is built as a shared library external from + your main program. + + This macro, with any name of your choosing, should be placed into the + source file that contains calls to CEREAL_REGISTER_TYPE. + + Its counterpart, CEREAL_FORCE_DYNAMIC_INIT, should be placed in its + associated header file such that it is included in the translation units + (source files) in which you want the registration to appear. + + @relates CEREAL_FORCE_DYNAMIC_INIT + */ +#define CEREAL_REGISTER_DYNAMIC_INIT(LibName) \ + namespace cereal { \ + namespace detail { \ + void CEREAL_DLL_EXPORT dynamic_init_dummy_##LibName() {} \ + } } /* end namespaces */ + +//! Forces dynamic initialization of polymorphic support in a +//! previously registered source file +/*! @sa CEREAL_REGISTER_DYNAMIC_INIT + + See CEREAL_REGISTER_DYNAMIC_INIT for detailed explanation + of how this macro should be used. The name used should + match that for CEREAL_REGISTER_DYNAMIC_INIT. */ +#define CEREAL_FORCE_DYNAMIC_INIT(LibName) \ + namespace cereal { \ + namespace detail { \ + void CEREAL_DLL_EXPORT dynamic_init_dummy_##LibName(); \ + } /* end detail */ \ + } /* end cereal */ \ + namespace { \ + struct dynamic_init_##LibName { \ + dynamic_init_##LibName() { \ + ::cereal::detail::dynamic_init_dummy_##LibName(); \ + } \ + } dynamic_init_instance_##LibName; \ + } /* end anonymous namespace */ + +namespace cereal { + namespace polymorphic_detail { + //! Error message used for unregistered polymorphic types + /*! @internal */ +#define UNREGISTERED_POLYMORPHIC_EXCEPTION(LoadSave, Name) \ + throw cereal::Exception("Trying to " #LoadSave " an unregistered polymorphic type (" + Name + ").\n" \ + "Make sure your type is registered with CEREAL_REGISTER_TYPE and that the archive " \ + "you are using was included (and registered with CEREAL_REGISTER_ARCHIVE) prior to calling CEREAL_REGISTER_TYPE.\n" \ + "If your type is already registered and you still see this error, you may need to use CEREAL_REGISTER_DYNAMIC_INIT."); + + //! Get an input binding from the given archive by deserializing the type meta data + /*! @internal */ + template + inline + typename ::cereal::detail::InputBindingMap::Serializers + getInputBinding(Archive &ar, std::uint32_t const nameid) { + // If the nameid is zero, we serialized a null pointer + if (nameid == 0) { + typename ::cereal::detail::InputBindingMap::Serializers emptySerializers; + emptySerializers.shared_ptr = [](void *, std::shared_ptr &ptr, + std::type_info const &) { ptr.reset(); }; + emptySerializers.unique_ptr = [](void *, + std::unique_ptr> &ptr, + std::type_info const &) { ptr.reset(nullptr); }; + return emptySerializers; + } + + std::string name; + if (nameid & detail::msb_32bit) { + ar(CEREAL_NVP_("polymorphic_name", name)); + ar.registerPolymorphicName(nameid, name); + } else + name = ar.getPolymorphicName(nameid); + + auto const &bindingMap = detail::StaticObject>::getInstance().map; + + auto binding = bindingMap.find(name); + if (binding == bindingMap.end()) + UNREGISTERED_POLYMORPHIC_EXCEPTION(load, name) + return binding->second; + } + + //! Serialize a shared_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee + /*! This check lets us try and skip doing polymorphic machinery if we can get away with + using the derived class serialize function + + Note that on MSVC 2013 preview, is_default_constructible returns true for abstract classes with + default constructors, but on clang/gcc this will return false. So we also need to check for that here. + @internal */ + template + inline + typename std::enable_if<(traits::is_default_constructible::value + || traits::has_load_and_construct::value) + && !std::is_abstract::value, bool>::type + serialize_wrapper(Archive &ar, std::shared_ptr &ptr, std::uint32_t const nameid) { + if (nameid & detail::msb2_32bit) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + return true; + } + return false; + } + + //! Serialize a unique_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee + /*! This check lets us try and skip doing polymorphic machinery if we can get away with + using the derived class serialize function + @internal */ + template + inline + typename std::enable_if<(traits::is_default_constructible::value + || traits::has_load_and_construct::value) + && !std::is_abstract::value, bool>::type + serialize_wrapper(Archive &ar, std::unique_ptr &ptr, std::uint32_t const nameid) { + if (nameid & detail::msb2_32bit) { + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + return true; + } + return false; + } + + //! Serialize a shared_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee + /*! This case is for when we can't actually construct the shared pointer. Normally this would be caught + as the pointer itself is serialized, but since this is a polymorphic pointer, if we tried to serialize + the pointer we'd end up back here recursively. So we have to catch the error here as well, if + this was a polymorphic type serialized by its proper pointer type + @internal */ + template + inline + typename std::enable_if<(!traits::is_default_constructible::value + && !traits::has_load_and_construct::value) + || std::is_abstract::value, bool>::type + serialize_wrapper(Archive &, std::shared_ptr &, std::uint32_t const nameid) { + if (nameid & detail::msb2_32bit) + throw cereal::Exception( + "Cannot load a polymorphic type that is not default constructable and does not have a load_and_construct function"); + return false; + } + + //! Serialize a unique_ptr if the 2nd msb in the nameid is set, and if we can actually construct the pointee + /*! This case is for when we can't actually construct the unique pointer. Normally this would be caught + as the pointer itself is serialized, but since this is a polymorphic pointer, if we tried to serialize + the pointer we'd end up back here recursively. So we have to catch the error here as well, if + this was a polymorphic type serialized by its proper pointer type + @internal */ + template + inline + typename std::enable_if<(!traits::is_default_constructible::value + && !traits::has_load_and_construct::value) + || std::is_abstract::value, bool>::type + serialize_wrapper(Archive &, std::unique_ptr &, std::uint32_t const nameid) { + if (nameid & detail::msb2_32bit) + throw cereal::Exception( + "Cannot load a polymorphic type that is not default constructable and does not have a load_and_construct function"); + return false; + } + } // polymorphic_detail + + // ###################################################################### + // Pointer serialization for polymorphic types + + //! Saving std::shared_ptr for polymorphic types, abstract + template + inline + typename std::enable_if::value && std::is_abstract::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::shared_ptr const &ptr) { + if (!ptr) { + // same behavior as nullptr in memory implementation + ar(CEREAL_NVP_("polymorphic_id", std::uint32_t(0))); + return; + } + + std::type_info const &ptrinfo = typeid(*ptr.get()); + static std::type_info const &tinfo = typeid(T); + // ptrinfo can never be equal to T info since we can't have an instance + // of an abstract object + // this implies we need to do the lookup + + auto const &bindingMap = detail::StaticObject>::getInstance().map; + + auto binding = bindingMap.find(std::type_index(ptrinfo)); + if (binding == bindingMap.end()) + UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name())) + + binding->second.shared_ptr(&ar, ptr.get(), tinfo); + } + + //! Saving std::shared_ptr for polymorphic types, not abstract + template + inline + typename std::enable_if::value && !std::is_abstract::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::shared_ptr const &ptr) { + if (!ptr) { + // same behavior as nullptr in memory implementation + ar(CEREAL_NVP_("polymorphic_id", std::uint32_t(0))); + return; + } + + std::type_info const &ptrinfo = typeid(*ptr.get()); + static std::type_info const &tinfo = typeid(T); + + if (ptrinfo == tinfo) { + // The 2nd msb signals that the following pointer does not need to be + // cast with our polymorphic machinery + ar(CEREAL_NVP_("polymorphic_id", detail::msb2_32bit)); + + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + + return; + } + + auto const &bindingMap = detail::StaticObject>::getInstance().map; + + auto binding = bindingMap.find(std::type_index(ptrinfo)); + if (binding == bindingMap.end()) + UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name())) + + binding->second.shared_ptr(&ar, ptr.get(), tinfo); + } + + //! Loading std::shared_ptr for polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::shared_ptr &ptr) { + std::uint32_t nameid; + ar(CEREAL_NVP_("polymorphic_id", nameid)); + + // Check to see if we can skip all of this polymorphism business + if (polymorphic_detail::serialize_wrapper(ar, ptr, nameid)) + return; + + auto binding = polymorphic_detail::getInputBinding(ar, nameid); + std::shared_ptr result; + binding.shared_ptr(&ar, result, typeid(T)); + ptr = std::static_pointer_cast(result); + } + + //! Saving std::weak_ptr for polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::weak_ptr const &ptr) { + auto const sptr = ptr.lock(); + ar(CEREAL_NVP_("locked_ptr", sptr)); + } + + //! Loading std::weak_ptr for polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::weak_ptr &ptr) { + std::shared_ptr sptr; + ar(CEREAL_NVP_("locked_ptr", sptr)); + ptr = sptr; + } + + //! Saving std::unique_ptr for polymorphic types that are abstract + template + inline + typename std::enable_if::value && std::is_abstract::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::unique_ptr const &ptr) { + if (!ptr) { + // same behavior as nullptr in memory implementation + ar(CEREAL_NVP_("polymorphic_id", std::uint32_t(0))); + return; + } + + std::type_info const &ptrinfo = typeid(*ptr.get()); + static std::type_info const &tinfo = typeid(T); + // ptrinfo can never be equal to T info since we can't have an instance + // of an abstract object + // this implies we need to do the lookup + + auto const &bindingMap = detail::StaticObject>::getInstance().map; + + auto binding = bindingMap.find(std::type_index(ptrinfo)); + if (binding == bindingMap.end()) + UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name())) + + binding->second.unique_ptr(&ar, ptr.get(), tinfo); + } + + //! Saving std::unique_ptr for polymorphic types, not abstract + template + inline + typename std::enable_if::value && !std::is_abstract::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive &ar, std::unique_ptr const &ptr) { + if (!ptr) { + // same behavior as nullptr in memory implementation + ar(CEREAL_NVP_("polymorphic_id", std::uint32_t(0))); + return; + } + + std::type_info const &ptrinfo = typeid(*ptr.get()); + static std::type_info const &tinfo = typeid(T); + + if (ptrinfo == tinfo) { + // The 2nd msb signals that the following pointer does not need to be + // cast with our polymorphic machinery + ar(CEREAL_NVP_("polymorphic_id", detail::msb2_32bit)); + + ar(CEREAL_NVP_("ptr_wrapper", memory_detail::make_ptr_wrapper(ptr))); + + return; + } + + auto const &bindingMap = detail::StaticObject>::getInstance().map; + + auto binding = bindingMap.find(std::type_index(ptrinfo)); + if (binding == bindingMap.end()) + UNREGISTERED_POLYMORPHIC_EXCEPTION(save, cereal::util::demangle(ptrinfo.name())) + + binding->second.unique_ptr(&ar, ptr.get(), tinfo); + } + + //! Loading std::unique_ptr, case when user provides load_and_construct for polymorphic types + template + inline + typename std::enable_if::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive &ar, std::unique_ptr &ptr) { + std::uint32_t nameid; + ar(CEREAL_NVP_("polymorphic_id", nameid)); + + // Check to see if we can skip all of this polymorphism business + if (polymorphic_detail::serialize_wrapper(ar, ptr, nameid)) + return; + + auto binding = polymorphic_detail::getInputBinding(ar, nameid); + std::unique_ptr> result; + binding.unique_ptr(&ar, result, typeid(T)); + ptr.reset(static_cast(result.release())); + } + +#undef UNREGISTERED_POLYMORPHIC_EXCEPTION +} // namespace cereal +#endif // CEREAL_TYPES_POLYMORPHIC_HPP_ diff --git a/external/cereal/types/queue.hpp b/external/cereal/types/queue.hpp new file mode 100644 index 0000000..abde445 --- /dev/null +++ b/external/cereal/types/queue.hpp @@ -0,0 +1,132 @@ +/*! \file queue.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_QUEUE_HPP_ +#define CEREAL_TYPES_QUEUE_HPP_ + +#include "cereal/details/helpers.hpp" +#include + +// The default container for queue is deque, so let's include that too +#include "cereal/types/deque.hpp" +// The default comparator for queue is less +#include "cereal/types/functional.hpp" + +namespace cereal +{ + namespace queue_detail + { + //! Allows access to the protected container in queue + /*! @internal */ + template inline + C const & container( std::queue const & queue ) + { + struct H : public std::queue + { + static C const & get( std::queue const & q ) + { + return q.*(&H::c); + } + }; + + return H::get( queue ); + } + + //! Allows access to the protected container in priority queue + /*! @internal */ + template inline + C const & container( std::priority_queue const & priority_queue ) + { + struct H : public std::priority_queue + { + static C const & get( std::priority_queue const & pq ) + { + return pq.*(&H::c); + } + }; + + return H::get( priority_queue ); + } + + //! Allows access to the protected comparator in priority queue + /*! @internal */ + template inline + Comp const & comparator( std::priority_queue const & priority_queue ) + { + struct H : public std::priority_queue + { + static Comp const & get( std::priority_queue const & pq ) + { + return pq.*(&H::comp); + } + }; + + return H::get( priority_queue ); + } + } + + //! Saving for std::queue + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::queue const & queue ) + { + ar( CEREAL_NVP_("container", queue_detail::container( queue )) ); + } + + //! Loading for std::queue + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::queue & queue ) + { + C container; + ar( CEREAL_NVP_("container", container) ); + queue = std::queue( std::move( container ) ); + } + + //! Saving for std::priority_queue + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::priority_queue const & priority_queue ) + { + ar( CEREAL_NVP_("comparator", queue_detail::comparator( priority_queue )) ); + ar( CEREAL_NVP_("container", queue_detail::container( priority_queue )) ); + } + + //! Loading for std::priority_queue + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::priority_queue & priority_queue ) + { + Comp comparator; + ar( CEREAL_NVP_("comparator", comparator) ); + + C container; + ar( CEREAL_NVP_("container", container) ); + + priority_queue = std::priority_queue( comparator, std::move( container ) ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_QUEUE_HPP_ diff --git a/external/cereal/types/set.hpp b/external/cereal/types/set.hpp new file mode 100644 index 0000000..0f83fbb --- /dev/null +++ b/external/cereal/types/set.hpp @@ -0,0 +1,103 @@ +/*! \file set.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_SET_HPP_ +#define CEREAL_TYPES_SET_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + namespace set_detail + { + //! @internal + template inline + void save( Archive & ar, SetT const & set ) + { + ar( make_size_tag( static_cast(set.size()) ) ); + + for( const auto & i : set ) + ar( i ); + } + + //! @internal + template inline + void load( Archive & ar, SetT & set ) + { + size_type size; + ar( make_size_tag( size ) ); + + set.clear(); + + auto hint = set.begin(); + for( size_type i = 0; i < size; ++i ) + { + typename SetT::key_type key; + + ar( key ); + #ifdef CEREAL_OLDER_GCC + hint = set.insert( hint, std::move( key ) ); + #else // NOT CEREAL_OLDER_GCC + hint = set.emplace_hint( hint, std::move( key ) ); + #endif // NOT CEREAL_OLDER_GCC + } + } + } + + //! Saving for std::set + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::set const & set ) + { + set_detail::save( ar, set ); + } + + //! Loading for std::set + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::set & set ) + { + set_detail::load( ar, set ); + } + + //! Saving for std::multiset + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::multiset const & multiset ) + { + set_detail::save( ar, multiset ); + } + + //! Loading for std::multiset + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::multiset & multiset ) + { + set_detail::load( ar, multiset ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_SET_HPP_ diff --git a/external/cereal/types/stack.hpp b/external/cereal/types/stack.hpp new file mode 100644 index 0000000..9c08f7d --- /dev/null +++ b/external/cereal/types/stack.hpp @@ -0,0 +1,76 @@ +/*! \file stack.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_STACK_HPP_ +#define CEREAL_TYPES_STACK_HPP_ + +#include "cereal/cereal.hpp" +#include + +// The default container for stack is deque, so let's include that too +#include "cereal/types/deque.hpp" + +namespace cereal +{ + namespace stack_detail + { + //! Allows access to the protected container in stack + template inline + C const & container( std::stack const & stack ) + { + struct H : public std::stack + { + static C const & get( std::stack const & s ) + { + return s.*(&H::c); + } + }; + + return H::get( stack ); + } + } + + //! Saving for std::stack + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::stack const & stack ) + { + ar( CEREAL_NVP_("container", stack_detail::container( stack )) ); + } + + //! Loading for std::stack + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::stack & stack ) + { + C container; + ar( CEREAL_NVP_("container", container) ); + stack = std::stack( std::move( container ) ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_STACK_HPP_ diff --git a/external/cereal/types/string.hpp b/external/cereal/types/string.hpp new file mode 100644 index 0000000..0f9b337 --- /dev/null +++ b/external/cereal/types/string.hpp @@ -0,0 +1,61 @@ +/*! \file string.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_STRING_HPP_ +#define CEREAL_TYPES_STRING_HPP_ + +#include "../cereal.hpp" +#include + +namespace cereal +{ + //! Serialization for basic_string types, if binary data is supported + template inline + typename std::enable_if, Archive>::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive & ar, std::basic_string const & str) + { + // Save number of chars + the data + ar( make_size_tag( static_cast(str.size()) ) ); + ar( binary_data( str.data(), str.size() * sizeof(CharT) ) ); + } + + //! Serialization for basic_string types, if binary data is supported + template inline + typename std::enable_if, Archive>::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive & ar, std::basic_string & str) + { + size_type size; + ar( make_size_tag( size ) ); + str.resize(static_cast(size)); + ar( binary_data( const_cast( str.data() ), static_cast(size) * sizeof(CharT) ) ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_STRING_HPP_ + diff --git a/external/cereal/types/tuple.hpp b/external/cereal/types/tuple.hpp new file mode 100644 index 0000000..80c6807 --- /dev/null +++ b/external/cereal/types/tuple.hpp @@ -0,0 +1,123 @@ +/*! \file tuple.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_TUPLE_HPP_ +#define CEREAL_TYPES_TUPLE_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + namespace tuple_detail + { + //! Creates a c string from a sequence of characters + /*! The c string created will always be prefixed by "tuple_element" + Based on code from: http://stackoverflow/a/20973438/710791 + @internal */ + template + struct char_seq_to_c_str + { + static const int size = 14;// Size of array for the word: tuple_element + typedef const char (&arr_type)[sizeof...(Cs) + size]; + static const char str[sizeof...(Cs) + size]; + }; + + // the word tuple_element plus a number + //! @internal + template + const char char_seq_to_c_str::str[sizeof...(Cs) + size] = + {'t','u','p','l','e','_','e','l','e','m','e','n','t', Cs..., '\0'}; + + //! Converts a number into a sequence of characters + /*! @tparam Q The quotient of dividing the original number by 10 + @tparam R The remainder of dividing the original number by 10 + @tparam C The sequence built so far + @internal */ + template + struct to_string_impl + { + using type = typename to_string_impl(R+std::size_t{'0'}), C...>::type; + }; + + //! Base case with no quotient + /*! @internal */ + template + struct to_string_impl<0, R, C...> + { + using type = char_seq_to_c_str(R+std::size_t{'0'}), C...>; + }; + + //! Generates a c string for a given index of a tuple + /*! Example use: + @code{cpp} + tuple_element_name<3>::c_str();// returns "tuple_element3" + @endcode + @internal */ + template + struct tuple_element_name + { + using type = typename to_string_impl::type; + static const typename type::arr_type c_str(){ return type::str; } + }; + + // unwinds a tuple to save it + //! @internal + template + struct serialize + { + template inline + static void apply( Archive & ar, std::tuple & tuple ) + { + serialize::template apply( ar, tuple ); + ar( CEREAL_NVP_(tuple_element_name::c_str(), + std::get( tuple )) ); + } + }; + + // Zero height specialization - nothing to do here + //! @internal + template <> + struct serialize<0> + { + template inline + static void apply( Archive &, std::tuple & ) + { } + }; + } + + //! Serializing for std::tuple + template inline + void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, std::tuple & tuple ) + { + tuple_detail::serialize>::value>::template apply( ar, tuple ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_TUPLE_HPP_ diff --git a/external/cereal/types/unordered_map.hpp b/external/cereal/types/unordered_map.hpp new file mode 100644 index 0000000..d575593 --- /dev/null +++ b/external/cereal/types/unordered_map.hpp @@ -0,0 +1,36 @@ +/*! \file unordered_map.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_UNORDERED_MAP_HPP_ +#define CEREAL_TYPES_UNORDERED_MAP_HPP_ + +#include "cereal/types/concepts/pair_associative_container.hpp" +#include + +#endif // CEREAL_TYPES_UNORDERED_MAP_HPP_ diff --git a/external/cereal/types/unordered_set.hpp b/external/cereal/types/unordered_set.hpp new file mode 100644 index 0000000..2384cdf --- /dev/null +++ b/external/cereal/types/unordered_set.hpp @@ -0,0 +1,99 @@ +/*! \file unordered_set.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_UNORDERED_SET_HPP_ +#define CEREAL_TYPES_UNORDERED_SET_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + namespace unordered_set_detail + { + //! @internal + template inline + void save( Archive & ar, SetT const & set ) + { + ar( make_size_tag( static_cast(set.size()) ) ); + + for( const auto & i : set ) + ar( i ); + } + + //! @internal + template inline + void load( Archive & ar, SetT & set ) + { + size_type size; + ar( make_size_tag( size ) ); + + set.clear(); + set.reserve( static_cast( size ) ); + + for( size_type i = 0; i < size; ++i ) + { + typename SetT::key_type key; + + ar( key ); + set.emplace( std::move( key ) ); + } + } + } + + //! Saving for std::unordered_set + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unordered_set const & unordered_set ) + { + unordered_set_detail::save( ar, unordered_set ); + } + + //! Loading for std::unordered_set + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unordered_set & unordered_set ) + { + unordered_set_detail::load( ar, unordered_set ); + } + + //! Saving for std::unordered_multiset + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::unordered_multiset const & unordered_multiset ) + { + unordered_set_detail::save( ar, unordered_multiset ); + } + + //! Loading for std::unordered_multiset + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::unordered_multiset & unordered_multiset ) + { + unordered_set_detail::load( ar, unordered_multiset ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_UNORDERED_SET_HPP_ diff --git a/external/cereal/types/utility.hpp b/external/cereal/types/utility.hpp new file mode 100644 index 0000000..e56eb83 --- /dev/null +++ b/external/cereal/types/utility.hpp @@ -0,0 +1,47 @@ +/*! \file utility.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_UTILITY_HPP_ +#define CEREAL_TYPES_UTILITY_HPP_ + +#include "../cereal.hpp" +#include + +namespace cereal +{ + //! Serializing for std::pair + template inline + void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, std::pair & pair ) + { + ar( CEREAL_NVP_("first", pair.first), + CEREAL_NVP_("second", pair.second) ); + } +} // namespace cereal + +#endif // CEREAL_TYPES_UTILITY_HPP_ diff --git a/external/cereal/types/valarray.hpp b/external/cereal/types/valarray.hpp new file mode 100644 index 0000000..ed56e22 --- /dev/null +++ b/external/cereal/types/valarray.hpp @@ -0,0 +1,89 @@ +/*! \file valarray.hpp +\brief Support for types found in \ +\ingroup STLSupport */ + +/* +Copyright (c) 2014, Randolph Voorhies, Shane Grant +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of cereal nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CEREAL_TYPES_VALARRAY_HPP_ +#define CEREAL_TYPES_VALARRAY_HPP_ + +#include "cereal/cereal.hpp" +#include + +namespace cereal +{ + //! Saving for std::valarray arithmetic types, using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::valarray const & valarray ) + { + ar( make_size_tag( static_cast(valarray.size()) ) ); // number of elements + ar( binary_data( &valarray[0], valarray.size() * sizeof(T) ) ); // &valarray[0] ok since guaranteed contiguous + } + + //! Loading for std::valarray arithmetic types, using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::valarray & valarray ) + { + size_type valarraySize; + ar( make_size_tag( valarraySize ) ); + + valarray.resize( static_cast( valarraySize ) ); + ar( binary_data( &valarray[0], static_cast( valarraySize ) * sizeof(T) ) ); + } + + //! Saving for std::valarray all other types + template inline + typename std::enable_if, Archive>::value + || !std::is_arithmetic::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::valarray const & valarray ) + { + ar( make_size_tag( static_cast(valarray.size()) ) ); // number of elements + for(auto && v : valarray) + ar(v); + } + + //! Loading for std::valarray all other types + template inline + typename std::enable_if, Archive>::value + || !std::is_arithmetic::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::valarray & valarray ) + { + size_type valarraySize; + ar( make_size_tag( valarraySize ) ); + + valarray.resize( static_cast( valarraySize ) ); + for(auto && v : valarray) + ar(v); + } +} // namespace cereal + +#endif // CEREAL_TYPES_VALARRAY_HPP_ diff --git a/external/cereal/types/variant.hpp b/external/cereal/types/variant.hpp new file mode 100644 index 0000000..886b246 --- /dev/null +++ b/external/cereal/types/variant.hpp @@ -0,0 +1,108 @@ +/*! \file variant.hpp + \brief Support for std::variant + \ingroup STLSupport */ +/* + Copyright (c) 2014, 2017, Randolph Voorhies, Shane Grant, Juan Pedro + Bolivar Puente. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_STD_VARIANT_HPP_ +#define CEREAL_TYPES_STD_VARIANT_HPP_ + +#include "cereal/cereal.hpp" +#include +#include + +namespace cereal +{ + namespace variant_detail + { + //! @internal + template + struct variant_save_visitor + { + variant_save_visitor(Archive & ar_) : ar(ar_) {} + + template + void operator()(T const & value) const + { + ar( CEREAL_NVP_("data", value) ); + } + + Archive & ar; + }; + + //! @internal + template + typename std::enable_if, void>::type + load_variant(Archive & /*ar*/, int /*target*/, Variant & /*variant*/) + { + throw ::cereal::Exception("Error traversing variant during load"); + } + //! @internal + template + typename std::enable_if, void>::type + load_variant(Archive & ar, int target, Variant & variant) + { + if(N == target) + { + variant.template emplace(); + ar( CEREAL_NVP_("data", std::get(variant)) ); + } + else + load_variant(ar, target, variant); + } + + } // namespace variant_detail + + //! Saving for std::variant + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::variant const & variant ) + { + std::int32_t index = static_cast(variant.index()); + ar( CEREAL_NVP_("index", index) ); + variant_detail::variant_save_visitor visitor(ar); + std::visit(visitor, variant); + } + + //! Loading for std::variant + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::variant & variant ) + { + using variant_t = typename std::variant; + + std::int32_t index; + ar( CEREAL_NVP_("index", index) ); + if(index >= static_cast(std::variant_size_v)) + throw Exception("Invalid 'index' selector when deserializing std::variant"); + + variant_detail::load_variant<0>(ar, index, variant); + } + + //! Serializing a std::monostate + template + void CEREAL_SERIALIZE_FUNCTION_NAME( Archive &, std::monostate const & ) {} +} // namespace cereal + +#endif // CEREAL_TYPES_STD_VARIANT_HPP_ diff --git a/external/cereal/types/vector.hpp b/external/cereal/types/vector.hpp new file mode 100644 index 0000000..a45f3d9 --- /dev/null +++ b/external/cereal/types/vector.hpp @@ -0,0 +1,112 @@ +/*! \file vector.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2014, Randolph Voorhies, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef CEREAL_TYPES_VECTOR_HPP_ +#define CEREAL_TYPES_VECTOR_HPP_ + +#include "../cereal.hpp" +#include + +namespace cereal +{ + //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value && !std::is_same::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector const & vector ) + { + ar( make_size_tag( static_cast(vector.size()) ) ); // number of elements + ar( binary_data( vector.data(), vector.size() * sizeof(T) ) ); + } + + //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported + template inline + typename std::enable_if, Archive>::value + && std::is_arithmetic::value && !std::is_same::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector & vector ) + { + size_type vectorSize; + ar( make_size_tag( vectorSize ) ); + + vector.resize( static_cast( vectorSize ) ); + ar( binary_data( vector.data(), static_cast( vectorSize ) * sizeof(T) ) ); + } + + //! Serialization for non-arithmetic vector types + template inline + typename std::enable_if<(!traits::is_output_serializable, Archive>::value + || !std::is_arithmetic::value) && !std::is_same::value, void>::type + CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector const & vector ) + { + ar( make_size_tag( static_cast(vector.size()) ) ); // number of elements + for(auto && v : vector) + ar( v ); + } + + //! Serialization for non-arithmetic vector types + template inline + typename std::enable_if<(!traits::is_input_serializable, Archive>::value + || !std::is_arithmetic::value) && !std::is_same::value, void>::type + CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector & vector ) + { + size_type size; + ar( make_size_tag( size ) ); + + vector.resize( static_cast( size ) ); + for(auto && v : vector) + ar( v ); + } + + //! Serialization for bool vector types + template inline + void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector const & vector ) + { + ar( make_size_tag( static_cast(vector.size()) ) ); // number of elements + for(const auto v : vector) + ar( static_cast(v) ); + } + + //! Serialization for bool vector types + template inline + void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector & vector ) + { + size_type size; + ar( make_size_tag( size ) ); + + vector.resize( static_cast( size ) ); + for(auto && v : vector) + { + bool b; + ar( b ); + v = b; + } + } +} // namespace cereal + +#endif // CEREAL_TYPES_VECTOR_HPP_ diff --git a/external/cereal/version.hpp b/external/cereal/version.hpp new file mode 100644 index 0000000..0ad7d41 --- /dev/null +++ b/external/cereal/version.hpp @@ -0,0 +1,52 @@ +/*! \file version.hpp + \brief Macros to detect cereal version + + These macros can assist in determining the version of cereal. Be + warned that cereal is not guaranteed to be compatible across + different versions. For more information on releases of cereal, + see https://github.com/USCiLab/cereal/releases. + + \ingroup utility */ +/* + Copyright (c) 2018, Shane Grant + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CEREAL_VERSION_HPP_ +#define CEREAL_VERSION_HPP_ + +//! The major version +#define CEREAL_VERSION_MAJOR 1 +//! The minor version +#define CEREAL_VERSION_MINOR 3 +//! The patch version +#define CEREAL_VERSION_PATCH 2 + +//! The full version as a single number +#define CEREAL_VERSION (CEREAL_VERSION_MAJOR * 10000 \ + + CEREAL_VERSION_MINOR * 100 \ + + CEREAL_VERSION_PATCH) + +#endif // CEREAL_VERSION_HPP_ diff --git a/external/porter2_stemmer/porter2_stemmer.cpp b/external/porter2_stemmer/porter2_stemmer.cpp new file mode 100644 index 0000000..571da50 --- /dev/null +++ b/external/porter2_stemmer/porter2_stemmer.cpp @@ -0,0 +1,550 @@ +/** + * @file porter2_stemmer.cpp + * @author Sean Massung + * @date September 2012 + * + * Implementation of + * http://snowball.tartarus.org/algorithms/english/stemmer.html + * + * Copyright (C) 2012 Sean Massung + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include "porter2_stemmer.h" + +using namespace Porter2Stemmer::internal; + +void Porter2Stemmer::stem(std::string& word) +{ + // special case short words or sentence tags + if (word.size() <= 2 || word == "" || word == "") + return; + + // max word length is 35 for English + if (word.size() > 35) + word = word.substr(0, 35); + + if (word[0] == '\'') + word = word.substr(1, word.size() - 1); + + if (special(word)) + return; + + changeY(word); + size_t startR1 = getStartR1(word); + size_t startR2 = getStartR2(word, startR1); + + step0(word); + + if (step1A(word)) + { + std::replace(word.begin(), word.end(), 'Y', 'y'); + return; + } + + step1B(word, startR1); + step1C(word); + step2(word, startR1); + step3(word, startR1, startR2); + step4(word, startR2); + step5(word, startR1, startR2); + + std::replace(word.begin(), word.end(), 'Y', 'y'); + return; +} + +void Porter2Stemmer::trim(std::string& word) +{ + if (word == "" || word == "") + return; + + std::transform(word.begin(), word.end(), word.begin(), ::tolower); + auto it + = std::remove_if(word.begin(), word.end(), [](char ch) + { + return !((ch >= 'a' && ch <= 'z') || ch == '\''); + }); + + word.erase(it, word.end()); +} + +size_t Porter2Stemmer::internal::getStartR1(const std::string& word) +{ + // special cases + if (word.size() >= 5 && word[0] == 'g' && word[1] == 'e' && word[2] == 'n' + && word[3] == 'e' && word[4] == 'r') + return 5; + if (word.size() >= 6 && word[0] == 'c' && word[1] == 'o' && word[2] == 'm' + && word[3] == 'm' && word[4] == 'u' && word[5] == 'n') + return 6; + if (word.size() >= 5 && word[0] == 'a' && word[1] == 'r' && word[2] == 's' + && word[3] == 'e' && word[4] == 'n') + return 5; + + // general case + return firstNonVowelAfterVowel(word, 1); +} + +size_t Porter2Stemmer::internal::getStartR2(const std::string& word, + size_t startR1) +{ + if (startR1 == word.size()) + return startR1; + + return firstNonVowelAfterVowel(word, startR1 + 1); +} + +size_t + Porter2Stemmer::internal::firstNonVowelAfterVowel(const std::string& word, + size_t start) +{ + for (size_t i = start; i != 0 && i < word.size(); ++i) + { + if (!isVowelY(word[i]) && isVowelY(word[i - 1])) + return i + 1; + } + + return word.size(); +} + +void Porter2Stemmer::internal::changeY(std::string& word) +{ + if (word[0] == 'y') + word[0] = 'Y'; + + for (size_t i = 1; i < word.size(); ++i) + { + if (word[i] == 'y' && isVowel(word[i - 1])) + word[i++] = 'Y'; // skip next iteration + } +} + +/* + Step 0 +*/ +void Porter2Stemmer::internal::step0(std::string& word) +{ + // short circuit the longest suffix + replaceIfExists(word, "'s'", "", 0) || replaceIfExists(word, "'s", "", 0) + || replaceIfExists(word, "'", "", 0); +} + +/* + Step 1a: + + sses + replace by ss + + ied ies + replace by i if preceded by more than one letter, otherwise by ie + (so ties -> tie, cries -> cri) + + us ss + do nothing + + s + delete if the preceding word part contains a vowel not immediately before + the + s (so gas and this retain the s, gaps and kiwis lose it) +*/ +bool Porter2Stemmer::internal::step1A(std::string& word) +{ + if (!replaceIfExists(word, "sses", "ss", 0)) + { + if (endsWith(word, "ied") || endsWith(word, "ies")) + { + // if preceded by only one letter + if (word.size() <= 4) + word.pop_back(); + else + { + word.pop_back(); + word.pop_back(); + } + } + else if (endsWith(word, "s") && !endsWith(word, "us") + && !endsWith(word, "ss")) + { + if (word.size() > 2 && containsVowel(word, 0, word.size() - 2)) + word.pop_back(); + } + } + + // special case after step 1a + return (word.size() == 6 || word.size() == 7) + && (word == "inning" || word == "outing" || word == "canning" + || word == "herring" || word == "earring" || word == "proceed" + || word == "exceed" || word == "succeed"); +} + +/* + Step 1b: + + eed eedly + replace by ee if in R1 + + ed edly ing ingly + delete if the preceding word part contains a vowel, and after the + deletion: + if the word ends at, bl or iz add e (so luxuriat -> luxuriate), or + if the word ends with a double remove the last letter (so hopp -> hop), or + if the word is short, add e (so hop -> hope) +*/ +void Porter2Stemmer::internal::step1B(std::string& word, size_t startR1) +{ + bool exists = endsWith(word, "eedly") || endsWith(word, "eed"); + + if (exists) // look only in startR1 now + replaceIfExists(word, "eedly", "ee", startR1) + || replaceIfExists(word, "eed", "ee", startR1); + else + { + size_t size = word.size(); + bool deleted = (containsVowel(word, 0, size - 2) + && replaceIfExists(word, "ed", "", 0)) + || (containsVowel(word, 0, size - 4) + && replaceIfExists(word, "edly", "", 0)) + || (containsVowel(word, 0, size - 3) + && replaceIfExists(word, "ing", "", 0)) + || (containsVowel(word, 0, size - 5) + && replaceIfExists(word, "ingly", "", 0)); + + if (deleted && (endsWith(word, "at") || endsWith(word, "bl") + || endsWith(word, "iz"))) + word.push_back('e'); + else if (deleted && endsInDouble(word)) + word.pop_back(); + else if (deleted && startR1 == word.size() && isShort(word)) + word.push_back('e'); + } +} + +/* + Step 1c: + + Replace suffix y or Y by i if preceded by a non-vowel which is not the first + letter of the word (so cry -> cri, by -> by, say -> say) +*/ +void Porter2Stemmer::internal::step1C(std::string& word) +{ + size_t size = word.size(); + if (size > 2 && (word[size - 1] == 'y' || word[size - 1] == 'Y')) + if (!isVowel(word[size - 2])) + word[size - 1] = 'i'; +} + +/* + Step 2: + + If found and in R1, perform the action indicated. + + tional: replace by tion + enci: replace by ence + anci: replace by ance + abli: replace by able + entli: replace by ent + izer, ization: replace by ize + ational, ation, ator: replace by ate + alism, aliti, alli: replace by al + fulness: replace by ful + ousli, ousness: replace by ous + iveness, iviti: replace by ive + biliti, bli: replace by ble + fulli: replace by ful + lessli: replace by less + ogi: replace by og if preceded by l + li: delete if preceded by a valid li-ending +*/ +void Porter2Stemmer::internal::step2(std::string& word, size_t startR1) +{ + static const std::pair + subs[] = {{"ational", "ate"}, + {"tional", "tion"}, + {"enci", "ence"}, + {"anci", "ance"}, + {"abli", "able"}, + {"entli", "ent"}, + {"izer", "ize"}, + {"ization", "ize"}, + {"ation", "ate"}, + {"ator", "ate"}, + {"alism", "al"}, + {"aliti", "al"}, + {"alli", "al"}, + {"fulness", "ful"}, + {"ousli", "ous"}, + {"ousness", "ous"}, + {"iveness", "ive"}, + {"iviti", "ive"}, + {"biliti", "ble"}, + {"bli", "ble"}, + {"fulli", "ful"}, + {"lessli", "less"}}; + + for (auto& sub : subs) + if (replaceIfExists(word, sub.first, sub.second, startR1)) + return; + + if (!replaceIfExists(word, "logi", "log", startR1 - 1)) + { + // make sure we choose the longest suffix + if (endsWith(word, "li") && !endsWith(word, "abli") + && !endsWith(word, "entli") && !endsWith(word, "aliti") + && !endsWith(word, "alli") && !endsWith(word, "ousli") + && !endsWith(word, "bli") && !endsWith(word, "fulli") + && !endsWith(word, "lessli")) + if (word.size() > 3 && word.size() - 2 >= startR1 + && isValidLIEnding(word[word.size() - 3])) + { + word.pop_back(); + word.pop_back(); + } + } +} + +/* + Step 3: + + If found and in R1, perform the action indicated. + + ational: replace by ate + tional: replace by tion + alize: replace by al + icate, iciti, ical: replace by ic + ful, ness: delete + ative: delete if in R2 +*/ +void Porter2Stemmer::internal::step3(std::string& word, size_t startR1, + size_t startR2) +{ + static const std::pair + subs[] = {{"ational", "ate"}, + {"tional", "tion"}, + {"alize", "al"}, + {"icate", "ic"}, + {"iciti", "ic"}, + {"ical", "ic"}, + {"ful", ""}, + {"ness", ""}}; + + for (auto& sub : subs) + if (replaceIfExists(word, sub.first, sub.second, startR1)) + return; + + replaceIfExists(word, "ative", "", startR2); +} + +/* + Step 4: + + If found and in R2, perform the action indicated. + + al ance ence er ic able ible ant ement ment ent ism ate + iti ous ive ize + delete + ion + delete if preceded by s or t +*/ +void Porter2Stemmer::internal::step4(std::string& word, size_t startR2) +{ + static const std::pair + subs[] = {{"al", ""}, + {"ance", ""}, + {"ence", ""}, + {"er", ""}, + {"ic", ""}, + {"able", ""}, + {"ible", ""}, + {"ant", ""}, + {"ement", ""}, + {"ment", ""}, + {"ism", ""}, + {"ate", ""}, + {"iti", ""}, + {"ous", ""}, + {"ive", ""}, + {"ize", ""}}; + + for (auto& sub : subs) + if (replaceIfExists(word, sub.first, sub.second, startR2)) + return; + + // make sure we only choose the longest suffix + if (!endsWith(word, "ement") && !endsWith(word, "ment")) + if (replaceIfExists(word, "ent", "", startR2)) + return; + + // short circuit + replaceIfExists(word, "sion", "s", startR2 - 1) + || replaceIfExists(word, "tion", "t", startR2 - 1); +} + +/* + Step 5: + + e delete if in R2, or in R1 and not preceded by a short syllable + l delete if in R2 and preceded by l +*/ +void Porter2Stemmer::internal::step5(std::string& word, size_t startR1, + size_t startR2) +{ + size_t size = word.size(); + if (word[size - 1] == 'e') + { + if (size - 1 >= startR2) + word.pop_back(); + else if (size - 1 >= startR1 && !isShort(word.substr(0, size - 1))) + word.pop_back(); + } + else if (word[word.size() - 1] == 'l') + { + if (word.size() - 1 >= startR2 && word[word.size() - 2] == 'l') + word.pop_back(); + } +} + +/* + Determines whether a word ends in a short syllable. + Define a short syllable in a word as either + + (a) a vowel followed by a non-vowel other than w, x or Y and preceded by a + non-vowel + (b) a vowel at the beginning of the word followed by a non-vowel. +*/ +bool Porter2Stemmer::internal::isShort(const std::string& word) +{ + size_t size = word.size(); + + if (size >= 3) + { + if (!isVowelY(word[size - 3]) && isVowelY(word[size - 2]) + && !isVowelY(word[size - 1]) && word[size - 1] != 'w' + && word[size - 1] != 'x' && word[size - 1] != 'Y') + return true; + } + return size == 2 && isVowelY(word[0]) && !isVowelY(word[1]); +} + +bool Porter2Stemmer::internal::special(std::string& word) +{ + static const std::unordered_map exceptions + = {{"skis", "ski"}, + {"skies", "sky"}, + {"dying", "die"}, + {"lying", "lie"}, + {"tying", "tie"}, + {"idly", "idl"}, + {"gently", "gentl"}, + {"ugly", "ugli"}, + {"early", "earli"}, + {"only", "onli"}, + {"singly", "singl"}}; + + // special cases + auto ex = exceptions.find(word); + if (ex != exceptions.end()) + { + word = ex->second.to_string(); + return true; + } + + // invariants + return word.size() >= 3 && word.size() <= 5 + && (word == "sky" || word == "news" || word == "howe" + || word == "atlas" || word == "cosmos" || word == "bias" + || word == "andes"); +} + +bool Porter2Stemmer::internal::isVowelY(char ch) +{ + return ch == 'e' || ch == 'a' || ch == 'i' || ch == 'o' || ch == 'u' + || ch == 'y'; +} + +bool Porter2Stemmer::internal::isVowel(char ch) +{ + return ch == 'e' || ch == 'a' || ch == 'i' || ch == 'o' || ch == 'u'; +} + +bool Porter2Stemmer::internal::endsWith(meta::util::string_view word, + meta::util::string_view str) +{ + if (word.size() < str.size()) + return false; + + return word.substr(word.size() - str.size()) == str; +} + +bool Porter2Stemmer::internal::endsInDouble(const std::string& word) +{ + if (word.size() >= 2) + { + char a = word[word.size() - 1]; + char b = word[word.size() - 2]; + + if (a == b) + return a == 'b' || a == 'd' || a == 'f' || a == 'g' || a == 'm' + || a == 'n' || a == 'p' || a == 'r' || a == 't'; + } + + return false; +} + +bool Porter2Stemmer::internal::replaceIfExists( + std::string& word, meta::util::string_view suffix, + meta::util::string_view replacement, size_t start) +{ + if (suffix.size() > word.size()) + return false; + + size_t idx = word.size() - suffix.size(); + if (idx < start) + return false; + + auto diff = static_cast(idx); + if (std::equal(word.begin() + diff, word.end(), suffix.begin())) + { + word.replace(idx, suffix.size(), replacement.data()); + return true; + } + return false; +} + +bool Porter2Stemmer::internal::isValidLIEnding(char ch) +{ + return ch == 'c' || ch == 'd' || ch == 'e' || ch == 'g' || ch == 'h' + || ch == 'k' || ch == 'm' || ch == 'n' || ch == 'r' || ch == 't'; +} + +bool Porter2Stemmer::internal::containsVowel(const std::string& word, + size_t start, size_t end) +{ + if (end <= word.size()) + { + for (size_t i = start; i < end; ++i) + if (isVowelY(word[i])) + return true; + } + return false; +} diff --git a/external/porter2_stemmer/porter2_stemmer.h b/external/porter2_stemmer/porter2_stemmer.h new file mode 100644 index 0000000..1a89b5c --- /dev/null +++ b/external/porter2_stemmer/porter2_stemmer.h @@ -0,0 +1,88 @@ +/** + * @file porter2_stemmer.h + * @author Sean Massung + * @date September 2012 + * + * Implementation of + * http://snowball.tartarus.org/algorithms/english/stemmer.html + * + * Copyright (C) 2012 Sean Massung + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _PORTER2_STEMMER_H_ +#define _PORTER2_STEMMER_H_ + +#include +#include +#include "util/string_view.h" + +namespace Porter2Stemmer { + void stem(std::string &word); + + void trim(std::string &word); + + namespace internal { + size_t firstNonVowelAfterVowel(const std::string &word, size_t start); + + size_t getStartR1(const std::string &word); + + size_t getStartR2(const std::string &word, size_t startR1); + + void changeY(std::string &word); + + void step0(std::string &word); + + bool step1A(std::string &word); + + void step1B(std::string &word, size_t startR1); + + void step1C(std::string &word); + + void step2(std::string &word, size_t startR1); + + void step3(std::string &word, size_t startR1, size_t startR2); + + void step4(std::string &word, size_t startR2); + + void step5(std::string &word, size_t startR1, size_t startR2); + + inline bool isShort(const std::string &word); + + bool special(std::string &word); + + bool isVowel(char ch); + + bool isVowelY(char ch); + + bool endsWith(meta::util::string_view word, meta::util::string_view str); + + bool endsInDouble(const std::string &word); + + bool replaceIfExists(std::string &word, meta::util::string_view suffix, + meta::util::string_view replacement, size_t start); + + bool isValidLIEnding(char ch); + + bool containsVowel(const std::string &word, size_t start, size_t end); + } +} + +#endif diff --git a/external/porter2_stemmer/util/hash.h b/external/porter2_stemmer/util/hash.h new file mode 100644 index 0000000..f5b115d --- /dev/null +++ b/external/porter2_stemmer/util/hash.h @@ -0,0 +1,564 @@ +/** + * @file hash.h + * @author Chase Geigle + * + * All files in META are dual-licensed under the MIT and NCSA licenses. For more + * details, consult the file LICENSE.mit and LICENSE.ncsa in the root of the + * project. + */ + +#ifndef META_UTIL_HASH_H_ +#define META_UTIL_HASH_H_ + +#include +#include +#include +#include + +namespace meta +{ +namespace util +{ + +namespace detail +{ +template +struct static_and; + +template +struct static_and +{ + const static constexpr bool value = B && static_and::value; +}; + +template <> +struct static_and<> +{ + const static constexpr bool value = true; +}; + +template +struct static_add; + +template +struct static_add +{ + const static constexpr std::size_t value + = Size + static_add::value; +}; + +template <> +struct static_add<> +{ + const static constexpr std::size_t value = 0; +}; +} + +/** + * Implementation of MurmurHash3. Depending on the template parameter, it + * will return a 32-bit or 64-bit hash value. + */ +template +class murmur_hash; + +namespace detail +{ +inline uint32_t rotl(uint32_t x, int8_t r) +{ + return (x << r) | (x >> (32 - r)); +} + +inline uint64_t rotl(uint64_t x, int8_t r) +{ + return (x << r) | (x >> (64 - r)); +} + +inline uint32_t fmix(uint32_t h) +{ + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; +} + +inline uint64_t fmix(uint64_t h) +{ + h ^= h >> 33; + h *= 0xff51afd7ed558ccdLLU; + h ^= h >> 33; + h *= 0xc4ceb9fe1a85ec53LLU; + h ^= h >> 33; + + return h; +} +} + +/** + * Murmur3Hash for 32-bit outputs. Based on MurmurHash3_x86_32. + */ +template <> +class murmur_hash<4> +{ + private: + // this *has* to be uint32_t for OS X clang to correctly resolve + // between the two versions of rotl/fmix in namespace detail above. + uint32_t out_; + std::array buf_; + uint32_t buflen_; + uint32_t total_length_; + + const static constexpr uint32_t c1 = 0xcc9e2d51; + const static constexpr uint32_t c2 = 0x1b873593; + + void handle_block_4(uint32_t block) + { + block *= c1; + block = detail::rotl(block, 15); + block *= c2; + + out_ ^= block; + out_ = detail::rotl(out_, 13); + out_ = out_ * 5 + 0xe6546b64; + } + + public: + using result_type = std::size_t; + + murmur_hash(std::size_t seed) + : out_{static_cast(seed)}, buflen_{0}, total_length_{0} + { + } + + void operator()(const void* in, std::size_t len) + { + auto data = reinterpret_cast(in); + total_length_ += static_cast(len); + + // handle 4-byte blocks at a time, starting from the data we had + // "left over" from the last call to operator() + auto end = data + len; + while (buflen_ > 0 && buflen_ < 4 && data < end) + buf_[buflen_++] = *(data++); + + if (buflen_ / 4 > 0) + { + handle_block_4(reinterpret_cast(buf_.data())[0]); + buflen_ = 0; + } + + // now handle the remaining 4-byte blocks in this data + const auto nblocks = (end - data) / 4; + auto blocks = reinterpret_cast(data + nblocks * 4); + for (long i = -nblocks; i; ++i) + handle_block_4(blocks[i]); + + // copy over the remaining 3 bytes or less for finalizing or use on + // the next call to operator() + const uint8_t* tail = data + nblocks * 4; + if (end - tail) + { + buflen_ = static_cast(end - tail); + assert(buflen_ < 4); + std::copy(tail, end, buf_.begin()); + } + } + + explicit operator std::size_t() + { + uint32_t k1 = 0; + switch (buflen_ & 3) + { + case 3: + k1 ^= static_cast(buf_[2]) << 16; + case 2: + k1 ^= static_cast(buf_[1]) << 8; + case 1: + k1 ^= buf_[0]; + k1 *= c1; + k1 = detail::rotl(k1, 15); + k1 *= c2; + out_ ^= k1; + } + + out_ ^= total_length_; + + return detail::fmix(out_); + } +}; + +/** + * MurmurHash3 for 64-bit outputs. Based on MurmurHash3_x64_128. + */ +template <> +class murmur_hash<8> +{ + private: + uint64_t h1_; + uint64_t h2_; + std::array buf_; + std::size_t buflen_; + std::size_t total_length_; + + const static constexpr uint64_t c1 = 0x87c37b91114253d5LLU; + const static constexpr uint64_t c2 = 0x4cf5ad432745937fLLU; + + inline void handle_block_16(const uint8_t* start) + { + auto blocks = reinterpret_cast(start); + auto k1 = blocks[0]; + auto k2 = blocks[1]; + + k1 *= c1; + k1 = detail::rotl(k1, 31); + k1 *= c2; + h1_ ^= k1; + + h1_ = detail::rotl(h1_, 27); + h1_ += h2_; + h1_ = h1_ * 5 + 0x52dce729; + + k2 *= c2; + k2 = detail::rotl(k2, 33); + k2 *= c1; + h2_ ^= k2; + + h2_ = detail::rotl(h2_, 31); + h2_ += h1_; + h2_ = h2_ * 5 + 0x38495ab5; + } + + public: + using result_type = std::size_t; + + murmur_hash(uint64_t seed) + : h1_{seed}, h2_{seed}, buflen_{0}, total_length_{0} + { + } + + void operator()(const void* in, std::size_t len) + { + auto data = reinterpret_cast(in); + total_length_ += len; + + // handle 16-byte blocks at a time, starting from the data we had + // "left over" from the last call to operator() + auto end = data + len; + while (buflen_ > 0 && buflen_ < 16 && data < end) + buf_[buflen_++] = *(data++); + + if (buflen_ / 16 > 0) + { + handle_block_16(buf_.data()); + buflen_ = 0; + } + + // now handle the remaining 16-byte blocks in this data + const auto nblocks = (end - data) / 16; + for (int i = 0; i < nblocks; ++i) + { + handle_block_16(data); + data += 16; + } + + // copy over the remaining 15 bytes or less for finalizing or use + // on the next call to operator() + if (end - data) + { + buflen_ = static_cast(end - data); + assert(buflen_ < 16); + std::copy(data, end, buf_.begin()); + } + } + + explicit operator std::size_t() + { + uint64_t k1 = 0; + uint64_t k2 = 0; + + switch (buflen_) + { + case 15: + k2 ^= static_cast(buf_[14]) << 48; + case 14: + k2 ^= static_cast(buf_[13]) << 40; + case 13: + k2 ^= static_cast(buf_[12]) << 32; + case 12: + k2 ^= static_cast(buf_[11]) << 24; + case 11: + k2 ^= static_cast(buf_[10]) << 16; + case 10: + k2 ^= static_cast(buf_[9]) << 8; + case 9: + k2 ^= static_cast(buf_[8]); + k2 *= c2; + k2 = detail::rotl(k2, 33); + k2 *= c1; + h2_ ^= k2; + + case 8: + k1 ^= static_cast(buf_[7]) << 56; + case 7: + k1 ^= static_cast(buf_[6]) << 48; + case 6: + k1 ^= static_cast(buf_[5]) << 40; + case 5: + k1 ^= static_cast(buf_[4]) << 32; + case 4: + k1 ^= static_cast(buf_[3]) << 24; + case 3: + k1 ^= static_cast(buf_[2]) << 16; + case 2: + k1 ^= static_cast(buf_[1]) << 8; + case 1: + k1 ^= static_cast(buf_[0]); + k1 *= c1; + k1 = detail::rotl(k1, 31); + k1 *= c2; + h1_ ^= k1; + } + + h1_ ^= total_length_; + h2_ ^= total_length_; + + h1_ += h2_; + h2_ += h1_; + + h1_ = detail::fmix(h1_); + h2_ = detail::fmix(h2_); + + h1_ += h2_; + // h2 += h1, unneeded since we only want 64-bits. + + return h1_; + } +}; + +template +struct is_contiguously_hashable +{ + const static constexpr bool value = std::is_integral::value + || std::is_enum::value + || std::is_pointer::value; +}; + +template +struct is_contiguously_hashable : public is_contiguously_hashable +{ +}; + +template +struct is_contiguously_hashable + : public is_contiguously_hashable +{ +}; + +template +struct is_contiguously_hashable : public is_contiguously_hashable +{ +}; + +template +struct is_contiguously_hashable> +{ + const static constexpr bool value + = is_contiguously_hashable::value + && is_contiguously_hashable::value + && sizeof(T) + sizeof(U) == sizeof(std::pair); +}; + +template +struct is_contiguously_hashable> +{ + const static constexpr bool value + = detail::static_and::value...>::value + && detail::static_add::value + == sizeof(std::tuple); +}; + +template +struct is_contiguously_hashable> +{ + const static constexpr bool value + = is_contiguously_hashable::value + && sizeof(T) * N == sizeof(std::array); +}; + +template +inline typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, const T& t) +{ + h(std::addressof(t), sizeof(t)); +} + +template +inline typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, T t) +{ + // -0 and 0 are the same, but have different bit patterns, so normalize + // to positive zero before hashing + if (t == 0) + t = 0; + h(std::addressof(t), sizeof(t)); +} + +template +inline void hash_append(HashAlgorithm& h, std::nullptr_t) +{ + const void* p = nullptr; + h(std::addressof(p), sizeof(p)); +} + +// all of these hash_appends below need to be forward declared so they can +// find one another in their implementations + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, T(&a)[N]); + +template +typename std::enable_if>::value>::type +hash_append(HashAlgorithm& h, const std::pair& p); + +template +typename std::enable_if>::value>:: + type + hash_append(HashAlgorithm& h, const std::tuple& t); + +template +typename std::enable_if>::value>:: + type + hash_append(HashAlgorithm& h, const std::array& a); + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, const std::basic_string& s); + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, const std::basic_string& s); + +template +void hash_append(HashAlgorithm& h, const T1& first, const T2& second, + const Ts&... ts); + +// begin implementations for hash_append + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, T(&a)[N]) +{ + for (const auto& t : a) + hash_append(h, t); +} + +template +typename std::enable_if>::value>::type +hash_append(HashAlgorithm& h, const std::pair& p) +{ + hash_append(h, p.first, p.second); +} + +namespace detail +{ +// @see +// http://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer +template +struct sequence; + +template +struct generate : generate +{ + // nothing +}; + +template +struct generate<0, S...> +{ + using type = sequence; +}; + +template +void hash_tuple(HashAlgorithm& h, const std::tuple& t, sequence) +{ + hash_append(h, std::get(t)...); +} +} + +template +typename std::enable_if>::value>:: + type + hash_append(HashAlgorithm& h, const std::tuple& t) +{ + detail::hash_tuple(h, t, typename detail::generate::type{}); +} + +template +typename std::enable_if>::value>:: + type + hash_append(HashAlgorithm& h, const std::array& a) +{ + for (const auto& t : a) + hash_append(h, a); +} + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, const std::basic_string& s) +{ + h(s.data(), s.size() * sizeof(Char)); + hash_append(h, s.size()); +} + +template +typename std::enable_if::value>::type +hash_append(HashAlgorithm& h, const std::basic_string& s) +{ + for (const auto& c : s) + hash_append(h, c); + hash_append(h, s.size()); +} + +template +void hash_append(HashAlgorithm& h, const T1& first, const T2& second, + const Ts&... ts) +{ + hash_append(h, first); + hash_append(h, second, ts...); +} + +namespace detail +{ +inline uint64_t get_process_seed() +{ + static uint64_t seed = std::random_device{}(); + return seed; +} +} + +/** + * A generic, randomly seeded hash function. + * @see + * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html#seeding + */ +template > +struct hash +{ + using result_type = typename HashAlgorithm::result_type; + + template + result_type operator()(const T& t) const + { + auto seed = detail::get_process_seed(); + HashAlgorithm h(seed); + using util::hash_append; + hash_append(h, t); + return static_cast(h); + } +}; +} +} +#endif diff --git a/external/porter2_stemmer/util/string_view.h b/external/porter2_stemmer/util/string_view.h new file mode 100644 index 0000000..5fb1575 --- /dev/null +++ b/external/porter2_stemmer/util/string_view.h @@ -0,0 +1,571 @@ +/** + * @file string_view.h + * @author Chase Geigle + * + * All files in META are dual-licensed under the MIT and NCSA licenses. For more + * details, consult the file LICENSE.mit and LICENSE.ncsa in the root of the + * project. + */ + +#ifndef META_UTIL_STRING_VIEW_H_ +#define META_UTIL_STRING_VIEW_H_ + +#include "./hash.h" + +#if META_HAS_EXPERIMENTAL_STRING_VIEW +#include +namespace meta +{ +namespace util +{ +template > +using basic_string_view = std::experimental::basic_string_view; + +using string_view = basic_string_view; +using u16string_view = basic_string_view; +using u32string_view = basic_string_view; +using wstring_view = basic_string_view; +} +} +#else + +#include +#include +#include + +namespace meta { + namespace util { + +/** + * A non-owning reference to a string. I make no claims that this is + * completely standards-compliant---this is just a best-effort attempt at + * implementing what we need for MeTA. I have built this using its paper's + * wording for the Fundamentals TS. + * + * @see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3921.html + */ + template> + class basic_string_view { + public: + using traits_type = Traits; + using value_type = Char; + using pointer = Char *; + using const_pointer = const Char *; + using reference = Char &; + using const_reference = const Char &; + using const_iterator = const_pointer; + using iterator = const_iterator; + using const_reverse_iterator = std::reverse_iterator; + using reverse_iterator = const_reverse_iterator; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + static constexpr size_type npos = size_type(-1); + + constexpr basic_string_view() noexcept: data_{nullptr}, size_{0} { + // nothing + } + + constexpr basic_string_view(const basic_string_view &) noexcept = default; + + basic_string_view &operator=(const basic_string_view &) noexcept = default; + + template + basic_string_view( + const std::basic_string &str) noexcept + : data_{str.data()}, + size_{str.size()} { + // nothing + } + + constexpr basic_string_view(const Char *str) + : data_{str}, size_{Traits::length(str)} { + // nothing + } + + constexpr basic_string_view(const Char *str, size_type len) + : data_{str}, size_{len} { + // nothing + } + + constexpr const_iterator begin() const noexcept { + return data_; + } + + constexpr const_iterator end() const noexcept { + return data_ + size_; + } + + constexpr const_iterator cbegin() const noexcept { + return begin(); + } + + constexpr const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator rbegin() const noexcept { + return {end()}; + } + + const_reverse_iterator rend() const noexcept { + return {begin()}; + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + constexpr size_type size() const noexcept { + return size_; + } + + constexpr size_type length() const noexcept { + return size(); + } + + constexpr size_type max_size() const noexcept { + return size(); + } + + constexpr bool empty() const noexcept { + return size() == 0; + } + + constexpr const_reference operator[](size_type pos) const { + return data_[pos]; + } + + const_reference at(size_type pos) const { + if (pos >= size()) + throw std::out_of_range{"index out of bounds"}; + return data_[pos]; + } + + constexpr const_reference front() const { + return data_[0]; + } + + constexpr const_reference back() const { + return data_[size_ - 1]; + } + + constexpr const_pointer data() const noexcept { + return data_; + } + + void clear() noexcept { + data_ = nullptr; + size_ = 0; + } + + void remove_prefix(size_type n) { + data_ += n; + size_ -= n; + } + + void remove_suffix(size_type n) { + size_ -= n; + } + + void swap(basic_string_view &s) noexcept { + using ::std::swap; + swap(data_, s.data_); + swap(size_, s.size_); + } + + template + explicit operator std::basic_string() const { + return {begin(), end()}; + } + + template> + std::basic_string to_string(const Allocator &a + = Allocator{}) const { + return {begin(), end(), a}; + } + + size_type copy(Char *s, size_type n, size_type pos = 0) const { + if (pos > size()) + throw std::out_of_range{"index out of bounds"}; + + auto rlen = std::min(n, size() - pos); + std::copy_n(begin() + pos, rlen, s); + return rlen; + } + + constexpr basic_string_view substr(size_type pos = 0, + size_type n = npos) const { + return pos > size() + ? throw std::out_of_range{"index out of bounds"} + : basic_string_view{data() + pos, std::min(n, size() - pos)}; + } + + int compare(basic_string_view s) const noexcept { + auto cmp + = Traits::compare(data(), s.data(), std::min(size(), s.size())); + if (cmp != 0) + return cmp; + + if (size() < s.size()) + return -1; + + if (size() == s.size()) + return 0; + + return 1; + } + + constexpr int compare(size_type pos1, size_type n1, + basic_string_view s) const { + return substr(pos1, n1).compare(s); + } + + constexpr int compare(size_type pos1, size_type n1, basic_string_view s, + size_type pos2, size_type n2) const { + return substr(pos1, n1).compare(s.substr(pos2, n2)); + } + + constexpr int compare(const Char *s) const { + return compare(basic_string_view{s}); + } + + constexpr int compare(size_type pos1, size_type n1, const Char *s) const { + return substr(pos1, n1).compare(basic_string_view{s}); + } + + constexpr int compare(size_type pos1, size_type n1, const Char *s, + size_type n2) const { + return substr(pos1, n1).compare(basic_string_view{s, n2}); + } + + size_type find(basic_string_view s, size_type pos = 0) const noexcept { + if (pos >= size()) + return npos; + + auto it + = std::search(begin() + pos, end(), s.begin(), s.end(), Traits::eq); + if (it == end()) + return npos; + return std::distance(begin(), it); + } + + constexpr size_type find(Char c, size_type pos = 0) const noexcept { + return find(basic_string_view{&c, 1}, pos); + } + + constexpr size_type find(const Char *s, size_type pos, size_type n) const { + return find(basic_string_view{s, n}, pos); + } + + constexpr size_type find(const Char *s, size_type pos = 0) const { + return find(basic_string_view{s}, pos); + } + + size_type rfind(basic_string_view s, size_type pos = npos) const noexcept { + if (size() < s.size()) + return npos; + + pos = std::min(pos, size()); + if (s.size() < size() - pos) + pos += s.size(); + else + pos = size(); + + auto it = std::find_end(begin(), begin() + pos, s.begin(), s.end(), + Traits::eq); + + if (it == begin() + pos) + return npos; + return std::distance(begin(), it); + } + + constexpr size_type rfind(Char c, size_type pos = npos) const noexcept { + return rfind(basic_string_view{&c, 1}, pos); + } + + constexpr size_type rfind(const Char *s, size_type pos, size_type n) const { + return rfind(basic_string_view{s, n}, pos); + } + + constexpr size_type rfind(const Char *s, size_type pos = npos) const { + return rfind(basic_string_view{s}, pos); + } + + size_type find_first_of(basic_string_view s, size_type pos = 0) const + noexcept { + if (pos >= size()) + return npos; + + auto it = std::find_first_of(begin() + pos, end(), s.begin(), s.end(), + Traits::eq); + if (it == end()) + return npos; + return std::distance(begin(), it); + } + + constexpr size_type find_first_of(Char c, size_type pos = 0) const noexcept { + return find_first_of(basic_string_view{&c, 1}, pos); + } + + constexpr size_type find_first_of(const Char *s, size_type pos, + size_type n) const { + return find_first_of(basic_string_view{s, n}, pos); + } + + constexpr size_type find_first_of(const Char *s, size_type pos = 0) const { + return find_first_of(basic_string_view{s}, pos); + } + + size_type find_last_of(basic_string_view s, size_type pos = npos) const + noexcept { + if (pos >= size()) + return npos; + + auto diff = size() - std::min(size(), pos); + auto it = std::find_first_of(rbegin() + diff, rend(), s.begin(), + s.end(), Traits::eq); + if (it == rend()) + return npos; + return size() - 1 - std::distance(rbegin(), it); + } + + constexpr size_type find_last_of(Char c, size_type pos = npos) const + noexcept { + return find_last_of(basic_string_view{&c, 1}, pos); + } + + constexpr size_type find_last_of(const Char *s, size_type pos, + size_type n) const { + return find_last_of(basic_string_view{s, n}, pos); + } + + constexpr size_type find_last_of(const Char *s, size_type pos = npos) const { + return find_last_of(basic_string_view{s}, pos); + } + + size_type find_first_not_of(basic_string_view s, size_type pos = 0) const + noexcept { + if (pos >= size()) + return npos; + + auto it = std::find_if(begin(), end(), [&](const_reference c) { + return std::find(s.begin(), s.end(), c, + Traits::eq) == s.end(); + }); + if (it == end()) + return npos; + return std::distance(begin(), it); + } + + constexpr size_type find_first_not_of(Char c, size_type pos = 0) const + noexcept { + return find_first_not_of(basic_string_view{&c, 1}, pos); + } + + constexpr size_type find_first_not_of(const Char *s, size_type pos, + size_type n) const { + return find_first_not_of(basic_string_view{s, n}, pos); + } + + constexpr size_type find_first_not_of(const Char *s, + size_type pos = 0) const { + return find_first_not_of(basic_string_view{s}, pos); + } + + size_type find_last_not_of(basic_string_view s, size_type pos = npos) const + noexcept { + if (pos >= size()) + return npos; + + auto diff = size() - std::min(size(), pos); + auto it = std::find_if(rbegin() + diff, rend(), [&](const_reference c) { + return std::find(s.begin(), s.end(), c, + Traits::eq) == s.end(); + }); + if (it == rend()) + return npos; + return size() - 1 - std::distance(rbegin(), it); + } + + constexpr size_type find_last_not_of(Char c, size_type pos = npos) const + noexcept { + return find_last_not_of(basic_string_view{&c, 1}, pos); + } + + constexpr size_type find_last_not_of(const Char *s, size_type pos, + size_type n) const { + return find_last_not_of(basic_string_view{s, n}, pos); + } + + constexpr size_type find_last_not_of(const Char *s, + size_type pos = npos) const { + return find_last_not_of(basic_string_view{s}, pos); + } + + private: + const_pointer data_; + size_type size_; + }; + + using string_view = basic_string_view; + using u16string_view = basic_string_view; + using u32string_view = basic_string_view; + using wstring_view = basic_string_view; + + namespace { + template + using identity = typename std::decay::type; + } + + template + constexpr bool operator==(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) == 0; + } + + template + constexpr bool + operator==(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) == 0; + } + + template + constexpr bool operator==(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) == 0; + } + + template + constexpr bool operator!=(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) != 0; + } + + template + constexpr bool + operator!=(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) != 0; + } + + template + constexpr bool operator!=(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) != 0; + } + + template + constexpr bool operator<(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) < 0; + } + + template + constexpr bool operator<(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) < 0; + } + + template + constexpr bool operator<(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) < 0; + } + + template + constexpr bool operator>(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) > 0; + } + + template + constexpr bool operator>(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) > 0; + } + + template + constexpr bool operator>(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) > 0; + } + + template + constexpr bool operator<=(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) <= 0; + } + + template + constexpr bool + operator<=(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) <= 0; + } + + template + constexpr bool operator<=(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) <= 0; + } + + template + constexpr bool operator>=(basic_string_view lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) >= 0; + } + + template + constexpr bool + operator>=(basic_string_view lhs, + identity> rhs) noexcept { + return lhs.compare(rhs) >= 0; + } + + template + constexpr bool operator>=(identity> lhs, + basic_string_view rhs) noexcept { + return lhs.compare(rhs) >= 0; + } + + template + std::basic_ostream & + operator<<(std::basic_ostream &os, + basic_string_view str) { + return os << str.to_string(); + } + } +} + +namespace std { + template + struct hash> + : public meta::util::hash<> { + }; +} +#endif // !META_HAS_EXPERIMENTAL_STRING_VIEW + +namespace meta { + namespace util { + template + typename std::enable_if::value>::type + hash_append(HashAlgorithm &h, const basic_string_view &s) { + h(s.data(), s.size() * sizeof(Char)); + hash_append(h, s.size()); + } + + template + typename std::enable_if::value>::type + hash_append(HashAlgorithm &h, const basic_string_view &s) { + for (const auto &c: s) + hash_append(h, c); + hash_append(h, s.size()); + } + } +} +#endif // META_UTIL_STRING_VIEW_H_ diff --git a/external/rapidjson/allocators.h b/external/rapidjson/allocators.h new file mode 100644 index 0000000..12bc5ba --- /dev/null +++ b/external/rapidjson/allocators.h @@ -0,0 +1,692 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" +#include "internal/meta.h" + +#include + +#if RAPIDJSON_HAS_CXX11 +#include +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + + +/*! \def RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User-defined kDefaultChunkCapacity definition. + + User can define this as any \c size that is a power of 2. +*/ + +#ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY +#define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return RAPIDJSON_MALLOC(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + RAPIDJSON_FREE(originalPtr); + return NULL; + } + return RAPIDJSON_REALLOC(originalPtr, newSize); + } + static void Free(void *ptr) RAPIDJSON_NOEXCEPT { RAPIDJSON_FREE(ptr); } + + bool operator==(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { + return true; + } + bool operator!=(const CrtAllocator&) const RAPIDJSON_NOEXCEPT { + return false; + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + struct SharedData { + ChunkHeader *chunkHead; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + BaseAllocator* ownBaseAllocator; //!< base allocator created by this object. + size_t refcount; + bool ownBuffer; + }; + + static const size_t SIZEOF_SHARED_DATA = RAPIDJSON_ALIGN(sizeof(SharedData)); + static const size_t SIZEOF_CHUNK_HEADER = RAPIDJSON_ALIGN(sizeof(ChunkHeader)); + + static inline ChunkHeader *GetChunkHead(SharedData *shared) + { + return reinterpret_cast(reinterpret_cast(shared) + SIZEOF_SHARED_DATA); + } + static inline uint8_t *GetChunkBuffer(SharedData *shared) + { + return reinterpret_cast(shared->chunkHead) + SIZEOF_CHUNK_HEADER; + } + + static const size_t kDefaultChunkCapacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. + +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + static const bool kRefCounted = true; //!< Tell users that this allocator is reference counted on copy + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + explicit + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunk_capacity_(chunkSize), + baseAllocator_(baseAllocator ? baseAllocator : RAPIDJSON_NEW(BaseAllocator)()), + shared_(static_cast(baseAllocator_ ? baseAllocator_->Malloc(SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER) : 0)) + { + RAPIDJSON_ASSERT(baseAllocator_ != 0); + RAPIDJSON_ASSERT(shared_ != 0); + if (baseAllocator) { + shared_->ownBaseAllocator = 0; + } + else { + shared_->ownBaseAllocator = baseAllocator_; + } + shared_->chunkHead = GetChunkHead(shared_); + shared_->chunkHead->capacity = 0; + shared_->chunkHead->size = 0; + shared_->chunkHead->next = 0; + shared_->ownBuffer = true; + shared_->refcount = 1; + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunk_capacity_(chunkSize), + baseAllocator_(baseAllocator), + shared_(static_cast(AlignBuffer(buffer, size))) + { + RAPIDJSON_ASSERT(size >= SIZEOF_SHARED_DATA + SIZEOF_CHUNK_HEADER); + shared_->chunkHead = GetChunkHead(shared_); + shared_->chunkHead->capacity = size - SIZEOF_SHARED_DATA - SIZEOF_CHUNK_HEADER; + shared_->chunkHead->size = 0; + shared_->chunkHead->next = 0; + shared_->ownBaseAllocator = 0; + shared_->ownBuffer = false; + shared_->refcount = 1; + } + + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT : + chunk_capacity_(rhs.chunk_capacity_), + baseAllocator_(rhs.baseAllocator_), + shared_(rhs.shared_) + { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + ++shared_->refcount; + } + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) RAPIDJSON_NOEXCEPT + { + RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); + ++rhs.shared_->refcount; + this->~MemoryPoolAllocator(); + baseAllocator_ = rhs.baseAllocator_; + chunk_capacity_ = rhs.chunk_capacity_; + shared_ = rhs.shared_; + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + MemoryPoolAllocator(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT : + chunk_capacity_(rhs.chunk_capacity_), + baseAllocator_(rhs.baseAllocator_), + shared_(rhs.shared_) + { + RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); + rhs.shared_ = 0; + } + MemoryPoolAllocator& operator=(MemoryPoolAllocator&& rhs) RAPIDJSON_NOEXCEPT + { + RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); + this->~MemoryPoolAllocator(); + baseAllocator_ = rhs.baseAllocator_; + chunk_capacity_ = rhs.chunk_capacity_; + shared_ = rhs.shared_; + rhs.shared_ = 0; + return *this; + } +#endif + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() RAPIDJSON_NOEXCEPT { + if (!shared_) { + // do nothing if moved + return; + } + if (shared_->refcount > 1) { + --shared_->refcount; + return; + } + Clear(); + BaseAllocator *a = shared_->ownBaseAllocator; + if (shared_->ownBuffer) { + baseAllocator_->Free(shared_); + } + RAPIDJSON_DELETE(a); + } + + //! Deallocates all memory chunks, excluding the first/user one. + void Clear() RAPIDJSON_NOEXCEPT { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + for (;;) { + ChunkHeader* c = shared_->chunkHead; + if (!c->next) { + break; + } + shared_->chunkHead = c->next; + baseAllocator_->Free(c); + } + shared_->chunkHead->size = 0; + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const RAPIDJSON_NOEXCEPT { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + size_t capacity = 0; + for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const RAPIDJSON_NOEXCEPT { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + size_t size = 0; + for (ChunkHeader* c = shared_->chunkHead; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Whether the allocator is shared. + /*! \return true or false. + */ + bool Shared() const RAPIDJSON_NOEXCEPT { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + return shared_->refcount > 1; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (RAPIDJSON_UNLIKELY(shared_->chunkHead->size + size > shared_->chunkHead->capacity)) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = GetChunkBuffer(shared_) + shared_->chunkHead->size; + shared_->chunkHead->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == GetChunkBuffer(shared_) + shared_->chunkHead->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (shared_->chunkHead->size + increment <= shared_->chunkHead->capacity) { + shared_->chunkHead->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) RAPIDJSON_NOEXCEPT { (void)ptr; } // Do nothing + + //! Compare (equality) with another MemoryPoolAllocator + bool operator==(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { + RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0); + RAPIDJSON_NOEXCEPT_ASSERT(rhs.shared_->refcount > 0); + return shared_ == rhs.shared_; + } + //! Compare (inequality) with another MemoryPoolAllocator + bool operator!=(const MemoryPoolAllocator& rhs) const RAPIDJSON_NOEXCEPT { + return !operator==(rhs); + } + +private: + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + shared_->ownBaseAllocator = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); + if (ChunkHeader* chunk = static_cast(baseAllocator_->Malloc(SIZEOF_CHUNK_HEADER + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = shared_->chunkHead; + shared_->chunkHead = chunk; + return true; + } + else + return false; + } + + static inline void* AlignBuffer(void* buf, size_t &size) + { + RAPIDJSON_NOEXCEPT_ASSERT(buf != 0); + const uintptr_t mask = sizeof(void*) - 1; + const uintptr_t ubuf = reinterpret_cast(buf); + if (RAPIDJSON_UNLIKELY(ubuf & mask)) { + const uintptr_t abuf = (ubuf + mask) & ~mask; + RAPIDJSON_ASSERT(size >= abuf - ubuf); + buf = reinterpret_cast(abuf); + size -= abuf - ubuf; + } + return buf; + } + + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + SharedData *shared_; //!< The shared data of the allocator +}; + +namespace internal { + template + struct IsRefCounted : + public FalseType + { }; + template + struct IsRefCounted::Type> : + public TrueType + { }; +} + +template +inline T* Realloc(A& a, T* old_p, size_t old_n, size_t new_n) +{ + RAPIDJSON_NOEXCEPT_ASSERT(old_n <= SIZE_MAX / sizeof(T) && new_n <= SIZE_MAX / sizeof(T)); + return static_cast(a.Realloc(old_p, old_n * sizeof(T), new_n * sizeof(T))); +} + +template +inline T *Malloc(A& a, size_t n = 1) +{ + return Realloc(a, NULL, 0, n); +} + +template +inline void Free(A& a, T *p, size_t n = 1) +{ + static_cast(Realloc(a, p, n, 0)); +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) // std::allocator can safely be inherited +#endif + +template +class StdAllocator : + public std::allocator +{ + typedef std::allocator allocator_type; +#if RAPIDJSON_HAS_CXX11 + typedef std::allocator_traits traits_type; +#else + typedef allocator_type traits_type; +#endif + +public: + typedef BaseAllocator BaseAllocatorType; + + StdAllocator() RAPIDJSON_NOEXCEPT : + allocator_type(), + baseAllocator_() + { } + + StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : + allocator_type(rhs), + baseAllocator_(rhs.baseAllocator_) + { } + + template + StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : + allocator_type(rhs), + baseAllocator_(rhs.baseAllocator_) + { } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + StdAllocator(StdAllocator&& rhs) RAPIDJSON_NOEXCEPT : + allocator_type(std::move(rhs)), + baseAllocator_(std::move(rhs.baseAllocator_)) + { } +#endif +#if RAPIDJSON_HAS_CXX11 + using propagate_on_container_move_assignment = std::true_type; + using propagate_on_container_swap = std::true_type; +#endif + + /* implicit */ + StdAllocator(const BaseAllocator& allocator) RAPIDJSON_NOEXCEPT : + allocator_type(), + baseAllocator_(allocator) + { } + + ~StdAllocator() RAPIDJSON_NOEXCEPT + { } + + template + struct rebind { + typedef StdAllocator other; + }; + + typedef typename traits_type::size_type size_type; + typedef typename traits_type::difference_type difference_type; + + typedef typename traits_type::value_type value_type; + typedef typename traits_type::pointer pointer; + typedef typename traits_type::const_pointer const_pointer; + +#if RAPIDJSON_HAS_CXX11 + + typedef typename std::add_lvalue_reference::type &reference; + typedef typename std::add_lvalue_reference::type>::type &const_reference; + + pointer address(reference r) const RAPIDJSON_NOEXCEPT + { + return std::addressof(r); + } + const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT + { + return std::addressof(r); + } + + size_type max_size() const RAPIDJSON_NOEXCEPT + { + return traits_type::max_size(*this); + } + + template + void construct(pointer p, Args&&... args) + { + traits_type::construct(*this, p, std::forward(args)...); + } + void destroy(pointer p) + { + traits_type::destroy(*this, p); + } + +#else // !RAPIDJSON_HAS_CXX11 + + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + + pointer address(reference r) const RAPIDJSON_NOEXCEPT + { + return allocator_type::address(r); + } + const_pointer address(const_reference r) const RAPIDJSON_NOEXCEPT + { + return allocator_type::address(r); + } + + size_type max_size() const RAPIDJSON_NOEXCEPT + { + return allocator_type::max_size(); + } + + void construct(pointer p, const_reference r) + { + allocator_type::construct(p, r); + } + void destroy(pointer p) + { + allocator_type::destroy(p); + } + +#endif // !RAPIDJSON_HAS_CXX11 + + template + U* allocate(size_type n = 1, const void* = 0) + { + return RAPIDJSON_NAMESPACE::Malloc(baseAllocator_, n); + } + template + void deallocate(U* p, size_type n = 1) + { + RAPIDJSON_NAMESPACE::Free(baseAllocator_, p, n); + } + + pointer allocate(size_type n = 1, const void* = 0) + { + return allocate(n); + } + void deallocate(pointer p, size_type n = 1) + { + deallocate(p, n); + } + +#if RAPIDJSON_HAS_CXX11 + using is_always_equal = std::is_empty; +#endif + + template + bool operator==(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT + { + return baseAllocator_ == rhs.baseAllocator_; + } + template + bool operator!=(const StdAllocator& rhs) const RAPIDJSON_NOEXCEPT + { + return !operator==(rhs); + } + + //! rapidjson Allocator concept + static const bool kNeedFree = BaseAllocator::kNeedFree; + static const bool kRefCounted = internal::IsRefCounted::Value; + void* Malloc(size_t size) + { + return baseAllocator_.Malloc(size); + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) + { + return baseAllocator_.Realloc(originalPtr, originalSize, newSize); + } + static void Free(void *ptr) RAPIDJSON_NOEXCEPT + { + BaseAllocator::Free(ptr); + } + +private: + template + friend class StdAllocator; // access to StdAllocator.* + + BaseAllocator baseAllocator_; +}; + +#if !RAPIDJSON_HAS_CXX17 // std::allocator deprecated in C++17 +template +class StdAllocator : + public std::allocator +{ + typedef std::allocator allocator_type; + +public: + typedef BaseAllocator BaseAllocatorType; + + StdAllocator() RAPIDJSON_NOEXCEPT : + allocator_type(), + baseAllocator_() + { } + + StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : + allocator_type(rhs), + baseAllocator_(rhs.baseAllocator_) + { } + + template + StdAllocator(const StdAllocator& rhs) RAPIDJSON_NOEXCEPT : + allocator_type(rhs), + baseAllocator_(rhs.baseAllocator_) + { } + + /* implicit */ + StdAllocator(const BaseAllocator& baseAllocator) RAPIDJSON_NOEXCEPT : + allocator_type(), + baseAllocator_(baseAllocator) + { } + + ~StdAllocator() RAPIDJSON_NOEXCEPT + { } + + template + struct rebind { + typedef StdAllocator other; + }; + + typedef typename allocator_type::value_type value_type; + +private: + template + friend class StdAllocator; // access to StdAllocator.* + + BaseAllocator baseAllocator_; +}; +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/external/rapidjson/cursorstreamwrapper.h b/external/rapidjson/cursorstreamwrapper.h new file mode 100644 index 0000000..fd6513d --- /dev/null +++ b/external/rapidjson/cursorstreamwrapper.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ +#define RAPIDJSON_CURSORSTREAMWRAPPER_H_ + +#include "stream.h" + +#if defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + + +//! Cursor stream wrapper for counting line and column number if error exists. +/*! + \tparam InputStream Any stream that implements Stream Concept +*/ +template > +class CursorStreamWrapper : public GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + + CursorStreamWrapper(InputStream& is): + GenericStreamWrapper(is), line_(1), col_(0) {} + + // counting line and column number + Ch Take() { + Ch ch = this->is_.Take(); + if(ch == '\n') { + line_ ++; + col_ = 0; + } else { + col_ ++; + } + return ch; + } + + //! Get the error line number, if error exists. + size_t GetLine() const { return line_; } + //! Get the error column number, if error exists. + size_t GetColumn() const { return col_; } + +private: + size_t line_; //!< Current Line + size_t col_; //!< Current Column +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +#if defined(__GNUC__) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/external/rapidjson/document.h b/external/rapidjson/document.h new file mode 100644 index 0000000..74089cb --- /dev/null +++ b/external/rapidjson/document.h @@ -0,0 +1,3028 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include +#ifdef __cpp_lib_three_way_comparison +#include +#endif + +RAPIDJSON_DIAG_PUSH +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#endif // __GNUC__ + +#ifdef GetObject +// see https://github.com/Tencent/rapidjson/issues/1448 +// a former included windows.h might have defined a macro called GetObject, which affects +// GetObject defined here. This ensures the macro does not get applied +#pragma push_macro("GetObject") +#define RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#undef GetObject +#endif + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::random_access_iterator_tag +#endif + +#if RAPIDJSON_USE_MEMBERSMAP +#include // std::multimap +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +/*! \def RAPIDJSON_DEFAULT_ALLOCATOR + \ingroup RAPIDJSON_CONFIG + \brief Allows to choose default allocator. + + User can define this to use CrtAllocator or MemoryPoolAllocator. +*/ +#ifndef RAPIDJSON_DEFAULT_ALLOCATOR +#define RAPIDJSON_DEFAULT_ALLOCATOR ::RAPIDJSON_NAMESPACE::MemoryPoolAllocator<::RAPIDJSON_NAMESPACE::CrtAllocator> +#endif + +/*! \def RAPIDJSON_DEFAULT_STACK_ALLOCATOR + \ingroup RAPIDJSON_CONFIG + \brief Allows to choose default stack allocator for Document. + + User can define this to use CrtAllocator or MemoryPoolAllocator. +*/ +#ifndef RAPIDJSON_DEFAULT_STACK_ALLOCATOR +#define RAPIDJSON_DEFAULT_STACK_ALLOCATOR ::RAPIDJSON_NAMESPACE::CrtAllocator +#endif + +/*! \def RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User defined kDefaultObjectCapacity value. + + User can define this as any natural number. +*/ +#ifndef RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY +// number of objects that rapidjson::Value allocates memory for by default +#define RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY 16 +#endif + +/*! \def RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User defined kDefaultArrayCapacity value. + + User can define this as any natural number. +*/ +#ifndef RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY +// number of array elements that rapidjson::Value allocates memory for by default +#define RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY 16 +#endif + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +class GenericMember { +public: + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT + : name(std::move(rhs.name)), + value(std::move(rhs.value)) + { + } + + //! Move assignment in C++11 + GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT { + return *this = static_cast(rhs); + } +#endif + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment. + */ + GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT { + if (RAPIDJSON_LIKELY(this != &rhs)) { + name = rhs.name; + value = rhs.value; + } + return *this; + } + + // swap() for std::sort() and other potential use in STL. + friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT { + a.name.Swap(b.name); + a.value.Swap(b.value); + } + +private: + //! Copy constructor is not permitted. + GenericMember(const GenericMember& rhs); +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + /** \name std::iterator_traits support */ + //@{ + typedef ValueType value_type; + typedef ValueType * pointer; + typedef ValueType & reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + //@} + + //! Pointer to (const) GenericMember + typedef pointer Pointer; + //! Reference to (const) GenericMember + typedef reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + template bool operator==(const GenericMemberIterator& that) const { return ptr_ == that.ptr_; } + template bool operator!=(const GenericMemberIterator& that) const { return ptr_ != that.ptr_; } + template bool operator<=(const GenericMemberIterator& that) const { return ptr_ <= that.ptr_; } + template bool operator>=(const GenericMemberIterator& that) const { return ptr_ >= that.ptr_; } + template bool operator< (const GenericMemberIterator& that) const { return ptr_ < that.ptr_; } + template bool operator> (const GenericMemberIterator& that) const { return ptr_ > that.ptr_; } + +#ifdef __cpp_lib_three_way_comparison + template std::strong_ordering operator<=>(const GenericMemberIterator& that) const { return ptr_ <=> that.ptr_; } +#endif + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +class GenericMemberIterator; + +//! non-const GenericMemberIterator +template +class GenericMemberIterator { +public: + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +class GenericMemberIterator { +public: + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(NotNullStrLen(str)) {} + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + SizeType NotNullStrLen(const CharType* str) { + RAPIDJSON_ASSERT(str != 0); + return internal::StrLen(str); + } + + /// Empty string - used when passing in a NULL pointer + static const Ch emptyString[]; + + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; + //! Copy assignment operator not permitted - immutable type + GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; +}; + +template +const CharType GenericStringRef::emptyString[] = { CharType() }; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +#ifdef _MSC_VER +RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static long Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned long Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; +#endif + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + \see CopyFrom() + */ + template + GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + switch (rhs.GetType()) { + case kObjectType: + DoCopyMembers(rhs, allocator, copyConstStrings); + break; + case kArrayType: { + SizeType count = rhs.data_.a.size; + GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); + const GenericValue* re = rhs.GetElementsPointer(); + for (SizeType i = 0; i < count; i++) + new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); + data_.f.flags = kArrayFlag; + data_.a.size = data_.a.capacity = count; + SetElementsPointer(le); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } + else + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } + } + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for float value. + explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + // With RAPIDJSON_USE_MEMBERSMAP, the maps need to be destroyed to release + // their Allocator if it's refcounted (e.g. MemoryPoolAllocator). + if (Allocator::kNeedFree || (RAPIDJSON_USE_MEMBERSMAP+0 && + internal::IsRefCounted::Value)) { + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + Allocator::Free(e); + } + } + break; + + case kObjectFlag: + DoFreeMembers(); + break; + + case kCopyStringFlag: + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + Allocator::Free(const_cast(GetStringPointer())); + } + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + if (RAPIDJSON_LIKELY(this != &rhs)) { + // Can't destroy "this" before assigning "rhs", otherwise "rhs" + // could be used after free if it's an sub-Value of "this", + // hence the temporary danse. + GenericValue temp; + temp.RawAssign(rhs); + this->~GenericValue(); + RawAssign(temp); + } + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator, copyConstStrings); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + +#ifndef __cpp_lib_three_way_comparison + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} +#endif + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast((std::numeric_limits::max)())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast((std::numeric_limits::min)())) + && (d < static_cast((std::numeric_limits::max)())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-(std::numeric_limits::max)()) + || a > static_cast((std::numeric_limits::max)())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Get the capacity of object. + SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static GenericValue buffer; + return *new (reinterpret_cast(&buffer)) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Request the object to have enough capacity to store members. + /*! \param newCapacity The capacity that the object at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsObject()); + DoReserveMembers(newCapacity, allocator); + return *this; + } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + return DoFindMember(name); + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + DoAddMember(name, value, allocator); + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + DoClearMembers(); + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + return DoRemoveMember(m); + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + return DoEraseMembers(first, last); + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + Object GetObj() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + ConstObject GetObj() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return DataString(data_); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return DataStringLength(data_); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string reference + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (ConstValueIterator v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + // These casts are added to suppress the warning on MSVC about bitwise operations between enums of different types. + kTrueFlag = static_cast(kTrueType) | static_cast(kBoolFlag), + kFalseFlag = static_cast(kFalseType) | static_cast(kBoolFlag), + kNumberIntFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag), + kNumberUintFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag), + kNumberInt64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kInt64Flag), + kNumberUint64Flag = static_cast(kNumberType) | static_cast(kNumberFlag | kUint64Flag), + kNumberDoubleFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kDoubleFlag), + kNumberAnyFlag = static_cast(kNumberType) | static_cast(kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag), + kConstStringFlag = static_cast(kStringType) | static_cast(kStringFlag), + kCopyStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag), + kShortStringFlag = static_cast(kStringType) | static_cast(kStringFlag | kCopyFlag | kInlineStrFlag), + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY; + static const SizeType kDefaultObjectCapacity = RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + static RAPIDJSON_FORCEINLINE const Ch* DataString(const Data& data) { + return (data.f.flags & kInlineStrFlag) ? data.ss.str : RAPIDJSON_GETPOINTER(Ch, data.s.str); + } + static RAPIDJSON_FORCEINLINE SizeType DataStringLength(const Data& data) { + return (data.f.flags & kInlineStrFlag) ? data.ss.GetLength() : data.s.length; + } + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + +#if RAPIDJSON_USE_MEMBERSMAP + + struct MapTraits { + struct Less { + bool operator()(const Data& s1, const Data& s2) const { + SizeType n1 = DataStringLength(s1), n2 = DataStringLength(s2); + int cmp = std::memcmp(DataString(s1), DataString(s2), sizeof(Ch) * (n1 < n2 ? n1 : n2)); + return cmp < 0 || (cmp == 0 && n1 < n2); + } + }; + typedef std::pair Pair; + typedef std::multimap > Map; + typedef typename Map::iterator Iterator; + }; + typedef typename MapTraits::Map Map; + typedef typename MapTraits::Less MapLess; + typedef typename MapTraits::Pair MapPair; + typedef typename MapTraits::Iterator MapIterator; + + // + // Layout of the members' map/array, re(al)located according to the needed capacity: + // + // {Map*}<>{capacity}<>{Member[capacity]}<>{MapIterator[capacity]} + // + // (where <> stands for the RAPIDJSON_ALIGN-ment, if needed) + // + + static RAPIDJSON_FORCEINLINE size_t GetMapLayoutSize(SizeType capacity) { + return RAPIDJSON_ALIGN(sizeof(Map*)) + + RAPIDJSON_ALIGN(sizeof(SizeType)) + + RAPIDJSON_ALIGN(capacity * sizeof(Member)) + + capacity * sizeof(MapIterator); + } + + static RAPIDJSON_FORCEINLINE SizeType &GetMapCapacity(Map* &map) { + return *reinterpret_cast(reinterpret_cast(&map) + + RAPIDJSON_ALIGN(sizeof(Map*))); + } + + static RAPIDJSON_FORCEINLINE Member* GetMapMembers(Map* &map) { + return reinterpret_cast(reinterpret_cast(&map) + + RAPIDJSON_ALIGN(sizeof(Map*)) + + RAPIDJSON_ALIGN(sizeof(SizeType))); + } + + static RAPIDJSON_FORCEINLINE MapIterator* GetMapIterators(Map* &map) { + return reinterpret_cast(reinterpret_cast(&map) + + RAPIDJSON_ALIGN(sizeof(Map*)) + + RAPIDJSON_ALIGN(sizeof(SizeType)) + + RAPIDJSON_ALIGN(GetMapCapacity(map) * sizeof(Member))); + } + + static RAPIDJSON_FORCEINLINE Map* &GetMap(Member* members) { + RAPIDJSON_ASSERT(members != 0); + return *reinterpret_cast(reinterpret_cast(members) - + RAPIDJSON_ALIGN(sizeof(SizeType)) - + RAPIDJSON_ALIGN(sizeof(Map*))); + } + + // Some compilers' debug mechanisms want all iterators to be destroyed, for their accounting.. + RAPIDJSON_FORCEINLINE MapIterator DropMapIterator(MapIterator& rhs) { +#if RAPIDJSON_HAS_CXX11 + MapIterator ret = std::move(rhs); +#else + MapIterator ret = rhs; +#endif + rhs.~MapIterator(); + return ret; + } + + Map* &DoReallocMap(Map** oldMap, SizeType newCapacity, Allocator& allocator) { + Map **newMap = static_cast(allocator.Malloc(GetMapLayoutSize(newCapacity))); + GetMapCapacity(*newMap) = newCapacity; + if (!oldMap) { + *newMap = new (allocator.Malloc(sizeof(Map))) Map(MapLess(), allocator); + } + else { + *newMap = *oldMap; + size_t count = (*oldMap)->size(); + std::memcpy(static_cast(GetMapMembers(*newMap)), + static_cast(GetMapMembers(*oldMap)), + count * sizeof(Member)); + MapIterator *oldIt = GetMapIterators(*oldMap), + *newIt = GetMapIterators(*newMap); + while (count--) { + new (&newIt[count]) MapIterator(DropMapIterator(oldIt[count])); + } + Allocator::Free(oldMap); + } + return *newMap; + } + + RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { + return GetMapMembers(DoReallocMap(0, capacity, allocator)); + } + + void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { + ObjectData& o = data_.o; + if (newCapacity > o.capacity) { + Member* oldMembers = GetMembersPointer(); + Map **oldMap = oldMembers ? &GetMap(oldMembers) : 0, + *&newMap = DoReallocMap(oldMap, newCapacity, allocator); + RAPIDJSON_SETPOINTER(Member, o.members, GetMapMembers(newMap)); + o.capacity = newCapacity; + } + } + + template + MemberIterator DoFindMember(const GenericValue& name) { + if (Member* members = GetMembersPointer()) { + Map* &map = GetMap(members); + MapIterator mit = map->find(reinterpret_cast(name.data_)); + if (mit != map->end()) { + return MemberIterator(&members[mit->second]); + } + } + return MemberEnd(); + } + + void DoClearMembers() { + if (Member* members = GetMembersPointer()) { + Map* &map = GetMap(members); + MapIterator* mit = GetMapIterators(map); + for (SizeType i = 0; i < data_.o.size; i++) { + map->erase(DropMapIterator(mit[i])); + members[i].~Member(); + } + data_.o.size = 0; + } + } + + void DoFreeMembers() { + if (Member* members = GetMembersPointer()) { + GetMap(members)->~Map(); + for (SizeType i = 0; i < data_.o.size; i++) { + members[i].~Member(); + } + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + Map** map = &GetMap(members); + Allocator::Free(*map); + Allocator::Free(map); + } + } + } + +#else // !RAPIDJSON_USE_MEMBERSMAP + + RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) { + return Malloc(allocator, capacity); + } + + void DoReserveMembers(SizeType newCapacity, Allocator& allocator) { + ObjectData& o = data_.o; + if (newCapacity > o.capacity) { + Member* newMembers = Realloc(allocator, GetMembersPointer(), o.capacity, newCapacity); + RAPIDJSON_SETPOINTER(Member, o.members, newMembers); + o.capacity = newCapacity; + } + } + + template + MemberIterator DoFindMember(const GenericValue& name) { + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + + void DoClearMembers() { + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + void DoFreeMembers() { + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + } + +#endif // !RAPIDJSON_USE_MEMBERSMAP + + void DoAddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + ObjectData& o = data_.o; + if (o.size >= o.capacity) + DoReserveMembers(o.capacity ? (o.capacity + (o.capacity + 1) / 2) : kDefaultObjectCapacity, allocator); + Member* members = GetMembersPointer(); + Member* m = members + o.size; + m->name.RawAssign(name); + m->value.RawAssign(value); +#if RAPIDJSON_USE_MEMBERSMAP + Map* &map = GetMap(members); + MapIterator* mit = GetMapIterators(map); + new (&mit[o.size]) MapIterator(map->insert(MapPair(m->name.data_, o.size))); +#endif + ++o.size; + } + + MemberIterator DoRemoveMember(MemberIterator m) { + ObjectData& o = data_.o; + Member* members = GetMembersPointer(); +#if RAPIDJSON_USE_MEMBERSMAP + Map* &map = GetMap(members); + MapIterator* mit = GetMapIterators(map); + SizeType mpos = static_cast(&*m - members); + map->erase(DropMapIterator(mit[mpos])); +#endif + MemberIterator last(members + (o.size - 1)); + if (o.size > 1 && m != last) { +#if RAPIDJSON_USE_MEMBERSMAP + new (&mit[mpos]) MapIterator(DropMapIterator(mit[&*last - members])); + mit[mpos]->second = mpos; +#endif + *m = *last; // Move the last one to this place + } + else { + m->~Member(); // Only one left, just destroy + } + --o.size; + return m; + } + + MemberIterator DoEraseMembers(ConstMemberIterator first, ConstMemberIterator last) { + ObjectData& o = data_.o; + MemberIterator beg = MemberBegin(), + pos = beg + (first - beg), + end = MemberEnd(); +#if RAPIDJSON_USE_MEMBERSMAP + Map* &map = GetMap(GetMembersPointer()); + MapIterator* mit = GetMapIterators(map); +#endif + for (MemberIterator itr = pos; itr != last; ++itr) { +#if RAPIDJSON_USE_MEMBERSMAP + map->erase(DropMapIterator(mit[itr - beg])); +#endif + itr->~Member(); + } +#if RAPIDJSON_USE_MEMBERSMAP + if (first != last) { + // Move remaining members/iterators + MemberIterator next = pos + (last - first); + for (MemberIterator itr = pos; next != end; ++itr, ++next) { + std::memcpy(static_cast(&*itr), &*next, sizeof(Member)); + SizeType mpos = static_cast(itr - beg); + new (&mit[mpos]) MapIterator(DropMapIterator(mit[next - beg])); + mit[mpos]->second = mpos; + } + } +#else + std::memmove(static_cast(&*pos), &*last, + static_cast(end - last) * sizeof(Member)); +#endif + o.size -= static_cast(last - first); + return pos; + } + + template + void DoCopyMembers(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings) { + RAPIDJSON_ASSERT(rhs.GetType() == kObjectType); + + data_.f.flags = kObjectFlag; + SizeType count = rhs.data_.o.size; + Member* lm = DoAllocMembers(count, allocator); + const typename GenericValue::Member* rm = rhs.GetMembersPointer(); +#if RAPIDJSON_USE_MEMBERSMAP + Map* &map = GetMap(lm); + MapIterator* mit = GetMapIterators(map); +#endif + for (SizeType i = 0; i < count; i++) { + new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); + new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); +#if RAPIDJSON_USE_MEMBERSMAP + new (&mit[i]) MapIterator(map->insert(MapPair(lm[i].name.data_, i))); +#endif + } + data_.o.size = data_.o.capacity = count; + SetMembersPointer(lm); + } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = DoAllocMembers(count, allocator); + SetMembersPointer(m); + std::memcpy(static_cast(m), members, count * sizeof(Member)); +#if RAPIDJSON_USE_MEMBERSMAP + Map* &map = GetMap(m); + MapIterator* mit = GetMapIterators(map); + for (SizeType i = 0; i < count; i++) { + new (&mit[i]) MapIterator(map->insert(MapPair(m[i].name.data_, i))); + } +#endif + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef StackAllocator StackAllocatorType; //!< StackAllocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + // Clear the ::ValueType before ownAllocator is destroyed, ~ValueType() + // runs last and may access its elements or members which would be freed + // with an allocator like MemoryPoolAllocator (CrtAllocator does not + // free its data when destroyed, but MemoryPoolAllocator does). + if (ownAllocator_) { + ValueType::SetNull(); + } + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + // Allow Swap with ValueType. + // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. + using ValueType::Swap; + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + operator ValueType&() const { return value_; } + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + operator ValueType&() const { return value_; } + SizeType MemberCount() const { return value_.MemberCount(); } + SizeType MemberCapacity() const { return value_.MemberCapacity(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#ifdef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#pragma pop_macro("GetObject") +#undef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED +#endif + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/external/rapidjson/encodedstream.h b/external/rapidjson/encodedstream.h new file mode 100644 index 0000000..cf046b8 --- /dev/null +++ b/external/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/external/rapidjson/encodings.h b/external/rapidjson/encodings.h new file mode 100644 index 0000000..50ad18b --- /dev/null +++ b/external/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFFu >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define RAPIDJSON_COPY() os.Put(c = is.Take()) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + Ch c; + RAPIDJSON_COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put(static_cast((v & 0x3FF) | 0xDC00)); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/external/rapidjson/error/en.h b/external/rapidjson/error/en.h new file mode 100644 index 0000000..5d2e57b --- /dev/null +++ b/external/rapidjson/error/en.h @@ -0,0 +1,122 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +//! Maps error code of validation into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param validateErrorCode Error code obtained from validator. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetValidateError_En(ValidateErrorCode validateErrorCode) { + switch (validateErrorCode) { + case kValidateErrors: return RAPIDJSON_ERROR_STRING("One or more validation errors have occurred"); + case kValidateErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kValidateErrorMultipleOf: return RAPIDJSON_ERROR_STRING("Number '%actual' is not a multiple of the 'multipleOf' value '%expected'."); + case kValidateErrorMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than the 'maximum' value '%expected'."); + case kValidateErrorExclusiveMaximum: return RAPIDJSON_ERROR_STRING("Number '%actual' is greater than or equal to the 'exclusiveMaximum' value '%expected'."); + case kValidateErrorMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than the 'minimum' value '%expected'."); + case kValidateErrorExclusiveMinimum: return RAPIDJSON_ERROR_STRING("Number '%actual' is less than or equal to the 'exclusiveMinimum' value '%expected'."); + + case kValidateErrorMaxLength: return RAPIDJSON_ERROR_STRING("String '%actual' is longer than the 'maxLength' value '%expected'."); + case kValidateErrorMinLength: return RAPIDJSON_ERROR_STRING("String '%actual' is shorter than the 'minLength' value '%expected'."); + case kValidateErrorPattern: return RAPIDJSON_ERROR_STRING("String '%actual' does not match the 'pattern' regular expression."); + + case kValidateErrorMaxItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is longer than the 'maxItems' value '%expected'."); + case kValidateErrorMinItems: return RAPIDJSON_ERROR_STRING("Array of length '%actual' is shorter than the 'minItems' value '%expected'."); + case kValidateErrorUniqueItems: return RAPIDJSON_ERROR_STRING("Array has duplicate items at indices '%duplicates' but 'uniqueItems' is true."); + case kValidateErrorAdditionalItems: return RAPIDJSON_ERROR_STRING("Array has an additional item at index '%disallowed' that is not allowed by the schema."); + + case kValidateErrorMaxProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is more than 'maxProperties' value '%expected'."); + case kValidateErrorMinProperties: return RAPIDJSON_ERROR_STRING("Object has '%actual' members which is less than 'minProperties' value '%expected'."); + case kValidateErrorRequired: return RAPIDJSON_ERROR_STRING("Object is missing the following members required by the schema: '%missing'."); + case kValidateErrorAdditionalProperties: return RAPIDJSON_ERROR_STRING("Object has an additional member '%disallowed' that is not allowed by the schema."); + case kValidateErrorPatternProperties: return RAPIDJSON_ERROR_STRING("Object has 'patternProperties' that are not allowed by the schema."); + case kValidateErrorDependencies: return RAPIDJSON_ERROR_STRING("Object has missing property or schema dependencies, refer to following errors."); + + case kValidateErrorEnum: return RAPIDJSON_ERROR_STRING("Property has a value that is not one of its allowed enumerated values."); + case kValidateErrorType: return RAPIDJSON_ERROR_STRING("Property has a type '%actual' that is not in the following list: '%expected'."); + + case kValidateErrorOneOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'oneOf', refer to following errors."); + case kValidateErrorOneOfMatch: return RAPIDJSON_ERROR_STRING("Property matched more than one of the sub-schemas specified by 'oneOf'."); + case kValidateErrorAllOf: return RAPIDJSON_ERROR_STRING("Property did not match all of the sub-schemas specified by 'allOf', refer to following errors."); + case kValidateErrorAnyOf: return RAPIDJSON_ERROR_STRING("Property did not match any of the sub-schemas specified by 'anyOf', refer to following errors."); + case kValidateErrorNot: return RAPIDJSON_ERROR_STRING("Property matched the sub-schema specified by 'not'."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/external/rapidjson/error/error.h b/external/rapidjson/error/error.h new file mode 100644 index 0000000..6270da1 --- /dev/null +++ b/external/rapidjson/error/error.h @@ -0,0 +1,216 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + //!! Unspecified boolean type + typedef bool (ParseResult::*BooleanType)() const; +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). + operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + bool operator!=(const ParseResult& that) const { return !(*this == that); } + bool operator!=(ParseErrorCode code) const { return !(*this == code); } + friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +/////////////////////////////////////////////////////////////////////////////// +// ValidateErrorCode + +//! Error codes when validating. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericSchemaValidator +*/ +enum ValidateErrorCode { + kValidateErrors = -1, //!< Top level error code when kValidateContinueOnErrorsFlag set. + kValidateErrorNone = 0, //!< No error. + + kValidateErrorMultipleOf, //!< Number is not a multiple of the 'multipleOf' value. + kValidateErrorMaximum, //!< Number is greater than the 'maximum' value. + kValidateErrorExclusiveMaximum, //!< Number is greater than or equal to the 'maximum' value. + kValidateErrorMinimum, //!< Number is less than the 'minimum' value. + kValidateErrorExclusiveMinimum, //!< Number is less than or equal to the 'minimum' value. + + kValidateErrorMaxLength, //!< String is longer than the 'maxLength' value. + kValidateErrorMinLength, //!< String is longer than the 'maxLength' value. + kValidateErrorPattern, //!< String does not match the 'pattern' regular expression. + + kValidateErrorMaxItems, //!< Array is longer than the 'maxItems' value. + kValidateErrorMinItems, //!< Array is shorter than the 'minItems' value. + kValidateErrorUniqueItems, //!< Array has duplicate items but 'uniqueItems' is true. + kValidateErrorAdditionalItems, //!< Array has additional items that are not allowed by the schema. + + kValidateErrorMaxProperties, //!< Object has more members than 'maxProperties' value. + kValidateErrorMinProperties, //!< Object has less members than 'minProperties' value. + kValidateErrorRequired, //!< Object is missing one or more members required by the schema. + kValidateErrorAdditionalProperties, //!< Object has additional members that are not allowed by the schema. + kValidateErrorPatternProperties, //!< See other errors. + kValidateErrorDependencies, //!< Object has missing property or schema dependencies. + + kValidateErrorEnum, //!< Property has a value that is not one of its allowed enumerated values + kValidateErrorType, //!< Property has a type that is not allowed by the schema.. + + kValidateErrorOneOf, //!< Property did not match any of the sub-schemas specified by 'oneOf'. + kValidateErrorOneOfMatch, //!< Property matched more than one of the sub-schemas specified by 'oneOf'. + kValidateErrorAllOf, //!< Property did not match all of the sub-schemas specified by 'allOf'. + kValidateErrorAnyOf, //!< Property did not match any of the sub-schemas specified by 'anyOf'. + kValidateErrorNot //!< Property matched the sub-schema specified by 'not'. +}; + +//! Function pointer type of GetValidateError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetValidateError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetValidateErrorFunc GetValidateError = GetValidateError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetValidateError(validator.GetInvalidSchemaCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetValidateErrorFunc)(ValidateErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/external/rapidjson/filereadstream.h b/external/rapidjson/filereadstream.h new file mode 100644 index 0000000..f8bb43c --- /dev/null +++ b/external/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/external/rapidjson/filewritestream.h b/external/rapidjson/filewritestream.h new file mode 100644 index 0000000..5d89588 --- /dev/null +++ b/external/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for output using fwrite(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/external/rapidjson/fwd.h b/external/rapidjson/fwd.h new file mode 100644 index 0000000..d62f77f --- /dev/null +++ b/external/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +class GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/external/rapidjson/internal/biginteger.h b/external/rapidjson/internal/biginteger.h new file mode 100644 index 0000000..af48738 --- /dev/null +++ b/external/rapidjson/internal/biginteger.h @@ -0,0 +1,297 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_M_AMD64) +#include // for _umul128 +#if !defined(_ARM64EC_) +#pragma intrinsic(_umul128) +#else +#pragma comment(lib,"softintrin") +#endif +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + template + BigInteger(const Ch* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + template + void AppendDecimal64(const Ch* begin, const Ch* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + template + static uint64_t ParseUint64(const Ch* begin, const Ch* end) { + uint64_t r = 0; + for (const Ch* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= Ch('0') && *p <= Ch('9')); + r = r * 10u + static_cast(*p - Ch('0')); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/external/rapidjson/internal/clzll.h b/external/rapidjson/internal/clzll.h new file mode 100644 index 0000000..8fc5118 --- /dev/null +++ b/external/rapidjson/internal/clzll.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_CLZLL_H_ +#define RAPIDJSON_CLZLL_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && !defined(UNDER_CE) +#include +#if defined(_WIN64) +#pragma intrinsic(_BitScanReverse64) +#else +#pragma intrinsic(_BitScanReverse) +#endif +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline uint32_t clzll(uint64_t x) { + // Passing 0 to __builtin_clzll is UB in GCC and results in an + // infinite loop in the software implementation. + RAPIDJSON_ASSERT(x != 0); + +#if defined(_MSC_VER) && !defined(UNDER_CE) + unsigned long r = 0; +#if defined(_WIN64) + _BitScanReverse64(&r, x); +#else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x & 0xFFFFFFFF)); +#endif // _WIN64 + + return 63 - r; +#elif (defined(__GNUC__) && __GNUC__ >= 4) || RAPIDJSON_HAS_BUILTIN(__builtin_clzll) + // __builtin_clzll wrapper + return static_cast(__builtin_clzll(x)); +#else + // naive version + uint32_t r = 0; + while (!(x & (static_cast(1) << 63))) { + x <<= 1; + ++r; + } + + return r; +#endif // _MSC_VER +} + +#define RAPIDJSON_CLZLL RAPIDJSON_NAMESPACE::internal::clzll + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CLZLL_H_ diff --git a/external/rapidjson/internal/diyfp.h b/external/rapidjson/internal/diyfp.h new file mode 100644 index 0000000..f7d4653 --- /dev/null +++ b/external/rapidjson/internal/diyfp.h @@ -0,0 +1,261 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" +#include "clzll.h" +#include + +#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#include +#if !defined(_ARM64EC_) +#pragma intrinsic(_umul128) +#else +#pragma comment(lib,"softintrin") +#endif +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { + int s = static_cast(clzll(f)); + return DiyFp(f << s, e - s); + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); + if (e < kDpDenormalExponent) { + // Underflow. + return 0.0; + } + if (e >= kDpMaxExponent) { + // Overflow. + return std::numeric_limits::infinity(); + } + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + RAPIDJSON_ASSERT(index < 87); + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + RAPIDJSON_ASSERT(exp >= -348); + unsigned index = static_cast(exp + 348) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/external/rapidjson/internal/dtoa.h b/external/rapidjson/internal/dtoa.h new file mode 100644 index 0000000..9f6ae3b --- /dev/null +++ b/external/rapidjson/internal/dtoa.h @@ -0,0 +1,249 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline int CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint64_t kPow10[] = { 1U, 10U, 100U, 1000U, 10000U, 100000U, 1000000U, 10000000U, 100000000U, + 1000000000U, 10000000000U, 100000000000U, 1000000000000U, + 10000000000000U, 100000000000000U, 1000000000000000U, + 10000000000000000U, 100000000000000000U, 1000000000000000000U, + 10000000000000000000U }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, kPow10[kappa] << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 20 ? kPow10[index] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/external/rapidjson/internal/ieee754.h b/external/rapidjson/internal/ieee754.h new file mode 100644 index 0000000..68c9e96 --- /dev/null +++ b/external/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static int EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/external/rapidjson/internal/itoa.h b/external/rapidjson/internal/itoa.h new file mode 100644 index 0000000..9fe8c93 --- /dev/null +++ b/external/rapidjson/internal/itoa.h @@ -0,0 +1,308 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/external/rapidjson/internal/meta.h b/external/rapidjson/internal/meta.h new file mode 100644 index 0000000..27092dc --- /dev/null +++ b/external/rapidjson/internal/meta.h @@ -0,0 +1,186 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/external/rapidjson/internal/pow10.h b/external/rapidjson/internal/pow10.h new file mode 100644 index 0000000..eae1a43 --- /dev/null +++ b/external/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/external/rapidjson/internal/regex.h b/external/rapidjson/internal/regex.h new file mode 100644 index 0000000..6446c40 --- /dev/null +++ b/external/rapidjson/internal/regex.h @@ -0,0 +1,739 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// DecodedStream + +template +class DecodedStream { +public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + +private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +template +class GenericRegexSearch; + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef Encoding EncodingType; + typedef typename Encoding::Ch Ch; + template friend class GenericRegexSearch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + ownAllocator_(allocator ? 0 : RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), + states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream, Encoding> ds(ss); + Parse(ds); + } + + ~GenericRegex() + { + RAPIDJSON_DELETE(ownAllocator_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Stack operandStack(allocator_, 256); // Frag + Stack operatorStack(allocator_, 256); // Operator + Stack atomCountStack(allocator_, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + case kOneOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + + default: + // syntax error (e.g. unclosed kLeftParenthesis) + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + Allocator* ownAllocator_; + Allocator* allocator_; + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + bool anchorBegin_; + bool anchorEnd_; +}; + +template +class GenericRegexSearch { +public: + typedef typename RegexType::EncodingType Encoding; + typedef typename Encoding::Ch Ch; + + GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : + regex_(regex), allocator_(allocator), ownAllocator_(0), + state0_(allocator, 0), state1_(allocator, 0), stateSet_() + { + RAPIDJSON_ASSERT(regex_.IsValid()); + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); + state0_.template Reserve(regex_.stateCount_); + state1_.template Reserve(regex_.stateCount_); + } + + ~GenericRegexSearch() { + Allocator::Free(stateSet_); + RAPIDJSON_DELETE(ownAllocator_); + } + + template + bool Match(InputStream& is) { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) { + return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); + } + + bool Search(const Ch* s) { + GenericStringStream is(s); + return Search(is); + } + +private: + typedef typename RegexType::State State; + typedef typename RegexType::Range Range; + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, regex_.root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = regex_.GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == RegexType::kAnyCharacterClass || + (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, regex_.root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (regex_.stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = regex_.GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { + stateSet_[index >> 5] |= (1u << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = regex_.GetRange(rangeIndex); + if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + const RegexType& regex_; + Allocator* allocator_; + Allocator* ownAllocator_; + Stack state0_; + Stack state1_; + uint32_t* stateSet_; +}; + +typedef GenericRegex > Regex; +typedef GenericRegexSearch RegexSearch; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/external/rapidjson/internal/stack.h b/external/rapidjson/internal/stack.h new file mode 100644 index 0000000..73abd70 --- /dev/null +++ b/external/rapidjson/internal/stack.h @@ -0,0 +1,232 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" +#include + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(static_cast(sizeof(T) * count) > (stackEnd_ - stackTop_))) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_); + RAPIDJSON_ASSERT(static_cast(sizeof(T) * count) <= (stackEnd_ - stackTop_)); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/external/rapidjson/internal/strfunc.h b/external/rapidjson/internal/strfunc.h new file mode 100644 index 0000000..b698a8f --- /dev/null +++ b/external/rapidjson/internal/strfunc.h @@ -0,0 +1,83 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + RAPIDJSON_ASSERT(s != 0); + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +template <> +inline SizeType StrLen(const char* s) { + return SizeType(std::strlen(s)); +} + +template <> +inline SizeType StrLen(const wchar_t* s) { + return SizeType(std::wcslen(s)); +} + +//! Custom strcmpn() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s1 Null-terminated input string. + \param s2 Null-terminated input string. + \return 0 if equal +*/ +template +inline int StrCmp(const Ch* s1, const Ch* s2) { + RAPIDJSON_ASSERT(s1 != 0); + RAPIDJSON_ASSERT(s2 != 0); + while(*s1 && (*s1 == *s2)) { s1++; s2++; } + return static_cast(*s1) < static_cast(*s2) ? -1 : static_cast(*s1) > static_cast(*s2); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + RAPIDJSON_ASSERT(s != 0); + RAPIDJSON_ASSERT(outCount != 0); + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/external/rapidjson/internal/strtod.h b/external/rapidjson/internal/strtod.h new file mode 100644 index 0000000..55f0e38 --- /dev/null +++ b/external/rapidjson/internal/strtod.h @@ -0,0 +1,293 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" +#include +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +template +inline bool StrtodDiyFp(const Ch* decimals, int dLen, int dExp, double* result) { + uint64_t significand = 0; + int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < dLen; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > Ch('5'))) + break; + significand = significand * 10u + static_cast(decimals[i] - Ch('0')); + } + + if (i < dLen && decimals[i] >= Ch('5')) // Rounding + significand++; + + int remaining = dLen - i; + const int kUlpShift = 3; + const int kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + dExp += remaining; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp; + RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); + v = v * kPow10[adjustment - 1]; + if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + int precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + int scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +template +inline double StrtodBigInteger(double approx, const Ch* decimals, int dLen, int dExp) { + RAPIDJSON_ASSERT(dLen >= 0); + const BigInteger dInt(decimals, static_cast(dLen)); + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +template +inline double StrtodFullPrecision(double d, int p, const Ch* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result = 0.0; + if (StrtodFast(d, p, &result)) + return result; + + RAPIDJSON_ASSERT(length <= INT_MAX); + int dLen = static_cast(length); + + RAPIDJSON_ASSERT(length >= decimalPosition); + RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); + int dExpAdjust = static_cast(length - decimalPosition); + + RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); + int dExp = exp - dExpAdjust; + + // Make sure length+dExp does not overflow + RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); + + // Trim leading zeros + while (dLen > 0 && *decimals == '0') { + dLen--; + decimals++; + } + + // Trim trailing zeros + while (dLen > 0 && decimals[dLen - 1] == '0') { + dLen--; + dExp++; + } + + if (dLen == 0) { // Buffer only contains zeros. + return 0.0; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 767 + 1; + if (dLen > kMaxDecimalDigit) { + dExp += dLen - kMaxDecimalDigit; + dLen = kMaxDecimalDigit; + } + + // If too small, underflow to zero. + // Any x <= 10^-324 is interpreted as zero. + if (dLen + dExp <= -324) + return 0.0; + + // If too large, overflow to infinity. + // Any x >= 10^309 is interpreted as +infinity. + if (dLen + dExp > 309) + return std::numeric_limits::infinity(); + + if (StrtodDiyFp(decimals, dLen, dExp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, dLen, dExp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/external/rapidjson/internal/swap.h b/external/rapidjson/internal/swap.h new file mode 100644 index 0000000..2cf92f9 --- /dev/null +++ b/external/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/external/rapidjson/istreamwrapper.h b/external/rapidjson/istreamwrapper.h new file mode 100644 index 0000000..01437ec --- /dev/null +++ b/external/rapidjson/istreamwrapper.h @@ -0,0 +1,128 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + + //! Constructor. + /*! + \param stream stream opened for read. + */ + BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + Read(); + } + + //! Constructor. + /*! + \param stream stream opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + BasicIStreamWrapper(); + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = bufferSize_; + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (!stream_.read(buffer_, static_cast(bufferSize_))) { + readCount_ = static_cast(stream_.gcount()); + *(bufferLast_ = buffer_ + readCount_) = '\0'; + eof_ = true; + } + } + } + + StreamType &stream_; + Ch peekBuffer_[4], *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/external/rapidjson/memorybuffer.h b/external/rapidjson/memorybuffer.h new file mode 100644 index 0000000..ffbc41e --- /dev/null +++ b/external/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/external/rapidjson/memorystream.h b/external/rapidjson/memorystream.h new file mode 100644 index 0000000..77af6c9 --- /dev/null +++ b/external/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/external/rapidjson/msinttypes/inttypes.h b/external/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000..1811128 --- /dev/null +++ b/external/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/external/rapidjson/msinttypes/stdint.h b/external/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000..3d4477b --- /dev/null +++ b/external/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/external/rapidjson/ostreamwrapper.h b/external/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000..11ed4d3 --- /dev/null +++ b/external/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/external/rapidjson/pointer.h b/external/rapidjson/pointer.h new file mode 100644 index 0000000..67a9cb0 --- /dev/null +++ b/external/rapidjson/pointer.h @@ -0,0 +1,1482 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "uri.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + typedef GenericUri UriType; + + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //! Swap the content of this pointer with an other. + /*! + \param other The pointer to swap with. + \note Constant complexity. + */ + GenericPointer& Swap(GenericPointer& other) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, other.allocator_); + internal::Swap(ownAllocator_, other.ownAllocator_); + internal::Swap(nameBuffer_, other.nameBuffer_); + internal::Swap(tokens_, other.tokens_); + internal::Swap(tokenCount_, other.tokenCount_); + internal::Swap(parseErrorOffset_, other.parseErrorOffset_); + internal::Swap(parseErrorCode_, other.parseErrorCode_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.pointer, b.pointer); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericPointer& a, GenericPointer& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, internal::StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = static_cast(buffer[i]); + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //! Less than operator. + /*! + \note Invalid pointers are always greater than valid ones. + */ + bool operator<(const GenericPointer& rhs) const { + if (!IsValid()) + return false; + if (!rhs.IsValid()) + return true; + + if (tokenCount_ != rhs.tokenCount_) + return tokenCount_ < rhs.tokenCount_; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index) + return tokens_[i].index < rhs.tokens_[i].index; + + if (tokens_[i].length != rhs.tokens_[i].length) + return tokens_[i].length < rhs.tokens_[i].length; + + if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length)) + return cmp < 0; + } + + return false; + } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + m = v->MemberEnd(); + v = &(--m)->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Compute URI + //@{ + + //! Compute the in-scope URI for a subtree. + // For use with JSON pointers into JSON schema documents. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param rootUri Root URI + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \param allocator Allocator for Uris + \return Uri if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a URI cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + UriType GetUri(ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { + static const Ch kIdString[] = { 'i', 'd', '\0' }; + static const ValueType kIdValue(kIdString, 2); + UriType base = UriType(rootUri, allocator); + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + // See if we have an id, and if so resolve with the current base + typename ValueType::MemberIterator m = v->FindMember(kIdValue); + if (m != v->MemberEnd() && (m->value).IsString()) { + UriType here = UriType(m->value, allocator).Resolve(base, allocator); + base = here; + } + m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return UriType(allocator); + } + return base; + } + + UriType GetUri(const ValueType& root, const UriType& rootUri, size_t* unresolvedTokenIndex = 0, Allocator* allocator = 0) const { + return GetUri(const_cast(root), rootUri, unresolvedTokenIndex, allocator); + } + + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(static_cast(hexDigits[u >> 4])); + os_.Put(static_cast(hexDigits[u & 15])); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/external/rapidjson/prettywriter.h b/external/rapidjson/prettywriter.h new file mode 100644 index 0000000..fe45df1 --- /dev/null +++ b/external/rapidjson/prettywriter.h @@ -0,0 +1,277 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of output os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + PrettyWriter(PrettyWriter&& rhs) : + Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} +#endif + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kNumberType); + return Base::EndValue(Base::WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kStringType); + return Base::EndValue(Base::WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndObject()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndArray()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + PrettyPrefix(type); + return Base::EndValue(Base::WriteRawValue(json, length)); + } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/external/rapidjson/rapidjson.h b/external/rapidjson/rapidjson.h new file mode 100644 index 0000000..a4e8953 --- /dev/null +++ b/external/rapidjson/rapidjson.h @@ -0,0 +1,741 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overridden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +// token concatenation +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// __cplusplus macro + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#if defined(_MSC_VER) +#define RAPIDJSON_CPLUSPLUS _MSVC_LANG +#else +#define RAPIDJSON_CPLUSPLUS __cplusplus +#endif + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_USE_MEMBERSMAP + +/*! \def RAPIDJSON_USE_MEMBERSMAP + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for object members handling in a \c std::multimap + + By defining this preprocessor symbol to \c 1, \ref rapidjson::GenericValue object + members are stored in a \c std::multimap for faster lookup and deletion times, a + trade off with a slightly slower insertion time and a small object allocat(or)ed + memory overhead. + + \hideinitializer +*/ +#ifndef RAPIDJSON_USE_MEMBERSMAP +#define RAPIDJSON_USE_MEMBERSMAP 0 // not by default +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. The default is 8 bytes. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2/Neon optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel + or ARM compatible processors. + + To enable these optimizations, three different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + // Enable ARM Neon optimization. + #define RAPIDJSON_NEON + \endcode + + \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Prefer C++11 static_assert, if available +#ifndef RAPIDJSON_STATIC_ASSERT +#if RAPIDJSON_CPLUSPLUS >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) +#define RAPIDJSON_STATIC_ASSERT(x) \ + static_assert(x, RAPIDJSON_STRINGIFY(x)) +#endif // C++11 +#endif // RAPIDJSON_STATIC_ASSERT + +// Adopt C++03 implementation from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif // RAPIDJSON_STATIC_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +#if defined(__has_builtin) +#define RAPIDJSON_HAS_BUILTIN(x) __has_builtin(x) +#else +#define RAPIDJSON_HAS_BUILTIN(x) 0 +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11 +#define RAPIDJSON_HAS_CXX11 (RAPIDJSON_CPLUSPLUS >= 201103L) +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if RAPIDJSON_HAS_CXX11 +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#elif defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if RAPIDJSON_HAS_CXX11 +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#elif defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#ifndef RAPIDJSON_NOEXCEPT +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT throw() +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT +#endif + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#if (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 +#else +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +/////////////////////////////////////////////////////////////////////////////// +// C++17 features + +#ifndef RAPIDJSON_HAS_CXX17 +#define RAPIDJSON_HAS_CXX17 (RAPIDJSON_CPLUSPLUS >= 201703L) +#endif + +#if RAPIDJSON_HAS_CXX17 +# define RAPIDJSON_DELIBERATE_FALLTHROUGH [[fallthrough]] +#elif defined(__has_cpp_attribute) +# if __has_cpp_attribute(clang::fallthrough) +# define RAPIDJSON_DELIBERATE_FALLTHROUGH [[clang::fallthrough]] +# elif __has_cpp_attribute(fallthrough) +# define RAPIDJSON_DELIBERATE_FALLTHROUGH __attribute__((fallthrough)) +# else +# define RAPIDJSON_DELIBERATE_FALLTHROUGH +# endif +#else +# define RAPIDJSON_DELIBERATE_FALLTHROUGH +#endif + +//!@endcond + +//! Assertion (in non-throwing contexts). + /*! \ingroup RAPIDJSON_CONFIG + Some functions provide a \c noexcept guarantee, if the compiler supports it. + In these cases, the \ref RAPIDJSON_ASSERT macro cannot be overridden to + throw an exception. This macro adds a separate customization point for + such cases. + + Defaults to C \c assert() (as \ref RAPIDJSON_ASSERT), if \c noexcept is + supported, and to \ref RAPIDJSON_ASSERT otherwise. + */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NOEXCEPT_ASSERT + +#ifndef RAPIDJSON_NOEXCEPT_ASSERT +#ifdef RAPIDJSON_ASSERT_THROWS +#include +#define RAPIDJSON_NOEXCEPT_ASSERT(x) assert(x) +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_ASSERT_THROWS +#endif // RAPIDJSON_NOEXCEPT_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// malloc/realloc/free + +#ifndef RAPIDJSON_MALLOC +///! customization point for global \c malloc +#define RAPIDJSON_MALLOC(size) std::malloc(size) +#endif +#ifndef RAPIDJSON_REALLOC +///! customization point for global \c realloc +#define RAPIDJSON_REALLOC(ptr, new_size) std::realloc(ptr, new_size) +#endif +#ifndef RAPIDJSON_FREE +///! customization point for global \c free +#define RAPIDJSON_FREE(ptr) std::free(ptr) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(TypeName) new TypeName +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/external/rapidjson/reader.h b/external/rapidjson/reader.h new file mode 100644 index 0000000..5554660 --- /dev/null +++ b/external/rapidjson/reader.h @@ -0,0 +1,2246 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/clzll.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseEscapedApostropheFlag = 512, //!< Allow escaped apostrophe in strings. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_NEON) + +//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + return p + 8 + (lz >> 3); + } + } else { + uint32_t lz = internal::clzll(low); + return p + (lz >> 3); + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (; p <= end - 16; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + return p + 8 + (lz >> 3); + } + } else { + uint32_t lz = internal::clzll(low); + return p + (lz >> 3); + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_NEON + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : + stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Initialize JSON text token-by-token parsing + /*! + */ + void IterativeParseInit() { + parseResult_.Clear(); + state_ = IterativeParsingStartState; + } + + //! Parse one token from JSON text + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool IterativeParseNext(InputStream& is, Handler& handler) { + while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { + SkipWhitespaceAndComments(is); + + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state_, t); + IterativeParsingState d = Transit(state_, t, n, is, handler); + + // If we've finished or hit an error... + if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { + // Report errors. + if (d == IterativeParsingErrorState) { + HandleError(state_, is); + return false; + } + + // Transition to the finish state. + RAPIDJSON_ASSERT(d == IterativeParsingFinishState); + state_ = d; + + // If StopWhenDone is not set... + if (!(parseFlags & kParseStopWhenDoneFlag)) { + // ... and extra non-whitespace data is found... + SkipWhitespaceAndComments(is); + if (is.Peek() != '\0') { + // ... this is considered an error. + HandleError(state_, is); + return false; + } + } + + // Success! We are done! + return true; + } + + // Transition to the new state. + state_ = d; + + // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. + if (!IsIterativeParsingDelimiterState(n)) + return true; + } + + // We reached the end of file. + stack_.Clear(); + + if (state_ != IterativeParsingFinishState) { + HandleError(state_, is); + return false; + } + + return true; + } + + //! Check if token-by-token parsing JSON text is complete + /*! \return Whether the JSON has been fully decoded. + */ + RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { + return IsIterativeParsingCompleteState(state_); + } + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n') {} + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if ((parseFlags & kParseEscapedApostropheFlag) && RAPIDJSON_LIKELY(e == '\'')) { // Allow escaped apostrophe + is.Take(); + os.Put('\''); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDFFF)) { + // high surrogate, check if followed by valid low surrogate + if (RAPIDJSON_LIKELY(codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + // single low surrogate + else + { + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + } + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#elif defined(RAPIDJSON_NEON) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + vst1q_u8(reinterpret_cast(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16, q += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + for (const char* pend = p + length; p != pend; ) { + *q++ = *p++; + } + break; + } + vst1q_u8(reinterpret_cast(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + p += 8 + (lz >> 3); + break; + } + } else { + uint32_t lz = internal::clzll(low); + p += lz >> 3; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif // RAPIDJSON_NEON + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const StackCharacter* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s), stackStream(reader.stack_) {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(StackCharacter c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const StackCharacter* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& s) : Base(reader, s) {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + typedef typename internal::SelectIf, typename TargetEncoding::Ch, char>::Type NumberCharacter; + + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + if (Consume(s, 'N')) { + if (Consume(s, 'a') && Consume(s, 'N')) { + d = std::numeric_limits::quiet_NaN(); + useNanOrInf = true; + } + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { + if (Consume(s, 'n') && Consume(s, 'f')) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + useNanOrInf = true; + + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + } + + if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + // (exp + expFrac) must not underflow int => we're detecting when -exp gets + // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into + // underflow territory): + // + // -(exp * 10 + 9) + expFrac >= INT_MIN + // <=> exp <= (expFrac - INT_MIN - 9) / 10 + RAPIDJSON_ASSERT(expFrac <= 0); + int maxExp = (expFrac + 2147483639) / 10; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) { + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + GenericStringStream > srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const NumberCharacter* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal + if (d > (std::numeric_limits::max)()) { + // Overflow + // TODO: internal::StrtodX should report overflow (or underflow) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingFinishState = 0, // sink states at top + IterativeParsingErrorState, // sink states at top + IterativeParsingStartState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingMemberValueState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + // Delimiter states (at bottom) + IterativeParsingElementDelimiterState, + IterativeParsingMemberDelimiterState, + IterativeParsingKeyValueDelimiterState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { + return s >= IterativeParsingElementDelimiterState; + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { + return s <= IterativeParsingErrorState; + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; + IterativeParsingState state_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/external/rapidjson/schema.h b/external/rapidjson/schema.h new file mode 100644 index 0000000..248632b --- /dev/null +++ b/external/rapidjson/schema.h @@ -0,0 +1,2808 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include "stringbuffer.h" +#include "error/en.h" +#include "uri.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(code)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidCode = code;\ + context.invalidKeyword = SchemaType::GetValidateErrorKeyword(code).GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(context.invalidKeyword);\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// ValidateFlag + +/*! \def RAPIDJSON_VALIDATE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kValidateDefaultFlags definition. + + User can define this as any \c ValidateFlag combinations. +*/ +#ifndef RAPIDJSON_VALIDATE_DEFAULT_FLAGS +#define RAPIDJSON_VALIDATE_DEFAULT_FLAGS kValidateNoFlags +#endif + +//! Combination of validate flags +/*! \see + */ +enum ValidateFlag { + kValidateNoFlags = 0, //!< No flags are set. + kValidateContinueOnErrorFlag = 1, //!< Don't stop after first validation error. + kValidateDefaultFlags = RAPIDJSON_VALIDATE_DEFAULT_FLAGS //!< Default validate flags. Can be customized by defining RAPIDJSON_VALIDATE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; + virtual void SetValidateFlags(unsigned flags) = 0; + virtual unsigned GetValidateFlags() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&, const bool inheritContinueOnErrors) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// IValidationErrorHandler + +template +class IValidationErrorHandler { +public: + typedef typename SchemaType::Ch Ch; + typedef typename SchemaType::SValue SValue; + + virtual ~IValidationErrorHandler() {} + + virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(double actual, const SValue& expected) = 0; + virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; + + virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; + + virtual void DisallowedItem(SizeType index) = 0; + virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; + + virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void StartMissingProperties() = 0; + virtual void AddMissingProperty(const SValue& name) = 0; + virtual bool EndMissingProperties() = 0; + virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; + + virtual void StartDependencyErrors() = 0; + virtual void StartMissingDependentProperties() = 0; + virtual void AddMissingDependentProperty(const SValue& targetName) = 0; + virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; + virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0; + virtual bool EndDependencyErrors() = 0; + + virtual void DisallowedValue(const ValidateErrorCode code) = 0; + virtual void StartDisallowedType() = 0; + virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; + virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; + virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count, bool matched) = 0; + virtual void Disallowed() = 0; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef IValidationErrorHandler ErrorHandlerType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s) : + factory(f), + error_handler(eh), + schema(s), + valueSchema(), + invalidKeyword(), + invalidCode(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + ErrorHandlerType& error_handler; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + ValidateErrorCode invalidCode; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + typedef IValidationErrorHandler ErrorHandler; + typedef GenericUri UriType; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator, const UriType& id = UriType()) : + allocator_(allocator), + uri_(schemaDocument->GetURI(), *allocator), + id_(id), + pointer_(p, allocator), + typeless_(schemaDocument->GetTypeless()), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + notValidatorIndex_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false), + defaultValueLength_(0) + { + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + // PR #1393 + // Early add this Schema and its $ref(s) in schemaDocument's map to avoid infinite + // recursion (with recursive schemas), since schemaDocument->getSchema() is always + // checked before creating a new one. Don't cache typeless_, though. + if (this != typeless_) { + typedef typename SchemaDocumentType::SchemaEntry SchemaEntry; + SchemaEntry *entry = schemaDocument->schemaMap_.template Push(); + new (entry) SchemaEntry(pointer_, this, true, allocator_); + schemaDocument->AddSchemaRefs(this); + } + + if (!value.IsObject()) + return; + + // If we have an id property, resolve it with the in-scope id + if (const ValueType* v = GetMember(value, GetIdString())) { + if (v->IsString()) { + UriType local(*v, allocator); + id_ = local.Resolve(id_, allocator); + } + } + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) { + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256u + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document, id_); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = typeless_; + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document, id_); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document, id_); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document, id_); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document, id_); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document, id_); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document, id_); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document, id_); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + + // Default + if (const ValueType* v = GetMember(value, GetDefaultValueString())) + if (v->IsString()) + defaultValueLength_ = v->GetStringLength(); + + } + + ~Schema() { + AllocatorType::Free(enum_); + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + AllocatorType::Free(pattern_); + } +#endif + } + + const SValue& GetURI() const { + return uri_; + } + + const UriType& GetId() const { + return id_; + } + + const PointerType& GetPointer() const { + return pointer_; + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = typeless_; + else { + context.error_handler.DisallowedItem(context.arrayElementIndex); + // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error + context.valueSchema = typeless_; + // Must bump arrayElementIndex for when kValidateContinueOnErrorFlag is set + context.arrayElementIndex++; + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalItems); + } + } + else + context.valueSchema = typeless_; + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + // Only check pattern properties if we have validators + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); + } + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); + } + } + else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPatternProperties); + } + } + + // For enums only check if we have a hasher + if (enum_ && context.hasher) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + context.error_handler.DisallowedValue(kValidateErrorEnum); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorEnum); + foundEnum:; + } + + // Only check allOf etc if we have validators + if (context.validatorCount > 0) { + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) { + context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAllOf); + } + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAnyOf); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count, true); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOfMatch); + } else + oneValid = true; + } + if (!oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count, false); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorOneOf); + } + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) { + context.error_handler.Disallowed(); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorNot); + } + } + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) { + DisallowedType(context, GetNullString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) { + DisallowedType(context, GetBooleanString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) { + DisallowedType(context, GetNumberString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) { + DisallowedType(context, GetStringString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) { + context.error_handler.TooShort(str, length, minLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength); + } + if (count > maxLength_) { + context.error_handler.TooLong(str, length, maxLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength); + } + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) { + context.error_handler.DoesNotMatch(str, length); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern); + } + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) { + DisallowedType(context, GetObjectString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + context.valueSchema = typeless_; + } + } + + SizeType index = 0; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = typeless_; + return true; + } + + if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties + // Must set valueSchema for when kValidateContinueOnErrorFlag is set, else reports spurious type error + context.valueSchema = typeless_; + context.error_handler.DisallowedProperty(str, len); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorAdditionalProperties); + } + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) { + context.error_handler.StartMissingProperties(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required && !context.propertyExist[index]) + if (properties_[index].schema->defaultValueLength_ == 0 ) + context.error_handler.AddMissingProperty(properties_[index].name); + if (context.error_handler.EndMissingProperties()) + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorRequired); + } + + if (memberCount < minProperties_) { + context.error_handler.TooFewProperties(memberCount, minProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinProperties); + } + + if (memberCount > maxProperties_) { + context.error_handler.TooManyProperties(memberCount, maxProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxProperties); + } + + if (hasDependencies_) { + context.error_handler.StartDependencyErrors(); + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { + const Property& source = properties_[sourceIndex]; + if (context.propertyExist[sourceIndex]) { + if (source.dependencies) { + context.error_handler.StartMissingDependentProperties(); + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) + context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); + context.error_handler.EndMissingDependentProperties(source.name); + } + else if (source.dependenciesSchema) { + ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; + if (!dependenciesValidator->IsValid()) + context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); + } + } + } + if (context.error_handler.EndDependencyErrors()) + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorDependencies); + } + + return true; + } + + bool StartArray(Context& context) const { + context.arrayElementIndex = 0; + context.inArray = true; // Ensure we note that we are in an array + + if (!(type_ & (1 << kArraySchemaType))) { + DisallowedType(context, GetArrayString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) { + context.error_handler.TooFewItems(elementCount, minItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinItems); + } + + if (elementCount > maxItems_) { + context.error_handler.TooManyItems(elementCount, maxItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxItems); + } + + return true; + } + + static const ValueType& GetValidateErrorKeyword(ValidateErrorCode validateErrorCode) { + switch (validateErrorCode) { + case kValidateErrorMultipleOf: return GetMultipleOfString(); + case kValidateErrorMaximum: return GetMaximumString(); + case kValidateErrorExclusiveMaximum: return GetMaximumString(); // Same + case kValidateErrorMinimum: return GetMinimumString(); + case kValidateErrorExclusiveMinimum: return GetMinimumString(); // Same + + case kValidateErrorMaxLength: return GetMaxLengthString(); + case kValidateErrorMinLength: return GetMinLengthString(); + case kValidateErrorPattern: return GetPatternString(); + + case kValidateErrorMaxItems: return GetMaxItemsString(); + case kValidateErrorMinItems: return GetMinItemsString(); + case kValidateErrorUniqueItems: return GetUniqueItemsString(); + case kValidateErrorAdditionalItems: return GetAdditionalItemsString(); + + case kValidateErrorMaxProperties: return GetMaxPropertiesString(); + case kValidateErrorMinProperties: return GetMinPropertiesString(); + case kValidateErrorRequired: return GetRequiredString(); + case kValidateErrorAdditionalProperties: return GetAdditionalPropertiesString(); + case kValidateErrorPatternProperties: return GetPatternPropertiesString(); + case kValidateErrorDependencies: return GetDependenciesString(); + + case kValidateErrorEnum: return GetEnumString(); + case kValidateErrorType: return GetTypeString(); + + case kValidateErrorOneOf: return GetOneOfString(); + case kValidateErrorOneOfMatch: return GetOneOfString(); // Same + case kValidateErrorAllOf: return GetAllOfString(); + case kValidateErrorAnyOf: return GetAnyOfString(); + case kValidateErrorNot: return GetNotString(); + + default: return GetNullString(); + } + } + + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') + RAPIDJSON_STRING_(Ref, '$', 'r', 'e', 'f') + RAPIDJSON_STRING_(Id, 'i', 'd') + + RAPIDJSON_STRING_(SchemeEnd, ':') + RAPIDJSON_STRING_(AuthStart, '/', '/') + RAPIDJSON_STRING_(QueryStart, '?') + RAPIDJSON_STRING_(FragStart, '#') + RAPIDJSON_STRING_(Slash, '/') + RAPIDJSON_STRING_(Dot, '.') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document, id_); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + GenericRegexSearch rs(*pattern); + return rs.Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType *r = static_cast(allocator_->Malloc(sizeof(RegexType))); + try { + return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + AllocatorType::Free(r); + } + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + // Always return after first failure for these sub-validators + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_, false); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_, false); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_, false); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_, false); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema, false); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas, const bool inheritContinueOnErrors) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i], inheritContinueOnErrors); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); + } + } + else if (minimum_.IsUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); + } + } + else if (maximum_.IsUint64()) { } + /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); + } + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); + } + } + else if (maximum_.IsInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); // i >= 0 > maximum_ + } + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { + context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMinimum_ ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum); + } + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { + context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(exclusiveMaximum_ ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum); + } + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) { + context.error_handler.NotMultipleOf(d, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMultipleOf); + } + return true; + } + + void DisallowedType(Context& context, const ValueType& actualType) const { + ErrorHandler& eh = context.error_handler; + eh.StartDisallowedType(); + + if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); + if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); + if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); + if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); + if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); + + if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); + else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); + + eh.EndDisallowedType(actualType); + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + SValue uri_; + UriType id_; + PointerType pointer_; + const SchemaType* typeless_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; + + SizeType defaultValueLength_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = static_cast(buffer[i]); + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; + virtual const SchemaDocumentType* GetRemoteDocument(GenericUri uri) { return GetRemoteDocument(uri.GetBaseString(), uri.GetBaseStringLength()); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + typedef GenericValue SValue; + typedef GenericUri UriType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param uri The base URI of this schema document for purposes of violation reporting. + \param uriLength Length of \c name, in code points. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + \param pointer An optional JSON pointer to the start of the schema document + */ + explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, + IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0, + const PointerType& pointer = PointerType()) : // PR #1393 + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + typeless_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + Ch noUri[1] = {0}; + uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); + docId_ = UriType(uri_, allocator_); + + typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); + new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_, docId_); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call HandleRefSchema() if there are $ref. + // PR #1393 use input pointer if supplied + root_ = typeless_; + if (pointer.GetTokenCount() == 0) { + CreateSchemaRecursive(&root_, pointer, document, document, docId_); + } + else if (const ValueType* v = pointer.Get(document)) { + CreateSchema(&root_, pointer, *v, document, docId_); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + typeless_(rhs.typeless_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)), + uri_(std::move(rhs.uri_)), + docId_(rhs.docId_) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.typeless_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + if (typeless_) { + typeless_->~SchemaType(); + Allocator::Free(typeless_); + } + + RAPIDJSON_DELETE(ownAllocator_); + } + + const SValue& GetURI() const { return uri_; } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + typedef const PointerType* SchemaRefPtr; // PR #1393 + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + // Changed by PR #1393 + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { + if (v.GetType() == kObjectType) { + UriType newid = UriType(CreateSchema(schema, pointer, v, document, id), allocator_); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document, newid); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document, id); + } + + // Changed by PR #1393 + const UriType& CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document, const UriType& id) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (const SchemaType* sc = GetSchema(pointer)) { + if (schema) + *schema = sc; + AddSchemaRefs(const_cast(sc)); + } + else if (!HandleRefSchema(pointer, schema, v, document, id)) { + // The new schema constructor adds itself and its $ref(s) to schemaMap_ + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_, id); + if (schema) + *schema = s; + return s->GetId(); + } + } + else { + if (schema) + *schema = typeless_; + AddSchemaRefs(typeless_); + } + return id; + } + + // Changed by PR #1393 + // TODO should this return a UriType& ? + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document, const UriType& id) { + typename ValueType::ConstMemberIterator itr = v.FindMember(SchemaType::GetRefString()); + if (itr == v.MemberEnd()) + return false; + + // Resolve the source pointer to the $ref'ed schema (finally) + new (schemaRef_.template Push()) SchemaRefPtr(&source); + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + // First resolve $ref against the in-scope id + UriType scopeId = UriType(id, allocator_); + UriType ref = UriType(itr->value, allocator_).Resolve(scopeId, allocator_); + // See if the resolved $ref minus the fragment matches a resolved id in this document + // Search from the root. Returns the subschema in the document and its absolute JSON pointer. + PointerType basePointer = PointerType(); + const ValueType *base = FindId(document, ref, basePointer, docId_, false); + if (!base) { + // Remote reference - call the remote document provider + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(ref)) { + const Ch* s = ref.GetFragString(); + len = ref.GetFragStringLength(); + if (len <= 1 || s[1] == '/') { + // JSON pointer fragment, absolute in the remote schema + const PointerType pointer(s, len, allocator_); + if (pointer.IsValid()) { + // Get the subschema + if (const SchemaType *sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + AddSchemaRefs(const_cast(sc)); + return true; + } + } + } else { + // Plain name fragment, not allowed + } + } + } + } + else { // Local reference + const Ch* s = ref.GetFragString(); + len = ref.GetFragStringLength(); + if (len <= 1 || s[1] == '/') { + // JSON pointer fragment, relative to the resolved URI + const PointerType relPointer(s, len, allocator_); + if (relPointer.IsValid()) { + // Get the subschema + if (const ValueType *pv = relPointer.Get(*base)) { + // Now get the absolute JSON pointer by adding relative to base + PointerType pointer(basePointer); + for (SizeType i = 0; i < relPointer.GetTokenCount(); i++) + pointer = pointer.Append(relPointer.GetTokens()[i], allocator_); + //GenericStringBuffer sb; + //pointer.StringifyUriFragment(sb); + if (pointer.IsValid() && !IsCyclicRef(pointer)) { + // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there + // TODO: cache pointer <-> id mapping + size_t unresolvedTokenIndex; + scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); + CreateSchema(schema, pointer, *pv, document, scopeId); + return true; + } + } + } + } else { + // Plain name fragment, relative to the resolved URI + // See if the fragment matches an id in this document. + // Search from the base we just established. Returns the subschema in the document and its absolute JSON pointer. + PointerType pointer = PointerType(); + if (const ValueType *pv = FindId(*base, ref, pointer, UriType(ref.GetBaseString(), ref.GetBaseStringLength(), allocator_), true, basePointer)) { + if (!IsCyclicRef(pointer)) { + //GenericStringBuffer sb; + //pointer.StringifyUriFragment(sb); + // Call CreateSchema recursively, but first compute the in-scope id for the $ref target as we have jumped there + // TODO: cache pointer <-> id mapping + size_t unresolvedTokenIndex; + scopeId = pointer.GetUri(document, docId_, &unresolvedTokenIndex, allocator_); + CreateSchema(schema, pointer, *pv, document, scopeId); + return true; + } + } + } + } + } + } + + // Invalid/Unknown $ref + if (schema) + *schema = typeless_; + AddSchemaRefs(typeless_); + return true; + } + + //! Find the first subschema with a resolved 'id' that matches the specified URI. + // If full specified use all URI else ignore fragment. + // If found, return a pointer to the subschema and its JSON pointer. + // TODO cache pointer <-> id mapping + ValueType* FindId(const ValueType& doc, const UriType& finduri, PointerType& resptr, const UriType& baseuri, bool full, const PointerType& here = PointerType()) const { + SizeType i = 0; + ValueType* resval = 0; + UriType tempuri = UriType(finduri, allocator_); + UriType localuri = UriType(baseuri, allocator_); + if (doc.GetType() == kObjectType) { + // Establish the base URI of this object + typename ValueType::ConstMemberIterator m = doc.FindMember(SchemaType::GetIdString()); + if (m != doc.MemberEnd() && m->value.GetType() == kStringType) { + localuri = UriType(m->value, allocator_).Resolve(baseuri, allocator_); + } + // See if it matches + if (localuri.Match(finduri, full)) { + resval = const_cast(&doc); + resptr = here; + return resval; + } + // No match, continue looking + for (m = doc.MemberBegin(); m != doc.MemberEnd(); ++m) { + if (m->value.GetType() == kObjectType || m->value.GetType() == kArrayType) { + resval = FindId(m->value, finduri, resptr, localuri, full, here.Append(m->name.GetString(), m->name.GetStringLength(), allocator_)); + } + if (resval) break; + } + } else if (doc.GetType() == kArrayType) { + // Continue looking + for (typename ValueType::ConstValueIterator v = doc.Begin(); v != doc.End(); ++v) { + if (v->GetType() == kObjectType || v->GetType() == kArrayType) { + resval = FindId(*v, finduri, resptr, localuri, full, here.Append(i, allocator_)); + } + if (resval) break; + i++; + } + } + return resval; + } + + // Added by PR #1393 + void AddSchemaRefs(SchemaType* schema) { + while (!schemaRef_.Empty()) { + SchemaRefPtr *ref = schemaRef_.template Pop(1); + SchemaEntry *entry = schemaMap_.template Push(); + new (entry) SchemaEntry(**ref, schema, false, allocator_); + } + } + + // Added by PR #1393 + bool IsCyclicRef(const PointerType& pointer) const { + for (const SchemaRefPtr* ref = schemaRef_.template Bottom(); ref != schemaRef_.template End(); ++ref) + if (pointer == **ref) + return true; + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + const SchemaType* GetTypeless() const { return typeless_; } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + SchemaType* typeless_; + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer(s) from $ref(s) until resolved + SValue uri_; // Schema document URI + UriType docId_; +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator, + public internal::IValidationErrorHandler { +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename SchemaType::SValue SValue; + typedef typename EncodingType::Ch Ch; + typedef GenericStringRef StringRefType; + typedef GenericValue ValueType; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true), + flags_(kValidateDefaultFlags) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(&outputHandler), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true), + flags_(kValidateDefaultFlags) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + ResetError(); + } + + //! Reset the error state. + void ResetError() { + error_.SetObject(); + currentError_.SetNull(); + missingDependents_.SetNull(); + valid_ = true; + } + + //! Implementation of ISchemaValidator + void SetValidateFlags(unsigned flags) { + flags_ = flags; + } + virtual unsigned GetValidateFlags() const { + return flags_; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { + if (!valid_) return false; + if (GetContinueOnErrors() && !error_.ObjectEmpty()) return false; + return true; + } + + //! Gets the error object. + ValueType& GetError() { return error_; } + const ValueType& GetError() const { return error_; } + + //! Gets the JSON pointer pointed to the invalid schema. + // If reporting all errors, the stack will be empty. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); + } + + //! Gets the keyword of invalid schema. + // If reporting all errors, the stack will be empty, so return "errors". + const Ch* GetInvalidSchemaKeyword() const { + if (!schemaStack_.Empty()) return CurrentContext().invalidKeyword; + if (GetContinueOnErrors() && !error_.ObjectEmpty()) return (const Ch*)GetErrorsString(); + return 0; + } + + //! Gets the error code of invalid schema. + // If reporting all errors, the stack will be empty, so return kValidateErrors. + ValidateErrorCode GetInvalidSchemaCode() const { + if (!schemaStack_.Empty()) return CurrentContext().invalidCode; + if (GetContinueOnErrors() && !error_.ObjectEmpty()) return kValidateErrors; + return kValidateErrorNone; + } + + //! Gets the JSON pointer pointed to the invalid value. + // If reporting all errors, the stack will be empty. + PointerType GetInvalidDocumentPointer() const { + if (documentStack_.Empty()) { + return PointerType(); + } + else { + return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + } + + void NotMultipleOf(int64_t actual, const SValue& expected) { + AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); + } + void NotMultipleOf(uint64_t actual, const SValue& expected) { + AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); + } + void NotMultipleOf(double actual, const SValue& expected) { + AddNumberError(kValidateErrorMultipleOf, ValueType(actual).Move(), expected); + } + void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMaximum : kValidateErrorMaximum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(exclusive ? kValidateErrorExclusiveMinimum : kValidateErrorMinimum, ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + + void TooLong(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(kValidateErrorMaxLength, + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void TooShort(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(kValidateErrorMinLength, + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void DoesNotMatch(const Ch* str, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(kValidateErrorPattern); + } + + void DisallowedItem(SizeType index) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); + AddCurrentError(kValidateErrorAdditionalItems, true); + } + void TooFewItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(kValidateErrorMinItems, + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooManyItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(kValidateErrorMaxItems, + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void DuplicateItems(SizeType index1, SizeType index2) { + ValueType duplicates(kArrayType); + duplicates.PushBack(index1, GetStateAllocator()); + duplicates.PushBack(index2, GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); + AddCurrentError(kValidateErrorUniqueItems, true); + } + + void TooManyProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(kValidateErrorMaxProperties, + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooFewProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(kValidateErrorMinProperties, + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void StartMissingProperties() { + currentError_.SetArray(); + } + void AddMissingProperty(const SValue& name) { + currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); + } + bool EndMissingProperties() { + if (currentError_.Empty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(kValidateErrorRequired); + return true; + } + void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) + MergeError(static_cast(subvalidators[i])->GetError()); + } + void DisallowedProperty(const Ch* name, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(kValidateErrorAdditionalProperties, true); + } + + void StartDependencyErrors() { + currentError_.SetObject(); + } + void StartMissingDependentProperties() { + missingDependents_.SetArray(); + } + void AddMissingDependentProperty(const SValue& targetName) { + missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndMissingDependentProperties(const SValue& sourceName) { + if (!missingDependents_.Empty()) { + // Create equivalent 'required' error + ValueType error(kObjectType); + ValidateErrorCode code = kValidateErrorRequired; + error.AddMember(GetMissingString(), missingDependents_.Move(), GetStateAllocator()); + AddErrorCode(error, code); + AddErrorInstanceLocation(error, false); + // When appending to a pointer ensure its allocator is used + PointerType schemaRef = GetInvalidSchemaPointer().Append(SchemaType::GetValidateErrorKeyword(kValidateErrorDependencies), &GetInvalidSchemaPointer().GetAllocator()); + AddErrorSchemaLocation(error, schemaRef.Append(sourceName.GetString(), sourceName.GetStringLength(), &GetInvalidSchemaPointer().GetAllocator())); + ValueType wrapper(kObjectType); + wrapper.AddMember(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator()).Move(), error, GetStateAllocator()); + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), wrapper, GetStateAllocator()); + } + } + void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + static_cast(subvalidator)->GetError(), GetStateAllocator()); + } + bool EndDependencyErrors() { + if (currentError_.ObjectEmpty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(kValidateErrorDependencies); + return true; + } + + void DisallowedValue(const ValidateErrorCode code = kValidateErrorEnum) { + currentError_.SetObject(); + AddCurrentError(code); + } + void StartDisallowedType() { + currentError_.SetArray(); + } + void AddExpectedType(const typename SchemaType::ValueType& expectedType) { + currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndDisallowedType(const typename SchemaType::ValueType& actualType) { + ValueType error(kObjectType); + error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); + error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); + currentError_ = error; + AddCurrentError(kValidateErrorType); + } + void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { + // Treat allOf like oneOf and anyOf to match https://rapidjson.org/md_doc_schema.html#allOf-anyOf-oneOf + AddErrorArray(kValidateErrorAllOf, subvalidators, count); + //for (SizeType i = 0; i < count; ++i) { + // MergeError(static_cast(subvalidators[i])->GetError()); + //} + } + void NoneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(kValidateErrorAnyOf, subvalidators, count); + } + void NotOneOf(ISchemaValidator** subvalidators, SizeType count, bool matched = false) { + AddErrorArray(matched ? kValidateErrorOneOfMatch : kValidateErrorOneOf, subvalidators, count); + } + void Disallowed() { + currentError_.SetObject(); + AddCurrentError(kValidateErrorNot); + } + +#define RAPIDJSON_STRING_(name, ...) \ + static const StringRefType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ + return v;\ + } + + RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') + RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') + RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') + RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') + RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') + RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') + RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') + RAPIDJSON_STRING_(ErrorCode, 'e', 'r', 'r', 'o', 'r', 'C', 'o', 'd', 'e') + RAPIDJSON_STRING_(ErrorMessage, 'e', 'r', 'r', 'o', 'r', 'M', 'e', 's', 's', 'a', 'g', 'e') + RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') + +#undef RAPIDJSON_STRING_ + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if ((!BeginValue() && !GetContinueOnErrors()) || (!CurrentSchema().method arg1 && !GetContinueOnErrors())) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + valid_ = false;\ + return valid_;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + valid_ = (EndValue() || GetContinueOnErrors()) && (!outputHandler_ || outputHandler_->method arg2);\ + return valid_; + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + valid_ = !outputHandler_ || outputHandler_->StartObject(); + return valid_; + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy) && !GetContinueOnErrors()) { + valid_ = false; + return valid_; + } + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); + return valid_; + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount) && !GetContinueOnErrors()) { + valid_ = false; + return valid_; + } + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + valid_ = !outputHandler_ || outputHandler_->StartArray(); + return valid_; + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount) && !GetContinueOnErrors()) { + valid_ = false; + return valid_; + } + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root, const bool inheritContinueOnErrors) { + ISchemaValidator* sv = new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + sv->SetValidateFlags(inheritContinueOnErrors ? GetValidateFlags() : GetValidateFlags() & ~(unsigned)kValidateContinueOnErrorFlag); + return sv; + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, + const char* basePath, size_t basePathSize, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true), + flags_(kValidateDefaultFlags) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + if (basePath && basePathSize) + memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); + return *stateAllocator_; + } + + bool GetContinueOnErrors() const { + return flags_ & kValidateContinueOnErrorFlag; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext()) && !GetContinueOnErrors()) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + RAPIDJSON_ASSERT(CurrentContext().valueSchema); + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i], true); // Inherit continueOnError + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext()) && !GetContinueOnErrors()) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + void* hasher = CurrentContext().hasher; + uint64_t h = hasher && CurrentContext().arrayUniqueness ? static_cast(hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + // Only check uniqueness if there is a hasher + if (hasher && context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) { + DuplicateItems(static_cast(itr - a->Begin()), a->Size()); + // Cleanup before returning if continuing + if (GetContinueOnErrors()) { + a->PushBack(h, GetStateAllocator()); + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/'); + } + RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorUniqueItems); + } + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + void AddErrorInstanceLocation(ValueType& result, bool parent) { + GenericStringBuffer sb; + PointerType instancePointer = GetInvalidDocumentPointer(); + ((parent && instancePointer.GetTokenCount() > 0) + ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) + : instancePointer).StringifyUriFragment(sb); + ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); + } + + void AddErrorSchemaLocation(ValueType& result, PointerType schema = PointerType()) { + GenericStringBuffer sb; + SizeType len = CurrentSchema().GetURI().GetStringLength(); + if (len) memcpy(sb.Push(len), CurrentSchema().GetURI().GetString(), len * sizeof(Ch)); + if (schema.GetTokenCount()) schema.StringifyUriFragment(sb); + else GetInvalidSchemaPointer().StringifyUriFragment(sb); + ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); + } + + void AddErrorCode(ValueType& result, const ValidateErrorCode code) { + result.AddMember(GetErrorCodeString(), code, GetStateAllocator()); + } + + void AddError(ValueType& keyword, ValueType& error) { + typename ValueType::MemberIterator member = error_.FindMember(keyword); + if (member == error_.MemberEnd()) + error_.AddMember(keyword, error, GetStateAllocator()); + else { + if (member->value.IsObject()) { + ValueType errors(kArrayType); + errors.PushBack(member->value, GetStateAllocator()); + member->value = errors; + } + member->value.PushBack(error, GetStateAllocator()); + } + } + + void AddCurrentError(const ValidateErrorCode code, bool parent = false) { + AddErrorCode(currentError_, code); + AddErrorInstanceLocation(currentError_, parent); + AddErrorSchemaLocation(currentError_); + AddError(ValueType(SchemaType::GetValidateErrorKeyword(code), GetStateAllocator(), false).Move(), currentError_); + } + + void MergeError(ValueType& other) { + for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { + AddError(it->name, it->value); + } + } + + void AddNumberError(const ValidateErrorCode code, ValueType& actual, const SValue& expected, + const typename SchemaType::ValueType& (*exclusive)() = 0) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); + currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); + if (exclusive) + currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); + AddCurrentError(code); + } + + void AddErrorArray(const ValidateErrorCode code, + ISchemaValidator** subvalidators, SizeType count) { + ValueType errors(kArrayType); + for (SizeType i = 0; i < count; ++i) + errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); + AddCurrentError(code); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + OutputHandler* outputHandler_; + ValueType error_; + ValueType currentError_; + ValueType missingDependents_; + bool valid_; + unsigned flags_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + typedef GenericValue ValueType; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), invalidSchemaCode_(kValidateErrorNone), error_(kObjectType), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + error_.SetObject(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidSchemaCode_ = validator.GetInvalidSchemaCode(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + error_.CopyFrom(validator.GetError(), allocator_); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + const ValueType& GetError() const { return error_; } + ValidateErrorCode GetInvalidSchemaCode() const { return invalidSchemaCode_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + ValidateErrorCode invalidSchemaCode_; + StackAllocator allocator_; + ValueType error_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/external/rapidjson/stream.h b/external/rapidjson/stream.h new file mode 100644 index 0000000..1fd7091 --- /dev/null +++ b/external/rapidjson/stream.h @@ -0,0 +1,223 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// GenericStreamWrapper + +//! A Stream Wrapper +/*! \tThis string stream is a wrapper for any stream by just forwarding any + \treceived message to the origin stream. + \note implements Stream concept +*/ + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +template > +class GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + GenericStreamWrapper(InputStream& is): is_(is) {} + + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() { return is_.Tell(); } + Ch* PutBegin() { return is_.PutBegin(); } + void Put(Ch ch) { is_.Put(ch); } + void Flush() { is_.Flush(); } + size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } + + // wrapper for MemoryStream + const Ch* Peek4() const { return is_.Peek4(); } + + // wrapper for AutoUTFInputStream + UTFType GetType() const { return is_.GetType(); } + bool HasBOM() const { return is_.HasBOM(); } + +protected: + InputStream& is_; +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/external/rapidjson/stringbuffer.h b/external/rapidjson/stringbuffer.h new file mode 100644 index 0000000..82ad3ca --- /dev/null +++ b/external/rapidjson/stringbuffer.h @@ -0,0 +1,121 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + //! Get the size of string in bytes in the string buffer. + size_t GetSize() const { return stack_.GetSize(); } + + //! Get the length of string in Ch in the string buffer. + size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/external/rapidjson/uri.h b/external/rapidjson/uri.h new file mode 100644 index 0000000..f93e508 --- /dev/null +++ b/external/rapidjson/uri.h @@ -0,0 +1,481 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// (C) Copyright IBM Corporation 2021 +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_URI_H_ +#define RAPIDJSON_URI_H_ + +#include "internal/strfunc.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// GenericUri + +template +class GenericUri { +public: + typedef typename ValueType::Ch Ch; +#if RAPIDJSON_HAS_STDSTRING + typedef std::basic_string String; +#endif + + //! Constructors + GenericUri(Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + } + + GenericUri(const Ch* uri, SizeType len, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + Parse(uri, len); + } + + GenericUri(const Ch* uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + Parse(uri, internal::StrLen(uri)); + } + + // Use with specializations of GenericValue + template GenericUri(const T& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + const Ch* u = uri.template Get(); // TypeHelper from document.h + Parse(u, internal::StrLen(u)); + } + +#if RAPIDJSON_HAS_STDSTRING + GenericUri(const String& uri, Allocator* allocator = 0) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + Parse(uri.c_str(), internal::StrLen(uri.c_str())); + } +#endif + + //! Copy constructor + GenericUri(const GenericUri& rhs) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(), ownAllocator_() { + *this = rhs; + } + + //! Copy constructor + GenericUri(const GenericUri& rhs, Allocator* allocator) : uri_(), base_(), scheme_(), auth_(), path_(), query_(), frag_(), allocator_(allocator), ownAllocator_() { + *this = rhs; + } + + //! Destructor. + ~GenericUri() { + Free(); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator + GenericUri& operator=(const GenericUri& rhs) { + if (this != &rhs) { + // Do not delete ownAllocator + Free(); + Allocate(rhs.GetStringLength()); + auth_ = CopyPart(scheme_, rhs.scheme_, rhs.GetSchemeStringLength()); + path_ = CopyPart(auth_, rhs.auth_, rhs.GetAuthStringLength()); + query_ = CopyPart(path_, rhs.path_, rhs.GetPathStringLength()); + frag_ = CopyPart(query_, rhs.query_, rhs.GetQueryStringLength()); + base_ = CopyPart(frag_, rhs.frag_, rhs.GetFragStringLength()); + uri_ = CopyPart(base_, rhs.base_, rhs.GetBaseStringLength()); + CopyPart(uri_, rhs.uri_, rhs.GetStringLength()); + } + return *this; + } + + //! Getters + // Use with specializations of GenericValue + template void Get(T& uri, Allocator& allocator) { + uri.template Set(this->GetString(), allocator); // TypeHelper from document.h + } + + const Ch* GetString() const { return uri_; } + SizeType GetStringLength() const { return uri_ == 0 ? 0 : internal::StrLen(uri_); } + const Ch* GetBaseString() const { return base_; } + SizeType GetBaseStringLength() const { return base_ == 0 ? 0 : internal::StrLen(base_); } + const Ch* GetSchemeString() const { return scheme_; } + SizeType GetSchemeStringLength() const { return scheme_ == 0 ? 0 : internal::StrLen(scheme_); } + const Ch* GetAuthString() const { return auth_; } + SizeType GetAuthStringLength() const { return auth_ == 0 ? 0 : internal::StrLen(auth_); } + const Ch* GetPathString() const { return path_; } + SizeType GetPathStringLength() const { return path_ == 0 ? 0 : internal::StrLen(path_); } + const Ch* GetQueryString() const { return query_; } + SizeType GetQueryStringLength() const { return query_ == 0 ? 0 : internal::StrLen(query_); } + const Ch* GetFragString() const { return frag_; } + SizeType GetFragStringLength() const { return frag_ == 0 ? 0 : internal::StrLen(frag_); } + +#if RAPIDJSON_HAS_STDSTRING + static String Get(const GenericUri& uri) { return String(uri.GetString(), uri.GetStringLength()); } + static String GetBase(const GenericUri& uri) { return String(uri.GetBaseString(), uri.GetBaseStringLength()); } + static String GetScheme(const GenericUri& uri) { return String(uri.GetSchemeString(), uri.GetSchemeStringLength()); } + static String GetAuth(const GenericUri& uri) { return String(uri.GetAuthString(), uri.GetAuthStringLength()); } + static String GetPath(const GenericUri& uri) { return String(uri.GetPathString(), uri.GetPathStringLength()); } + static String GetQuery(const GenericUri& uri) { return String(uri.GetQueryString(), uri.GetQueryStringLength()); } + static String GetFrag(const GenericUri& uri) { return String(uri.GetFragString(), uri.GetFragStringLength()); } +#endif + + //! Equality operators + bool operator==(const GenericUri& rhs) const { + return Match(rhs, true); + } + + bool operator!=(const GenericUri& rhs) const { + return !Match(rhs, true); + } + + bool Match(const GenericUri& uri, bool full = true) const { + Ch* s1; + Ch* s2; + if (full) { + s1 = uri_; + s2 = uri.uri_; + } else { + s1 = base_; + s2 = uri.base_; + } + if (s1 == s2) return true; + if (s1 == 0 || s2 == 0) return false; + return internal::StrCmp(s1, s2) == 0; + } + + //! Resolve this URI against another (base) URI in accordance with URI resolution rules. + // See https://tools.ietf.org/html/rfc3986 + // Use for resolving an id or $ref with an in-scope id. + // Returns a new GenericUri for the resolved URI. + GenericUri Resolve(const GenericUri& baseuri, Allocator* allocator = 0) { + GenericUri resuri; + resuri.allocator_ = allocator; + // Ensure enough space for combining paths + resuri.Allocate(GetStringLength() + baseuri.GetStringLength() + 1); // + 1 for joining slash + + if (!(GetSchemeStringLength() == 0)) { + // Use all of this URI + resuri.auth_ = CopyPart(resuri.scheme_, scheme_, GetSchemeStringLength()); + resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); + resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); + resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); + resuri.RemoveDotSegments(); + } else { + // Use the base scheme + resuri.auth_ = CopyPart(resuri.scheme_, baseuri.scheme_, baseuri.GetSchemeStringLength()); + if (!(GetAuthStringLength() == 0)) { + // Use this auth, path, query + resuri.path_ = CopyPart(resuri.auth_, auth_, GetAuthStringLength()); + resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); + resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); + resuri.RemoveDotSegments(); + } else { + // Use the base auth + resuri.path_ = CopyPart(resuri.auth_, baseuri.auth_, baseuri.GetAuthStringLength()); + if (GetPathStringLength() == 0) { + // Use the base path + resuri.query_ = CopyPart(resuri.path_, baseuri.path_, baseuri.GetPathStringLength()); + if (GetQueryStringLength() == 0) { + // Use the base query + resuri.frag_ = CopyPart(resuri.query_, baseuri.query_, baseuri.GetQueryStringLength()); + } else { + // Use this query + resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); + } + } else { + if (path_[0] == '/') { + // Absolute path - use all of this path + resuri.query_ = CopyPart(resuri.path_, path_, GetPathStringLength()); + resuri.RemoveDotSegments(); + } else { + // Relative path - append this path to base path after base path's last slash + size_t pos = 0; + if (!(baseuri.GetAuthStringLength() == 0) && baseuri.GetPathStringLength() == 0) { + resuri.path_[pos] = '/'; + pos++; + } + size_t lastslashpos = baseuri.GetPathStringLength(); + while (lastslashpos > 0) { + if (baseuri.path_[lastslashpos - 1] == '/') break; + lastslashpos--; + } + std::memcpy(&resuri.path_[pos], baseuri.path_, lastslashpos * sizeof(Ch)); + pos += lastslashpos; + resuri.query_ = CopyPart(&resuri.path_[pos], path_, GetPathStringLength()); + resuri.RemoveDotSegments(); + } + // Use this query + resuri.frag_ = CopyPart(resuri.query_, query_, GetQueryStringLength()); + } + } + } + // Always use this frag + resuri.base_ = CopyPart(resuri.frag_, frag_, GetFragStringLength()); + + // Re-constitute base_ and uri_ + resuri.SetBase(); + resuri.uri_ = resuri.base_ + resuri.GetBaseStringLength() + 1; + resuri.SetUri(); + return resuri; + } + + //! Get the allocator of this GenericUri. + Allocator& GetAllocator() { return *allocator_; } + +private: + // Allocate memory for a URI + // Returns total amount allocated + std::size_t Allocate(std::size_t len) { + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + // Allocate one block containing each part of the URI (5) plus base plus full URI, all null terminated. + // Order: scheme, auth, path, query, frag, base, uri + // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. + size_t total = (3 * len + 7) * sizeof(Ch); + scheme_ = static_cast(allocator_->Malloc(total)); + *scheme_ = '\0'; + auth_ = scheme_; + auth_++; + *auth_ = '\0'; + path_ = auth_; + path_++; + *path_ = '\0'; + query_ = path_; + query_++; + *query_ = '\0'; + frag_ = query_; + frag_++; + *frag_ = '\0'; + base_ = frag_; + base_++; + *base_ = '\0'; + uri_ = base_; + uri_++; + *uri_ = '\0'; + return total; + } + + // Free memory for a URI + void Free() { + if (scheme_) { + Allocator::Free(scheme_); + scheme_ = 0; + } + } + + // Parse a URI into constituent scheme, authority, path, query, & fragment parts + // Supports URIs that match regex ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? as per + // https://tools.ietf.org/html/rfc3986 + void Parse(const Ch* uri, std::size_t len) { + std::size_t start = 0, pos1 = 0, pos2 = 0; + Allocate(len); + + // Look for scheme ([^:/?#]+):)? + if (start < len) { + while (pos1 < len) { + if (uri[pos1] == ':') break; + pos1++; + } + if (pos1 != len) { + while (pos2 < len) { + if (uri[pos2] == '/') break; + if (uri[pos2] == '?') break; + if (uri[pos2] == '#') break; + pos2++; + } + if (pos1 < pos2) { + pos1++; + std::memcpy(scheme_, &uri[start], pos1 * sizeof(Ch)); + scheme_[pos1] = '\0'; + start = pos1; + } + } + } + // Look for auth (//([^/?#]*))? + // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. + auth_ = scheme_ + GetSchemeStringLength(); + auth_++; + *auth_ = '\0'; + if (start < len - 1 && uri[start] == '/' && uri[start + 1] == '/') { + pos2 = start + 2; + while (pos2 < len) { + if (uri[pos2] == '/') break; + if (uri[pos2] == '?') break; + if (uri[pos2] == '#') break; + pos2++; + } + std::memcpy(auth_, &uri[start], (pos2 - start) * sizeof(Ch)); + auth_[pos2 - start] = '\0'; + start = pos2; + } + // Look for path ([^?#]*) + // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. + path_ = auth_ + GetAuthStringLength(); + path_++; + *path_ = '\0'; + if (start < len) { + pos2 = start; + while (pos2 < len) { + if (uri[pos2] == '?') break; + if (uri[pos2] == '#') break; + pos2++; + } + if (start != pos2) { + std::memcpy(path_, &uri[start], (pos2 - start) * sizeof(Ch)); + path_[pos2 - start] = '\0'; + if (path_[0] == '/') + RemoveDotSegments(); // absolute path - normalize + start = pos2; + } + } + // Look for query (\?([^#]*))? + // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. + query_ = path_ + GetPathStringLength(); + query_++; + *query_ = '\0'; + if (start < len && uri[start] == '?') { + pos2 = start + 1; + while (pos2 < len) { + if (uri[pos2] == '#') break; + pos2++; + } + if (start != pos2) { + std::memcpy(query_, &uri[start], (pos2 - start) * sizeof(Ch)); + query_[pos2 - start] = '\0'; + start = pos2; + } + } + // Look for fragment (#(.*))? + // Note need to set, increment, assign in 3 stages to avoid compiler warning bug. + frag_ = query_ + GetQueryStringLength(); + frag_++; + *frag_ = '\0'; + if (start < len && uri[start] == '#') { + std::memcpy(frag_, &uri[start], (len - start) * sizeof(Ch)); + frag_[len - start] = '\0'; + } + + // Re-constitute base_ and uri_ + base_ = frag_ + GetFragStringLength() + 1; + SetBase(); + uri_ = base_ + GetBaseStringLength() + 1; + SetUri(); + } + + // Reconstitute base + void SetBase() { + Ch* next = base_; + std::memcpy(next, scheme_, GetSchemeStringLength() * sizeof(Ch)); + next+= GetSchemeStringLength(); + std::memcpy(next, auth_, GetAuthStringLength() * sizeof(Ch)); + next+= GetAuthStringLength(); + std::memcpy(next, path_, GetPathStringLength() * sizeof(Ch)); + next+= GetPathStringLength(); + std::memcpy(next, query_, GetQueryStringLength() * sizeof(Ch)); + next+= GetQueryStringLength(); + *next = '\0'; + } + + // Reconstitute uri + void SetUri() { + Ch* next = uri_; + std::memcpy(next, base_, GetBaseStringLength() * sizeof(Ch)); + next+= GetBaseStringLength(); + std::memcpy(next, frag_, GetFragStringLength() * sizeof(Ch)); + next+= GetFragStringLength(); + *next = '\0'; + } + + // Copy a part from one GenericUri to another + // Return the pointer to the next part to be copied to + Ch* CopyPart(Ch* to, Ch* from, std::size_t len) { + RAPIDJSON_ASSERT(to != 0); + RAPIDJSON_ASSERT(from != 0); + std::memcpy(to, from, len * sizeof(Ch)); + to[len] = '\0'; + Ch* next = to + len + 1; + return next; + } + + // Remove . and .. segments from the path_ member. + // https://tools.ietf.org/html/rfc3986 + // This is done in place as we are only removing segments. + void RemoveDotSegments() { + std::size_t pathlen = GetPathStringLength(); + std::size_t pathpos = 0; // Position in path_ + std::size_t newpos = 0; // Position in new path_ + + // Loop through each segment in original path_ + while (pathpos < pathlen) { + // Get next segment, bounded by '/' or end + size_t slashpos = 0; + while ((pathpos + slashpos) < pathlen) { + if (path_[pathpos + slashpos] == '/') break; + slashpos++; + } + // Check for .. and . segments + if (slashpos == 2 && path_[pathpos] == '.' && path_[pathpos + 1] == '.') { + // Backup a .. segment in the new path_ + // We expect to find a previously added slash at the end or nothing + RAPIDJSON_ASSERT(newpos == 0 || path_[newpos - 1] == '/'); + size_t lastslashpos = newpos; + // Make sure we don't go beyond the start segment + if (lastslashpos > 1) { + // Find the next to last slash and back up to it + lastslashpos--; + while (lastslashpos > 0) { + if (path_[lastslashpos - 1] == '/') break; + lastslashpos--; + } + // Set the new path_ position + newpos = lastslashpos; + } + } else if (slashpos == 1 && path_[pathpos] == '.') { + // Discard . segment, leaves new path_ unchanged + } else { + // Move any other kind of segment to the new path_ + RAPIDJSON_ASSERT(newpos <= pathpos); + std::memmove(&path_[newpos], &path_[pathpos], slashpos * sizeof(Ch)); + newpos += slashpos; + // Add slash if not at end + if ((pathpos + slashpos) < pathlen) { + path_[newpos] = '/'; + newpos++; + } + } + // Move to next segment + pathpos += slashpos + 1; + } + path_[newpos] = '\0'; + } + + Ch* uri_; // Everything + Ch* base_; // Everything except fragment + Ch* scheme_; // Includes the : + Ch* auth_; // Includes the // + Ch* path_; // Absolute if starts with / + Ch* query_; // Includes the ? + Ch* frag_; // Includes the # + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Uri. +}; + +//! GenericUri for Value (UTF-8, default allocator). +typedef GenericUri Uri; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_URI_H_ diff --git a/external/rapidjson/writer.h b/external/rapidjson/writer.h new file mode 100644 index 0000000..8b38921 --- /dev/null +++ b/external/rapidjson/writer.h @@ -0,0 +1,710 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/clzll.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Writer(Writer&& rhs) : + os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { + rhs.os_ = 0; + } +#endif + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) + { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + Prefix(type); + return EndValue(WriteRawValue(json, length)); + } + + //! Flush the output stream. + /*! + Allows the user to flush the output stream immediately. + */ + void Flush() { + os_->Flush(); + } + + static const size_t kDefaultLevelDepth = 32; + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + GenericStringStream is(json); + while (RAPIDJSON_LIKELY(is.Tell() < length)) { + RAPIDJSON_ASSERT(is.Peek() != '\0'); + if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#elif defined(RAPIDJSON_NEON) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (; p != endAligned; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType len = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + len = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + len = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // RAPIDJSON_NEON + +RAPIDJSON_NAMESPACE_END + +#if defined(_MSC_VER) || defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/external/tbb b/external/tbb new file mode 160000 index 0000000..3e63939 --- /dev/null +++ b/external/tbb @@ -0,0 +1 @@ +Subproject commit 3e639395cac803ac152a8bc05774d8712c69e217 diff --git a/external/termcolor/termcolor.hpp b/external/termcolor/termcolor.hpp new file mode 100644 index 0000000..d94e991 --- /dev/null +++ b/external/termcolor/termcolor.hpp @@ -0,0 +1,939 @@ +//! +//! termcolor +//! ~~~~~~~~~ +//! +//! termcolor is a header-only c++ library for printing colored messages +//! to the terminal. Written just for fun with a help of the Force. +//! +//! :copyright: (c) 2013 by Ihor Kalnytskyi +//! :license: BSD, see LICENSE for details +//! + +#ifndef TERMCOLOR_HPP_ +#define TERMCOLOR_HPP_ + +#include + +// Detect target's platform and set some macros in order to wrap platform +// specific code this library depends on. +#if defined(_WIN32) || defined(_WIN64) +# define TERMCOLOR_TARGET_WINDOWS +#elif defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)) +# define TERMCOLOR_TARGET_POSIX +#endif + +// If implementation has not been explicitly set, try to choose one based on +// target platform. +#if !defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) && !defined(TERMCOLOR_USE_WINDOWS_API) && !defined(TERMCOLOR_USE_NOOP) +# if defined(TERMCOLOR_TARGET_POSIX) +# define TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES +# define TERMCOLOR_AUTODETECTED_IMPLEMENTATION +# elif defined(TERMCOLOR_TARGET_WINDOWS) +# define TERMCOLOR_USE_WINDOWS_API +# define TERMCOLOR_AUTODETECTED_IMPLEMENTATION +# endif +#endif + +// These headers provide isatty()/fileno() functions, which are used for +// testing whether a standard stream refers to the terminal. +#if defined(TERMCOLOR_TARGET_POSIX) +# include +#elif defined(TERMCOLOR_TARGET_WINDOWS) +# include +# include +#endif + + +namespace termcolor +{ + // Forward declaration of the `_internal` namespace. + // All comments are below. + namespace _internal + { + inline int colorize_index(); + inline FILE* get_standard_stream(const std::ostream& stream); + inline FILE* get_standard_stream(const std::wostream& stream); + template + bool is_colorized(std::basic_ostream& stream); + template + bool is_atty(const std::basic_ostream& stream); + + #if defined(TERMCOLOR_TARGET_WINDOWS) + template + void win_change_attributes(std::basic_ostream& stream, int foreground, int background = -1); + #endif + } + + template + std::basic_ostream& colorize(std::basic_ostream& stream) + { + stream.iword(_internal::colorize_index()) = 1L; + return stream; + } + + template + std::basic_ostream& nocolorize(std::basic_ostream& stream) + { + stream.iword(_internal::colorize_index()) = 0L; + return stream; + } + + template + std::basic_ostream& reset(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[00m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, -1); + #endif + } + return stream; + } + + template + std::basic_ostream& bold(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[1m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& dark(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[2m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& italic(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[3m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& underline(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[4m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, COMMON_LVB_UNDERSCORE); + #endif + } + return stream; + } + + template + std::basic_ostream& blink(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[5m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& reverse(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[7m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& concealed(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[8m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& crossed(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[9m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& color(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[38;5;" << +code << "m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& on_color(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[48;5;" << +code << "m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& color(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[38;2;" << +r << ";" << +g << ";" << +b << "m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& on_color(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[48;2;" << +r << ";" << +g << ";" << +b << "m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + #endif + } + return stream; + } + + template + std::basic_ostream& grey(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[30m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + 0 // grey (black) + ); + #endif + } + return stream; + } + + template + std::basic_ostream& red(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[31m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& green(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[32m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_GREEN + ); + #endif + } + return stream; + } + + template + std::basic_ostream& yellow(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[33m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_GREEN | FOREGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& blue(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[34m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE + ); + #endif + } + return stream; + } + + template + std::basic_ostream& magenta(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[35m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& cyan(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[36m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_GREEN + ); + #endif + } + return stream; + } + + template + std::basic_ostream& white(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[37m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED + ); + #endif + } + return stream; + } + + + template + std::basic_ostream& bright_grey(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[90m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + 0 | FOREGROUND_INTENSITY // grey (black) + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_red(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[91m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_RED | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_green(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[92m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_GREEN | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_yellow(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[93m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_blue(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[94m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_magenta(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[95m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_cyan(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[96m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& bright_white(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[97m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, + FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY + ); + #endif + } + return stream; + } + + + template + std::basic_ostream& on_grey(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[40m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + 0 // grey (black) + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_red(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[41m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_green(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[42m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_yellow(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[43m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_blue(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[44m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_BLUE + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_magenta(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[45m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_BLUE | BACKGROUND_RED + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_cyan(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[46m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_BLUE + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_white(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[47m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED + ); + #endif + } + + return stream; + } + + + template + std::basic_ostream& on_bright_grey(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[100m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + 0 | BACKGROUND_INTENSITY // grey (black) + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_red(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[101m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_RED | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_green(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[102m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_yellow(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[103m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_blue(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[104m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_BLUE | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_magenta(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[105m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_cyan(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[106m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY + ); + #endif + } + return stream; + } + + template + std::basic_ostream& on_bright_white(std::basic_ostream& stream) + { + if (_internal::is_colorized(stream)) + { + #if defined(TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES) + stream << "\033[107m"; + #elif defined(TERMCOLOR_USE_WINDOWS_API) + _internal::win_change_attributes(stream, -1, + BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY + ); + #endif + } + + return stream; + } + + + + //! Since C++ hasn't a way to hide something in the header from + //! the outer access, I have to introduce this namespace which + //! is used for internal purpose and should't be access from + //! the user code. + namespace _internal + { + // An index to be used to access a private storage of I/O streams. See + // colorize / nocolorize I/O manipulators for details. Due to the fact + // that static variables ain't shared between translation units, inline + // function with local static variable is used to do the trick and share + // the variable value between translation units. + inline int colorize_index() + { + static int colorize_index = std::ios_base::xalloc(); + return colorize_index; + } + + //! Since C++ hasn't a true way to extract stream handler + //! from the a given `std::ostream` object, I have to write + //! this kind of hack. + inline + FILE* get_standard_stream(const std::ostream& stream) + { + if (&stream == &std::cout) + return stdout; + else if (&stream == &std::cerr || &stream == &std::clog) + return stderr; + + return nullptr; + } + + //! Since C++ hasn't a true way to extract stream handler + //! from the a given `std::wostream` object, I have to write + //! this kind of hack. + inline + FILE* get_standard_stream(const std::wostream& stream) + { + if (&stream == &std::wcout) + return stdout; + else if (&stream == &std::wcerr || &stream == &std::wclog) + return stderr; + + return nullptr; + } + + // Say whether a given stream should be colorized or not. It's always + // true for ATTY streams and may be true for streams marked with + // colorize flag. + template + bool is_colorized(std::basic_ostream& stream) + { + return is_atty(stream) || static_cast(stream.iword(colorize_index())); + } + + //! Test whether a given `std::ostream` object refers to + //! a terminal. + template + bool is_atty(const std::basic_ostream& stream) + { + FILE* std_stream = get_standard_stream(stream); + + // Unfortunately, fileno() ends with segmentation fault + // if invalid file descriptor is passed. So we need to + // handle this case gracefully and assume it's not a tty + // if standard stream is not detected, and 0 is returned. + if (!std_stream) + return false; + + #if defined(TERMCOLOR_TARGET_POSIX) + return ::isatty(fileno(std_stream)); + #elif defined(TERMCOLOR_TARGET_WINDOWS) + return ::_isatty(_fileno(std_stream)); + #else + return false; + #endif + } + + #if defined(TERMCOLOR_TARGET_WINDOWS) + + //! same hack as used in get_standard_stream function, but for Windows with `std::ostream` + inline HANDLE get_terminal_handle(std::ostream& stream) + { + if (&stream == &std::cout) + return GetStdHandle(STD_OUTPUT_HANDLE); + else if (&stream == &std::cerr || &stream == &std::clog) + return GetStdHandle(STD_ERROR_HANDLE); + return nullptr; + } + + //! same hack as used in get_standard_stream function, but for Windows with `std::wostream` + inline HANDLE get_terminal_handle(std::wostream& stream) + { + if (&stream == &std::wcout) + return GetStdHandle(STD_OUTPUT_HANDLE); + else if (&stream == &std::wcerr || &stream == &std::wclog) + return GetStdHandle(STD_ERROR_HANDLE); + return nullptr; + } + + //! Change Windows Terminal colors attribute. If some + //! parameter is `-1` then attribute won't changed. + template + void win_change_attributes(std::basic_ostream& stream, int foreground, int background) + { + // yeah, i know.. it's ugly, it's windows. + static WORD defaultAttributes = 0; + + // Windows doesn't have ANSI escape sequences and so we use special + // API to change Terminal output color. That means we can't + // manipulate colors by means of "std::stringstream" and hence + // should do nothing in this case. + if (!_internal::is_atty(stream)) + return; + + // get terminal handle + HANDLE hTerminal = INVALID_HANDLE_VALUE; + hTerminal = get_terminal_handle(stream); + + // save default terminal attributes if it unsaved + if (!defaultAttributes) + { + CONSOLE_SCREEN_BUFFER_INFO info; + if (!GetConsoleScreenBufferInfo(hTerminal, &info)) + return; + defaultAttributes = info.wAttributes; + } + + // restore all default settings + if (foreground == -1 && background == -1) + { + SetConsoleTextAttribute(hTerminal, defaultAttributes); + return; + } + + // get current settings + CONSOLE_SCREEN_BUFFER_INFO info; + if (!GetConsoleScreenBufferInfo(hTerminal, &info)) + return; + + if (foreground != -1) + { + info.wAttributes &= ~(info.wAttributes & 0x0F); + info.wAttributes |= static_cast(foreground); + } + + if (background != -1) + { + info.wAttributes &= ~(info.wAttributes & 0xF0); + info.wAttributes |= static_cast(background); + } + + SetConsoleTextAttribute(hTerminal, info.wAttributes); + } + #endif // TERMCOLOR_TARGET_WINDOWS + + } // namespace _internal + +} // namespace termcolor + + +#undef TERMCOLOR_TARGET_POSIX +#undef TERMCOLOR_TARGET_WINDOWS + +#if defined(TERMCOLOR_AUTODETECTED_IMPLEMENTATION) +# undef TERMCOLOR_USE_ANSI_ESCAPE_SEQUENCES +# undef TERMCOLOR_USE_WINDOWS_API +#endif + +#endif // TERMCOLOR_HPP_ diff --git a/hash_table/hash_ordered_map_tests.cpp b/hash_table/hash_ordered_map_tests.cpp new file mode 100644 index 0000000..4d7df3f --- /dev/null +++ b/hash_table/hash_ordered_map_tests.cpp @@ -0,0 +1,326 @@ +// +// Created by Adam Escobedo on 4/7/2022. +// + +#include "../CatchTestUtils/catch.hpp" +#include "hash_table.h" +#include +#include +#include + +TEST_CASE("Testing basic constructors and destructor", "[hash_table]") { + SECTION("Testing default constructor") { + hash_table testDummy; + REQUIRE(testDummy.size() == 0); + REQUIRE(testDummy.is_empty() == true); + } +} + +TEST_CASE("Testing hash_table filling and reading methods", "[hash_table]") { + hash_table testDummy; + + SECTION("Testing \"U& hash_table::operator[](const T&)\"") { + testDummy['A'] = 123; + REQUIRE(testDummy['A'] == 123); + REQUIRE(testDummy.size() == 1); + REQUIRE(testDummy.is_empty() == false); + + hash_table homTestString; + homTestString["Adam"] = 123; + REQUIRE(homTestString["Adam"] == 123); + REQUIRE(homTestString.size() == 1); + REQUIRE(homTestString.is_empty() == false); + } + + SECTION("Testing \"hash_table& hash_table::emplace_pair(const T &key, const U &value)\"") { + testDummy.emplace_pair('A', 123); + REQUIRE(testDummy.read_at('A') == 123); + REQUIRE(testDummy.size() == 1); + REQUIRE(testDummy.is_empty() == false); + } + + SECTION("Testing \"U hash_table::read_at(const T &key) const\"") { + testDummy.emplace_pair('A', 123); + REQUIRE(testDummy.read_at('A') == 123); + + CHECK_THROWS(testDummy.read_at('?')); + } + + SECTION("Testing bool hash_table::contains(const T &key) const\"") { + testDummy.emplace_pair('A', 123); + REQUIRE(testDummy.contains('A') == true); + REQUIRE(testDummy.contains('B') == false); + } + + SECTION("Testing \"void hash_table::increase_max_cap()\" by building with \"U& hash_table::operator[](const T&)\"") { + int counter[27]; + for (int &it: counter) { + it = 0; + } + + for (int i = 0; i < 100; ++i) { + char key = (i % 26) + 'A'; + testDummy[key] += i; + counter[key & 31] += i; + } + REQUIRE(testDummy.size() == 26); + REQUIRE(testDummy.is_empty() == false); + + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(testDummy[key] == counter[key & 31]); + REQUIRE(testDummy.read_at(key) == counter[key & 31]); + } + } + + SECTION("Testing \"void hash_table::increase_max_cap()\" by building with \"hash_table& hash_table::emplace_pair(const T &key, const U &value)\"") { + int counter[27]; + for (int &it: counter) { + it = 0; + } + + for (int i = 0; i < 100; ++i) { + char key = (i % 26) + 'A'; + int randNum = rand(); + testDummy.emplace_pair(key, randNum); + counter[key & 31] = randNum; + } + REQUIRE(testDummy.size() == 26); + REQUIRE(testDummy.is_empty() == false); + + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(testDummy[key] == counter[key & 31]); + REQUIRE(testDummy.read_at(key) == counter[key & 31]); + } + } + + SECTION("Testing large file reading via \"hash_table/test_Oedipus-King-of-Thebes.txt\" and comparing STL unordered_maps to HashOrderedMaps") { + std::ifstream inFile; + inFile.open("../hash_table/test_Oedipus-King-of-Thebes.txt"); + if (!inFile.is_open()) { + std::cout + << "Error in Testing large file reading via \"../hash_table/test_Oedipus-King-of-Thebes.txt\" | file could not open" + << std::endl; + REQUIRE(false); + return; + } + + hash_table wordFreqCounterCUSTOM; + std::unordered_map wordFreqCounterSTL; + while (inFile.good()) { + std::string word; + inFile >> word; + wordFreqCounterCUSTOM[word]++; + wordFreqCounterSTL[word]++; + } + inFile.close(); + + REQUIRE(wordFreqCounterCUSTOM.size() == wordFreqCounterSTL.size()); + + for (const auto &it: wordFreqCounterSTL) { + REQUIRE(wordFreqCounterCUSTOM.contains(it.first) == true); + REQUIRE(wordFreqCounterCUSTOM.read_at(it.first) == it.second); + } + + for (const auto &it: wordFreqCounterCUSTOM) { + REQUIRE(it.key != nullptr); + REQUIRE(it.value != nullptr); + } + } +} + +TEST_CASE("Testing hash_table clearing methods", "[hash_table]") { + hash_table testDummy; + + SECTION("Testing \"hash_table &hash_table::clear_value_at(const T &key)\"") { + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + int randNum = rand(); + testDummy.emplace_pair(key, randNum); + } + REQUIRE(testDummy.size() == 26); + + testDummy.clear_value_at('A'); + REQUIRE(testDummy.size() == 25); + + testDummy.clear_value_at('B'); + REQUIRE(testDummy.size() == 24); + + bool error = false; + try { + testDummy.clear_value_at('?'); + } + catch (const std::invalid_argument &e) { + error = true; + } + REQUIRE(error); + + error = false; + try { + testDummy.read_at('A'); + } + catch (const std::invalid_argument &e) { + error = true; + } + REQUIRE(error); + + REQUIRE(testDummy.contains('A') == false); + REQUIRE(testDummy.contains('B') == false); + } + + SECTION("Testing \"hash_table &hash_table::clear()\"") { + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + int randNum = rand(); + testDummy.emplace_pair(key, randNum); + } + REQUIRE(testDummy.size() == 26); + + testDummy.clear(); + REQUIRE(testDummy.size() == 0); + REQUIRE(testDummy.is_empty() == true); + + bool error = false; + try { + testDummy.read_at('A'); + } + catch (const std::invalid_argument &e) { + error = true; + } + REQUIRE(error); + } +} + +TEST_CASE("Testing copy-constructor and assignment operator", "[hash_table]") { + int counter[27]; + for (int &it: counter) { + it = 0; + } + + hash_table testDummy; + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + int randNum = rand(); + testDummy.emplace_pair(key, randNum); + counter[key & 31] = randNum; + } + + SECTION("Testing copy-constructor") { + hash_table homChar(testDummy); + REQUIRE(homChar.size() == 26); + REQUIRE(homChar.is_empty() == false); + + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(homChar.contains(key) == true); + REQUIRE(testDummy.read_at(key) == counter[key & 31]); + REQUIRE(homChar.read_at(key) == counter[key & 31]); + REQUIRE(homChar.read_at(key) == testDummy.read_at(key)); + } + } + + SECTION("Testing assignment operator") { + hash_table homChar; + homChar = testDummy; + REQUIRE(homChar.size() == 26); + REQUIRE(homChar.is_empty() == false); + + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(homChar.contains(key) == true); + REQUIRE(testDummy.read_at(key) == counter[key & 31]); + REQUIRE(homChar.read_at(key) == counter[key & 31]); + REQUIRE(homChar.read_at(key) == testDummy.read_at(key)); + } + } +} + +TEST_CASE("Testing appending-type methods", "[hash_table]") { + hash_table testDummy; + for (int i = 0; + i < 16; ++i) { //fills until and including letter 'O', which of course stands for "OhGodHelpMeINeedAHotGothGF" + char key = i + 'A'; + testDummy.emplace_pair(key, 1); + } + + SECTION("Testing \"hash_table &hash_table::emplace_merge(const hash_table & passedMap)\"") { + hash_table homChar; + homChar.emplace_pair('A', -2); + homChar.emplace_pair('B', 10); + homChar.emplace_pair('Y', -3); + homChar.emplace_pair('Z', -4); + + homChar.emplace_merge(testDummy); + REQUIRE(testDummy.contains('A') == true); + REQUIRE(homChar.contains('A') == true); + REQUIRE(homChar.read_at('A') == -1); + REQUIRE(testDummy.contains('B') == true); + REQUIRE(homChar.contains('B') == true); + REQUIRE(homChar.read_at('B') == 11); + for (int i = 2; i < 16; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(homChar.contains(key) == true); + REQUIRE(homChar.read_at(key) == testDummy.read_at(key)); + } + REQUIRE(testDummy.contains('Y') == false); + REQUIRE(homChar.contains('Y') == true); + REQUIRE(homChar.read_at('Y') == -3); + REQUIRE(testDummy.contains('Z') == false); + REQUIRE(homChar.contains('Z') == true); + REQUIRE(homChar.read_at('Z') == -4); + } + + SECTION("Testing \"hash_table &hash_table::emplace_mask(const hash_table & passedMap)\"") { + hash_table homChar; + homChar.emplace_pair('A', -2); + homChar.emplace_pair('B', 10); + homChar.emplace_pair('Y', -3); + homChar.emplace_pair('Z', -4); + + homChar.emplace_mask(testDummy); + REQUIRE(testDummy.contains('A') == true); + REQUIRE(homChar.contains('A') == true); + REQUIRE(homChar.read_at('A') == 1); + REQUIRE(testDummy.contains('B') == true); + REQUIRE(homChar.contains('B') == true); + REQUIRE(homChar.read_at('B') == 1); + for (int i = 2; i < 16; ++i) { + char key = i + 'A'; + REQUIRE(testDummy.contains(key) == true); + REQUIRE(homChar.contains(key) == true); + REQUIRE(homChar.read_at(key) == testDummy.read_at(key)); + } + REQUIRE(testDummy.contains('Y') == false); + REQUIRE(homChar.contains('Y') == true); + REQUIRE(homChar.read_at('Y') == -3); + REQUIRE(testDummy.contains('Z') == false); + REQUIRE(homChar.contains('Z') == true); + REQUIRE(homChar.read_at('Z') == -4); + } +} + +TEST_CASE("Testing hash_table iterator class", "[hash_map]") { + hash_table testDummy; + SECTION("Testing a hash_table of greater size") { + for (int i = 0; i < 26; ++i) { + char key = i + 'A'; + int randNum = rand(); + testDummy.emplace_pair(key, randNum); + } + REQUIRE(testDummy.size() == 26); + + int counter = 0; + for (auto &it: testDummy) { + REQUIRE(it.key != nullptr); + counter++; + } + REQUIRE(testDummy.size() == counter); + REQUIRE(testDummy.size() == 26); + } +} \ No newline at end of file diff --git a/hash_table/hash_table.h b/hash_table/hash_table.h new file mode 100644 index 0000000..f6ebd59 --- /dev/null +++ b/hash_table/hash_table.h @@ -0,0 +1,443 @@ +// +// Created by Adam Escobedo on 4/7/2022. +// + +#ifndef INC_22S_FINAL_PROJ_HASH_TABLE_H +#define INC_22S_FINAL_PROJ_HASH_TABLE_H + +#include +#include +#include + +template +class hash_table { +private: + struct HashPair { //used to store the hash value of each key, and the value of each key + HashPair() = default; + + HashPair(unsigned int hashNum, const T &pData, const U &pValue) { + hash = hashNum; + key = new T(pData); + value = new U(pValue); + } + + HashPair(const HashPair &toCopy) { + hash = toCopy.hash; + if (toCopy.key != nullptr) { key = new T(*toCopy.key); } + if (toCopy.value != nullptr) { value = new U(*toCopy.value); } + } + + HashPair &operator=(const HashPair &toAssign) { + if (this == &toAssign) { return *this; } + hash = toAssign.hash; + + delete key; + key = nullptr; + if (toAssign.key != nullptr) { key = new T(*toAssign.key); } + + delete value; + value = nullptr; + if (toAssign.value != nullptr) { value = new U(*toAssign.value); } + + return *this; + } + + ~HashPair() { + delete key; + delete value; + } + + unsigned int hash = 0; + T *key = nullptr; + U *value = nullptr; + }; + + struct Iterator { + Iterator(HashPair *pPtr, int pI, int pMax) { + i = pI; + dataPtr = pPtr; + max = pMax; + } + + HashPair &operator*() const { + return *dataPtr; + } + + Iterator &operator++() { + ++dataPtr; + ++i; + while (i < max && dataPtr->key == nullptr) { + ++dataPtr; + ++i; + } + return *this; + } + + Iterator operator++(int) { + Iterator temp = *this; + ++dataPtr; + ++i; + while (i < max && dataPtr->key == nullptr) { + ++dataPtr; + ++i; + } + return temp; + } + + friend bool operator==(const Iterator &a, const Iterator &b) { + return (a.dataPtr == b.dataPtr); + }; + + friend bool operator!=(const Iterator &a, const Iterator &b) { + return (a.dataPtr != b.dataPtr); + }; + + HashPair *dataPtr; + int i = 0; + int max; + }; + + //used to increase the maximum amount of elements *this can contain, and creates the next "clean_index" to edit based on the passed "hashIndex" + int increase_max_cap(unsigned int hashIndex); + + float read_load_factor() { return float(ele_count) / float(max_cap); } + + inline static unsigned int hasher(const T &pKey); + + HashPair *data = nullptr; //holds key for *this + int ele_count = 0; //element counter, used for size metric + int max_cap; //used to document the maximum amount of elements "key" can hold, and documents the largest index possible of "key" + unsigned int (*hash_func)(const T &) = &hasher; + +public: + + Iterator begin() { + HashPair *dataPtr = data; + int i = 0; + while (i < max_cap && dataPtr->key == nullptr) { + ++dataPtr; + ++i; + } + return Iterator(dataPtr, i, max_cap); + } + + Iterator end() { return Iterator(data + max_cap, 0, 0); } + + hash_table(); + + hash_table(const hash_table &); //copy-constructor + + //creates a hash_table that has an initial "max_cap" equal to "capReq" (capacity-requirement) + explicit hash_table(int capReq); + + hash_table &operator=(const hash_table &); //assignment operator overload + + //resets all *this contents/key + hash_table &clear(); + + hash_table &clear_value_at(const T &pKey); //sets the value at "pKey" to nullptr + + int size() const { return ele_count; } + + bool is_empty() const { return ele_count == 0; } + + //places the pKey/pValue pair passed into *this, if the pValue at "pKey" is already defined, then the pValue at "pKey" is over-written and replaced + hash_table &emplace_pair(const T &pKey, const U &pValue); + + //returns the values at "pKey" by reference; if the value at "pKey" has not been initialized, then the value at "pKey" will be initialized and "ele_count" will be incremented + U &operator[](const T &pKey); + + //returns a copy of the value at "pKey", is const because changes to the contents returned are not reflected in *this + U read_at(const T &pKey) const; + + bool contains(const T &pKey) const; //returns true if the "pKey" is found within *this, else returns false + + hash_table &emplace_merge(const hash_table &pMap); + + hash_table &emplace_mask(const hash_table &pMap); + + hash_table &set_hash_function(unsigned int (*custom_hash_func)(const T &)) { hash_func = custom_hash_func; } + + ~hash_table() { delete[] data; } //destructor +}; + +template +hash_table::hash_table() { + data = new HashPair[500]; + max_cap = 500; +} + +template +hash_table::hash_table(int capReq) { + data = new HashPair[capReq]; + max_cap = capReq; +} + +template +hash_table &hash_table::emplace_pair(const T &pKey, const U &pValue) { + const unsigned int index = hash_func(pKey); + int index_clean = index % max_cap; + HashPair toInsert(index, pKey, pValue); + + while (data[index_clean].key != nullptr) { + if (data[index_clean].hash == index) { + --ele_count; + break; + } + ++index_clean; + index_clean %= max_cap; + } + ++ele_count; + + if (int(read_load_factor() * 100) > 75) { + index_clean = increase_max_cap(index); + } + + data[index_clean] = toInsert; + + return *this; +} + +template +U &hash_table::operator[](const T &pKey) { + const unsigned int index = hash_func(pKey); + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + data[index_clean].hash = index; + + if (data[index_clean].key == nullptr) { + data[index_clean].key = new T(); + ++ele_count; + } + *data[index_clean].key = pKey; + + if (data[index_clean].value == nullptr) + data[index_clean].value = new U(); + + if (int(read_load_factor() * 100) > 75) { + index_clean = increase_max_cap(index); + } + + return *data[index_clean].value; +} + +template +U hash_table::read_at(const T &pKey) const { + unsigned int index = hash_func(pKey); + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + if (data[index_clean].key == nullptr) { + throw std::invalid_argument( + "Error in \"U hash_table::read_at(const T &pKey) const\" | pKey not found"); + } + + return *data[index_clean].value; +} + +template +//pass and return index values because all index values are going to be changed due to their dependence on "max_cap" +int hash_table::increase_max_cap(unsigned int hashIndex) { + int mcCopy = max_cap; + max_cap *= 10; + auto *dataCopy = new HashPair[max_cap]; + for (int i = 0; i < mcCopy; ++i) { + if (data[i].hash == 0) + continue; + const unsigned int index = data[i].hash; + int index_clean = index % max_cap; + HashPair toInsert(index, *data[i].key, *data[i].value); + + while (dataCopy[index_clean].key != nullptr) { + if (dataCopy[index_clean].hash == index) { + break; + } + ++index_clean; + index_clean %= max_cap; + } + dataCopy[index_clean] = toInsert; + } + delete[] data; + data = dataCopy; + + //now that "key" has been resized, we can compute the "clean_index" value based off of the "passedIndex" and the new "max_cap" value + int index_clean = hashIndex % max_cap; + while (data[index_clean].key != nullptr) { + if (data[index_clean].hash == hashIndex) { + break; + } + ++index_clean; + index_clean %= max_cap; + } + return index_clean; +} + + +template +hash_table &hash_table::clear_value_at(const T &pKey) { + unsigned int index = hash_func(pKey); + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + if (data[index_clean].key == nullptr) { + throw std::invalid_argument( + "Error in \"hash_table &hash_table::clear_value_at(const T &pKey)\" | passed key was not found."); + } + + data[index_clean].hash = 0; + + delete data[index_clean].key; + data[index_clean].key = nullptr; + + delete data[index_clean].value; + data[index_clean].value = nullptr; + + --ele_count; + + return *this; +} + +template +hash_table::hash_table(const hash_table &toCopy) { + ele_count = toCopy.ele_count; + max_cap = toCopy.max_cap; + data = new HashPair[max_cap]; + for (int i = 0; i < max_cap; ++i) { + if (toCopy.data[i].value == nullptr) + continue; + data[i] = toCopy.data[i]; + } +} + +template +hash_table &hash_table::operator=(const hash_table &toAssign) { + if (this == &toAssign) + return *this; + + ele_count = toAssign.ele_count; + max_cap = toAssign.max_cap; + delete[] data; + data = new HashPair[max_cap]; + for (int i = 0; i < max_cap; ++i) { + if (toAssign.data[i].value == nullptr) + continue; + data[i] = toAssign.data[i]; + } + + return *this; +} + +template +bool hash_table::contains(const T &pKey) const { + unsigned int index = hash_func(pKey); + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + if (data[index_clean].key == nullptr) { + return false; + } + + return true; +} + +template +hash_table &hash_table::emplace_merge(const hash_table &pMap) { + for (int i = 0; i < pMap.max_cap; ++i) { + if (pMap.data[i].hash == 0) + continue; + + const unsigned int index = pMap.data[i].hash; + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + data[index_clean].hash = index; + + if (data[index_clean].key == nullptr) { + data[index_clean].key = new T(); + *data[index_clean].key = *pMap.data[i].key; + ++ele_count; + } else + *data[index_clean].key = *pMap.data[i].key; + + if (data[index_clean].value == nullptr) { + data[index_clean].value = new U(); + *data[index_clean].value = *pMap.data[i].value; + } else { + *data[index_clean].value += *pMap.data[i].value; //adds the two "value"s together + } + + if (int(read_load_factor() * 100) > 75) { + increase_max_cap(index); + } + } + + return *this; +} + +template +hash_table &hash_table::emplace_mask(const hash_table &pMap) { + for (int i = 0; i < pMap.max_cap; ++i) { + if (pMap.data[i].value == nullptr) + continue; + + const unsigned int index = pMap.data[i].hash; + int index_clean = index % max_cap; + while (data[index_clean].key != nullptr && data[index_clean].hash != index) { + ++index_clean; + index_clean %= max_cap; + } + + data[index_clean].hash = index; + + if (data[index_clean].key == nullptr) { + data[index_clean].key = new T(); + ++ele_count; + } + + if (data[index_clean].value == nullptr) { + data[index_clean].value = new U(); + } + + *data[index_clean].key = *pMap.data[i].key; //overwrites *this' version of "value" with the "pMap" version of "value" + *data[index_clean].value = *pMap.data[i].value; + + if (int(read_load_factor() * 100) > 75) { + increase_max_cap(index); + } + } + + return *this; +} + +template +hash_table &hash_table::clear() { + delete[] data; + data = new HashPair[500]; + max_cap = 500; + ele_count = 0; + return *this; +} + +template +unsigned int hash_table::hasher(const T &pKey) { + std::hash hashObj; + return hashObj(pKey); +} + +#endif //INC_22S_FINAL_PROJ_HASH_TABLE_H diff --git a/hash_table/test_Oedipus-King-of-Thebes.txt b/hash_table/test_Oedipus-King-of-Thebes.txt new file mode 100644 index 0000000..ff634bd --- /dev/null +++ b/hash_table/test_Oedipus-King-of-Thebes.txt @@ -0,0 +1,1351 @@ +<0> +OEDIPUS, KING OF THEBES +BY SOPHOCLES +TRANSLATED INTO ENGLISH RHYMING VERSE WITH EXPLANATORY NOTES BY GILBERT MURRAY LL.D., +D.Litt., F.B.A. REGIUS +<1> +CHARACTERS IN THE PLAY: + +Oedipus, supposed son of Polybus, King of Corinth; now elected King of Thebes. + +Jocasta, Queen of Thebes; widow of Laïus, the late King, and now wife to +Oedipus: + +Creon, a Prince of Thebes, brother to +Jocasta: + +Tiresias, an old blind seer. + +Priest of Zeus. + +A Stranger from Corinth. + +A Shepherd of King Laïus. + +A Messenger from the Palace. + +Chorus of the Elders of Thebes. + +A Crowd of Suppliants, men, women, and children. + + +The following do not appear in the play but are frequently mentioned:— + +Laïus (pronounced as three syllables, Lá-i-us), the last King of Thebes before +Oedipus: + +Cadmus, the founder of Thebes; son of Agênor, King of Sidon. + +Polybus and Meropê, King and Queen of Corinth, supposed to be the father and mother +of +Oedipus: + +Apollo, the God specially presiding over the oracle of Delphi and the island Delos: +he is also called Phoebus, the pure; Loxias, supposed to mean "He of the Crooked +Words"; and Lykeios, supposed to mean "Wolf-God." He is also the great Averter of +Evil, and has names from the cries "I-ê" (pronounced "Ee-ay") and "Paian," cries +for healing or for the frightening away of evil influences. + +Kithairon, a mass of wild mountain south-west of Thebes. +<2> +ARGUMENT + +While Thebes was under the rule of Laïus and Jocasta there appeared a strange and +monstrous creature, "the riddling Sphinx," "the She-Wolf of the woven song," who +in some unexplained way sang riddles of death and slew the people of Thebes. Laïus +went to ask aid of the oracle of Delphi, but was slain mysteriously on the road. +Soon afterwards there came to Thebes a young Prince of Corinth, Oedipus, who had +left his home and was wandering. He faced the Sphinx and read her riddle, whereupon +she flung herself from her rock and died. The throne being vacant was offered to +Oedipus, and with it the hand of the Queen, +Jocasta: + +Some ten or twelve years afterwards a pestilence has fallen on Thebes. At this point +the play begins. + +The date of the first production of the play is not known, but was probably about +the year 425 B.C. +<3> +OEDIPUS, KING OF THEBES + +Scene.—Before the Palace of Oedipus at Thebes. A crowd of suppliants of all ages +are waiting by the altar in front and on the steps of the Palace; among them the +Priest of Zeus. As the Palace door opens and Oedipus comes out all the suppliants +with a cry move towards him in attitudes of prayer, holding out their olive branches, +and then become still again as he speaks. +Oedipus: My children, fruit of Cadmus' ancient tree New springing, wherefore thus +with bended knee Press ye upon us, laden all with wreaths And suppliant branches? +And the city breathes Heavy with incense, heavy with dim prayer And shrieks to affright +the Slayer.—Children, care For this so moves me, I have scorned withal Message +or writing: seeing 'tis I ye call, 'Tis I am come, world-honoured Oedipus. Old Man, +do thou declare—the rest have thus Their champion—in what mood stand ye so still, +In dread or sure hope? Know ye not, my will Is yours for aid 'gainst all? Stern were +indeed The heart that felt not for so dire a need. vv. 15-39 +<4> +Priest: O Oedipus, who holdest in thy hand My city, thou canst see what ages stand +At these thine altars; some whose little wing Scarce flieth yet, and some with long +living O'erburdened; priests, as I of Zeus am priest, And chosen youths: and wailing +hath not ceased Of thousands in the market-place, and by Athena's two-fold temples +and the dry Ash of Ismênus' portent-breathing shore. For all our ship, thou see'st, +is weak and sore Shaken with storms, and no more lighteneth Her head above the waves +whose trough is death. She wasteth in the fruitless buds of earth, In parchèd herds +and travail without birth Of dying women: yea, and midst of it A burning and a loathly +god hath lit Sudden, and sweeps our land, this Plague of power; Till Cadmus' house +grows empty, hour by hour, And Hell's house rich with steam of tears and blood. O +King, not God indeed nor peer to God We deem thee, that we kneel before thine hearth, +Children and old men, praying; but of earth A thing consummate by thy star confessed +Thou walkest and by converse with the blest; Who came to Thebes so swift, and swept +away The Sphinx's song, the tribute of dismay, That all were bowed beneath, and made +us free. A stranger, thou, naught knowing more than we, Nor taught of any man, but +by God's breath Filled, thou didst raise our life. So the world saith; So we say. +vv. 40-69 +<5> +Therefore now, O Lord and Chief, We come to thee again; we lay our grief On thy head, +if thou find us not some aid. Perchance thou hast heard Gods talking in the shade +Of night, or eke some man: to him that knows, Men say, each chance that falls, each +wind that blows Hath life, when he seeks counsel. Up, O chief Of men, and lift thy +city from its grief; Face thine own peril! All our land doth hold Thee still our +saviour, for that help of old: Shall they that tell of thee hereafter tell "By him +was Thebes raised up, and after fell!" Nay, lift us till we slip no more. Oh, let +That bird of old that made us fortunate Wing back; be thou our Oedipus again. And +let thy kingdom be a land of men, Not emptiness. Walls, towers, and ships, they all +Are nothing with no men to keep the wall. +Oedipus: My poor, poor children! Surely long ago I have read your trouble. Stricken, +well I know, Ye all are, stricken sore: yet verily Not one so stricken to the heart +as I. Your grief, it cometh to each man apart For his own loss, none other's; but +this heart For thee and me and all of us doth weep. Wherefore it is not to one sunk +in sleep Ye come with waking. Many tears these days For your sake I have wept, and +many ways Have wandered on the beating wings of thought. And, finding but one hope, +that I have sought vv. 70-86 +<6> +And followed. I have sent Menoikeus' son, Creon, my own wife's brother, forth alone +To Apollo's House in Delphi, there to ask What word, what deed of mine, what bitter +task, May save my city. And the lapse of days Reckoned, I can but marvel what delays +His journey. 'Tis beyond all thought that thus He comes not, beyond need. But when +he does, Then call me false and traitor, if I flee Back from whatever task God sheweth +me. +Priest: At point of time thou speakest. Mark the cheer Yonder. Is that not Creon +drawing near? +[They all crowd to gaze where Creon is approaching in the distance.] +Oedipus: O Lord Apollo, help! And be the star That guides him joyous as his seemings +are! +Priest: Oh! surely joyous! How else should he bear That fruited laurel wreathed about +his hair? +Oedipus: We soon shall know.—'Tis not too far for one Clear-voiced. (Shouting) +Ho, brother! Prince! Menoikeus' son, What message from the God? vv. 87-99 +<7> +Creon (from a distance): Message of joy! Enter Creon I tell thee, what is now our +worst annoy, If the right deed be done, shall turn to good. [The crowd, which has +been full of excited hope, falls to doubt and disappointment.] +Oedipus: Nay, but what is the message? For my blood Runs neither hot nor cold for +words like those. +Creon: Shall I speak now, with all these pressing close, Or pass within?—To me +both ways are fair. +Oedipus: Speak forth to all! The grief that these men bear Is more than any fear +for mine own death. +Creon: I speak then what I heard from God.—Thus saith Phoebus, our Lord and Seer, +in clear command. An unclean thing there is, hid in our land, Eating the soil thereof: +this ye shall cast Out, and not foster till all help be past. +Oedipus: How cast it out? What was the evil deed? vv. 100-113 +<8> +Creon: Hunt the men out from Thebes, or make them bleed Who slew. For blood it is +that stirs to-day. +Oedipus: Who was the man they killed? Doth Phoebus say? +Creon: O King, there was of old King Laïus In Thebes, ere thou didst come to pilot +us. +Oedipus: I know: not that I ever saw his face. +Creon: 'Twas he. And Loxias now bids us trace And smite the unknown workers of his +fall. +Oedipus: Where in God's earth are they? Or how withal Find the blurred trail of such +an ancient stain? +Creon: In Thebes, he said.—That which men seek amain They find. 'Tis things forgotten +that go by. +Oedipus: And where did Laïus meet them? Did he die In Thebes, or in the hills, or +some far land? vv. 114-127 +<9> +Creon: To ask God's will in Delphi he had planned His journey. Started and returned +no more. +Oedipus: And came there nothing back? No message, nor None of his company, that ye +might hear? +Creon: They all were slain, save one man; blind with fear He came, remembering naught—or +almost naught. +Oedipus: And what was that? One thing has often brought Others, could we but catch +one little clue. +Creon: 'Twas not one man, 'twas robbers—that he knew— Who barred the road and +slew him: a great band. +Oedipus: Robbers?... What robber, save the work was planned By treason here, would +dare a risk so plain? +Creon: So some men thought. But Laïus lay slain, And none to avenge him in his evil +day. vv. 128-148 +<10> +Oedipus: And what strange mischief, when your master lay Thus fallen, held you back +from search and deed? +Creon: The dark-songed Sphinx was here. We had no heed Of distant sorrows, having +death so near. +Oedipus: It falls on me then. I will search and clear This darkness.—Well hath +Phoebus done, and thou Too, to recall that dead king, even now, And with you for +the right I also stand, To obey the God and succour this dear land. Nor is it as +for one that touches me Far off; 'tis for mine own sake I must see This sin cast +out. Whoe'er it was that slew Laïus, the same wild hand may seek me too: And caring +thus for Laïus, is but care For mine own blood.—Up! Leave this altar-stair, Children. +Take from it every suppliant bough. Then call the folk of Thebes. Say, 'tis my vow +To uphold them to the end. So God shall crown Our greatness, or for ever cast us +down. [He goes in to the Palace.] +Priest: My children, rise.—The King most lovingly Hath promised all we came for. +And may He vv. 149-161 +<11> + Who sent this answer, Phoebus, come confessed Helper to Thebes, and strong to stay +the pest. [The suppliants gather up their boughs and stand at the side. The chorus +of Theban elders enter.] +Chorus: [They speak of the Oracle which they have not yet heard, and cry to Apollo +by his special cry "I-ê."] A Voice, a Voice, that is borne on the Holy Way! What +art thou, O Heavenly One, O Word of the Houses of Gold? Thebes is bright with thee, +and my heart it leapeth; yet is it cold, And my spirit faints as I pray. I-ê! I-ê! +What task, O Affrighter of Evil, what task shall thy people essay? One new as our +new-come affliction, Or an old toil returned with the years? Unveil thee, thou dread +benediction, Hope's daughter and Fear's. [They pray to Athena, Artemis, and Apollo.] +Zeus-Child that knowest not death, to thee I pray, O Pallas; next to thy Sister, +who calleth Thebes her own, Artemis, named of Fair Voices, who sitteth her orbèd +throne In the throng of the market way: vv. 162-189 +<12> + And I-ê! I-ê! Apollo, the Pure, the Far-smiter; O Three that keep evil away, If +of old for our city's desire, When the death-cloud hung close to her brow, Ye have +banished the wound and the fire, Oh! come to us now! [They tell of the Pestilence.] +Wounds beyond telling; my people sick unto death; And where is the counsellor, where +is the sword of thought? And Holy Earth in her increase perisheth: The child dies +and the mother awaketh not. I-ê! I-ê! We have seen them, one on another, gone as +a bird is gone, Souls that are flame; yea, higher, Swifter they pass than fire, To +the rocks of the dying Sun. [They end by a prayer to Athena] Their city wasteth +unnumbered; their children lie Where death hath cast them, unpitied, unwept upon. +The altars stand, as in seas of storm a high Rock standeth, and wives and mothers +grey thereon Weep, weep and pray. Lo, joy-cries to fright the Destroyer; a flash +in the dark they rise, Then die by the sobs overladen. Send help, O heaven-born Maiden, +Let us look on the light of her eyes! vv. 190-217 +<13> +[To Zeus, that he drive out the Slayer] And Ares, the abhorred Slayer, who bears +no sword, But shrieking, wrapped in fire, stands over me, Make that he turn, yea, +fly Broken, wind-wasted, high Down the vexed hollow of the Vaster Sea; Or back to +his own Thrace, To harbour shelterless. Where Night hath spared, he bringeth end +by day. Him, Him, O thou whose hand Beareth the lightning brand, O Father Zeus, now +with thy thunder, slay and slay! [To Apollo, Artemis, and Dionysus] Where is thy +gold-strung bow, O Wolf-god, where the flow Of living shafts unconquered, from all +ills Our helpers? Where the white Spears of thy Sister's light, Far-flashing as she +walks the wolf-wild hills? And thou, O Golden-crown, Theban and named our own, O +Wine-gleam, Voice of Joy, for ever more Ringed with thy Maenads white, Bacchus, draw +near and smite, Smite with thy glad-eyed flame the God whom Gods abhor. [During the +last lines Oedipus has come out from the Palace] +Oedipus: Thou prayest: but my words if thou wilt hear And bow thee to their judgement, +strength is near vv. 218-245 +<14> +For help, and a great lightening of ill. Thereof I come to speak, a stranger still +To all this tale, a stranger to the deed: (Else, save that I were clueless, little +need Had I to cast my net so wide and far:) Howbeit, I, being now as all ye are, +A Theban, to all Thebans high and low Do make proclaim: if any here doth know By +what man's hand died Laïus, your King, Labdacus' son, I charge him that he bring +To me his knowledge. Let him feel no fear If on a townsman's body he must clear Our +guilt: the man shall suffer no great ill, But pass from Thebes, and live where else +he will. [No answer.] Is it some alien from an alien shore Ye know to have done the +deed, screen him no more! Good guerdon waits you now and a King's love Hereafter. +Hah! If still ye will not move But, fearing for yourselves or some near friend, Reject +my charge, then hearken to what end Ye drive me.—If in this place men there be +Who know and speak not, lo, I make decree That, while in Thebes I bear the diadem, +No man shall greet, no man shall shelter them, Nor give them water in their thirst, +nor share In sacrifice nor shrift nor dying prayer, But thrust them from our doors, +the thing they hide Being this land's curse. Thus hath the God replied This day to +me from Delphi, and my sword I draw thus for the dead and for God's word. vv. 246-273 +<15> +And lastly for the murderer, be it one Hiding alone or more in unison, I speak on +him this curse: even as his soul Is foul within him let his days be foul, And life +unfriended grind him till he die. More: if he ever tread my hearth and I Know it, +be every curse upon my head That I have spoke this day. All I have said I charge +ye strictly to fulfil and make Perfect, for my sake, for Apollo's sake, And this +land's sake, deserted of her fruit And cast out from her gods. Nay, were all mute +At Delphi, still 'twere strange to leave the thing Unfollowed, when a true man and +a King Lay murdered. All should search. But I, as now Our fortunes fall—his crown +is on my brow, His wife lies in my arms, and common fate, Had but his issue been +more fortunate, Might well have joined our children—since this red Chance hath +so stamped its heel on Laïus' head, I am his champion left, and, as I would For +mine own father, choose for ill or good This quest, to find the man who slew of yore +Labdacus' son, the son of Polydore, Son of great Cadmus whom Agenor old Begat, of +Thebes first master. And, behold, For them that aid me not, I pray no root Nor seed +in earth may bear them corn nor fruit, No wife bear children, but this present curse +Cleave to them close and other woes yet worse. Enough: ye other people of the land, +vv. 274-289 +<16> + Whose will is one with mine, may Justice stand Your helper, and all gods for evermore. +[The crowd disperses] +Leader: O King, even while thy curse yet hovers o'er My head, I answer thee. I slew him not, Nor can +I shew the slayer. But, God wot, If Phoebus sends this charge, let Phoebus read Its meaning and reveal who did the deed. +Oedipus: Aye, that were just, if of his grace he would Reveal it. How shall man compel +his God? +Leader: Second to that, methinks, 'twould help us most ... +Oedipus: Though it be third, speak! Nothing should be lost. +Leader: To our High Seer +on earth vision is given Most like to that High Phoebus hath in heaven. Ask of Tiresias: +he could tell thee true. +Oedipus: That also have I thought for. Aye, and two Heralds have sent ere now. 'Twas +Creon set Me on.—I marvel that he comes not yet. vv. 290-301 +<17> +Leader: Our other clues are weak, old signs and far. +Oedipus: What signs? I needs must question all that are. +Leader: Some travellers slew him, the tale used to be. +Oedipus: The tale, yes: but the witness, where is he? +Leader: The man hath heard thy curses. If he knows The taste of fear, he will not long stay close. +Oedipus: He fear my words, who never feared the deed? +Leader: Well, there is one shall find him.—See, they lead Hither our Lord Tiresias, in whose mind All truth +is born, alone of human kind. Enter Tiresias led by a young disciple. He is an old +blind man in a prophet's robe, dark, unkempt and sinister in appearance. +Oedipus: Tiresias, thou whose mind divineth well All Truth, the spoken and the unspeakable, +vv. 302-321 +<18> + The things of heaven and them that walk the earth; Our city ... thou canst see, +for all thy dearth Of outward eyes, what clouds are over her. In which, O gracious +Lord, no minister Of help, no champion, can we find at all Save thee. For Phoebus—thou +hast heard withal His message—to our envoy hath decreed One only way of help in +this great need: To find and smite with death or banishing, Him who smote Laïus, +our ancient King. Oh, grudge us nothing! Question every cry Of birds, and all roads +else of prophecy Thou knowest. Save our city: save thine own Greatness: save me; +save all that yet doth groan Under the dead man's wrong! Lo, in thy hand We lay us. +And, methinks, no work so grand Hath man yet compassed, as, with all he can Of chance +or power, to help his fellow man. +Tiresias (to himself): Ah me! A fearful thing is knowledge, when to know Helpeth +no end. I knew this long ago, But crushed it dead. Else had I never come. +Oedipus: What means this? Comest thou so deep in gloom? +Tiresias: Let me go back! Thy work shall weigh on thee The less, if thou consent, +and mine on me. vv. 322-336 +<19> +Oedipus: Prophet, this is not lawful; nay, nor kind To Thebes, who feeds thee, thus +to veil thy mind. +Tiresias: 'Tis that I like not thy mind, nor the way It goeth. Therefore, lest I +also stray.... [He moves to go off. Oedipus bars his road.] +Oedipus: Thou shalt not, knowing, turn and leave us! See, We all implore thee, all, +on bended knee. +Tiresias: All without light!—And never light shall shine On this dark evil that +is mine ... and thine. +Oedipus: What wilt thou? Know and speak not? In my need Be false to me, and let thy +city bleed? +Tiresias: I will not wound myself nor thee. Why seek To trap and question me? I will +not speak. +Oedipus: Thou devil! [Movement of Leader to check him.] Nay; the wrath of any stone +Would rise at him. It lies with thee to have done And speak. Is there no melting +in thine eyes! vv. 337-351 +<20> +Tiresias: Naught lies with me! With thee, with thee there lies, I warrant, what thou +ne'er hast seen nor guessed. Oedipus (to Leader, who tries to calm him.) How can +I hear such talk?—he maketh jest Of the land's woe—and keep mine anger dumb? +Tiresias: Howe'er I hold it back, 'twill come, 'twill come. +Oedipus: The more shouldst thou declare it to thy King. +Tiresias: I speak no more. For thee, if passioning Doth comfort thee, on, passion +to thy fill! [He moves to go.] +Oedipus: 'Fore God, I am in wrath; and speak I will, Nor stint what I see clear. +'Twas thou, 'twas thou, Didst plan this murder; aye, and, save the blow, Wrought +it.—I know thou art blind; else I could swear Thou, and thou only, art the murderer. +Tiresias (returning): So?—I command thee by thine own word's power, To stand accurst, +and never from this hour vv. 352-363 +<21> + Speak word to me, nor yet to these who ring Thy throne. Thou art thyself the unclean +thing. +Oedipus: Thou front of brass, to fling out injury So wild! Dost think to bate me +and go free? +Tiresias: I am free. The strong truth is in this heart. +Oedipus: What prompted thee? I swear 'twas not thine art. +Tiresias: 'Twas thou. I spoke not, save for thy command. +Oedipus: Spoke what? What was it? Let me understand. +Tiresias: Dost tempt me? Were my words before not plain! +Oedipus: Scarce thy full meaning. Speak the words again. +Tiresias: Thou seek'st this man of blood: Thyself art he. +Oedipus: 'Twill cost thee dear, twice to have stabbed at me! vv. 364-377 +<22> +Tiresias: Shall I say more, to see thee rage again? +Oedipus: Oh, take thy fill of speech: 'twill all be vain. +Tiresias: Thou livest with those near to thee in shame Most deadly, seeing not thyself +nor them. +Oedipus: Thou think'st 'twill help thee, thus to speak and speak? +Tiresias: Surely, until the strength of Truth be weak. +Oedipus: 'Tis weak to none save thee. Thou hast no part In truth, thou blind man, +blind eyes, ears and heart. +Tiresias: More blind, more sad thy words of scorn, which none Who hears but shall +cast back on thee: soon, soon. +Oedipus: Thou spawn of Night, not I nor any free And seeing man would hurt a thing +like thee. +Tiresias: God is enough.—'Tis not my doom to fall By thee. He knows and shall accomplish +all. vv. 378-402 +<23> +Oedipus (with a flash of discovery): Ha! Creon!—Is it his or thine, this plot? +Tiresias: 'Tis thyself hates thee. Creon hates thee not. +Oedipus: O wealth and majesty, O conquering skill That carved life's rebel pathways +to my will, What is your heart but bitterness, if now For this poor crown Thebes +bound upon my brow, A gift, a thing I sought not—for this crown Creon the stern +and true, Creon mine own Comrade, comes creeping in the dark to ban And slay me; +sending first this magic-man And schemer, this false beggar-priest, whose eye Is +bright for gold and blind for prophecy? Speak, thou. When hast thou ever shown thee +strong For aid? The She-Wolf of the woven song Came, and thy art could find no word, +no breath, To save thy people from her riddling death. 'Twas scarce a secret, that, +for common men To unravel. There was need of Seer-craft then. And thou hadst none +to show. No fowl, no flame, No God revealed it thee. 'Twas I that came, Rude Oedipus, +unlearned in wizard's lore, And read her secret, and she spoke no more. Whom now +thou thinkest to hunt out, and stand Foremost in honour at King Creon's hand. I think +ye will be sorry, thou and he That shares thy sin-hunt. Thou dost look to me vv. +403-424 +<24> + An old man; else, I swear this day should bring On thee the death thou plottest +for thy King. +Leader: Lord Oedipus, these be but words of wrath, All thou hast spoke and all the +Prophet hath. Which skills not. We must join, for ill or well, In search how best +to obey God's oracle. +Tiresias: King though thou art, thou needs must bear the right Of equal answer. Even +in me is might For thus much, seeing I live no thrall of thine, But Lord Apollo's; +neither do I sign Where Creon bids me. I am blind, and thou Hast mocked my blindness. +Yea, I will speak now. Eyes hast thou, but thy deeds thou canst not see Nor where +thou art, nor what things dwell with thee. Whence art thou born? Thou know'st not; +and unknown, On quick and dead, on all that were thine own, Thou hast wrought hate. +For that across thy path Rising, a mother's and a father's wrath, Two-handed, shod +with fire, from the haunts of men Shall scourge thee, in thine eyes now light, but +then Darkness. Aye, shriek! What harbour of the sea, What wild Kithairon shall not +cry to thee In answer, when thou hear'st what bridal song, What wind among the torches, +bore thy strong Sail to its haven, not of peace but blood. Yea, ill things multitude +on multitude vv. 425-438 +<25> + Thou seest not, which so soon shall lay thee low, Low as thyself, low as thy children.—Go, +Heap scorn on Creon and my lips withal: For this I tell thee, never was there fall +Of pride, nor shall be, like to thine this day. +Oedipus: To brook such words from this thing? Out, I say! Out to perdition! Aye, +and quick, before ... [The Leader restrains him.] Enough then!—Turn and get thee +from my door. +Tiresias: I had not come hadst thou not called me here. +Oedipus: I knew thee not so dark a fool. I swear 'Twere long before I called thee, +had I known. +Tiresias: Fool, say'st thou? Am I truly such an one? The two who gave thee birth, +they held me wise. +Oedipus: Birth?... Stop! Who were they? Speak thy prophecies. +Tiresias: This day shall give thee birth and blot thee out. vv. 439-455 +<26> +Oedipus: Oh, riddles everywhere and words of doubt! +Tiresias: Aye. Thou wast their best reader long ago. +Oedipus: Laugh on. I swear thou still shalt find me so. +Tiresias: That makes thy pride and thy calamity. +Oedipus: I have saved this land, and care not if I die. +Tiresias: Then I will go.—Give me thine arm, my child. +Oedipus: Aye, help him quick.—To see him there makes wild My heart. Once gone, +he will not vex me more. +Tiresias (turning again as he goes): I fear thee not; nor will I go before That word +be spoken which I came to speak. How canst thou ever touch me?—Thou dost seek With +threats and loud proclaim the man whose hand Slew Laïus. Lo, I tell thee, he doth +stand Here. He is called a stranger, but these days Shall prove him Theban true, +nor shall he praise His birthright. Blind, who once had seeing eyes, Beggared, who +once had riches, in strange guise, vv. 456-478 +<27> + His staff groping before him, he shall crawl O'er unknown earth, and voices round +him call: "Behold the brother-father of his own Children, the seed, the sower and +the sown, Shame to his mother's blood, and to his sire Son, murderer, incest-worker." +Cool thine ire With thought of these, and if thou find that aught Faileth, then hold +my craft a thing of naught. [He goes out. Oedipus returns to the Palace.] +Chorus: [They sing of the unknown murderer] What man, what man is he whom the voice +of Delphi's cell Hath named of the bloody hand, of the deed no tongue may tell? Let +him fly, fly, for his need Hath found him; oh, where is the speed That flew with +the winds of old, the team of North-Wind's spell? For feet there be that follow. +Yea, thunder-shod And girt with fire he cometh, the Child of God; And with him are +they that fail not, the Sin-Hounds risen from Hell. For the mountain hath spoken, +a voice hath flashed from amid the snows, That the wrath of the world go seek for +the man whom no man knows. Is he fled to the wild forest, To caves where the eagles +nest? O angry bull of the rocks, cast out from thy herd-fellows! vv. 479-512 +<28> + Rage in his heart, and rage across his way, He toileth ever to beat from his ears +away The word that floateth about him, living, where'er he goes. [And of the Prophet's +strange accusation.] Yet strange, passing strange, the wise augur and his lore; And +my heart it cannot speak; I deny not nor assent, But float, float in wonder at things +after and before; Did there lie between their houses some old wrath unspent, That +Corinth against Cadmus should do murder by the way? No tale thereof they tell, nor +no sign thereof they show; Who dares to rise for vengeance and cast Oedipus away +For a dark, dark death long ago! Ah, Zeus knows, and Apollo, what is dark to mortal +eyes; They are Gods. But a prophet, hath he vision more than mine? Who hath seen? +Who can answer? There be wise men and unwise. I will wait, I will wait, for the proving +of the sign. But I list not nor hearken when they speak Oedipus ill. We saw his face +of yore, when the riddling singer passed; And we knew him that he loved us, and we +saw him great in skill. Oh, my heart shall uphold him to the last! vv. 513-531 +<29> + Enter +Creon: +Creon: Good brother citizens, a frantic word I hear is spoken by our chosen Lord +Oedipus against me, and here am come Indignant. If he dreams, 'mid all this doom +That weighs upon us, he hath had from me Or deed or lightest thought of injury, ... +'Fore God, I have no care to see the sun Longer with such a groaning name. Not one +Wound is it, but a multitude, if now All Thebes must hold me guilty—aye, and thou +And all who loved me—of a deed so foul. +Leader: If words were spoken, it was scarce the soul That spoke them: 'twas some sudden burst of wrath. +Creon: The charge was made, then, that Tiresias hath Made answer false, and that +I bribed him, I? +Leader: It was—perchance for jest. I know not why. +Creon: His heart beat true, his eyes looked steadily And fell not, laying such a +charge on me? +Leader: I know not. I have no eyes for the thing My masters do.—But see, here comes the King. vv. 532-550 +<30> + Enter Oedipus from the Palace. +Oedipus: How now, assassin? Walking at my gate With eye undimmed, thou plotter demonstrate +Against this life, and robber of my crown? God help thee! Me! What was it set me +down Thy butt? So dull a brain hast found in me Aforetime, such a faint heart, not +to see Thy work betimes, or seeing not to smite? Art thou not rash, this once! It +needeth might Of friends, it needeth gold, to make a throne Thy quarry; and I fear +me thou hast none. +Creon: One thing alone I ask thee. Let me speak As thou hast spoken; then, with knowledge, +wreak Thy judgement. I accept it without fear. +Oedipus: More skill hast thou to speak than I to hear Thee. There is peril found +in thee and hate. +Creon: That one thing let me answer ere too late. +Oedipus: One thing be sure of, that thy plots are known. +Creon: The man who thinks that bitter pride alone Can guide him, without thought—his +mind is sick. vv. 551-562 +<31> +Oedipus: Who thinks to slay his brother with a trick And suffer not himself, his +eyes are blind. +Creon: Thy words are more than just. But say what kind Of wrong thou fanciest I have +done thee. Speak. +Oedipus: Didst urge me, or didst urge me not, to seek A counsel from that man of +prophecies? +Creon: So judged I then, nor now judge otherwise. +Oedipus: [Suddenly seeing a mode of attack]. How many years have passed since Laïus +... [The words seem to choke him.] +Creon: Speak on. I cannot understand thee thus. +Oedipus: [With an effort.] Passed in that bloody tempest from men's sight? +Creon: Long years and old. I scarce can tell them right. +Oedipus: At that time was this seer in Thebes, or how? vv. 563-573 +<32> +Creon: He was; most wise and honoured, even as now. +Oedipus: At that time did he ever speak my name? +Creon: No. To mine ear at least it never came. +Oedipus: Held you no search for those who slew your King? +Creon: For sure we did, but found not anything. +Oedipus: How came the all-knowing seer to leave it so? +Creon: Ask him! I speak not where I cannot know. +Oedipus: One thing thou canst, with knowledge full, I wot. +Creon: Speak it. If true, I will conceal it not. +Oedipus: This: that until he talked with thee, the seer Ne'er spoke of me as Laïus' +murderer. vv. 574-589 +<33> +Creon: I know not if he hath so spoken now. I heard him not.—But let me ask and +thou Answer me true, as I have answered thee. +Oedipus: Ask, ask! Thou shalt no murder find in me. +Creon: My sister is thy wife this many a day? +Oedipus: That charge it is not in me to gainsay. +Creon: Thou reignest, giving equal reign to her? +Oedipus: Always to her desire I minister. +Creon: Were we not all as one, she thou and I? +Oedipus: Yes, thou false friend! There lies thy treachery. +Creon: Not so! Nay, do but follow me and scan Thine own charge close. Think'st thou +that any man Would rather rule and be afraid than rule And sleep untroubled? Nay, +where lives the fool— vv. 590-613 +<34> + I know them not nor am I one of them— Who careth more to bear a monarch's name +Than do a monarch's deeds? As now I stand All my desire I compass at thy hand. Were +I the King, full half my deeds were done To obey the will of others, not mine own. +Were that as sweet, when all the tale were told, As this calm griefless princedom +that I hold And silent power? Am I so blind of brain That ease with glory tires me, +and I fain Must change them? All men now give me God-speed, All smile to greet me. +If a man hath need Of thee, 'tis me he calleth to the gate, As knowing that on my +word hangs the fate Of half he craves. Is life like mine a thing To cast aside and +plot to be a King? Doth a sane man turn villain in an hour? For me, I never lusted +thus for power Nor bore with any man who turned such lust To doing.—But enough. +I claim but just Question. Go first to Pytho; find if well And true I did report +God's oracle. Next, seek in Thebes for any plots entwined Between this seer and me; +which if ye find, Then seize and strike me dead. Myself that day Will sit with thee +as judge and bid thee Slay! But damn me not on one man's guess.—'Tis all Unjust: +to call a traitor true, to call A true man traitor with no cause nor end! And this +I tell thee. He who plucks a friend Out from his heart hath lost a treasured thing +Dear as his own dear life. But Time shall bring vv. 614-626 +<35> + Truth back. 'Tis Time alone can make men know What hearts are true; the false one +day can show. +Leader: To one that fears to fall his words are wise, O King; in thought the swift win not the prize. +Oedipus: When he is swift who steals against my reign With plots, then swift am I +to plot again. Wait patient, and his work shall have prevailed Before I move, and +mine for ever failed. +Creon: How then? To banish me is thy intent? +Oedipus: Death is the doom I choose, not banishment. +Creon: Wilt never soften, never trust thy friend? +Oedipus: First I would see how traitors meet their end. +Creon: I see thou wilt not think. +Oedipus: I think to save My life. vv. 627-633 +<36> +Creon: Think, too, of mine. +Oedipus: Thine, thou born knave! +Creon: Yes.... What, if thou art blind in everything? +Oedipus: The King must be obeyed. +Creon: Not if the King Does evil. +Oedipus: To your King! Ho, Thebes, mine own! +Creon: Thebes is my country, not the King's alone. [Oedipus has drawn his sword; +the Chorus show signs of breaking into two parties to fight for Oedipus or for Creon, +when the door opens and Jocasta appears on the steps.] +Leader: Stay, Princes, stay! See, on the Castle stair The Queen Jocasta standeth. Show to her Your strife. She +will assuage it as is well. vv. 634-648 +<37> + +Jocasta: Vain men, what would ye with this angry swell Of words heart-blinded? Is +there in your eyes No pity, thus, when all our city lies Bleeding, to ply your privy +hates?... Alack, My lord, come in!—Thou, Creon, get thee back To thine own house. +And stir not to such stress Of peril griefs that are but nothingness. +Creon: Sister, it is the pleasure of thy lord, Our King, to do me deadly wrong. His +word Is passed on me: 'tis banishment or death. +Oedipus: I found him ... I deny not what he saith, My Queen ... with craft and malice +practising Against my life. +Creon: Ye Gods, if such a thing Hath once been in my thoughts, may I no more See +any health on earth, but, festered o'er With curses, die!—Have done. There is mine +oath. +Jocasta: In God's name, Oedipus, believe him, both For my sake, and for these +whose hearts are all Thine own, and for my brother's oath withal. vv. 649-664 +<38> + +Leader:[Strophe.] Yield; consent; think! My Lord, I conjure thee! +Oedipus: What would ye have me do? +Leader: Reject not one who never failed his troth +Of old and now is strong in his great oath. +Oedipus: Dost know what this prayer means? +Leader: Yea, verily! +Oedipus: Say then the meaning true. +Leader: I would not have thee cast to infamy +Of guilt, where none is proved, One who hath sworn and whom thou once hast loved. +Oedipus: 'Tis that ye seek? For me, then ... understand Well ... ye seek death or +exile from the land. +Leader: No, by the God of Gods, the all-seeing Sun! May he desert +me here, and every friend With him, to death and utterest malison, vv. 665-680 +<39> + If e'er my heart could dream of such an end! But it bleedeth, it bleedeth sore, +In a land half slain, If we join to the griefs of yore Griefs of you twain. +Oedipus: Oh, let him go, though it be utterly My death, or flight from Thebes in +beggary. 'Tis thy sad lips, not his, that make me know Pity. Him I shall hate, where'er +he go. +Creon: I see thy mercy moving full of hate And slow; thy wrath came swift and desperate. +Methinks, of all the pain that such a heart Spreadeth, itself doth bear the bitterest +part. +Oedipus: Oh, leave me and begone! +Creon: I go, wronged sore By thee. These friends will trust me as before. [Creon +goes. Oedipus stands apart lost in trouble of mind.] +Leader:[Antistrophe.] Queen, wilt +thou lead him to his house again? +Jocasta: I will, when I have heard. vv. 681-696 +<40> + +Leader: There fell some word, some blind imagining Between them. Things known foolish +yet can sting. +Jocasta: From both the twain it rose? +Leader: From both the twain. + +Jocasta: Aye, and what was the word? +Leader: Surely there is enough of evil stirred, +And Thebes heaves on the swell Of storm.—Oh, leave this lying where it fell. +Oedipus: So be it, thou wise counsellor! Make slight My wrong, and blunt my purpose +ere it smite. +Leader: O King, not once I have answered. Visibly Mad were I, lost +to all wise usages, To seek to cast thee from us. 'Twas from thee We saw of old blue +sky and summer seas, When Thebes in the storm and rain Reeled, like to die. Oh, if +thou canst, again Blue sky, blue sky...! vv. 697-713 +<41> + +Jocasta: Husband, in God's name, say what hath ensued Of ill, that thou shouldst +seek so dire a feud. +Oedipus: I will, wife. I have more regard for thee Than these.—Thy brother plots +to murder me. +Jocasta: Speak on. Make all thy charge. Only be clear. +Oedipus: He says that I am Laïus' murderer. +Jocasta: Says it himself? Says he hath +witnesses? +Oedipus: Nay, of himself he ventures nothing. 'Tis This priest, this hellish seer, +makes all the tale. +Jocasta: The seer?—Then tear thy terrors like a veil And take +free breath. A seer? No human thing Born on the earth hath power for conjuring Truth +from the dark of God. Come, I will tell An old tale. There came once an oracle To +Laïus: I say not from the God Himself, but from the priests and seers who trod His +sanctuary: if ever son were bred From him and me, by that son's hand, it said, vv. +714-732 +<42> + Laïus must die. And he, the tale yet stays Among us, at the crossing of three ways +Was slain by robbers, strangers. And my son— God's mercy!—scarcely the third +day was gone When Laïus took, and by another's hand Out on the desert mountain, +where the land Is rock, cast him to die. Through both his feet A blade of iron they +drove. Thus did we cheat Apollo of his will. My child could slay No father, and the +King could cast away The fear that dogged him, by his child to die Murdered.—Behold +the fruits of prophecy! Which heed not thou! God needs not that a seer Help him, +when he would make his dark things clear. +Oedipus: Woman, what turmoil hath thy story wrought Within me! What up-stirring of +old thought! +Jocasta: What thought? It turns thee like a frightened thing. +Oedipus: 'Twas at the crossing of three ways this King Was murdered? So I heard or +so I thought. +Jocasta: That was the tale. It is not yet forgot. +Oedipus: The crossing of three ways! And in what land? vv. 733-746 +<43> + +Jocasta: Phokis 'tis called. A road on either hand From Delphi comes and Daulia, +in a glen. +Oedipus: How many years and months have passed since then? +Jocasta: 'Twas but a little +time before proclaim Was made of thee for king, the tidings came. +Oedipus: My God, what hast thou willed to do with me? +Jocasta: Oedipus, speak! What +is it troubles thee? +Oedipus: Ask me not yet. But say, what build, what height Had Laïus? Rode he full +of youth and might? +Jocasta: Tall, with the white new gleaming on his brow He walked. +In shape just such a man as thou. +Oedipus: God help me! I much fear that I have wrought A curse on mine own head, and +knew it not. +Jocasta: How sayst thou? O my King, I look on thee And tremble. vv. +747-760 +<44> + Oedipus (to himself). Horror, if the blind can see! Answer but one thing and 'twill +all be clear. +Jocasta: Speak. I will answer though I shake with fear. +Oedipus: Went he with scant array, or a great band Of armèd followers, like a lord +of land? +Jocasta: Four men were with him, one a herald; one Chariot there was, where +Laïus rode alone. +Oedipus: Aye me! Tis clear now. Woman, who could bring To Thebes the story of that +manslaying? +Jocasta: A house-thrall, the one man they failed to slay. +Oedipus: The one man...? Is he in the house to-day? +Jocasta: Indeed no. When he came +that day, and found Thee on the throne where once sat Laïus crowned, He took my +hand and prayed me earnestly vv. 761-779 +<45> + To send him to the mountain heights, to be A herdsman, far from any sight or call +Of Thebes. And there I sent him. 'Twas a thrall Good-hearted, worthy a far greater +boon. +Oedipus: Canst find him? I would see this herd, and soon. +Jocasta: 'Tis easy. But +what wouldst thou with the herd? +Oedipus: I fear mine own voice, lest it spoke a word Too much; whereof this man must +tell me true. +Jocasta: The man shall come.—My lord, methinks I too Should know +what fear doth work thee this despite. +Oedipus: Thou shalt. When I am tossed to such an height Of dark foreboding, woman, +when my mind Faceth such straits as these, where should I find A mightier love than +thine? My father—thus I tell thee the whole tale—was Polybus, In Corinth King; +my mother Meropê Of Dorian line. And I was held to be The proudest in Corinthia, +till one day A thing befell: strange was it, but no way Meet for such wonder and +such rage as mine. A feast it was, and some one flushed with wine vv. 780-807 +<46> + Cried out at me that I was no true son Of Polybus. Oh, I was wroth! That one Day +I kept silence, but the morrow morn I sought my parents, told that tale of scorn +And claimed the truth; and they rose in their pride And smote the mocker.... Aye, +they satisfied All my desire; yet still the cavil gnawed My heart, and still the +story crept abroad. At last I rose—my father knew not, nor My mother—and went +forth to Pytho's floor To ask. And God in that for which I came Rejected me, but +round me, like a flame, His voice flashed other answers, things of woe, Terror, and +desolation. I must know My mother's body and beget thereon A race no mortal eye durst +look upon, And spill in murder mine own father's blood. I heard, and, hearing, straight +from where I stood, No landmark but the stars to light my way, Fled, fled from the +dark south where Corinth lay, To lands far off, where never I might see My doom of +scorn fulfilled. On bitterly I strode, and reached the region where, so saith Thy +tale, that King of Thebes was struck to death.... Wife, I will tell thee true. As +one in daze I walked, till, at the crossing of three ways, A herald, like thy tale, +and o'er his head A man behind strong horses charioted Met me. And both would turn +me from the path, He and a thrall in front. And I in wrath Smote him that pushed +me—'twas a groom who led The horses. Not a word the master said, vv. 808-828 +<47> + But watched, and as I passed him on the road Down on my head his iron-branchèd +goad Stabbed. But, by heaven, he rued it! In a flash I swung my staff and saw the +old man crash Back from his car in blood.... Then all of them I slew. Oh, if that +man's unspoken name Had aught of Laïus in him, in God's eye What man doth move more +miserable than I, More dogged by the hate of heaven! No man, kin Nor stranger, any +more may take me in; No man may greet me with a word, but all Cast me from out their +houses. And withal 'Twas mine own self that laid upon my life These curses.—And +I hold the dead man's wife In these polluting arms that spilt his soul.... Am I a +thing born evil? Am I foul In every vein? Thebes now doth banish me, And never in +this exile must I see Mine ancient folk of Corinth, never tread The land that bore +me; else my mother's bed Shall be defiled, and Polybus, my good Father, who loved +me well, be rolled in blood. If one should dream that such a world began In some +slow devil's heart, that hated man, Who should deny him?—God, as thou art clean, +Suffer not this, oh, suffer not this sin To be, that e'er I look on such a day! Out +of all vision of mankind away To darkness let me fall ere such a fate Touch me, so +unclean and so desolate! vv. 829-850 +<48> + +Leader: I tremble too, O King; but till thou hear From him who saw, oh, let hope +conquer fear. +Oedipus: One shred of hope I still have, and therefore Will wait the herdsman's coming. +'Tis no more. +Jocasta: He shall come. But what further dost thou seek? +Oedipus: This. If we mark him close and find him speak As thou hast, then I am lifted +from my dread. +Jocasta: What mean'st thou? Was there something that I said...? +Oedipus: Thou said'st he spoke of robbers, a great band, That slaughtered Laïus' +men. If still he stand To the same tale, the guilt comes not my way. One cannot be +a band. But if he say One lonely loin-girt man, then visibly This is God's finger +pointing toward me. +Jocasta: Be sure of this. He told the story so When first he +came. All they that heard him know, vv. 850-870 +<49> + Not only I. He cannot change again Now. And if change he should, O Lord of men, +No change of his can make the prophecy Of Laïus' death fall true. He was to die +Slain by my son. So Loxias spake.... My son! He slew no man, that poor deserted one +That died.... And I will no more turn mine eyes This way nor that for all their prophecies. +Oedipus: Woman, thou counsellest well. Yet let it not Escape thee. Send and have +the herdsman brought. +Jocasta: That will I.—Come. Thou knowest I ne'er would do +Nor think of aught, save thou wouldst have it so. [Jocasta and Oedipus go together +into the Palace.] +Chorus: [They pray to be free from such great sins as they have just heard spoken +of.] [Strophe]. Toward God's great mysteries, oh, let me move Unstainèd till I die +In speech or doing; for the Laws thereof Are holy, walkers upon ways above, Born +in the far blue sky; Their father is Olympus uncreate; No man hath made nor told +Their being; neither shall Oblivion set vv. 870-893 +<50> + Sleep on their eyes, for in them lives a great Spirit and grows not old. [Antistrophe.] +[They wonder if these sins be all due to pride and if Creon has guilty ambitions;] + 'Tis Pride that breeds the tyrant; drunken deep With perilous things is she, Which +bring not peace: up, reeling, steep on steep She climbs, till lo, the rock-edge, +and the leap To that which needs must be, The land where the strong foot is no +more strong! Yet is there surely Pride That saves a city; God preserve it long! I +judge not. Only through all maze of wrong Be God, not man, my guide. [Strophe.] [Or +if Tiresias can really be a lying prophet with no fear of God; they feel that all +faith in oracles and the things of God is shaken.] Is there a priest who moves amid +the altars Ruthless in deed and word, Fears not the presence of his god, nor falters +Lest Right at last be heard? If such there be, oh, let some doom be given Meet for +his ill-starred pride, Who will not gain his gain where Justice is, Who will not +hold his lips from blasphemies, Who hurls rash hands amid the things of heaven From +man's touch sanctified. In a world where such things be, What spirit hath shield +or lance vv. 893-916 +<51> + To ward him secretly From the arrow that slays askance? If honour to such things +be, Why should I dance my dance? [Antistrophe.] I go no more with prayers and adorations +To Earth's deep Heart of Stone, Nor yet the Abantes' floor, nor where the nations +Kneel at Olympia's throne, Till all this dark be lightened, for the finger Of man +to touch and know. O Thou that rulest—if men rightly call Thy name on earth—O +Zeus, thou Lord of all And Strength undying, let not these things linger Unknown, +tossed to and fro. For faint is the oracle, And they thrust it aside, away; And +no more visible Apollo to save or slay; And the things of God, they fail As mist +on the wind away. [Jocasta comes out from the Palace followed by handmaids bearing +incense and flowers.] + +Jocasta: Lords of the land, the ways my thought hath trod Lead +me in worship to these shrines of God With flowers and incense flame. So dire a storm +Doth shake the King, sin, dread and every form Of grief the world knows. 'Tis the +wise man's way To judge the morrow by the yester day; vv. 917-933 +<52> + Which he doth never, but gives eye and ear To all who speak, will they but speak +of fear. And seeing no word of mine hath power to heal His torment, therefore forth +to thee I steal, O Slayer of the Wolf, O Lord of Light, Apollo: thou art near us, +and of right Dost hold us thine: to thee in prayer I fall. [She kneels at the altar +of Apollo Lukeios.] Oh, show us still some path that is not all Unclean; for now our +captain's eyes are dim With dread, and the whole ship must follow him. [While she +prays a Stranger has entered and begins to accost the Chorus.] +Stranger: Good masters, is there one of you could bring My steps to the house of +Oedipus, your King? Or, better, to himself if that may be? +Leader: This is the house +and he within; and she Thou seest, the mother of his royal seed. [Jocasta rises, +anxious, from her prayer.] +Stranger: Being wife to such a man, happy indeed And ringed with happy faces may +she live! +Jocasta: To one so fair of speech may the Gods give Like blessing, courteous +stranger; 'tis thy due. But say what leads thee hither. Can we do Thy wish in aught, +or hast thou news to bring? vv. 934-947 +<53> +Stranger: Good news, O Queen, for thee and for the King. +Jocasta: What is it? And +from what prince comest thou? +Stranger: I come from Corinth.—And my tale, I trow, Will give thee joy, yet haply +also pain. +Jocasta: What news can have that twofold power? Be plain. +Stranger: 'Tis spoke in Corinth that the gathering Of folk will make thy lord our +chosen King. +Jocasta: How? Is old Polybus in power no more? +Stranger: Death has a greater power. His reign is o'er. +Jocasta: What say'st thou? +Dead?... Oedipus' father dead? +Stranger: If I speak false, let me die in his stead. +Jocasta: Ho, maiden! To our +master! Hie thee fast And tell this tale. [The maiden goes.] Where stand ye at the +last vv. 948-961 +<54> + Ye oracles of God? For many a year Oedipus fled before that man, in fear To slay +him. And behold we find him thus Slain by a chance death, not by Oedipus. [Oedipus +comes out from the Palace.] +Oedipus: O wife, O face I love to look upon, Why call'st thou me from where I sat +alone? +Jocasta: Give ear, and ponder from what this man tells How end these proud +priests and their oracles. +Oedipus: Whence comes he? And what word hath he for us? +Jocasta: From Corinth; bearing +news that Polybus Thy father is no more. He has found his death. +Oedipus: How?—Stranger, speak thyself. This that she saith ... +Stranger: Is sure. If that is the first news ye crave, I tell thee, Polybus lieth +in his grave. +Oedipus: Not murdered?... How? Some passing of disease? +Stranger: A slight thing turns an old life to its peace. vv. 962-978 +<55> +Oedipus: Poor father!... 'Tis by sickness he is dead? +Stranger: The growing years lay heavy on his head. +Oedipus: O wife, why then should man fear any more The voice of Pytho's dome, or +cower before These birds that shriek above us? They foretold Me for my father's murderer; +and behold, He lies in Corinth dead, and here am I And never touched the sword.... +Or did he die In grief for me who left him? In that way I may have wrought his death.... +But come what may, He sleepeth in his grave and with him all This deadly seercraft, +of no worth at all. +Jocasta: Dear Lord, long since did I not show thee clear...? +Oedipus: Indeed, yes. I was warped by mine own fear. +Jocasta: Now thou wilt cast +it from thee, and forget. +Oedipus: Forget my mother?... It is not over yet. +Jocasta: What should man do with +fear, who hath but Chance Above him, and no sight nor governance vv. 979-993 +<56> + Of things to be? To live as life may run, No fear, no fret, were wisest 'neath the +sun. And thou, fear not thy mother. Prophets deem A deed wrought that is wrought +but in a dream. And he to whom these things are nothing, best Will bear his burden. +Oedipus: All thou counsellest Were good, save that my mother liveth still. And, though +thy words be wise, for good or ill Her I still fear. +Jocasta: Think of thy father's +tomb! Like light across our darkness it hath come. +Oedipus: Great light; but while she lives I fly from her. +Stranger: What woman, Prince, doth fill thee so with fear? +Oedipus: Meropê, friend, who dwelt with Polybus. +Stranger: What in Queen Meropê should fright thee thus? +Oedipus: A voice of God, stranger, of dire import. +Stranger: Meet for mine ears? Or of some secret sort? vv. 994-1009 +<57> +Oedipus: Nay, thou must hear, and Corinth. Long ago Apollo spake a doom, that I should +know My mother's flesh, and with mine own hand spill My father's blood.—'Tis that, +and not my will, Hath kept me always far from Corinth. So; Life hath dealt kindly +with me, yet men know On earth no comfort like a mother's face. +Stranger: 'Tis that, hath kept thee exiled in this place? +Oedipus: That, and the fear too of my father's blood. +Stranger: Then, surely, Lord ... I came but for thy good ... 'Twere well if from +that fear I set thee free. +Oedipus: Ah, couldst thou! There were rich reward for thee. +Stranger: To say truth, I had hoped to lead thee home Now, and myself to get some +good therefrom. +Oedipus: Nay; where my parents are I will not go. +Stranger: My son, 'tis very clear thou dost not know What road thou goest. +Oedipus: How? In God's name, say! How clear? vv. 1010-1019 +<58> +Stranger: 'Tis this, keeps thee so long away From Corinth? +Oedipus: 'Tis the fear lest that word break One day upon me true. +Stranger: Fear lest thou take Defilement from the two that gave thee birth? +Oedipus: 'Tis that, old man, 'tis that doth fill the earth With terror. +Stranger: Then thy terror all hath been For nothing. +Oedipus: How? Were not your King and Queen My parents? +Stranger: Polybus was naught to thee In blood. +Oedipus: How? He, my father! +Stranger: That was he As much as I, but no more. +Oedipus: Thou art naught; 'Twas he begot me. vv. 1020-1028 +<59> +Stranger: 'Twas not I begot Oedipus, neither was it he. +Oedipus: What wild Fancy, then, made him name me for his child? +Stranger: Thou wast his child—by gift. Long years ago Mine own hand brought thee +to him. +Oedipus: Coming so, From a strange hand, he gave me that great love? +Stranger: He had no child, and the desire thereof Held him. +Oedipus: And thou didst find somewhere—or buy— A child for him? +Stranger: I found it in a high Glen of Kithairon. [Movement of Jocasta, who stands +riveted with dread, unnoticed by the others.] +Oedipus: Yonder? To what end Wast travelling in these parts? +Stranger: I came to tend The flocks here on the mountain. vv. 1029-1037 +<60> +Oedipus: Thou wast one That wandered, tending sheep for hire? +Stranger: My son, That day I was the saviour of a King. +Oedipus: How saviour? Was I in some suffering Or peril? +Stranger: Thine own feet a tale could speak. +Oedipus: Ah me! What ancient pain stirs half awake Within me! +Stranger: 'Twas a spike through both thy feet. I set thee free. +Oedipus: A strange scorn that, to greet A babe new on the earth! +Stranger: From that they fain Must call thee Oedipus, "Who-walks-in-pain." +Oedipus: Who called me so—father or mother? Oh, In God's name, speak! vv. 1038-1046 +<61> +Stranger: I know not. He should know Who brought thee. +Oedipus: So: I was not found by thee. Thou hadst me from another? +Stranger: Aye; to me One of the shepherds gave the babe, to bear Far off. +Oedipus: What shepherd? Know'st thou not? Declare All that thou knowest. +Stranger: By my memory, then, I think they called him one of Laïus' men. +Oedipus: That Laïus who was king in Thebes of old? +Stranger: The same. My man did herding in his fold. +Oedipus: Is he yet living? Can I see his face? +Stranger: [Turning to the Chorus.] Ye will know that, being natives to the place. vv. 1047-1062 +<62> +Oedipus: How?—Is there one of you within my pale Standing, that knows the shepherd +of his tale? Ye have seen him on the hills? Or in this town? Speak! For the hour +is come that all be known. +Leader: I think 'twill be the Peasant Man, the same, Thou +hast sought long time to see.—His place and name Our mistress, if she will, can +tell most clear. [Jocasta remains as if she heard nothing.] +Oedipus: Thou hear'st him, wife. The herd whose presence here We craved for, is it +he this man would say? +Jocasta: He saith ... What of it? Ask not; only pray Not to +remember.... Tales are vainly told. +Oedipus: 'Tis mine own birth. How can I, when I hold Such clues as these, refrain +from knowing all? +Jocasta: For God's love, no! Not if thou car'st at all For thine +own life.... My anguish is enough. Oedipus (bitterly). Fear not!... Though I be thrice +of slavish stuff From my third grand-dam down, it shames not thee. vv. 1063-1075 +<63> + +Jocasta: Ask no more. I beseech thee.... Promise me! +Oedipus: To leave the Truth half-found? 'Tis not my mood. +Jocasta: I understand; +and tell thee what is good. +Oedipus: Thy good doth weary me. +Jocasta: O child of woe, I pray God, I pray God, +thou never know! Oedipus (turning from her). Go, fetch the herdsman straight!—This +Queen of mine May walk alone to boast her royal line. +Jocasta: [She twice draws in +her breath through her teeth, as if in some sharp pain.] Unhappy one, goodbye! Goodbye +before I go: this once, and never never more! [She comes towards him as though to +take a last farewell, then stops suddenly, turns, and rushes into the Palace.] +Leader: King, what was that? She passed like one who flies In very anguish. Dread is o'er +mine eyes Lest from this silence break some storm of wrong. vv. 1076-1097 +<64> +Oedipus: Break what break will! My mind abideth strong To know the roots, how low +soe'er they be, Which grew to +Oedipus: This woman, she Is proud, methinks, and fears my birth and name Will mar +her nobleness. But I, no shame Can ever touch me. I am Fortune's child, Not man's; +her mother face hath ever smiled Above me, and my brethren of the sky, The changing +Moons, have changed me low and high. There is my lineage true, which none shall wrest +From me; who then am I to fear this quest? +Chorus: [They sing Oedipus as the foundling of their own Theban mountain, Kithairon, +and doubtless of divine birth.] [Strophe.] If I, O Kithairon, some vision can borrow +From seercraft, if still there is wit in the old, Long, long, through the deep-orbèd +Moon of the morrow— So hear me, Olympus!—thy tale shall be told. O mountain of +Thebes, a new Theban shall praise thee, One born of thy bosom, one nursed at thy +springs; And the old men shall dance to thy glory, and raise thee To worship, O bearer +of joy to my kings. And thou, we pray, Look down in peace, O Apollo; I-ê, I-ê! +vv. 1098-1120 +<65> + [Antistrophe.] What Oread mother, unaging, unweeping, Did bear thee, O Babe, to +the Crag-walker Pan; Or perchance to Apollo? He loveth the leaping Of herds on the +rock-ways unhaunted of man. Or was it the lord of Cyllênê, who found thee, Or glad +Dionysus, whose home is the height, Who knew thee his own on the mountain, as round +thee The White Brides of Helicon laughed for delight? 'Tis there, 'tis there, The +joy most liveth of all his dance and prayer. +Oedipus: If I may judge, ye Elders, who have ne'er Seen him, methinks I see the shepherd +there Whom we have sought so long. His weight of years Fits well with our Corinthian +messenger's; And, more, I know the men who guide his way, Bondsmen of mine own house. +Thou, friend, wilt say Most surely, who hast known the man of old. +Leader: I know +him well. A shepherd of the fold Of Laïus, one he trusted more than all. [The Shepherd +comes in, led by two thralls.] He is an old man and seems terrified. +Oedipus: Thou first, our guest from Corinth: say withal Is this the man? vv. 1120-1130 +<66> +Stranger: This is the man, O King. +Oedipus: [Addressing the Shepherd.] Old man! Look up, and answer everything I ask +thee.—Thou wast Laïus' man of old? +Shepherd: Born in his house I was, not bought with gold. +Oedipus: What kind of work, what way of life, was thine? +Shepherd: Most of my days I tended sheep or kine. +Oedipus: What was thy camping ground at midsummer? +Shepherd: Sometimes Kithairon, sometimes mountains near. +Oedipus: Saw'st ever there this man thou seëst now? +Shepherd: There, Lord? What doing?—What man meanest thou? +Oedipus: [Pointing to the Stranger] Look! Hath he ever crossed thy path before? +<67> +Shepherd: I call him not to mind, I must think more. +Stranger: Small wonder that, O King! But I will throw Light on his memories.—Right +well I know He knows the time when, all Kithairon through, I with one wandering herd +and he with two, Three times we neighboured one another, clear From spring to autumn +stars, a good half-year. At winter's fall we parted; he drove down To his master's +fold, and I back to mine own.... Dost call it back, friend? Was it as I say? +Shepherd: It was. It was.... 'Tis all so far away. +Stranger: Say then: thou gavest me once, there in the wild, A babe to rear far off +as mine own child? +Shepherd: [His terror returning.] What does this mean? To what end askest thou? +Stranger: [Pointing to Oedipus.] That babe has grown, friend. 'Tis our master now. +Shepherd: [He slowly understands, then stands for a moment horror-struck.] No, in +the name of death!... Fool, hold thy peace. [He lifts his staff at the Stranger.] vv. 1147-1157 +<68> +Oedipus: Ha, greybeard! Wouldst thou strike him?—'Tis not his Offences, 'tis thine +own we need to mend. +Shepherd: Most gentle master, how do I offend? +Oedipus: Whence came that babe whereof he questioneth? +Shepherd: He doth not know ... 'tis folly ... what he saith. +Oedipus: Thou wilt not speak for love; but pain maybe ... +Shepherd: I am very old. Ye would not torture me. +Oedipus: Back with his arms, ye bondmen! Hold him so. [The thralls drag back the +Shepherd's arms, ready for torture.] +Shepherd: Woe's me! What have I done?... What wouldst thou know? +Oedipus: Didst give this man the child, as he doth say? +Shepherd: I did.... Would God that I had died this day! vv. 1158-1167 +<69> +Oedipus: 'Fore heaven, thou shalt yet, if thou speak not true. +Shepherd: 'Tis more than death and darker, if I do. +Oedipus: This dog, it seems, will keep us waiting. +Shepherd: Nay, I said at first I gave it. +Oedipus: In what way Came it to thee? Was it thine own child, or Another's? +Shepherd: Nay, it never crossed my door: Another's. +Oedipus: Whose? What man, what house, of these About thee? +Shepherd: In the name of God who sees, Ask me no more! +Oedipus: If once I ask again, Thou diest. +Shepherd: From the folk of Laïus, then, It came. vv. 1168-1176 +<70> +Oedipus: A slave, or born of Laïus' blood? +Shepherd: There comes the word I dread to speak, O God! +Oedipus: And I to hear: yet heard it needs must be. +Shepherd: Know then, they said 'twas Laïus' child. But she Within, thy wife, best +knows its fathering. +Oedipus: 'Twas she that gave it? +Shepherd: It was she, O King. +Oedipus: And bade you ... what? +Shepherd: Destroy it. +Oedipus: Her own child?... Cruel! +Shepherd: Dark words of God had made her wild. +Oedipus: What words? vv. 1176-1192 +<71> +Shepherd: The babe must slay his father; so 'Twas written. +Oedipus: Why didst thou, then, let him go With this old man? +Shepherd: O King, I pitied him. I thought the man would save him to some dim And +distant land, beyond all fear.... And he, To worse than death, did save him!... Verily, +If thou art he whom this man telleth of, To sore affliction thou art born. +Oedipus: Enough! All, all, shall be fulfilled.... Oh, on these eyes Shed light no +more, ye everlasting skies That know my sin! I have sinned in birth and breath. I +have sinned with Woman. I have sinned with Death. [He rushes into the Palace. The +Shepherd is led away by the thralls.] +Chorus: [Strophe. Nothingness, nothingness] Ye Children of Man, and less I count +you, waking or dreaming! And none among mortals, none, Seeking to live, hath won +More than to seem, and to cease Again from his seeming. vv. 1193-1212 +<72> + While ever before mine eyes One fate, one ensample, lies— Thine, thine, O Oedipus, +sore Of God oppressèd— What thing that is human more Dare I call blessèd? +Straight his archery flew To the heart of living; he knew Joy and the fulness of +power, O Zeus, when the riddling breath Was stayed and the Maid of Death Slain, and +we saw him through The death-cloud, a tower! For that he was called my king; Yea, +every precious thing Wherewith men are honoured, down We cast before him, And great +Thebes brought her crown And kneeled to adore him. But now, what man's +story is such bitterness to speak? What life hath Delusion so visited, and Pain, +And swiftness of Disaster? O great King, our master, How oped the one haven to the +slayer and the slain? And the furrows of thy father, did they turn not nor shriek, +Did they bear so long silent thy casting of the grain? vv. 1213-1235 +<73> +'Tis Time, Time, desireless, hath shown thee what thou art; The long +monstrous mating, it is judged and all its race. O child of him that sleepeth, Thy +land weepeth, weepeth, Unfathered.... Would God, I had never seen thy face! From +thee in great peril fell peace upon my heart, In thee mine eye clouded and the dark +is come apace. [A Messenger rushes out from the Palace.] +Messenger: O ye above this land in honour old Exalted, what a tale shall ye be told, +What sights shall see, and tears of horror shed, If still your hearts be true to +them that led Your sires! There runs no river, well I ween, Not Phasis nor great +Ister, shall wash clean This house of all within that hideth—nay, Nor all that +creepeth forth to front the day, Of purposed horror. And in misery That woundeth +most which men have willed to be. +Leader: No lack there was in what we knew before +Of food for heaviness. What bring'st thou more? +Messenger: One thing I bring thee first.... 'Tis quickly said. Jocasta, our anointed +queen, is dead. vv. 1236-1260 +<74> + +Leader: Unhappy woman! How came death to her? +Messenger: By her own hand.... Oh, of what passed in there Ye have been spared the +worst. Ye cannot see. Howbeit, with that which still is left in me Of mind and memory, +ye shall hear her fate. Like one entranced with passion, through the gate She passed, +the white hands flashing o'er her head, Like blades that tear, and fled, unswerving +fled, Toward her old bridal room, and disappeared And the doors crashed behind her. +But we heard Her voice within, crying to him of old, Her Laïus, long dead; and things +untold Of the old kiss unforgotten, that should bring The lover's death and leave +the loved a thing Of horror, yea, a field beneath the plough For sire and son: then +wailing bitter-low Across that bed of births unreconciled, Husband from husband born +and child from child. And, after that, I know not how her death Found her. For sudden, +with a roar of wrath, Burst Oedipus upon us. Then, I ween, We marked no more what +passion held the Queen, But him, as in the fury of his stride, "A sword! A sword! +And show me here," he cried, "That wife, no wife, that field of bloodstained earth +Where husband, father, sin on sin, had birth, Polluted generations!" While he thus +Raged on, some god—for sure 'twas none of us— Showed where she was; and with +a shout away, As though some hand had pointed to the prey, vv. 1261-1286 +<75> + He dashed him on the chamber door. The straight Door-bar of oak, it bent beneath +his weight, Shook from its sockets free, and in he burst To the dark chamber. There +we saw her first Hanged, swinging from a noose, like a dead bird. He fell back when +he saw her. Then we heard A miserable groan, and straight he found And loosed the +strangling knot, and on the ground Laid her.—Ah, then the sight of horror came! +The pin of gold, broad-beaten like a flame, He tore from off her breast, and, left +and right, Down on the shuddering orbits of his sight Dashed it: "Out! Out! Ye never +more shall see Me nor the anguish nor the sins of me. Ye looked on lives whose like +earth never bore, Ye knew not those my spirit thirsted for: Therefore be dark for +ever!" Like a song His voice rose, and again, again, the strong And stabbing hand +fell, and the massacred And bleeding eyeballs streamed upon his beard, Wild rain, +and gouts of hail amid the rain. Behold affliction, yea, afflictions twain From man +and woman broken, now made one In downfall. All the riches yester sun Saw in this +house were rich in verity. What call ye now our riches? Agony, Delusion, Death, Shame, +all that eye or ear Hath ever dreamed of misery, is here. +Leader: And now how fares +he? Doth the storm abate? vv. 1287-1308 +<76> +Messenger: He shouts for one to open wide the gate And lead him forth, and to all +Thebes display His father's murderer, his mother's.... Nay, Such words I will not +speak. And his intent Is set, to cast himself in banishment Out to the wild, not +walk 'mid human breed Bearing the curse he bears. Yet sore his need Of strength and +of some guiding hand. For sure He hath more burden now than man may endure. But see, +the gates fall back, and that appears Which he who loathes shall pity—yea, with +tears. [Oedipus is led in, blinded and bleeding.] The Old Men bow down and hide their +faces; some of them weep. +Chorus: Oh, terrible! Oh, sight of all This life hath crossed, most terrible! Thou +man more wronged than tongue can tell, What madness took thee? Do there crawl Live +Things of Evil from the deep To leap on man? Oh, what a leap Was His that flung thee +to thy fall! +Leader: O fallen, fallen in ghastly case, I dare not raise mine eyes +to thee; Fain would I look and ask and see, But shudder sickened from thy face. +Oedipus: Oh, pain; pain and woe! Whither? Whither? vv. 1308-1328 +<77> + They lead me and I go; And my voice drifts on the air Far away. Where, Thing of +Evil, where Endeth thy leaping hither? +Leader: In fearful ends, which none may hear +nor say. +Oedipus: Cloud of the dark, mine own. For ever, horrible, Stealing, stealing, +silent, unconquerable, Cloud that no wind, no summer can dispel! Again, again I groan, +As through my heart together crawl the strong Stabs of this pain and memories of +old wrong. +Leader: Yea, twofold hosts of torment hast thou there, The stain to think +on and the pain to bear. +Oedipus: O Friend, thou mine own. Still faithful, minister Steadfast +abiding alone of them that were, Dost bear with me and give the blind man care? Ah +me! Not all unknown Nor hid thou art. Deep in this dark a call Comes and I know thy +voice in spite of all. +Leader: O fearful sufferer, and could'st thou kill Thy living +orbs? What God made blind thy will? vv. 1329-1351 +<78> +Oedipus: 'Tis Apollo; all is Apollo. O ye that love me, 'tis he long time +hath planned These things upon me evilly, evilly, Dark things and full of blood. +I knew not; I did but follow His way; but mine the hand And mine the anguish. What +were mine eyes to me When naught to be seen was good? +Leader: 'Tis even so; and Truth +doth speak in thee. +Oedipus: To see, to endure, to hear words kindly spoken, Should I have joy in such? +Out, if ye love your breath, Cast me swift unto solitude, unbroken By word or touch. +Am I not charged with death, Most charged and filled to the brim With curses? And +what man saith God hath so hated him? +Leader: Thy bitter will, thy hard calamity, +Would I had never known nor looked on thee! +Oedipus: My curse, my curse upon him. That man whom pity held in the +wilderness, Who saved the feet alive from the blood-fetter And loosed the barb thereof! +vv. 1351-1377 +<79> + That babe—what grace was done him, Had he died shelterless, He had not laid on +himself this grief to bear, And all who gave him love. +Leader: I, too, O Friend, +I had been happier. +Oedipus: Found not the way to his father's blood, nor shaken The world's scorn on +his mother, The child and the groom withal; But now, of murderers born, of God forsaken, +Mine own sons' brother; All this, and if aught can fall Upon man more perilous And +elder in sin, lo, all Is the portion of +Oedipus: +Leader: How shall I hold this counsel of thy mind True? Thou wert better +dead than living blind. +Oedipus: That this deed is not well and wisely wrought Thou shalt not show me; therefore +school me not. Think, with what eyes hereafter in the place Of shadows could I see +my father's face, Or my poor mother's? Both of whom this hand Hath wronged too deep +for man to understand. Or children—born as mine were born, to see Their shapes +should bring me joy? Great God! To me vv. 1378-1403 +<80> + There is no joy in city nor in tower Nor temple, from all whom, in this mine hour, +I that was chief in Thebes alone, and ate The King's bread, I have made me separate +For ever. Mine own lips have bid the land Cast from it one so evil, one whose hand +To sin was dedicate, whom God hath shown Birth-branded ... and my blood the dead +King's own! All this myself have proved. And can I then Look with straight eyes into +the eyes of men? I trow not. Nay, if any stop there were To dam this fount that welleth +in mine ear For hearing, I had never blenched nor stayed Till this vile shell were +all one dungeon made, Dark, without sound. 'Tis thus the mind would fain Find peace, +self-prisoned from a world of pain. O wild Kithairon, why was it thy will To save +me? Why not take me quick and kill, Kill, before ever I could make men know The thing +I am, the thing from which I grow? Thou dead King, Polybus, thou city wall Of Corinth, +thou old castle I did call My father's, what a life did ye begin, What splendour +rotted by the worm within, When ye bred me! O Crossing of the Roads, O secret glen +and dusk of crowding woods, O narrow footpath creeping to the brink Where meet the +Three! I gave you blood to drink. Do ye remember? 'Twas my life-blood, hot From mine +own father's heart. Have ye forgot What deed I did among you, and what new And direr +deed I fled from you to do? O flesh, horror of flesh!... vv. 1409-1431 +<81> + But what is shame To do should not be spoken. In God's name, Take me somewhere far +off and cover me From sight, or slay, or cast me to the sea Where never eye may see +me any more. What? Do ye fear to touch a man so sore Stricken? Nay, tremble not. +My misery Is mine, and shall be borne by none but me. +Leader: Lo, yonder comes for +answer to thy prayer Creon, to do and to decree. The care Of all our land is his, +now thou art weak. +Oedipus: Alas, what word to Creon can I speak, How make him trust me more? He hath +seen of late So vile a heart in me, so full of hate. Enter +Creon: +Creon: Not to make laughter, Oedipus, nor cast Against thee any evil of the past +I seek thee, but ... Ah God! ye ministers, Have ye no hearts? Or if for man there +stirs No pity in you, fear at least to call Stain on our Lord the Sun, who feedeth +all; Nor show in nakedness a horror such As this, which never mother Earth may touch, +Nor God's clean rain nor sunlight. Quick within! Guide him.—The ills that in a +house have been They of the house alone should know or hear. vv. 1432-1447 +<82> +Oedipus: In God's name, since thou hast undone the fear Within me, coming thus, all +nobleness, To one so vile, grant me one only grace. For thy sake more I crave it +than mine own. +Creon: Let me first hear what grace thou wouldst be shown. +Oedipus: Cast me from Thebes ... now, quick ... where none may see My visage more, +nor mingle words with me. +Creon: That had I done, for sure, save that I still Tremble, and fain would ask Apollo's +will. +Oedipus: His will was clear enough, to stamp the unclean Thing out, the bloody hand, +the heart of sin. +Creon: 'Twas thus he seemed to speak; but in this sore Strait we must needs learn +surer than before. +Oedipus: Thou needs must trouble God for one so low? +Creon: Surely; thyself will trust his answer now. +Oedipus: I charge thee more ... and, if thou fail, my sin Shall cleave to thee.... +For her who lies within, vv. 1448-1472 +<83> + Make as thou wilt her burial. 'Tis thy task To tend thine own. But me: let no man +ask This ancient city of my sires to give Harbour in life to me. Set me to live On +the wild hills and leave my name to those Deeps of Kithairon which my father chose, +And mother, for my vast and living tomb. As they, my murderers, willed it, let my +doom Find me. For this my very heart doth know, No sickness now, nor any mortal blow, +Shall slay this body. Never had my breath Been thus kept burning in the midst of +death, Save for some frightful end. So, let my way Go where it listeth. But my children—Nay, +Creon, my sons will ask thee for no care. Men are they, and can find them everywhere +What life needs. But my two poor desolate Maidens.... There was no table ever set +Apart for them, but whatso royal fare I tasted, they were with me and had share In +all.... Creon, I pray, forget them not. And if it may be, go, bid them be brought, +[Creon goes and presently returns with the two princesses.] Oedipus thinks he is there +all the time. That I may touch their faces, and so weep.... Go, Prince. Go, noble +heart!... If I might touch them, I should seem to keep And not to have lost them, +now mine eyes are gone.... What say I? In God's name, can it be I hear mine own vv. +1473-1505 +<84> + Beloved ones sobbing? Creon of his grace Hath brought my two, my dearest, to this +place. Is it true? +Creon: 'Tis true. I brought them, for in them I know Thy joy is, the same now as +long ago. +Oedipus: God bless thee, and in this hard journey give Some better guide than mine +to help thee live. Children! Where are ye? Hither; come to these Arms of your ... +brother, whose wild offices Have brought much darkness on the once bright eyes Of +him who grew your garden; who, nowise Seeing nor understanding, digged a ground The +world shall shudder at. Children, my wound Is yours too, and I cannot meet your gaze +Now, as I think me what remaining days Of bitter living the world hath for you. What +dance of damsels shall ye gather to, What feast of Thebes, but quick ye shall turn +home, All tears, or ere the feast or dancers come? And, children, when ye reach the +years of love, Who shall dare wed you, whose heart rise above The peril, to take +on him all the shame That cleaves to my name and my children's name? God knows, it +is enough!... My flowers, ye needs must die, waste things, bereft And fruitless. +Creon, thou alone art left Their father now, since both of us are gone Who cared +for them. Oh, leave them not alone vv. 1505-1518 +<85> + To wander masterless, these thine own kin, And beggared. Neither think of them such +sin As ye all know in me, but let their fate Touch thee. So young they are, so desolate— +Of all save thee. True man, give me thine hand, And promise. [Oedipus and Creon clasp +hands.] If your age could understand, Children, full many counsels I could give. But +now I leave this one word: Pray to live As life may suffer you, and find a road To +travel easier than your father trod. +Creon: Enough thy heart hath poured its tears; now back into thine house repair. +Oedipus: I dread the house, yet go I must. +Creon: Fair season maketh all things fair. +Oedipus: One oath then give me, and I go. +Creon: Name it, and I will answer thee. +Oedipus: To cast me from this land. vv. 1519-1523 +<86> +Creon: A gift not mine but God's thou askest me. +Oedipus: I am a thing of God abhorred. +Creon: The more, then, will he grant thy prayer. +Oedipus: Thou givest thine oath? +Creon: I see no light; and, seeing not, I may not swear. +Oedipus: Then take me hence. I care not. +Creon: Go in peace, and give these children o'er. +Oedipus: Ah no! Take not away my daughters! [They are taken from him.] +Creon: Seek not to be master more. Did not thy masteries of old forsake thee when +the end was near? vv. 1524-1530 +<87> +Chorus: Ye citizens of Thebes, behold; 'tis Oedipus that passeth here, Who read the +riddle-word of Death, and mightiest stood of mortal men, And Fortune loved him, and +the folk that saw him turned and looked again. Lo, he is fallen, and around great +storms and the outreaching sea! Therefore, O Man, beware, and look toward the end +of things that be, The last of sights, the last of days; and no man's life account +as gain Ere the full tale be finished and the darkness find him without pain. [Oedipus +is led into the house and the doors close on him.] +<-1> diff --git a/main.cpp b/main.cpp index bc8f460..ff13a3b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,15 @@ #include +#include "CatchTestUtils/catch_setup.h" +#include "SearchEngine/SearchEngine.h" -int main() { - std::cout << "Hello, World!" << std::endl; + +int main(int argc, char **argv) { + if (argc == 1) { + runCatchTests(); + return 0; + } else { + SearchEngine engine(argv[1]); + engine.initiateConsoleInterface(); + } return 0; } diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..5674e61 --- /dev/null +++ b/run.sh @@ -0,0 +1,9 @@ +#!/bin/bash +echo BUILDING AND RUNNING SEARCH ENGINE + +mkdir -p build +cd build || exit +cmake .. +make +clear +./22s_final_proj global ../../data/ diff --git a/utilities/Article.h b/utilities/Article.h new file mode 100644 index 0000000..1428674 --- /dev/null +++ b/utilities/Article.h @@ -0,0 +1,42 @@ +// +// Created by Drew Harris on 4/8/2022. +// + +#ifndef INC_22S_FINAL_PROJ_ARTICLE_H +#define INC_22S_FINAL_PROJ_ARTICLE_H + +#include "../hash_table/hash_table.h" +#include +#include +#include "tbb/concurrent_unordered_map.h" +#include +#include "../external/cereal/archives/json.hpp" +#include "../external/cereal/types/vector.hpp" +#include "../external/cereal/types/string.hpp" +#include "../external/cereal/types/utility.hpp" +#include "../external/cereal/types/memory.hpp" + +struct Article { + std::string uuid; + std::string filename; + std::string author; + std::vector peopleList; + std::vector orgList; + std::string title; + + // Overloaded stream insertion operator + friend std::ostream &operator<<(std::ostream &os, const Article &article) { + os << "Article: " << article.uuid << " " << article.filename << " " << article.author << " "; + for (auto &org: article.orgList) { + os << org << " "; + } + return os; + } + + template + void serialize(Archive &ar) { + ar(uuid, filename, author, peopleList, orgList, title); + } +}; + +#endif //INC_22S_FINAL_PROJ_ARTICLE_H diff --git a/utilities/Pipelines.cpp b/utilities/Pipelines.cpp new file mode 100644 index 0000000..df07a39 --- /dev/null +++ b/utilities/Pipelines.cpp @@ -0,0 +1,63 @@ +// +// Created by Adam Escobedo on 4/28/2022. +// + +#include "Pipelines.h" + +std::string pipeline::getCenteredText(const std::string &text, int width) { + int textLength = text.length(); + int spaces = (width - textLength) / 2; + std::string spacesStr = ""; + for (int i = 0; i < spaces; i++) { + spacesStr += " "; + } + return spacesStr + text; +} + +void pipeline::toLower(std::string &str) { + for (char &i: str) { + i = tolower(i); + } +} + +void pipeline::removePunctuation(std::string &str) { + std::string clean; + for (auto &it: str) { + if (std::isalpha(it)) { + clean += it; + } + } + str = clean; +} + +void pipeline::cleanStr(std::string &str) { + std::string clean; + for (char &it: str) { + if (std::isalpha(it)) { + clean += tolower(it); + } + } + str = clean; +} + +std::string pipeline::cleanPropnoun(const std::string &str) { + std::string clean; + for (const char &it: str) { + if (std::isalpha(it)) { + clean += tolower(it); + } else if (it == '-' || it == ' ' || it == '_') { + clean += '-'; + } + } + return clean; +} + +unsigned int pipeline::custom_string_hash(const std::string &str) { + unsigned int hashed = 1; + for (const char &cc: str) + if (std::isalpha(cc)) { + hashed *= 16777619; + hashed = hashed ^ (cc & 31); + } + return hashed; +} \ No newline at end of file diff --git a/utilities/Pipelines.h b/utilities/Pipelines.h new file mode 100644 index 0000000..24551ed --- /dev/null +++ b/utilities/Pipelines.h @@ -0,0 +1,25 @@ +// +// Created by Drew Harris on 4/8/2022. +// + +#ifndef INC_22S_FINAL_PROJ_PIPELINES_H +#define INC_22S_FINAL_PROJ_PIPELINES_H + +#include +#include "../external/porter2_stemmer/porter2_stemmer.h" + +namespace pipeline { + std::string getCenteredText(const std::string &text, int width); + + void toLower(std::string &str); + + void removePunctuation(std::string &str); + + void cleanStr(std::string &str); + + std::string cleanPropnoun(const std::string &str); + + unsigned int custom_string_hash(const std::string &str); +} + +#endif //INC_22S_FINAL_PROJ_PIPELINES_H diff --git a/utilities/ProgressBar.h b/utilities/ProgressBar.h new file mode 100644 index 0000000..1e70cf6 --- /dev/null +++ b/utilities/ProgressBar.h @@ -0,0 +1,51 @@ +// +// Created by Adam Escobedo on 4/30/2022. +// + +#ifndef INC_22S_FINAL_PROJ_PROGRESSBAR_H +#define INC_22S_FINAL_PROJ_PROGRESSBAR_H + +#include +#include +#include + +template +struct ProgressBar { + void printProgressBar(double progress) { + int barWidth = 70; + std::cout << "["; + int pos = barWidth * progress; + for (int i = 0; i < barWidth; ++i) { + if (i < pos) { + std::cout << "="; + } else if (i == pos) { + std::cout << ">"; + } else { + std::cout << " "; + } + } + std::cout << "] " << std::setprecision(3) << std::fixed << double(progress * 100.0) << " %\r"; + std::cout.flush(); + } + + template + void initiate(Args ...args) { + std::future fut = std::async(std::launch::async, args...); + + // Poll the progress of the invoker every 400 milliseconds + while (fut.wait_for(std::chrono::milliseconds(40)) != std::future_status::ready) { + double progress = getProgress(invoker); + if (progress > 0) { + printProgressBar(progress); + } + } + printProgressBar(1); + std::cout << std::endl; + } + + T *invoker = nullptr; + + double (*getProgress)(T *) = nullptr; +}; + +#endif //INC_22S_FINAL_PROJ_PROGRESSBAR_H diff --git a/utilities/StopWords.h b/utilities/StopWords.h new file mode 100644 index 0000000..93b65cd --- /dev/null +++ b/utilities/StopWords.h @@ -0,0 +1,684 @@ +// +// Created by Drew Harris on 4/9/2022. +// + +#ifndef INC_22S_FINAL_PROJ_STOPWORDS_H +#define INC_22S_FINAL_PROJ_STOPWORDS_H + +#include +#include + +struct StopWords { + std::unordered_set stopWords = { + "", + "a", + "able", + "about", + "above", + "abst", + "accordance", + "according", + "accordingly", + "across", + "act", + "actually", + "added", + "adj", + "affected", + "affecting", + "affects", + "after", + "afterwards", + "again", + "against", + "ah", + "all", + "almost", + "alone", + "along", + "already", + "also", + "although", + "always", + "am", + "among", + "amongst", + "an", + "and", + "announce", + "another", + "any", + "anybody", + "anyhow", + "anymore", + "anyone", + "anything", + "anyway", + "anyways", + "anywhere", + "apparently", + "approximately", + "are", + "aren", + "arent", + "arise", + "around", + "as", + "aside", + "ask", + "asking", + "at", + "auth", + "available", + "away", + "awfully", + "b", + "back", + "be", + "became", + "because", + "become", + "becomes", + "becoming", + "been", + "before", + "beforehand", + "begin", + "beginning", + "beginnings", + "begins", + "behind", + "being", + "believe", + "below", + "beside", + "besides", + "between", + "beyond", + "biol", + "both", + "brief", + "briefly", + "but", + "by", + "c", + "ca", + "came", + "can", + "cannot", + "cant", + "cause", + "causes", + "certain", + "certainly", + "co", + "com", + "come", + "comes", + "contain", + "containing", + "contains", + "could", + "couldnt", + "d", + "date", + "did", + "didnt", + "different", + "do", + "does", + "doesnt", + "doing", + "done", + "dont", + "down", + "downwards", + "due", + "during", + "e", + "each", + "ed", + "edu", + "effect", + "eg", + "eight", + "eighty", + "either", + "else", + "elsewhere", + "end", + "ending", + "enough", + "especially", + "et", + "et-al", + "etc", + "even", + "ever", + "every", + "everybody", + "everyone", + "everything", + "everywhere", + "ex", + "except", + "f", + "far", + "few", + "ff", + "fifth", + "first", + "five", + "fix", + "followed", + "following", + "follows", + "for", + "former", + "formerly", + "forth", + "found", + "four", + "from", + "further", + "furthermore", + "g", + "gave", + "get", + "gets", + "getting", + "give", + "given", + "gives", + "giving", + "go", + "goes", + "gone", + "got", + "gotten", + "h", + "had", + "happens", + "hardly", + "has", + "hasnt", + "have", + "havent", + "having", + "he", + "hed", + "hence", + "her", + "here", + "hereafter", + "hereby", + "herein", + "heres", + "hereupon", + "hers", + "herself", + "hes", + "hi", + "hid", + "him", + "himself", + "his", + "hither", + "home", + "how", + "howbeit", + "however", + "hundred", + "i", + "id", + "ie", + "if", + "ill", + "im", + "immediate", + "immediately", + "importance", + "important", + "in", + "inc", + "indeed", + "index", + "information", + "instead", + "into", + "invention", + "inward", + "is", + "isnt", + "it", + "itd", + "itll", + "its", + "itself", + "ive", + "j", + "just", + "k", + "keep keeps", + "kept", + "kg", + "km", + "know", + "known", + "knows", + "l", + "largely", + "last", + "lately", + "later", + "latter", + "latterly", + "least", + "less", + "lest", + "let", + "lets", + "like", + "liked", + "likely", + "line", + "little", + "Ill", + "look", + "looking", + "looks", + "ltd", + "m", + "made", + "mainly", + "make", + "makes", + "many", + "may", + "maybe", + "me", + "mean", + "means", + "meantime", + "meanwhile", + "merely", + "mg", + "might", + "million", + "miss", + "ml", + "more", + "moreover", + "most", + "mostly", + "mr", + "mrs", + "much", + "mug", + "must", + "my", + "myself", + "n", + "na", + "name", + "namely", + "nay", + "nd", + "near", + "nearly", + "necessarily", + "necessary", + "need", + "needs", + "neither", + "never", + "nevertheless", + "new", + "next", + "nine", + "ninety", + "no", + "nobody", + "non", + "none", + "nonetheless", + "noone", + "nor", + "normally", + "nos", + "not", + "noted", + "nothing", + "now", + "nowhere", + "o", + "obtain", + "obtained", + "obviously", + "of", + "off", + "often", + "oh", + "ok", + "okay", + "old", + "omitted", + "on", + "once", + "one", + "ones", + "only", + "onto", + "or", + "ord", + "other", + "others", + "otherwise", + "ought", + "our", + "ours", + "ourselves", + "out", + "outside", + "over", + "overall", + "owing", + "own", + "p", + "page", + "pages", + "part", + "particular", + "particularly", + "past", + "per", + "perhaps", + "placed", + "please", + "plus", + "pm", + "poorly", + "possible", + "possibly", + "potentially", + "pp", + "predominantly", + "present", + "previously", + "primarily", + "probably", + "promptly", + "proud", + "provides", + "put", + "q", + "que", + "quickly", + "quite", + "qv", + "r", + "ran", + "rather", + "rd", + "re", + "readily", + "really", + "recent", + "recently", + "ref", + "refs", + "regarding", + "regardless", + "regards", + "related", + "relatively", + "research", + "respectively", + "resulted", + "resulting", + "results", + "right", + "run", + "s", + "said", + "same", + "saw", + "say", + "saying", + "says", + "sec", + "section", + "see", + "seeing", + "seem", + "seemed", + "seeming", + "seems", + "seen", + "self", + "selves", + "sent", + "seven", + "several", + "shall", + "she", + "shed", + "shell", + "shes", + "should", + "shouldnt", + "show", + "showed", + "shown", + "showns", + "shows", + "significant", + "significantly", + "similar", + "similarly", + "since", + "six", + "slightly", + "so", + "some", + "somebody", + "somehow", + "someone", + "somethan", + "something", + "sometime", + "sometimes", + "somewhat", + "somewhere", + "soon", + "sorry", + "specifically", + "specified", + "specify", + "specifying", + "still", + "stop", + "strongly", + "sub", + "substantially", + "successfully", + "such", + "sufficiently", + "suggest", + "sup", + "sure t", + "take", + "taken", + "taking", + "tell", + "tends", + "th", + "than", + "thank", + "thanks", + "thanx", + "that", + "thatll", + "thats", + "thatve", + "the", + "their", + "theirs", + "them", + "themselves", + "then", + "thence", + "there", + "thereafter", + "thereby", + "thered", + "therefore", + "therein", + "therell", + "thereof", + "therere", + "theres", + "thereto", + "thereupon", + "thereve", + "these", + "they", + "theyd", + "theyll", + "theyre", + "theyve", + "think", + "this", + "those", + "thou", + "though", + "thoughh", + "thousand", + "throug", + "through", + "throughout", + "thru", + "thus", + "til", + "tip", + "to", + "together", + "too", + "took", + "toward", + "towards", + "tried", + "tries", + "truly", + "try", + "trying", + "ts", + "twice", + "two", + "u", + "un", + "under", + "unfortunately", + "unless", + "unlike", + "unlikely", + "until", + "unto", + "up", + "upon", + "ups", + "us", + "use", + "used", + "useful", + "usefully", + "usefulness", + "uses", + "using", + "usually", + "v", + "value", + "various", + "Ive", + "very", + "via", + "viz", + "vol", + "vols", + "vs", + "w", + "want", + "wants", + "was", + "wasnt", + "way", + "we", + "wed", + "welcome", + "we'll", + "went", + "were", + "werent", + "weve", + "what", + "whatever", + "whatll", + "whats", + "when", + "whence", + "whenever", + "where", + "whereafter", + "whereas", + "whereby", + "wherein", + "wheres", + "whereupon", + "wherever", + "whether", + "which", + "while", + "whim", + "whither", + "who", + "whod", + "whoever", + "whole", + "wholl", + "whom", + "whomever", + "whos", + "whose", + "why", + "widely", + "willing", + "wish", + "with", + "within", + "without", + "will", + "wont", + "words", + "world", + "would", + "wouldnt", + "www", + "x", + "y", + "yes", + "yet", + "you", + "youd", + "youll", + "your", + "youre", + "yours", + "yourself", + "yourselves", + "youve", + "z", + "zero", + }; +}; + +#endif //INC_22S_FINAL_PROJ_STOPWORDS_H diff --git a/utilities/typedefs.h b/utilities/typedefs.h new file mode 100644 index 0000000..38c26eb --- /dev/null +++ b/utilities/typedefs.h @@ -0,0 +1,17 @@ +// +// Created by Drew Harris on 4/27/2022. +// +#ifndef INC_22S_FINAL_PROJ_TYPEDEFS_H +#define INC_22S_FINAL_PROJ_TYPEDEFS_H + +#include +#include +#include "../avl_tree/avl_tree.h" +#include "tbb/concurrent_unordered_map.h" +#include "Article.h" + +typedef avl_tree>> WordTree; +typedef tbb::concurrent_unordered_map ArticleTable; +typedef std::pair ScoredId; + +#endif //INC_22S_FINAL_PROJ_TYPEDEFS_H