├── workloads └── small │ ├── r4.sql │ ├── r6.sql │ ├── r0 │ ├── r1 │ ├── r10 │ ├── r11 │ ├── r12 │ ├── r13 │ ├── r2 │ ├── r3 │ ├── r4 │ ├── r5 │ ├── r6 │ ├── r7 │ ├── r8 │ ├── r9 │ ├── r0.sql │ ├── r1.sql │ ├── r10.sql │ ├── r11.sql │ ├── r2.sql │ ├── r3.sql │ ├── r5.sql │ ├── r8.sql │ ├── r9.sql │ ├── r12.sql │ ├── small.init │ ├── r7.sql │ ├── r13.sql │ ├── small.result │ ├── small.work │ ├── small.work.sql │ ├── r0.tbl │ └── r4.tbl ├── run.sh ├── test ├── main.cpp ├── GTest.CMakeLists.txt ├── CMakeLists.txt ├── relation_test.cpp ├── parser_test.cpp └── operators_test.cpp ├── readme.txt ├── compile.sh ├── package.sh ├── run_test_harness.sh ├── src ├── include │ ├── utils.h │ ├── joiner.h │ ├── relation.h │ ├── parser.h │ └── operators.h ├── main │ ├── query2SQL.cpp │ ├── main.cpp │ └── harness.cpp ├── utils.cpp ├── relation.cpp ├── joiner.cpp ├── operators.cpp └── parser.cpp ├── .gitignore ├── CMakeLists.txt ├── Dockerfile └── README.md /workloads/small/r4.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r4 (c0 bigint,c1 bigint); 2 | copy r4 from 'r4.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r6.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r6 (c0 bigint,c1 bigint); 2 | copy r6 from 'r6.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r0 -------------------------------------------------------------------------------- /workloads/small/r1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r1 -------------------------------------------------------------------------------- /workloads/small/r10: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r10 -------------------------------------------------------------------------------- /workloads/small/r11: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r11 -------------------------------------------------------------------------------- /workloads/small/r12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r12 -------------------------------------------------------------------------------- /workloads/small/r13: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r13 -------------------------------------------------------------------------------- /workloads/small/r2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r2 -------------------------------------------------------------------------------- /workloads/small/r3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r3 -------------------------------------------------------------------------------- /workloads/small/r4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r4 -------------------------------------------------------------------------------- /workloads/small/r5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r5 -------------------------------------------------------------------------------- /workloads/small/r6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r6 -------------------------------------------------------------------------------- /workloads/small/r7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r7 -------------------------------------------------------------------------------- /workloads/small/r8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r8 -------------------------------------------------------------------------------- /workloads/small/r9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MIT-DB-Class/programming-contest-2021/HEAD/workloads/small/r9 -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 4 | ${DIR}/build/release/driver 5 | -------------------------------------------------------------------------------- /workloads/small/r0.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r0 (c0 bigint,c1 bigint,c2 bigint); 2 | copy r0 from 'r0.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r1.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r1 (c0 bigint,c1 bigint,c2 bigint); 2 | copy r1 from 'r1.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r10.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r10 (c0 bigint,c1 bigint,c2 bigint); 2 | copy r10 from 'r10.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r11.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r11 (c0 bigint,c1 bigint,c2 bigint); 2 | copy r11 from 'r11.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r2.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r2 (c0 bigint,c1 bigint,c2 bigint,c3 bigint); 2 | copy r2 from 'r2.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r3.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r3 (c0 bigint,c1 bigint,c2 bigint,c3 bigint); 2 | copy r3 from 'r3.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r5.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r5 (c0 bigint,c1 bigint,c2 bigint,c3 bigint); 2 | copy r5 from 'r5.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r8.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r8 (c0 bigint,c1 bigint,c2 bigint,c3 bigint); 2 | copy r8 from 'r8.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r9.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r9 (c0 bigint,c1 bigint,c2 bigint,c3 bigint,c4 bigint); 2 | copy r9 from 'r9.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r12.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r12 (c0 bigint,c1 bigint,c2 bigint,c3 bigint,c4 bigint); 2 | copy r12 from 'r12.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/small.init: -------------------------------------------------------------------------------- 1 | r0 2 | r1 3 | r2 4 | r3 5 | r4 6 | r5 7 | r6 8 | r7 9 | r8 10 | r9 11 | r10 12 | r11 13 | r12 14 | r13 15 | -------------------------------------------------------------------------------- /workloads/small/r7.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r7 (c0 bigint,c1 bigint,c2 bigint,c3 bigint,c4 bigint,c5 bigint); 2 | copy r7 from 'r7.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /workloads/small/r13.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE r13 (c0 bigint,c1 bigint,c2 bigint,c3 bigint,c4 bigint,c5 bigint,c6 bigint); 2 | copy r13 from 'r13.tbl' delimiter '|'; 3 | -------------------------------------------------------------------------------- /test/main.cpp: -------------------------------------------------------------------------------- 1 | #include "gtest/gtest.h" 2 | 3 | int main(int argc, char **argv) { 4 | testing::InitGoogleTest(&argc, argv); 5 | return RUN_ALL_TESTS(); 6 | } 7 | 8 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | Team Name: 2 | 3 | Member 1 4 | Name: 5 | MIT email: 6 | 7 | Member 2 8 | Name: 9 | MIT email: 10 | 11 | Member 3 12 | Name: 13 | MIT email: 14 | 15 | Member 4 16 | Name: 17 | MIT email: 18 | -------------------------------------------------------------------------------- /compile.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 4 | 5 | cd $DIR 6 | mkdir -p build/release 7 | cd build/release 8 | cmake -DCMAKE_BUILD_TYPE=Release -DFORCE_TESTS=OFF ../.. 9 | make -j8 10 | -------------------------------------------------------------------------------- /package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | COPYFILE_DISABLE=1 \ 4 | tar --dereference --exclude='build' \ 5 | --exclude='cmake-build-debug' \ 6 | --exclude='cmake-build-release' \ 7 | --exclude='submission.tar.gz' \ 8 | --exclude='workloads' -czf submission.tar.gz * 9 | -------------------------------------------------------------------------------- /run_test_harness.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 3 | 4 | WORKLOAD_DIR=${1-$DIR/workloads/small} 5 | WORKLOAD_DIR=$(echo $WORKLOAD_DIR | sed 's:/*$::') 6 | 7 | cd $WORKLOAD_DIR 8 | 9 | WORKLOAD=$(basename "$PWD") 10 | echo execute $WORKLOAD ... 11 | $DIR/build/release/harness *.init *.work *.result ../../run.sh 12 | -------------------------------------------------------------------------------- /src/include/utils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include "relation.h" 6 | 7 | class Utils { 8 | public: 9 | /// Create a dummy relation 10 | static Relation createRelation(uint64_t size, uint64_t num_columns); 11 | 12 | /// Store a relation in all formats 13 | static void storeRelation(std::ofstream &out, Relation &r, unsigned i); 14 | }; 15 | 16 | -------------------------------------------------------------------------------- /src/main/query2SQL.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "relation.h" 4 | #include "parser.h" 5 | 6 | int main(int argc, char *argv[]) { 7 | std::cout << "Transforms our query format to SQL" << std::endl; 8 | 9 | QueryInfo i; 10 | for (std::string line; std::getline(std::cin, line);) { 11 | i.parseQuery(line); 12 | std::cout << i.dumpSQL() << std::endl; 13 | } 14 | 15 | return 0; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /test/GTest.CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | 3 | project(googletest-download NONE) 4 | 5 | include(ExternalProject) 6 | ExternalProject_Add(googletest 7 | GIT_REPOSITORY https://github.com/google/googletest.git 8 | GIT_TAG 703bd9caab50b139428cea1aaff9974ebee5742e 9 | SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" 10 | BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" 11 | CONFIGURE_COMMAND "" 12 | BUILD_COMMAND "" 13 | INSTALL_COMMAND "" 14 | TEST_COMMAND "" 15 | ) 16 | -------------------------------------------------------------------------------- /src/main/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "joiner.h" 4 | #include "parser.h" 5 | 6 | int main(int argc, char *argv[]) { 7 | Joiner joiner; 8 | 9 | // Read join relations 10 | std::string line; 11 | while (getline(std::cin, line)) { 12 | if (line == "Done") break; 13 | joiner.addRelation(line.c_str()); 14 | } 15 | 16 | // Preparation phase (not timed) 17 | // Build histograms, indexes,... 18 | 19 | QueryInfo i; 20 | while (getline(std::cin, line)) { 21 | if (line == "F") continue; // End of a batch 22 | i.parseQuery(line); 23 | std::cout << joiner.join(i); 24 | } 25 | 26 | return 0; 27 | } 28 | -------------------------------------------------------------------------------- /src/include/joiner.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | #include "operators.h" 8 | #include "relation.h" 9 | #include "parser.h" 10 | 11 | class Joiner { 12 | private: 13 | /// The relations that might be joined 14 | std::vector relations_; 15 | 16 | public: 17 | /// Add relation 18 | void addRelation(const char *file_name); 19 | void addRelation(Relation &&relation); 20 | /// Get relation 21 | const Relation &getRelation(unsigned relation_id); 22 | /// Joins a given set of relations 23 | std::string join(QueryInfo &i); 24 | 25 | const std::vector &relations() const { return relations_; } 26 | 27 | private: 28 | /// Add scan to query 29 | std::unique_ptr addScan(std::set &used_relations, 30 | const SelectInfo &info, 31 | QueryInfo &query); 32 | }; 33 | 34 | -------------------------------------------------------------------------------- /src/utils.cpp: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | 3 | #include 4 | 5 | // Create a dummy column 6 | static void createColumn(std::vector &columns, 7 | uint64_t num_tuples) { 8 | auto col = new uint64_t[num_tuples]; 9 | columns.push_back(col); 10 | for (unsigned i = 0; i < num_tuples; ++i) { 11 | col[i] = i; 12 | } 13 | } 14 | 15 | // Create a dummy relation 16 | Relation Utils::createRelation(uint64_t size, uint64_t num_columns) { 17 | std::vector columns; 18 | for (unsigned i = 0; i < num_columns; ++i) { 19 | createColumn(columns, size); 20 | } 21 | return Relation(size, move(columns)); 22 | } 23 | 24 | // Store a relation in all formats 25 | void Utils::storeRelation(std::ofstream &out, Relation &r, unsigned i) { 26 | auto base_name = "r" + std::to_string(i); 27 | r.storeRelation(base_name); 28 | r.storeRelationCSV(base_name); 29 | r.dumpSQL(base_name, i); 30 | std::cout << base_name << "\n"; 31 | out << base_name << "\n"; 32 | } 33 | 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | 34 | # Build directory 35 | build/ 36 | cmake-build-* 37 | 38 | #==============================================================================# 39 | # File extensions to be ignored anywhere in the tree. 40 | #==============================================================================# 41 | # Temp files created by most text editors. 42 | *~ 43 | # Merge files created by git. 44 | *.orig 45 | # Java bytecode 46 | *.class 47 | # Byte compiled python modules. 48 | *.pyc 49 | # vim swap files 50 | .*.sw? 51 | .sw? 52 | # vscode settings directory 53 | .vscode 54 | # IntelliJ 55 | .idea/ 56 | #OS X specific files. 57 | .DS_store 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /workloads/small/small.result: -------------------------------------------------------------------------------- 1 | 26468015 32533054 2 | 5446 1009 1009 3 | 31831879 99876596 96864400 4 | 27314139 10766320 5 | 901496306 6 | NULL NULL NULL 7 | 281654532 282357938 841559324 8 | 187822 1036243 187822 9 | 1771710026 10 | 22766314 22766314 11 | 4634779503 627329747 627329747 12 | 41316024 267394881 9912745 13 | NULL NULL 14 | 9283 15 | 760151704 2430170493 2398594221 16 | NULL NULL NULL 17 | NULL NULL 18 | 3537544236 319415951 334176745 19 | 1645366150 1016283918 788397597 20 | 106938127 21 | 10014140 6526034 6526034 22 | NULL NULL 23 | 81073 24 | 265717 299090 25 | 179170057 26 | 65339549 18594932 12524601 27 | 744497 7983214 28 | 3377819501 3395449560 3377819501 29 | 5032407477 1146864253 30 | 255982520 31 | 23837499 33633760 23837499 32 | 1391837538 33 | 42163975 42772523 34 | 858534 35 | 109050774 109050774 36 | 444547 37 | 20504095556 20504095556 38 | 633080591 1050051803 39 | 5304879 1634121 40 | 259497861 259497861 1733901713 41 | 28536640 19373870 42 | 2135404 43 | 943464 3320201 44 | 178397045 178397045 213214740 45 | 852794 46 | 203444887 336237721 203444887 47 | 230229977 440364776 48 | 93772438 49 | 840902 45292 63810 50 | 103260116758 17416413522 59644305653 51 | -------------------------------------------------------------------------------- /src/include/relation.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | using RelationId = unsigned; 8 | 9 | class Relation { 10 | private: 11 | /// Owns memory (false if it was mmaped) 12 | bool owns_memory_; 13 | /// The number of tuples 14 | uint64_t size_; 15 | /// The join column containing the keys 16 | std::vector columns_; 17 | 18 | public: 19 | /// Constructor without mmap 20 | Relation(uint64_t size, std::vector &&columns) 21 | : owns_memory_(true), size_(size), columns_(columns) {} 22 | /// Constructor using mmap 23 | explicit Relation(const char *file_name); 24 | /// Delete copy constructor 25 | Relation(const Relation &other) = delete; 26 | /// Move constructor 27 | Relation(Relation &&other) = default; 28 | 29 | /// The destructor 30 | ~Relation(); 31 | 32 | /// Stores a relation into a file (binary) 33 | void storeRelation(const std::string &file_name); 34 | /// Stores a relation into a file (csv) 35 | void storeRelationCSV(const std::string &file_name); 36 | /// Dump SQL: Create and load table (PostgreSQL) 37 | void dumpSQL(const std::string &file_name, unsigned relation_id); 38 | 39 | /// The number of tuples 40 | uint64_t size() const { return size_; } 41 | /// The join column containing the keys 42 | const std::vector &columns() const { return columns_; } 43 | 44 | private: 45 | /// Loads data from a file 46 | void loadRelation(const char *file_name); 47 | }; 48 | 49 | -------------------------------------------------------------------------------- /test/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.10) 2 | 3 | # Download and unpack googletest at configure time 4 | configure_file(./GTest.CMakeLists.txt googletest-download/CMakeLists.txt) 5 | execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . 6 | WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/test/googletest-download") 7 | execute_process(COMMAND "${CMAKE_COMMAND}" --build . 8 | WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/test/googletest-download") 9 | 10 | # Prevent GoogleTest from overriding our compiler/linker options 11 | # when building with Visual Studio 12 | set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 13 | 14 | # Add googletest directly to our build. This adds 15 | # the following targets: gtest, gtest_main, gmock 16 | # and gmock_main 17 | add_subdirectory("${CMAKE_BINARY_DIR}/googletest-src" 18 | "${CMAKE_BINARY_DIR}/googletest-build") 19 | 20 | # The gtest/gmock targets carry header search path 21 | # dependencies automatically when using CMake 2.8.11 or 22 | # later. Otherwise we have to add them here ourselves. 23 | if (CMAKE_VERSION VERSION_LESS 2.8.11) 24 | include_directories("${gtest_SOURCE_DIR}/include" 25 | "${gmock_SOURCE_DIR}/include") 26 | endif () 27 | 28 | project(DBProgrammingCompetition) 29 | 30 | 31 | enable_testing() 32 | 33 | file(GLOB_RECURSE 34 | TEST_SOURCE_FILES 35 | CONFIGURE_DEPENDS 36 | *.cpp 37 | ) 38 | 39 | add_executable(tester ${TEST_SOURCE_FILES}) 40 | target_link_libraries(tester database gtest gtest_main pthread) 41 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required (VERSION 3.10) 2 | project (DBProgrammingCompetition) 3 | 4 | set(CMAKE_CXX_STANDARD 17) 5 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 6 | set(CMAKE_CXX_EXTENSIONS OFF) 7 | 8 | # set(CMAKE_C_COMPILER /usr/local/bin/gcc) 9 | # set(CMAKE_CXX_COMPILER /usr/local/bin/g++) 10 | 11 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -fsanitize=address -Wall") 12 | 13 | include_directories(${PROJECT_SOURCE_DIR}/src/include) 14 | 15 | # Get the list of all sources. 16 | file(GLOB_RECURSE 17 | PROJECT_SRCS 18 | CONFIGURE_DEPENDS 19 | ${PROJECT_SOURCE_DIR}/src/*.cpp 20 | ${PROJECT_SOURCE_DIR}/src/include/*.h 21 | ) 22 | 23 | # Remove non-library files 24 | list(REMOVE_ITEM PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/main/main.cpp) 25 | list(REMOVE_ITEM PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/main/harness.cpp) 26 | list(REMOVE_ITEM PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/main/query2SQL.cpp) 27 | 28 | add_library(database ${PROJECT_SRCS}) 29 | target_include_directories(database PUBLIC 30 | $ 31 | $ 32 | PRIVATE src) 33 | 34 | OPTION(FORCE_TESTS "Build tests, regardless of build type." ON) 35 | if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" OR FORCE_TESTS) 36 | add_subdirectory(test) 37 | endif() 38 | 39 | add_executable(driver src/main/main.cpp) 40 | target_link_libraries(driver database) 41 | 42 | # Interactive command line tool to translate our query format to SQL queries 43 | add_executable(query2SQL src/main/query2SQL.cpp) 44 | target_link_libraries(query2SQL database) 45 | 46 | # Test harness 47 | add_executable(harness src/main/harness.cpp) 48 | 49 | ADD_CUSTOM_TARGET(link_target ALL 50 | COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/workloads 51 | ${CMAKE_CURRENT_BINARY_DIR}/workloads) 52 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | # Install allowed packages. 4 | RUN apt-get update -qq \ 5 | && apt-get install -y \ 6 | curl sudo \ 7 | autoconf=2.69-11 \ 8 | automake=1:1.15.1-3ubuntu2 \ 9 | cmake=3.10.2-1ubuntu2.18.04.1 \ 10 | golang-1.8-go=1.8.3-2ubuntu1.18.04.1 golang-go=2:1.10~4ubuntu1 \ 11 | ant=1.10.5-3~18.04 \ 12 | maven=3.6.0-1~18.04.1 \ 13 | nodejs=8.10.0~dfsg-2ubuntu0.4 \ 14 | python=2.7.15~rc1-1 \ 15 | python3=3.6.7-1~18.04 \ 16 | gcc=4:7.4.0-1ubuntu2.3 \ 17 | gccgo=4:8.3.0-1ubuntu2.3 \ 18 | libjemalloc-dev=3.6.0-11 \ 19 | libboost-dev=1.65.1.0ubuntu1 \ 20 | clang-5.0=1:5.0.1-4 \ 21 | libtbb-dev=2017~U7-8 \ 22 | python-pip=9.0.1-2.3~ubuntu1.18.04.4 \ 23 | build-essential=12.4ubuntu1 \ 24 | ruby-full=1:2.5.1 \ 25 | && apt-get clean \ 26 | && rm -rf /var/lib/apt/lists/* 27 | 28 | # Install Oracle Java 16. 29 | RUN \ 30 | apt-get update && \ 31 | apt-get install -y software-properties-common && \ 32 | echo oracle-java16-installer shared/accepted-oracle-license-v1-2 select true | debconf-set-selections && \ 33 | add-apt-repository -y ppa:linuxuprising/java && \ 34 | apt-get update && \ 35 | apt-get install -y oracle-java16-installer && \ 36 | rm -rf /var/lib/apt/lists/* && \ 37 | rm -rf /var/cache/oracle-jdk8-installer 38 | 39 | # Install rust. 40 | RUN curl -sSf https://static.rust-lang.org/rustup.sh -o rustup.sh && sh rustup.sh --yes --revision=1.50.0 && rm rustup.sh 41 | 42 | # Create user with home directory 43 | RUN useradd -ms /bin/bash contest 44 | USER contest 45 | -------------------------------------------------------------------------------- /test/relation_test.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "gtest/gtest.h" 4 | 5 | #include "relation.h" 6 | #include "utils.h" 7 | 8 | static void ASSERT_RELATION_EQ(Relation &r1, Relation &r2) { 9 | ASSERT_EQ(r1.size(), r2.size()); 10 | ASSERT_EQ(r1.columns().size(), r2.columns().size()); 11 | for (unsigned i = 0; i < r1.columns().size(); ++i) { 12 | ASSERT_EQ(memcmp(r1.columns()[i], 13 | r2.columns()[i], 14 | r1.size() * sizeof(uint64_t)), 15 | 0); 16 | } 17 | } 18 | 19 | TEST(Relation, LoadAndStore) { 20 | Relation r1 = Utils::createRelation(1000, 5); 21 | 22 | r1.storeRelation("r1"); 23 | // Load it back from disk 24 | Relation r2("r1"); 25 | 26 | ASSERT_RELATION_EQ(r1, r2); 27 | } 28 | 29 | TEST(Relation, EmptyRelation) { 30 | Relation r1 = Utils::createRelation(0, 0); 31 | 32 | r1.storeRelation("r1"); 33 | 34 | // Load it back from disk 35 | Relation r2("r1"); 36 | 37 | ASSERT_RELATION_EQ(r1, r2); 38 | } 39 | 40 | TEST(Relation, StoreCsv) { 41 | Relation r1 = Utils::createRelation(1000, 2); 42 | 43 | r1.storeRelationCSV("r1"); 44 | 45 | std::ifstream infile("r1.tbl"); 46 | std::string line; 47 | 48 | unsigned i = 0; 49 | while (std::getline(infile, line)) { 50 | auto col = std::to_string(i) + "|"; 51 | auto expected = col + col; // 2 columns 52 | ASSERT_EQ(expected, line); 53 | i++; 54 | } 55 | } 56 | 57 | TEST(Relation, CreateSQL) { 58 | Relation r1 = Utils::createRelation(1, 5); 59 | 60 | r1.dumpSQL("r1", 3); 61 | 62 | std::ifstream infile("r1.sql"); 63 | std::string line; 64 | 65 | ASSERT_TRUE(std::getline(infile, line)); 66 | ASSERT_EQ( 67 | "CREATE TABLE r3 (c0 bigint,c1 bigint,c2 bigint,c3 bigint,c4 bigint);", 68 | line); 69 | ASSERT_TRUE(std::getline(infile, line)); 70 | ASSERT_EQ("copy r3 from 'r3.tbl' delimiter '|';", line); 71 | ASSERT_FALSE(std::getline(infile, line)); 72 | } 73 | 74 | -------------------------------------------------------------------------------- /workloads/small/small.work: -------------------------------------------------------------------------------- 1 | 3 0 1|0.2=1.0&0.1=2.0&0.2>3499|1.2 0.1 2 | 5 0|0.2=1.0&0.3=9881|1.1 0.2 1.0 3 | 9 0 2|0.1=1.0&1.0=2.2&0.0>12472|1.0 0.3 0.4 4 | 9 0|0.1=1.0&0.1>1150|0.3 1.0 5 | 6 1 12|0.1=1.0&1.0=2.2&0.0<62236|1.0 6 | 11 0 5|0.2=1.0&1.0=2.2&0.1=5784|2.3 0.1 0.1 7 | 4 1 2 11|0.1=1.0&1.0=2.1&1.0=3.1&0.1>2493|3.2 2.2 2.1 8 | 10 0 13 1|0.2=1.0&1.0=2.2&0.1=3.0&0.1=209|0.2 2.5 2.2 9 | 6 1 11 5|0.1=1.0&1.0=2.1&1.0=3.1&0.0>44809|2.0 10 | 3 1|0.1=1.0&0.2<3071|0.2 0.2 11 | F 12 | 3 1 12|0.1=1.0&1.0=2.1&0.0>26374|2.0 0.1 2.1 13 | 7 0|0.1=1.0&0.4<9936|0.4 0.0 1.0 14 | 2 1 9|0.1=1.0&1.0=2.2&0.1=10731|1.2 2.3 15 | 5 1|0.1=1.0&0.2=4531|1.2 16 | 3 0 13 13|0.2=1.0&1.0=2.1&2.1=3.2&0.2<74|1.2 2.5 3.5 17 | 9 1|0.2=1.0&0.1=1574|0.1 0.3 0.0 18 | 0 5|0.0=1.2&1.3=9855|1.1 0.1 19 | 11 0 2|0.2=1.0&1.0=2.2&0.1<5283|0.0 0.2 2.3 20 | 8 0 7|0.2=1.0&1.0=2.1&0.3>10502|1.1 1.2 2.5 21 | 9 1 11|0.2=1.0&1.0=2.1&1.0=0.2&0.3>3991|1.0 22 | 4 1|0.1=1.0&0.1<5730|1.1 0.1 0.1 23 | 3 1 5 7|0.1=1.0&1.0=2.1&1.0=3.2&0.2=4273|2.2 3.2 24 | F 25 | 9 1 12|0.2=1.0&1.0=2.1&2.2=1.0&0.2<2685|2.0 26 | 1 12 2|0.0=1.2&0.0=2.1&1.1=0.0&1.0>25064|0.2 1.3 27 | 2 0|0.2=1.0&0.2<787|0.0 28 | 1 6|0.0=1.1&1.1>10707|1.0 1.1 0.2 29 | 13 0 3|0.1=1.0&1.0=2.2&0.4=10571|2.3 0.0 30 | 12 1 6 12|0.2=1.0&1.0=2.1&0.1=3.2&3.0<33199|2.1 0.1 0.2 31 | 11 0 10 8|0.2=1.0&1.0=2.2&1.0=3.2&0.0<9872|3.3 2.2 32 | 11 0 2|0.2=1.0&1.0=2.2&0.1<4217|1.0 33 | 10 0|0.2=1.0&0.2>1791|1.0 1.2 0.2 34 | 7 1 3|0.2=1.0&1.0=2.1&0.3<8722|1.0 35 | 4 1 9|0.1=1.0&1.0=2.2&0.1>345|0.0 1.2 36 | 11 1 12 10|0.1=1.0&1.0=2.1&1.0=3.1&0.2=598|3.2 37 | 7 0 9|0.1=1.0&1.0=0.1&1.0=2.1&0.1>3791|1.2 1.2 38 | F 39 | 8 0 11|0.2=1.0&1.0=2.2&0.3=9477|0.2 40 | 0 13 7 10|0.0=1.2&0.0=2.1&0.0=3.2&1.2>295|3.2 0.0 41 | 7 1 3|0.2=1.0&1.0=2.1&1.0=0.2&0.2>6082|2.3 2.1 42 | 0 7 10 5|0.0=1.1&0.0=2.2&0.0=3.2&1.3=8728|2.0 3.1 43 | 1 4 9 8|0.0=1.1&0.0=2.2&0.0=3.1&1.1>2936|1.0 1.0 3.0 44 | 4 1|0.1=1.0&0.1<9795|1.2 0.1 45 | 11 1|0.1=1.0&0.1<1688|0.1 46 | 5 0|0.2=1.0&0.0<1171|1.0 0.3 47 | 4 1 6|0.1=1.0&1.0=2.1&0.0<13500|2.1 0.1 0.0 48 | 13 13|0.1=1.2&1.6=8220|1.5 49 | F 50 | 11 0 8|0.2=1.0&1.0=2.2&0.2>4041|1.0 1.1 1.0 51 | 8 0 10|0.2=1.0&1.0=2.2&0.3<9473|0.3 2.0 52 | 5 1 8|0.1=1.0&1.0=2.1&0.1<3560|1.2 53 | 13 0 2|0.2=1.0&1.0=0.1&1.0=2.2&0.1>4477|2.0 2.3 1.2 54 | 8 0 13 13|0.2=1.0&1.0=2.2&2.1=3.2&0.1>7860|3.3 2.1 3.6 55 | F 56 | -------------------------------------------------------------------------------- /src/relation.cpp: -------------------------------------------------------------------------------- 1 | #include "relation.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | // Stores a relation into a binary file 10 | void Relation::storeRelation(const std::string &file_name) { 11 | std::ofstream out_file; 12 | out_file.open(file_name, std::ios::out | std::ios::binary); 13 | out_file.write((char *) &size_, sizeof(size_)); 14 | auto numColumns = columns_.size(); 15 | out_file.write((char *) &numColumns, sizeof(size_t)); 16 | for (auto c : columns_) { 17 | out_file.write((char *) c, size_ * sizeof(uint64_t)); 18 | } 19 | out_file.close(); 20 | } 21 | 22 | // Stores a relation into a file (csv), e.g., for loading/testing it with a DBMS 23 | void Relation::storeRelationCSV(const std::string &file_name) { 24 | std::ofstream out_file; 25 | out_file.open(file_name + ".tbl", std::ios::out); 26 | for (uint64_t i = 0; i < size_; ++i) { 27 | for (auto &c : columns_) { 28 | out_file << c[i] << '|'; 29 | } 30 | out_file << "\n"; 31 | } 32 | } 33 | 34 | // Dump SQL: Create and load table (PostgreSQL) 35 | void Relation::dumpSQL(const std::string &file_name, unsigned relation_id) { 36 | std::ofstream out_file; 37 | out_file.open(file_name + ".sql", std::ios::out); 38 | // Create table statement 39 | out_file << "CREATE TABLE r" << relation_id << " ("; 40 | for (unsigned cId = 0; cId < columns_.size(); ++cId) { 41 | out_file << "c" << cId << " bigint" 42 | << (cId < columns_.size() - 1 ? "," : ""); 43 | } 44 | out_file << ");\n"; 45 | // Load from csv statement 46 | out_file << "copy r" << relation_id << " from 'r" << relation_id 47 | << ".tbl' delimiter '|';\n"; 48 | } 49 | 50 | void Relation::loadRelation(const char *file_name) { 51 | int fd = open(file_name, O_RDONLY); 52 | if (fd == -1) { 53 | std::cerr << "cannot open " << file_name << std::endl; 54 | throw; 55 | } 56 | 57 | // Obtain file size_ 58 | struct stat sb{}; 59 | if (fstat(fd, &sb) == -1) 60 | std::cerr << "fstat\n"; 61 | 62 | auto length = sb.st_size; 63 | 64 | char *addr = static_cast(mmap(nullptr, 65 | length, 66 | PROT_READ, 67 | MAP_PRIVATE, 68 | fd, 69 | 0u)); 70 | if (addr == MAP_FAILED) { 71 | std::cerr << "cannot mmap " << file_name << " of length " << length 72 | << std::endl; 73 | throw; 74 | } 75 | 76 | if (length < 16) { 77 | std::cerr << "relation_ file " << file_name 78 | << " does not contain a valid header" 79 | << std::endl; 80 | throw; 81 | } 82 | 83 | this->size_ = *reinterpret_cast(addr); 84 | addr += sizeof(size_); 85 | auto numColumns = *reinterpret_cast(addr); 86 | addr += sizeof(size_t); 87 | for (unsigned i = 0; i < numColumns; ++i) { 88 | this->columns_.push_back(reinterpret_cast(addr)); 89 | addr += size_ * sizeof(uint64_t); 90 | } 91 | } 92 | 93 | // Constructor that loads relation_ from disk 94 | Relation::Relation(const char *file_name) : owns_memory_(false), size_(0) { 95 | loadRelation(file_name); 96 | } 97 | 98 | // Destructor 99 | Relation::~Relation() { 100 | if (owns_memory_) { 101 | for (auto c : columns_) 102 | delete[] c; 103 | } 104 | } 105 | 106 | -------------------------------------------------------------------------------- /src/include/parser.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include "relation.h" 9 | 10 | struct SelectInfo { 11 | /// Relation id 12 | RelationId rel_id; 13 | /// Binding for the relation 14 | unsigned binding; 15 | /// Column id 16 | unsigned col_id; 17 | 18 | /// The constructor 19 | SelectInfo(RelationId rel_id, unsigned b, unsigned col_id) 20 | : rel_id(rel_id), binding(b), col_id(col_id) {}; 21 | /// The constructor if relation id does not matter 22 | SelectInfo(unsigned b, unsigned colId) : SelectInfo(-1, b, colId) {}; 23 | 24 | /// Equality operator 25 | inline bool operator==(const SelectInfo &o) const { 26 | return o.rel_id == rel_id && o.binding == binding && o.col_id == col_id; 27 | } 28 | /// Less Operator 29 | inline bool operator<(const SelectInfo &o) const { 30 | return (binding < o.binding) || (binding == o.binding && col_id < o.col_id); 31 | } 32 | 33 | /// Dump text format 34 | std::string dumpText(); 35 | /// Dump SQL 36 | std::string dumpSQL(bool add_sum = false); 37 | 38 | /// The delimiter used in our text format 39 | static const char delimiter = ' '; 40 | /// The delimiter used in SQL 41 | constexpr static const char delimiterSQL[] = ", "; 42 | }; 43 | 44 | struct FilterInfo { 45 | enum Comparison : char { Less = '<', Greater = '>', Equal = '=' }; 46 | /// Filter Column 47 | SelectInfo filter_column; 48 | /// Constant 49 | uint64_t constant; 50 | /// Comparison type 51 | Comparison comparison; 52 | 53 | /// The constructor 54 | FilterInfo(SelectInfo filter_column, uint64_t constant, Comparison comparison) 55 | : filter_column(filter_column), 56 | constant(constant), 57 | comparison(comparison) {}; 58 | 59 | /// Dump SQL 60 | std::string dumpSQL(); 61 | /// Dump text format 62 | std::string dumpText(); 63 | 64 | /// The delimiter used in our text format 65 | static const char delimiter = '&'; 66 | /// The delimiter used in SQL 67 | constexpr static const char delimiterSQL[] = " and "; 68 | }; 69 | 70 | static const std::vector comparisonTypes 71 | {FilterInfo::Comparison::Less, FilterInfo::Comparison::Greater, 72 | FilterInfo::Comparison::Equal}; 73 | 74 | struct PredicateInfo { 75 | /// Left 76 | SelectInfo left; 77 | /// Right 78 | SelectInfo right; 79 | 80 | /// The constructor 81 | PredicateInfo(SelectInfo left, SelectInfo right) 82 | : left(left), right(right) {}; 83 | 84 | /// Dump text format 85 | std::string dumpText(); 86 | /// Dump SQL 87 | std::string dumpSQL(); 88 | 89 | /// The delimiter used in our text format 90 | static const char delimiter = '&'; 91 | /// The delimiter used in SQL 92 | constexpr static const char delimiterSQL[] = " and "; 93 | }; 94 | 95 | class QueryInfo { 96 | private: 97 | /// The relation ids 98 | std::vector relation_ids_; 99 | /// The predicates 100 | std::vector predicates_; 101 | /// The filters 102 | std::vector filters_; 103 | /// The selections 104 | std::vector selections_; 105 | 106 | public: 107 | /// The empty constructor 108 | QueryInfo() = default; 109 | /// The constructor that parses a query 110 | explicit QueryInfo(std::string raw_query); 111 | 112 | /// Parse relation ids ... 113 | void parseRelationIds(std::string &raw_relations); 114 | /// Parse predicates r1.a=r2.b&r1.b=r3.c... 115 | void parsePredicates(std::string &raw_predicates); 116 | /// Parse selections r1.a r1.b r3.c... 117 | void parseSelections(std::string &raw_selections); 118 | /// Parse selections [RELATIONS]|[PREDICATES]|[SELECTS] 119 | void parseQuery(std::string &raw_query); 120 | 121 | /// Dump text format 122 | std::string dumpText(); 123 | /// Dump SQL 124 | std::string dumpSQL(); 125 | 126 | /// Reset query info 127 | void clear(); 128 | 129 | /// The relation ids 130 | const std::vector &relation_ids() const { return relation_ids_; } 131 | /// The predicates 132 | const std::vector &predicates() const { return predicates_; } 133 | /// The filters 134 | const std::vector &filters() const { return filters_; } 135 | /// The selections 136 | const std::vector &selections() const { return selections_; } 137 | 138 | private: 139 | /// Parse a single predicate 140 | void parsePredicate(std::string &raw_predicate); 141 | /// Resolve bindings of relation ids 142 | void resolveRelationIds(); 143 | 144 | }; 145 | 146 | -------------------------------------------------------------------------------- /src/joiner.cpp: -------------------------------------------------------------------------------- 1 | #include "joiner.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "parser.h" 13 | 14 | namespace { 15 | 16 | enum QueryGraphProvides { Left, Right, Both, None }; 17 | 18 | // Analyzes inputs of join 19 | QueryGraphProvides analyzeInputOfJoin(std::set &usedRelations, 20 | SelectInfo &leftInfo, 21 | SelectInfo &rightInfo) { 22 | bool used_left = usedRelations.count(leftInfo.binding); 23 | bool used_right = usedRelations.count(rightInfo.binding); 24 | 25 | if (used_left ^ used_right) 26 | return used_left ? QueryGraphProvides::Left : QueryGraphProvides::Right; 27 | if (used_left && used_right) 28 | return QueryGraphProvides::Both; 29 | return QueryGraphProvides::None; 30 | } 31 | 32 | } 33 | 34 | // Loads a relation_ from disk 35 | void Joiner::addRelation(const char *file_name) { 36 | relations_.emplace_back(file_name); 37 | } 38 | 39 | void Joiner::addRelation(Relation &&relation) { 40 | relations_.emplace_back(std::move(relation)); 41 | } 42 | 43 | // Loads a relation from disk 44 | const Relation &Joiner::getRelation(unsigned relation_id) { 45 | if (relation_id >= relations_.size()) { 46 | std::cerr << "Relation with id: " << relation_id << " does not exist" 47 | << std::endl; 48 | throw; 49 | } 50 | return relations_[relation_id]; 51 | } 52 | 53 | // Add scan to query 54 | std::unique_ptr Joiner::addScan(std::set &used_relations, 55 | const SelectInfo &info, 56 | QueryInfo &query) { 57 | used_relations.emplace(info.binding); 58 | std::vector filters; 59 | for (auto &f : query.filters()) { 60 | if (f.filter_column.binding == info.binding) { 61 | filters.emplace_back(f); 62 | } 63 | } 64 | return !filters.empty() ? 65 | std::make_unique(getRelation(info.rel_id), filters) 66 | : std::make_unique(getRelation(info.rel_id), 67 | info.binding); 68 | } 69 | 70 | // Executes a join query 71 | std::string Joiner::join(QueryInfo &query) { 72 | std::set used_relations; 73 | 74 | // We always start with the first join predicate and append the other joins 75 | // to it (--> left-deep join trees). You might want to choose a smarter 76 | // join ordering ... 77 | const auto &firstJoin = query.predicates()[0]; 78 | std::unique_ptr left, right; 79 | left = addScan(used_relations, firstJoin.left, query); 80 | right = addScan(used_relations, firstJoin.right, query); 81 | std::unique_ptr 82 | root = std::make_unique(move(left), move(right), firstJoin); 83 | 84 | auto predicates_copy = query.predicates(); 85 | for (unsigned i = 1; i < predicates_copy.size(); ++i) { 86 | auto &p_info = predicates_copy[i]; 87 | auto &left_info = p_info.left; 88 | auto &right_info = p_info.right; 89 | 90 | switch (analyzeInputOfJoin(used_relations, left_info, right_info)) { 91 | case QueryGraphProvides::Left:left = move(root); 92 | right = addScan(used_relations, right_info, query); 93 | root = std::make_unique(move(left), move(right), p_info); 94 | break; 95 | case QueryGraphProvides::Right: 96 | left = addScan(used_relations, 97 | left_info, 98 | query); 99 | right = move(root); 100 | root = std::make_unique(move(left), move(right), p_info); 101 | break; 102 | case QueryGraphProvides::Both: 103 | // All relations of this join are already used somewhere else in the 104 | // query. Thus, we have either a cycle in our join graph or more than 105 | // one join predicate per join. 106 | root = std::make_unique(move(root), p_info); 107 | break; 108 | case QueryGraphProvides::None: 109 | // Process this predicate later when we can connect it to the other 110 | // joins. We never have cross products. 111 | predicates_copy.push_back(p_info); 112 | break; 113 | }; 114 | } 115 | 116 | Checksum checksum(move(root), query.selections()); 117 | checksum.run(); 118 | 119 | std::stringstream out; 120 | auto &results = checksum.check_sums(); 121 | for (unsigned i = 0; i < results.size(); ++i) { 122 | out << (checksum.result_size() == 0 ? "NULL" : std::to_string(results[i])); 123 | if (i < results.size() - 1) 124 | out << " "; 125 | } 126 | out << "\n"; 127 | return out.str(); 128 | } 129 | 130 | -------------------------------------------------------------------------------- /workloads/small/small.work.sql: -------------------------------------------------------------------------------- 1 | SELECT SUM("1".c2), SUM("0".c1) FROM r3 "0", r0 "1", r1 "2" WHERE "0".c2="1".c0 and "0".c1="2".c0 and "0".c2>3499; 2 | SELECT SUM("1".c1), SUM("0".c2), SUM("1".c0) FROM r5 "0", r0 "1" WHERE "0".c2="1".c0 and "0".c3=9881; 3 | SELECT SUM("1".c0), SUM("0".c3), SUM("0".c4) FROM r9 "0", r0 "1", r2 "2" WHERE "0".c1="1".c0 and "1".c0="2".c2 and "0".c0>12472; 4 | SELECT SUM("0".c3), SUM("1".c0) FROM r9 "0", r0 "1" WHERE "0".c1="1".c0 and "0".c1>1150; 5 | SELECT SUM("1".c0) FROM r6 "0", r1 "1", r12 "2" WHERE "0".c1="1".c0 and "1".c0="2".c2 and "0".c0<62236; 6 | SELECT SUM("2".c3), SUM("0".c1), SUM("0".c1) FROM r11 "0", r0 "1", r5 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c1=5784; 7 | SELECT SUM("3".c2), SUM("2".c2), SUM("2".c1) FROM r4 "0", r1 "1", r2 "2", r11 "3" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "1".c0="3".c1 and "0".c1>2493; 8 | SELECT SUM("0".c2), SUM("2".c5), SUM("2".c2) FROM r10 "0", r0 "1", r13 "2", r1 "3" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c1="3".c0 and "0".c1=209; 9 | SELECT SUM("2".c0) FROM r6 "0", r1 "1", r11 "2", r5 "3" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "1".c0="3".c1 and "0".c0>44809; 10 | SELECT SUM("0".c2), SUM("0".c2) FROM r3 "0", r1 "1" WHERE "0".c1="1".c0 and "0".c2<3071; 11 | 12 | SELECT SUM("2".c0), SUM("0".c1), SUM("2".c1) FROM r3 "0", r1 "1", r12 "2" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "0".c0>26374; 13 | SELECT SUM("0".c4), SUM("0".c0), SUM("1".c0) FROM r7 "0", r0 "1" WHERE "0".c1="1".c0 and "0".c4<9936; 14 | SELECT SUM("1".c2), SUM("2".c3) FROM r2 "0", r1 "1", r9 "2" WHERE "0".c1="1".c0 and "1".c0="2".c2 and "0".c1=10731; 15 | SELECT SUM("1".c2) FROM r5 "0", r1 "1" WHERE "0".c1="1".c0 and "0".c2=4531; 16 | SELECT SUM("1".c2), SUM("2".c5), SUM("3".c5) FROM r3 "0", r0 "1", r13 "2", r13 "3" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "2".c1="3".c2 and "0".c2<74; 17 | SELECT SUM("0".c1), SUM("0".c3), SUM("0".c0) FROM r9 "0", r1 "1" WHERE "0".c2="1".c0 and "0".c1=1574; 18 | SELECT SUM("1".c1), SUM("0".c1) FROM r0 "0", r5 "1" WHERE "0".c0="1".c2 and "1".c3=9855; 19 | SELECT SUM("0".c0), SUM("0".c2), SUM("2".c3) FROM r11 "0", r0 "1", r2 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c1<5283; 20 | SELECT SUM("1".c1), SUM("1".c2), SUM("2".c5) FROM r8 "0", r0 "1", r7 "2" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "0".c3>10502; 21 | SELECT SUM("1".c0) FROM r9 "0", r1 "1", r11 "2" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "1".c0="0".c2 and "0".c3>3991; 22 | SELECT SUM("1".c1), SUM("0".c1), SUM("0".c1) FROM r4 "0", r1 "1" WHERE "0".c1="1".c0 and "0".c1<5730; 23 | SELECT SUM("2".c2), SUM("3".c2) FROM r3 "0", r1 "1", r5 "2", r7 "3" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "1".c0="3".c2 and "0".c2=4273; 24 | 25 | SELECT SUM("2".c0) FROM r9 "0", r1 "1", r12 "2" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "2".c2="1".c0 and "0".c2<2685; 26 | SELECT SUM("0".c2), SUM("1".c3) FROM r1 "0", r12 "1", r2 "2" WHERE "0".c0="1".c2 and "0".c0="2".c1 and "1".c1="0".c0 and "1".c0>25064; 27 | SELECT SUM("0".c0) FROM r2 "0", r0 "1" WHERE "0".c2="1".c0 and "0".c2<787; 28 | SELECT SUM("1".c0), SUM("1".c1), SUM("0".c2) FROM r1 "0", r6 "1" WHERE "0".c0="1".c1 and "1".c1>10707; 29 | SELECT SUM("2".c3), SUM("0".c0) FROM r13 "0", r0 "1", r3 "2" WHERE "0".c1="1".c0 and "1".c0="2".c2 and "0".c4=10571; 30 | SELECT SUM("2".c1), SUM("0".c1), SUM("0".c2) FROM r12 "0", r1 "1", r6 "2", r12 "3" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "0".c1="3".c2 and "3".c0<33199; 31 | SELECT SUM("3".c3), SUM("2".c2) FROM r11 "0", r0 "1", r10 "2", r8 "3" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "1".c0="3".c2 and "0".c0<9872; 32 | SELECT SUM("1".c0) FROM r11 "0", r0 "1", r2 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c1<4217; 33 | SELECT SUM("1".c0), SUM("1".c2), SUM("0".c2) FROM r10 "0", r0 "1" WHERE "0".c2="1".c0 and "0".c2>1791; 34 | SELECT SUM("1".c0) FROM r7 "0", r1 "1", r3 "2" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "0".c3<8722; 35 | SELECT SUM("0".c0), SUM("1".c2) FROM r4 "0", r1 "1", r9 "2" WHERE "0".c1="1".c0 and "1".c0="2".c2 and "0".c1>345; 36 | SELECT SUM("3".c2) FROM r11 "0", r1 "1", r12 "2", r10 "3" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "1".c0="3".c1 and "0".c2=598; 37 | SELECT SUM("1".c2), SUM("1".c2) FROM r7 "0", r0 "1", r9 "2" WHERE "0".c1="1".c0 and "1".c0="0".c1 and "1".c0="2".c1 and "0".c1>3791; 38 | 39 | SELECT SUM("0".c2) FROM r8 "0", r0 "1", r11 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c3=9477; 40 | SELECT SUM("3".c2), SUM("0".c0) FROM r0 "0", r13 "1", r7 "2", r10 "3" WHERE "0".c0="1".c2 and "0".c0="2".c1 and "0".c0="3".c2 and "1".c2>295; 41 | SELECT SUM("2".c3), SUM("2".c1) FROM r7 "0", r1 "1", r3 "2" WHERE "0".c2="1".c0 and "1".c0="2".c1 and "1".c0="0".c2 and "0".c2>6082; 42 | SELECT SUM("2".c0), SUM("3".c1) FROM r0 "0", r7 "1", r10 "2", r5 "3" WHERE "0".c0="1".c1 and "0".c0="2".c2 and "0".c0="3".c2 and "1".c3=8728; 43 | SELECT SUM("1".c0), SUM("1".c0), SUM("3".c0) FROM r1 "0", r4 "1", r9 "2", r8 "3" WHERE "0".c0="1".c1 and "0".c0="2".c2 and "0".c0="3".c1 and "1".c1>2936; 44 | SELECT SUM("1".c2), SUM("0".c1) FROM r4 "0", r1 "1" WHERE "0".c1="1".c0 and "0".c1<9795; 45 | SELECT SUM("0".c1) FROM r11 "0", r1 "1" WHERE "0".c1="1".c0 and "0".c1<1688; 46 | SELECT SUM("1".c0), SUM("0".c3) FROM r5 "0", r0 "1" WHERE "0".c2="1".c0 and "0".c0<1171; 47 | SELECT SUM("2".c1), SUM("0".c1), SUM("0".c0) FROM r4 "0", r1 "1", r6 "2" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "0".c0<13500; 48 | SELECT SUM("1".c5) FROM r13 "0", r13 "1" WHERE "0".c1="1".c2 and "1".c6=8220; 49 | 50 | SELECT SUM("1".c0), SUM("1".c1), SUM("1".c0) FROM r11 "0", r0 "1", r8 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c2>4041; 51 | SELECT SUM("0".c3), SUM("2".c0) FROM r8 "0", r0 "1", r10 "2" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "0".c3<9473; 52 | SELECT SUM("1".c2) FROM r5 "0", r1 "1", r8 "2" WHERE "0".c1="1".c0 and "1".c0="2".c1 and "0".c1<3560; 53 | SELECT SUM("2".c0), SUM("2".c3), SUM("1".c2) FROM r13 "0", r0 "1", r2 "2" WHERE "0".c2="1".c0 and "1".c0="0".c1 and "1".c0="2".c2 and "0".c1>4477; 54 | SELECT SUM("3".c3), SUM("2".c1), SUM("3".c6) FROM r8 "0", r0 "1", r13 "2", r13 "3" WHERE "0".c2="1".c0 and "1".c0="2".c2 and "2".c1="3".c2 and "0".c1>7860; 55 | 56 | -------------------------------------------------------------------------------- /src/include/operators.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "relation.h" 13 | #include "parser.h" 14 | 15 | namespace std { 16 | /// Simple hash function to enable use with unordered_map 17 | template<> 18 | struct hash { 19 | std::size_t operator()(SelectInfo const &s) const noexcept { 20 | return s.binding ^ (s.col_id << 5); 21 | } 22 | }; 23 | }; 24 | 25 | /// Operators materialize their entire result 26 | class Operator { 27 | protected: 28 | /// Mapping from select info to data 29 | std::unordered_map select_to_result_col_id_; 30 | /// The materialized results 31 | std::vector result_columns_; 32 | /// The tmp results 33 | std::vector> tmp_results_; 34 | /// The result size 35 | uint64_t result_size_ = 0; 36 | 37 | public: 38 | /// The destructor 39 | virtual ~Operator() = default;; 40 | 41 | /// Require a column and add it to results 42 | virtual bool require(SelectInfo info) = 0; 43 | /// Resolves a column 44 | unsigned resolve(SelectInfo info) { 45 | assert(select_to_result_col_id_.find(info) != select_to_result_col_id_.end()); 46 | return select_to_result_col_id_[info]; 47 | } 48 | /// Run 49 | virtual void run() = 0; 50 | /// Get materialized results 51 | virtual std::vector getResults(); 52 | 53 | uint64_t result_size() const { return result_size_; } 54 | }; 55 | 56 | class Scan : public Operator { 57 | protected: 58 | /// The relation 59 | const Relation &relation_; 60 | /// The name of the relation in the query 61 | unsigned relation_binding_; 62 | 63 | public: 64 | /// The constructor 65 | Scan(const Relation &r, unsigned relation_binding) 66 | : relation_(r), relation_binding_(relation_binding) {}; 67 | /// Require a column and add it to results 68 | bool require(SelectInfo info) override; 69 | /// Run 70 | void run() override; 71 | /// Get materialized results 72 | virtual std::vector getResults() override; 73 | }; 74 | 75 | class FilterScan : public Scan { 76 | private: 77 | /// The filter info 78 | std::vector filters_; 79 | /// The input data 80 | std::vector input_data_; 81 | 82 | private: 83 | /// Apply filter 84 | bool applyFilter(uint64_t id, FilterInfo &f); 85 | /// Copy tuple to result 86 | void copy2Result(uint64_t id); 87 | 88 | public: 89 | /// The constructor 90 | FilterScan(const Relation &r, std::vector filters) 91 | : Scan(r, 92 | filters[0].filter_column.binding), 93 | filters_(filters) {}; 94 | /// The constructor 95 | FilterScan(const Relation &r, FilterInfo &filter_info) 96 | : FilterScan(r, 97 | std::vector< 98 | FilterInfo>{ 99 | filter_info}) {}; 100 | 101 | /// Require a column and add it to results 102 | bool require(SelectInfo info) override; 103 | /// Run 104 | void run() override; 105 | /// Get materialized results 106 | virtual std::vector getResults() override { 107 | return Operator::getResults(); 108 | } 109 | }; 110 | 111 | class Join : public Operator { 112 | private: 113 | /// The input operators 114 | std::unique_ptr left_, right_; 115 | /// The join predicate info 116 | PredicateInfo p_info_; 117 | 118 | using HT = std::unordered_multimap; 119 | 120 | /// The hash table for the join 121 | HT hash_table_; 122 | /// Columns that have to be materialized 123 | std::unordered_set requested_columns_; 124 | /// Left/right columns that have been requested 125 | std::vector requested_columns_left_, requested_columns_right_; 126 | 127 | /// The entire input data of left and right 128 | std::vector left_input_data_, right_input_data_; 129 | /// The input data that has to be copied 130 | std::vector copy_left_data_, copy_right_data_; 131 | 132 | private: 133 | /// Copy tuple to result 134 | void copy2Result(uint64_t left_id, uint64_t right_id); 135 | /// Create mapping for bindings 136 | void createMappingForBindings(); 137 | 138 | public: 139 | /// The constructor 140 | Join(std::unique_ptr &&left, 141 | std::unique_ptr &&right, 142 | const PredicateInfo &p_info) 143 | : left_(std::move(left)), right_(std::move(right)), p_info_(p_info) {}; 144 | /// Require a column and add it to results 145 | bool require(SelectInfo info) override; 146 | /// Run 147 | void run() override; 148 | }; 149 | 150 | class SelfJoin : public Operator { 151 | private: 152 | /// The input operators 153 | std::unique_ptr input_; 154 | /// The join predicate info 155 | PredicateInfo p_info_; 156 | /// The required IUs 157 | std::set required_IUs_; 158 | 159 | /// The entire input data 160 | std::vector input_data_; 161 | /// The input data that has to be copied 162 | std::vector copy_data_; 163 | 164 | private: 165 | /// Copy tuple to result 166 | void copy2Result(uint64_t id); 167 | 168 | public: 169 | /// The constructor 170 | SelfJoin(std::unique_ptr &&input, PredicateInfo &p_info) 171 | : input_(std::move(input)), p_info_(p_info) {}; 172 | /// Require a column and add it to results 173 | bool require(SelectInfo info) override; 174 | /// Run 175 | void run() override; 176 | }; 177 | 178 | class Checksum : public Operator { 179 | private: 180 | /// The input operator 181 | std::unique_ptr input_; 182 | /// The join predicate info 183 | const std::vector col_info_; 184 | 185 | std::vector check_sums_; 186 | 187 | public: 188 | /// The constructor 189 | Checksum(std::unique_ptr &&input, 190 | std::vector col_info) 191 | : input_(std::move(input)), col_info_(std::move(col_info)) {}; 192 | /// Request a column and add it to results 193 | bool require(SelectInfo info) override { 194 | // check sum is always on the highest level 195 | // and thus should never request anything 196 | throw; 197 | } 198 | /// Run 199 | void run() override; 200 | 201 | const std::vector &check_sums() { return check_sums_; } 202 | }; 203 | 204 | -------------------------------------------------------------------------------- /test/parser_test.cpp: -------------------------------------------------------------------------------- 1 | #include "gtest/gtest.h" 2 | 3 | #include "parser.h" 4 | 5 | TEST(Parser, ParseRelations) { 6 | QueryInfo i; 7 | const auto &relation_ids = i.relation_ids(); 8 | std::string rel("0 1"); 9 | i.parseRelationIds(rel); 10 | 11 | ASSERT_EQ(relation_ids.size(), 2u); 12 | ASSERT_EQ(relation_ids[0], 0u); 13 | ASSERT_EQ(relation_ids[1], 1u); 14 | } 15 | 16 | static void assertPredicateEqual(const PredicateInfo &p_info, 17 | unsigned left_rel, 18 | unsigned left_col, 19 | unsigned right_rel, 20 | unsigned right_col) { 21 | ASSERT_EQ(p_info.left.rel_id, left_rel); 22 | ASSERT_EQ(p_info.left.col_id, left_col); 23 | ASSERT_EQ(p_info.right.rel_id, right_rel); 24 | ASSERT_EQ(p_info.right.col_id, right_col); 25 | } 26 | 27 | static void assertPredicateBindingEqual(const PredicateInfo &p_info, 28 | unsigned leftBind, 29 | unsigned left_col, 30 | unsigned rightBind, 31 | unsigned right_col) { 32 | ASSERT_EQ(p_info.left.binding, leftBind); 33 | ASSERT_EQ(p_info.left.col_id, left_col); 34 | ASSERT_EQ(p_info.right.binding, rightBind); 35 | ASSERT_EQ(p_info.right.col_id, right_col); 36 | } 37 | 38 | static void assertSelectEqual(const SelectInfo &s_info, 39 | unsigned rel, 40 | unsigned col) { 41 | ASSERT_EQ(s_info.rel_id, rel); 42 | ASSERT_EQ(s_info.col_id, col); 43 | } 44 | 45 | static void assertSelectBindingEqual(const SelectInfo &s_info, 46 | unsigned binding, 47 | unsigned col) { 48 | ASSERT_EQ(s_info.binding, binding); 49 | ASSERT_EQ(s_info.col_id, col); 50 | } 51 | 52 | static void assertFilterBindingEqual(const FilterInfo &f_info, 53 | unsigned binding, 54 | unsigned col, 55 | uint64_t constant, 56 | FilterInfo::Comparison comparison) { 57 | assertSelectBindingEqual(f_info.filter_column, binding, col); 58 | ASSERT_EQ(f_info.constant, constant); 59 | ASSERT_EQ(f_info.comparison, comparison); 60 | } 61 | 62 | static void assertFilterEqual(const FilterInfo &f_info, 63 | unsigned rel, 64 | unsigned col, 65 | uint64_t constant, 66 | FilterInfo::Comparison comparison) { 67 | assertSelectEqual(f_info.filter_column, rel, col); 68 | ASSERT_EQ(f_info.constant, constant); 69 | ASSERT_EQ(f_info.comparison, comparison); 70 | } 71 | 72 | TEST(Parser, ParsePredicates) { 73 | std::string preds("0.2=1.3&2.2=3.3"); 74 | QueryInfo i; 75 | const auto &predicates = i.predicates(); 76 | const auto &filters = i.filters(); 77 | i.parsePredicates(preds); 78 | 79 | ASSERT_EQ(predicates.size(), 2u); 80 | assertPredicateBindingEqual(predicates[0], 0, 2, 1, 3); 81 | assertPredicateBindingEqual(predicates[1], 2, 2, 3, 3); 82 | 83 | i.clear(); 84 | std::string empty_preds(""); 85 | i.parsePredicates(empty_preds); 86 | ASSERT_EQ(predicates.size(), 0u); 87 | 88 | i.clear(); 89 | std::string only_filters("0.1=111&1.2<222&1.1>333"); 90 | i.parsePredicates(only_filters); 91 | ASSERT_EQ(predicates.size(), 0u); 92 | ASSERT_EQ(filters.size(), 3u); 93 | assertFilterBindingEqual(filters[0], 94 | 0, 95 | 1, 96 | 111, 97 | FilterInfo::Comparison::Equal); 98 | assertFilterBindingEqual(filters[1], 1, 2, 222, FilterInfo::Comparison::Less); 99 | assertFilterBindingEqual(filters[2], 100 | 1, 101 | 1, 102 | 333, 103 | FilterInfo::Comparison::Greater); 104 | 105 | i.clear(); 106 | std::string mixedPredicatesAndFilters("0.1=111&1.2=2.1&1.2<333"); 107 | i.parsePredicates(mixedPredicatesAndFilters); 108 | ASSERT_EQ(predicates.size(), 1u); 109 | assertPredicateBindingEqual(predicates[0], 1, 2, 2, 1); 110 | ASSERT_EQ(filters.size(), 2u); 111 | assertFilterBindingEqual(filters[0], 112 | 0, 113 | 1, 114 | 111, 115 | FilterInfo::Comparison::Equal); 116 | assertFilterBindingEqual(filters[1], 1, 2, 333, FilterInfo::Comparison::Less); 117 | } 118 | 119 | TEST(Parser, ParseSelections) { 120 | std::string raw_selections("0.1 0.2 1.2 4.4"); 121 | QueryInfo i; 122 | const auto &selections = i.selections(); 123 | i.parseSelections(raw_selections); 124 | 125 | ASSERT_EQ(selections.size(), 4u); 126 | assertSelectBindingEqual(selections[0], 0, 1); 127 | assertSelectBindingEqual(selections[1], 0, 2); 128 | assertSelectBindingEqual(selections[2], 1, 2); 129 | assertSelectBindingEqual(selections[3], 4, 4); 130 | 131 | i.clear(); 132 | 133 | std::string empty_select; 134 | i.parseSelections(empty_select); 135 | ASSERT_EQ(selections.size(), 0u); 136 | } 137 | 138 | TEST(Parser, ParseQuery) { 139 | std::string raw_query("0 2 4|0.1=1.1&0.0=2.1&1.0=2.0&1.0>3|0.1 1.4 2.2"); 140 | QueryInfo i(raw_query); 141 | 142 | ASSERT_EQ(i.relation_ids().size(), 3u); 143 | ASSERT_EQ(i.relation_ids()[0], 0u); 144 | ASSERT_EQ(i.relation_ids()[1], 2u); 145 | ASSERT_EQ(i.relation_ids()[2], 4u); 146 | 147 | ASSERT_EQ(i.predicates().size(), 3u); 148 | assertPredicateEqual(i.predicates()[0], 0, 1, 2, 1); 149 | assertPredicateEqual(i.predicates()[1], 0, 0, 4, 1); 150 | assertPredicateEqual(i.predicates()[2], 2, 0, 4, 0); 151 | 152 | assertFilterEqual(i.filters()[0], 2, 0, 3, FilterInfo::Comparison::Greater); 153 | 154 | ASSERT_EQ(i.selections().size(), 3u); 155 | assertSelectEqual(i.selections()[0], 0, 1); 156 | assertSelectEqual(i.selections()[1], 2, 4); 157 | assertSelectEqual(i.selections()[2], 4, 2); 158 | } 159 | 160 | TEST(Parser, DumpSQL) { 161 | std::string raw_query("0 2|0.1=1.1&0.0=1.0&0.1=5|0.1 1.4"); 162 | QueryInfo i(raw_query); 163 | 164 | auto sql = i.dumpSQL(); 165 | ASSERT_EQ( 166 | "SELECT SUM(\"0\".c1), SUM(\"1\".c4) FROM r0 \"0\", r2 \"1\" WHERE \"0\".c1=\"1\".c1 and \"0\".c0=\"1\".c0 and \"0\".c1=5;", 167 | sql); 168 | } 169 | 170 | TEST(Parser, DumpText) { 171 | std::string raw_query("0 2|0.1=1.1&0.0=1.0&1.2=3|0.1 1.4"); 172 | QueryInfo i(raw_query); 173 | 174 | ASSERT_EQ(i.dumpText(), raw_query); 175 | } 176 | -------------------------------------------------------------------------------- /src/operators.cpp: -------------------------------------------------------------------------------- 1 | #include "operators.h" 2 | 3 | #include 4 | 5 | // Get materialized results 6 | std::vector Operator::getResults() { 7 | std::vector result_vector; 8 | for (auto &c : tmp_results_) { 9 | result_vector.push_back(c.data()); 10 | } 11 | return result_vector; 12 | } 13 | 14 | // Require a column and add it to results 15 | bool Scan::require(SelectInfo info) { 16 | if (info.binding != relation_binding_) 17 | return false; 18 | assert(info.col_id < relation_.columns().size()); 19 | result_columns_.push_back(relation_.columns()[info.col_id]); 20 | select_to_result_col_id_[info] = result_columns_.size() - 1; 21 | return true; 22 | } 23 | 24 | // Run 25 | void Scan::run() { 26 | // Nothing to do 27 | result_size_ = relation_.size(); 28 | } 29 | 30 | // Get materialized results 31 | std::vector Scan::getResults() { 32 | return result_columns_; 33 | } 34 | 35 | // Require a column and add it to results 36 | bool FilterScan::require(SelectInfo info) { 37 | if (info.binding != relation_binding_) 38 | return false; 39 | assert(info.col_id < relation_.columns().size()); 40 | if (select_to_result_col_id_.find(info) == select_to_result_col_id_.end()) { 41 | // Add to results 42 | input_data_.push_back(relation_.columns()[info.col_id]); 43 | tmp_results_.emplace_back(); 44 | unsigned colId = tmp_results_.size() - 1; 45 | select_to_result_col_id_[info] = colId; 46 | } 47 | return true; 48 | } 49 | 50 | // Copy to result 51 | void FilterScan::copy2Result(uint64_t id) { 52 | for (unsigned cId = 0; cId < input_data_.size(); ++cId) 53 | tmp_results_[cId].push_back(input_data_[cId][id]); 54 | ++result_size_; 55 | } 56 | 57 | // Apply filter 58 | bool FilterScan::applyFilter(uint64_t i, FilterInfo &f) { 59 | auto compare_col = relation_.columns()[f.filter_column.col_id]; 60 | auto constant = f.constant; 61 | switch (f.comparison) { 62 | case FilterInfo::Comparison::Equal:return compare_col[i] == constant; 63 | case FilterInfo::Comparison::Greater:return compare_col[i] > constant; 64 | case FilterInfo::Comparison::Less:return compare_col[i] < constant; 65 | }; 66 | return false; 67 | } 68 | 69 | // Run 70 | void FilterScan::run() { 71 | for (uint64_t i = 0; i < relation_.size(); ++i) { 72 | bool pass = true; 73 | for (auto &f : filters_) { 74 | pass &= applyFilter(i, f); 75 | } 76 | if (pass) 77 | copy2Result(i); 78 | } 79 | } 80 | 81 | // Require a column and add it to results 82 | bool Join::require(SelectInfo info) { 83 | if (requested_columns_.count(info) == 0) { 84 | bool success = false; 85 | if (left_->require(info)) { 86 | requested_columns_left_.emplace_back(info); 87 | success = true; 88 | } else if (right_->require(info)) { 89 | success = true; 90 | requested_columns_right_.emplace_back(info); 91 | } 92 | if (!success) 93 | return false; 94 | 95 | tmp_results_.emplace_back(); 96 | requested_columns_.emplace(info); 97 | } 98 | return true; 99 | } 100 | 101 | // Copy to result 102 | void Join::copy2Result(uint64_t left_id, uint64_t right_id) { 103 | unsigned rel_col_id = 0; 104 | for (unsigned cId = 0; cId < copy_left_data_.size(); ++cId) 105 | tmp_results_[rel_col_id++].push_back(copy_left_data_[cId][left_id]); 106 | 107 | for (unsigned cId = 0; cId < copy_right_data_.size(); ++cId) 108 | tmp_results_[rel_col_id++].push_back(copy_right_data_[cId][right_id]); 109 | ++result_size_; 110 | } 111 | 112 | // Run 113 | void Join::run() { 114 | left_->require(p_info_.left); 115 | right_->require(p_info_.right); 116 | left_->run(); 117 | right_->run(); 118 | 119 | 120 | // Use smaller input_ for build 121 | if (left_->result_size() > right_->result_size()) { 122 | std::swap(left_, right_); 123 | std::swap(p_info_.left, p_info_.right); 124 | std::swap(requested_columns_left_, requested_columns_right_); 125 | } 126 | 127 | auto left_input_data = left_->getResults(); 128 | auto right_input_data = right_->getResults(); 129 | 130 | // Resolve the input_ columns_ 131 | unsigned res_col_id = 0; 132 | for (auto &info : requested_columns_left_) { 133 | copy_left_data_.push_back(left_input_data[left_->resolve(info)]); 134 | select_to_result_col_id_[info] = res_col_id++; 135 | } 136 | for (auto &info : requested_columns_right_) { 137 | copy_right_data_.push_back(right_input_data[right_->resolve(info)]); 138 | select_to_result_col_id_[info] = res_col_id++; 139 | } 140 | 141 | auto left_col_id = left_->resolve(p_info_.left); 142 | auto right_col_id = right_->resolve(p_info_.right); 143 | 144 | // Build phase 145 | auto left_key_column = left_input_data[left_col_id]; 146 | hash_table_.reserve(left_->result_size() * 2); 147 | for (uint64_t i = 0, limit = i + left_->result_size(); i != limit; ++i) { 148 | hash_table_.emplace(left_key_column[i], i); 149 | } 150 | // Probe phase 151 | auto right_key_column = right_input_data[right_col_id]; 152 | for (uint64_t i = 0, limit = i + right_->result_size(); i != limit; ++i) { 153 | auto rightKey = right_key_column[i]; 154 | auto range = hash_table_.equal_range(rightKey); 155 | for (auto iter = range.first; iter != range.second; ++iter) { 156 | copy2Result(iter->second, i); 157 | } 158 | } 159 | } 160 | 161 | // Copy to result 162 | void SelfJoin::copy2Result(uint64_t id) { 163 | for (unsigned cId = 0; cId < copy_data_.size(); ++cId) 164 | tmp_results_[cId].push_back(copy_data_[cId][id]); 165 | ++result_size_; 166 | } 167 | 168 | // Require a column and add it to results 169 | bool SelfJoin::require(SelectInfo info) { 170 | if (required_IUs_.count(info)) 171 | return true; 172 | if (input_->require(info)) { 173 | tmp_results_.emplace_back(); 174 | required_IUs_.emplace(info); 175 | return true; 176 | } 177 | return false; 178 | } 179 | 180 | // Run 181 | void SelfJoin::run() { 182 | input_->require(p_info_.left); 183 | input_->require(p_info_.right); 184 | input_->run(); 185 | input_data_ = input_->getResults(); 186 | 187 | for (auto &iu : required_IUs_) { 188 | auto id = input_->resolve(iu); 189 | copy_data_.emplace_back(input_data_[id]); 190 | select_to_result_col_id_.emplace(iu, copy_data_.size() - 1); 191 | } 192 | 193 | auto left_col_id = input_->resolve(p_info_.left); 194 | auto right_col_id = input_->resolve(p_info_.right); 195 | 196 | auto left_col = input_data_[left_col_id]; 197 | auto right_col = input_data_[right_col_id]; 198 | for (uint64_t i = 0; i < input_->result_size(); ++i) { 199 | if (left_col[i] == right_col[i]) 200 | copy2Result(i); 201 | } 202 | } 203 | 204 | // Run 205 | void Checksum::run() { 206 | for (auto &sInfo : col_info_) { 207 | input_->require(sInfo); 208 | } 209 | input_->run(); 210 | auto results = input_->getResults(); 211 | 212 | for (auto &sInfo : col_info_) { 213 | auto col_id = input_->resolve(sInfo); 214 | auto result_col = results[col_id]; 215 | uint64_t sum = 0; 216 | result_size_ = input_->result_size(); 217 | for (auto iter = result_col, limit = iter + input_->result_size(); 218 | iter != limit; 219 | ++iter) 220 | sum += *iter; 221 | check_sums_.push_back(sum); 222 | } 223 | } 224 | 225 | -------------------------------------------------------------------------------- /src/parser.cpp: -------------------------------------------------------------------------------- 1 | #include "parser.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | namespace { 9 | 10 | // Split a line into numbers 11 | static void splitString(std::string &line, 12 | std::vector &result, 13 | const char delimiter) { 14 | std::stringstream ss(line); 15 | std::string token; 16 | while (getline(ss, token, delimiter)) { 17 | result.push_back(stoul(token)); 18 | } 19 | } 20 | 21 | // Parse a line into std::strings 22 | static void splitString(std::string &line, 23 | std::vector &result, 24 | const char delimiter) { 25 | std::stringstream ss(line); 26 | std::string token; 27 | while (getline(ss, token, delimiter)) { 28 | result.push_back(token); 29 | } 30 | } 31 | 32 | // Split a line into predicate std::strings 33 | static void splitPredicates(std::string &line, 34 | std::vector &result) { 35 | // Determine predicate type 36 | for (auto ct : comparisonTypes) { 37 | if (line.find(ct) != std::string::npos) { 38 | splitString(line, result, ct); 39 | break; 40 | } 41 | } 42 | } 43 | 44 | // Resolve relation_ id 45 | static void resolveIds(std::vector &relation_ids, 46 | SelectInfo &select_info) { 47 | select_info.rel_id = relation_ids[select_info.binding]; 48 | } 49 | 50 | inline static bool isConstant(std::string &raw) { 51 | return raw.find('.') == std::string::npos; 52 | } 53 | 54 | // Wraps relation_ id into quotes to be a SQL compliant std::string 55 | static std::string wrapRelationName(uint64_t id) { 56 | return "\"" + std::to_string(id) + "\""; 57 | } 58 | 59 | } 60 | 61 | // Parse a std::string of relation ids 62 | void QueryInfo::parseRelationIds(std::string &raw_relations) { 63 | splitString(raw_relations, relation_ids_, ' '); 64 | } 65 | 66 | static SelectInfo parseRelColPair(std::string &raw) { 67 | std::vector ids; 68 | splitString(raw, ids, '.'); 69 | return SelectInfo(0, ids[0], ids[1]); 70 | } 71 | 72 | // Parse a single predicate: 73 | // join "r1Id.col1Id=r2Id.col2Id" or "r1Id.col1Id=constant" filter 74 | void QueryInfo::parsePredicate(std::string &raw_predicate) { 75 | std::vector rel_cols; 76 | splitPredicates(raw_predicate, rel_cols); 77 | assert(rel_cols.size() == 2); 78 | assert(!isConstant(rel_cols[0]) 79 | && "left_ side of a predicate is always a SelectInfo"); 80 | auto left_select = parseRelColPair(rel_cols[0]); 81 | if (isConstant(rel_cols[1])) { 82 | uint64_t constant = stoul(rel_cols[1]); 83 | char comp_type = raw_predicate[rel_cols[0].size()]; 84 | filters_.emplace_back(left_select, 85 | constant, 86 | FilterInfo::Comparison(comp_type)); 87 | } else { 88 | predicates_.emplace_back(left_select, parseRelColPair(rel_cols[1])); 89 | } 90 | } 91 | 92 | // Parse predicates 93 | void QueryInfo::parsePredicates(std::string &raw_predicates) { 94 | std::vector predicate_strings; 95 | splitString(raw_predicates, predicate_strings, '&'); 96 | for (auto &raw_predicate : predicate_strings) { 97 | parsePredicate(raw_predicate); 98 | } 99 | } 100 | 101 | // Parse selections 102 | void QueryInfo::parseSelections(std::string &raw_selections) { 103 | std::vector selection_strings; 104 | splitString(raw_selections, selection_strings, ' '); 105 | for (auto &raw_select : selection_strings) { 106 | selections_.emplace_back(parseRelColPair(raw_select)); 107 | } 108 | } 109 | 110 | // Resolve relation ids 111 | void QueryInfo::resolveRelationIds() { 112 | // Selections 113 | for (auto &s_info : selections_) { 114 | resolveIds(relation_ids_, s_info); 115 | } 116 | // Predicates 117 | for (auto &p_info : predicates_) { 118 | resolveIds(relation_ids_, p_info.left); 119 | resolveIds(relation_ids_, p_info.right); 120 | } 121 | // Filters 122 | for (auto &f_info : filters_) { 123 | resolveIds(relation_ids_, f_info.filter_column); 124 | } 125 | } 126 | 127 | // Parse query [RELATIONS]|[PREDICATES]|[SELECTS] 128 | void QueryInfo::parseQuery(std::string &raw_query) { 129 | clear(); 130 | std::vector query_parts; 131 | splitString(raw_query, query_parts, '|'); 132 | assert(query_parts.size() == 3); 133 | parseRelationIds(query_parts[0]); 134 | parsePredicates(query_parts[1]); 135 | parseSelections(query_parts[2]); 136 | resolveRelationIds(); 137 | } 138 | 139 | // Reset query info 140 | void QueryInfo::clear() { 141 | relation_ids_.clear(); 142 | predicates_.clear(); 143 | filters_.clear(); 144 | selections_.clear(); 145 | } 146 | 147 | // Appends a selection info to the stream 148 | std::string SelectInfo::dumpSQL(bool add_sum) { 149 | auto inner_part = wrapRelationName(binding) + ".c" + std::to_string(col_id); 150 | return add_sum ? "SUM(" + inner_part + ")" : inner_part; 151 | } 152 | 153 | // Dump text format 154 | std::string SelectInfo::dumpText() { 155 | return std::to_string(binding) + "." + std::to_string(col_id); 156 | } 157 | 158 | // Dump text format 159 | std::string FilterInfo::dumpText() { 160 | return filter_column.dumpText() + static_cast(comparison) 161 | + std::to_string(constant); 162 | } 163 | 164 | // Dump text format 165 | std::string FilterInfo::dumpSQL() { 166 | return filter_column.dumpSQL() + static_cast(comparison) 167 | + std::to_string(constant); 168 | } 169 | 170 | // Dump text format 171 | std::string PredicateInfo::dumpText() { 172 | return left.dumpText() + '=' + right.dumpText(); 173 | } 174 | 175 | // Dump text format 176 | std::string PredicateInfo::dumpSQL() { 177 | return left.dumpSQL() + '=' + right.dumpSQL(); 178 | } 179 | 180 | template 181 | static void dumpPart(std::stringstream &ss, std::vector elements) { 182 | for (unsigned i = 0; i < elements.size(); ++i) { 183 | ss << elements[i].dumpText(); 184 | if (i < elements.size() - 1) 185 | ss << T::delimiter; 186 | } 187 | } 188 | 189 | template 190 | static void dumpPartSQL(std::stringstream &ss, std::vector elements) { 191 | for (unsigned i = 0; i < elements.size(); ++i) { 192 | ss << elements[i].dumpSQL(); 193 | if (i < elements.size() - 1) 194 | ss << T::delimiterSQL; 195 | } 196 | } 197 | 198 | // Dump text format 199 | std::string QueryInfo::dumpText() { 200 | std::stringstream text; 201 | // Relations 202 | for (unsigned i = 0; i < relation_ids_.size(); ++i) { 203 | text << relation_ids_[i]; 204 | if (i < relation_ids_.size() - 1) 205 | text << " "; 206 | } 207 | text << "|"; 208 | 209 | dumpPart(text, predicates_); 210 | if (predicates_.size() && filters_.size()) 211 | text << PredicateInfo::delimiter; 212 | dumpPart(text, filters_); 213 | text << "|"; 214 | dumpPart(text, selections_); 215 | 216 | return text.str(); 217 | } 218 | 219 | // Dump SQL 220 | std::string QueryInfo::dumpSQL() { 221 | std::stringstream sql; 222 | sql << "SELECT "; 223 | for (unsigned i = 0; i < selections_.size(); ++i) { 224 | sql << selections_[i].dumpSQL(true); 225 | if (i < selections_.size() - 1) 226 | sql << ", "; 227 | } 228 | 229 | sql << " FROM "; 230 | for (unsigned i = 0; i < relation_ids_.size(); ++i) { 231 | sql << "r" << relation_ids_[i] << " " << wrapRelationName(i); 232 | if (i < relation_ids_.size() - 1) 233 | sql << ", "; 234 | } 235 | 236 | sql << " WHERE "; 237 | dumpPartSQL(sql, predicates_); 238 | if (!predicates_.empty() && !filters_.empty()) 239 | sql << " and "; 240 | dumpPartSQL(sql, filters_); 241 | 242 | sql << ";"; 243 | 244 | return sql.str(); 245 | } 246 | 247 | QueryInfo::QueryInfo(std::string raw_query) { parseQuery(raw_query); } 248 | 249 | -------------------------------------------------------------------------------- /src/main/harness.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | const unsigned long MAX_FAILED_QUERIES = 100; 15 | 16 | // Time to wait between initializing and issuing queries 17 | const unsigned long WAITING_TIME_SECS = 60; 18 | 19 | static void usage() { 20 | std::cerr 21 | << "Usage: " 22 | "harness " 23 | << std::endl; 24 | } 25 | 26 | // Set a file descriptor to be non-blocking 27 | static int set_nonblocking(int fd) { 28 | int flags = fcntl(fd, F_GETFL, 0); 29 | if (flags < 0) return flags; 30 | return fcntl(fd, F_SETFL, flags | O_NONBLOCK); 31 | } 32 | 33 | // Read a given number of bytes to the specified file descriptor 34 | static ssize_t read_bytes(int fd, void *buffer, size_t num_bytes) { 35 | char *p = (char *) buffer; 36 | char *end = p + num_bytes; 37 | while (p != end) { 38 | ssize_t res = read(fd, p, end - p); 39 | if (res < 0) { 40 | if (errno == EINTR) continue; 41 | return res; 42 | } 43 | p += res; 44 | } 45 | 46 | return num_bytes; 47 | } 48 | 49 | // Write a given number of bytes to the specified file descriptor 50 | static ssize_t write_bytes(int fd, const void *buffer, size_t num_bytes) { 51 | const char *p = (const char *) buffer; 52 | const char *end = p + num_bytes; 53 | while (p != end) { 54 | ssize_t res = write(fd, p, end - p); 55 | if (res < 0) { 56 | if (errno == EINTR) continue; 57 | return res; 58 | } 59 | p += res; 60 | } 61 | 62 | return num_bytes; 63 | } 64 | 65 | int main(int argc, char *argv[]) { 66 | // Check for the correct number of arguments 67 | if (argc != 5) { 68 | usage(); 69 | exit(EXIT_FAILURE); 70 | } 71 | 72 | std::vector input_batches; 73 | std::vector> result_batches; 74 | 75 | // Load the workload and result files and parse them into batches 76 | { 77 | std::ifstream work_file(argv[2]); 78 | if (!work_file) { 79 | std::cerr << "Cannot open workload file" << std::endl; 80 | exit(EXIT_FAILURE); 81 | } 82 | 83 | std::ifstream result_file(argv[3]); 84 | if (!result_file) { 85 | std::cerr << "Cannot open result file" << std::endl; 86 | exit(EXIT_FAILURE); 87 | } 88 | 89 | std::string input_chunk; 90 | input_chunk.reserve(100000); 91 | 92 | std::vector result_chunk; 93 | result_chunk.reserve(150); 94 | 95 | std::string line; 96 | while (getline(work_file, line)) { 97 | input_chunk += line; 98 | input_chunk += '\n'; 99 | 100 | if (line.length() > 0 && (line[0] != 'F')) { 101 | // Add result 102 | std::string result; 103 | getline(result_file, result); 104 | result_chunk.emplace_back(std::move(result)); 105 | } else { 106 | // End of batch 107 | // Copy input_ and results 108 | input_batches.push_back(input_chunk); 109 | result_batches.push_back(result_chunk); 110 | input_chunk = ""; 111 | result_chunk.clear(); 112 | } 113 | } 114 | } 115 | 116 | // Create pipes for child communication 117 | int stdin_pipe[2]; 118 | int stdout_pipe[2]; 119 | if (pipe(stdin_pipe) == -1 || pipe(stdout_pipe) == -1) { 120 | perror("pipe"); 121 | exit(EXIT_FAILURE); 122 | } 123 | 124 | // Start the test executable 125 | pid_t pid = fork(); 126 | if (pid == -1) { 127 | perror("fork"); 128 | exit(EXIT_FAILURE); 129 | } else if (pid == 0) { 130 | dup2(stdin_pipe[0], STDIN_FILENO); 131 | close(stdin_pipe[0]); 132 | close(stdin_pipe[1]); 133 | dup2(stdout_pipe[1], STDOUT_FILENO); 134 | close(stdout_pipe[0]); 135 | close(stdout_pipe[1]); 136 | execlp(argv[4], argv[4], (char *) nullptr); 137 | perror("execlp"); 138 | exit(EXIT_FAILURE); 139 | } 140 | close(stdin_pipe[0]); 141 | close(stdout_pipe[1]); 142 | 143 | // Open the file and feed the initial relations_ 144 | int init_file = open(argv[1], O_RDONLY); 145 | if (init_file == -1) { 146 | std::cerr << "Cannot open init file" << std::endl; 147 | exit(EXIT_FAILURE); 148 | } 149 | 150 | while (1) { 151 | char buffer[4096]; 152 | ssize_t bytes = read(init_file, buffer, sizeof(buffer)); 153 | if (bytes < 0) { 154 | if (errno == EINTR) continue; 155 | perror("read"); 156 | exit(EXIT_FAILURE); 157 | } 158 | if (bytes == 0) break; 159 | ssize_t written = write_bytes(stdin_pipe[1], buffer, bytes); 160 | if (written < 0) { 161 | perror("write"); 162 | exit(EXIT_FAILURE); 163 | } 164 | } 165 | 166 | close(init_file); 167 | 168 | // Signal the end of the initial phase 169 | ssize_t status_bytes = write_bytes(stdin_pipe[1], "Done\n", 5); 170 | if (status_bytes < 0) { 171 | perror("write"); 172 | exit(EXIT_FAILURE); 173 | } 174 | 175 | // Wait for WAITING_TIME_SECS 176 | std::cout << "Waiting for " << WAITING_TIME_SECS << " seconds" << std::endl; 177 | std::this_thread::sleep_for(std::chrono::seconds(WAITING_TIME_SECS)); 178 | std::cout << "Issuing queries ..." << std::endl; 179 | 180 | // Use select with non-blocking files to read and write from the child 181 | // process, avoiding deadlocks 182 | if (set_nonblocking(stdout_pipe[0]) == -1) { 183 | perror("fcntl"); 184 | exit(EXIT_FAILURE); 185 | } 186 | 187 | if (set_nonblocking(stdin_pipe[1]) == -1) { 188 | perror("fcntl"); 189 | exit(EXIT_FAILURE); 190 | } 191 | 192 | // Start the stopwatch 193 | struct timeval start{}; 194 | gettimeofday(&start, nullptr); 195 | 196 | unsigned long query_no = 0; 197 | unsigned long failure_cnt = 0; 198 | 199 | // Loop over all batches 200 | for (unsigned long batch = 0; 201 | batch != input_batches.size() && failure_cnt < MAX_FAILED_QUERIES; 202 | ++batch) { 203 | std::string output; // raw output is collected here 204 | output.reserve(1000000); 205 | 206 | size_t input_ofs = 0; // byte position in the input_ batch 207 | size_t output_read = 0; // number of lines read from the child output 208 | 209 | while (input_ofs != input_batches[batch].length() 210 | || output_read < result_batches[batch].size()) { 211 | fd_set read_fd, write_fd; 212 | FD_ZERO(&read_fd); 213 | FD_ZERO(&write_fd); 214 | 215 | if (input_ofs != input_batches[batch].length()) 216 | FD_SET(stdin_pipe[1], 217 | &write_fd); 218 | 219 | if (output_read != result_batches[batch].size()) 220 | FD_SET(stdout_pipe[0], 221 | &read_fd); 222 | 223 | int retval = select(std::max(stdin_pipe[1], stdout_pipe[0]) + 1, 224 | &read_fd, 225 | &write_fd, 226 | nullptr, 227 | nullptr); 228 | if (retval == -1) { 229 | perror("select"); 230 | exit(EXIT_FAILURE); 231 | } 232 | 233 | // Read output from the test program 234 | if (FD_ISSET(stdout_pipe[0], &read_fd)) { 235 | char buffer[4096]; 236 | int bytes = read(stdout_pipe[0], buffer, sizeof(buffer)); 237 | if (bytes < 0) { 238 | if (errno == EINTR) continue; 239 | perror("read"); 240 | exit(1); 241 | } 242 | // Count how many lines were returned 243 | for (size_t j = 0; j != size_t(bytes); ++j) { 244 | if (buffer[j] == '\n') ++output_read; 245 | } 246 | output.append(buffer, bytes); 247 | } 248 | 249 | // Feed another chunk of data from this batch to the test program 250 | if (FD_ISSET(stdin_pipe[1], &write_fd)) { 251 | int bytes = 252 | write(stdin_pipe[1], 253 | input_batches[batch].data() + input_ofs, 254 | input_batches[batch].length() - input_ofs); 255 | if (bytes < 0) { 256 | if (errno == EINTR) continue; 257 | perror("write"); 258 | exit(EXIT_FAILURE); 259 | } 260 | input_ofs += bytes; 261 | } 262 | } 263 | 264 | // Parse and compare the batch result 265 | std::stringstream result(output); 266 | 267 | for (unsigned i = 0; 268 | i != result_batches[batch].size() && failure_cnt < MAX_FAILED_QUERIES; 269 | ++i) { 270 | std::string val; 271 | 272 | // result >> val; 273 | getline(result, val); 274 | if (!result) { 275 | std::cerr << "Incomplete batch output for batch " << batch << std::endl; 276 | exit(EXIT_FAILURE); 277 | } 278 | 279 | bool matched = val == result_batches[batch][i]; 280 | if (!matched) { 281 | std::cerr << "Result mismatch for query " << query_no << ", expected: " 282 | << result_batches[batch][i] 283 | << ", actual: " << val << std::endl; 284 | ++failure_cnt; 285 | } 286 | /*if (matched) 287 | { 288 | std::cout << std::endl << val << std::endl 289 | << std::endl << result_batches[batch][i]; 290 | }*/ 291 | ++query_no; 292 | } 293 | } 294 | 295 | struct timeval end{}; 296 | gettimeofday(&end, nullptr); 297 | 298 | if (failure_cnt == 0) { 299 | // Output the elapsed time in milliseconds 300 | double elapsed_sec = 301 | static_cast(end.tv_sec - start.tv_sec) 302 | + (end.tv_usec - start.tv_usec) / 1000000.0; 303 | std::cout << (long) (elapsed_sec * 1000) << std::endl; 304 | return EXIT_SUCCESS; 305 | } 306 | 307 | return EXIT_FAILURE; 308 | } 309 | 310 | -------------------------------------------------------------------------------- /test/operators_test.cpp: -------------------------------------------------------------------------------- 1 | #include "gtest/gtest.h" 2 | 3 | #include "joiner.h" 4 | #include "operators.h" 5 | #include "utils.h" 6 | 7 | namespace { 8 | 9 | class OperatorTest : public testing::Test { 10 | protected: 11 | Relation r1 = Utils::createRelation(5, 3); 12 | Relation r2 = Utils::createRelation(10, 5); 13 | }; 14 | 15 | TEST_F(OperatorTest, Scan) { 16 | unsigned rel_binding = 5; 17 | Scan scan(r1, rel_binding); 18 | scan.require(SelectInfo(rel_binding, 0)); 19 | scan.require(SelectInfo(rel_binding, 2)); 20 | scan.run(); 21 | auto results = scan.getResults(); 22 | ASSERT_EQ(results.size(), 2ull); 23 | auto col_id_1 = scan.resolve(SelectInfo{rel_binding, 0}); 24 | auto col_id_2 = scan.resolve(SelectInfo{rel_binding, 2}); 25 | ASSERT_EQ(results[col_id_1], r1.columns()[0]); 26 | ASSERT_EQ(results[col_id_2], r1.columns()[2]); 27 | } 28 | 29 | TEST_F(OperatorTest, ScanWithSelection) { 30 | unsigned rel_id = 0; 31 | unsigned rel_binding = 1; 32 | unsigned col_id = 2; 33 | SelectInfo s_info(rel_id, rel_binding, col_id); 34 | uint64_t constant = 2; 35 | { 36 | FilterInfo f_info(s_info, constant, FilterInfo::Comparison::Equal); 37 | FilterScan filter_scan(r1, f_info); 38 | filter_scan.run(); 39 | auto results = filter_scan.getResults(); 40 | ASSERT_EQ(results.size(), 0u); 41 | } 42 | { 43 | FilterInfo f_info(s_info, constant, FilterInfo::Comparison::Equal); 44 | FilterScan filter_scan(r1, f_info); 45 | filter_scan.require(SelectInfo(rel_binding, 0)); 46 | filter_scan.require(SelectInfo(rel_binding, 2)); 47 | filter_scan.run(); 48 | 49 | ASSERT_EQ(filter_scan.result_size(), 1ull); 50 | auto results = filter_scan.getResults(); 51 | ASSERT_EQ(results.size(), 2ull); 52 | auto filter_col_id = filter_scan.resolve(SelectInfo{rel_binding, col_id}); 53 | ASSERT_EQ(results[filter_col_id][0], constant); 54 | } 55 | { 56 | FilterInfo f_info(s_info, constant, FilterInfo::Comparison::Greater); 57 | FilterScan filter_scan(r1, f_info); 58 | col_id = 1; 59 | filter_scan.require(SelectInfo(rel_binding, col_id)); 60 | filter_scan.run(); 61 | 62 | ASSERT_EQ(filter_scan.result_size(), 2ull); 63 | auto results = filter_scan.getResults(); 64 | ASSERT_EQ(results.size(), 1ull); 65 | 66 | auto res_col_id = filter_scan.resolve(SelectInfo{rel_binding, col_id}); 67 | auto filter_col = results[res_col_id]; 68 | for (unsigned j = 0; j < filter_scan.result_size(); ++j) { 69 | ASSERT_TRUE(filter_col[j] > constant); 70 | } 71 | } 72 | } 73 | 74 | TEST_F(OperatorTest, Join) { 75 | unsigned l_rid = 0, r_rid = 1; 76 | unsigned r1_bind = 0, r2_bind = 1; 77 | unsigned l_col_id = 1, r_col_id = 3; 78 | 79 | Scan r1_scan(r1, r1_bind); 80 | Scan r2_scan(r2, r2_bind); 81 | 82 | { 83 | PredicateInfo p_info 84 | (SelectInfo(l_rid, r1_bind, l_col_id), 85 | SelectInfo(r_rid, r2_bind, r_col_id)); 86 | auto r1_scan_ptr = std::make_unique(r1_scan); 87 | auto r2_scan_ptr = std::make_unique(r2_scan); 88 | Join join(move(r1_scan_ptr), move(r2_scan_ptr), p_info); 89 | join.run(); 90 | } 91 | { 92 | // Self join 93 | PredicateInfo p_info(SelectInfo(0, 0, 1), SelectInfo(0, 1, 2)); 94 | Scan r1_scan2(r1, 1); 95 | auto left_ptr = std::make_unique(r1_scan); 96 | auto right_ptr = std::make_unique(r1_scan2); 97 | Join join(move(left_ptr), move(right_ptr), p_info); 98 | join.require(SelectInfo(r1_bind, 0)); 99 | join.run(); 100 | 101 | ASSERT_EQ(join.result_size(), r1.size()); 102 | 103 | auto res_col_id = join.resolve(SelectInfo{r1_bind, 0}); 104 | auto results = join.getResults(); 105 | ASSERT_EQ(results.size(), 1ull); 106 | auto result_col = results[res_col_id]; 107 | for (unsigned j = 0; j < join.result_size(); ++j) { 108 | ASSERT_EQ(result_col[j], r1.columns()[0][j]); 109 | } 110 | } 111 | { 112 | // Join r1 and r2 (should have same result as r1 and r1) 113 | auto left_ptr = std::make_unique(r2_scan); 114 | auto right_ptr = std::make_unique(r1_scan); 115 | PredicateInfo p_info(SelectInfo(1, r2_bind, 1), SelectInfo(0, r1_bind, 2)); 116 | Join join(move(left_ptr), move(right_ptr), p_info); 117 | join.require(SelectInfo(r1_bind, 1)); 118 | join.require(SelectInfo(r2_bind, 3)); 119 | // Request a column two times (should not have an effect) 120 | join.require(SelectInfo(r2_bind, 3)); 121 | join.run(); 122 | 123 | ASSERT_EQ(join.result_size(), r1.size()); 124 | 125 | auto res_col_id = join.resolve(SelectInfo{r2_bind, 3}); 126 | auto results = join.getResults(); 127 | ASSERT_EQ(results.size(), 2ull); 128 | auto result_col = results[res_col_id]; 129 | for (unsigned j = 0; j < join.result_size(); ++j) { 130 | ASSERT_EQ(result_col[j], r1.columns()[0][j]); 131 | } 132 | } 133 | } 134 | 135 | TEST_F(OperatorTest, Checksum) { 136 | unsigned rel_binding = 5; 137 | Scan r1_scan(r1, rel_binding); 138 | 139 | { 140 | auto r1_scan_ptr = std::make_unique(r1_scan); 141 | std::vector checksum_columns; 142 | Checksum checkSum(move(r1_scan_ptr), checksum_columns); 143 | checkSum.run(); 144 | ASSERT_EQ(checkSum.check_sums().size(), 0ull); 145 | } 146 | { 147 | auto r1_scan_ptr = std::make_unique(r1_scan); 148 | std::vector checksum_columns; 149 | checksum_columns.emplace_back(0, rel_binding, 0); 150 | checksum_columns.emplace_back(0, rel_binding, 2); 151 | Checksum checksum(move(r1_scan_ptr), checksum_columns); 152 | checksum.run(); 153 | 154 | ASSERT_EQ(checksum.check_sums().size(), 2ull); 155 | uint64_t expected_sum = 0; 156 | for (unsigned i = 0; i < r1.size(); ++i) { 157 | expected_sum += r1.columns()[0][i]; 158 | } 159 | ASSERT_EQ(checksum.check_sums()[0], expected_sum); 160 | ASSERT_EQ(checksum.check_sums()[1], expected_sum); 161 | } 162 | { 163 | SelectInfo s_info(0, rel_binding, 2); 164 | uint64_t constant = 3; 165 | FilterInfo f_info(s_info, constant, FilterInfo::Comparison::Equal); 166 | FilterScan r1_scan_filter(r1, f_info); 167 | auto filter_scan_ptr = std::make_unique(r1_scan_filter); 168 | std::vector checksum_columns; 169 | checksum_columns.emplace_back(0, rel_binding, 2); 170 | Checksum checksum(move(filter_scan_ptr), checksum_columns); 171 | checksum.run(); 172 | ASSERT_EQ(checksum.check_sums().size(), 1ull); 173 | ASSERT_EQ(checksum.check_sums()[0], constant); 174 | } 175 | } 176 | 177 | TEST_F(OperatorTest, SelfJoin) { 178 | unsigned rel_binding = 5; 179 | Scan r1_scan(r1, rel_binding); 180 | { 181 | PredicateInfo 182 | p_info(SelectInfo(1, rel_binding, 1), SelectInfo(1, rel_binding, 2)); 183 | SelfJoin selfjoin(std::make_unique(r1_scan), p_info); 184 | selfjoin.run(); 185 | ASSERT_EQ(selfjoin.result_size(), r1.size()); 186 | ASSERT_EQ(selfjoin.getResults().size(), 0ull); 187 | } 188 | { 189 | PredicateInfo 190 | p_info(SelectInfo(1, rel_binding, 1), SelectInfo(1, rel_binding, 2)); 191 | SelfJoin selfjoin(std::make_unique(r1_scan), p_info); 192 | selfjoin.require(SelectInfo(rel_binding, 0)); 193 | selfjoin.run(); 194 | selfjoin.resolve(SelectInfo(rel_binding, 0)); 195 | ASSERT_EQ(selfjoin.result_size(), r1.size()); 196 | auto results = selfjoin.getResults(); 197 | ASSERT_EQ(results.size(), 1ull); 198 | } 199 | } 200 | 201 | TEST_F(OperatorTest, Joiner) { 202 | Joiner joiner; 203 | unsigned num_tuples = 10; 204 | for (unsigned i = 0; i < 5; i++) { 205 | joiner.addRelation(Utils::createRelation(num_tuples, 3)); 206 | } 207 | 208 | uint64_t sum = 0; 209 | for (unsigned i = 0; i < num_tuples; ++i) { 210 | sum += joiner.relations()[0].columns()[0][i]; 211 | } 212 | std::string expSumWithoutFilters = std::to_string(sum); 213 | { 214 | // Binary join without selections_ 215 | auto query = "1 2|0.0=1.1|1.2"; 216 | QueryInfo i(query); 217 | auto result = joiner.join(i); 218 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 219 | } 220 | { 221 | // Query without selections_ 222 | auto query = "0 2 3|0.0=1.1&1.2=2.0|2.2"; 223 | QueryInfo i(query); 224 | auto result = joiner.join(i); 225 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 226 | } 227 | { 228 | // Query with selection (=4) 229 | auto query = "0 1 4|0.0=1.1&1.2=2.0&1.1=4|1.0 2.2"; 230 | QueryInfo i(query); 231 | auto result = joiner.join(i); 232 | ASSERT_EQ(result, "4 4\n"); 233 | } 234 | { 235 | // Query without result 236 | auto query = "0 1 2|0.0=1.1&1.2=2.0&1.1=100|1.0 2.2"; 237 | QueryInfo i(query); 238 | auto result = joiner.join(i); 239 | ASSERT_EQ(result, "NULL NULL\n"); 240 | } 241 | { 242 | // Self join 243 | auto query = "0 0|0.0=1.1|1.0"; 244 | QueryInfo i(query); 245 | auto result = joiner.join(i); 246 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 247 | } 248 | { 249 | // Cyclic query graph 250 | auto query = "0 1 2|0.0=1.1&1.1=2.0&2.2=0.1|1.0"; 251 | QueryInfo i(query); 252 | auto result = joiner.join(i); 253 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 254 | } 255 | { 256 | // 4 Relations 257 | auto query = "0 1 2 3|0.0=1.1&1.1=2.0&2.2=3.1|1.0"; 258 | QueryInfo i(query); 259 | auto result = joiner.join(i); 260 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 261 | } 262 | { 263 | // 4 Relations (Permuted) 264 | auto query = "0 1 2 3|0.0=1.1&2.1=3.0&0.2=2.1|1.0"; 265 | QueryInfo i(query); 266 | auto result = joiner.join(i); 267 | ASSERT_EQ(result, expSumWithoutFilters + "\n"); 268 | } 269 | { 270 | // 2 Filters (Equal) 271 | auto query = "0 1|0.0=1.1&0.0=3&1.0=3|1.0"; 272 | QueryInfo i(query); 273 | auto result = joiner.join(i); 274 | ASSERT_EQ(result, "3\n"); 275 | } 276 | { 277 | // 2 Filters (Distinct) 278 | auto query = "0 1|0.0=1.1&0.0<3&1.0>3|1.0"; 279 | QueryInfo i(query); 280 | auto result = joiner.join(i); 281 | ASSERT_EQ(result, "NULL\n"); 282 | } 283 | { 284 | // Multiple Filters per relation_ 285 | auto query = "0 1|0.0=1.1&0.0>1&0.0<3|1.0"; 286 | QueryInfo i(query); 287 | auto result = joiner.join(i); 288 | ASSERT_EQ(result, "2\n"); 289 | } 290 | } 291 | 292 | } 293 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 6.830 Programming Competition 2021 2 | 3 | ## Task Details 4 | 5 | The task is to evaluate batches of join queries on a set of pre-defined 6 | relations. Each join query specifies a set of relations, (equality) join 7 | predicates, and selections (aggregations). The challenge is to execute 8 | the queries as fast as possible. 9 | 10 | Input to your program will be provided on the standard input, and the 11 | output must appear on the standard output. 12 | 13 | ## Testing Protocol 14 | 15 | Our test harness will first feed the set of relations to your program's 16 | standard input. That means, your program will receive multiple lines 17 | (separated by the new line character '\n') where each one contains a 18 | string which represents the file name of the given relation. The relation 19 | files are already in a binary format and thus do not require parsing. 20 | All fields are unsigned 64 bit integers. 21 | Our starter package already contains sample code that mmaps() a 22 | relations into main memory. 23 | The binary format of a relation consists of 24 | a header and a data section. The header contains the number of tuples 25 | and the number of columns. The data section follows the header and stores 26 | all tuples using a column store. All of the values of a column 27 | are stored sequentially, followed by the values of the next column, 28 | and so on. The overall binary format is as follows (T0C0 stands for 29 | tuple 0 of column 0; pipe symbol '|' is not part of the binary format): 30 | 31 | ``` 32 | uint64_t numTuples|uint64_t numColumns|uint64_t T0C0|uint64_t T1C0|..|uint64_t TnC0|uint64_t T0C1|..|uint64_t TnC1|..|uint64_t TnCm 33 | ``` 34 | 35 | After sending the set of relations, our test harness will send a line 36 | containing the string "Done". 37 | 38 | Next, our test harness will wait for **60s** until it starts sending 39 | queries. This gives you time to prepare for the workload, e.g., 40 | collecting statistics, creating indexes, etc. The test harness sends 41 | the workload in batches: 42 | A workload batch contains a set of join queries (each line represents a 43 | query). A join query consists of three consecutive parts (separated 44 | by the pipe symbol '|'): 45 | 46 | - **Relations**: A list of relations that will be joined. We will pass 47 | the ids of the relation here separated by spaces (' '). The relation ids 48 | are implicitly mapped to the relations by the order the relations were 49 | passed in the first phase. For instance, id 0 refers to the first relation. 50 | 51 | - **Predicates**: Each predicate is separated by a '&'. We have two types 52 | of predicates: filter predicates and join predicates. Filter predicates are 53 | of the form: filter column + comparison type (greater '>' less '<' 54 | equal '=') + integer constant. Join predicates specify on which columns the 55 | relations should be joined. A join predicate is composed out of two 56 | relation-column pairs connected with an equality ('=') operator. Here, 57 | a relation is identified by its offset in the list of relations to be 58 | joined (i.e., we implicitly bind the first relation of a join query to 59 | the identifier 0, the second one to 1, etc.). 60 | 61 | - **Projections**: A list of columns that are needed to compute the final 62 | check sum that we use to verify that the join was done properly. Similar 63 | to the join predicates, columns are denoted as relation-column pairs. 64 | Each selection is delimited by a space character (' '). 65 | 66 | Example: 67 | ``` 68 | 0 2 4|0.1=1.2&1.0=2.1&0.1>3000|0.0 1.1 69 | ``` 70 | 71 | Translation to SQL: 72 | ``` 73 | SELECT SUM("0".c0), SUM("1".c1) 74 | FROM r0 "0", r2 "1", r4 "2" 75 | WHERE 0.c1=1.c2 and 1.c0=2.c1 and 0.c1>3000 76 | ``` 77 | 78 | The end of a batch is indicated by a line containing the character 'F'. 79 | Our test harness will then wait for the results to be written to your 80 | program's standard output. For each join query, your program is required 81 | to output a line containing the check sums of the individual projections 82 | separated by spaces (e.g., "42 4711"). If there is no qualifying tuple, 83 | each check sum should return "NULL" like in SQL. Once the results have 84 | been received, we will start delivering the next workload batch. 85 | 86 | For your check sums, use SUM aggregation. 87 | You do not have to worry about numeric overflows as long as you are using 88 | 64 bit unsigned integers. 89 | 90 | Your solution will be evaluated for correctness and execution time. 91 | Execution time measurement starts immediately after the 60s waiting 92 | period. You are free to fully utilize the waiting period for any kind of 93 | pre-processing. 94 | 95 | All join graphs are connected. There are no cross products. Cyclic queries and 96 | self joins are possible. We will provide more constraints soon. 97 | 98 | ## Starter code 99 | 100 | We provide a starter package in C++. It is in the format required for 101 | submission. It includes a query parser and a relation loader. 102 | It implements a basic query execution model featuring full 103 | materialization. It does not implement any query optimization. It only 104 | uses standard STL containers (like unordered_map) for the join 105 | processing. Its query processing capabilities are limited to the 106 | demands of this contest. 107 | 108 | DISCLAIMER: Although we have tested the package 109 | intensively, we cannot guarantee that it is free of bugs. Thus, we test 110 | your submissions against the results computed by a real DBMS. 111 | 112 | This project is only meant to give you a quick start into the project and 113 | to dig right into the fun (coding) part. It is not required to use the 114 | provided code. You can create a submittable submission.tar.gz file using 115 | the included package.sh script. 116 | 117 | For testing, we provide a small workload in the required format. 118 | We also provide CSV versions (.tbl files) of each relation + SQL 119 | files to load the relations into a DBMS and a file 120 | (small.work.sql) that contains SQL versions of all queries in 121 | small.work. 122 | 123 | To build the starter code base run the following commands: 124 | ``` 125 | mkdir build 126 | cd build 127 | cmake -DCMAKE_BUILD_TYPE=Release .. 128 | make -j4 129 | ``` 130 | 131 | To build in debug mode run 132 | `cmake -DCMAKE_BUILD_TYPE=Debug ..` 133 | 134 | To not build the tests run 135 | `cmake -DCMAKE_BUILD_TYPE=Release -DFORCE_TESTS=OFF ..` 136 | 137 | This creates the binaries `driver`, `harness`, and `query2SQL` in `build` 138 | directory and `tester` in `build/test` directory. `driver` is the binary that 139 | interacts with our test harness `harness` according to the protocol described 140 | above. You can use `query2SQL` to transform our query format to SQL. 141 | 142 | `compile.sh` is the script we use for building your code in the testing environment. 143 | It creates the binaries in `build/release` folder. It does not build unit tests 144 | as the testing environment does not have internet access. `run.sh` is the script 145 | the our test harness uses for running your executable. It expects the binaries 146 | in `build/release` folder. To test using our harness, first compile your code by 147 | running 148 | 149 | ``` 150 | bash compile.sh 151 | ``` 152 | 153 | To test the small workload using our test harness run 154 | 155 | ``` 156 | bash run_test_harness.sh workloads/small 157 | ``` 158 | 159 | To execute all unit tests run 160 | 161 | ``` 162 | ./tester 163 | ``` 164 | 165 | To execute a specific unit test run 166 | 167 | ``` 168 | ./tester --gtest_filter= 169 | ``` 170 | For example, 171 | ``` 172 | ./tester --gtest_filter=OperatorTest.ScanWithSelection 173 | ``` 174 | 175 | We encourage you to write your own tests to as you develop your code base. 176 | We have provided some examples using the 177 | [GoogleTest](https://github.com/google/googletest) framework in `test` 178 | folder. 179 | 180 | ## Evaluation 181 | 182 | Our testing infrastructure will evaluate each submission by unpacking the 183 | submission file, compiling the submitted code (using your submitted 184 | compile.sh script), and then running a series of tests (using your 185 | submitted run.sh script). Extraction time is limited to 10 seconds, 186 | and compilation time is limited to 60 seconds. Submissions that exceed 187 | these limits will not be tested at all. 188 | 189 | Each test uses the test harness to supply an initial dataset and a 190 | workload to your submitted program. The total time for each test is 191 | limited to 4-5 minutes (different tests may have slightly different 192 | limits). The total per-test time includes the time to ingest the dataset 193 | and the time to process the workload. 194 | 195 | Submissions will be unpacked, compiled and tested in a network-isolated 196 | container. We will provide system specifications of the testing 197 | environment soon. 198 | 199 | A submission is considered to be rankable if it correctly processes all 200 | of the test workloads within their time limits. As discussed in the 201 | testing protocol description, initial import of relations is not included 202 | in a submission's score. The leaderboard will show the best rankable 203 | submission for each team that has at least one such submission. 204 | 205 | The submission portal and leaderboard will be up soon. 206 | 207 | ## Submission 208 | 209 | Submit a single compressed tar file called submission.tar.gz. 210 | You can use package.sh to do that. 211 | Submission files must be no larger than 5 MB - larger files will be 212 | rejected. Each submission must include the following files/directories: 213 | - **run.sh**: 214 | This script is responsible for running your executable, which should 215 | interact with our test harness according to the testing protocol, 216 | reading from standard input and writing results to standard output. 217 | - **readme.txt**: 218 | This file must contain information about all team members, a brief 219 | description of the solution, a list of the third party code used and 220 | their licenses. 221 | - **Source Files**: 222 | The package must contain all of the source code. 223 | - **compile.sh**: 224 | This shell script must be able to compile the source contained in the 225 | submission directory. The produced executable file(s) must be locate 226 | within the submission directory. The benchmark environment is isolated 227 | and without internet access. You will have to provide all files required 228 | for successful compilation. 229 | 230 | You can use the starter package, which has the required format, as a 231 | starting point. 232 | 233 | ## Rules 234 | 235 | - All submissions must consist only of code written by the team or open source 236 | licensed software (i.e., using an OSI-approved license). For source code from 237 | books or public articles, clear reference and attribution must be made. 238 | - Please keep your solution private and not make it publicly available. 239 | 240 | ## Updates 241 | When we release more details about the competition, we will add them under this 242 | section. 243 | 244 | - A larger dataset is now available for testing. You can download it 245 | [here](http://dsg.csail.mit.edu/data/public.zip). 246 | - System specifications of the testing environment (r5.4xlarge instance on AWS): 247 | 248 | | | | 249 | | ----------- | ----------- | 250 | | Processor | Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz | 251 | | Configuration | 8 cores / 16 hyperthreads | 252 | | Main memory | 128 GB RAM | 253 | | OS | Ubuntu 18.04 | 254 | | Software | autoconf=2.69-11, automake=1:1.15.1-3ubuntu2, cmake=3.10.2-1ubuntu2.18.04.1, gcc=4:7.4.0-1ubuntu2.3, libjemalloc-dev=3.6.0-11, libboost-dev=1.65.1.0ubuntu1, clang-5.0=1:5.0.1-4, libtbb-dev=2017~U7-8 | 255 | 256 | - Dockerfile for the testing environment is available for download 257 | [here](https://github.com/MIT-DB-Class/programming-contest-2021/blob/main/Dockerfile). 258 | - Submission portal is now available. Please let the TAs know if you 259 | didn't get an email with details. 260 | 261 | ## Acknowledgements 262 | 263 | This contest is adapted from SIGMOD 2018 programming contest. The starter code 264 | is a modified version of the quick start package provided with the contest. 265 | -------------------------------------------------------------------------------- /workloads/small/r0.tbl: -------------------------------------------------------------------------------- 1 | 1|8463|582| 2 | 3|5165|6962| 3 | 7|8807|2418| 4 | 11|9259|315| 5 | 15|7833|834| 6 | 19|5954|2676| 7 | 23|10249|781| 8 | 28|4854|6374| 9 | 31|9334|3092| 10 | 33|6973|1441| 11 | 38|9348|488| 12 | 39|6792|3763| 13 | 41|4689|4616| 14 | 42|7320|2451| 15 | 45|9208|3319| 16 | 48|7094|6620| 17 | 53|6682|5231| 18 | 57|7041|734| 19 | 61|4862|3842| 20 | 65|8595|924| 21 | 70|9588|940| 22 | 74|8337|2219| 23 | 76|8633|7903| 24 | 80|5995|7304| 25 | 84|8630|3696| 26 | 88|6867|5425| 27 | 90|4708|8315| 28 | 92|4744|4065| 29 | 93|6944|2219| 30 | 95|9378|5472| 31 | 99|8985|288| 32 | 103|9456|3921| 33 | 105|6707|2131| 34 | 110|5371|2245| 35 | 112|7334|1444| 36 | 115|9403|3563| 37 | 116|7775|4486| 38 | 118|9484|1926| 39 | 120|7466|978| 40 | 122|4412|2547| 41 | 124|8898|7805| 42 | 129|6747|2715| 43 | 133|6566|1919| 44 | 136|9014|5439| 45 | 141|5212|6419| 46 | 143|6914|3264| 47 | 148|5243|1818| 48 | 152|9309|7490| 49 | 153|4608|644| 50 | 155|8719|1717| 51 | 158|5307|1104| 52 | 161|4717|7940| 53 | 165|9654|3557| 54 | 166|10260|1905| 55 | 167|9176|8196| 56 | 170|6322|7314| 57 | 173|8145|2732| 58 | 175|4524|2520| 59 | 176|4850|8466| 60 | 180|10158|4919| 61 | 184|6136|2610| 62 | 186|9839|1131| 63 | 190|5587|3743| 64 | 193|4818|1197| 65 | 196|5902|3877| 66 | 201|5360|6086| 67 | 205|7477|3788| 68 | 206|4874|1992| 69 | 208|10245|5304| 70 | 210|6449|5665| 71 | 214|6583|7744| 72 | 215|10099|1978| 73 | 218|8475|508| 74 | 219|7420|2865| 75 | 221|7325|3265| 76 | 223|7263|6000| 77 | 228|7959|6584| 78 | 229|6598|1653| 79 | 231|5264|7718| 80 | 233|6670|8235| 81 | 236|7483|7827| 82 | 241|9168|4122| 83 | 244|8049|6191| 84 | 249|5825|5234| 85 | 253|9060|6877| 86 | 256|9225|3151| 87 | 259|8820|1322| 88 | 263|7101|8314| 89 | 266|8824|4151| 90 | 267|7673|4236| 91 | 272|5721|6783| 92 | 274|6080|5964| 93 | 277|10155|8603| 94 | 282|9872|8281| 95 | 285|4741|4192| 96 | 288|8439|6547| 97 | 290|7614|812| 98 | 293|7973|6608| 99 | 296|9850|5494| 100 | 297|4678|8132| 101 | 301|8550|7302| 102 | 303|5027|8257| 103 | 306|7000|1389| 104 | 310|9160|495| 105 | 312|6454|428| 106 | 313|9125|2548| 107 | 315|7575|604| 108 | 318|6038|474| 109 | 323|8934|8219| 110 | 326|8315|600| 111 | 328|7916|7423| 112 | 333|9052|3973| 113 | 336|9310|362| 114 | 338|4725|5726| 115 | 340|4763|4901| 116 | 343|9917|5583| 117 | 348|9826|7389| 118 | 353|8891|6157| 119 | 356|6538|8610| 120 | 361|9048|1520| 121 | 364|6277|2493| 122 | 365|7561|8288| 123 | 367|6841|8176| 124 | 368|6061|5245| 125 | 370|7662|3335| 126 | 374|5760|497| 127 | 378|4658|2563| 128 | 380|9005|8260| 129 | 383|5793|3287| 130 | 386|6878|423| 131 | 389|9456|2130| 132 | 394|5657|4290| 133 | 395|6243|1373| 134 | 399|9006|783| 135 | 404|5734|6287| 136 | 409|8828|2481| 137 | 412|5581|927| 138 | 416|8477|8409| 139 | 420|7857|8348| 140 | 424|7452|2790| 141 | 425|9964|879| 142 | 428|9557|3795| 143 | 430|6147|2159| 144 | 431|9023|8192| 145 | 436|7066|1127| 146 | 438|8592|1238| 147 | 439|7743|6978| 148 | 444|5546|7314| 149 | 448|5100|663| 150 | 451|9575|1915| 151 | 454|7935|3607| 152 | 455|4554|1847| 153 | 459|7312|2223| 154 | 461|9799|7016| 155 | 464|7332|7393| 156 | 468|6417|3681| 157 | 469|7232|2195| 158 | 470|7358|4846| 159 | 472|9235|6110| 160 | 477|6129|6163| 161 | 479|5257|7522| 162 | 482|4757|2000| 163 | 487|7096|4853| 164 | 492|9999|6651| 165 | 493|6375|958| 166 | 495|9248|2383| 167 | 497|8105|450| 168 | 498|6398|623| 169 | 499|7483|2335| 170 | 502|8029|6792| 171 | 507|6103|4112| 172 | 512|7522|3207| 173 | 513|8784|798| 174 | 514|5658|918| 175 | 517|9013|5563| 176 | 521|5792|6433| 177 | 522|6063|966| 178 | 526|9154|419| 179 | 529|8636|7561| 180 | 532|9398|2090| 181 | 536|4933|7632| 182 | 540|8301|3032| 183 | 542|7688|3584| 184 | 544|8461|1622| 185 | 548|7399|3689| 186 | 551|9035|1560| 187 | 552|8410|4449| 188 | 554|5178|2745| 189 | 558|6681|3240| 190 | 563|6575|4049| 191 | 567|5399|3208| 192 | 571|6306|358| 193 | 573|8417|3219| 194 | 578|6425|2037| 195 | 583|6179|3240| 196 | 587|6769|6316| 197 | 591|4954|3671| 198 | 595|5160|2618| 199 | 598|5160|1799| 200 | 603|4763|7269| 201 | 605|7029|3876| 202 | 607|6047|5778| 203 | 612|6580|8054| 204 | 615|4823|3473| 205 | 618|4408|2695| 206 | 619|7349|5485| 207 | 621|9050|5892| 208 | 622|9471|3770| 209 | 624|6270|3883| 210 | 629|5725|6247| 211 | 631|9379|1939| 212 | 632|7500|3110| 213 | 635|6224|3303| 214 | 639|9194|2737| 215 | 642|8918|3878| 216 | 647|5288|2159| 217 | 648|9121|2218| 218 | 649|9517|1978| 219 | 651|6374|3314| 220 | 652|6523|6715| 221 | 657|7319|4362| 222 | 662|5861|3427| 223 | 666|9104|3102| 224 | 669|5038|3014| 225 | 673|7767|7868| 226 | 678|4431|7036| 227 | 682|5777|6609| 228 | 684|6929|2136| 229 | 685|8561|6090| 230 | 689|4649|7087| 231 | 692|10176|2403| 232 | 693|7301|3085| 233 | 694|4414|3706| 234 | 698|7820|3174| 235 | 702|7069|8149| 236 | 706|4548|3921| 237 | 711|4455|5590| 238 | 713|8679|7986| 239 | 717|8034|3683| 240 | 722|5687|8002| 241 | 723|5359|794| 242 | 725|10130|267| 243 | 730|10199|482| 244 | 731|5952|8310| 245 | 733|5287|3148| 246 | 734|8533|8387| 247 | 736|10037|6716| 248 | 740|5022|5733| 249 | 744|4810|7649| 250 | 749|6688|1216| 251 | 754|6225|7464| 252 | 755|6374|7113| 253 | 756|5790|2292| 254 | 757|9292|4630| 255 | 758|8277|5620| 256 | 762|5676|2384| 257 | 766|9720|7324| 258 | 769|6946|1303| 259 | 770|10161|5894| 260 | 775|7789|2034| 261 | 778|4623|4049| 262 | 780|5697|7956| 263 | 783|5007|4698| 264 | 787|9128|6871| 265 | 789|6766|2378| 266 | 794|5637|3121| 267 | 799|6339|1527| 268 | 802|8230|1472| 269 | 803|9575|8479| 270 | 805|6971|3959| 271 | 809|7897|8288| 272 | 810|5822|3019| 273 | 813|5797|5668| 274 | 814|6604|2693| 275 | 818|7721|7150| 276 | 823|8558|592| 277 | 825|8568|2471| 278 | 828|7258|385| 279 | 833|8422|1832| 280 | 838|8544|3203| 281 | 843|10189|835| 282 | 848|4419|1137| 283 | 852|9189|2208| 284 | 857|10048|2526| 285 | 861|6563|3993| 286 | 864|8106|4194| 287 | 867|7719|6671| 288 | 872|8174|5337| 289 | 875|5499|6831| 290 | 878|7276|3062| 291 | 880|4852|3980| 292 | 884|6686|4426| 293 | 886|8625|4004| 294 | 890|6645|2450| 295 | 891|9493|6443| 296 | 893|5372|5211| 297 | 898|5833|6067| 298 | 901|4606|1172| 299 | 902|7400|7735| 300 | 906|7867|3883| 301 | 908|6804|8042| 302 | 910|8927|6869| 303 | 913|8871|2081| 304 | 917|7364|5020| 305 | 921|8915|7355| 306 | 923|4718|2332| 307 | 927|6858|6434| 308 | 928|6383|3949| 309 | 933|9973|1299| 310 | 937|6187|5633| 311 | 942|7820|1028| 312 | 944|6904|8053| 313 | 946|6311|7848| 314 | 948|9222|6714| 315 | 951|8720|8103| 316 | 955|9925|8486| 317 | 956|7900|4798| 318 | 960|5271|7455| 319 | 963|6091|4313| 320 | 966|8569|4850| 321 | 967|4620|8576| 322 | 970|10204|5844| 323 | 972|6985|4252| 324 | 975|4413|4997| 325 | 976|5933|338| 326 | 979|5569|6085| 327 | 983|9981|7300| 328 | 985|9621|2653| 329 | 989|7062|2352| 330 | 994|9698|3254| 331 | 995|6201|2572| 332 | 997|4998|6567| 333 | 1000|9225|7802| 334 | 1005|9096|215| 335 | 1006|6155|4570| 336 | 1009|5446|615| 337 | 1011|9970|4095| 338 | 1012|10101|1567| 339 | 1014|4967|669| 340 | 1017|8672|2991| 341 | 1022|4666|3532| 342 | 1024|8425|8023| 343 | 1029|6571|8493| 344 | 1032|6783|6596| 345 | 1035|6259|2995| 346 | 1039|8581|7170| 347 | 1042|5549|7852| 348 | 1043|6077|3586| 349 | 1046|7557|2557| 350 | 1051|9638|7190| 351 | 1053|5417|1511| 352 | 1056|8301|6734| 353 | 1061|9060|5893| 354 | 1065|4695|7625| 355 | 1067|10105|1627| 356 | 1071|5632|1296| 357 | 1076|8939|3497| 358 | 1079|8033|5633| 359 | 1081|9423|5221| 360 | 1083|5512|3149| 361 | 1084|8256|4243| 362 | 1088|6445|5751| 363 | 1090|5314|2679| 364 | 1091|9371|5169| 365 | 1095|5419|7789| 366 | 1098|8785|4867| 367 | 1099|10169|1515| 368 | 1103|5871|4550| 369 | 1107|6766|5734| 370 | 1108|4762|4542| 371 | 1113|9765|2116| 372 | 1118|9919|2549| 373 | 1120|9909|4401| 374 | 1123|5774|3604| 375 | 1126|8464|2768| 376 | 1131|6860|591| 377 | 1133|9457|8626| 378 | 1137|7235|8587| 379 | 1139|9063|7201| 380 | 1142|6145|8236| 381 | 1147|8073|254| 382 | 1149|6863|2745| 383 | 1151|4465|5472| 384 | 1155|10232|1116| 385 | 1159|4445|1840| 386 | 1163|5626|4491| 387 | 1166|5160|7573| 388 | 1167|6722|7413| 389 | 1169|7345|360| 390 | 1174|5974|7492| 391 | 1177|9518|6162| 392 | 1182|8211|6637| 393 | 1183|6736|4202| 394 | 1186|6933|4905| 395 | 1189|7589|8613| 396 | 1190|4843|3357| 397 | 1194|4569|5683| 398 | 1199|9137|2049| 399 | 1201|6014|4974| 400 | 1206|10005|672| 401 | 1211|8637|8506| 402 | 1216|9620|8095| 403 | 1217|6557|6287| 404 | 1221|10162|6452| 405 | 1225|5462|3080| 406 | 1227|5565|7822| 407 | 1228|8256|1370| 408 | 1233|5936|653| 409 | 1237|5693|3463| 410 | 1238|6030|1205| 411 | 1239|7140|574| 412 | 1242|4476|6124| 413 | 1243|6852|8263| 414 | 1248|9039|6915| 415 | 1253|8785|8016| 416 | 1254|7931|7330| 417 | 1255|5662|881| 418 | 1259|10210|5057| 419 | 1260|5502|5282| 420 | 1261|5087|504| 421 | 1262|7038|4225| 422 | 1264|8267|7376| 423 | 1269|9598|6835| 424 | 1273|10032|4842| 425 | 1276|7860|7145| 426 | 1277|4849|3047| 427 | 1282|4527|8449| 428 | 1287|5581|2129| 429 | 1290|5161|2398| 430 | 1294|8941|2997| 431 | 1296|9168|625| 432 | 1300|9002|2779| 433 | 1302|6431|5778| 434 | 1304|5179|1510| 435 | 1305|9314|8156| 436 | 1307|6380|6909| 437 | 1310|5133|7598| 438 | 1315|10161|3825| 439 | 1320|5461|2740| 440 | 1324|7224|4281| 441 | 1325|4750|2730| 442 | 1326|9078|2706| 443 | 1331|7378|7066| 444 | 1334|5256|819| 445 | 1337|7699|7933| 446 | 1341|8799|8279| 447 | 1342|10111|8394| 448 | 1346|6992|6839| 449 | 1350|6606|7552| 450 | 1354|5306|8074| 451 | 1358|6875|2282| 452 | 1359|4771|7261| 453 | 1363|7853|8404| 454 | 1368|9140|5660| 455 | 1373|6075|6364| 456 | 1375|9970|5912| 457 | 1379|4479|2781| 458 | 1381|6305|7434| 459 | 1384|8029|4995| 460 | 1389|7735|7290| 461 | 1391|5695|8616| 462 | 1395|7520|3755| 463 | 1400|7981|3733| 464 | 1405|4508|5581| 465 | 1407|8606|2871| 466 | 1408|6504|8053| 467 | 1411|6464|5676| 468 | 1415|9324|8599| 469 | 1420|5593|6911| 470 | 1422|8730|3487| 471 | 1423|5076|6392| 472 | 1428|5034|7038| 473 | 1431|8959|7730| 474 | 1435|5144|5277| 475 | 1436|5777|4482| 476 | 1441|5608|5799| 477 | 1445|4796|2769| 478 | 1448|7536|1680| 479 | 1452|8808|979| 480 | 1455|6472|6252| 481 | 1459|6565|5661| 482 | 1462|10262|1139| 483 | 1463|6530|5684| 484 | 1464|8634|1310| 485 | 1466|4562|3988| 486 | 1471|9702|2066| 487 | 1476|5331|541| 488 | 1477|9391|1805| 489 | 1479|9191|5634| 490 | 1482|7760|6164| 491 | 1483|6024|7852| 492 | 1487|10204|6034| 493 | 1489|6519|4984| 494 | 1491|6558|2061| 495 | 1494|8842|1342| 496 | 1497|5748|5726| 497 | 1499|5266|4343| 498 | 1501|5894|7706| 499 | 1503|10226|2998| 500 | 1505|9038|5672| 501 | 1506|10080|4841| 502 | 1507|10014|5255| 503 | 1508|5842|1524| 504 | 1510|8015|4046| 505 | 1511|9716|5204| 506 | 1514|6911|3966| 507 | 1516|9846|7926| 508 | 1520|6533|3567| 509 | 1522|5497|7186| 510 | 1526|6682|3112| 511 | 1531|10070|5663| 512 | 1533|9832|5051| 513 | 1538|9089|4139| 514 | 1539|5039|6923| 515 | 1541|5481|2051| 516 | 1544|8220|649| 517 | 1548|5646|387| 518 | 1551|9928|395| 519 | 1553|5971|1695| 520 | 1555|6609|8582| 521 | 1558|9367|686| 522 | 1560|9406|2890| 523 | 1561|4461|6453| 524 | 1565|6447|3363| 525 | 1566|7911|8513| 526 | 1567|8998|3120| 527 | 1568|9306|8001| 528 | 1571|6949|1208| 529 | 1575|9179|6267| 530 | 1577|9070|4782| 531 | 1578|8206|388| 532 | 1579|8491|2838| 533 | 1581|5293|3595| 534 | 1584|8770|7466| 535 | 1585|5666|1141| 536 | 1588|10005|5143| 537 | 1589|9371|2588| 538 | 1590|8121|4581| 539 | 1592|9187|7398| 540 | 1593|10049|8566| 541 | 1597|9105|2401| 542 | 1600|6230|6457| 543 | 1602|6278|352| 544 | 1605|9976|7496| 545 | 1610|8141|7234| 546 | 1615|7860|1832| 547 | 1617|9445|5233| 548 | 1620|6990|4296| 549 | 1622|4801|5430| 550 | 1623|6437|8126| 551 | 1625|9568|7709| 552 | 1629|6499|538| 553 | 1632|5398|4968| 554 | 1635|6158|7671| 555 | 1640|8391|1397| 556 | 1642|7703|1135| 557 | 1646|10198|3486| 558 | 1647|9031|2311| 559 | 1650|8301|1294| 560 | 1653|8676|5669| 561 | 1655|6702|4326| 562 | 1660|6276|5265| 563 | 1664|9973|2394| 564 | 1667|9975|6040| 565 | 1669|5398|5854| 566 | 1673|8250|6171| 567 | 1677|4486|5846| 568 | 1678|4932|6121| 569 | 1680|9011|6905| 570 | 1684|10098|1145| 571 | 1688|7636|890| 572 | 1691|5155|3997| 573 | 1694|5509|1820| 574 | 1695|8526|556| 575 | 1696|6627|3484| 576 | 1700|9892|3038| 577 | 1703|5992|6575| 578 | 1708|9205|6774| 579 | 1710|4807|2709| 580 | 1712|4538|7207| 581 | 1716|4670|3579| 582 | 1720|9554|1531| 583 | 1722|7742|5030| 584 | 1725|4537|7086| 585 | 1729|7876|1632| 586 | 1730|6901|7030| 587 | 1733|4442|2998| 588 | 1736|6479|5012| 589 | 1737|7971|2865| 590 | 1742|7170|3460| 591 | 1745|8150|1446| 592 | 1748|4544|1087| 593 | 1750|6646|1880| 594 | 1751|7999|3603| 595 | 1752|9681|8033| 596 | 1756|6482|827| 597 | 1761|9853|6464| 598 | 1765|9259|5948| 599 | 1766|6459|5109| 600 | 1768|4946|2178| 601 | 1773|5127|2616| 602 | 1776|9431|8111| 603 | 1780|5936|5106| 604 | 1784|6009|7962| 605 | 1789|5556|916| 606 | 1793|9013|3229| 607 | 1794|5812|2942| 608 | 1795|5019|5837| 609 | 1799|9158|382| 610 | 1802|7910|686| 611 | 1804|4954|2925| 612 | 1809|8821|5261| 613 | 1814|8727|6534| 614 | 1817|8435|8386| 615 | 1818|8282|1492| 616 | 1821|5982|5775| 617 | 1826|9996|8057| 618 | 1827|5206|3530| 619 | 1831|6442|4208| 620 | 1835|8888|6077| 621 | 1838|6207|3258| 622 | 1843|4764|1307| 623 | 1844|5297|5953| 624 | 1847|9999|2320| 625 | 1851|4622|1802| 626 | 1854|8047|1955| 627 | 1859|7215|3655| 628 | 1863|8466|5603| 629 | 1865|7587|3996| 630 | 1866|8996|2669| 631 | 1871|8287|7433| 632 | 1875|7690|5947| 633 | 1877|6172|3082| 634 | 1879|8632|3005| 635 | 1882|5265|4377| 636 | 1884|8039|5630| 637 | 1889|5729|6597| 638 | 1891|5882|1356| 639 | 1893|4762|6462| 640 | 1898|8124|5238| 641 | 1901|9829|3890| 642 | 1906|7425|7285| 643 | 1909|6955|4299| 644 | 1912|8927|5948| 645 | 1915|5867|8470| 646 | 1917|9644|7514| 647 | 1922|4420|3586| 648 | 1926|9285|461| 649 | 1931|8779|7804| 650 | 1933|7175|6009| 651 | 1935|9416|5396| 652 | 1939|4769|7444| 653 | 1940|5013|1501| 654 | 1941|9650|579| 655 | 1943|8473|4404| 656 | 1945|5074|4538| 657 | 1948|7886|8051| 658 | 1953|7877|7706| 659 | 1954|5853|7040| 660 | 1957|9119|8294| 661 | 1960|7835|5084| 662 | 1964|8207|2345| 663 | 1965|8684|2551| 664 | 1968|9573|981| 665 | 1971|9994|1324| 666 | 1974|9179|7463| 667 | 1977|6770|6255| 668 | 1981|7130|1865| 669 | 1982|7584|2874| 670 | 1983|9261|5003| 671 | 1985|7861|8042| 672 | 1988|6365|2736| 673 | 1992|10209|8608| 674 | 1995|8665|472| 675 | 1998|8039|1480| 676 | 2000|6434|5950| 677 | 2003|4980|4671| 678 | 2005|9210|329| 679 | 2006|8472|2731| 680 | 2010|7566|5546| 681 | 2011|5728|4612| 682 | 2012|9533|4672| 683 | 2017|9194|5577| 684 | 2018|5716|2812| 685 | 2019|7473|4913| 686 | 2023|8524|3217| 687 | 2027|5813|440| 688 | 2029|5057|466| 689 | 2032|9271|7681| 690 | 2037|7975|4846| 691 | 2042|8783|6950| 692 | 2047|7912|1637| 693 | 2052|5857|1483| 694 | 2057|9185|6609| 695 | 2061|5864|7114| 696 | 2064|6033|8613| 697 | 2065|6778|3570| 698 | 2068|7394|5864| 699 | 2072|10006|3612| 700 | 2076|5940|8158| 701 | 2077|9791|3233| 702 | 2079|7673|2883| 703 | 2080|9527|1888| 704 | 2083|6065|6750| 705 | 2088|4872|7430| 706 | 2093|5231|4637| 707 | 2096|9196|1583| 708 | 2098|6689|2067| 709 | 2100|6836|3138| 710 | 2101|7017|4620| 711 | 2106|6106|3602| 712 | 2108|8210|7776| 713 | 2110|6718|8202| 714 | 2113|7702|8100| 715 | 2116|5668|242| 716 | 2120|6487|6172| 717 | 2121|6539|371| 718 | 2123|9717|5670| 719 | 2128|9345|7894| 720 | 2133|8242|6395| 721 | 2134|5196|8041| 722 | 2139|9344|3591| 723 | 2144|4882|1656| 724 | 2145|7229|1966| 725 | 2149|9556|1370| 726 | 2154|9654|3009| 727 | 2156|10138|6799| 728 | 2160|9948|8081| 729 | 2165|5119|4137| 730 | 2167|4613|7307| 731 | 2168|8644|1827| 732 | 2172|7174|7950| 733 | 2177|7199|5422| 734 | 2180|5407|3890| 735 | 2185|6352|6072| 736 | 2188|6424|3301| 737 | 2192|7427|3241| 738 | 2193|4898|3445| 739 | 2198|8996|4731| 740 | 2199|6864|1389| 741 | 2203|9149|1702| 742 | 2204|8395|2240| 743 | 2206|5734|6690| 744 | 2208|6964|7479| 745 | 2213|7978|7737| 746 | 2218|7454|4352| 747 | 2221|6603|8226| 748 | 2226|7590|4178| 749 | 2230|5678|1016| 750 | 2231|5510|5339| 751 | 2234|7279|1596| 752 | 2237|7102|8247| 753 | 2241|8717|455| 754 | 2244|5917|1011| 755 | 2245|6581|3998| 756 | 2247|5158|725| 757 | 2250|9817|649| 758 | 2252|5611|6021| 759 | 2255|6748|3363| 760 | 2259|8091|623| 761 | 2263|6087|1987| 762 | 2265|8580|462| 763 | 2270|4768|4750| 764 | 2273|6513|4657| 765 | 2274|10015|7021| 766 | 2279|5174|7210| 767 | 2280|8501|308| 768 | 2284|4571|4899| 769 | 2287|5224|3449| 770 | 2291|9124|4458| 771 | 2293|4761|5122| 772 | 2298|6349|6290| 773 | 2303|5673|5970| 774 | 2307|10097|5820| 775 | 2310|4470|1554| 776 | 2311|4766|1448| 777 | 2312|9771|8198| 778 | 2317|4600|1590| 779 | 2321|10229|7963| 780 | 2324|8931|2503| 781 | 2326|10033|6775| 782 | 2331|5704|5641| 783 | 2335|10005|3796| 784 | 2340|5398|1684| 785 | 2345|8414|5323| 786 | 2346|8891|6401| 787 | 2348|10152|8602| 788 | 2352|8910|8316| 789 | 2356|5939|6196| 790 | 2357|6057|6614| 791 | 2361|8539|7351| 792 | 2364|10049|6726| 793 | 2368|9489|6027| 794 | 2373|4879|2595| 795 | 2378|5703|7872| 796 | 2382|7584|8546| 797 | 2384|8790|6002| 798 | 2389|9275|5386| 799 | 2392|8137|4118| 800 | 2393|6620|847| 801 | 2397|7831|6492| 802 | 2400|9257|5524| 803 | 2402|10167|239| 804 | 2406|7179|8493| 805 | 2407|9535|4655| 806 | 2410|4796|1997| 807 | 2413|8609|1595| 808 | 2416|9912|7990| 809 | 2417|9463|2157| 810 | 2420|4407|8341| 811 | 2422|6948|2118| 812 | 2426|4975|5035| 813 | 2428|6433|4541| 814 | 2429|6823|279| 815 | 2434|8827|7387| 816 | 2435|7876|3450| 817 | 2436|4944|2469| 818 | 2441|9139|7753| 819 | 2443|4844|916| 820 | 2445|8501|6249| 821 | 2450|9210|5621| 822 | 2454|8146|3439| 823 | 2458|4676|7590| 824 | 2459|8083|4013| 825 | 2462|7121|7985| 826 | 2465|5911|4587| 827 | 2469|9403|1752| 828 | 2471|7452|7227| 829 | 2476|9978|3591| 830 | 2481|5662|2732| 831 | 2485|5759|6136| 832 | 2488|5315|2713| 833 | 2491|6184|6914| 834 | 2495|5028|753| 835 | 2497|7599|6128| 836 | 2499|5849|1038| 837 | 2501|9921|2129| 838 | 2503|6175|1612| 839 | 2505|6475|6571| 840 | 2508|10048|8085| 841 | 2510|7082|2707| 842 | 2513|9270|6831| 843 | 2516|9414|4625| 844 | 2519|7801|2364| 845 | 2522|8908|2256| 846 | 2525|9541|4140| 847 | 2530|9212|2379| 848 | 2535|9003|6327| 849 | 2537|9837|7985| 850 | 2540|8250|4191| 851 | 2541|4595|2209| 852 | 2546|9078|4318| 853 | 2549|6814|2537| 854 | 2552|7423|7117| 855 | 2556|6717|852| 856 | 2558|5867|5023| 857 | 2559|8074|5450| 858 | 2560|10073|6970| 859 | 2563|4824|7079| 860 | 2567|7861|788| 861 | 2570|7701|1868| 862 | 2571|5820|7170| 863 | 2576|8741|2301| 864 | 2580|6514|3694| 865 | 2581|5692|1486| 866 | 2583|9785|656| 867 | 2587|9525|7839| 868 | 2590|6547|1177| 869 | 2594|5370|3583| 870 | 2599|7900|8600| 871 | 2601|10076|2223| 872 | 2603|7941|1980| 873 | 2606|4568|7209| 874 | 2610|7811|5626| 875 | 2615|7456|1016| 876 | 2617|4708|7070| 877 | 2620|7408|6149| 878 | 2625|4896|3998| 879 | 2627|7734|1022| 880 | 2629|9541|7582| 881 | 2634|4666|4422| 882 | 2636|9443|4584| 883 | 2638|9501|6747| 884 | 2642|6915|6422| 885 | 2646|8314|2818| 886 | 2649|10006|7515| 887 | 2652|7121|7079| 888 | 2655|4984|1688| 889 | 2660|8127|6922| 890 | 2665|8043|1550| 891 | 2669|7408|7474| 892 | 2674|5209|1115| 893 | 2675|4923|5020| 894 | 2677|9301|8337| 895 | 2682|5752|763| 896 | 2685|5925|5906| 897 | 2687|7681|2179| 898 | 2691|7138|6813| 899 | 2696|7226|244| 900 | 2701|6045|906| 901 | 2706|7405|6300| 902 | 2710|5943|378| 903 | 2714|4659|2514| 904 | 2718|5895|5690| 905 | 2720|7013|2405| 906 | 2722|5935|1501| 907 | 2726|7872|646| 908 | 2730|5937|5883| 909 | 2731|8970|997| 910 | 2733|4752|6288| 911 | 2734|5058|4607| 912 | 2738|5301|8578| 913 | 2739|9731|5048| 914 | 2740|4871|2228| 915 | 2743|4781|1914| 916 | 2746|6391|2222| 917 | 2750|9162|2296| 918 | 2753|5733|2125| 919 | 2758|8330|4095| 920 | 2762|7477|7641| 921 | 2763|9794|5606| 922 | 2764|8949|5540| 923 | 2769|8052|6250| 924 | 2774|6555|1537| 925 | 2779|7877|1148| 926 | 2782|7207|5125| 927 | 2784|9016|5834| 928 | 2788|5436|7425| 929 | 2791|9719|508| 930 | 2794|7700|7577| 931 | 2799|10033|1257| 932 | 2803|8971|8327| 933 | 2806|5645|4423| 934 | 2810|8925|7348| 935 | 2814|4809|5815| 936 | 2816|6380|8058| 937 | 2820|5799|1087| 938 | 2822|8783|4000| 939 | 2826|7784|3411| 940 | 2829|6277|4817| 941 | 2833|4792|1229| 942 | 2836|5751|1474| 943 | 2837|5718|2792| 944 | 2840|5596|7471| 945 | 2841|8253|1876| 946 | 2844|6459|7398| 947 | 2846|9564|3449| 948 | 2849|5028|4022| 949 | 2851|6830|8590| 950 | 2856|6869|7453| 951 | 2859|7523|2270| 952 | 2860|6460|6076| 953 | 2863|8797|7702| 954 | 2864|7621|4226| 955 | 2866|6371|939| 956 | 2871|6123|5513| 957 | 2873|4808|3273| 958 | 2876|7252|342| 959 | 2879|8665|4757| 960 | 2880|9050|1195| 961 | 2882|9749|8572| 962 | 2886|9218|813| 963 | 2888|4453|2377| 964 | 2892|7772|2496| 965 | 2896|6282|5654| 966 | 2900|4925|579| 967 | 2902|9883|5676| 968 | 2903|9874|2882| 969 | 2908|4645|6716| 970 | 2913|8256|907| 971 | 2915|9394|3643| 972 | 2917|5860|2332| 973 | 2921|8684|5710| 974 | 2924|9573|996| 975 | 2925|5055|6367| 976 | 2929|8349|8620| 977 | 2930|9669|6763| 978 | 2931|9600|3178| 979 | 2932|7010|3636| 980 | 2936|9164|3067| 981 | 2941|5116|7090| 982 | 2945|7667|5604| 983 | 2948|5533|4347| 984 | 2952|7726|8370| 985 | 2957|5774|3773| 986 | 2958|4854|5028| 987 | 2961|4799|7776| 988 | 2965|6414|4488| 989 | 2970|8659|6196| 990 | 2971|8883|4321| 991 | 2976|7712|6374| 992 | 2981|5959|1606| 993 | 2986|9311|3868| 994 | 2989|4881|8545| 995 | 2994|9689|2109| 996 | 2995|5075|6195| 997 | 2999|8916|7177| 998 | 3003|9867|5970| 999 | 3007|9337|6985| 1000 | 3009|8122|5681| 1001 | 3012|5042|7066| 1002 | 3017|9551|6030| 1003 | 3021|5086|7793| 1004 | 3026|7844|8013| 1005 | 3030|5328|7350| 1006 | 3031|8468|2323| 1007 | 3032|9425|2540| 1008 | 3034|9369|441| 1009 | 3035|5491|1007| 1010 | 3036|8712|5906| 1011 | 3041|7063|4111| 1012 | 3042|4804|6500| 1013 | 3047|7737|1758| 1014 | 3050|4477|903| 1015 | 3051|6656|3649| 1016 | 3054|7356|5657| 1017 | 3057|6506|7199| 1018 | 3061|8883|4668| 1019 | 3063|8539|4109| 1020 | 3068|6054|1252| 1021 | 3073|6780|8262| 1022 | 3078|6776|6695| 1023 | 3079|5890|5596| 1024 | 3083|5391|4191| 1025 | 3084|8749|725| 1026 | 3086|5109|8471| 1027 | 3091|9177|446| 1028 | 3093|4586|522| 1029 | 3095|9461|3660| 1030 | 3098|10251|6600| 1031 | 3100|5313|932| 1032 | 3102|4796|960| 1033 | 3106|8778|8204| 1034 | 3111|8648|2980| 1035 | 3112|7966|5627| 1036 | 3115|8862|8593| 1037 | 3119|9671|1204| 1038 | 3120|4632|5961| 1039 | 3122|5119|4527| 1040 | 3126|5186|1964| 1041 | 3129|7921|5960| 1042 | 3132|4731|2236| 1043 | 3133|10101|6134| 1044 | 3135|4819|5956| 1045 | 3136|5271|3824| 1046 | 3141|8526|5899| 1047 | 3142|7018|2588| 1048 | 3146|9823|7881| 1049 | 3147|9734|2023| 1050 | 3150|6338|7314| 1051 | 3152|8893|476| 1052 | 3155|7635|5764| 1053 | 3159|7757|8270| 1054 | 3160|5449|1565| 1055 | 3163|4664|6889| 1056 | 3166|5820|7744| 1057 | 3168|8121|6800| 1058 | 3170|9972|6672| 1059 | 3174|9794|6075| 1060 | 3176|5094|4576| 1061 | 3177|10027|904| 1062 | 3181|8926|8427| 1063 | 3185|7229|1044| 1064 | 3190|7161|8047| 1065 | 3194|9233|4313| 1066 | 3198|5026|2611| 1067 | 3201|8873|4282| 1068 | 3205|8071|6129| 1069 | 3207|8121|8287| 1070 | 3210|10205|5068| 1071 | 3211|9440|5518| 1072 | 3212|9253|2593| 1073 | 3216|8318|7951| 1074 | 3217|5394|6671| 1075 | 3218|4696|5239| 1076 | 3222|5278|6743| 1077 | 3223|7377|964| 1078 | 3227|4442|4805| 1079 | 3230|9478|6034| 1080 | 3233|4620|3219| 1081 | 3237|9708|2967| 1082 | 3242|6743|6250| 1083 | 3245|5593|3632| 1084 | 3246|6597|2214| 1085 | 3249|4476|521| 1086 | 3251|6103|7451| 1087 | 3252|7951|639| 1088 | 3254|9057|5700| 1089 | 3257|8003|8122| 1090 | 3259|10038|7975| 1091 | 3260|6872|8029| 1092 | 3264|8136|456| 1093 | 3267|8463|4309| 1094 | 3270|8824|3625| 1095 | 3271|6041|6817| 1096 | 3272|4874|6827| 1097 | 3275|6113|6038| 1098 | 3277|8917|6172| 1099 | 3278|5861|6736| 1100 | 3282|5974|7251| 1101 | 3283|7574|5543| 1102 | 3288|6025|5859| 1103 | 3290|6413|6524| 1104 | 3294|5565|8614| 1105 | 3298|4580|4928| 1106 | 3300|6667|7491| 1107 | 3301|8978|2570| 1108 | 3304|7070|7595| 1109 | 3307|5394|5377| 1110 | 3311|7781|5297| 1111 | 3316|4776|3165| 1112 | 3318|5084|6583| 1113 | 3320|7638|8488| 1114 | 3324|6549|817| 1115 | 3329|5767|322| 1116 | 3330|8605|7360| 1117 | 3332|8707|7206| 1118 | 3337|4830|5189| 1119 | 3340|6159|372| 1120 | 3344|5377|7477| 1121 | 3345|9611|7821| 1122 | 3348|8164|4052| 1123 | 3349|9485|466| 1124 | 3351|6546|6904| 1125 | 3355|4621|5413| 1126 | 3359|9754|4061| 1127 | 3360|4993|1678| 1128 | 3363|6360|7160| 1129 | 3367|4652|215| 1130 | 3370|10252|6615| 1131 | 3373|4532|7251| 1132 | 3374|8166|4155| 1133 | 3375|4601|7201| 1134 | 3379|7207|4158| 1135 | 3384|7700|8194| 1136 | 3386|7861|7990| 1137 | 3389|6263|1535| 1138 | 3390|5582|1138| 1139 | 3391|6067|7852| 1140 | 3393|8206|2589| 1141 | 3394|9823|1587| 1142 | 3398|5502|5145| 1143 | 3399|9369|1967| 1144 | 3400|9690|580| 1145 | 3403|8144|3222| 1146 | 3406|5873|6227| 1147 | 3411|10049|4675| 1148 | 3413|7384|1606| 1149 | 3417|7133|676| 1150 | 3420|4775|3775| 1151 | 3422|8917|8114| 1152 | 3423|9047|965| 1153 | 3427|6705|1722| 1154 | 3431|6811|5529| 1155 | 3433|6231|3509| 1156 | 3438|6431|793| 1157 | 3442|9082|6961| 1158 | 3446|9162|2400| 1159 | 3447|4577|3196| 1160 | 3452|4507|865| 1161 | 3457|5493|6264| 1162 | 3461|9908|8167| 1163 | 3462|6062|3187| 1164 | 3463|7486|3849| 1165 | 3466|9121|6226| 1166 | 3471|7331|1572| 1167 | 3472|4921|6724| 1168 | 3474|8009|7306| 1169 | 3479|9756|2863| 1170 | 3483|4647|6576| 1171 | 3486|7185|7150| 1172 | 3490|9524|4073| 1173 | 3491|8954|1086| 1174 | 3493|5455|5972| 1175 | 3494|9641|2852| 1176 | 3496|9704|2741| 1177 | 3501|4738|3788| 1178 | 3503|8017|6906| 1179 | 3508|7682|7085| 1180 | 3510|8642|5074| 1181 | 3513|6262|4880| 1182 | 3518|6047|4869| 1183 | 3520|10148|570| 1184 | 3523|6291|4638| 1185 | 3528|6758|296| 1186 | 3533|8733|3541| 1187 | 3537|8893|1956| 1188 | 3540|9322|6507| 1189 | 3545|7855|897| 1190 | 3550|7454|4266| 1191 | 3552|5667|5348| 1192 | 3553|4552|4546| 1193 | 3554|8460|607| 1194 | 3556|7969|536| 1195 | 3560|8047|1863| 1196 | 3564|10232|7729| 1197 | 3567|8710|4250| 1198 | 3572|9393|1193| 1199 | 3574|4426|8294| 1200 | 3579|8586|1132| 1201 | 3583|7263|6991| 1202 | 3584|5965|197| 1203 | 3586|7995|4673| 1204 | 3591|8162|3153| 1205 | 3592|10118|8377| 1206 | 3593|4426|4658| 1207 | 3596|6239|294| 1208 | 3601|10156|8192| 1209 | 3606|4417|3884| 1210 | 3607|4621|6695| 1211 | 3608|4713|4193| 1212 | 3612|9358|6751| 1213 | 3615|10233|8083| 1214 | 3618|5491|7467| 1215 | 3621|7543|634| 1216 | 3626|8694|5211| 1217 | 3629|5548|1447| 1218 | 3631|9385|7794| 1219 | 3633|8457|4657| 1220 | 3636|8784|8632| 1221 | 3637|7913|2272| 1222 | 3638|5895|6770| 1223 | 3641|9956|5988| 1224 | 3642|8720|6869| 1225 | 3645|7338|4743| 1226 | 3646|8644|2916| 1227 | 3647|4953|6344| 1228 | 3652|9987|7772| 1229 | 3653|5283|5263| 1230 | 3654|10164|4956| 1231 | 3657|6899|4776| 1232 | 3659|5096|7411| 1233 | 3664|6011|1229| 1234 | 3665|5294|2258| 1235 | 3667|5204|5453| 1236 | 3669|5143|7587| 1237 | 3673|7139|6359| 1238 | 3677|9165|5748| 1239 | 3682|6142|8518| 1240 | 3685|6507|4853| 1241 | 3689|10094|1161| 1242 | 3693|6978|878| 1243 | 3698|9898|4895| 1244 | 3702|5567|475| 1245 | 3704|9021|6374| 1246 | 3706|6622|8242| 1247 | 3711|8547|8486| 1248 | 3714|6862|3491| 1249 | 3715|7496|3240| 1250 | 3717|7607|6914| 1251 | 3722|10259|4392| 1252 | 3725|7354|5772| 1253 | 3729|9405|4036| 1254 | 3733|4890|1188| 1255 | 3738|4716|4426| 1256 | 3742|10119|2240| 1257 | 3747|7204|3772| 1258 | 3750|5104|5554| 1259 | 3752|6409|2911| 1260 | 3756|9611|4012| 1261 | 3761|8458|7356| 1262 | 3765|8409|2450| 1263 | 3770|6754|7023| 1264 | 3771|8697|6931| 1265 | 3776|4409|7762| 1266 | 3781|7677|1683| 1267 | 3784|7540|6601| 1268 | 3786|9335|7057| 1269 | 3791|9354|6794| 1270 | 3796|5771|1232| 1271 | 3798|9814|973| 1272 | 3801|5713|8334| 1273 | 3806|6601|5522| 1274 | 3811|9646|8107| 1275 | 3816|6298|3180| 1276 | 3817|9271|1143| 1277 | 3820|8033|8335| 1278 | 3825|4759|6179| 1279 | 3827|8412|3665| 1280 | 3829|7574|5886| 1281 | 3830|4934|5966| 1282 | 3834|6705|4240| 1283 | 3837|7845|2671| 1284 | 3840|5968|5222| 1285 | 3845|4403|2607| 1286 | 3846|6970|4977| 1287 | 3848|6019|5271| 1288 | 3851|5713|5098| 1289 | 3855|9036|1057| 1290 | 3858|9186|3920| 1291 | 3862|8307|276| 1292 | 3863|5847|4401| 1293 | 3867|7832|2554| 1294 | 3871|5541|4422| 1295 | 3874|10139|3770| 1296 | 3875|5769|4230| 1297 | 3880|7080|7308| 1298 | 3883|7045|4335| 1299 | 3888|10105|3520| 1300 | 3893|4475|1328| 1301 | 3896|7229|837| 1302 | 3901|5069|7640| 1303 | 3905|7271|4047| 1304 | 3910|4736|3898| 1305 | 3912|5303|404| 1306 | 3915|7449|1490| 1307 | 3917|5501|5297| 1308 | 3922|9141|6638| 1309 | 3925|7650|614| 1310 | 3926|4584|3449| 1311 | 3929|4711|7879| 1312 | 3933|6052|8044| 1313 | 3937|4524|7958| 1314 | 3941|8062|5276| 1315 | 3946|4425|7900| 1316 | 3951|8869|5262| 1317 | 3954|8533|1681| 1318 | 3958|8253|6640| 1319 | 3963|8408|6646| 1320 | 3965|5924|7101| 1321 | 3967|5906|7263| 1322 | 3969|7557|3703| 1323 | 3973|9409|1537| 1324 | 3976|4622|2307| 1325 | 3981|9316|5745| 1326 | 3982|9096|4091| 1327 | 3986|7881|320| 1328 | 3991|8802|3477| 1329 | 3994|6543|7958| 1330 | 3995|6262|7345| 1331 | 3996|5207|647| 1332 | 3997|10260|8213| 1333 | 4001|10046|5815| 1334 | 4004|5933|4015| 1335 | 4008|8924|5474| 1336 | 4011|6825|4657| 1337 | 4016|9526|6228| 1338 | 4018|9802|1333| 1339 | 4022|4656|7551| 1340 | 4027|8117|7454| 1341 | 4030|6228|8393| 1342 | 4033|5031|3154| 1343 | 4038|5791|5344| 1344 | 4042|9741|8185| 1345 | 4044|7575|7116| 1346 | 4049|9215|6477| 1347 | 4053|5432|3124| 1348 | 4055|9275|5285| 1349 | 4056|6235|1411| 1350 | 4058|4975|7041| 1351 | 4061|6582|3554| 1352 | 4063|4938|6222| 1353 | 4064|8051|4755| 1354 | 4067|8525|6205| 1355 | 4068|5526|2567| 1356 | 4072|6263|6255| 1357 | 4075|4702|4643| 1358 | 4080|5577|7343| 1359 | 4083|7134|1751| 1360 | 4085|4977|4660| 1361 | 4086|4767|518| 1362 | 4088|5554|6609| 1363 | 4089|10036|2188| 1364 | 4092|5166|7971| 1365 | 4097|9595|6845| 1366 | 4100|6014|6258| 1367 | 4101|4767|5358| 1368 | 4106|8787|1768| 1369 | 4110|10080|3253| 1370 | 4111|4668|5379| 1371 | 4114|9914|8379| 1372 | 4119|8914|2762| 1373 | 4122|7429|7697| 1374 | 4125|5319|1801| 1375 | 4130|5069|1161| 1376 | 4134|4969|1739| 1377 | 4136|6437|3250| 1378 | 4138|9903|4204| 1379 | 4141|8662|5633| 1380 | 4143|5292|6045| 1381 | 4148|6824|5034| 1382 | 4150|10205|6836| 1383 | 4153|5928|2726| 1384 | 4156|5146|4488| 1385 | 4161|8497|2841| 1386 | 4163|8680|2538| 1387 | 4168|4484|643| 1388 | 4169|9864|7069| 1389 | 4173|6251|2295| 1390 | 4178|8421|5241| 1391 | 4182|4464|7795| 1392 | 4183|4465|223| 1393 | 4184|9883|4975| 1394 | 4187|9146|3566| 1395 | 4190|5491|4411| 1396 | 4192|5947|5236| 1397 | 4195|7202|220| 1398 | 4196|10083|7837| 1399 | 4199|8652|6385| 1400 | 4202|8822|5857| 1401 | 4207|5784|4155| 1402 | 4212|8158|5532| 1403 | 4213|5721|5667| 1404 | 4217|5531|5482| 1405 | 4220|6793|995| 1406 | 4221|6714|3054| 1407 | 4224|5198|4786| 1408 | 4229|8052|4514| 1409 | 4230|5307|5271| 1410 | 4233|7977|2018| 1411 | 4234|5726|5657| 1412 | 4239|8016|8433| 1413 | 4244|7084|7066| 1414 | 4245|6678|5934| 1415 | 4249|9332|770| 1416 | 4253|4548|4419| 1417 | 4256|5843|7303| 1418 | 4260|9665|5723| 1419 | 4262|7718|3343| 1420 | 4266|7768|1793| 1421 | 4269|5000|6622| 1422 | 4271|8216|8020| 1423 | 4276|5622|6687| 1424 | 4278|10175|5060| 1425 | 4280|9333|4608| 1426 | 4283|4878|5365| 1427 | 4285|7090|8362| 1428 | 4290|5302|4188| 1429 | 4291|6766|5832| 1430 | 4293|8339|849| 1431 | 4294|7684|631| 1432 | 4297|7519|8562| 1433 | 4300|7081|6855| 1434 | 4304|4469|664| 1435 | 4306|8726|4028| 1436 | 4308|9090|7785| 1437 | 4310|6088|1839| 1438 | 4313|4823|4170| 1439 | 4315|9805|3129| 1440 | 4318|6053|3038| 1441 | 4322|8349|5156| 1442 | 4327|6387|3741| 1443 | 4329|4974|6986| 1444 | 4331|9868|7445| 1445 | 4333|4549|3094| 1446 | 4335|6369|1785| 1447 | 4338|4797|3945| 1448 | 4343|4702|5732| 1449 | 4345|4569|7530| 1450 | 4349|9828|3686| 1451 | 4354|8612|8039| 1452 | 4355|4923|4627| 1453 | 4356|5282|1965| 1454 | 4360|8675|2310| 1455 | 4362|5648|5422| 1456 | 4366|9298|8159| 1457 | 4368|5027|8490| 1458 | 4370|10184|7337| 1459 | 4371|6993|6895| 1460 | 4376|8594|1950| 1461 | 4379|7624|4175| 1462 | 4383|7872|7065| 1463 | 4387|9588|569| 1464 | 4392|9625|4581| 1465 | 4396|7154|5617| 1466 | 4398|6111|6496| 1467 | 4403|7432|5743| 1468 | 4405|5345|8252| 1469 | 4409|8382|6982| 1470 | 4413|4592|5920| 1471 | 4417|5901|4064| 1472 | 4421|7326|670| 1473 | 4423|8705|6038| 1474 | 4425|10082|3873| 1475 | 4429|7148|551| 1476 | 4431|10195|2113| 1477 | 4435|9702|6742| 1478 | 4437|9883|8308| 1479 | 4440|9490|8448| 1480 | 4441|8821|6001| 1481 | 4443|4854|6077| 1482 | 4448|7818|1530| 1483 | 4453|7759|3939| 1484 | 4456|6643|4838| 1485 | 4459|7835|2400| 1486 | 4463|4498|2283| 1487 | 4465|6353|1004| 1488 | 4470|5079|7838| 1489 | 4475|8224|3742| 1490 | 4477|6260|7704| 1491 | 4479|8738|3242| 1492 | 4484|6587|6736| 1493 | 4488|8867|2831| 1494 | 4493|10141|1330| 1495 | 4498|6879|6154| 1496 | 4501|4990|463| 1497 | 4506|7653|5900| 1498 | 4508|5797|4009| 1499 | 4512|5147|1134| 1500 | 4513|7716|778| 1501 | 4517|7684|7133| 1502 | 4521|7064|5317| 1503 | 4524|6905|5766| 1504 | 4527|10165|5610| 1505 | 4531|6914|4397| 1506 | 4532|6462|2319| 1507 | 4537|6664|2056| 1508 | 4542|9802|6737| 1509 | 4546|5175|6374| 1510 | 4548|8667|3545| 1511 | 4550|5619|6556| 1512 | 4551|9921|4230| 1513 | 4552|6382|8191| 1514 | 4553|7186|7314| 1515 | 4555|8239|8319| 1516 | 4557|7731|4201| 1517 | 4561|9458|3991| 1518 | 4564|9167|6802| 1519 | 4565|5591|2083| 1520 | 4570|9519|6884| 1521 | 4571|9115|8239| 1522 | 4572|6735|2993| 1523 | 4577|9495|6768| 1524 | 4581|9221|471| 1525 | 4583|6481|2468| 1526 | 4588|6159|895| 1527 | 4590|6476|4074| 1528 | 4594|4797|1269| 1529 | 4597|6076|4928| 1530 | 4600|7534|2621| 1531 | 4602|6609|7371| 1532 | 4605|5865|1741| 1533 | 4609|5250|6083| 1534 | 4610|9547|7132| 1535 | 4611|7886|5779| 1536 | 4614|8880|3777| 1537 | 4616|6325|6233| 1538 | 4620|6071|2365| 1539 | 4624|8797|7871| 1540 | 4626|5307|548| 1541 | 4630|7224|7868| 1542 | 4632|8205|7352| 1543 | 4634|6217|2628| 1544 | 4635|8717|4193| 1545 | 4639|6478|1390| 1546 | 4640|8555|6008| 1547 | 4644|9802|4697| 1548 | 4647|6171|3260| 1549 | 4652|7330|3334| 1550 | 4654|9818|680| 1551 | 4655|9477|6130| 1552 | 4658|8184|1500| 1553 | 4663|5683|6788| 1554 | 4667|7662|3681| 1555 | 4670|9704|8508| 1556 | 4674|4707|6667| 1557 | 4678|5194|2750| 1558 | 4679|6009|933| 1559 | 4683|7536|3661| 1560 | 4686|8974|4048| 1561 | 4690|5930|4307| 1562 | -------------------------------------------------------------------------------- /workloads/small/r4.tbl: -------------------------------------------------------------------------------- 1 | 4|6207| 2 | 6|8688| 3 | 9|8210| 4 | 12|5657| 5 | 17|5595| 6 | 21|9792| 7 | 26|3209| 8 | 29|4989| 9 | 32|7248| 10 | 33|9527| 11 | 38|2615| 12 | 42|7599| 13 | 43|3885| 14 | 44|5222| 15 | 49|1704| 16 | 51|3416| 17 | 54|2034| 18 | 57|8009| 19 | 60|9410| 20 | 61|7701| 21 | 64|2102| 22 | 67|8290| 23 | 72|5448| 24 | 74|10223| 25 | 79|10542| 26 | 80|611| 27 | 85|1635| 28 | 86|5204| 29 | 91|2379| 30 | 92|7418| 31 | 97|10983| 32 | 98|10240| 33 | 99|4792| 34 | 104|855| 35 | 105|7250| 36 | 110|10516| 37 | 115|10895| 38 | 117|9567| 39 | 120|4759| 40 | 121|5522| 41 | 124|170| 42 | 128|11410| 43 | 131|5222| 44 | 132|6065| 45 | 136|2060| 46 | 139|8291| 47 | 144|3405| 48 | 146|8147| 49 | 149|4704| 50 | 151|8941| 51 | 152|10733| 52 | 157|356| 53 | 160|4120| 54 | 162|9750| 55 | 166|7641| 56 | 169|11091| 57 | 173|1389| 58 | 176|7693| 59 | 179|8921| 60 | 182|7183| 61 | 184|2997| 62 | 185|1929| 63 | 190|3522| 64 | 194|5372| 65 | 195|1730| 66 | 197|1758| 67 | 200|8119| 68 | 201|6697| 69 | 203|8087| 70 | 204|1735| 71 | 206|3501| 72 | 207|9688| 73 | 209|1907| 74 | 212|8742| 75 | 216|9925| 76 | 219|6008| 77 | 222|1555| 78 | 227|7715| 79 | 229|9112| 80 | 230|2613| 81 | 234|5209| 82 | 236|2759| 83 | 237|8717| 84 | 238|4144| 85 | 242|1002| 86 | 243|4741| 87 | 246|2840| 88 | 250|8299| 89 | 252|6786| 90 | 253|7296| 91 | 256|9249| 92 | 260|10153| 93 | 264|8719| 94 | 269|3441| 95 | 272|3773| 96 | 273|1743| 97 | 275|9018| 98 | 277|330| 99 | 278|3084| 100 | 280|4309| 101 | 281|4864| 102 | 284|968| 103 | 285|1834| 104 | 288|4350| 105 | 293|5732| 106 | 296|7272| 107 | 300|3423| 108 | 305|4113| 109 | 308|6635| 110 | 311|4658| 111 | 314|11158| 112 | 316|9808| 113 | 318|4864| 114 | 321|9701| 115 | 322|5475| 116 | 324|77| 117 | 329|8342| 118 | 331|8872| 119 | 332|7796| 120 | 337|572| 121 | 340|3398| 122 | 345|8445| 123 | 349|3479| 124 | 352|10114| 125 | 356|776| 126 | 360|5008| 127 | 363|837| 128 | 364|726| 129 | 367|317| 130 | 370|7577| 131 | 372|1072| 132 | 377|4002| 133 | 380|846| 134 | 385|9834| 135 | 386|8498| 136 | 389|10195| 137 | 393|4762| 138 | 395|10166| 139 | 397|5887| 140 | 401|7733| 141 | 405|8712| 142 | 408|6522| 143 | 411|9529| 144 | 413|473| 145 | 417|3276| 146 | 418|10043| 147 | 423|3598| 148 | 424|10014| 149 | 425|9122| 150 | 427|7958| 151 | 429|67| 152 | 431|2418| 153 | 432|7886| 154 | 434|4141| 155 | 435|2382| 156 | 437|9393| 157 | 441|359| 158 | 442|3183| 159 | 445|7927| 160 | 450|4692| 161 | 451|8941| 162 | 456|1611| 163 | 459|10255| 164 | 460|368| 165 | 462|9088| 166 | 464|1974| 167 | 469|5010| 168 | 471|163| 169 | 475|4805| 170 | 477|7206| 171 | 482|9407| 172 | 484|2426| 173 | 486|502| 174 | 491|8521| 175 | 495|4038| 176 | 500|1563| 177 | 505|10173| 178 | 506|9716| 179 | 507|9051| 180 | 510|8823| 181 | 514|9776| 182 | 517|2744| 183 | 520|11259| 184 | 522|2414| 185 | 526|807| 186 | 530|2164| 187 | 531|1090| 188 | 535|10693| 189 | 540|2317| 190 | 544|3379| 191 | 548|3084| 192 | 552|9914| 193 | 555|5913| 194 | 558|9897| 195 | 563|8917| 196 | 568|3898| 197 | 571|7848| 198 | 574|2444| 199 | 576|2739| 200 | 580|3537| 201 | 581|4348| 202 | 586|3608| 203 | 587|186| 204 | 591|9843| 205 | 594|6530| 206 | 598|6128| 207 | 602|3427| 208 | 603|2903| 209 | 606|3807| 210 | 608|9955| 211 | 609|4497| 212 | 613|3418| 213 | 615|1130| 214 | 617|1203| 215 | 622|3855| 216 | 623|5107| 217 | 624|1747| 218 | 628|4950| 219 | 631|6534| 220 | 633|7427| 221 | 636|6408| 222 | 639|9213| 223 | 643|4358| 224 | 644|3096| 225 | 649|3795| 226 | 653|3815| 227 | 658|5697| 228 | 662|1216| 229 | 666|6663| 230 | 667|799| 231 | 670|5692| 232 | 671|5032| 233 | 675|10933| 234 | 676|2370| 235 | 678|3655| 236 | 680|6983| 237 | 684|11245| 238 | 685|7441| 239 | 686|4188| 240 | 687|10775| 241 | 690|11063| 242 | 695|2355| 243 | 696|4093| 244 | 700|220| 245 | 705|8244| 246 | 709|7761| 247 | 712|9186| 248 | 713|951| 249 | 717|11006| 250 | 721|6804| 251 | 726|9071| 252 | 727|551| 253 | 730|5479| 254 | 733|10848| 255 | 737|11063| 256 | 742|5726| 257 | 743|7523| 258 | 745|4735| 259 | 750|4819| 260 | 753|9161| 261 | 754|10539| 262 | 758|6189| 263 | 761|9130| 264 | 765|689| 265 | 770|8347| 266 | 774|1069| 267 | 778|4329| 268 | 783|11033| 269 | 788|8894| 270 | 789|4188| 271 | 791|4215| 272 | 795|2379| 273 | 797|4846| 274 | 801|10560| 275 | 804|9635| 276 | 808|6007| 277 | 810|4973| 278 | 811|5750| 279 | 812|8548| 280 | 816|6075| 281 | 819|10603| 282 | 824|8112| 283 | 829|8794| 284 | 832|9071| 285 | 836|5338| 286 | 839|8013| 287 | 843|8772| 288 | 846|9734| 289 | 847|10747| 290 | 850|1641| 291 | 854|375| 292 | 856|10533| 293 | 861|5190| 294 | 862|8241| 295 | 863|10843| 296 | 867|3763| 297 | 868|4520| 298 | 873|2086| 299 | 877|1479| 300 | 879|6051| 301 | 881|1713| 302 | 882|2911| 303 | 883|1538| 304 | 887|5616| 305 | 892|4669| 306 | 894|1055| 307 | 897|633| 308 | 899|8087| 309 | 903|7992| 310 | 907|4626| 311 | 909|9987| 312 | 911|1758| 313 | 915|4818| 314 | 918|4010| 315 | 923|3437| 316 | 926|7381| 317 | 927|3389| 318 | 929|10227| 319 | 931|1381| 320 | 935|6253| 321 | 938|5894| 322 | 939|1880| 323 | 943|10142| 324 | 944|3017| 325 | 948|9003| 326 | 951|7730| 327 | 954|6121| 328 | 958|8438| 329 | 962|8963| 330 | 963|5459| 331 | 967|5692| 332 | 968|9812| 333 | 973|4141| 334 | 976|7510| 335 | 981|6319| 336 | 985|1851| 337 | 990|11026| 338 | 994|1207| 339 | 998|7814| 340 | 1002|10003| 341 | 1004|816| 342 | 1008|4729| 343 | 1009|9437| 344 | 1013|423| 345 | 1015|9993| 346 | 1020|11165| 347 | 1023|10288| 348 | 1026|10074| 349 | 1031|10837| 350 | 1033|1728| 351 | 1035|490| 352 | 1036|289| 353 | 1038|5201| 354 | 1039|3751| 355 | 1041|5798| 356 | 1042|1311| 357 | 1043|11221| 358 | 1045|1751| 359 | 1048|11169| 360 | 1053|906| 361 | 1057|8004| 362 | 1060|5436| 363 | 1062|837| 364 | 1064|7118| 365 | 1067|7283| 366 | 1069|8892| 367 | 1073|10168| 368 | 1076|10267| 369 | 1080|6635| 370 | 1085|4740| 371 | 1087|566| 372 | 1091|299| 373 | 1093|1021| 374 | 1096|3710| 375 | 1097|10907| 376 | 1099|3479| 377 | 1102|792| 378 | 1107|7678| 379 | 1110|1880| 380 | 1112|1324| 381 | 1115|1095| 382 | 1120|10678| 383 | 1121|6845| 384 | 1124|9372| 385 | 1129|4446| 386 | 1134|994| 387 | 1139|9240| 388 | 1144|6403| 389 | 1145|5362| 390 | 1148|6220| 391 | 1153|6159| 392 | 1155|4965| 393 | 1157|3530| 394 | 1162|3777| 395 | 1166|655| 396 | 1169|1560| 397 | 1171|6356| 398 | 1174|10436| 399 | 1177|5069| 400 | 1181|8505| 401 | 1186|4278| 402 | 1187|5028| 403 | 1192|3097| 404 | 1195|7901| 405 | 1197|2811| 406 | 1201|1080| 407 | 1202|4968| 408 | 1207|6520| 409 | 1208|7019| 410 | 1212|9448| 411 | 1217|8342| 412 | 1218|10768| 413 | 1219|6304| 414 | 1224|1377| 415 | 1227|6498| 416 | 1228|6372| 417 | 1233|8710| 418 | 1238|2785| 419 | 1243|1748| 420 | 1247|6119| 421 | 1252|4849| 422 | 1255|1811| 423 | 1258|965| 424 | 1263|4901| 425 | 1268|5119| 426 | 1272|5153| 427 | 1273|6200| 428 | 1276|1481| 429 | 1280|8695| 430 | 1285|9433| 431 | 1286|8423| 432 | 1289|5719| 433 | 1291|9582| 434 | 1293|807| 435 | 1297|9529| 436 | 1299|5809| 437 | 1303|8806| 438 | 1305|11026| 439 | 1308|6177| 440 | 1313|8290| 441 | 1315|8485| 442 | 1317|2315| 443 | 1322|3040| 444 | 1326|10033| 445 | 1329|7751| 446 | 1333|378| 447 | 1337|8421| 448 | 1339|8328| 449 | 1340|2221| 450 | 1343|7940| 451 | 1347|1180| 452 | 1350|3702| 453 | 1354|4995| 454 | 1359|7268| 455 | 1364|6782| 456 | 1366|10853| 457 | 1370|9782| 458 | 1375|4396| 459 | 1379|8353| 460 | 1381|5063| 461 | 1385|9282| 462 | 1386|1897| 463 | 1390|3639| 464 | 1392|9396| 465 | 1393|1464| 466 | 1398|1601| 467 | 1403|6833| 468 | 1405|544| 469 | 1408|7672| 470 | 1411|9359| 471 | 1414|2668| 472 | 1418|8666| 473 | 1421|10859| 474 | 1426|8529| 475 | 1429|8964| 476 | 1433|2632| 477 | 1436|8955| 478 | 1437|5479| 479 | 1441|10939| 480 | 1444|2993| 481 | 1448|9735| 482 | 1451|8112| 483 | 1455|10231| 484 | 1456|7082| 485 | 1459|2204| 486 | 1463|7336| 487 | 1464|2930| 488 | 1469|10320| 489 | 1472|8689| 490 | 1475|1664| 491 | 1479|4508| 492 | 1482|6271| 493 | 1485|866| 494 | 1490|8380| 495 | 1494|10094| 496 | 1499|8018| 497 | 1503|1564| 498 | 1507|792| 499 | 1510|8210| 500 | 1514|2598| 501 | 1519|1524| 502 | 1522|9148| 503 | 1524|3426| 504 | 1525|1935| 505 | 1528|6080| 506 | 1529|11148| 507 | 1532|10420| 508 | 1535|8944| 509 | 1540|4521| 510 | 1544|493| 511 | 1545|2550| 512 | 1549|3526| 513 | 1553|10153| 514 | 1556|861| 515 | 1558|6803| 516 | 1560|9989| 517 | 1561|2337| 518 | 1566|10258| 519 | 1568|1752| 520 | 1572|3895| 521 | 1577|3051| 522 | 1582|3702| 523 | 1586|5270| 524 | 1590|1168| 525 | 1595|6495| 526 | 1597|10586| 527 | 1602|6645| 528 | 1603|2807| 529 | 1605|4889| 530 | 1606|6460| 531 | 1609|6182| 532 | 1614|3088| 533 | 1619|3258| 534 | 1623|8787| 535 | 1624|6517| 536 | 1628|6171| 537 | 1629|10121| 538 | 1633|6865| 539 | 1635|9570| 540 | 1637|8977| 541 | 1638|6042| 542 | 1640|1069| 543 | 1642|4213| 544 | 1643|216| 545 | 1648|4464| 546 | 1651|2978| 547 | 1653|589| 548 | 1658|10498| 549 | 1660|8123| 550 | 1665|1836| 551 | 1670|6706| 552 | 1671|5539| 553 | 1675|9410| 554 | 1677|5765| 555 | 1682|3702| 556 | 1687|468| 557 | 1691|8410| 558 | 1694|5683| 559 | 1696|2896| 560 | 1700|5367| 561 | 1705|1471| 562 | 1706|9834| 563 | 1708|11084| 564 | 1711|891| 565 | 1714|3072| 566 | 1718|3428| 567 | 1719|3457| 568 | 1721|10038| 569 | 1724|2186| 570 | 1725|2748| 571 | 1728|2145| 572 | 1732|994| 573 | 1733|1527| 574 | 1736|5975| 575 | 1741|7745| 576 | 1744|3480| 577 | 1745|7470| 578 | 1748|7608| 579 | 1749|10674| 580 | 1754|1448| 581 | 1758|10602| 582 | 1761|6725| 583 | 1766|3542| 584 | 1768|1515| 585 | 1770|3807| 586 | 1775|8005| 587 | 1779|5888| 588 | 1780|280| 589 | 1784|4889| 590 | 1788|9224| 591 | 1791|3402| 592 | 1792|2345| 593 | 1794|6942| 594 | 1795|9472| 595 | 1796|4936| 596 | 1800|5894| 597 | 1804|4581| 598 | 1808|9511| 599 | 1809|4043| 600 | 1811|572| 601 | 1816|4715| 602 | 1817|8181| 603 | 1820|7712| 604 | 1825|9079| 605 | 1829|374| 606 | 1832|1032| 607 | 1833|2422| 608 | 1835|6084| 609 | 1837|5652| 610 | 1839|8409| 611 | 1842|906| 612 | 1845|6591| 613 | 1846|10888| 614 | 1847|9496| 615 | 1850|2930| 616 | 1853|776| 617 | 1856|6563| 618 | 1860|2099| 619 | 1862|8223| 620 | 1863|2935| 621 | 1868|8253| 622 | 1871|6543| 623 | 1872|3398| 624 | 1875|7242| 625 | 1879|9705| 626 | 1880|9018| 627 | 1883|1420| 628 | 1887|3706| 629 | 1892|6498| 630 | 1896|5748| 631 | 1898|3599| 632 | 1901|316| 633 | 1902|4394| 634 | 1907|7493| 635 | 1910|5367| 636 | 1912|9741| 637 | 1916|1311| 638 | 1918|7183| 639 | 1921|1971| 640 | 1922|3635| 641 | 1926|1786| 642 | 1930|3673| 643 | 1934|2128| 644 | 1937|259| 645 | 1942|1773| 646 | 1943|8854| 647 | 1945|7708| 648 | 1946|5583| 649 | 1947|2249| 650 | 1948|8472| 651 | 1949|6978| 652 | 1951|5765| 653 | 1953|1756| 654 | 1956|9555| 655 | 1958|7147| 656 | 1963|9060| 657 | 1968|11179| 658 | 1970|9154| 659 | 1973|3706| 660 | 1976|6992| 661 | 1978|9006| 662 | 1983|7928| 663 | 1985|5265| 664 | 1986|956| 665 | 1991|3592| 666 | 1995|8521| 667 | 1998|8122| 668 | 2000|2861| 669 | 2001|3864| 670 | 2005|10271| 671 | 2008|1374| 672 | 2011|4113| 673 | 2014|5250| 674 | 2018|5217| 675 | 2022|9385| 676 | 2026|8528| 677 | 2029|3621| 678 | 2033|4794| 679 | 2038|5500| 680 | 2042|9100| 681 | 2046|10990| 682 | 2048|3541| 683 | 2053|306| 684 | 2057|8964| 685 | 2061|1915| 686 | 2064|2379| 687 | 2066|7614| 688 | 2070|9512| 689 | 2073|2861| 690 | 2074|7860| 691 | 2075|8362| 692 | 2079|6372| 693 | 2084|10817| 694 | 2089|776| 695 | 2093|9213| 696 | 2098|5580| 697 | 2103|8288| 698 | 2107|3197| 699 | 2109|4167| 700 | 2112|9441| 701 | 2114|2513| 702 | 2116|6211| 703 | 2121|1486| 704 | 2125|8876| 705 | 2126|4098| 706 | 2129|7930| 707 | 2130|4553| 708 | 2134|7316| 709 | 2135|8428| 710 | 2139|9176| 711 | 2140|8661| 712 | 2144|9570| 713 | 2149|5704| 714 | 2151|4994| 715 | 2153|8138| 716 | 2156|3325| 717 | 2159|264| 718 | 2162|4460| 719 | 2165|8560| 720 | 2167|4765| 721 | 2168|2387| 722 | 2170|7985| 723 | 2174|1130| 724 | 2176|5920| 725 | 2180|9051| 726 | 2184|1295| 727 | 2188|9442| 728 | 2193|5469| 729 | 2198|8097| 730 | 2201|5812| 731 | 2206|1479| 732 | 2211|11169| 733 | 2212|7579| 734 | 2213|3222| 735 | 2218|6098| 736 | 2222|11326| 737 | 2223|9404| 738 | 2224|10895| 739 | 2225|741| 740 | 2228|7608| 741 | 2231|6119| 742 | 2233|7558| 743 | 2234|9869| 744 | 2238|8315| 745 | 2242|6833| 746 | 2245|10961| 747 | 2249|7493| 748 | 2250|10771| 749 | 2252|7477| 750 | 2257|8670| 751 | 2260|4623| 752 | 2264|10971| 753 | 2269|8428| 754 | 2272|10204| 755 | 2273|9369| 756 | 2276|8321| 757 | 2277|8315| 758 | 2282|8160| 759 | 2286|5186| 760 | 2291|1601| 761 | 2292|3815| 762 | 2296|912| 763 | 2301|1459| 764 | 2306|5706| 765 | 2308|10941| 766 | 2313|478| 767 | 2317|5768| 768 | 2320|3807| 769 | 2322|6679| 770 | 2324|7816| 771 | 2325|6549| 772 | 2328|1743| 773 | 2331|4285| 774 | 2334|11102| 775 | 2339|9964| 776 | 2341|4585| 777 | 2346|7620| 778 | 2348|2034| 779 | 2353|7719| 780 | 2354|1935| 781 | 2359|11133| 782 | 2360|9181| 783 | 2363|1836| 784 | 2367|10667| 785 | 2368|4312| 786 | 2373|2339| 787 | 2374|4070| 788 | 2378|520| 789 | 2381|1295| 790 | 2384|7483| 791 | 2385|10678| 792 | 2390|6214| 793 | 2391|10262| 794 | 2393|1500| 795 | 2395|4114| 796 | 2398|8854| 797 | 2400|10593| 798 | 2404|2276| 799 | 2409|7589| 800 | 2413|1940| 801 | 2418|2814| 802 | 2419|983| 803 | 2420|5372| 804 | 2425|2891| 805 | 2428|8071| 806 | 2429|10910| 807 | 2432|9956| 808 | 2435|8681| 809 | 2436|5894| 810 | 2441|3311| 811 | 2445|9457| 812 | 2446|5877| 813 | 2450|10166| 814 | 2454|8358| 815 | 2459|7484| 816 | 2464|378| 817 | 2468|5375| 818 | 2472|1075| 819 | 2473|8128| 820 | 2478|5732| 821 | 2482|6534| 822 | 2485|8684| 823 | 2489|3760| 824 | 2493|3058| 825 | 2497|799| 826 | 2499|8295| 827 | 2501|5060| 828 | 2506|10581| 829 | 2508|5274| 830 | 2511|5960| 831 | 2515|121| 832 | 2520|10910| 833 | 2522|209| 834 | 2525|6549| 835 | 2529|1714| 836 | 2534|11124| 837 | 2537|6110| 838 | 2538|3847| 839 | 2539|7799| 840 | 2540|4594| 841 | 2542|1273| 842 | 2544|10332| 843 | 2549|1690| 844 | 2552|8315| 845 | 2556|4700| 846 | 2561|6047| 847 | 2564|2355| 848 | 2566|2006| 849 | 2568|6996| 850 | 2569|5748| 851 | 2573|5683| 852 | 2575|7246| 853 | 2576|7476| 854 | 2581|7235| 855 | 2585|8523| 856 | 2587|2023| 857 | 2590|3819| 858 | 2594|7761| 859 | 2595|6376| 860 | 2596|1646| 861 | 2598|4179| 862 | 2600|1651| 863 | 2604|10502| 864 | 2605|8919| 865 | 2608|6151| 866 | 2613|2300| 867 | 2614|786| 868 | 2615|8941| 869 | 2618|31| 870 | 2620|6347| 871 | 2624|2903| 872 | 2629|7139| 873 | 2630|6769| 874 | 2631|5490| 875 | 2634|7781| 876 | 2639|9713| 877 | 2644|10408| 878 | 2647|4543| 879 | 2650|10996| 880 | 2655|11038| 881 | 2656|10961| 882 | 2658|5080| 883 | 2663|8914| 884 | 2666|11124| 885 | 2671|4626| 886 | 2672|10736| 887 | 2673|2778| 888 | 2674|1531| 889 | 2676|9964| 890 | 2677|6160| 891 | 2679|9551| 892 | 2683|646| 893 | 2685|3501| 894 | 2689|1278| 895 | 2692|5007| 896 | 2695|6809| 897 | 2697|1412| 898 | 2698|104| 899 | 2700|5037| 900 | 2703|638| 901 | 2704|1735| 902 | 2709|673| 903 | 2711|994| 904 | 2715|10983| 905 | 2719|10231| 906 | 2720|7676| 907 | 2722|9688| 908 | 2725|10853| 909 | 2727|6591| 910 | 2729|4819| 911 | 2734|5421| 912 | 2739|2048| 913 | 2743|177| 914 | 2748|4084| 915 | 2752|1236| 916 | 2755|8845| 917 | 2758|427| 918 | 2762|6284| 919 | 2763|4005| 920 | 2764|884| 921 | 2765|9269| 922 | 2769|2221| 923 | 2770|1655| 924 | 2772|9117| 925 | 2777|8134| 926 | 2781|7992| 927 | 2782|1273| 928 | 2784|10924| 929 | 2788|4019| 930 | 2793|10102| 931 | 2796|2950| 932 | 2799|7904| 933 | 2804|11192| 934 | 2807|5719| 935 | 2811|5586| 936 | 2815|2675| 937 | 2819|5411| 938 | 2824|4718| 939 | 2826|2462| 940 | 2828|10378| 941 | 2833|8028| 942 | 2838|6798| 943 | 2843|3297| 944 | 2846|6692| 945 | 2850|4601| 946 | 2851|7373| 947 | 2852|10511| 948 | 2855|2640| 949 | 2856|1073| 950 | 2858|9032| 951 | 2863|1531| 952 | 2865|4084| 953 | 2869|924| 954 | 2874|7927| 955 | 2875|3945| 956 | 2880|4794| 957 | 2882|7051| 958 | 2883|7893| 959 | 2884|10234| 960 | 2887|2122| 961 | 2892|2668| 962 | 2897|5020| 963 | 2900|3216| 964 | 2904|4842| 965 | 2906|9174| 966 | 2908|757| 967 | 2910|490| 968 | 2915|2128| 969 | 2919|7311| 970 | 2920|6933| 971 | 2923|8044| 972 | 2925|6775| 973 | 2927|5436| 974 | 2931|8013| 975 | 2936|6356| 976 | 2938|10593| 977 | 2941|1015| 978 | 2946|816| 979 | 2949|204| 980 | 2952|8661| 981 | 2953|4843| 982 | 2954|1357| 983 | 2955|697| 984 | 2960|8695| 985 | 2965|855| 986 | 2968|1918| 987 | 2972|6419| 988 | 2977|2289| 989 | 2982|1018| 990 | 2984|7252| 991 | 2989|6905| 992 | 2991|767| 993 | 2992|3807| 994 | 2993|6936| 995 | 2994|1276| 996 | 2996|514| 997 | 3000|1787| 998 | 3004|591| 999 | 3006|7287| 1000 | 3010|7324| 1001 | 3012|7586| 1002 | 3014|9442| 1003 | 3015|2297| 1004 | 3019|867| 1005 | 3023|2737| 1006 | 3028|130| 1007 | 3033|9716| 1008 | 3037|10551| 1009 | 3041|2550| 1010 | 3046|121| 1011 | 3049|7062| 1012 | 3051|8403| 1013 | 3055|4881| 1014 | 3057|9919| 1015 | 3062|1167| 1016 | 3063|4362| 1017 | 3066|6772| 1018 | 3070|10633| 1019 | 3072|10523| 1020 | 3077|10772| 1021 | 3080|9130| 1022 | 3082|9744| 1023 | 3084|3654| 1024 | 3087|1712| 1025 | 3088|2418| 1026 | 3092|8199| 1027 | 3093|611| 1028 | 3097|4215| 1029 | 3100|1545| 1030 | 3105|6431| 1031 | 3106|8625| 1032 | 3108|5398| 1033 | 3113|3453| 1034 | 3118|7620| 1035 | 3120|7599| 1036 | 3124|1154| 1037 | 3128|1997| 1038 | 3129|10177| 1039 | 3134|3718| 1040 | 3138|1055| 1041 | 3142|8414| 1042 | 3143|3572| 1043 | 3144|11174| 1044 | 3149|1538| 1045 | 3150|4501| 1046 | 3154|1543| 1047 | 3155|41| 1048 | 3156|11213| 1049 | 3159|4919| 1050 | 3163|1324| 1051 | 3168|3142| 1052 | 3171|11006| 1053 | 3175|4981| 1054 | 3178|6835| 1055 | 3182|5000| 1056 | 3186|8542| 1057 | 3189|7193| 1058 | 3192|4821| 1059 | 3197|756| 1060 | 3198|4723| 1061 | 3201|9096| 1062 | 3202|8142| 1063 | 3203|6537| 1064 | 3204|4669| 1065 | 3205|7701| 1066 | 3207|2780| 1067 | 3212|3375| 1068 | 3215|2320| 1069 | 3216|2403| 1070 | 3219|5920| 1071 | 3223|3135| 1072 | 3224|3814| 1073 | 3229|4161| 1074 | 3233|3531| 1075 | 3234|7250| 1076 | 3239|4053| 1077 | 3241|3534| 1078 | 3246|9122| 1079 | 3247|9148| 1080 | 3251|2637| 1081 | 3253|7826| 1082 | 3255|577| 1083 | 3259|7693| 1084 | 3261|5611| 1085 | 3265|2068| 1086 | 3266|9747| 1087 | 3267|8472| 1088 | 3271|3997| 1089 | 3276|5367| 1090 | 3281|2887| 1091 | 3285|10102| 1092 | 3288|168| 1093 | 3290|4383| 1094 | 3295|10334| 1095 | 3296|3953| 1096 | 3298|5743| 1097 | 3300|5867| 1098 | 3302|4854| 1099 | 3303|3241| 1100 | 3308|5732| 1101 | 3312|6424| 1102 | 3316|9740| 1103 | 3317|3744| 1104 | 3319|7796| 1105 | 3324|7737| 1106 | 3329|7299| 1107 | 3330|6942| 1108 | 3335|2145| 1109 | 3337|11196| 1110 | 3339|6189| 1111 | 3343|9161| 1112 | 3347|9453| 1113 | 3352|9842| 1114 | 3353|1636| 1115 | 3358|10764| 1116 | 3359|10114| 1117 | 3364|10964| 1118 | 3366|5842| 1119 | 3368|4508| 1120 | 3372|10661| 1121 | 3373|9393| 1122 | 3378|5685| 1123 | 3380|3596| 1124 | 3385|979| 1125 | 3389|6173| 1126 | 3391|7983| 1127 | 3394|7915| 1128 | 3395|3409| 1129 | 3400|1712| 1130 | 3404|4931| 1131 | 3405|454| 1132 | 3406|1552| 1133 | 3410|4843| 1134 | 3414|3109| 1135 | 3415|3772| 1136 | 3418|3266| 1137 | 3422|3630| 1138 | 3427|2683| 1139 | 3430|10168| 1140 | 3433|11240| 1141 | 3438|10097| 1142 | 3441|1953| 1143 | 3445|3769| 1144 | 3450|1388| 1145 | 3452|6523| 1146 | 3456|10442| 1147 | 3460|11021| 1148 | 3464|7| 1149 | 3468|9085| 1150 | 3472|289| 1151 | 3473|7729| 1152 | 3474|3807| 1153 | 3476|7427| 1154 | 3480|3480| 1155 | 3484|7572| 1156 | 3485|5215| 1157 | 3488|9828| 1158 | 3493|9491| 1159 | 3495|827| 1160 | 3496|7718| 1161 | 3500|1444| 1162 | 3505|6721| 1163 | 3507|4696| 1164 | 3510|3842| 1165 | 3514|3660| 1166 | 3519|11329| 1167 | 3524|2418| 1168 | 3528|6686| 1169 | 3533|3782| 1170 | 3536|3564| 1171 | 3537|2484| 1172 | 3540|2479| 1173 | 3542|10937| 1174 | 3544|7642| 1175 | 3546|10436| 1176 | 3547|544| 1177 | 3549|6640| 1178 | 3554|3777| 1179 | 3556|7258| 1180 | 3558|9867| 1181 | 3563|8219| 1182 | 3567|10032| 1183 | 3571|9393| 1184 | 3576|1380| 1185 | 3579|2641| 1186 | 3584|7796| 1187 | 3588|5464| 1188 | 3590|6715| 1189 | 3594|7745| 1190 | 3595|8065| 1191 | 3597|6603| 1192 | 3599|1203| 1193 | 3604|6041| 1194 | 3609|3990| 1195 | 3612|47| 1196 | 3617|10961| 1197 | 3620|7362| 1198 | 3624|8385| 1199 | 3625|5528| 1200 | 3628|11097| 1201 | 3629|3522| 1202 | 3630|1180| 1203 | 3634|11330| 1204 | 3637|5033| 1205 | 3640|2891| 1206 | 3641|6603| 1207 | 3642|53| 1208 | 3645|4198| 1209 | 3646|10980| 1210 | 3647|6765| 1211 | 3650|2479| 1212 | 3654|7554| 1213 | 3656|3379| 1214 | 3660|9959| 1215 | 3663|5283| 1216 | 3664|3284| 1217 | 3666|2621| 1218 | 3668|2709| 1219 | 3670|7819| 1220 | 3672|2401| 1221 | 3674|4131| 1222 | 3675|3437| 1223 | 3679|10920| 1224 | 3681|2656| 1225 | 3684|10061| 1226 | 3685|10733| 1227 | 3689|10528| 1228 | 3693|7422| 1229 | 3698|5011| 1230 | 3703|6923| 1231 | 3704|7596| 1232 | 3706|11329| 1233 | 3709|8523| 1234 | 3712|6692| 1235 | 3717|841| 1236 | 3721|8977| 1237 | 3723|2564| 1238 | 3727|8583| 1239 | 3730|9420| 1240 | 3732|4878| 1241 | 3737|2315| 1242 | 3742|7396| 1243 | 3743|2459| 1244 | 3747|1500| 1245 | 3751|6108| 1246 | 3756|8122| 1247 | 3757|10138| 1248 | 3759|3350| 1249 | 3764|2836| 1250 | 3765|7418| 1251 | 3766|509| 1252 | 3767|10195| 1253 | 3769|3603| 1254 | 3772|4553| 1255 | 3773|8496| 1256 | 3777|1357| 1257 | 3782|10323| 1258 | 3785|1168| 1259 | 3788|2748| 1260 | 3792|6133| 1261 | 3794|7971| 1262 | 3799|7653| 1263 | 3804|9444| 1264 | 3808|1743| 1265 | 3809|7338| 1266 | 3812|1801| 1267 | 3815|9815| 1268 | 3818|4213| 1269 | 3819|8326| 1270 | 3822|764| 1271 | 3827|10244| 1272 | 3832|10187| 1273 | 3835|1273| 1274 | 3838|5997| 1275 | 3842|2618| 1276 | 3845|503| 1277 | 3848|8148| 1278 | 3851|10391| 1279 | 3855|10406| 1280 | 3859|7032| 1281 | 3863|2699| 1282 | 3866|9851| 1283 | 3868|10616| 1284 | 3872|6840| 1285 | 3875|5768| 1286 | 3879|7097| 1287 | 3883|5979| 1288 | 3885|1263| 1289 | 3888|2414| 1290 | 3893|7765| 1291 | 3895|509| 1292 | 3896|5089| 1293 | 3901|7601| 1294 | 3904|9838| 1295 | 3909|6773| 1296 | 3914|9365| 1297 | 3919|7444| 1298 | 3924|9032| 1299 | 3929|9856| 1300 | 3932|5265| 1301 | 3933|1563| 1302 | 3936|11015| 1303 | 3939|628| 1304 | 3943|9069| 1305 | 3948|5080| 1306 | 3951|4371| 1307 | 3955|8576| 1308 | 3960|10666| 1309 | 3965|2955| 1310 | 3966|6166| 1311 | 3969|2709| 1312 | 3974|6351| 1313 | 3978|36| 1314 | 3981|6145| 1315 | 3984|3428| 1316 | 3989|7371| 1317 | 3990|9903| 1318 | 3993|1728| 1319 | 3998|6297| 1320 | 4001|2209| 1321 | 4004|5215| 1322 | 4005|116| 1323 | 4008|10003| 1324 | 4013|1013| 1325 | 4018|5325| 1326 | 4020|3097| 1327 | 4025|4372| 1328 | 4027|5474| 1329 | 4030|10716| 1330 | 4031|6495| 1331 | 4036|3795| 1332 | 4041|3318| 1333 | 4042|2343| 1334 | 4045|2608| 1335 | 4050|8122| 1336 | 4054|1589| 1337 | 4059|3501| 1338 | 4061|628| 1339 | 4066|5244| 1340 | 4068|8532| 1341 | 4072|10816| 1342 | 4074|613| 1343 | 4079|10839| 1344 | 4084|3391| 1345 | 4089|241| 1346 | 4094|6833| 1347 | 4098|9531| 1348 | 4099|8693| 1349 | 4103|9204| 1350 | 4105|4684| 1351 | 4110|5864| 1352 | 4112|997| 1353 | 4114|3898| 1354 | 4116|1029| 1355 | 4118|4821| 1356 | 4119|560| 1357 | 4122|6378| 1358 | 4127|5119| 1359 | 4131|6968| 1360 | 4136|10276| 1361 | 4139|6387| 1362 | 4144|10283| 1363 | 4148|10429| 1364 | 4151|7523| 1365 | 4154|4623| 1366 | 4156|2071| 1367 | 4159|5824| 1368 | 4161|9490| 1369 | 4166|8944| 1370 | 4171|837| 1371 | 4175|10338| 1372 | 4179|10983| 1373 | 4180|10785| 1374 | 4184|2102| 1375 | 4188|4167| 1376 | 4191|4559| 1377 | 4193|5325| 1378 | 4197|1146| 1379 | 4200|1266| 1380 | 4205|10907| 1381 | 4207|7444| 1382 | 4211|10367| 1383 | 4216|1031| 1384 | 4220|1066| 1385 | 4223|8128| 1386 | 4227|11206| 1387 | 4229|7062| 1388 | 4231|2124| 1389 | 4234|7373| 1390 | 4235|9735| 1391 | 4239|8347| 1392 | 4240|3751| 1393 | 4242|1112| 1394 | 4246|6486| 1395 | 4250|4559| 1396 | 4251|10487| 1397 | 4255|5412| 1398 | 4257|6012| 1399 | 4261|8529| 1400 | 4264|6526| 1401 | 4269|6098| 1402 | 4272|490| 1403 | 4273|4830| 1404 | 4274|4113| 1405 | 4276|3963| 1406 | 4280|6168| 1407 | 4281|943| 1408 | 4282|1795| 1409 | 4285|6692| 1410 | 4288|3710| 1411 | 4291|6804| 1412 | 4293|3018| 1413 | 4294|8337| 1414 | 4295|4327| 1415 | 4297|2492| 1416 | 4301|4339| 1417 | 4304|2709| 1418 | 4309|8498| 1419 | 4314|10920| 1420 | 4319|2887| 1421 | 4320|10666| 1422 | 4325|5522| 1423 | 4329|1328| 1424 | 4330|9273| 1425 | 4334|8656| 1426 | 4337|4055| 1427 | 4342|10284| 1428 | 4343|10875| 1429 | 4345|5121| 1430 | 4347|5190| 1431 | 4352|6940| 1432 | 4356|8326| 1433 | 4357|6591| 1434 | 4361|4968| 1435 | 4362|5394| 1436 | 4365|524| 1437 | 4367|10155| 1438 | 4368|3306| 1439 | 4370|3874| 1440 | 4374|7300| 1441 | 4377|4005| 1442 | 4379|5126| 1443 | 4384|604| 1444 | 4389|8583| 1445 | 4390|4770| 1446 | 4393|10370| 1447 | 4394|6056| 1448 | 4397|11187| 1449 | 4402|4322| 1450 | 4406|9311| 1451 | 4411|3602| 1452 | 4413|4658| 1453 | 4415|3462| 1454 | 4418|586| 1455 | 4421|6944| 1456 | 4422|6329| 1457 | 4425|9760| 1458 | 4427|5467| 1459 | 4428|2128| 1460 | 4429|7761| 1461 | 4432|3829| 1462 | 4437|3751| 1463 | 4440|3642| 1464 | 4442|10105| 1465 | 4447|3767| 1466 | 4451|1972| 1467 | 4454|7678| 1468 | 4457|4366| 1469 | 4458|10110| 1470 | 4459|586| 1471 | 4461|9514| 1472 | 4465|8902| 1473 | 4468|6007| 1474 | 4469|493| 1475 | 4472|6883| 1476 | 4474|1386| 1477 | 4477|1873| 1478 | 4479|1601| 1479 | 4483|6214| 1480 | 4486|8948| 1481 | 4491|4055| 1482 | 4493|5234| 1483 | 4497|524| 1484 | 4498|483| 1485 | 4500|11006| 1486 | 4501|8604| 1487 | 4502|4399| 1488 | 4506|2272| 1489 | 4511|10038| 1490 | 4512|1331| 1491 | 4516|7371| 1492 | 4519|3562| 1493 | 4523|700| 1494 | 4524|5134| 1495 | 4529|6170| 1496 | 4532|4362| 1497 | 4533|5606| 1498 | 4536|9789| 1499 | 4537|2760| 1500 | 4541|11079| 1501 | 4542|1856| 1502 | 4543|4218| 1503 | 4546|833| 1504 | 4549|10498| 1505 | 4553|10838| 1506 | 4556|2836| 1507 | 4559|10790| 1508 | 4560|10153| 1509 | 4565|6447| 1510 | 4566|4490| 1511 | 4570|842| 1512 | 4572|6658| 1513 | 4575|7170| 1514 | 4580|325| 1515 | 4584|2278| 1516 | 4585|9868| 1517 | 4589|6543| 1518 | 4590|252| 1519 | 4591|4723| 1520 | 4594|4396| 1521 | 4598|2397| 1522 | 4599|2385| 1523 | 4600|10422| 1524 | 4603|7193| 1525 | 4608|4768| 1526 | 4609|7881| 1527 | 4613|4167| 1528 | 4614|1213| 1529 | 4616|7130| 1530 | 4620|999| 1531 | 4624|10628| 1532 | 4626|4119| 1533 | 4627|5244| 1534 | 4632|781| 1535 | 4633|10470| 1536 | 4636|4688| 1537 | 4637|8247| 1538 | 4642|2745| 1539 | 4643|5281| 1540 | 4648|2211| 1541 | 4651|4740| 1542 | 4652|7481| 1543 | 4654|2234| 1544 | 4655|841| 1545 | 4659|10803| 1546 | 4662|8845| 1547 | 4664|2967| 1548 | 4666|1481| 1549 | 4670|9511| 1550 | 4674|2107| 1551 | 4677|5645| 1552 | 4680|1441| 1553 | 4682|5704| 1554 | 4687|8193| 1555 | 4690|5310| 1556 | 4695|10493| 1557 | 4697|1880| 1558 | 4699|10470| 1559 | 4701|317| 1560 | 4706|9713| 1561 | 4711|317| 1562 | 4716|5031| 1563 | 4719|3630| 1564 | 4720|9067| 1565 | 4724|3837| 1566 | 4727|8003| 1567 | 4730|10574| 1568 | 4731|6289| 1569 | 4733|9769| 1570 | 4737|1118| 1571 | 4741|2475| 1572 | 4745|10890| 1573 | 4747|7079| 1574 | 4752|2221| 1575 | 4757|3090| 1576 | 4758|9755| 1577 | 4762|3062| 1578 | 4766|4223| 1579 | 4771|3088| 1580 | 4776|8310| 1581 | 4781|1630| 1582 | 4784|10768| 1583 | 4785|10278| 1584 | 4788|713| 1585 | 4793|2598| 1586 | 4797|4584| 1587 | 4801|4911| 1588 | 4804|5804| 1589 | 4805|7759| 1590 | 4809|2229| 1591 | 4810|520| 1592 | 4813|35| 1593 | 4816|1822| 1594 | 4819|9937| 1595 | 4824|1037| 1596 | 4828|5602| 1597 | 4830|5661| 1598 | 4835|8065| 1599 | 4836|4034| 1600 | 4839|7804| 1601 | 4841|9892| 1602 | 4844|10807| 1603 | 4845|1858| 1604 | 4848|2372| 1605 | 4850|6760| 1606 | 4854|710| 1607 | 4859|3222| 1608 | 4863|31| 1609 | 4865|3252| 1610 | 4867|4165| 1611 | 4868|2099| 1612 | 4869|1515| 1613 | 4870|5729| 1614 | 4873|62| 1615 | 4877|9573| 1616 | 4882|6673| 1617 | 4885|371| 1618 | 4890|9992| 1619 | 4892|4824| 1620 | 4895|7505| 1621 | 4900|5700| 1622 | 4902|11346| 1623 | 4906|9963| 1624 | 4910|5525| 1625 | 4913|914| 1626 | 4917|9375| 1627 | 4922|7824| 1628 | 4924|1236| 1629 | 4925|10689| 1630 | 4927|4950| 1631 | 4929|2390| 1632 | 4932|7087| 1633 | 4934|6366| 1634 | 4938|2426| 1635 | 4940|3082| 1636 | 4941|5429| 1637 | 4943|5429| 1638 | 4947|7342| 1639 | 4952|3534| 1640 | 4954|4198| 1641 | 4956|7157| 1642 | 4961|7452| 1643 | 4964|10624| 1644 | 4968|10247| 1645 | 4970|452| 1646 | 4974|7654| 1647 | 4978|2834| 1648 | 4983|5293| 1649 | 4988|4215| 1650 | 4993|10110| 1651 | 4998|8019| 1652 | 5003|9956| 1653 | 5006|3271| 1654 | 5008|704| 1655 | 5011|4286| 1656 | 5015|8065| 1657 | 5018|7966| 1658 | 5022|5768| 1659 | 5024|7201| 1660 | 5029|1420| 1661 | 5033|7864| 1662 | 5038|3271| 1663 | 5041|3343| 1664 | 5044|5421| 1665 | 5048|9001| 1666 | 5051|7373| 1667 | 5053|10752| 1668 | 5054|9964| 1669 | 5056|6539| 1670 | 5057|2284| 1671 | 5062|9455| 1672 | 5065|6725| 1673 | 5070|8002| 1674 | 5074|6161| 1675 | 5075|1729| 1676 | 5080|4390| 1677 | 5082|7973| 1678 | 5084|10378| 1679 | 5089|7943| 1680 | 5091|1703| 1681 | 5092|2026| 1682 | 5096|990| 1683 | 5097|1287| 1684 | 5099|2628| 1685 | 5104|4093| 1686 | 5108|9823| 1687 | 5112|9501| 1688 | 5113|3479| 1689 | 5114|3127| 1690 | 5119|2556| 1691 | 5120|760| 1692 | 5123|8914| 1693 | 5128|1099| 1694 | 5130|8967| 1695 | 5133|332| 1696 | 5136|924| 1697 | 5141|4688| 1698 | 5144|7585| 1699 | 5149|6013| 1700 | 5151|5190| 1701 | 5152|6483| 1702 | 5156|2237| 1703 | 5160|7586| 1704 | 5162|5111| 1705 | 5166|3997| 1706 | 5168|3206| 1707 | 5171|5051| 1708 | 5173|9416| 1709 | 5175|10727| 1710 | 5180|6940| 1711 | 5185|5190| 1712 | 5188|6326| 1713 | 5191|10888| 1714 | 5194|9107| 1715 | 5196|937| 1716 | 5201|5495| 1717 | 5206|2917| 1718 | 5211|6327| 1719 | 5212|2435| 1720 | 5215|7302| 1721 | 5220|7472| 1722 | 5224|10211| 1723 | 5225|609| 1724 | 5229|4468| 1725 | 5230|2836| 1726 | 5235|5255| 1727 | 5236|9708| 1728 | 5237|3491| 1729 | 5241|10173| 1730 | 5244|10411| 1731 | 5248|5463| 1732 | 5252|8210| 1733 | 5253|5213| 1734 | 5255|7608| 1735 | 5260|2891| 1736 | 5264|7602| 1737 | 5269|872| 1738 | 5270|5909| 1739 | 5273|1204| 1740 | 5274|11203| 1741 | 5275|4875| 1742 | 5276|932| 1743 | 5281|5176| 1744 | 5282|9428| 1745 | 5286|56| 1746 | 5288|5516| 1747 | 5289|10422| 1748 | 5292|9437| 1749 | 5296|959| 1750 | 5300|10323| 1751 | 5304|9174| 1752 | 5308|990| 1753 | 5309|6973| 1754 | 5310|91| 1755 | 5313|4470| 1756 | 5316|3710| 1757 | 5321|6464| 1758 | 5325|7452| 1759 | 5328|4740| 1760 | 5330|4486| 1761 | 5334|11358| 1762 | 5339|5463| 1763 | 5344|4954| 1764 | 5345|5904| 1765 | 5348|1042| 1766 | 5353|4329| 1767 | 5356|9577| 1768 | 5361|1974| 1769 | 5363|7608| 1770 | 5366|2968| 1771 | 5367|7625| 1772 | 5372|7520| 1773 | 5375|7730| 1774 | 5379|10612| 1775 | 5382|7065| 1776 | 5385|3577| 1777 | 5387|6953| 1778 | 5391|8661| 1779 | 5394|2974| 1780 | 5397|1543| 1781 | 5401|2992| 1782 | 5406|6717| 1783 | 5410|4287| 1784 | 5411|3249| 1785 | 5416|1130| 1786 | 5421|7594| 1787 | 5426|6119| 1788 | 5431|4208| 1789 | 5436|6513| 1790 | 5437|6678| 1791 | 5440|10775| 1792 | 5445|8481| 1793 | 5446|9260| 1794 | 5450|4421| 1795 | 5454|5394| 1796 | 5456|259| 1797 | 5459|10898| 1798 | 5460|2916| 1799 | 5465|6518| 1800 | 5470|4799| 1801 | 5471|2361| 1802 | 5475|4954| 1803 | 5477|2218| 1804 | 5480|9630| 1805 | 5484|5176| 1806 | 5485|3033| 1807 | 5488|8450| 1808 | 5489|9892| 1809 | 5493|5747| 1810 | 5496|5864| 1811 | 5500|10007| 1812 | 5504|89| 1813 | 5508|7816| 1814 | 5511|11179| 1815 | 5515|3710| 1816 | 5517|5209| 1817 | 5521|316| 1818 | 5522|8932| 1819 | 5525|8451| 1820 | 5526|11057| 1821 | 5529|7897| 1822 | 5533|2968| 1823 | 5534|538| 1824 | 5539|997| 1825 | 5541|7989| 1826 | 5545|2737| 1827 | 5548|816| 1828 | 5553|5215| 1829 | 5557|928| 1830 | 5562|2978| 1831 | 5563|2818| 1832 | 5567|6187| 1833 | 5571|3146| 1834 | 5574|10961| 1835 | 5578|534| 1836 | 5583|999| 1837 | 5584|6833| 1838 | 5587|4475| 1839 | 5588|11070| 1840 | 5591|314| 1841 | 5592|2209| 1842 | 5593|8921| 1843 | 5594|8115| 1844 | 5596|7324| 1845 | 5600|604| 1846 | 5603|2278| 1847 | 5606|4203| 1848 | 5611|9072| 1849 | 5615|5132| 1850 | 5618|384| 1851 | 5621|8544| 1852 | 5623|7231| 1853 | 5627|4299| 1854 | 5631|10499| 1855 | 5635|10223| 1856 | 5638|10625| 1857 | 5640|4382| 1858 | 5642|8593| 1859 | 5646|3567| 1860 | 5650|5206| 1861 | 5652|10821| 1862 | 5654|4094| 1863 | 5656|8104| 1864 | 5657|7231| 1865 | 5662|7814| 1866 | 5664|7118| 1867 | 5667|10348| 1868 | 5671|6663| 1869 | 5675|10516| 1870 | 5679|11336| 1871 | 5682|6663| 1872 | 5684|3311| 1873 | 5687|7147| 1874 | 5691|767| 1875 | 5692|4015| 1876 | 5696|482| 1877 | 5698|8772| 1878 | 5702|3905| 1879 | 5705|5842| 1880 | 5710|8670| 1881 | 5713|9126| 1882 | 5714|4179| 1883 | 5716|7027| 1884 | 5719|5394| 1885 | 5722|4786| 1886 | 5726|1230| 1887 | 5730|7393| 1888 | 5732|6168| 1889 | 5737|7661| 1890 | 5739|9154| 1891 | 5744|6711| 1892 | 5748|6173| 1893 | 5751|8854| 1894 | 5756|10074| 1895 | 5761|5777| 1896 | 5764|9234| 1897 | 5766|8231| 1898 | 5770|3266| 1899 | 5774|8598| 1900 | 5779|534| 1901 | 5784|4202| 1902 | 5787|4114| 1903 | 5790|3517| 1904 | 5793|8944| 1905 | 5794|10223| 1906 | 5798|4269| 1907 | 5802|4729| 1908 | 5803|658| 1909 | 5808|5069| 1910 | 5810|9685| 1911 | 5811|10187| 1912 | 5815|9006| 1913 | 5819|5404| 1914 | 5823|3062| 1915 | 5824|9396| 1916 | 5825|7252| 1917 | 5829|1763| 1918 | 5831|5546| 1919 | 5835|1112| 1920 | 5837|8512| 1921 | 5840|10576| 1922 | 5842|8701| 1923 | 5843|7719| 1924 | 5846|3325| 1925 | 5849|11230| 1926 | 5850|9072| 1927 | 5852|684| 1928 | 5854|9100| 1929 | 5857|3051| 1930 | 5861|560| 1931 | 5865|9222| 1932 | 5870|11097| 1933 | 5874|7806| 1934 | 5876|8451| 1935 | 5881|9506| 1936 | 5884|9760| 1937 | 5886|6824| 1938 | 5888|4639| 1939 | 5889|10142| 1940 | 5893|9945| 1941 | 5896|6414| 1942 | 5898|7681| 1943 | 5903|4285| 1944 | 5907|3942| 1945 | 5908|9496| 1946 | 5912|8039| 1947 | 5914|7943| 1948 | 5918|7848| 1949 | 5919|7563| 1950 | 5923|9137| 1951 | 5927|6533| 1952 | 5930|928| 1953 | 5935|3567| 1954 | 5937|1803| 1955 | 5939|5226| 1956 | 5940|8937| 1957 | 5945|10648| 1958 | 5946|2988| 1959 | 5947|9102| 1960 | 5950|5981| 1961 | 5951|8910| 1962 | 5955|7554| 1963 | 5958|6944| 1964 | 5962|1315| 1965 | 5967|4451| 1966 | 5972|8123| 1967 | 5977|2047| 1968 | 5982|7659| 1969 | 5983|3624| 1970 | 5987|3585| 1971 | 5989|2846| 1972 | 5993|5000| 1973 | 5998|3555| 1974 | 6001|1829| 1975 | 6006|5474| 1976 | 6009|4673| 1977 | 6011|7534| 1978 | 6012|3968| 1979 | 6013|1971| 1980 | 6018|4810| 1981 | 6019|1446| 1982 | 6022|4038| 1983 | 6023|137| 1984 | 6025|4000| 1985 | 6028|10875| 1986 | 6033|289| 1987 | 6036|1095| 1988 | 6040|9713| 1989 | 6041|6403| 1990 | 6043|8131| 1991 | 6045|10764| 1992 | 6049|3028| 1993 | 6053|2118| 1994 | 6054|6447| 1995 | 6058|10493| 1996 | 6061|96| 1997 | 6062|4203| 1998 | 6066|8733| 1999 | 6070|5900| 2000 | 6073|8326| 2001 | 6075|8923| 2002 | 6080|6197| 2003 | 6082|2757| 2004 | 6084|6402| 2005 | 6086|4469| 2006 | 6091|7405| 2007 | 6092|1037| 2008 | 6095|10164| 2009 | 6099|2968| 2010 | 6104|3071| 2011 | 6108|3577| 2012 | 6110|5824| 2013 | 6111|10781| 2014 | 6116|2317| 2015 | 6117|3905| 2016 | 6120|4179| 2017 | 6121|10118| 2018 | 6125|6751| 2019 | 6127|4149| 2020 | 6131|10372| 2021 | 6132|2094| 2022 | 6137|7791| 2023 | 6140|6733| 2024 | 6141|11061| 2025 | 6145|1102| 2026 | 6146|1919| 2027 | 6148|7765| 2028 | 6149|7350| 2029 | 6152|9959| 2030 | 6154|7274| 2031 | 6158|971| 2032 | 6162|6170| 2033 | 6167|4093| 2034 | 6172|7300| 2035 | 6176|10667| 2036 | 6177|6189| 2037 | 6181|7166| 2038 | 6185|10556| 2039 | 6190|9626| 2040 | 6195|5814| 2041 | 6200|3941| 2042 | 6205|1719| 2043 | 6210|4696| 2044 | 6212|10990| 2045 | 6213|1013| 2046 | 6217|10590| 2047 | 6219|57| 2048 | 6223|9165| 2049 | 6228|2349| 2050 | 6232|2926| 2051 | 6234|5629| 2052 | 6238|7436| 2053 | 6243|6203| 2054 | 6247|6159| 2055 | 6250|4045| 2056 | 6253|8341| 2057 | 6255|6653| 2058 | 6260|2177| 2059 | 6261|5964| 2060 | 6262|524| 2061 | 6263|9491| 2062 | 6266|9249| 2063 | 6267|3748| 2064 | 6271|4183| 2065 | 6276|5539| 2066 | 6278|3530| 2067 | 6282|7246| 2068 | 6284|7534| 2069 | 6288|4901| 2070 | 6292|5635| 2071 | 6296|9851| 2072 | 6297|8981| 2073 | 6298|9735| 2074 | 6300|7866| 2075 | 6303|1317| 2076 | 6307|7367| 2077 | 6310|3692| 2078 | 6315|6314| 2079 | 6316|7956| 2080 | 6320|6277| 2081 | 6324|4711| 2082 | 6326|8956| 2083 | 6331|3398| 2084 | 6333|3788| 2085 | 6336|9942| 2086 | 6340|7605| 2087 | 6342|2337| 2088 | 6345|8095| 2089 | 6346|2455| 2090 | 6350|1552| 2091 | 6354|6411| 2092 | 6356|5645| 2093 | 6361|6253| 2094 | 6362|1555| 2095 | 6366|9051| 2096 | 6368|8719| 2097 | 6369|2773| 2098 | 6370|1961| 2099 | 6371|10499| 2100 | 6374|6738| 2101 | 6375|7545| 2102 | 6377|9951| 2103 | 6382|8438| 2104 | 6384|8013| 2105 | 6389|9194| 2106 | 6394|5677| 2107 | 6395|1758| 2108 | 6399|9609| 2109 | 6404|5387| 2110 | 6405|6351| 2111 | 6406|309| 2112 | 6409|10429| 2113 | 6410|269| 2114 | 6411|4941| 2115 | 6412|1167| 2116 | 6414|8872| 2117 | 6419|5443| 2118 | 6420|1793| 2119 | 6421|2484| 2120 | 6426|3096| 2121 | 6430|559| 2122 | 6432|10727| 2123 | 6436|216| 2124 | 6440|4435| 2125 | 6445|3465| 2126 | 6446|6666| 2127 | 6451|2221| 2128 | 6455|5669| 2129 | 6457|11136| 2130 | 6458|8567| 2131 | 6463|3738| 2132 | 6467|4636| 2133 | 6471|7921| 2134 | 6476|8496| 2135 | 6478|9511| 2136 | 6479|5887| 2137 | 6484|6148| 2138 | 6489|10293| 2139 | 6494|8269| 2140 | 6496|1703| 2141 | 6500|3411| 2142 | 6505|96| 2143 | 6509|5255| 2144 | 6512|586| 2145 | 6515|4420| 2146 | 6519|5661| 2147 | 6522|4312| 2148 | 6526|10317| 2149 | 6529|4296| 2150 | 6530|594| 2151 | 6532|5881| 2152 | 6536|4531| 2153 | 6538|5729| 2154 | 6542|10816| 2155 | 6546|2393| 2156 | 6550|10306| 2157 | 6551|9880| 2158 | 6553|8537| 2159 | 6557|6141| 2160 | 6559|6151| 2161 | 6562|7311| 2162 | 6567|10395| 2163 | 6569|2276| 2164 | 6571|4127| 2165 | 6572|1340| 2166 | 6575|2251| 2167 | 6580|7572| 2168 | 6585|2218| 2169 | 6590|135| 2170 | 6594|3114| 2171 | 6596|5055| 2172 | 6598|8928| 2173 | 6602|5310| 2174 | 6606|9834| 2175 | 6607|4794| 2176 | 6612|9139| 2177 | 6613|1683| 2178 | 6615|9165| 2179 | 6616|4548| 2180 | 6619|10211| 2181 | 6621|1817| 2182 | 6625|4025| 2183 | 6627|832| 2184 | 6632|464| 2185 | 6637|5005| 2186 | 6639|7118| 2187 | 6640|5137| 2188 | 6645|7832| 2189 | 6650|6057| 2190 | 6655|837| 2191 | 6657|6161| 2192 | 6660|3890| 2193 | 6665|4669| 2194 | 6668|7320| 2195 | 6670|7585| 2196 | 6672|7886| 2197 | 6676|5156| 2198 | 6679|2949| 2199 | 6683|8194| 2200 | 6688|5429| 2201 | 6693|10775| 2202 | 6698|5912| 2203 | 6700|5519| 2204 | 6704|5773| 2205 | 6708|7897| 2206 | 6710|10690| 2207 | 6711|2212| 2208 | 6713|10685| 2209 | 6718|8481| 2210 | 6720|6964| 2211 | 6725|1699| 2212 | 6728|944| 2213 | 6732|10589| 2214 | 6734|6253| 2215 | 6735|11240| 2216 | 6737|6673| 2217 | 6739|280| 2218 | 6743|1298| 2219 | 6748|9796| 2220 | 6753|225| 2221 | 6754|3630| 2222 | 6756|10937| 2223 | 6757|3084| 2224 | 6758|846| 2225 | 6761|2177| 2226 | 6763|1252| 2227 | 6767|10209| 2228 | 6770|10771| 2229 | 6773|5944| 2230 | 6777|7159| 2231 | 6781|10192| 2232 | 6783|9088| 2233 | 6784|10776| 2234 | 6789|1839| 2235 | 6793|9335| 2236 | 6795|1134| 2237 | 6797|9699| 2238 | 6800|1420| 2239 | 6803|9935| 2240 | 6805|5195| 2241 | 6810|4639| 2242 | 6813|10065| 2243 | 6815|116| 2244 | 6817|7311| 2245 | 6820|8721| 2246 | 6824|6876| 2247 | 6828|2729| 2248 | 6833|7568| 2249 | 6836|602| 2250 | 6837|4183| 2251 | 6842|11235| 2252 | 6843|7799| 2253 | 6845|2158| 2254 | 6848|4296| 2255 | 6850|11206| 2256 | 6855|10584| 2257 | 6857|3428| 2258 | 6859|4486| 2259 | 6863|10092| 2260 | 6865|9016| 2261 | 6869|9213| 2262 | 6874|4326| 2263 | 6879|5576| 2264 | 6880|2942| 2265 | 6882|5788| 2266 | 6887|157| 2267 | 6891|3294| 2268 | 6895|618| 2269 | 6899|1456| 2270 | 6903|2260| 2271 | 6907|7078| 2272 | 6909|11002| 2273 | 6912|8934| 2274 | 6917|7327| 2275 | 6920|11289| 2276 | 6924|1921| 2277 | 6925|5008| 2278 | 6929|3639| 2279 | 6932|1497| 2280 | 6935|7048| 2281 | 6939|1456| 2282 | 6943|371| 2283 | 6944|10624| 2284 | 6946|4045| 2285 | 6950|5630| 2286 | 6955|5938| 2287 | 6960|9096| 2288 | 6964|8078| 2289 | 6969|888| 2290 | 6970|6794| 2291 | 6972|2359| 2292 | 6973|7860| 2293 | 6974|8423| 2294 | 6975|8876| 2295 | 6980|10447| 2296 | 6984|6913| 2297 | 6989|300| 2298 | 6990|6575| 2299 | 6995|10549| 2300 | 6996|7505| 2301 | 7001|8217| 2302 | 7002|6899| 2303 | 7005|2401| 2304 | 7008|5352| 2305 | 7012|8758| 2306 | 7017|2543| 2307 | 7019|7989| 2308 | 7023|5436| 2309 | 7026|5525| 2310 | 7030|6600| 2311 | 7033|10765| 2312 | 7035|2651| 2313 | 7038|4093| 2314 | 7039|5543| 2315 | 7040|1915| 2316 | 7042|10602| 2317 | 7045|9808| 2318 | 7050|5005| 2319 | 7052|6701| 2320 | 7057|8669| 2321 | 7061|1563| 2322 | 7066|9919| 2323 | 7069|8315| 2324 | 7072|650| 2325 | 7074|9850| 2326 | 7075|6062| 2327 | 7079|8288| 2328 | 7082|6964| 2329 | 7086|2712| 2330 | 7089|2272| 2331 | 7090|330| 2332 | 7093|5198| 2333 | 7096|6964| 2334 | 7098|9937| 2335 | 7100|8847| 2336 | 7102|10956| 2337 | 7103|9051| 2338 | 7106|4719| 2339 | 7107|3818| 2340 | 7111|4849| 2341 | 7114|8956| 2342 | 7119|5981| 2343 | 7124|9265| 2344 | 7126|6152| 2345 | 7130|9614| 2346 | 7132|10151| 2347 | 7133|6884| 2348 | 7136|1903| 2349 | 7140|2439| 2350 | 7145|4746| 2351 | 7149|5948| 2352 | 7151|1893| 2353 | 7156|1095| 2354 | 7159|6523| 2355 | 7160|7135| 2356 | 7164|6668| 2357 | 7165|5960| 2358 | 7168|7226| 2359 | 7169|10907| 2360 | 7172|9818| 2361 | 7174|10436| 2362 | 7178|1278| 2363 | 7183|3602| 2364 | 7184|8479| 2365 | 7185|1578| 2366 | 7188|1017| 2367 | 7190|9721| 2368 | 7193|7641| 2369 | 7195|8970| 2370 | 7200|8403| 2371 | 7205|7761| 2372 | 7208|278| 2373 | 7213|6141| 2374 | 7217|10507| 2375 | 7218|5913| 2376 | 7220|303| 2377 | 7223|4707| 2378 | 7227|6192| 2379 | 7231|3596| 2380 | 7232|971| 2381 | 7237|4581| 2382 | 7238|10889| 2383 | 7239|96| 2384 | 7243|8926| 2385 | 7244|8498| 2386 | 7246|10594| 2387 | 7247|6734| 2388 | 7252|7599| 2389 | 7254|7760| 2390 | 7255|3090| 2391 | 7257|591| 2392 | 7259|384| 2393 | 7263|5778| 2394 | 7264|10996| 2395 | 7267|2643| 2396 | 7270|642| 2397 | 7272|6180| 2398 | 7273|6653| 2399 | 7278|1479| 2400 | 7279|7584| 2401 | 7282|9673| 2402 | 7283|2497| 2403 | 7287|8948| 2404 | 7290|4799| 2405 | 7291|9923| 2406 | 7293|1459| 2407 | 7295|4662| 2408 | 7297|6625| 2409 | 7300|7558| 2410 | 7301|5504| 2411 | 7306|8385| 2412 | 7311|4881| 2413 | 7316|6917| 2414 | 7317|3734| 2415 | 7318|6706| 2416 | 7323|10701| 2417 | 7326|5073| 2418 | 7328|7982| 2419 | 7330|7502| 2420 | 7332|4216| 2421 | 7336|6483| 2422 | 7338|10223| 2423 | 7342|1748| 2424 | 7345|5069| 2425 | 7346|8980| 2426 | 7349|786| 2427 | 7353|1635| 2428 | 7356|7201| 2429 | 7360|6711| 2430 | 7364|2249| 2431 | 7365|4827| 2432 | 7367|10764| 2433 | 7368|11407| 2434 | 7369|9963| 2435 | 7370|10324| 2436 | 7372|9703| 2437 | 7377|934| 2438 | 7379|2048| 2439 | 7382|3052| 2440 | 7385|3325| 2441 | 7389|5452| 2442 | 7392|1940| 2443 | 7395|6304| 2444 | 7400|7472| 2445 | 7404|6418| 2446 | 7409|2759| 2447 | 7413|3315| 2448 | 7417|8247| 2449 | 7420|7781| 2450 | 7421|764| 2451 | 7426|10420| 2452 | 7427|9472| 2453 | 7430|900| 2454 | 7431|4372| 2455 | 7435|8892| 2456 | 7438|5250| 2457 | 7441|4166| 2458 | 7442|7201| 2459 | 7447|2579| 2460 | 7448|9176| 2461 | 7450|6422| 2462 | 7451|7123| 2463 | 7454|264| 2464 | 7455|1963| 2465 | 7456|3222| 2466 | 7460|6030| 2467 | 7461|1563| 2468 | 7464|7678| 2469 | 7468|6653| 2470 | 7470|10126| 2471 | 7474|1390| 2472 | 7475|77| 2473 | 7479|3671| 2474 | 7482|5411| 2475 | 7483|3588| 2476 | 7484|10164| 2477 | 7489|8208| 2478 | 7492|943| 2479 | 7497|4165| 2480 | 7499|6845| 2481 | 7501|7821| 2482 | 7502|5812| 2483 | 7506|7078| 2484 | 7510|1998| 2485 | 7512|613| 2486 | 7514|681| 2487 | 7515|10151| 2488 | 7519|1350| 2489 | 7522|16| 2490 | 7525|3864| 2491 | 7530|3077| 2492 | 7535|2143| 2493 | 7536|1778| 2494 | 7539|5726| 2495 | 7544|3402| 2496 | 7549|7299| 2497 | 7551|5933| 2498 | 7554|8705| 2499 | 7555|914| 2500 | 7558|374| 2501 | 7563|7183| 2502 | 7567|10478| 2503 | 7568|9842| 2504 | 7572|5448| 2505 | 7577|5733| 2506 | 7582|1524| 2507 | 7583|10937| 2508 | 7588|11061| 2509 | 7589|6211| 2510 | 7594|5795| 2511 | 7595|1317| 2512 | 7597|6132| 2513 | 7602|2763| 2514 | 7605|7502| 2515 | 7606|5635| 2516 | 7608|9039| 2517 | 7610|3760| 2518 | 7614|4792| 2519 | 7619|2234| 2520 | 7621|3191| 2521 | 7623|7441| 2522 | 7624|6225| 2523 | 7629|6743| 2524 | 7632|3183| 2525 | 7635|7311| 2526 | 7640|7715| 2527 | 7644|2872| 2528 | 7649|6881| 2529 | 7653|7457| 2530 | 7656|9490| 2531 | 7659|8964| 2532 | 7664|6151| 2533 | 7667|10866| 2534 | 7669|3451| 2535 | 7671|3428| 2536 | 7673|10380| 2537 | 7677|6635| 2538 | 7680|5404| 2539 | 7684|5164| 2540 | 7685|1935| 2541 | 7690|5741| 2542 | 7691|1270| 2543 | 7695|4644| 2544 | 7698|8279| 2545 | 7702|10807| 2546 | 7703|6324| 2547 | 7705|1699| 2548 | 7709|3379| 2549 | 7714|11046| 2550 | 7719|10570| 2551 | 7724|10980| 2552 | 7726|5992| 2553 | 7728|4043| 2554 | 7729|5528| 2555 | 7734|1880| 2556 | 7735|650| 2557 | 7739|4000| 2558 | 7742|9663| 2559 | 7747|4838| 2560 | 7749|3284| 2561 | 7752|10817| 2562 | 7753|5463| 2563 | 7758|5700| 2564 | 7760|7193| 2565 | 7763|11142| 2566 | 7766|4065| 2567 | 7768|1728| 2568 | 7771|9334| 2569 | 7776|6517| 2570 | 7777|8535| 2571 | 7781|4280| 2572 | 7786|6397| 2573 | 7791|9491| 2574 | 7796|9664| 2575 | 7798|5850| 2576 | 7801|786| 2577 | 7804|4252| 2578 | 7805|10043| 2579 | 7806|7661| 2580 | 7807|9837| 2581 | 7812|6027| 2582 | 7816|696| 2583 | 7818|8926| 2584 | 7823|983| 2585 | 7827|11032| 2586 | 7828|7864| 2587 | 7832|8912| 2588 | 7837|3895| 2589 | 7840|3151| 2590 | 7842|5248| 2591 | 7844|4366| 2592 | 7847|3997| 2593 | 7849|5791| 2594 | 7852|632| 2595 | 7855|5867| 2596 | 7858|8170| 2597 | 7860|10556| 2598 | 7864|5989| 2599 | 7866|2992| 2600 | 7868|3783| 2601 | 7869|2251| 2602 | 7874|82| 2603 | 7878|4728| 2604 | 7881|3872| 2605 | 7885|4759| 2606 | 7886|7489| 2607 | 7890|8567| 2608 | 7893|1825| 2609 | 7896|10586| 2610 | 7899|8194| 2611 | 7900|1018| 2612 | 7901|6238| 2613 | 7905|7361| 2614 | 7910|3140| 2615 | 7914|3183| 2616 | 7918|1090| 2617 | 7920|8957| 2618 | 7922|4065| 2619 | 7926|9541| 2620 | 7928|10747| 2621 | 7929|10115| 2622 | 7934|5759| 2623 | 7937|2004| 2624 | 7942|8740| 2625 | 7944|6948| 2626 | 7946|2444| 2627 | 7947|4531| 2628 | 7952|7956| 2629 | 7954|5792| 2630 | 7956|9647| 2631 | 7957|8044| 2632 | 7962|1439| 2633 | 7963|9472| 2634 | 7964|3855| 2635 | 7967|9511| 2636 | 7969|1099| 2637 | 7971|10868| 2638 | 7973|8928| 2639 | 7975|1768| 2640 | 7980|4250| 2641 | 7984|4534| 2642 | 7987|8795| 2643 | 7992|137| 2644 | 7994|418| 2645 | 7995|4915| 2646 | 7996|9880| 2647 | 7997|722| 2648 | 7998|3834| 2649 | 7999|9425| 2650 | 8002|4263| 2651 | 8007|8848| 2652 | 8010|6050| 2653 | 8013|6767| 2654 | 8014|9774| 2655 | 8019|10422| 2656 | 8024|8331| 2657 | 8029|3895| 2658 | 8034|1755| 2659 | 8036|1992| 2660 | 8040|9818| 2661 | 8042|2632| 2662 | 8044|4838| 2663 | 8046|2916| 2664 | 8050|7461| 2665 | 8052|5114| 2666 | 8056|5251| 2667 | 8057|5853| 2668 | 8062|7338| 2669 | 8063|2219| 2670 | 8065|744| 2671 | 8070|6003| 2672 | 8074|1510| 2673 | 8078|6725| 2674 | 8082|1293| 2675 | 8085|7654| 2676 | 8090|11324| 2677 | 8091|3017| 2678 | 8096|9914| 2679 | 8101|2379| 2680 | 8106|1886| 2681 | 8109|7431| 2682 | 8111|1874| 2683 | 8113|359| 2684 | 8116|1185| 2685 | 8121|5073| 2686 | 8124|8002| 2687 | 8127|1752| 2688 | 8132|5119| 2689 | 8134|7480| 2690 | 8138|10915| 2691 | 8142|5398| 2692 | 8146|803| 2693 | 8149|8366| 2694 | 8152|6168| 2695 | 8155|5867| 2696 | 8158|8521| 2697 | 8163|8919| 2698 | 8164|4692| 2699 | 8166|9249| 2700 | 8170|11385| 2701 | 8171|6804| 2702 | 8173|2053| 2703 | 8175|551| 2704 | 8180|9668| 2705 | 8182|3127| 2706 | 8187|5560| 2707 | 8192|5069| 2708 | 8196|2916| 2709 | 8199|6653| 2710 | 8204|2505| 2711 | 8206|9764| 2712 | 8209|503| 2713 | 8213|8963| 2714 | 8214|6447| 2715 | 8218|9867| 2716 | 8219|2552| 2717 | 8221|10533| 2718 | 8224|7816| 2719 | 8226|2778| 2720 | 8228|7287| 2721 | 8230|2337| 2722 | 8233|3013| 2723 | 8235|11304| 2724 | 8237|4805| 2725 | 8238|1141| 2726 | 8241|1247| 2727 | 8245|689| 2728 | 8250|7470| 2729 | 8253|10478| 2730 | 8258|1146| 2731 | 8263|9690| 2732 | 8264|9155| 2733 | 8268|3980| 2734 | 8273|9851| 2735 | 8277|1252| 2736 | 8281|2102| 2737 | 8282|6203| 2738 | 8286|3941| 2739 | 8291|1441| 2740 | 8292|10758| 2741 | 8294|816| 2742 | 8296|6312| 2743 | 8301|8241| 2744 | 8302|8100| 2745 | 8304|3728| 2746 | 8308|9389| 2747 | 8313|392| 2748 | 8315|5564| 2749 | 8319|2861| 2750 | 8323|9955| 2751 | 8328|10375| 2752 | 8333|5338| 2753 | 8335|10307| 2754 | 8339|3818| 2755 | 8341|1564| 2756 | 8346|838| 2757 | 8348|10323| 2758 | 8350|2621| 2759 | 8355|6051| 2760 | 8356|9093| 2761 | 8361|3713| 2762 | 8362|3413| 2763 | 8366|3837| 2764 | 8369|3217| 2765 | 8371|6207| 2766 | 8373|11084| 2767 | 8376|6786| 2768 | 8381|9434| 2769 | 8382|3498| 2770 | 8385|10765| 2771 | 8388|5597| 2772 | 8390|11057| 2773 | 8395|1880| 2774 | 8399|7006| 2775 | 8400|7737| 2776 | 8402|705| 2777 | 8404|3236| 2778 | 8408|3599| 2779 | 8410|2292| 2780 | 8415|9849| 2781 | 8419|1621| 2782 | 8422|4985| 2783 | 8424|2963| 2784 | 8428|6553| 2785 | 8429|374| 2786 | 8434|2958| 2787 | 8437|4156| 2788 | 8438|8004| 2789 | 8443|9453| 2790 | 8446|11000| 2791 | 8450|4478| 2792 | 8454|8274| 2793 | 8456|3145| 2794 | 8458|11397| 2795 | 8462|1982| 2796 | 8466|9044| 2797 | 8470|3895| 2798 | 8471|9165| 2799 | 8476|4684| 2800 | 8480|408| 2801 | 8485|7| 2802 | 8489|5941| 2803 | 8490|5510| 2804 | 8492|300| 2805 | 8495|3349| 2806 | 8500|319| 2807 | 8504|10240| 2808 | 8505|10968| 2809 | 8510|8806| 2810 | 8514|1295| 2811 | 8515|7159| 2812 | 8518|2887| 2813 | 8523|6189| 2814 | 8525|7728| 2815 | 8526|407| 2816 | 8528|11097| 2817 | 8529|3588| 2818 | 8534|5359| 2819 | 8536|8321| 2820 | 8539|6560| 2821 | 8540|1331| 2822 | 8543|3533| 2823 | 8545|1089| 2824 | 8549|1950| 2825 | 8552|11327| 2826 | 8556|2161| 2827 | 8557|5137| 2828 | 8560|9856| 2829 | 8564|4208| 2830 | 8565|5281| 2831 | 8566|1402| 2832 | 8571|4696| 2833 | 8572|2414| 2834 | 8577|1198| 2835 | 8580|6422| 2836 | 8581|7030| 2837 | 8585|7935| 2838 | 8589|11354| 2839 | 8592|534| 2840 | 8593|3218| 2841 | 8594|628| 2842 | 8598|10817| 2843 | 8600|6273| 2844 | 8603|7018| 2845 | 8608|3083| 2846 | 8613|278| 2847 | 8618|5021| 2848 | 8619|1412| 2849 | 8623|2999| 2850 | 8625|79| 2851 | 8628|10511| 2852 | 8633|7683| 2853 | 8637|2072| 2854 | 8638|9229| 2855 | 8641|3859| 2856 | 8643|10798| 2857 | 8644|9937| 2858 | 8646|6351| 2859 | 8650|7287| 2860 | 8653|10992| 2861 | 8655|4213| 2862 | 8659|43| 2863 | 8663|819| 2864 | 8667|2479| 2865 | 8669|9818| 2866 | 8670|5099| 2867 | 8672|6253| 2868 | 8675|8537| 2869 | 8678|7953| 2870 | 8683|8165| 2871 | 8688|11262| 2872 | 8689|8721| 2873 | 8690|8932| 2874 | 8692|7347| 2875 | 8695|6442| 2876 | 8696|7806| 2877 | 8700|2462| 2878 | 8703|8535| 2879 | 8705|2361| 2880 | 8707|10556| 2881 | 8708|6983| 2882 | 8711|524| 2883 | 8716|8229| 2884 | 8720|8087| 2885 | 8723|5091| 2886 | 8724|4608| 2887 | 8729|2911| 2888 | 8730|254| 2889 | 8734|5011| 2890 | 8735|6911| 2891 | 8737|3334| 2892 | 8741|1719| 2893 | 8743|1029| 2894 | 8744|5733| 2895 | 8748|11204| 2896 | 8752|5969| 2897 | 8756|1273| 2898 | 8760|561| 2899 | 8765|2115| 2900 | 8769|11351| 2901 | 8771|5819| 2902 | 8775|2618| 2903 | 8779|4696| 2904 | 8784|6933| 2905 | 8789|3649| 2906 | 8793|8372| 2907 | 8798|2753| 2908 | 8799|1439| 2909 | 8802|3577| 2910 | 8806|956| 2911 | 8808|3066| 2912 | 8809|9389| 2913 | 8811|6942| 2914 | 8814|4372| 2915 | 8816|7083| 2916 | 8817|4074| 2917 | 8822|4161| 2918 | 8823|1510| 2919 | 8827|5153| 2920 | 8832|8772| 2921 | 8833|11033| 2922 | 8838|26| 2923 | 8842|2482| 2924 | 8845|1621| 2925 | 8849|384| 2926 | 8852|5937| 2927 | 8853|3479| 2928 | 8858|9695| 2929 | 8862|10209| 2930 | 8865|3602| 2931 | 8869|1699| 2932 | 8871|8833| 2933 | 8875|1880| 2934 | 8879|4788| 2935 | 8884|11259| 2936 | 8886|8887| 2937 | 8887|9265| 2938 | 8892|10560| 2939 | 8897|6311| 2940 | 8900|6266| 2941 | 8901|9340| 2942 | 8904|932| 2943 | 8905|6050| 2944 | 8909|8124| 2945 | 8910|5444| 2946 | 8913|2039| 2947 | 8914|5421| 2948 | 8919|11379| 2949 | 8920|6758| 2950 | 8925|10890| 2951 | 8926|1811| 2952 | 8927|4372| 2953 | 8932|9529| 2954 | 8936|433| 2955 | 8938|3605| 2956 | 8941|3457| 2957 | 8946|10306| 2958 | 8948|4878| 2959 | 8950|8124| 2960 | 8954|8750| 2961 | 8959|9452| 2962 | 8963|389| 2963 | 8967|1825| 2964 | 8969|9992| 2965 | 8972|4165| 2966 | 8977|1874| 2967 | 8979|7038| 2968 | 8983|3561| 2969 | 8988|1659| 2970 | 8993|7873| 2971 | 8996|10667| 2972 | 8998|3088| 2973 | 9001|5007| 2974 | 9003|1315| 2975 | 9005|351| 2976 | 9007|947| 2977 | 9010|8984| 2978 | 9011|9630| 2979 | 9016|9790| 2980 | 9021|5265| 2981 | 9024|7468| 2982 | 9028|443| 2983 | 9033|2382| 2984 | 9038|11310| 2985 | 9042|2764| 2986 | 9046|1099| 2987 | 9050|10776| 2988 | 9051|1195| 2989 | 9056|2034| 2990 | 9060|1172| 2991 | 9062|10074| 2992 | 9066|8948| 2993 | 9069|7608| 2994 | 9071|9951| 2995 | 9076|6505| 2996 | 9081|9621| 2997 | 9085|1907| 2998 | 9087|11314| 2999 | 9091|3389| 3000 | 9092|2823| 3001 | 9097|9441| 3002 | 9101|496| 3003 | 9106|2916| 3004 | 9110|10303| 3005 | 9112|6460| 3006 | 9115|9567| 3007 | 9119|6910| 3008 | 9123|5792| 3009 | 9128|8119| 3010 | 9133|6730| 3011 | 9137|1061| 3012 | 9140|4696| 3013 | 9142|8403| 3014 | 9145|6024| 3015 | 9147|9139| 3016 | 9150|8023| 3017 | 9152|2173| 3018 | 9154|10885| 3019 | 9157|2213| 3020 | 9162|402| 3021 | 9165|5971| 3022 | 9170|9630| 3023 | 9174|1583| 3024 | 9177|3003| 3025 | 9178|8902| 3026 | 9180|9607| 3027 | 9185|10135| 3028 | 9187|1075| 3029 | 9190|3428| 3030 | 9191|113| 3031 | 9195|7672| 3032 | 9200|872| 3033 | 9203|11289| 3034 | 9208|4923| 3035 | 9212|4746| 3036 | 9216|9117| 3037 | 9221|2794| 3038 | 9223|10204| 3039 | 9227|4032| 3040 | 9228|4860| 3041 | 9229|7472| 3042 | 9232|2492| 3043 | 9236|6988| 3044 | 9239|11026| 3045 | 9241|5401| 3046 | 9245|6148| 3047 | 9250|8882| 3048 | 9254|4309| 3049 | 9256|1630| 3050 | 9258|8781| 3051 | 9259|9444| 3052 | 9264|8380| 3053 | 9269|10162| 3054 | 9272|1713| 3055 | 9273|2528| 3056 | 9278|8850| 3057 | 9281|7708| 3058 | 9286|7620| 3059 | 9290|2422| 3060 | 9292|9229| 3061 | 9293|6782| 3062 | 9298|10689| 3063 | 9301|11389| 3064 | 9302|9411| 3065 | 9303|7062| 3066 | 9304|8912| 3067 | 9307|9102| 3068 | 9308|983| 3069 | 9313|6490| 3070 | 9317|4882| 3071 | 9320|561| 3072 | 9322|4937| 3073 | 9323|10807| 3074 | 9327|1278| 3075 | 9330|320| 3076 | 9335|5244| 3077 | 9338|10994| 3078 | 9339|1510| 3079 | 9343|6755| 3080 | 9346|10085| 3081 | 9348|6689| 3082 | 9351|741| 3083 | 9352|9856| 3084 | 9357|9710| 3085 | 9359|6587| 3086 | 9361|1583| 3087 | 9365|7759| 3088 | 9369|2736| 3089 | 9372|1783| 3090 | 9374|662| 3091 | 9375|613| 3092 | 9377|5484| 3093 | 9382|359| 3094 | 9385|988| 3095 | 9390|3723| 3096 | 9394|2379| 3097 | 9397|7367| 3098 | 9399|6161| 3099 | 9402|9640| 3100 | 9407|10975| 3101 | 9412|10871| 3102 | 9416|3642| 3103 | 9420|10964| 3104 | 9423|8250| 3105 | 9425|4995| 3106 | 9428|6850| 3107 | 9431|11240| 3108 | 9433|3062| 3109 | 9437|4172| 3110 | 9438|10110| 3111 | 9443|9755| 3112 | 9447|4027| 3113 | 9448|7170| 3114 | 9449|1374| 3115 | 9454|6188| 3116 | 9459|2009| 3117 | 9462|2190| 3118 | 9463|9987| 3119 | 9465|435| 3120 | 9467|3673| 3121 | 9472|1236| 3122 | 9476|3732| 3123 | 9478|2583| 3124 | 9481|4213| 3125 | 9482|7115| 3126 | 9484|9784| 3127 | 9485|2745| 3128 | 9487|11362| 3129 | 9491|4613| 3130 | 9496|9009| 3131 | 9500|9402| 3132 | 9505|5915| 3133 | 9506|11087| 3134 | 9507|5166| 3135 | 9509|4372| 3136 | 9511|3542| 3137 | 9515|2048| 3138 | 9518|782| 3139 | 9519|5947| 3140 | 9520|2582| 3141 | 9523|3531| 3142 | 9525|8226| 3143 | 9530|4882| 3144 | 9533|7405| 3145 | 9538|2365| 3146 | 9541|3689| 3147 | 9542|8299| 3148 | 9545|5915| 3149 | 9550|11063| 3150 | 9553|10720| 3151 | 9556|1634| 3152 | 9557|11275| 3153 | 9559|3931| 3154 | 9563|5889| 3155 | 9568|7909| 3156 | 9573|809| 3157 | 9575|9291| 3158 | 9577|8989| 3159 | 9582|10173| 3160 | 9585|5704| 3161 | 9590|6611| 3162 | 9591|1729| 3163 | 9594|5350| 3164 | 9598|7087| 3165 | 9600|8754| 3166 | 9605|4486| 3167 | 9609|9642| 3168 | 9612|2613| 3169 | 9614|9301| 3170 | 9617|5091| 3171 | 9620|2699| 3172 | 9624|7977| 3173 | 9627|2731| 3174 | 9631|1471| 3175 | 9634|3358| 3176 | 9635|5380| 3177 | 9636|10344| 3178 | 9639|3592| 3179 | 9643|7920| 3180 | 9647|10428| 3181 | 9649|1058| 3182 | 9650|3217| 3183 | 9654|6611| 3184 | 9657|225| 3185 | 9662|8708| 3186 | 9666|10021| 3187 | 9668|1966| 3188 | 9672|10370| 3189 | 9676|7231| 3190 | 9681|5892| 3191 | 9685|1386| 3192 | 9689|611| 3193 | 9690|10091| 3194 | 9695|10898| 3195 | 9700|10607| 3196 | 9705|8772| 3197 | 9707|4846| 3198 | 9711|1295| 3199 | 9715|3284| 3200 | 9719|10772| 3201 | 9722|10436| 3202 | 9723|9555| 3203 | 9727|177| 3204 | 9731|1611| 3205 | 9735|1333| 3206 | 9738|7571| 3207 | 9740|7616| 3208 | 9741|5021| 3209 | 9744|3183| 3210 | 9749|3405| 3211 | 9754|9122| 3212 | 9757|943| 3213 | 9758|6388| 3214 | 9763|11213| 3215 | 9764|803| 3216 | 9768|10391| 3217 | 9771|10271| 3218 | 9775|10674| 3219 | 9778|764| 3220 | 9783|9072| 3221 | 9788|9850| 3222 | 9790|5275| 3223 | 9793|2379| 3224 | 9796|1555| 3225 | 9800|5077| 3226 | 9803|3401| 3227 | 9808|6721| 3228 | 9810|7609| 3229 | 9814|4377| 3230 | 9816|5315| 3231 | 9821|2748| 3232 | 9825|6933| 3233 | 9829|1711| 3234 | 9834|1719| 3235 | 9838|10114| 3236 | 9843|5897| 3237 | 9846|6824| 3238 | 9849|9563| 3239 | 9851|9457| 3240 | 9855|1282| 3241 | 9856|5804| 3242 | 9861|8923| 3243 | 9863|6988| 3244 | 9868|359| 3245 | 9871|1761| 3246 | 9873|6778| 3247 | 9874|1066| 3248 | 9878|8750| 3249 | 9879|4707| 3250 | 9884|10560| 3251 | 9885|10866| 3252 | 9890|9806| 3253 | 9894|9668| 3254 | 9896|3209| 3255 | 9897|5614| 3256 | 9901|9130| 3257 | 9902|6505| 3258 | 9905|1389| 3259 | 9906|5300| 3260 | 9911|544| 3261 | 9913|8039| 3262 | 9915|7157| 3263 | 9917|1185| 3264 | 9922|5360| 3265 | 9924|9621| 3266 | 9925|973| 3267 | 9929|8673| 3268 | 9932|3017| 3269 | 9933|10442| 3270 | 9934|9257| 3271 | 9936|2851| 3272 | 9939|6520| 3273 | 9943|8695| 3274 | 9944|177| 3275 | 9949|11008| 3276 | 9954|5101| 3277 | 9956|10549| 3278 | 9959|518| 3279 | 9964|944| 3280 | 9967|1381| 3281 | 9972|8171| 3282 | 9974|767| 3283 | 9975|3003| 3284 | 9978|4741| 3285 | 9983|2301| 3286 | 9988|4599| 3287 | 9992|2992| 3288 | 9997|9663| 3289 | 10000|9051| 3290 | 10005|6253| 3291 | 10010|53| 3292 | 10012|135| 3293 | 10015|3174| 3294 | 10019|7038| 3295 | 10022|824| 3296 | 10027|850| 3297 | 10032|3096| 3298 | 10033|6927| 3299 | 10035|9911| 3300 | 10040|15| 3301 | 10043|2006| 3302 | 10045|10825| 3303 | 10048|464| 3304 | 10050|11235| 3305 | 10054|704| 3306 | 10055|294| 3307 | 10058|9690| 3308 | 10062|294| 3309 | 10067|10809| 3310 | 10071|9253| 3311 | 10073|4719| 3312 | 10078|3491| 3313 | 10083|384| 3314 | 10085|10797| 3315 | 10088|3046| 3316 | 10090|11006| 3317 | 10093|9502| 3318 | 10096|8856| 3319 | 10099|8542| 3320 | 10102|4500| 3321 | 10105|10714| 3322 | 10106|3334| 3323 | 10108|6253| 3324 | 10111|9724| 3325 | 10112|10478| 3326 | 10117|4959| 3327 | 10118|9678| 3328 | 10122|6244| 3329 | 10127|6118| 3330 | 10128|1678| 3331 | 10132|7272| 3332 | 10134|5928| 3333 | 10137|4280| 3334 | 10139|3931| 3335 | 10140|9107| 3336 | 10142|10625| 3337 | 10144|6904| 3338 | 10148|7040| 3339 | 10153|5479| 3340 | 10156|10895| 3341 | 10161|4350| 3342 | 10163|1998| 3343 | 10164|8170| 3344 | 10168|4371| 3345 | 10171|8649| 3346 | 10176|1856| 3347 | 10181|9898| 3348 | 10182|5081| 3349 | 10183|6098| 3350 | 10187|4830| 3351 | 10189|3508| 3352 | 10191|10584| 3353 | 10195|6587| 3354 | 10196|9265| 3355 | 10201|4618| 3356 | 10202|1112| 3357 | 10205|10624| 3358 | 10207|841| 3359 | 10211|9165| 3360 | 10216|751| 3361 | 10218|5933| 3362 | 10220|9480| 3363 | 10224|8661| 3364 | 10226|4899| 3365 | 10231|7982| 3366 | 10234|4911| 3367 | 10239|5875| 3368 | 10244|10811| 3369 | 10246|3052| 3370 | 10250|7019| 3371 | 10255|4015| 3372 | 10257|776| 3373 | 10259|2992| 3374 | 10263|10074| 3375 | 10267|10474| 3376 | 10271|7023| 3377 | 10274|6968| 3378 | 10279|2608| 3379 | 10280|973| 3380 | 10281|10494| 3381 | 10284|4374| 3382 | 10288|7799| 3383 | 10291|7814| 3384 | 10296|3685| 3385 | 10299|5283| 3386 | 10302|1713| 3387 | 10307|10714| 3388 | 10308|370| 3389 | 10312|10297| 3390 | 10313|8956| 3391 | 10314|9955| 3392 | 10318|43| 3393 | 10321|4406| 3394 | 10325|566| 3395 | 10327|473| 3396 | 10330|9856| 3397 | 10331|10862| 3398 | 10335|4809| 3399 | 10338|7418| 3400 | 10339|3957| 3401 | 10341|1515| 3402 | 10342|6057| 3403 | 10343|3452| 3404 | 10345|5099| 3405 | 10350|6207| 3406 | 10354|7135| 3407 | 10355|2492| 3408 | 10357|7788| 3409 | 10359|2368| 3410 | 10361|8604| 3411 | 10362|10187| 3412 | 10364|1346| 3413 | 10368|5469| 3414 | 10372|6978| 3415 | 10374|8765| 3416 | 10376|7973| 3417 | 10380|3041| 3418 | 10385|9320| 3419 | 10388|9334| 3420 | 10392|3453| 3421 | 10397|1677| 3422 | 10399|5887| 3423 | 10404|4468| 3424 | 10408|10816| 3425 | 10413|5134| 3426 | 10418|1205| 3427 | 10419|7056| 3428 | 10420|10907| 3429 | 10424|2732| 3430 | 10426|3465| 3431 | 10428|6563| 3432 | 10431|4114| 3433 | 10432|2731| 3434 | 10435|990| 3435 | 10438|3389| 3436 | 10440|1903| 3437 | 10445|6653| 3438 | 10446|269| 3439 | 10449|7392| 3440 | 10452|1711| 3441 | 10456|11324| 3442 | 10458|4287| 3443 | 10462|496| 3444 | 10464|4995| 3445 | 10465|8934| 3446 | 10467|7287| 3447 | 10470|1719| 3448 | 10471|760| 3449 | 10476|9491| 3450 | 10479|2238| 3451 | 10480|9870| 3452 | 10484|819| 3453 | 10488|5779| 3454 | 10490|9942| 3455 | 10491|5012| 3456 | 10495|8250| 3457 | 10500|2200| 3458 | 10501|2359| 3459 | 10506|4531| 3460 | 10509|9596| 3461 | 10511|10996| 3462 | 10512|733| 3463 | 10515|9923| 3464 | 10517|611| 3465 | 10518|9985| 3466 | 10520|8414| 3467 | 10522|4110| 3468 | 10523|4581| 3469 | 10524|7027| 3470 | 10526|9647| 3471 | 10527|7572| 3472 | 10530|6955| 3473 | 10532|1084| 3474 | 10534|1597| 3475 | 10536|8827| 3476 | 10537|4319| 3477 | 10538|3473| 3478 | 10541|3953| 3479 | 10545|10763| 3480 | 10546|11091| 3481 | 10550|10257| 3482 | 10551|8326| 3483 | 10556|4704| 3484 | 10557|4280| 3485 | 10559|1278| 3486 | 10562|6791| 3487 | 10567|5201| 3488 | 10569|7609| 3489 | 10573|5593| 3490 | 10577|2004| 3491 | 10578|6341| 3492 | 10581|10674| 3493 | 10583|3815| 3494 | 10585|3874| 3495 | 10587|2153| 3496 | 10590|9047| 3497 | 10595|5467| 3498 | 10598|5008| 3499 | 10603|6678| 3500 | 10604|1017| 3501 | 10608|7246| 3502 | 10611|5657| 3503 | 10615|9964| 3504 | 10617|3457| 3505 | 10621|6110| 3506 | 10622|4762| 3507 | 10627|1205| 3508 | 10632|1003| 3509 | 10634|483| 3510 | 10637|6520| 3511 | 10641|8019| 3512 | 10645|5281| 3513 | 10646|8837| 3514 | 10648|11011| 3515 | 10650|2492| 3516 | 10653|9335| 3517 | 10656|9075| 3518 | 10657|10702| 3519 | 10659|10460| 3520 | 10664|10451| 3521 | 10669|1755| 3522 | 10673|2916| 3523 | 10678|5250| 3524 | 10681|8688| 3525 | 10683|10092| 3526 | 10688|1894| 3527 | 10692|3911| 3528 | 10696|651| 3529 | 10701|2709| 3530 | 10702|7724| 3531 | 10707|9003| 3532 | 10712|867| 3533 | 10716|31| 3534 | 10717|1185| 3535 | 10720|10025| 3536 | 10724|11087| 3537 | 10726|1032| 3538 | 10729|435| 3539 | 10734|4838| 3540 | 10737|8785| 3541 | 10738|2778| 3542 | 10739|3501| 3543 | 10744|82| 3544 | 10746|3334| 3545 | 10751|5452| 3546 | 10752|41| 3547 | 10754|7826| 3548 | 10755|1948| 3549 | 10760|9582| 3550 | 10764|4399| 3551 | 10767|9266| 3552 | 10769|6035| 3553 | 10770|10899| 3554 | 10774|8548| 3555 | 10779|4081| 3556 | 10782|6148| 3557 | 10783|1763| 3558 | 10787|10775| 3559 | 10791|7608| 3560 | 10793|3033| 3561 | 10797|7570| 3562 | 10800|1773| 3563 | 10805|11136| 3564 | 10810|2292| 3565 | 10811|6537| 3566 | 10813|6187| 3567 | 10815|6051| 3568 | 10818|2565| 3569 | 10820|4027| 3570 | 10821|4238| 3571 | 10823|1131| 3572 | 10825|4292| 3573 | 10829|1072| 3574 | 10833|1295| 3575 | 10836|11235| 3576 | 10841|10986| 3577 | 10845|4781| 3578 | 10848|4930| 3579 | 10852|7121| 3580 | 10853|994| 3581 | 10854|9843| 3582 | 10859|4| 3583 | 10861|4460| 3584 | 10865|8505| 3585 | 10867|427| 3586 | 10868|3046| 3587 | 10871|6953| 3588 | 10876|745| 3589 | 10880|306| 3590 | 10881|594| 3591 | 10885|8004| 3592 | 10886|7806| 3593 | 10889|560| 3594 | 10893|144| 3595 | 10894|8399| 3596 | 10898|3244| 3597 | 10900|2401| 3598 | 10901|7283| 3599 | 10905|3258| 3600 | 10910|4190| 3601 | 10915|163| 3602 | 10916|9514| 3603 | 10920|3666| 3604 | 10923|4751| 3605 | 10927|5077| 3606 | 10930|6996| 3607 | 10935|6297| 3608 | 10936|9838| 3609 | 10937|3013| 3610 | 10938|109| 3611 | 10941|2128| 3612 | 10946|5265| 3613 | 10949|4901| 3614 | 10952|696| 3615 | 10955|10380| 3616 | 10956|1862| 3617 | 10959|1386| 3618 | 10961|7051| 3619 | 10966|10424| 3620 | 10971|2593| 3621 | 10976|6089| 3622 | 10977|7996| 3623 | 10979|269| 3624 | 10983|551| 3625 | 10986|8856| 3626 | 10987|1095| 3627 | 10991|7632| 3628 | 10992|7223| 3629 | 10993|6419| 3630 | 10996|2006| 3631 | 11001|7826| 3632 | 11006|4788| 3633 | 11010|2925| 3634 | 11013|10451| 3635 | 11015|3401| 3636 | 11017|10716| 3637 | 11019|566| 3638 | 11021|3077| 3639 | 11025|9174| 3640 | 11029|1849| 3641 | 11033|482| 3642 | 11038|9834| 3643 | 11042|9101| 3644 | 11044|5741| 3645 | 11046|2345| 3646 | 11050|764| 3647 | 11052|3985| 3648 | 11054|1471| 3649 | 11058|10428| 3650 | 11062|7958| 3651 | 11063|6304| 3652 | 11067|7332| 3653 | 11071|2312| 3654 | 11075|8579| 3655 | 11079|3209| 3656 | 11082|5989| 3657 | 11083|6828| 3658 | 11086|3814| 3659 | 11087|8948| 3660 | 11092|5121| 3661 | 11096|7299| 3662 | 11099|9291| 3663 | 11100|2221| 3664 | 11105|4034| 3665 | 11107|3681| 3666 | 11109|504| 3667 | 11110|4500| 3668 | 11111|8194| 3669 | 11113|3423| 3670 | 11114|11204| 3671 | 11116|9668| 3672 | 11117|10065| 3673 | 11122|4553| 3674 | 11123|3056| 3675 | 11125|1117| 3676 | 11130|8811| 3677 | 11133|5652| 3678 | 11134|6099| 3679 | 11138|4762| 3680 | 11143|278| 3681 | 11145|3398| 3682 | 11146|1352| 3683 | 11147|1320| 3684 | 11150|6702| 3685 | 11154|11032| 3686 | 11158|7472| 3687 | 11163|10885| 3688 | 11167|168| 3689 | 11171|7616| 3690 | 11176|10903| 3691 | 11178|3567| 3692 | 11179|10166| 3693 | 11184|3773| 3694 | 11186|4025| 3695 | 11191|3773| 3696 | 11195|371| 3697 | 11200|509| 3698 | 11201|8881| 3699 | 11202|6414| 3700 | 11207|10219| 3701 | 11208|624| 3702 | 11213|2238| 3703 | 11215|8229| 3704 | 11219|3561| 3705 | 11222|1221| 3706 | 11226|1029| 3707 | 11231|11044| 3708 | 11235|9806| 3709 | 11239|1335| 3710 | 11244|10126| 3711 | 11247|7935| 3712 | 11252|7193| 3713 | 11255|8512| 3714 | 11258|6197| 3715 | 11260|7791| 3716 | 11262|6295| 3717 | 11263|2280| 3718 | 11266|6132| 3719 | 11271|10033| 3720 | 11273|6119| 3721 | 11274|2744| 3722 | 11276|5189| 3723 | 11279|4494| 3724 | 11283|9498| 3725 | 11285|2320| 3726 | 11289|10625| 3727 | 11293|2234| 3728 | 11296|1524| 3729 | 11299|7342| 3730 | 11302|773| 3731 | 11303|1915| 3732 | 11308|7393| 3733 | 11313|31| 3734 | 11317|7405| 3735 | 11322|6106| 3736 | 11324|10370| 3737 | 11329|9979| 3738 | 11332|5741| 3739 | 11333|10507| 3740 | 11335|2118| 3741 | 11338|10666| 3742 | 11342|8693| 3743 | 11344|1728| 3744 | 11347|3480| 3745 | 11348|3898| 3746 | 11353|11033| 3747 | 11357|8712| 3748 | 11361|2213| 3749 | 11366|9987| 3750 | 11369|9511| 3751 | 11371|7302| 3752 | 11373|10830| 3753 | 11378|2393| 3754 | 11379|1061| 3755 | 11384|5401| 3756 | 11387|4852| 3757 | 11392|4989| 3758 | 11394|1486| 3759 | 11399|8745| 3760 | 11403|252| 3761 | 11408|15| 3762 | 11413|7178| 3763 | 11418|1736| 3764 | 11420|6844| 3765 | 11425|6009| 3766 | 11429|7152| 3767 | 11431|4183| 3768 | 11434|3557| 3769 | 11438|1958| 3770 | 11441|7229| 3771 | 11445|7248| 3772 | 11448|9170| 3773 | 11452|1761| 3774 | 11454|803| 3775 | 11458|8263| 3776 | 11459|5948| 3777 | 11461|6717| 3778 | 11466|1070| 3779 | 11467|9782| 3780 | 11469|7035| 3781 | 11471|6625| 3782 | 11475|932| 3783 | 11477|9472| 3784 | 11479|8772| 3785 | 11481|8934| 3786 | 11484|8560| 3787 | 11488|11301| 3788 | 11491|254| 3789 | 11493|6651| 3790 | 11494|9006| 3791 | 11498|2312| 3792 | 11503|2455| 3793 | 11505|6809| 3794 | 11506|316| 3795 | 11507|9903| 3796 | 11510|6904| 3797 | 11513|4486| 3798 | 11515|5956| 3799 | 11520|2628| 3800 | 11524|1755| 3801 | 11525|2470| 3802 | 11526|10401| 3803 | 11529|744| 3804 | 11531|2449| 3805 | 11534|8684| 3806 | 11535|8341| 3807 | 11540|10727| 3808 | 11545|8337| 3809 | 11550|7759| 3810 | 11553|9334| 3811 | 11554|7436| 3812 | 11556|10910| 3813 | 11559|306| 3814 | 11561|1123| 3815 | 11565|1926| 3816 | 11566|4555| 3817 | 11568|9001| 3818 | 11570|2138| 3819 | 11574|2993| 3820 | 11576|9221| 3821 | 11580|8337| 3822 | 11582|2317| 3823 | 11586|21| 3824 | 11587|5593| 3825 | 11591|5147| 3826 | 11596|8236| 3827 | 11600|3572| 3828 | 11603|8255| 3829 | 11607|5028| 3830 | 11609|6572| 3831 | 11610|8928| 3832 | 11615|1203| 3833 | 11620|9359| 3834 | 11625|5732| 3835 | 11629|6567| 3836 | 11631|1987| 3837 | 11633|2974| 3838 | 11636|3372| 3839 | 11641|4165| 3840 | 11645|6567| 3841 | 11647|9032| 3842 | 11650|3218| 3843 | 11654|7449| 3844 | 11656|4113| 3845 | 11659|7078| 3846 | 11660|8621| 3847 | 11664|7715| 3848 | 11667|3673| 3849 | 11671|2280| 3850 | 11672|1576| 3851 | 11676|8947| 3852 | 11680|8137| 3853 | 11683|246| 3854 | 11686|10701| 3855 | 11691|6234| 3856 | 11696|5928| 3857 | 11698|4113| 3858 | 11702|6738| 3859 | 11707|9351| 3860 | 11708|681| 3861 | 11710|5119| 3862 | 11715|3583| 3863 | 11718|4508| 3864 | 11723|1306| 3865 | 11726|3718| 3866 | 11727|2462| 3867 | 11730|4255| 3868 | 11734|2039| 3869 | 11735|10094| 3870 | 11740|10576| 3871 | 11743|9903| 3872 | 11747|11021| 3873 | 11749|4401| 3874 | 11753|4172| 3875 | 11754|4696| 3876 | 11756|2082| 3877 | 11757|3968| 3878 | 11760|10801| 3879 | 11763|8185| 3880 | 11768|5119| 3881 | 11769|370| 3882 | 11770|8905| 3883 | 11773|8604| 3884 | 11774|4366| 3885 | 11776|4366| 3886 | 11780|5085| 3887 | 11784|7608| 3888 | 11789|6464| 3889 | 11790|7871| 3890 | 11794|2930| 3891 | 11797|1748| 3892 | 11801|7579| 3893 | 11804|5837| 3894 | 11808|9591| 3895 | 11813|7248| 3896 | 11815|8013| 3897 | 11816|5602| 3898 | 11817|7206| 3899 | 11822|6389| 3900 | 11825|650| 3901 | 11826|6791| 3902 | 11829|1379| 3903 | 11832|1471| 3904 | 11835|6686| 3905 | 11840|6534| 3906 | 11841|4141| 3907 | 11846|6092| 3908 | 11849|1290| 3909 | 11853|10971| 3910 | 11856|10380| 3911 | 11857|6314| 3912 | 11862|1634| 3913 | 11864|125| 3914 | 11867|6786| 3915 | 11871|9833| 3916 | 11875|8403| 3917 | 11878|8995| 3918 | 11882|6755| 3919 | 11884|8941| 3920 | 11889|3325| 3921 | 11890|209| 3922 | 11895|9299| 3923 | 11898|300| 3924 | 11900|1944| 3925 | 11902|3172| 3926 | 11903|6645| 3927 | 11906|8827| 3928 | 11911|9969| 3929 | 11915|10298| 3930 | 11918|6122| 3931 | 11923|9815| 3932 | 11927|11282| 3933 | 11928|9774| 3934 | 11933|82| 3935 | 11936|2926| 3936 | 11940|5819| 3937 | 11941|3815| 3938 | 11943|9365| 3939 | 11947|6107| 3940 | 11948|8244| 3941 | 11949|797| 3942 | 11953|4636| 3943 | 11957|7129| 3944 | 11960|7418| 3945 | 11965|10092| 3946 | 11969|1118| 3947 | 11971|26| 3948 | 11973|1324| 3949 | 11975|1909| 3950 | 11980|109| 3951 | 11983|6282| 3952 | 11984|1703| 3953 | 11986|2023| 3954 | 11988|8138| 3955 | 11991|975| 3956 | 11995|2204| 3957 | 11998|1107| 3958 | 12001|8240| 3959 | 12005|1018| 3960 | 12006|7105| 3961 | 12010|6189| 3962 | 12013|4208| 3963 | 12016|928| 3964 | 12021|5944| 3965 | 12026|1142| 3966 | 12028|10358| 3967 | 12031|374| 3968 | 12035|8385| 3969 | 12037|1127| 3970 | 12040|10451| 3971 | 12043|1317| 3972 | 12046|5031| 3973 | 12049|6594| 3974 | 12054|1560| 3975 | 12055|11331| 3976 | 12059|10523| 3977 | 12061|3091| 3978 | 12066|3626| 3979 | 12067|9647| 3980 | 12072|3827| 3981 | 12076|3436| 3982 | 12077|9631| 3983 | 12078|10893| 3984 | 12081|11346| 3985 | 12086|1950| 3986 | 12091|4127| 3987 | 12092|6653| 3988 | 12095|10478| 3989 | 12099|7672| 3990 | 12100|2492| 3991 | 12104|10732| 3992 | 12108|195| 3993 | 12109|7292| 3994 | 12111|10624| 3995 | 12115|9989| 3996 | 12117|7819| 3997 | 12119|4818| 3998 | 12121|486| 3999 | 12123|5792| 4000 | 12124|531| 4001 | 12127|5226| 4002 | 12132|4456| 4003 | 12136|2879| 4004 | 12139|10288| 4005 | 12144|867| 4006 | 12145|4114| 4007 | 12148|8490| 4008 | 12150|8765| 4009 | 12151|9389| 4010 | 12155|2534| 4011 | 12160|9402| 4012 | 12162|11331| 4013 | 12167|10157| 4014 | 12172|6927| 4015 | 12177|2237| 4016 | 12182|147| 4017 | 12185|2060| 4018 | 12189|8697| 4019 | 12194|5677| 4020 | 12198|8970| 4021 | 12199|7776| 4022 | 12203|10356| 4023 | 12207|2359| 4024 | 12212|6329| 4025 | 12215|10204| 4026 | 12220|5853| 4027 | 12221|8957| 4028 | 12223|8560| 4029 | 12227|5678| 4030 | 12229|891| 4031 | 12230|6978| 4032 | 12233|6160| 4033 | 12238|4985| 4034 | 12239|1381| 4035 | 12240|2676| 4036 | 12241|7489| 4037 | 12243|9420| 4038 | 12248|4531| 4039 | 12253|7697| 4040 | 12257|6293| 4041 | 12259|3948| 4042 | 12260|6955| 4043 | 12263|5657| 4044 | 12265|3718| 4045 | 12268|10690| 4046 | 12272|9282| 4047 | 12277|6546| 4048 | 12278|10192| 4049 | 12279|8958| 4050 | 12280|4827| 4051 | 12282|8366| 4052 | 12286|10678| 4053 | 12287|5819| 4054 | 12292|3409| 4055 | 12295|2833| 4056 | 12299|5171| 4057 | 12302|3028| 4058 | 12307|2361| 4059 | 12308|6652| 4060 | 12312|7322| 4061 | 12316|4098| 4062 | 12318|9919| 4063 | 12322|1926| 4064 | 12326|5007| 4065 | 12327|3503| 4066 | 12328|10064| 4067 | 12330|10003| 4068 | 12334|10255| 4069 | 12338|431| 4070 | 12339|10740| 4071 | 12340|8372| 4072 | 12342|3539| 4073 | 12343|9529| 4074 | 12347|5195| 4075 | 12351|7628| 4076 | 12355|8957| 4077 | 12357|8621| 4078 | 12360|3369| 4079 | 12365|9327| 4080 | 12370|2047| 4081 | 12375|5300| 4082 | 12377|6743| 4083 | 12382|6115| 4084 | 12383|7654| 4085 | 12384|5872| 4086 | 12385|5750| 4087 | 12388|389| 4088 | 12392|524| 4089 | 12394|6372| 4090 | 12397|6964| 4091 | 12398|5270| 4092 | 12401|4521| 4093 | 12405|622| 4094 | 12408|10860| 4095 | 12412|9736| 4096 | 12417|11171| 4097 | 12419|3588| 4098 | 12424|1198| 4099 | 12428|5697| 4100 | 12431|1686| 4101 | 12432|6893| 4102 | 12437|9369| 4103 | 12439|11169| 4104 | 12441|7796| 4105 | 12444|4331| 4106 | 12446|8013| 4107 | 12449|2987| 4108 | 12453|5551| 4109 | 12457|3624| 4110 | 12460|8171| 4111 | 12464|8928| 4112 | 12469|6697| 4113 | 12470|10765| 4114 | 12473|359| 4115 | 12475|9792| 4116 | 12478|8760| 4117 | 12479|10771| 4118 | 12480|10576| 4119 | 12482|10378| 4120 | 12484|1186| 4121 | 12487|6382| 4122 | 12488|2564| 4123 | 12492|6533| 4124 | 12496|9751| 4125 | 12498|2238| 4126 | 12501|8097| 4127 | 12505|6402| 4128 | 12506|4618| 4129 | 12507|1456| 4130 | 12511|5850| 4131 | 12514|2341| 4132 | 12515|6439| 4133 | 12517|452| 4134 | 12522|5969| 4135 | 12526|10142| 4136 | 12531|10328| 4137 | 12534|1683| 4138 | 12539|1436| 4139 | 12541|4227| 4140 | 12544|1066| 4141 | 12547|9345| 4142 | 12551|5293| 4143 | 12556|2949| 4144 | 12559|1677| 4145 | 12563|5999| 4146 | 12567|6271| 4147 | 12568|212| 4148 | 12572|10616| 4149 | 12576|1143| 4150 | 12579|4213| 4151 | 12584|10862| 4152 | 12586|9843| 4153 | 12589|408| 4154 | 12594|9434| 4155 | 12599|1761| 4156 | 12603|10666| 4157 | 12606|7724| 4158 | 12608|1125| 4159 | 12610|1471| 4160 | 12614|2686| 4161 | 12618|4166| 4162 | 12622|6983| 4163 | 12626|2906| 4164 | 12629|7056| 4165 | 12631|6152| 4166 | 12632|5073| 4167 | 12636|10395| 4168 | 12639|6892| 4169 | 12643|456| 4170 | 12646|10456| 4171 | 12647|544| 4172 | 12649|10487| 4173 | 12653|7032| 4174 | 12655|7152| 4175 | 12656|5181| 4176 | 12658|4688| 4177 | 12659|4399| 4178 | 12660|2180| 4179 | 12662|8441| 4180 | 12666|2987| 4181 | 12669|10388| 4182 | 12670|5842| 4183 | 12674|1636| 4184 | 12677|3539| 4185 | 12681|6734| 4186 | 12684|5119| 4187 | 12686|4421| 4188 | 12688|8902| 4189 | 12690|6549| 4190 | 12691|10655| 4191 | 12695|7097| 4192 | 12699|109| 4193 | 12704|6105| 4194 | 12707|4959| 4195 | 12710|8621| 4196 | 12712|6024| 4197 | 12717|3077| 4198 | 12722|7886| 4199 | 12723|7819| 4200 | 12727|1420| 4201 | 12731|3713| 4202 | 12735|1901| 4203 | 12736|3530| 4204 | 12738|10450| 4205 | 12740|2284| 4206 | 12745|5103| 4207 | 12748|371| 4208 | 12753|1901| 4209 | 12754|8669| 4210 | 12759|6583| 4211 | 12760|10045| 4212 | 12762|2725| 4213 | 12767|3837| 4214 | 12769|6166| 4215 | 12772|6594| 4216 | 12774|4331| 4217 | 12778|4735| 4218 | 12782|10121| 4219 | 12787|4599| 4220 | 12792|8410| 4221 | 12797|8769| 4222 | 12801|8208| 4223 | 12802|1695| 4224 | 12803|2200| 4225 | 12805|6470| 4226 | 12810|1380| 4227 | 12815|1862| 4228 | 12817|7327| 4229 | 12821|928| 4230 | 12825|10775| 4231 | 12826|6223| 4232 | 12831|9467| 4233 | 12835|6537| 4234 | 12838|10177| 4235 | 12843|8188| 4236 | 12847|1021| 4237 | 12849|5960| 4238 | 12852|4927| 4239 | 12854|2823| 4240 | 12858|9383| 4241 | 12863|4731| 4242 | 12868|6289| 4243 | 12872|10192| 4244 | 12873|6244| 4245 | 12875|9485| 4246 | 12879|5593| 4247 | 12880|1186| 4248 | 12884|9347| 4249 | 12885|7249| 4250 | 12889|5842| 4251 | 12890|5614| 4252 | 12895|8941| 4253 | 12899|4481| 4254 | 12900|8445| 4255 | 12903|7503| 4256 | 12908|11182| 4257 | 12909|11263| 4258 | 12914|4326| 4259 | 12916|7729| 4260 | 12920|2237| 4261 | 12925|8380| 4262 | 12930|4735| 4263 | 12931|5394| 4264 | 12932|7231| 4265 | 12935|1980| 4266 | 12940|5528| 4267 | 12941|6812| 4268 | 12944|4002| 4269 | 12945|456| 4270 | 12948|89| 4271 | 12951|1921| 4272 | 12955|7605| 4273 | 12956|10032| 4274 | 12957|7249| 4275 | 12960|7683| 4276 | 12965|5621| 4277 | 12970|6218| 4278 | 12971|7806| 4279 | 12972|7632| 4280 | 12973|667| 4281 | 12978|5114| 4282 | 12980|1446| 4283 | 12983|1371| 4284 | 12987|1796| 4285 | 12989|11067| 4286 | 12993|10768| 4287 | 12996|3346| 4288 | 13001|2072| 4289 | 13003|4427| 4290 | 13004|1996| 4291 | 13009|10147| 4292 | 13012|5953| 4293 | 13014|1379| 4294 | 13016|1719| 4295 | 13018|1046| 4296 | 13022|9239| 4297 | 13025|5495| 4298 | 13030|11266| 4299 | 13033|5500| 4300 | 13035|6955| 4301 | 13038|9372| 4302 | 13043|6333| 4303 | 13047|1543| 4304 | 13050|3599| 4305 | 13054|502| 4306 | 13056|3942| 4307 | 13060|3675| 4308 | 13065|3933| 4309 | 13070|8984| 4310 | 13072|3146| 4311 | 13075|2716| 4312 | 13076|4961| 4313 | 13079|3526| 4314 | 13081|8512| 4315 | 13083|1520| 4316 | 13087|4993| 4317 | 13088|9973| 4318 | 13089|2513| 4319 | 13092|62| 4320 | 13096|5661| 4321 | 13098|4216| 4322 | 13102|3266| 4323 | 13104|7678| 4324 | 13106|4669| 4325 | 13108|1695| 4326 | 13109|2833| 4327 | 13111|9647| 4328 | 13113|11313| 4329 | 13114|10092| 4330 | 13116|7997| 4331 | 13118|646| 4332 | 13122|11015| 4333 | 13125|7791| 4334 | 13127|4263| 4335 | 13130|5190| 4336 | 13135|1713| 4337 | 13136|9607| 4338 | 13140|410| 4339 | 13144|2218| 4340 | 13148|3384| 4341 | 13152|2737| 4342 | 13157|139| 4343 | 13160|7510| 4344 | 13165|1520| 4345 | 13170|3550| 4346 | 13173|3941| 4347 | 13178|9747| 4348 | 13183|6582| 4349 | 13188|1657| 4350 | 13193|7554| 4351 | 13198|9546| 4352 | 13203|7617| 4353 | 13208|6768| 4354 | 13210|6134| 4355 | 13212|303| 4356 | 13214|3829| 4357 | 13215|7092| 4358 | 13220|4390| 4359 | 13221|4843| 4360 | 13224|7048| 4361 | 13225|7985| 4362 | 13226|1487| 4363 | 13231|8496| 4364 | 13234|4254| 4365 | 13239|5419| 4366 | 13240|7642| 4367 | 13243|6563| 4368 | 13244|6372| 4369 | 13249|3028| 4370 | 13253|1755| 4371 | 13255|137| 4372 | 13260|609| 4373 | 13265|6141| 4374 | 13266|8899| 4375 | 13268|1168| 4376 | 13270|1825| 4377 | 13273|11310| 4378 | 13274|6030| 4379 | 13278|6332| 4380 | 13279|9416| 4381 | 13281|2385| 4382 | 13284|4768| 4383 | 13285|4555| 4384 | 13289|1855| 4385 | 13292|7618| 4386 | 13295|5273| 4387 | 13298|5732| 4388 | 13301|1003| 4389 | 13305|1935| 4390 | 13306|4353| 4391 | 13309|10251| 4392 | 13312|2081| 4393 | 13314|684| 4394 | 13316|7373| 4395 | 13317|8600| 4396 | 13320|9075| 4397 | 13324|7992| 4398 | 13327|9595| 4399 | 13330|2737| 4400 | 13332|3405| 4401 | 13335|9777| 4402 | 13336|3777| 4403 | 13340|9721| 4404 | 13345|9201| 4405 | 13346|8315| 4406 | 13349|8579| 4407 | 13351|9570| 4408 | 13356|8171| 4409 | 13360|10594| 4410 | 13362|1112| 4411 | 13366|6543| 4412 | 13367|299| 4413 | 13370|11109| 4414 | 13372|483| 4415 | 13374|6782| 4416 | 13379|3418| 4417 | 13384|9126| 4418 | 13385|10584| 4419 | 13390|4081| 4420 | 13391|3216| 4421 | 13392|7510| 4422 | 13397|3431| 4423 | 13401|2748| 4424 | 13403|4534| 4425 | 13407|2410| 4426 | 13411|6791| 4427 | 13414|10674| 4428 | 13417|4775| 4429 | 13422|10378| 4430 | 13426|7958| 4431 | 13431|1911| 4432 | 13432|5325| 4433 | 13435|861| 4434 | 13436|7628| 4435 | 13437|3975| 4436 | 13439|764| 4437 | 13443|5892| 4438 | 13447|1576| 4439 | 13448|7150| 4440 | 13451|6192| 4441 | 13456|3372| 4442 | 13457|4662| 4443 | 13460|6619| 4444 | 13461|8372| 4445 | 13465|4994| 4446 | 13467|9744| 4447 | 13470|11194| 4448 | 13471|6126| 4449 | 13472|1290| 4450 | 13474|4834| 4451 | 13479|5894| 4452 | 13481|538| 4453 | 13485|1386| 4454 | 13486|5593| 4455 | 13489|10544| 4456 | 13491|7920| 4457 | 13492|9626| 4458 | 13495|6414| 4459 | 13500|7477| 4460 | 13502|9224| 4461 | 13507|10602| 4462 | 13511|2983| 4463 | 13514|5593| 4464 | 13515|8332| 4465 | 13517|1191| 4466 | 13519|7553| 4467 | 13523|10733| 4468 | 13528|10562| 4469 | 13530|7248| 4470 | 13535|6393| 4471 | 13537|10494| 4472 | 13541|9161| 4473 | 13542|11376| 4474 | 13544|3396| 4475 | 13547|1946| 4476 | 13548|2234| 4477 | 13553|7065| 4478 | 13557|10411| 4479 | 13559|8188| 4480 | 13563|9452| 4481 | 13566|11204| 4482 | 13570|6024| 4483 | 13571|5215| 4484 | 13576|3206| 4485 | 13580|6192| 4486 | 13582|4658| 4487 | 13585|4172| 4488 | 13588|2213| 4489 | 13589|4761| 4490 | 13593|6723| 4491 | 13598|8472| 4492 | 13599|10576| 4493 | 13604|6097| 4494 | 13606|1037| 4495 | 13608|7292| 4496 | 13612|11187| 4497 | 13615|11381| 4498 | 13617|10456| 4499 | 13621|2814| 4500 | 13622|906| 4501 | 13626|1786| 4502 | 13630|8095| 4503 | 13631|10888| 4504 | 13636|7470| 4505 | 13641|3630| 4506 | 13646|8472| 4507 | 13648|5778| 4508 | 13652|5153| 4509 | 13654|396| 4510 | 13656|8948| 4511 | 13661|10025| 4512 | 13665|4572| 4513 | 13669|5999| 4514 | 13670|6431| 4515 | 13672|478| 4516 | 13676|3723| 4517 | 13680|6170| 4518 | 13684|1669| 4519 | 13686|6402| 4520 | 13690|6266| 4521 | 13691|3390| 4522 | 13695|2618| 4523 | 13697|3368| 4524 | 13699|3339| 4525 | 13703|9907| 4526 | 13707|10544| 4527 | 13712|6110| 4528 | 13714|5077| 4529 | 13716|6203| 4530 | 13719|1306| 4531 | 13720|4027| 4532 | 13721|1618| 4533 | 13723|5500| 4534 | 13725|10097| 4535 | 13728|278| 4536 | 13729|3091| 4537 | 13732|10879| 4538 | 13737|1468| 4539 | 13740|3145| 4540 | 13742|3402| 4541 | 13745|7105| 4542 | 13749|5201| 4543 | 13752|113| 4544 | 13756|4298| 4545 | 13758|2118| 4546 | 13762|9347| 4547 | 13764|1669| 4548 | 13766|5387| 4549 | 13771|9477| 4550 | 13774|5944| 4551 | 13778|9334| 4552 | 13783|4981| 4553 | 13785|8552| 4554 | 13790|5938| 4555 | 13794|8075| 4556 | 13798|8061| 4557 | 13800|1691| 4558 | 13805|1589| 4559 | 13810|7532| 4560 | 13812|6668| 4561 | 13814|10838| 4562 | 13816|10131| 4563 | 13817|6774| 4564 | 13821|4435| 4565 | 13824|9946| 4566 | 13826|8004| 4567 | 13831|9690| 4568 | 13834|7554| 4569 | 13839|490| 4570 | 13841|2102| 4571 | 13842|8013| 4572 | 13845|10843| 4573 | 13849|2803| 4574 | 13852|2439| 4575 | 13857|3191| 4576 | 13862|9375| 4577 | 13864|2122| 4578 | 13866|2145| 4579 | 13871|2615| 4580 | 13874|7037| 4581 | 13876|4500| 4582 | 13880|3541| 4583 | 13884|3252| 4584 | 13889|1768| 4585 | 13894|8353| 4586 | 13898|3997| 4587 | 13900|10895| 4588 | 13904|1844| 4589 | 13907|4729| 4590 | 13910|331| 4591 | 13913|2974| 4592 | 13916|7359| 4593 | 13918|2040| 4594 | 13923|7035| 4595 | 13928|4188| 4596 | 13929|5720| 4597 | 13931|10110| 4598 | 13935|1009| 4599 | 13936|7431| 4600 | 13941|5783| 4601 | 13946|3519| 4602 | 13948|10255| 4603 | 13953|7320| 4604 | 13955|8948| 4605 | 13959|11033| 4606 | 13963|10298| 4607 | 13966|9025| 4608 | 13967|7928| 4609 | 13968|6520| 4610 | 13972|7992| 4611 | 13976|6249| 4612 | 13979|3577| 4613 | 13983|6273| 4614 | 13984|11330| 4615 | 13989|3941| 4616 | 13992|5343| 4617 | 13996|4821| 4618 | 13999|4377| 4619 | 14003|11032| 4620 | 14008|4227| 4621 | 14011|7481| 4622 | 14013|5872| 4623 | 14016|8785| 4624 | 14020|2374| 4625 | 14024|2672| 4626 | 14027|4060| 4627 | 14028|3330| 4628 | 14029|10768| 4629 | 14033|3437| 4630 | 14036|3837| 4631 | 14037|5649| 4632 | 14042|11354| 4633 | 14043|10868| 4634 | 14046|5270| 4635 | 14049|10162| 4636 | 14053|363| 4637 | 14058|3757| 4638 | 14062|1626| 4639 | 14067|10400| 4640 | 14068|332| 4641 | 14070|3702| 4642 | 14075|9577| 4643 | 14076|1591| 4644 | --------------------------------------------------------------------------------