Merge pull request #59 from apache/develop

release 2.0.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f161106..436c36e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,7 +64,7 @@
 if(CMAKE_COMPILER_IS_GNUCC)
     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
                     OUTPUT_VARIABLE GCC_VERSION)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc -Wall -Wextra -Wno-strict-prototypes -Wunused-value -Wcast-align -Wunused-variable -Wundef -Wformat-security")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -static-libgcc -Wall -Wextra -Wno-strict-prototypes -Wunused-value -Wcast-align -Wunused-variable -Wundef -Wformat-security")
 
     if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
@@ -114,14 +114,16 @@
 log(BUILD_PYTHON)
 log(BUILD_TESTING) # added by 'include(CTest)'
 
-option(BUILD_MPIN    "Build MPIN"    ON)
-option(BUILD_WCC     "Build WCC"     ON)
-option(BUILD_X509    "BUild X509"    ON)
-option(BUILD_BLS     "Build BLS"    ON)
+option(BUILD_MPIN     "Build MPIN"     ON)
+option(BUILD_WCC      "Build WCC"      ON)
+option(BUILD_X509     "BUild X509"     ON)
+option(BUILD_BLS      "Build BLS"      ON)
+option(BUILD_PAILLIER "Build Paillier" OFF)
 log(BUILD_MPIN)
 log(BUILD_WCC)
 log(BUILD_X509)
 log(BUILD_BLS)
+log(BUILD_PAILLIER)
 
 option(DEBUG_REDUCE "Print debug message for field reduction" OFF)
 option(DEBUG_NORM "Detect digit overflow" OFF)
@@ -295,6 +297,62 @@
 endif()
 
 ##################################################
+# AMCL_PAILLIER Library
+##################################################
+
+if(BUILD_PAILLIER)
+  foreach(level 2048 4096)
+    amcl_rsa_field(BD "${level}")
+    amcl_rsa_field(TFF "${level}")
+
+    amcl_configure_file_rsa(include/config_big.h.in include/config_big_${BD}.h "${level}" amcl_paillier_GEN_HDRS)
+    amcl_configure_file_rsa(include/config_ff.h.in  include/config_ff_${TFF}.h "${level}" amcl_paillier_GEN_HDRS)
+    amcl_configure_file_rsa(include/big.h.in        include/big_${BD}.h        "${level}" amcl_paillier_GEN_HDRS)
+    amcl_configure_file_rsa(include/ff.h.in         include/ff_${TFF}.h        "${level}" amcl_paillier_GEN_HDRS)
+
+    amcl_configure_file_rsa(src/big.c.in src/big_${BD}.c  "${level}" amcl_paillier_GEN_SRCS)
+    amcl_configure_file_rsa(src/ff.c.in  src/ff_${TFF}.c  "${level}" amcl_paillier_GEN_SRCS)
+  endforeach()
+
+  list(APPEND amcl_paillier_GEN_HDRS include/paillier.h)
+  list(APPEND amcl_paillier_GEN_SRCS src/paillier.c)
+
+  message(STATUS "Build libamcl_paillier")
+  add_library(amcl_paillier
+    ${amcl_paillier_GEN_SRCS}
+  )
+  list(APPEND AMCL_LIBRARIES amcl_paillier)
+
+  set_target_properties(amcl_paillier PROPERTIES
+    EXPORT_NAME paillier
+    VERSION ${AMCL_VERSION}
+    SOVERSION ${AMCL_SOVERSION}
+  )
+
+  target_include_directories(amcl_paillier PUBLIC
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/incldue>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+  )
+
+  target_link_libraries(amcl_paillier PUBLIC
+    amcl_core
+  )
+
+  install(TARGETS amcl_paillier
+    EXPORT AMCLTargets
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+  )
+
+  install(FILES
+    ${amcl_paillier_GEN_HDRS}
+    DESTINATION ${INSTALL_INCLUDESUBDIR}
+  )
+endif()
+
+##################################################
 # AMCL_RSA_*** Libraries
 ##################################################
 foreach(level ${AMCL_RSA})
@@ -724,7 +782,7 @@
 
 if(BUILD_PYTHON)
   message(STATUS "Build Python wrappers")
-  add_subdirectory(wrappers/python)
+  add_subdirectory(python)
 endif()
 
 if(BUILD_TESTING)
diff --git a/DISCLAIMER b/DISCLAIMER
index b8271f4..36eb7cb 100644
--- a/DISCLAIMER
+++ b/DISCLAIMER
@@ -1 +1,10 @@
-Apache Milagro is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+Apache Milagro (incubating) is an effort undergoing incubation at the Apache Software
+Foundation (ASF), sponsored by the Apache Incubator PMC.
+
+Incubation is required of all newly accepted projects until a further review
+indicates that the infrastructure, communications, and decision making process
+have stabilized in a manner consistent with other successful ASF projects.
+
+While incubation status is not necessarily a reflection of the completeness
+or stability of the code, it does indicate that the project has yet to be
+fully endorsed by the ASF.
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 878184f..5f4e797 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,32 +1,24 @@
-FROM ubuntu:latest
+FROM ubuntu:bionic
 
-RUN dpkg --add-architecture i386 \
-    && apt-get update && apt-get install -y --no-install-recommends \
-    astyle \
-    ca-certificates \
+RUN dpkg --add-architecture i386
+
+# add repositories cache
+RUN apt-get update -y
+
+# install packages
+RUN apt-get install -y \
+    build-essential \
     cmake \
     doxygen \
-    doxygen-latex \
-    g++ \
-    g++-multilib \
-    gcc \
-    git \
-    lcov \
-    make \
-    mingw-w64 \
     parallel \
-    python-pip \
-    python-setuptools\
-    python3-pip \        
-    python3-setuptools\    
-    wine-stable \
+    mingw-w64 \
     wine64 \
     wine32 \
-    && apt-get clean \
-    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
-    && pip install \
-    autopep8 \
-    cffi \
-    wheel
+    lcov \
+    python3-dev \
+    python3-pip \
+    gcc-multilib
+
+RUN pip3 install cffi autopep8
 
 CMD ["/bin/bash"]
diff --git a/LICENSE b/LICENSE
index 7a4a3ea..a2a21ba 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-
+o
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -187,7 +187,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright [yyyy] [name of copyright owner]
+   Copyright 2019 The Apache Software Foundation
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
diff --git a/Makefile b/Makefile
index 1ae0cb7..0961d95 100644
--- a/Makefile
+++ b/Makefile
@@ -34,9 +34,6 @@
 # <NAME>:<DOUBLECOMMA-SEPARATED_LIST_OF_CMAKE_OPTIONS>
 
 BUILDS_PF64=LINUX_64BIT_BLS381:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
-	LINUX_64BIT_BN254CX:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
-	LINUX_64BIT_BN254:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
-	LINUX_64BIT_FP256BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP256BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
 	LINUX_64BIT_FP512BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP512BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
 	LINUX_64BIT_BLS461:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS461,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
 	LINUX_64BIT_BLS383:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS383,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
@@ -63,13 +60,11 @@
 	LINUX_64BIT_GOLDILOCKS:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=GOLDILOCKS,,-DAMCL_RSA=2048 \
 	LINUX_64BIT_C41417:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 \
 	LINUX_64BIT_SECP256K1:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=SECP256K1,,-DAMCL_RSA=2048 \
-	LINUX_64BIT_C25519_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
-	LINUX_64BIT_NIST256_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
+	LINUX_64BIT_PAILLIER:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=,,-DAMCL_RSA=,,-DBUILD_PAILLIER=ON \
 	WINDOWS_64BIT_BLS381:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw64-cross.cmake \
 	WINDOWS_64BIT_BLS381_STATIC:-DWORD_SIZE=64,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw64-cross.cmake,,-DBUILD_SHARED_LIBS=OFF
 
-BUILDS_PF32=LINUX_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
-	LINUX_32BIT_BN254CX:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl
+BUILDS_PF32=LINUX_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl 
 
 BUILDS_NIST32=LINUX_32BIT_NIST256_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=2048 \
 	LINUX_32BIT_NIST256_RSA4096:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=4096 \
@@ -91,15 +86,9 @@
 	LINUX_32BIT_GOLDILOCKS:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=GOLDILOCKS,,-DAMCL_RSA=2048 \
 	LINUX_32BIT_C41417:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 \
 	LINUX_32BIT_SECP256K1:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=SECP256K1,,-DAMCL_RSA=2048 \
-	LINUX_32BIT_C25519_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
-	LINUX_32BIT_NIST256_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
 	WINDOWS_32BIT_BLS381:-DCMAKE_C_FLAGS=-m32,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048,,-DWORD_SIZE=32,,-DCMAKE_TOOLCHAIN_FILE=../../resources/cmake/mingw32-cross.cmake
 
-BUILDS_PFS16=LINUX_16BIT_BLS381:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048 \
-	LINUX_16BIT_BN254CX:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048
-
-BUILDS_MISC16=LINUX_16BIT_ED25519:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=ED25519,,-DAMCL_RSA=2048 \
-	LINUX_16BIT_NUMS256E:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NUMS256E,,-DAMCL_RSA=2048
+BUILDS_MISC16=LINUX_16BIT_ED25519:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=ED25519,,-DAMCL_RSA=2048
 
 BUILDS_ASAN=LINUX_64BIT_BLS381_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=BLS381,,-DAMCL_RSA=2048 \
 	LINUX_64BIT_NIST256_RSA2048_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=NIST256,,-DAMCL_RSA=2048 \
@@ -107,14 +96,25 @@
 	LINUX_64BIT_NIST521_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=NIST521,,-DAMCL_RSA=2048 \
 	LINUX_64BIT_C25519_RSA2048_MONTGOMERY_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C25519,,-DAMCL_RSA=2048 \
 	LINUX_64BIT_C25519_RSA2048_EDWARDS_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C25519,,-DAMCL_RSA=2048 \
-	LINUX_64BIT_C41417_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 
+	LINUX_64BIT_C41417_ASan:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=ASan,,-DAMCL_CURVE=C41417,,-DAMCL_RSA=2048 \
+	LINUX_64BIT_PAILLIER_ASan:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=,,-DAMCL_RSA=,,-DBUILD_PAILLIER=ON
 
-BUILDS_COVERAGE=LINUX_64BIT_COVERAGE:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=Coverage,,-DAMCL_CURVE=NIST256,BLS381,,-DAMCL_RSA=2048
+BUILDS_BN256=LINUX_64BIT_BN254CX:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,${WRAPPYTHON} \
+	LINUX_64BIT_BN254:-DWORD_SIZE=64,,-DAMCL_CURVE=BN254,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
+	LINUX_64BIT_FP256BN:-DWORD_SIZE=64,,-DAMCL_CURVE=FP256BN,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
+	LINUX_64BIT_C25519_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
+	LINUX_64BIT_NIST256_BN254CX_RSA2048:-DWORD_SIZE=64,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
+	LINUX_32BIT_BN254CX:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048,,-DCMAKE_INSTALL_PREFIX=/opt/amcl \
+	LINUX_32BIT_C25519_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=C25519,BN254CX,,-DAMCL_RSA=2048 \
+	LINUX_32BIT_NIST256_BN254CX_RSA2048:-DCMAKE_C_FLAGS=-m32,,-DWORD_SIZE=32,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=NIST256,BN254CX,,-DAMCL_RSA=2048 \
+	LINUX_16BIT_BN254CX:-DWORD_SIZE=16,,-DCMAKE_INSTALL_PREFIX=/opt/amcl,,-DAMCL_CURVE=BN254CX,,-DAMCL_RSA=2048 \
+
+BUILDS_COVERAGE=LINUX_64BIT_COVERAGE:-DWORD_SIZE=64,,-DCMAKE_BUILD_TYPE=Coverage,,-DAMCL_CURVE=NIST256,BLS381,,-DAMCL_RSA=2048,,-DBUILD_PAILLIER=ON
 
 # Merge all build types in a single list
 BUILDS_64=$(BUILDS_PF64) $(BUILDS_NIST64) $(BUILDS_MISC64)
 BUILDS_32=$(BUILDS_PF32) $(BUILDS_NIST32) $(BUILDS_MISC32)
-BUILDS_16=$(BUILDS_BN16) $(BUILDS_MISC16)
+BUILDS_16=$(BUILDS_MISC16)
 
 BUILDS=$(BUILDS_64) $(BUILDS_32) $(BUILDS_16) $(BUILDS_ASAN) $(BUILDS_COVERAGE)
 
@@ -187,6 +187,7 @@
 	-DBUILD_MPIN=$(AMCL_BUILD_MPIN) \
 	-DBUILD_WCC=$(AMCL_BUILD_WCC) \
 	-DBUILD_BLS=$(AMCL_BUILD_BLS) \
+	-DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \
 	-DBUILD_DOCS=$(AMCL_BUILD_DOCS) \
 	-DAMCL_MAXPIN=$(AMCL_MAXPIN) \
 	-DAMCL_PBLEN=$(AMCL_PBLEN) \
@@ -215,6 +216,8 @@
 	-DAMCL_RSA=$(AMCL_RSA) \
 	-DBUILD_MPIN=$(AMCL_BUILD_MPIN) \
 	-DBUILD_WCC=$(AMCL_BUILD_WCC) \
+	-DBUILD_BLS=$(AMCL_BUILD_BLS) \
+	-DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \
 	-DBUILD_DOCS=$(AMCL_BUILD_DOCS) \
 	-DAMCL_MAXPIN=$(AMCL_MAXPIN) \
 	-DAMCL_PBLEN=$(AMCL_PBLEN) \
@@ -245,7 +248,7 @@
 	astyle --style=allman --recursive --suffix=none 'examples/*.c'
 	astyle --style=allman --recursive --suffix=none 'examples/*.c.in'
 	astyle --style=allman --recursive --suffix=none 'benchmark/*.c.in'
-	autopep8 --in-place --aggressive --aggressive ./wrappers/python/*.py.in
+	autopep8 --in-place --aggressive --aggressive ./python/*.py.in
 
 # Remove any build artifact
 clean:
@@ -322,6 +325,8 @@
 	-DAMCL_RSA=$(AMCL_RSA) \
 	-DBUILD_MPIN=$(AMCL_BUILD_MPIN) \
 	-DBUILD_WCC=$(AMCL_BUILD_WCC) \
+	-DBUILD_BLS=$(AMCL_BUILD_BLS) \
+	-DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \
 	-DBUILD_DOXYGEN=$(AMCL_BUILD_DOXYGEN) \
 	-DAMCL_MAXPIN=$(AMCL_MAXPIN) \
 	-DAMCL_PBLEN=$(AMCL_PBLEN) \
diff --git a/README.md b/README.md
index 555f3bd..f981998 100644
--- a/README.md
+++ b/README.md
@@ -53,19 +53,53 @@
 
 The above packages can be installed in different ways, depending on the Operating System used:
 
-* **Debian/Ubuntu Linux**
-
-
-    sudo apt-get install -y git cmake build-essential python python-dev python-pip libffi-dev doxygen doxygen-latex parallel
-    sudo pip install cffi
-
-
-* **RedHat/CentOS/Fedora Linux**
+* **Ubuntu 18.04 Linux**
 
 ```
-sudo yum groupinstall "Development Tools" "Development Libraries"
-sudo yum install -y git cmake python libpython-devel python-pip libffi-devel doxygen doxygen-latex parallel
-sudo pip install cffi
+sudo dpkg --add-architecture i386
+
+echo "add repositories cache"
+sudo apt-get update -y
+
+echo "install packages"
+sudo apt-get install -y \
+     build-essential \
+     cmake \
+     doxygen \
+     parallel \
+     mingw-w64 \
+     wine64 \
+     wine32 \
+     lcov \
+     python3-dev \
+     python3-pip \
+     gcc-multilib \
+     git \
+     rpm \
+     checkinstall
+
+sudo pip3 install cffi autopep8
+```
+
+* **Fedora 30 Linux**
+
+```
+sudo dnf config-manager --add-repo https://dl.winehq.org/wine-builds/fedora/30/winehq.repo
+sudo dnf install -y @development-tools \
+    cmake \
+    libffi-devel \
+    libasan \
+    parallel \
+    mingw64-gcc \
+    mingw32-gcc \
+    lcov \
+    winehq-stable \
+    libstdc++-*.i686 \
+    glibc-*.i686 \
+    libgcc.i686
+
+sudo pip3 install cffi autopep8
+sudo yum install rpm-build
 ```
 
 * **MacOS**
@@ -82,10 +116,10 @@
 * **Windows**
 
 * install [MinGW](http://www.mingw.org) Please select the **mingw32-base** and **mingw32-gcc-g++** components. Add *C:\MinGW\bin* to the PATH variable
-* install [Python](https://www.python.org/downloads/windows/). Add *C:\Python27 to the PATH variable
-* install [CMake](http://www.cmake.org)
+* install [Python](https://www.python.org/downloads/windows/). Either Python 2.7.x or 3.8.x may be used.  During the installation, ensure that the option to add Python to the Windows PATH variable is selected.
+* install [CMake](http://www.cmake.org). During installation, ensure that the option to add the CMake executable to the Windows PATH variable is selected.
 * install [Doxygen](http://www.doxygen.org)
-
+* install [Git](https://git-scm.com/)
 
 ## Build Instructions
 
@@ -93,6 +127,15 @@
 
 ##### Quick start
 
+Either clone the repository using Git:
+
+```
+git clone https://github.com/apache/incubator-milagro-crypto-c.git
+cd incubator-milagro-crypto-c
+```
+
+Or, if using an official Apache release, download the compressed archive, extract it and navigate into its root directory.
+
 A Makefile is present at the project root that reads the options defined in
 config.mk. Change these options and then type the following to build and test
 the library.
@@ -114,11 +157,14 @@
 
 ##### Manual build
 
-NOTE: The default build is for 64 bit machines
+NOTE: The default build is for 64 bit machines.  Either use Git to clone the repository:
 
 ```
-git clone https://github.com/milagro-crypto/milagro-crypto-c
-cd milagro-crypto-c
+git clone https://github.com/apache/incubator-milagro-crypto-c.git
+cd incubator-milagro-crypto-c
+```
+Or, if using an official Apache release, download the compressed archive, extract it and navigate into its root directory.
+```
 mkdir -p target/build
 cd target/build
 cmake ../..
@@ -168,19 +214,22 @@
 After having built the libraries you can build a binary installer and a source distribution by running this command
 
 ```
-make package
+sudo make package
 ```
 
 #### Windows
 
-Start a command prompt as an administrator
+Start a command prompt as an administrator and either use Git to clone the repository
 
 ```
-git clone https://github.com/milagro-crypto/milagro-crypto-c
-cd milagro-crypto-c
-mkdir target\build
-cd target\build
-cmake -G "MinGW Makefiles" -D WORD_SIZE=64 ..\..
+git clone https://github.com/apache/incubator-milagro-crypto-c.git
+cd incubator-milagro-crypto-c
+```
+Or, if using an official Apache release, download the compressed archive, extract it and navigate into its root directory.
+```
+mkdir build
+cd build
+cmake -G "MinGW Makefiles" -D WORD_SIZE=64 ..
 mingw32-make
 mingw32-make test
 mingw32-make doc
@@ -189,7 +238,7 @@
 
 Post install append the PATH system variable to point to the install ./lib:
 
-*My Computer -> Properties -> Advanced > Environment Variables*
+*Control Panel - System and Security - System - Advanced System Settings - Environment Variables*
 
 The build can be configured using by setting flags on the command line i.e.
 
@@ -208,7 +257,7 @@
 After having built the libraries you can build a Windows installer using this command
 
 ```
-sudo mingw32-make package
+mingw32-make package
 ```
 
 In order for this to work [NSIS](https://nsis.sourceforge.io) has to have been installed
diff --git a/VERSION b/VERSION
index 3eefcb9..227cea2 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.0
+2.0.0
diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt
index b1e7c37..af05ab7 100644
--- a/benchmark/CMakeLists.txt
+++ b/benchmark/CMakeLists.txt
@@ -50,3 +50,9 @@
   add_executable(benchtest_rsa_${TFF} ${benchtest_rsa_${TFF}_GEN_SRCS})
   target_link_libraries(benchtest_rsa_${TFF} PRIVATE amcl_rsa_${TFF})
 endforeach()
+
+if(${BUILD_PAILLIER})
+  amcl_configure_file_core(benchtest_paillier.c.in benchtest_paillier.c benchtest_paillier_GEN_SRCS)
+  add_executable(benchtest_paillier ${benchtest_paillier_GEN_SRCS})
+  target_link_libraries(benchtest_paillier PRIVATE amcl_paillier)
+endif()
diff --git a/benchmark/benchtest_paillier.c.in b/benchmark/benchtest_paillier.c.in
new file mode 100644
index 0000000..a3c4a24
--- /dev/null
+++ b/benchmark/benchtest_paillier.c.in
@@ -0,0 +1,313 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/*
+   Benchmark Paillier crypto system.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "randapi.h"
+#include "paillier.h"
+#include "amcl.h"
+#include "arch.h"
+
+#define MIN_TIME 5.0
+#define MIN_ITERS 10
+#define NTHREADS 2
+
+// https://sourceforge.net/p/predef/wiki/Compilers/
+static void print_compiler_info()
+{
+#if defined(__clang__)
+    printf("Compiler:\t\tclang (%s)\n", __clang_version__);
+#elif defined(__GNUC_PATCHLEVEL__)
+    printf("Compiler:\t\tgcc (%d.%d.%d)\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
+#elif defined(__GNUC_MINOR__)
+    printf("Compiler:\t\tgcc (%d.%d)\n", __GNUC__, __GNUC_MINOR__);
+#elif defined(__INTEL_COMPILER)
+    printf("Compiler:\t\tIntel C/C++ (%d)\n", __INTEL_COMPILER);
+#elif defined(_MSC_FULL_VER)
+    printf("Compiler:\tMicrosoft C/C++ (%d)\n", _MSC_FULL_VER);
+#elif defined(__CC_ARM)
+    printf("Compiler:\t\tARM C/C++ (%d)\n", __ARMCC_VERSION);
+#else
+    printf("Compiler:\t\tUnknown"\n);
+#endif
+}
+
+#if defined(__ANDROID__)
+#include <android/api-level.h>
+#endif
+
+// https://sourceforge.net/p/predef/wiki/Architectures/
+// https://sourceforge.net/p/predef/wiki/OperatingSystems/
+static void print_platform_info()
+{
+#if defined(__linux__)
+    printf("Target platform:\tLinux ");
+    
+#if defined(__x86_64__)
+    printf("(64-bit)\n");
+#else
+    printf("(32-bit)\n");
+#endif
+
+#if defined(__ANDROID__)
+    printf("Target platform:\tAndroid %d\n", __ANDROID_API__);
+#endif
+
+#elif defined(_WIN64)
+    printf("Target platform:\tWindows (64-bit)\n");
+#elif defined(_WIN32)
+    printf("Target platform:\tWindows (32-bit)\n");
+#elif defined(__APPLE__)
+    printf("Target platform:\tMac OS\n");
+#else
+    printf("Target platform:\tUnknown\n");
+#endif
+}
+
+
+static void print_paillier_configuration()
+{
+    printf("Project Version:\t@BUILD_VERSION@\n");    
+    printf("CFLAGS:\t\t\t@CMAKE_C_FLAGS@\n");
+    printf("Build type:\t\t@CMAKE_BUILD_TYPE@\n");    
+    printf("AMCL Version:\t\t@AMCL_VERSION_MAJOR@.@AMCL_VERSION_MINOR@.@AMCL_VERSION_PATCH@\n");
+    printf("AMCL Detected OS:\t@OS@\n");
+    printf("AMCL CHUNK:\t\t%d\n", CHUNK);
+}
+
+static void print_system_info()
+{
+    printf("Configuration info\n");
+    printf("==================\n");
+    print_platform_info();
+    print_compiler_info();
+    print_paillier_configuration();
+    printf("\n");
+}
+
+
+int paillier(csprng *RNG)
+{
+    int iterations;
+    clock_t start;
+    double elapsed;
+
+    // Key material
+    PAILLIER_private_key PRIV;
+    PAILLIER_public_key PUB;
+
+    // Plaintext to encrypt
+    char ptin[NTHREADS][FS_2048];
+    octet PTIN[NTHREADS];
+    char ptout[NTHREADS][FS_2048];
+    octet PTOUT[NTHREADS];
+
+    // Constant value for multiplication
+    char ptko[NTHREADS][FS_2048];
+    octet PTK[NTHREADS];
+
+    // Encrypted PTIN values
+    char cto[NTHREADS][FS_4096];
+    octet CT[NTHREADS];
+
+    // Homomorphic multiplicaton of plaintext by a constant ciphertext
+    char cta[NTHREADS][FS_4096];
+    octet CTA[NTHREADS];
+
+    // Homomorphic addition of ciphertext
+    char cto3[FS_4096] = {0};
+    octet CT3 = {0,sizeof(cto3),cto3};
+
+    // Output plaintext of addition of homomorphic multiplication values
+    char pto3[FS_2048] = {0};
+    octet PT3 = {sizeof(pto3),sizeof(pto3),pto3};
+
+    // Expected ouput is 26 / 0x1a i.e. 2*3 + 4*5
+    int values[NTHREADS] = {2,4};
+    int kvalues[NTHREADS] = {3,5};
+
+    print_system_info();
+
+    // Initialize octets
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PTIN[i].max = FS_2048;
+        PTIN[i].val = ptin[i];
+        OCT_clear(&PTIN[i]);
+
+        PTOUT[i].max = FS_2048;
+        PTOUT[i].val = ptout[i];
+        OCT_clear(&PTOUT[i]);
+
+        PTK[i].max = FS_2048;
+        PTK[i].val = ptko[i];
+        OCT_clear(&PTIN[i]);
+
+        CT[i].max = FS_4096;
+        CT[i].val = cto[i];
+        OCT_clear(&PTIN[i]);
+
+        CTA[i].max = FS_4096;
+        CTA[i].val = cta[i];
+        OCT_clear(&PTIN[i]);
+    }
+
+    printf("Timing info\n");
+    printf("===========\n");
+    
+    // Generating public/private key pair
+    iterations=0;
+    start=clock();
+    do
+    {
+        PAILLIER_KEY_PAIR(RNG, NULL, NULL,&PUB, &PRIV);
+        iterations++;
+        elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
+    }
+    while (elapsed<MIN_TIME || iterations<MIN_ITERS);
+    elapsed=1000.0*elapsed/iterations;
+    printf("PAILLIER_KEY_PAIR\t%8d iterations\t",iterations);
+    printf("%8.2lf ms per iteration\n",elapsed);
+
+    // Set plaintext values
+    for(int i=0; i<NTHREADS; i++)
+    {
+        BIG_1024_58 pt[FFLEN_2048];
+        FF_2048_init(pt, values[i],FFLEN_2048);
+        FF_2048_toOctet(&PTIN[i], pt, FFLEN_2048);
+
+        BIG_1024_58 ptk[FFLEN_2048];
+        FF_2048_init(ptk, kvalues[i],FFLEN_2048);
+        FF_2048_toOctet(&PTK[i], ptk, FFLEN_2048);
+    }
+
+    // Encrypt plaintext
+    iterations=0;
+    start=clock();
+    do
+    {
+        PAILLIER_ENCRYPT(RNG, &PUB, &PTIN[0], &CT[0], NULL);
+        iterations++;
+        elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
+    }
+    while (elapsed<MIN_TIME || iterations<MIN_ITERS);
+    elapsed=1000.0*elapsed/iterations;
+    printf("PAILLIER_ENCRYPT\t%8d iterations\t",iterations);
+    printf("%8.2lf ms per iteration\n",elapsed);
+
+    PAILLIER_ENCRYPT(RNG, &PUB, &PTIN[1], &CT[1], NULL);
+
+    // Multiple by constant
+    iterations=0;
+    start=clock();
+    do
+    {
+        PAILLIER_MULT(&PUB, &CT[0], &PTK[0], &CTA[0]);
+        iterations++;
+        elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
+    }
+    while (elapsed<MIN_TIME || iterations<MIN_ITERS);
+    elapsed=1000.0*elapsed/iterations;
+    printf("PAILLIER_MULT\t\t%8d iterations\t",iterations);
+    printf("%8.2lf ms per iteration\n",elapsed);
+
+    PAILLIER_MULT(&PUB, &CT[1], &PTK[1], &CTA[1]);
+
+    // Homomorphic addition
+    iterations=0;
+    start=clock();
+    do
+    {
+        PAILLIER_ADD(&PUB, &CTA[0], &CTA[1], &CT3);
+        iterations++;
+        elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
+    }
+    while (elapsed<MIN_TIME || iterations<MIN_ITERS);
+    elapsed=1000.0*elapsed/iterations;
+    printf("PAILLIER_ADD\t\t%8d iterations\t",iterations);
+    printf("%8.2lf ms per iteration\n",elapsed);
+
+    // Homomorphic addition
+    iterations=0;
+    start=clock();
+    do
+    {
+        PAILLIER_DECRYPT(&PRIV, &CT3, &PT3);
+        iterations++;
+        elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
+    }
+    while (elapsed<MIN_TIME || iterations<MIN_ITERS);
+    elapsed=1000.0*elapsed/iterations;
+    printf("PAILLIER_DECRYPT\t%8d iterations\t",iterations);
+    printf("%8.2lf ms per iteration\n\n",elapsed);
+
+    printf("Size info\n");
+    printf("=========\n");
+    
+    printf("public key n\t%d bytes\n",  FS_2048);
+    printf("public key g\t%d bytes\n",  FS_2048);
+    printf("secret key lp\t%d bytes\n", HFS_2048);
+    printf("secret key lq\t%d bytes\n", HFS_2048);
+    printf("secret key mp\t%d bytes\n", HFS_2048);
+    printf("secret key mq\t%d bytes\n", HFS_2048);
+    printf("ciphertext\t%d bytes\n", FS_4096);
+
+#ifdef DEBUG
+    printf("PT3: ");
+    OCT_output(&PT3);
+    printf("\n");
+#endif
+
+    // Clean sensitive memory
+    PAILLIER_PRIVATE_KEY_KILL(&PRIV);
+
+    OCT_clear(&PT3);
+    for(int i=0; i<NTHREADS; i++)
+    {
+        OCT_clear(&PTIN[i]);
+        OCT_clear(&PTOUT[i]);
+    }
+    return 0;
+}
+
+int main()
+{
+    char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
+    char seed[16] = {0};
+    octet SEED = {sizeof(seed),sizeof(seed),seed};
+
+    // CSPRNG
+    csprng RNG;
+
+    // fake random source
+    OCT_fromHex(&SEED,seedHex);
+
+    // initialise strong RNG
+    CREATE_CSPRNG(&RNG,&SEED);
+
+    paillier(&RNG);
+
+    KILL_CSPRNG(&RNG);
+}
diff --git a/cmake/PythonSiteDirs.cmake b/cmake/PythonSiteDirs.cmake
index bf0f968..cc6bbe7 100644
--- a/cmake/PythonSiteDirs.cmake
+++ b/cmake/PythonSiteDirs.cmake
@@ -18,17 +18,6 @@
 cmake_minimum_required(VERSION 3.1)
 
 execute_process(COMMAND
-  python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
-  OUTPUT_VARIABLE PYTHON_SITE_PACKAGES
-  OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-execute_process(COMMAND
-  python -c "from distutils.sysconfig import get_python_lib; from os.path import dirname; print dirname(get_python_lib())"
-  OUTPUT_VARIABLE PYTHON_SITE_LIB
-)
-
-execute_process(COMMAND
   python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
   OUTPUT_VARIABLE PYTHON3_SITE_PACKAGES
   OUTPUT_STRIP_TRAILING_WHITESPACE
diff --git a/config.mk b/config.mk
index 6191947..9e49152 100644
--- a/config.mk
+++ b/config.mk
@@ -7,7 +7,7 @@
 AMCL_CURVE:=ED25519,NIST256,GOLDILOCKS,BLS381
 
 # RSA security level: 2048 3072 4096
-AMCL_RSA:=2048,3072
+AMCL_RSA:=2048,4096
 
 # Build type Debug Release Coverage ASan Check CheckFull
 CMAKE_BUILD_TYPE:=Release
@@ -33,6 +33,9 @@
 # Build BLS ON/OFF
 AMCL_BUILD_BLS:=ON
 
+# Build Paillier ON/OFF
+AMCL_BUILD_PAILLIER:=ON
+
 # Build Doxygen ON/OFF
 AMCL_BUILD_DOCS:=ON
 
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 34d6c34..7c5445a 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -1,110 +1,137 @@
-# Doxyfile 1.8.1.1
+# Doxyfile 1.8.17
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored.
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ").
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
 # text before the first occurrence of this tag. Doxygen uses libiconv (or the
 # iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
 
-# The PROJECT_NAME tag is a single word (or sequence of words) that should
-# identify the project. Note that if you do not use Doxywizard you need
-# to put quotes around the project name if it contains spaces.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
 PROJECT_NAME           = "AMCL"
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
 
 PROJECT_NUMBER         =
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer
-# a quick idea about the purpose of the project. Keep the description short.
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
 
 PROJECT_BRIEF          =
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is
-# included in the documentation. The maximum height of the logo should not
-# exceed 55 pixels and the maximum width should not exceed 200 pixels.
-# Doxygen will copy the logo to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
 PROJECT_LOGO           =
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       =
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
 # The OUTPUT_LANGUAGE tag is used to specify the language in which all
 # documentation generated by doxygen is written. Doxygen will use this
 # information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION  = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = NO
 
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
-ABBREVIATE_BRIEF       =
+ABBREVIATE_BRIEF       = 
 
 # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
@@ -112,237 +139,309 @@
 # inherited members of a class in the documentation of that class as if those
 # members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
 FULL_PATH_NAMES        = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
-STRIP_FROM_PATH        = 
+STRIP_FROM_PATH        =
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
 STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful if your file system
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = NO
 
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
 
 QT_AUTOBRIEF           = NO
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
-TAB_SIZE               = 8
+TAB_SIZE               = 4
 
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+# When you need a literal { or } or , in the value part of an alias you have to
+# escape them by means of a backslash (\), this can lead to conflicts with the
+# commands \{ and \} for these it is advised to use the version @{ and @} or use
+# a double escape (\\{ and \\})
 
 ALIASES                =
 
 # This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding
-# "class=itcl::class" will allow you to use the command class in the
-# itcl::class meaning.
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
 TCL_SUBST              =
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = YES
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
 # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
 
 OPTIMIZE_FOR_FORTRAN   = NO
 
 # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
 # Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given extension.
-# Doxygen has a built-in mapping, but you can override or extend it using this
-# tag. The format is ext=language, where ext is a file extension, and language
-# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
-# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
-# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is
+# Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
 
 EXTENSION_MAPPING      =
 
-# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
-# comments according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you
-# can mix doxygen, HTML, and XML commands with Markdown formatting.
-# Disable only in case of backward compatibilities issues.
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
 
 MARKDOWN_SUPPORT       = YES
 
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
 # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also makes the inheritance and collaboration
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
 # diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = NO
 
 # If you use Microsoft's C++/CLI language, you should set this option to YES to
 # enable parsing support.
+# The default value is: NO.
 
 CPP_CLI_SUPPORT        = NO
 
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
 
 SIP_SUPPORT            = NO
 
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
 
 IDL_PROPERTY_SUPPORT   = YES
 
 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
+# tag is set to YES then doxygen will reuse the documentation of the first
 # member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
+# The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
-# unions are shown inside the group in which they are included (e.g. using
-# @ingroup) instead of on a separate page (for HTML and Man pages) or
-# section (for LaTeX and RTF).
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
 
 INLINE_GROUPED_CLASSES = NO
 
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
-# unions with only public data fields will be shown inline in the documentation
-# of the scope in which they are defined (i.e. file, namespace, or group
-# documentation), provided this scope is documented. If set to NO (the default),
-# structs, classes, and unions are shown on a separate page (for HTML and Man
-# pages) or section (for LaTeX and RTF).
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
 
 INLINE_SIMPLE_STRUCTS  = NO
 
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
 # typedef struct TypeS {} TypeT, will appear in the documentation as a struct
 # with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
 # types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
 
 TYPEDEF_HIDES_STRUCT   = NO
 
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penalty.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will roughly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-# SYMBOL_CACHE_SIZE      = 0
-
-# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
-# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
-# their name and scope. Since this can be an expensive process and often the
-# same symbol appear multiple times in the code, doxygen keeps a cache of
-# pre-resolved symbols. If the cache is too small doxygen will become slower.
-# If the cache is too large, memory is wasted. The cache size is given by this
-# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols.
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
 
 LOOKUP_CACHE_SIZE      = 0
 
@@ -350,310 +449,375 @@
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = NO
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = NO
 
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation.
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PACKAGE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = NO
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
 # If this flag is set to YES, the members of anonymous namespaces will be
 # extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespaces are hidden.
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
 
 EXTRACT_ANON_NSPACES   = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
 # allowed. This is useful if you have classes or files whose names only differ
 # in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
+# (including Cygwin) ands Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
-# will list include files with double quotes in the documentation
-# rather than with sharp brackets.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
 
 FORCE_LOCAL_INCLUDES   = NO
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
-# will sort the (brief and detailed) documentation of class members so that
-# constructors and destructors are listed first. If set to NO (the default)
-# the constructors will appear in the respective orders defined by
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
 
 SORT_MEMBERS_CTORS_1ST = NO
 
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
 
 SORT_GROUP_NAMES       = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
-# do proper type resolution of all parameters of a function it will reject a
-# match between the prototype and the implementation of a member function even
-# if there is only one candidate or it is obvious which candidate to choose
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
-# will still accept a match between prototype and implementation in such cases.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
 ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or macro consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and macros in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
 # list will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
 
 SHOW_FILES             = YES
 
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.
-# This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
 
 SHOW_NAMESPACES        = YES
 
 # The FILE_VERSION_FILTER tag can be used to specify a program or script that
 # doxygen should invoke to get the current version for each file (typically from
 # the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
 
 FILE_VERSION_FILTER    =
 
 # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
 # by doxygen. The layout file controls the global structure of the generated
 # output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option.
-# You can optionally specify a file name after the option, if omitted
-# DoxygenLayout.xml will be used as the name of the layout file.
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
 
 LAYOUT_FILE            =
 
-# The CITE_BIB_FILES tag can be used to specify one or more bib files
-# containing the references data. This must be a list of .bib files. The
-# .bib extension is automatically appended if omitted. Using this command
-# requires the bibtex tool to be installed. See also
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
-# feature you need bibtex and perl available in the search path.
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         =
 
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
 QUIET                  = NO
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
+# The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
 WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
 
 INPUT                  =  @CMAKE_CURRENT_SOURCE_DIR@/../include \
                           @CMAKE_CURRENT_BINARY_DIR@/../include \
@@ -662,48 +826,106 @@
                           @CMAKE_CURRENT_SOURCE_DIR@/AMCL.dox
 
 # This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
 # If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
-# *.f90 *.f *.for *.vhd *.vhdl
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
+# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
+# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
 
-FILE_PATTERNS          =
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.doc \
+                         *.txt \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf \
+                         *.ice
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = NO
 
 # The EXCLUDE tag can be used to specify files and/or directories that should be
 # excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
 # Note that relative paths are relative to the directory from which doxygen is
 # run.
 
-EXCLUDE                = 
+EXCLUDE                =
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 # directories that are symbolic links (a Unix file system feature) are excluded
 # from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
 # If the value of the INPUT tag contains directories, you can use the
 # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
 EXCLUDE_PATTERNS       =
 
@@ -712,755 +934,1170 @@
 # output. The symbol name can be a fully qualified name, a word, or if the
 # wildcard * is used, a substring. Examples: ANamespace, AClass,
 # AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
 EXCLUDE_SYMBOLS        =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
 EXAMPLE_PATH           =
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
 
-EXAMPLE_PATTERNS       =
+EXAMPLE_PATTERNS       = *
 
 # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
-IMAGE_PATH             = @CMAKE_CURRENT_BINARY_DIR@/
+IMAGE_PATH             =
 
 # The INPUT_FILTER tag can be used to specify a program that doxygen should
 # invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-# If FILTER_PATTERNS is specified, this tag will be
-# ignored.
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 INPUT_FILTER           =
 
 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.
-# Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.
-# The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty or if
-# non of the patterns match the file name, INPUT_FILTER is applied.
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 FILTER_PATTERNS        =
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
 FILTER_SOURCE_FILES    = NO
 
 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
-# and it is also possible to disable source filtering for a specific pattern
-# using *.ext= (so without naming a filter). This option only has effect when
-# FILTER_SOURCE_FILES is enabled.
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
 
 FILTER_SOURCE_PATTERNS =
 
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = NO
 
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C, C++ and Fortran comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = NO
 
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = NO
 
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.
-# Otherwise they will link to the documentation.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
 
 REFERENCES_LINK_SOURCE = YES
 
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = YES
 
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = YES
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header. Note that when using a custom header you are responsible
-#  for the proper inclusion of any scripts and style sheets that doxygen
-# needs, which is dependent on the configuration options used.
-# It is advised to generate a default header using "doxygen -w html
-# header.html footer.html stylesheet.css YourConfigFile" and then modify
-# that header. Note that the header is subject to change so you typically
-# have to redo this when upgrading to a newer version of doxygen or when
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_HEADER            =
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FOOTER            =
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# style sheet in the HTML output directory as well, or it will be erased!
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_STYLESHEET        =
 
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
 # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the HTML output directory. Note
 # that these files will be copied to the base HTML output directory. Use the
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that
-# the files will be copied as-is; there are no commands or markers available.
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_FILES       =
 
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
-# Doxygen will adjust the colors in the style sheet and background images
-# according to this color. Hue is specified as an angle on a colorwheel,
-# see http://en.wikipedia.org/wiki/Hue for more information.
-# For instance the value 0 represents red, 60 is yellow, 120 is green,
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-# The allowed range is 0 to 359.
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_HUE    = 220
 
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
-# the colors in the HTML output. For a value of 0 the output will use
-# grayscales only. A value of 255 will produce the most vivid colors.
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_SAT    = 100
 
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
-# the luminance component of the colors in the HTML output. Values below
-# 100 gradually make the output lighter, whereas values above 100 make
-# the output darker. The value divided by 100 is the actual gamma applied,
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
-# and 100 does not change the gamma.
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_GAMMA  = 80
 
 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting
-# this to NO can help when comparing the output of multiple runs.
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = NO
 
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via Javascript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have Javascript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 # documentation will contain sections that can be hidden and shown after the
 # page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_DYNAMIC_SECTIONS  = NO
 
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
-# entries shown in the various tree structured indices initially; the user
-# can expand and collapse entries dynamically later on. Doxygen will expand
-# the tree to such a level that at most the specified number of entries are
-# visible (unless a fully collapsed tree already exceeds this amount).
-# So setting the number of entries 1 will produce a full collapsed tree by
-# default. 0 is a special value representing an infinite number of entries
-# and will result in a full expanded tree by default.
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_INDEX_NUM_ENTRIES = 100
 
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/xcode/), introduced with OSX
+# 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_DOCSET        = NO
 
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_BUNDLE_ID       = org.doxygen.Project
 
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
 # the documentation publisher. This should be a reverse domain-name style
 # string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
 
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_NAME  = Publisher
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_HTMLHELP      = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
 # written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_FILE               =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_INDEX_ENCODING     =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 BINARY_TOC             = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 TOC_EXPAND             = NO
 
 # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
-# that can be used as input for Qt's qhelpgenerator to generate a
-# Qt Compressed Help (.qch) of the generated HTML documentation.
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_QHP           = NO
 
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QCH_FILE               =
 
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_NAMESPACE          = org.doxygen.Project
 
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_VIRTUAL_FOLDER     = doc
 
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
-# add. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   =
 
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
-# Qt Help Project / Custom Filters</a>.
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  =
 
 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's
-# filter section matches.
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
-# Qt Help Project / Filter Attributes</a>.
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_SECT_FILTER_ATTRS  =
 
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file.
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           =
 
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
-#  will be generated, which together with the HTML files, form an Eclipse help
-# plugin. To install this plugin and make it available under the help contents
-# menu in Eclipse, the contents of the directory containing the HTML and XML
-# files needs to be copied into the plugins directory of eclipse. The name of
-# the directory within the plugins directory should be the same as
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
-# the help appears.
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_ECLIPSEHELP   = NO
 
-# A unique identifier for the eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have
-# this name.
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
 
 ECLIPSE_DOC_ID         = org.doxygen.Project
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
-# at top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it. Since the tabs have the same information as the
-# navigation tree you can set this option to NO if you already set
-# GENERATE_TREEVIEW to YES.
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 DISABLE_INDEX          = NO
 
 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to YES, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
-# Windows users are probably better off using the HTML help feature.
-# Since the tree basically has the same information as the tab index you
-# could consider to set DISABLE_INDEX to NO when enabling this option.
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_TREEVIEW      = NO
 
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML
-# documentation. Note that a value of 0 will completely suppress the enum
-# values from appearing in the overview section.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 ENUM_VALUES_PER_LINE   = 4
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
-# links to external symbols imported via tag files in a separate window.
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 EXT_LINKS_IN_WINDOW    = NO
 
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are
-# not supported properly for IE 6.0, but are supported on all modern browsers.
-# Note that when changing this option you need to delete any form_*.png files
-# in the HTML output before the changes have effect.
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_TRANSPARENT    = YES
 
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
-# (see http://www.mathjax.org) which uses client side Javascript for the
-# rendering instead of using prerendered bitmaps. Use this if you do not
-# have LaTeX installed or if you want to formulas look prettier in the HTML
-# output. When enabled you may also need to install MathJax separately and
-# configure the path to it using the MATHJAX_RELPATH option.
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
-USE_MATHJAX            = NO
+USE_MATHJAX            = YES
 
-# When MathJax is enabled you need to specify the location relative to the
-# HTML output directory using the MATHJAX_RELPATH option. The destination
-# directory should contain the MathJax.js script. For instance, if the mathjax
-# directory is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to
-# the MathJax Content Delivery Network so you can quickly see the result without
-# installing MathJax.
-# However, it is strongly recommended to install a local
-# copy of MathJax from http://www.mathjax.org before deployment.
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_FORMAT         = HTML-CSS
 
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
-# names that should be enabled during MathJax rendering.
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_EXTENSIONS     =
 
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box
-# for the HTML output. The underlying search engine uses javascript
-# and DHTML and should work on any modern browser. Note that when using
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
-# (GENERATE_DOCSET) there is already a search function so this one should
-# typically be disabled. For large projects the javascript based search engine
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a PHP enabled web server instead of at the web client
-# using Javascript. Doxygen will generate the search PHP script and index
-# file to put on the web server. The advantage of the server
-# based approach is that it scales better to large projects and allows
-# full text search. The disadvantages are that it is more difficult to setup
-# and does not have live searching capabilities.
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 SERVER_BASED_SEARCH    = NO
 
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = YES
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-# Note that when enabling USE_PDFLATEX this option is only used for
-# generating bitmaps for formulas in the HTML output, but not in the
-# Makefile that is written to the output directory.
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_CMD_NAME         = latex
+LATEX_CMD_NAME         =
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, letter, legal and
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = a4
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 EXTRA_PACKAGES         =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
-# the generated latex document. The footer should contain everything after
-# the last chapter. If it is left blank doxygen will generate a
-# standard footer. Notice: only use this tag if you know what you are doing!
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = YES
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = YES
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include
-# source code with syntax highlighting in the LaTeX output.
-# Note that which sources are shown also depends on other settings
-# such as SOURCE_BROWSER.
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_SOURCE_CODE      = NO
 
 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
-# http://en.wikipedia.org/wiki/BibTeX for more info.
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load style sheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
 # replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_EXTENSIONS_FILE    =
 
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = YES
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-#XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-#XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_PROGRAMLISTING     = YES
 
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.
-# This is useful
-# if you want to understand what is going on.
-# On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_MAKEVAR_PREFIX =
 
@@ -1468,333 +2105,432 @@
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 MACRO_EXPANSION        = NO
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
 # The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
 INCLUDE_PATH           =
 
 # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
 # patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 PREDEFINED             =
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition that
-# overrules the definition found in the source code.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all references to function-like macros
-# that are alone on a line, have an all uppercase name, and do not end with a
-# semicolon, because these will confuse the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. For each
-# tag file the location of the external documentation should be added. The
-# format of a tag file without this location is as follows:
-#
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
 # TAGFILES = file1 file2 ...
 # Adding location for the tag files is done as follows:
-#
 # TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths
-# or URLs. Note that each tag file must have a unique name (where the name does
-# NOT include the path). If a tag file is not located in the directory in which
-# doxygen is run, you must also specify the path to the tagfile here.
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
 
 TAGFILES               =
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
 
-PERL_PATH              = /usr/bin/perl
+EXTERNAL_PAGES         = YES
 
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option also works with HAVE_DOT disabled, but it is recommended to
-# install and use dot, since it yields more powerful graphs.
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-MSCGEN_PATH            =
+DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
 # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
 
 HAVE_DOT               = NO
 
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
-# allowed to run in parallel. When set to 0 (the default) doxygen will
-# base this on the number of processors available in the system. You can set it
-# explicitly to a value larger than 0 to get control over the balance
-# between CPU load and processing speed.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_NUM_THREADS        = 0
 
-# By default doxygen will use the Helvetica font for all dot files that
-# doxygen generates. When you want a differently looking font you can specify
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find
-# the font, which can be done by putting it in a standard location or by setting
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
-# directory containing the font.
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTNAME           = Helvetica
 
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
-# The default size is 10pt.
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTSIZE           = 10
 
-# By default doxygen will tell dot to use the Helvetica font.
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
-# set the path where dot can find it.
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTPATH           =
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
 # collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside
-# the class node. If there are many fields or methods and many nodes the
-# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
-# threshold limits the number of items for each type to make the size more
-# managable. Set this to 0 for no limit. Note that the threshold may be
-# exceeded by 50% before the limit is enforced.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = NO
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-INCLUDE_GRAPH          = NO
+INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-CALL_GRAPH             = YES
+CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-CALLER_GRAPH           = YES
+CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will generate a graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-DIRECTORY_GRAPH        = NO
+DIRECTORY_GRAPH        = YES
 
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are svg, png, jpg, or gif.
-# If left blank png will be used. If you choose svg you need to set
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible in IE 9+ (other browsers do not have this requirement).
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_IMAGE_FORMAT       = png
 
 # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
 # enable generation of interactive SVG images that allow zooming and panning.
-# Note that this requires a modern browser other than Internet Explorer.
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
-# visible. Older versions of IE do not have SVG support.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INTERACTIVE_SVG        = NO
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_PATH               =
 
 # The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOTFILE_DIRS           =
 
 # The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the
-# \mscfile command).
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
 
 MSCFILE_DIRS           =
 
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_GRAPH_MAX_NODES    = 50
 
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
 # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 MAX_DOT_GRAPH_DEPTH    = 0
 
 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
-
-# If set to YES then doxygen will immediately stop when a warning is encountered.
-
-WARN_AS_ERROR          = YES
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index d81e923..d22cffe 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -50,6 +50,10 @@
     amcl_configure_file_curve(example_bls_ZZZ.c.in example_bls_${TC}.c "${curve}" example_bls_${TC}_GEN_SRCS)
     add_executable(example_bls_${TC} ${example_bls_${TC}_GEN_SRCS})
     target_link_libraries(example_bls_${TC} PRIVATE amcl_bls_${TC})
+    
+    amcl_configure_file_curve(example_bls_sss_ZZZ.c.in example_bls_sss_${TC}.c "${curve}" example_bls_sss_${TC}_GEN_SRCS)
+    add_executable(example_bls_sss_${TC} ${example_bls_sss_${TC}_GEN_SRCS})
+    target_link_libraries(example_bls_sss_${TC} PRIVATE amcl_bls_${TC})
   endif()
   
 endforeach()
@@ -62,3 +66,8 @@
   target_link_libraries(example_rsa_${TFF} PRIVATE amcl_rsa_${TFF})
 
 endforeach()
+
+if(BUILD_PAILLIER)
+  add_executable(example_paillier example_paillier.c)
+  target_link_libraries(example_paillier PRIVATE amcl_paillier)
+endif()
diff --git a/examples/example_bls_ZZZ.c.in b/examples/example_bls_ZZZ.c.in
index 736e54d..27111d6 100644
--- a/examples/example_bls_ZZZ.c.in
+++ b/examples/example_bls_ZZZ.c.in
@@ -16,9 +16,18 @@
 under the License.
 */
 
-/* Build executable after installation:
+/*
+  BLS example code.
 
-  gcc -O0 -g ./testbls_ZZZ.c $(pkg-config --libs --cflags amcl) -o testbls_ZZZ
+  Build executable after installation:
+
+  1. Change headers;
+
+    #include "bls_ZZZ.h" -> #include <amcl/bls_ZZZ.h>
+
+  2. Build code
+
+    gcc -O0 -g ./example_bls_ZZZ.c $(pkg-config --libs --cflags amcl) -o example_bls_ZZZ
 
 */
 
@@ -45,12 +54,13 @@
 #define G2LEN 16*BFS_ZZZ
 #endif
 
-static char message[]="test message";
-
 int bls(csprng *RNG)
 {
     int rc;
 
+    char m[2000];
+    octet M = {0,sizeof(m),m};
+
     char sk1[BGS_ZZZ];
     octet SK1 = {0,sizeof(sk1),sk1};
     char pktmp[G2LEN];
@@ -104,10 +114,12 @@
     OCT_output(&PK2);
     printf("\n");
 
+    OCT_jstring(&M,"test message");
+
     // Sign the message
-    BLS_ZZZ_SIGN(&SIG1,message,&SK1);
-    BLS_ZZZ_SIGN(&SIG2,message,&SK2);
-    BLS_ZZZ_SIGN(&SIG3,message,&SK3);
+    BLS_ZZZ_SIGN(&SIG1,&M,&SK1);
+    BLS_ZZZ_SIGN(&SIG2,&M,&SK2);
+    BLS_ZZZ_SIGN(&SIG3,&M,&SK3);
 
     printf("SIG1: ");
     OCT_output(&SIG1);
@@ -118,7 +130,7 @@
     printf("\n");
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_OK)
     {
         printf("Success: Signature is valid\n");
@@ -130,7 +142,7 @@
     }
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG2,message,&PK2);
+    rc=BLS_ZZZ_VERIFY(&SIG2,&M,&PK2);
     if (rc==BLS_OK)
     {
         printf("Success: Signature is valid\n");
@@ -142,7 +154,7 @@
     }
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG3,message,&PK3);
+    rc=BLS_ZZZ_VERIFY(&SIG3,&M,&PK3);
     if (rc==BLS_OK)
     {
         printf("Success: Signature is valid\n");
@@ -179,7 +191,7 @@
     }
 
     // Verify aggregated signature. This should fail.
-    rc=BLS_ZZZ_VERIFY(&SIG,message,&PK);
+    rc=BLS_ZZZ_VERIFY(&SIG,&M,&PK);
     if (rc==BLS_OK)
     {
         printf("Success: Aggregated signature is valid\n");
@@ -200,7 +212,7 @@
     OCT_output(&SIG);
     printf("\n");
     // Verify aggregated signature.
-    rc=BLS_ZZZ_VERIFY(&SIG,message,&PK);
+    rc=BLS_ZZZ_VERIFY(&SIG,&M,&PK);
     if (rc==BLS_OK)
     {
         printf("Success: Aggregated signature is valid\n");
@@ -213,9 +225,11 @@
 
 
     // change the message
-    message[0]='Z';
-    printf("message %s\n", message);
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    M.val[0]='Z';
+    printf("message ");
+    OCT_output_string(&M);
+    printf("\n");
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_OK)
     {
         printf("Success: Signature is valid\n");
@@ -227,12 +241,14 @@
     }
 
     // Change the signature
-    message[0]='t';
+    M.val[0]='t';
     SIG1.val[0]=5;
-    printf("message %s\n", message);
+    printf("message ");
+    OCT_output_string(&M);
+    printf("\n");
     printf("Signature SIG1: ");
     OCT_output(&SIG1);
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_OK)
     {
         printf("Success: Signature is valid\n");
@@ -269,12 +285,11 @@
     OCT_fromHex(&SEED,seedHex);
     printf("SEED: ");
     OCT_output(&SEED);
-    printf("\n");
 
     // initialise strong RNG
     CREATE_CSPRNG(&RNG,&SEED);
 
-    printf("\nTesting BLS signature for curve ZZZ\n");
+    printf("\nBLS example for curve ZZZ\n");
     bls(&RNG);
 
     KILL_CSPRNG(&RNG);
diff --git a/examples/example_bls_sss_ZZZ.c.in b/examples/example_bls_sss_ZZZ.c.in
new file mode 100644
index 0000000..b9c0aeb
--- /dev/null
+++ b/examples/example_bls_sss_ZZZ.c.in
@@ -0,0 +1,245 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/*
+  BLS Shamir Secret Sharing example code.
+
+  Build executable after installation:
+
+  1. Change headers;
+
+    #include "bls_ZZZ.h" -> #include <amcl/bls_ZZZ.h>
+
+  2. Build code
+
+    gcc -O0 -g ./example_bls_sss_ZZZ.c $(pkg-config --libs --cflags amcl) -o example_bls_sss_ZZZ
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "config_curve_ZZZ.h"
+#include "randapi.h"
+
+#if CURVE_SECURITY_ZZZ == 128
+#include "bls_ZZZ.h"
+#elif CURVE_SECURITY_ZZZ == 192
+#include "bls192_ZZZ.h"
+#elif CURVE_SECURITY_ZZZ == 256
+#include "bls256_ZZZ.h"
+#endif
+
+// Support multiple security levels
+#if CURVE_SECURITY_ZZZ == 128
+#define G2LEN 4*BFS_ZZZ
+#elif CURVE_SECURITY_ZZZ == 192
+#define G2LEN 8*BFS_ZZZ
+#elif CURVE_SECURITY_ZZZ == 256
+#define G2LEN 16*BFS_ZZZ
+#endif
+
+int bls_sss(csprng *RNG)
+{
+    int rc;
+    int n=4;
+    int k=3;
+
+    char m[2000];
+    octet M = {0,sizeof(m),m};
+
+    char ski[BGS_ZZZ];
+    octet SKI = {0,sizeof(ski),ski};
+    char pki[G2LEN];
+    octet PKI = {0,sizeof(pki),pki};
+
+    char sko[BGS_ZZZ];
+    octet SKO = {sizeof(sko),sizeof(sko),sko};
+    char skr[BGS_ZZZ];
+    octet SKR = {sizeof(skr),sizeof(skr),skr};
+
+    char sigi[BFS_ZZZ+1];
+    octet SIGI = {0,sizeof(sigi),sigi};
+    char sigr[BFS_ZZZ+1];
+    octet SIGR = {0,sizeof(sigr),sigr};
+
+    // Secret shares
+    char x[n][BGS_ZZZ];
+    octet X[n];
+    char y[n][BGS_ZZZ];
+    octet Y[n];
+
+    for(int i=0; i<n; i++)
+    {
+        memset(&y[i], 0, sizeof(y[i]));
+        Y[i].max = BGS_ZZZ;
+        Y[i].len = BGS_ZZZ;
+        Y[i].val = y[i];
+        memset(&x[i], 0, sizeof(x[i]));
+        X[i].max = BGS_ZZZ;
+        X[i].len = BGS_ZZZ;
+        X[i].val = x[i];
+    }
+
+    // Generate key pair
+    BLS_ZZZ_KEY_PAIR_GENERATE(RNG,&SKI,&PKI);
+
+    printf("Private key SKI: ");
+    OCT_output(&SKI);
+    printf("Public key PKI: ");
+    OCT_output(&PKI);
+    printf("\n");
+
+    OCT_jstring(&M,"test message");
+
+    // Sign the message
+    BLS_ZZZ_SIGN(&SIGI,&M,&SKI);
+
+    printf("SIGI: ");
+    OCT_output(&SIGI);
+
+    // Verify signature
+    rc=BLS_ZZZ_VERIFY(&SIGI,&M,&PKI);
+    if (rc!=BLS_OK)
+    {
+        printf("Error: Invalid Signature\n");
+        return 1;
+    }
+    printf("Success: Signature is valid\n");
+
+    // Make shares of BLS secret key
+    rc = BLS_ZZZ_MAKE_SHARES(k, n, RNG, X, Y, &SKI, &SKO);
+    if (rc!=BLS_OK)
+    {
+        printf("Error: BLS_ZZZ_MAKE_SHARES\n");
+        return 1;
+    }
+
+    for(int i=0; i<n; i++)
+    {
+        printf("X[%d] ", i);
+        OCT_output(&X[i]);
+        printf("Y[%d] ", i);
+        OCT_output(&Y[i]);
+    }
+
+    printf("SKO: ");
+    OCT_output(&SKO);
+
+    if (!OCT_comp(&SKI,&SKO))
+    {
+        printf("FAILURE SKI != SKO");
+        return 1;
+    }
+
+    // Recover BLS secret key
+    rc = BLS_ZZZ_RECOVER_SECRET(k, X, Y, &SKR);
+    if (rc!=BLS_OK)
+    {
+        printf("Error: BLS_ZZZ_RECOVER_SECRET\n");
+        return 1;
+    }
+    printf("SKR: ");
+    OCT_output(&SKR);
+
+    if (!OCT_comp(&SKR,&SKO))
+    {
+        printf("FAILURE SKR != SKO");
+        return 1;
+    }
+
+    // Generate public keys and signatures using shares
+    char pks[n][G2LEN];
+    octet PKS[n];
+    char sigs[n][BFS_ZZZ+1];
+    octet SIGS[n];
+    for(int i=0; i<n; i++)
+    {
+        memset(&sigs[i], 0, sizeof(sigs[i]));
+        SIGS[i].max = BFS_ZZZ+1;
+        SIGS[i].len = BFS_ZZZ+1;
+        SIGS[i].val = sigs[i];
+        memset(&PKS[i], 0, sizeof(PKS[i]));
+        PKS[i].max = G2LEN;
+        PKS[i].len = G2LEN;
+        PKS[i].val = pks[i];
+        BLS_ZZZ_KEY_PAIR_GENERATE(NULL,&Y[i],&PKS[i]);
+        BLS_ZZZ_SIGN(&SIGS[i],&M,&Y[i]);
+    }
+
+    for(int i=0; i<n; i++)
+    {
+        printf("PKS[%d] ", i);
+        OCT_output(&PKS[i]);
+    }
+
+    for(int i=0; i<n; i++)
+    {
+        printf("SIGS[%d] ", i);
+        OCT_output(&SIGS[i]);
+    }
+    printf("\n\n");
+
+    // Recover BLS signature
+    rc = BLS_ZZZ_RECOVER_SIGNATURE(k, X, SIGS, &SIGR);
+    if (rc!=BLS_OK)
+    {
+        printf("Error: BLS_ZZZ_RECOVER_SIGNATURE\n");
+        return 1;
+    }
+    printf("SIGR: ");
+    OCT_output(&SIGR);
+
+    if (!OCT_comp(&SIGR,&SIGI))
+    {
+        printf("FAILURE SIGR != SIGI");
+        return 1;
+    }
+
+    return 0;
+}
+
+
+int main()
+{
+#ifdef DEBUG
+    printf("%d bit build\n",CHUNK);
+#endif
+
+    char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
+    char seed[16] = {0};
+    octet SEED = {sizeof(seed),sizeof(seed),seed};
+
+    // CSPRNG
+    csprng RNG;
+
+    // fake random source
+    OCT_fromHex(&SEED,seedHex);
+    printf("SEED: ");
+    OCT_output(&SEED);
+
+    // initialise strong RNG
+    CREATE_CSPRNG(&RNG,&SEED);
+
+    printf("\nBLS SSS example for curve ZZZ\n");
+    bls_sss(&RNG);
+
+    KILL_CSPRNG(&RNG);
+}
+
+
diff --git a/examples/example_paillier.c b/examples/example_paillier.c
new file mode 100644
index 0000000..4c57a39
--- /dev/null
+++ b/examples/example_paillier.c
@@ -0,0 +1,230 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/*
+   Example of Paillier crypto system.
+
+   Homomorphic multiplicaton of ciphertext by a constant and
+   homomorphic addition of ciphertexts
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "randapi.h"
+#include "paillier.h"
+
+#define NTHREADS 2
+
+int paillier(csprng *RNG)
+{
+    // Key material
+    PAILLIER_private_key PRIV;
+    PAILLIER_public_key PUB;
+
+    // Plaintext to encrypt
+    char ptin[NTHREADS][FS_2048];
+    octet PTIN[NTHREADS];
+    char ptout[NTHREADS][FS_2048];
+    octet PTOUT[NTHREADS];
+
+    // Constant value for multiplication
+    char ptko[NTHREADS][FS_2048];
+    octet PTK[NTHREADS];
+
+    // Encrypted PTIN values
+    char cto[NTHREADS][FS_4096];
+    octet CT[NTHREADS];
+
+    // Homomorphic multiplicaton of plaintext by a constant ciphertext
+    char cta[NTHREADS][FS_4096];
+    octet CTA[NTHREADS];
+
+    // Homomorphic addition of ciphertext
+    char cto3[FS_4096] = {0};
+    octet CT3 = {0,sizeof(cto3),cto3};
+
+    // Output plaintext of addition of homomorphic multiplication values
+    char pto3[FS_2048] = {0};
+    octet PT3 = {sizeof(pto3),sizeof(pto3),pto3};
+
+    // Expected ouput is 26 / 0x1a i.e. 2*3 + 4*5
+    int values[NTHREADS] = {2,4};
+    int kvalues[NTHREADS] = {3,5};
+
+    // Initialize octets
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PTIN[i].max = FS_2048;
+        PTIN[i].val = ptin[i];
+        OCT_clear(&PTIN[i]);
+
+        PTOUT[i].max = FS_2048;
+        PTOUT[i].val = ptout[i];
+        OCT_clear(&PTOUT[i]);
+
+        PTK[i].max = FS_2048;
+        PTK[i].val = ptko[i];
+        OCT_clear(&PTIN[i]);
+
+        CT[i].max = FS_4096;
+        CT[i].val = cto[i];
+        OCT_clear(&PTIN[i]);
+
+        CTA[i].max = FS_4096;
+        CTA[i].val = cta[i];
+        OCT_clear(&PTIN[i]);
+    }
+
+    printf("Generating public/private key pair\n");
+    PAILLIER_KEY_PAIR(RNG, NULL, NULL, &PUB, &PRIV);
+
+    printf("P: ");
+    FF_2048_output(PRIV.p, HFLEN_2048);
+    printf("\n");
+    printf("Q: ");
+    FF_2048_output(PRIV.q, HFLEN_2048);
+    printf("\n");
+
+    printf("Public Key \n");
+    printf("N: ");
+    FF_4096_output(PUB.n, HFLEN_4096);
+    printf("\n");
+    printf("G: ");
+    FF_4096_output(PUB.g, FFLEN_4096);
+    printf("\n");
+
+    printf("Secret Key \n");
+    printf("L_p: ");
+    FF_2048_output(PRIV.lp, HFLEN_2048);
+    printf("\n");
+    printf("L_q: ");
+    FF_2048_output(PRIV.lq, HFLEN_2048);
+    printf("\n");
+    printf("M_p: ");
+    FF_2048_output(PRIV.mp, HFLEN_2048);
+    printf("\n");
+    printf("M_q: ");
+    FF_2048_output(PRIV.mq, HFLEN_2048);
+    printf("\n");
+
+    // Set plaintext values
+    for(int i=0; i<NTHREADS; i++)
+    {
+        BIG_1024_58 pt[FFLEN_2048];
+        FF_2048_init(pt, values[i],FFLEN_2048);
+        FF_2048_toOctet(&PTIN[i], pt, FFLEN_2048);
+
+        BIG_1024_58 ptk[FFLEN_2048];
+        FF_2048_init(ptk, kvalues[i],FFLEN_2048);
+        FF_2048_toOctet(&PTK[i], ptk, FFLEN_2048);
+    }
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        printf("PTIN[%d] ", i);
+        OCT_output(&PTIN[i]);
+        printf("\n");
+    }
+
+    // Encrypt plaintext
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_ENCRYPT(RNG, &PUB, &PTIN[i], &CT[i], NULL);
+    }
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        printf("CT[%d] ", i);
+        OCT_output(&CT[i]);
+        printf("\n");
+    }
+
+    // Decrypt ciphertexts
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_DECRYPT(&PRIV, &CT[i], &PTOUT[i]);
+    }
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        printf("PTOUT[%d] ", i);
+        OCT_output(&PTOUT[i]);
+        printf("\n");
+    }
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_MULT(&PUB, &CT[i], &PTK[i], &CTA[i]);
+    }
+
+    PAILLIER_ADD(&PUB, &CTA[0], &CTA[1], &CT3);
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        printf("CTA[%d] ", i);
+        OCT_output(&CTA[i]);
+        printf("\n");
+    }
+    printf("CT3: ");
+    OCT_output(&CT3);
+    printf("\n");
+
+    PAILLIER_DECRYPT(&PRIV, &CT3, &PT3);
+
+    printf("PT3: ");
+    OCT_output(&PT3);
+    printf("\n");
+
+    // Clear sensitive memory
+    PAILLIER_PRIVATE_KEY_KILL(&PRIV);
+
+    OCT_clear(&PT3);
+    for(int i=0; i<NTHREADS; i++)
+    {
+        OCT_clear(&PTIN[i]);
+        OCT_clear(&PTOUT[i]);
+    }
+
+    return 0;
+}
+
+int main()
+{
+    char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
+    char seed[16] = {0};
+    octet SEED = {sizeof(seed),sizeof(seed),seed};
+
+    // CSPRNG
+    csprng RNG;
+
+    // fake random source
+    OCT_fromHex(&SEED,seedHex);
+    printf("SEED: ");
+    OCT_output(&SEED);
+
+    // initialise strong RNG
+    CREATE_CSPRNG(&RNG,&SEED);
+
+    printf("\nPaillier example\n");
+    paillier(&RNG);
+
+    KILL_CSPRNG(&RNG);
+}
diff --git a/include/bls.h.in b/include/bls.h.in
index cf5ceca..40d59ff 100644
--- a/include/bls.h.in
+++ b/include/bls.h.in
@@ -58,38 +58,71 @@
 /**	@brief Calculate a signature
  *
 	@param SIG  signature
-	@param m    message to be signed
+	@param M    message to be signed
 	@param S    Private key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S);
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S);
 
 /**	@brief Verify a signature
  *
 	@param SIG  signature
-	@param m    message whose signature is to be verified.
+	@param M    message whose signature is to be verified.
 	@param W    Public key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W);
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W);
 
 /**	@brief Add two members from the group G1
  *
-	@param      R1 member of G1
-	@param      R2 member of G1
-	@param      R member of G1. R = R1+R2
+	@param  R1  member of G1
+	@param  R2  member of G1
+	@param  R   member of G1. R = R1+R2
 	@return     Zero for success or else an error code
  */
 int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R);
 
 /**	@brief Add two members from the group G2
  *
-	@param      W1 member of G2
-	@param      W2 member of G2
-	@param      W member of G2. W = W1+W2
+	@param  W1  member of G2
+	@param  W2  member of G2
+	@param  W   member of G2. W = W1+W2
 	@return     Zero for success or else an error code
  */
 int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W);
 
+/**	@brief Use Shamir's secret sharing to distribute BLS secret keys
+ *
+	@param  k   Threshold
+	@param  n   Number of shares
+        @param  RNG Pointer to a cryptographically secure random number generator
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SKI Input secret key to be shared. Ignored if set to NULL
+	@param  SKO Secret key that is shared
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS secret key
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SK  Secret key that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS signature
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS signatures
+	@param  SIG Signature that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG);
+
 #endif
 
diff --git a/include/bls192.h.in b/include/bls192.h.in
index 4e4a489..319a4e2 100644
--- a/include/bls192.h.in
+++ b/include/bls192.h.in
@@ -58,20 +58,20 @@
 /**	@brief Calculate a signature
  *
 	@param SIG  signature
-	@param m    message to be signed
+	@param M    message to be signed
 	@param S    Private key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S);
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S);
 
 /**	@brief Verify a signature
  *
 	@param SIG  signature
-	@param m    message whose signature is to be verified.
+	@param M    message whose signature is to be verified.
 	@param W    Public key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W);
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W);
 
 /**	@brief Add two members from the group G1
  *
@@ -91,5 +91,39 @@
  */
 int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W);
 
+/**	@brief Use Shamir's secret sharing to distribute BLS secret keys
+ *
+	@param  k   Threshold
+	@param  n   Number of shares
+        @param  RNG Pointer to a cryptographically secure random number generator
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SKI Input secret key to be shared. Ignored if set to NULL
+	@param  SKO Secret key that is shared
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS secret key
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SK  Secret key that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS signature
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS signatures
+	@param  SIG Signature that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG);
+
+
 #endif
 
diff --git a/include/bls256.h.in b/include/bls256.h.in
index 5af8f61..17f89e0 100644
--- a/include/bls256.h.in
+++ b/include/bls256.h.in
@@ -58,20 +58,20 @@
 /**	@brief Calculate a signature
  *
 	@param SIG  signature
-	@param m    message to be signed
+	@param M    message to be signed
 	@param S    Private key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S);
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S);
 
 /**	@brief Verify a signature
  *
 	@param SIG  signature
-	@param m    message whose signature is to be verified.
+	@param M    message whose signature is to be verified.
 	@param W    Public key
 	@return     Zero for success or else an error code
  */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W);
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W);
 
 /**	@brief Add two members from the group G1
  *
@@ -91,5 +91,39 @@
  */
 int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W);
 
+/**	@brief Use Shamir's secret sharing to distribute BLS secret keys
+ *
+	@param  k   Threshold
+	@param  n   Number of shares
+        @param  RNG Pointer to a cryptographically secure random number generator
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SKI Input secret key to be shared. Ignored if set to NULL
+	@param  SKO Secret key that is shared
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS secret key
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS secret keys
+	@param  SK  Secret key that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK);
+
+/**	@brief Use Shamir's secret sharing to recover a BLS signature
+ *
+	@param  k   Threshold
+	@param  X   X values
+	@param  Y   Y values. Valid BLS signatures
+	@param  SIG Signature that is recovered
+	@return     Zero for success or else an error code
+ */
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG);
+
+
 #endif
 
diff --git a/include/ff.h.in b/include/ff.h.in
index c3be699..043acc6 100644
--- a/include/ff.h.in
+++ b/include/ff.h.in
@@ -181,11 +181,11 @@
 /**	@brief Reduce FF mod a modulus
  *
 	This is slow
-	@param x FF instance to be reduced mod m - on exit = x mod m
-	@param m FF modulus
+	@param x FF instance to be reduced mod p - on exit = x mod p
+	@param p FF modulus
 	@param n size of FF in BIGs
  */
-extern void FF_WWW_mod(BIG_XXX *x,BIG_XXX *m,int n);
+extern void FF_WWW_mod(BIG_XXX *x,BIG_XXX *p,int n);
 /**	@brief Square an FF
  *
 	Uses Karatsuba method internally
@@ -211,6 +211,13 @@
 	@param n size of FF in BIGs
  */
 extern void FF_WWW_invmodp(BIG_XXX *x,BIG_XXX *y,BIG_XXX *z,int n);
+/** @brief Invert an FF mod 2^(n*BIGBITS)
+ *
+ * @param U FF instance, on exit 1/a mod 2^(n*BIGBITS)
+ * @param a FF instance
+ * @param n size of FF in BIGs
+ */
+extern void FF_WWW_invmod2m(BIG_XXX U[],BIG_XXX a[],int n);
 /**	@brief Create an FF from a random number generator
  *
 	@param x FF instance, on exit x is a random number of length n BIGs with most significant bit a 1
@@ -226,44 +233,68 @@
 	@param n size of FF in BIGs
  */
 extern void FF_WWW_randomnum(BIG_XXX *x,BIG_XXX *y,csprng *R,int n);
-/**	@brief Calculate r=x^e mod m, side channel resistant
+/**	@brief Calculate r=x^e mod p, side channel resistant
  *
 	@param r FF instance, on exit = x^e mod p
 	@param x FF instance
 	@param e FF exponent
-	@param m FF modulus
+	@param p FF modulus
 	@param n size of FF in BIGs
+	@param en size of the exponent in BIGs
  */
-extern void FF_WWW_skpow(BIG_XXX *r,BIG_XXX *x,BIG_XXX * e,BIG_XXX *m,int n);
-/**	@brief Calculate r=x^e mod m, side channel resistant
+extern void FF_WWW_skpow(BIG_XXX *r,BIG_XXX *x,BIG_XXX * e,BIG_XXX *p,int n, int en);
+/**	@brief Calculate r=x^e mod p, side channel resistant
  *
 	For short BIG exponent
 	@param r FF instance, on exit = x^e mod p
 	@param x FF instance
 	@param e BIG exponent
-	@param m FF modulus
+	@param p FF modulus
 	@param n size of FF in BIGs
  */
-extern void FF_WWW_skspow(BIG_XXX *r,BIG_XXX *x,BIG_XXX e,BIG_XXX *m,int n);
-/**	@brief Calculate r=x^e mod m
+extern void FF_WWW_skspow(BIG_XXX *r,BIG_XXX *x,BIG_XXX e,BIG_XXX *p,int n);
+/**	@brief Calculate r=x^e.y^f mod p for big e and f, side channel resistant
+ *
+	@param r  FF instance, on exit = x^e.y^f mod p
+	@param x  FF instance
+	@param e  FF exponent
+	@param y  FF instance
+	@param f  FF exponent
+	@param p  FF modulus
+	@param n  size of FF in BIGs
+	@param en size of the exponent in BIGs
+ */
+extern void FF_WWW_skpow2(BIG_XXX *r,BIG_XXX *x, BIG_XXX *e, BIG_XXX *y, BIG_XXX *f, BIG_XXX *p, int n, int en);
+/**	@brief Calculate r=x^e mod p
  *
 	For very short integer exponent
-	@param r FF instance, on exit = x^e mod p
-	@param x FF instance
-	@param e integer exponent
-	@param m FF modulus
-	@param n size of FF in BIGs
+	@param r  FF instance, on exit = x^e mod p
+	@param x  FF instance
+	@param e  integer exponent
+	@param p  FF modulus
+	@param n  size of FF in BIGs
  */
-extern void FF_WWW_power(BIG_XXX *r,BIG_XXX *x,int e,BIG_XXX *m,int n);
-/**	@brief Calculate r=x^e mod m
+extern void FF_WWW_power(BIG_XXX *r,BIG_XXX *x,int e,BIG_XXX *p,int n);
+/**	@brief Calculate r=x^e mod p
  *
 	@param r FF instance, on exit = x^e mod p
 	@param x FF instance
 	@param e FF exponent
+	@param p FF modulus
+	@param n size of FF in BIGs
+ */
+extern void FF_WWW_pow(BIG_XXX *r,BIG_XXX *x,BIG_XXX *e,BIG_XXX *p,int n);
+/**	@brief Calculate r=x^e.y^f mod m
+ *
+	@param r FF instance, on exit = x^e.y^f mod p
+	@param x FF instance
+	@param e BIG exponent
+	@param y FF instance
+	@param f BIG exponent
 	@param m FF modulus
 	@param n size of FF in BIGs
  */
-extern void FF_WWW_pow(BIG_XXX *r,BIG_XXX *x,BIG_XXX *e,BIG_XXX *m,int n);
+extern void FF_WWW_pow2(BIG_XXX *r,BIG_XXX *x,BIG_XXX e,BIG_XXX *y,BIG_XXX f,BIG_XXX *m,int n);
 /**	@brief Test if an FF has factor in common with integer s
  *
 	@param x FF instance to be tested
@@ -281,16 +312,15 @@
 	@return 1 if x is (almost certainly) prime, else return 0
  */
 extern int FF_WWW_prime(BIG_XXX *x,csprng *R,int n);
-/**	@brief Calculate r=x^e.y^f mod m
+/**	@brief Combine rp and rq using the Chinese Remainder Theorem
  *
-	@param r FF instance, on exit = x^e.y^f mod p
-	@param x FF instance
-	@param e BIG exponent
-	@param y FF instance
-	@param f BIG exponent
-	@param m FF modulus
-	@param n size of FF in BIGs
+	@param r  FF instance, on exit the solution of the system
+	@param rp FF instance, solution modulo p
+	@param rq FF instance, solution modulo q
+	@param p  FF instance, MUST be coprime with q
+	@param q  FF instance, MUST be coprime with p
+	@param n size of p and q in BIGs
  */
-extern void FF_WWW_pow2(BIG_XXX *r,BIG_XXX *x,BIG_XXX e,BIG_XXX *y,BIG_XXX f,BIG_XXX *m,int n);
+extern void FF_WWW_crt(BIG_XXX *r, BIG_XXX *rp, BIG_XXX *rq, BIG_XXX *p, BIG_XXX *q, int n);
 
 #endif
diff --git a/include/paillier.h b/include/paillier.h
new file mode 100644
index 0000000..f1c57e3
--- /dev/null
+++ b/include/paillier.h
@@ -0,0 +1,175 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/**
+ * @file paillier.h
+ * @brief Paillier declarations
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "ff_4096.h"
+#include "ff_2048.h"
+
+// Field size
+#define FS_4096 MODBYTES_512_60*FFLEN_4096    /**< 4096 field size in bytes */
+#define FS_2048 MODBYTES_1024_58*FFLEN_2048   /**< 2048 field size in bytes */
+
+// Half field size
+#define HFS_4096 MODBYTES_512_60*HFLEN_4096   /**< Half 4096 field size in bytes */
+#define HFS_2048 MODBYTES_1024_58*HFLEN_2048  /**< Half 2048 field size in bytes */
+
+/*!
+ * \brief Paillier Public Key
+ */
+typedef struct{
+    BIG_512_60 n[FFLEN_4096]; /**< Paillier Modulus - \f$ n = pq \f$ */
+    BIG_512_60 g[FFLEN_4096]; /**< Public Base - \f$ g = n+1 \f$ */
+
+    BIG_512_60 n2[FFLEN_4096]; /**< Precomputed \f$ n^2 \f$ */
+}PAILLIER_public_key;
+
+/*!
+ * \brief Paillier Private Key
+ */
+typedef struct{
+    BIG_1024_58 p[HFLEN_2048]; /**< Secret Prime */
+    BIG_1024_58 q[HFLEN_2048]; /**< Secret Prime */
+
+    BIG_1024_58 lp[HFLEN_2048]; /**< Private Key modulo \f$ p \f$ (Euler totient of \f$ p \f$) */
+    BIG_1024_58 lq[HFLEN_2048]; /**< Private Key modulo \f$ q \f$ (Euler totient of \f$ q \f$) */
+
+    BIG_1024_58 invp[FFLEN_2048]; /**< Precomputed \f$ p^{-1} \pmod{2^m} \f$ */
+    BIG_1024_58 invq[FFLEN_2048]; /**< Precomputed \f$ q^{-1} \pmod{2^m} \f$ */
+
+    BIG_1024_58 p2[FFLEN_2048]; /**< Precomputed \f$ p^2 \f$ */
+    BIG_1024_58 q2[FFLEN_2048]; /**< Precomputed \f$ q^2 \f$ */
+
+    BIG_1024_58 mp[HFLEN_2048]; /**< Precomputed \f$ L(g^{lp} \pmod{p^2})^{-1} \f$ */
+    BIG_1024_58 mq[HFLEN_2048]; /**< Precomputed \f$ L(g^{lq} \pmod{q^2})^{-1} \f$ */
+}PAILLIER_private_key;
+
+/*! \brief Generate the key pair
+ *
+ *  Pick large prime numbers of the same size \f$ p \f$ and \f$ q \f$
+ *
+ *  <ol>
+ *  <li> \f$ n = pq \f$
+ *  <li> \f$ g = n + 1 \f$
+ *  <li> \f$ l = (p-1)(q-1) \f$
+ *  <li> \f$ m = l^{-1} \pmod{n} \f$
+ *  </ol>
+ *
+ *  @param  RNG              Pointer to a cryptographically secure random number generator
+ *  @param  P                Prime number. If RNG is NULL then this value is read
+ *  @param  Q                Prime number. If RNG is NULL then this value is read
+ *  @param  PUB              Public key
+ *  @param  PRIV             Private key
+ */
+void PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, PAILLIER_public_key *PUB, PAILLIER_private_key *PRIV);
+
+/*! \brief Clear private key
+ *
+ *  @param PRIV             Private key to clean
+ */
+void PAILLIER_PRIVATE_KEY_KILL(PAILLIER_private_key *PRIV);
+
+/*! \brief Encrypt a plaintext
+ *
+ *  These are the encryption steps.
+ *
+ *  <ol>
+ *  <li> \f$ m < n \f$
+ *  <li> \f$ r < n \f$
+ *  <li> \f$ c = g^m.r^n\pmod{n^2} \f$
+ *  </ol>
+ *
+ *  @param  RNG              Pointer to a cryptographically secure random number generator
+ *  @param  PUB              Public key
+ *  @param  PT               Plaintext
+ *  @param  CT               Ciphertext
+ *  @param  R                R value for testing. If RNG is NULL then this value is read.
+ */
+void PAILLIER_ENCRYPT(csprng *RNG, PAILLIER_public_key *PUB, octet* PT, octet* CT, octet* R);
+
+/*! \brief Decrypt ciphertext
+ *
+ *  These are the decryption steps modulo n.
+ *  The computations are carried out modulo p and q
+ *  and combined using the CRT.
+ *
+ *  <ol>
+ *  <li> \f$ ctl = ct^l \pmod{n^2} - 1 \f$
+ *  <li> \f$ ctln = ctl / n \f$
+ *  <li> \f$ pt = ctln * m \pmod{n} \f$
+ *  </ol>
+ *
+ *  @param   PRIV             Private key
+ *  @param   CT               Ciphertext
+ *  @param   PT               Plaintext
+ */
+void PAILLIER_DECRYPT(PAILLIER_private_key *PRIV, octet* CT, octet* PT);
+
+/*! \brief Homomorphic addition of plaintexts
+ *
+ *  \f$ E(m1+m2) = E(m1)*E(m2) \f$
+ *
+ *  <ol>
+ *  <li> \f$ ct = ct1*ct2 \pmod{n^2} \f$
+ *  </ol>
+ *
+ *  @param   PUB              Public key
+ *  @param   CT1              Ciphertext one
+ *  @param   CT2              Ciphertext two
+ *  @param   CT               Ciphertext
+ *  @return                   Returns 0 or else error code
+ */
+void PAILLIER_ADD(PAILLIER_public_key *PUB, octet* CT1, octet* CT2, octet* CT);
+
+/*! \brief Homomorphic multipication of plaintexts
+ *
+ *  \f$ E(m1*m2) = E(m1)^{m2} \f$
+ *
+ *  <ol>
+ *  <li> \f$ ct = ct1^{m2} \pmod{n^2} \f$
+ *  </ol>
+ *
+ *  @param   PUB              Public key
+ *  @param   CT1              Ciphertext one
+ *  @param   PT               Plaintext constant
+ *  @param   CT               Ciphertext
+ */
+void PAILLIER_MULT(PAILLIER_public_key *PUB, octet* CT1, octet* PT, octet* CT);
+
+/*! \brief Read a public key from its octet representation
+ *
+ * @param   PUB   Public key
+ * @param   PK    Octet representation of the public key
+ */
+void PAILLIER_PK_fromOctet(PAILLIER_public_key *PUB, octet *PK);
+
+/*! \brief Write a public key to an octet
+ *
+ * @param   PK    Destination octet
+ * @param   PUB   Public key
+ */
+void PAILLIER_PK_toOctet(octet *PK, PAILLIER_public_key *PUB);
diff --git a/wrappers/python/CMakeLists.txt b/python/CMakeLists.txt
similarity index 94%
rename from wrappers/python/CMakeLists.txt
rename to python/CMakeLists.txt
index a0a7961..cd41aa1 100644
--- a/wrappers/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -28,9 +28,9 @@
     amcl_configure_file_curve(TimeMPIN_ZZZ.py.in        TimeMPIN_${TC}.py        ${curve} __no_install)
     amcl_configure_file_curve(TestMPINInstall_ZZZ.py.in TestMPINInstall_${TC}.py ${curve} __no_install)
 
-    install(FILES "${amcl_mpin_${TC}_GEN_PYS}" DESTINATION ${PYTHON_SITE_PACKAGES})
+    install(FILES "${amcl_mpin_${TC}_GEN_PYS}" DESTINATION ${PYTHON3_SITE_PACKAGES})
   
-    add_test(test_python_mpin_install_${TC} python TestMPINInstall_${TC}.py)
+    add_test(test_python_mpin_install_${TC} python3 TestMPINInstall_${TC}.py)
 
     # Set the LD_LIBRARY_PATH or equivalent to the libraries can be
     # loaded when running the test.
@@ -48,7 +48,7 @@
 
   if(TARGET amcl_wcc_${TC})
     amcl_configure_file_curve(wcc_ZZZ.py.in wcc_${TC}.py ${curve} amcl_wcc_${TC}_GEN_PYS)
-    install(FILES "${amcl_wcc_${TC}_GEN_PYS}" DESTINATION ${PYTHON_SITE_PACKAGES})
+    install(FILES "${amcl_wcc_${TC}_GEN_PYS}" DESTINATION ${PYTHON3_SITE_PACKAGES})
   endif()
 
   if(TARGET amcl_bls_${TC})
diff --git a/wrappers/python/README.md b/python/README.md
similarity index 100%
rename from wrappers/python/README.md
rename to python/README.md
diff --git a/wrappers/python/TestMPINInstall_ZZZ.py.in b/python/TestMPINInstall_ZZZ.py.in
similarity index 93%
rename from wrappers/python/TestMPINInstall_ZZZ.py.in
rename to python/TestMPINInstall_ZZZ.py.in
index c02936c..ac96fc9 100644
--- a/wrappers/python/TestMPINInstall_ZZZ.py.in
+++ b/python/TestMPINInstall_ZZZ.py.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Licensed to the Apache Software Foundation (ASF) under one
@@ -20,7 +20,6 @@
 """
 import os
 import unittest
-import json
 import hashlib
 import mpin_ZZZ
 
@@ -30,22 +29,15 @@
 
     def setUp(self):
 
-        # Form MPin ID
-        endUserData = {
-            "issued": "2013-10-19T06:12:28Z",
-            "userID": "alice@milagro.com",
-            "mobile": 1,
-            "salt": "e985da112a378c222cfc2f7226097b0c"
-        }
-        self.mpin_id = json.dumps(endUserData)
+        self.mpin_id = b'alice@milagro.com'
 
         # Hash value of MPIN_ID
         self.hash_mpin_id = mpin_ZZZ.hash_id(
             mpin_ZZZ.HASH_TYPE_ZZZ, self.mpin_id)
 
         # Assign a seed value
-        seedHex = "3ade3d4a5c698e8910bf92f25d97ceeb7c25ed838901a5cb5db2cf25434c1fe76c7f79b7af2e5e1e4988e4294dbd9bd9fa3960197fb7aec373609fb890d74b16a4b14b2ae7e23b75f15d36c21791272372863c4f8af39980283ae69a79cf4e48e908f9e0"
-        self.seed = seedHex.decode("hex")
+        seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+        self.seed = bytes.fromhex(seed_hex)
 
         self.date = 16238
 
@@ -287,7 +279,7 @@
             # Generate client secret shares
             rtn, cs1 = mpin_ZZZ.get_client_secret(ms1, hash_mpin_id)
             self.assertEqual(rtn, 0)
-            cs1Hex = cs1.encode("hex")
+            cs1Hex = cs1.hex()
             if cs1Hex in s:
                 match = 1
             self.assertEqual(match, 0)
@@ -318,7 +310,6 @@
         match = 0
         for i in range(1, 208900):
             random = mpin_ZZZ.generate_random(rng, 4)
-            # print i, "  ", random.encode("hex")
             if random in s:
                 match = 1
                 break
@@ -338,7 +329,7 @@
         header = os.urandom(32)
 
         # Plaintext input
-        plaintext1 = "A test message"
+        plaintext1 = b"A test message"
 
         ciphertext, tag1 = mpin_ZZZ.aes_gcm_encrypt(
             key, iv, header, plaintext1)
@@ -362,14 +353,16 @@
         header = os.urandom(32)
 
         # Plaintext input
-        plaintext1 = "A test message"
+        plaintext1 = b"A test message"
 
         ciphertext, tag1 = mpin_ZZZ.aes_gcm_encrypt(
             key, iv, header, plaintext1)
 
-        new = list(ciphertext)
+        ciphertext_hex = ciphertext.hex()
+        new = list(ciphertext_hex)
         new[0] = "a" if (new[0] != "a") else "b"
-        ciphertext_bad = ''.join(new)
+        ciphertext_bad_hex = ''.join(new)
+        ciphertext_bad = bytes.fromhex(ciphertext_bad_hex)
 
         plaintext2, tag2 = mpin_ZZZ.aes_gcm_decrypt(
             key, iv, header, ciphertext_bad)
@@ -390,14 +383,16 @@
         header = os.urandom(32)
 
         # Plaintext input
-        plaintext1 = "A test message"
+        plaintext1 = b"A test message"
 
         ciphertext, tag1 = mpin_ZZZ.aes_gcm_encrypt(
             key, iv, header, plaintext1)
 
-        new = list(header)
+        header_hex = header.hex()
+        new = list(header_hex)
         new[0] = "a" if (new[0] != "a") else "b"
-        header_bad = ''.join(new)
+        header_bad_hex = ''.join(new)
+        header_bad = bytes.fromhex(header_bad_hex)
 
         plaintext2, tag2 = mpin_ZZZ.aes_gcm_decrypt(
             key, iv, header_bad, ciphertext)
diff --git a/python/TimeMPIN_ZZZ.py.in b/python/TimeMPIN_ZZZ.py.in
new file mode 100755
index 0000000..6204878
--- /dev/null
+++ b/python/TimeMPIN_ZZZ.py.in
@@ -0,0 +1,371 @@
+#!/usr/bin/env python3
+
+"""
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+"""
+
+import json
+import sys
+import timeit
+import warnings
+import mpin_ZZZ
+
+warnings.filterwarnings("ignore")
+
+
+def time_func(stmt, n=10, setup='from __main__ import *'):
+    t = timeit.Timer(stmt, setup)
+    total_time = t.timeit(n)
+    iter_time = total_time / n
+    iter_per_sec = n / total_time
+    print("func:{} nIter:{} total_time:{} iter_time:{} iter_per_sec: %s".format(
+        stmt, n, total_time, iter_time, iter_per_sec))
+
+
+nIter = 100
+
+if __name__ == "__main__":
+    # Print hex values
+    DEBUG = False
+
+    ONE_PASS = False
+    TIME_PERMITS = True
+    MPIN_FULL = True
+    PIN_ERROR = True
+
+    if TIME_PERMITS:
+        date = mpin_ZZZ.today()
+    else:
+        date = 0
+
+    # Seed
+    seedHex = "b75e7857fa17498c333d3c8d42e10f8c3cb8a66f7a84d85f86cd5acb537fa211"
+    seed = seedHex.decode("hex")
+
+    # random number generator
+    rng = mpin_ZZZ.create_csprng(seed)
+
+    # Identity
+    mpin_id = "alice@milagro.com"
+
+    # Hash mpin_id
+    hash_mpin_id = mpin_ZZZ.hash_id(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id)
+    if DEBUG:
+        print("mpin_id: {}".format(mpin_id.hex()))
+        print("hash_mpin_id: {}".format(hash_mpin_id.hex()))
+
+    mpin_id = mpin_id
+
+    # Generate master secret for MILAGRO and Customer
+    time_func('rtn, ms1 = mpin_ZZZ.random_generate(rng)', nIter)
+    rtn, ms1 = mpin_ZZZ.random_generate(rng)
+    if rtn != 0:
+        print("random_generate(rng) Error {}".format(rtn))
+    rtn, ms2 = mpin_ZZZ.random_generate(rng)
+    if rtn != 0:
+        print("random_generate(rng) Error {}".format(rtn))
+    if DEBUG:
+        print("ms1: {}".format(ms1.hex())
+        print("ms2: {}".format(ms2.hex())
+
+    # Generate server secret shares
+    time_func('rtn, ss1 = mpin_ZZZ.get_server_secret(ms1)', nIter)
+    rtn, ss1=mpin_ZZZ.get_server_secret(ms1)
+    if rtn != 0:
+        print("get_server_secret(ms1) Error {}".format(rtn))
+    rtn, ss2=mpin_ZZZ.get_server_secret(ms2)
+    if rtn != 0:
+        print("get_server_secret(ms2) Error {}".format(rtn))
+    if DEBUG:
+        print("ss1: {}".format(ss1.hex()))
+        print("ss2: {}".format(ss2.hex()))
+
+    # Combine server secret shares
+    time_func('rtn, server_secret = mpin_ZZZ.recombine_G2(ss1, ss2)', nIter)
+    rtn, server_secret=mpin_ZZZ.recombine_G2(ss1, ss2)
+    if rtn != 0:
+        print("recombine_G2(ss1, ss2) Error {}".format(rtn))
+    if DEBUG:
+        print("server_secret: {}".format(mpin_ZZZ.server_secret.hex()))
+
+    # Generate client secret shares
+    time_func('rtn, cs1 = mpin_ZZZ.get_client_secret(ms1, hash_mpin_id)', nIter)
+    rtn, cs1=mpin_ZZZ.get_client_secret(ms1, hash_mpin_id)
+    if rtn != 0:
+        print("get_client_secret(ms1, hash_mpin_id) Error {}".format(rtn))
+    rtn, cs2=mpin_ZZZ.get_client_secret(ms2, hash_mpin_id)
+    if rtn != 0:
+        print("get_client_secret(ms2, hash_mpin_id) Error {}".format(rtn))
+    if DEBUG:
+        print("cs1: {}".format(cs1.hex()))
+        print("cs2: {}".format(cs2.hex()))
+
+    # Combine client secret shares
+    time_func('rtn, client_secret = mpin_ZZZ.recombine_G1(cs1, cs2)', nIter)
+    rtn, client_secret=mpin_ZZZ.recombine_G1(cs1, cs2)
+    if rtn != 0:
+        print("recombine_G1(cs1, cs2) Error {}".format(rtn))
+    print("Client Secret: {}".format(client_secret.hex()))
+
+    # Generate Time Permit shares
+    if DEBUG:
+        print("Date {}".format(date))
+    time_func(
+        'rtn, tp1 = mpin_ZZZ.get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id)',
+        nIter)
+    rtn, tp1=mpin_ZZZ.get_client_permit(
+        mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id)
+    if rtn != 0:
+        print("get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id) Error {}".format(rtn))
+    rtn, tp2=mpin_ZZZ.get_client_permit(
+        mpin_ZZZ.HASH_TYPE_ZZZ, date, ms2, hash_mpin_id)
+    if rtn != 0:
+        print("get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms2, hash_mpin_id) Error {}".format(rtn))
+    if DEBUG:
+        print("tp1: {}".format(tp1.hex()))
+        print("tp2: {}".format(tp2.hex()))
+
+    # Combine Time Permit shares
+    rtn, time_permit=mpin_ZZZ.recombine_G1(tp1, tp2)
+    if rtn != 0:
+        print("recombine_G1(tp1, tp2) Error {}".format(rtn))
+    if DEBUG:
+        print("time_permit: {}".format(time_permit.hex()))
+
+    # Client extracts PIN from secret to create Token
+    PIN=1234
+    time_func(
+        'rtn, token = mpin_ZZZ.extract_pin(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, client_secret)',
+        nIter)
+    rtn, token=mpin_ZZZ.extract_pin(
+        mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, client_secret)
+    if rtn != 0:
+        print(
+    "extract_pin(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, token) Error {}".format(rtn))
+    print("Token: {}".format(token.hex())
+
+    if ONE_PASS:
+        print("M-Pin One Pass")
+        PIN=1234
+        time_func('epoch_time = mpin_ZZZ.get_time()', nIter)
+        epoch_time=mpin_ZZZ.get_time()
+        if DEBUG:
+            print("epoch_time {}".format(epoch_time))
+
+        # Client precomputation
+        if MPIN_FULL:
+            time_func(
+                'rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)',
+                nIter)
+            rtn, pc1, pc2=mpin_ZZZ.precompute(token, hash_mpin_id)
+
+        # Client MPIN
+        time_func(
+            'rtn, x, u, ut, v, y = mpin_ZZZ.client(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit, None, epoch_time)',
+            nIter)
+        rtn, x, u, ut, v, y=mpin_ZZZ.client(
+            mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit, None, epoch_time)
+        if rtn != 0:
+            print("MPIN_CLIENT ERROR {}".format(rtn))
+
+        # Client sends Z=r.ID to Server
+        if MPIN_FULL:
+            time_func(
+                'rtn, r, Z = mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)',
+                nIter)
+            rtn, r, Z=mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)
+
+        # Server MPIN
+        time_func(
+            'rtn, HID, HTID, E, F, y2 = mpin_ZZZ.server(mpin_ZZZ.HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id, None, epoch_time, None)',
+            nIter)
+        rtn, HID, HTID, E, F, y2=mpin_ZZZ.server(
+            mpin_ZZZ.HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id, None, epoch_time, None)
+        if DEBUG:
+            print("y2 ", y2.hex())
+        if rtn != 0:
+            print("ERROR: {} is not authenticated".format(mpin_id))
+            if PIN_ERROR:
+                time_func('err = mpin_ZZZ.kangaroo(E, F)', nIter)
+                err=mpin_ZZZ.kangaroo(E, F)
+                print("Client PIN error {} ".format(err))
+            raise SystemExit(0)
+        else:
+            print("SUCCESS: {} is authenticated".format(mpin_id))
+
+        if date:
+            prHID=HTID
+        else:
+            prHID=HID
+            ut=None
+
+        # Server sends T=w.ID to client
+        if MPIN_FULL:
+            time_func(
+                'rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)',
+                nIter)
+            rtn, w, T=mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)
+            if rtn != 0:
+                print("ERROR: Generating T {}".format(rtn))
+
+        if MPIN_FULL:
+            time_func(
+                'HM = mpin_ZZZ.hash_all(mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)',
+                nIter)
+            HM=mpin_ZZZ.hash_all(
+                mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
+
+            time_func(
+                'rtn, client_aes_key = mpin_ZZZ.client_key(mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)',
+                nIter)
+            rtn, client_aes_key=mpin_ZZZ.client_key(
+                mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
+            if rtn != 0:
+                print("ERROR: Generating client_aes_key {}".format(rtn))
+            print("Client AES Key: {}".format(client_aes_key.hex()))
+
+            rtn, server_aes_key=mpin_ZZZ.server_key(
+                mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
+            if rtn != 0:
+                print("ERROR: Generating server_aes_key {}".format(rtn))
+            print("Server AES Key: {}".format(server_aes_key.hex()))
+
+    else:
+        print("M-Pin Three Pass")
+        PIN=1234
+        if MPIN_FULL:
+            time_func(
+                'rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)',
+                nIter)
+            rtn, pc1, pc2=mpin_ZZZ.precompute(token, hash_mpin_id)
+            if rtn != 0:
+                print("precompute(token, hash_mpin_id) ERROR {}".format(rtn))
+
+        # Client first pass
+        time_func(
+            'rtn, x, u, ut, sec = mpin_ZZZ.client_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit)',
+            nIter)
+        rtn, x, u, ut, sec=mpin_ZZZ.client_1(
+            mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit)
+        if rtn != 0:
+            print("client_1  ERROR {}".format(rtn))
+        if DEBUG:
+            print("x: {}".format(x.hex()))
+
+        # Server calculates H(ID) and H(T|H(ID)) (if time permits enabled),
+        # and maps them to points on the curve HID and HTID resp.
+        time_func(
+            'HID, HTID = mpin_ZZZ.server_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id)',
+            nIter)
+        HID, HTID=mpin_ZZZ.server_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id)
+
+        # Server generates Random number y and sends it to Client
+        time_func('rtn, y = mpin_ZZZ.random_generate(rng)', nIter)
+        rtn, y=mpin_ZZZ.random_generate(rng)
+        if rtn != 0:
+            print("random_generate(rng) Error {}".format(rtn))
+
+        # Client second pass
+        time_func('rtn, v = mpin_ZZZ.client_2(x, y, sec)', nIter)
+        rtn, v=mpin_ZZZ.client_2(x, y, sec)
+        if rtn != 0:
+            print("client_2(x, y, sec) Error {}".format(rtn))
+
+        # Server second pass
+        time_func(
+            'rtn, E, F = mpin_ZZZ.server_2(date, HID, HTID, y, server_secret, u, ut, v, None)',
+            nIter)
+        rtn, E, F=mpin_ZZZ.server_2(
+            date, HID, HTID, y, server_secret, u, ut, v, None)
+        if rtn != 0:
+            print("ERROR: {} is not authenticated".format(mpin_id))
+            if PIN_ERROR:
+                time_func('err = mpin_ZZZ.kangaroo(E, F)', nIter)
+                err=mpin_ZZZ.kangaroo(E, F)
+                print("Client PIN error {} ".format(err))
+            raise SystemExit(0)
+        else:
+            print("SUCCESS: {} is authenticated".format(mpin_id))
+
+        # Client sends Z=r.ID to Server
+        if MPIN_FULL:
+            rtn, r, Z=mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)
+            if rtn != 0:
+                print("ERROR: Generating Z {}".format(rtn))
+
+        if date:
+            prHID=HTID
+        else:
+            prHID=HID
+            ut=None
+
+        # Server sends T=w.ID to client
+        if MPIN_FULL:
+            time_func(
+                'rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)',
+                nIter)
+            rtn, w, T=mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)
+            if rtn != 0:
+                print("ERROR: Generating T {}".format(rtn))
+
+            time_func(
+                'HM = mpin_ZZZ.hash_all(mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)',
+                nIter)
+            HM=mpin_ZZZ.hash_all(
+                mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
+
+            time_func(
+                'rtn, client_aes_key = mpin_ZZZ.client_key(mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)',
+                nIter)
+            rtn, client_aes_key=mpin_ZZZ.client_key(
+                mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
+            if rtn != 0:
+                print("ERROR: Generating client_aes_key {}".format(rtn))
+            print("Client AES Key: {}".format(client_aes_key.hex()))
+
+            time_func(
+                'rtn, server_aes_key = mpin_ZZZ.server_key(mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)',
+                nIter)
+            rtn, server_aes_key=mpin_ZZZ.server_key(
+                mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
+            if rtn != 0:
+                print("ERROR: Generating server_aes_key {}".format(rtn))
+            print("Server AES Key: {}".format(server_aes_key.hex()))
+
+    if MPIN_FULL:
+        plaintext="A test message"
+        print("message to encrypt: ", plaintext)
+        header_hex="1554a69ecbf04e507eb6985a234613246206c85f8af73e61ab6e2382a26f457d"
+        header=header_hex.decode("hex")
+        iv_hex="2b213af6b0edf6972bf996fb"
+        iv=iv_hex.decode("hex")
+        time_func(
+            'ciphertext, tag = mpin_ZZZ.aes_gcm_encrypt(client_aes_key, iv, header, plaintext)',
+            nIter)
+        ciphertext, tag=mpin_ZZZ.aes_gcm_encrypt(
+            client_aes_key, iv, header, plaintext)
+        print("ciphertext ", ciphertext.hex())
+        print("tag1 ", tag.hex())
+
+        time_func(
+            'plaintext2, tag2 = mpin_ZZZ.aes_gcm_decrypt(server_aes_key, iv, header, ciphertext)',
+            nIter)
+        plaintext2, tag2=mpin_ZZZ.aes_gcm_decrypt(
+            server_aes_key, iv, header, ciphertext)
+        print("decrypted message: ".format(plaintext2))
+        print("tag2 {}".format(tag2.hex()))
diff --git a/wrappers/python/bls_ZZZ.py.in b/python/bls_ZZZ.py.in
similarity index 82%
rename from wrappers/python/bls_ZZZ.py.in
rename to python/bls_ZZZ.py.in
index fe0734d..20618fc 100755
--- a/wrappers/python/bls_ZZZ.py.in
+++ b/python/bls_ZZZ.py.in
@@ -58,6 +58,8 @@
 extern int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W);
 extern int BLS_ZZZ_ADD_G1(octet *R1,octet *R2,octet *R);
 extern int BLS_ZZZ_ADD_G2(octet *W1,octet *W2,octet *W);
+extern int BLS_ZZZ_MUL_G1(octet *P,octet *R,octet *T);
+extern int BLS_ZZZ_MUL_G2(octet *P,octet *R,octet *T);
 
 
 """)
@@ -91,11 +93,10 @@
     G2LEN = 16 * BFS
 
 
-def to_hex(octet_value):
+def to_str(octet_value):
     """Converts an octet type into a string
 
-    Add all the values in an octet into an array. This arrays is then
-    converted to a string and hex encoded.
+    Add all the values in an octet into an array.
 
     Args::
 
@@ -116,7 +117,7 @@
     out = b''
     for x in val:
         out = out + x
-    return out.hex()
+    return out
 
 
 def make_octet(length, value=None):
@@ -226,15 +227,13 @@
     pk1, pk1val = make_octet(G2LEN)
     error_code = libamcl_bls_ZZZ.BLS_ZZZ_KEY_PAIR_GENERATE(rng, sk1, pk1)
 
-    sk_hex = to_hex(sk1)
-    pk_hex = to_hex(pk1)
+    sk = to_str(sk1)
+    pk = to_str(pk1)
 
     # clear memory
     libamcl_core.OCT_clear(sk1)
     libamcl_core.OCT_clear(pk1)
 
-    sk = bytes.fromhex(sk_hex)
-    pk = bytes.fromhex(pk_hex)
     return error_code, sk, pk
 
 
@@ -260,13 +259,12 @@
     signature1, signature1_val = make_octet(G1LEN)
     error_code = libamcl_bls_ZZZ.BLS_ZZZ_SIGN(signature1, message, sk1)
 
-    signature_hex = to_hex(signature1)
+    signature = to_str(signature1)
 
     # clear memory
     libamcl_core.OCT_clear(sk1)
     libamcl_core.OCT_clear(signature1)
 
-    signature = bytes.fromhex(signature_hex)
     return error_code, signature
 
 
@@ -322,14 +320,13 @@
     R1, R1_val = make_octet(G1LEN)
     error_code = libamcl_bls_ZZZ.BLS_ZZZ_ADD_G1(R11, R21, R1)
 
-    R_hex = to_hex(R1)
+    R = to_str(R1)
 
     # clear memory
     libamcl_core.OCT_clear(R11)
     libamcl_core.OCT_clear(R21)
     libamcl_core.OCT_clear(R1)
 
-    R = bytes.fromhex(R_hex)
     return error_code, R
 
 
@@ -356,17 +353,82 @@
     R1, R1_val = make_octet(G2LEN)
     error_code = libamcl_bls_ZZZ.BLS_ZZZ_ADD_G2(R11, R21, R1)
 
-    R_hex = to_hex(R1)
+    R = to_str(R1)
 
     # clear memory
     libamcl_core.OCT_clear(R11)
     libamcl_core.OCT_clear(R21)
     libamcl_core.OCT_clear(R1)
 
-    R = bytes.fromhex(R_hex)
     return error_code, R
 
 
+def mult_G1(P, R):
+    """Multiple a member from the group G1 by an integer
+
+    Multiple a member from the group G1 by an integer
+
+    Args::
+
+        P:   integer value
+        R:   member of G1
+
+    Returns::
+
+        T:          member of G1. T=P*R
+        error_code: Zero for success or else an error code
+
+    Raises:
+
+    """
+    P1, P1_val = make_octet(None, P)
+    R1, R1_val = make_octet(None, R)
+    T1, T1_val = make_octet(G1LEN)
+    error_code = libamcl_bls_ZZZ.BLS_ZZZ_MUL_G1(P1, R1, T1)
+
+    T = to_str(T1)
+
+    # clear memory
+    libamcl_core.OCT_clear(P1)
+    libamcl_core.OCT_clear(R1)
+    libamcl_core.OCT_clear(T1)
+
+    return error_code, T
+
+
+def mult_G2(P, R):
+    """Multiple a member from the group G2 by an integer
+
+    Multiple a member from the group G2 by an integer
+
+    Args::
+
+        P:   integer value
+        R:   member of G1
+
+    Returns::
+
+        T:          member of G1. T=P*R
+        error_code: Zero for success or else an error code
+
+    Raises:
+
+    """
+    P1, P1_val = make_octet(None, P)
+    R1, R1_val = make_octet(None, R)
+    T1, T1_val = make_octet(G2LEN)
+    error_code = libamcl_bls_ZZZ.BLS_ZZZ_MUL_G2(P1, R1, T1)
+
+    T = to_str(T1)
+
+    # clear memory
+    libamcl_core.OCT_clear(P1)
+    libamcl_core.OCT_clear(R1)
+    libamcl_core.OCT_clear(T1)
+
+    return error_code, T
+
+
 if __name__ == "__main__":
     # Print hex values
     DEBUG = False
@@ -480,6 +542,23 @@
         raise SystemExit(0)
     print("Success: Aggregated signature is valid")
 
+    # Multiply signature and public key
+    rtn, sigmult = mult_G1(sk1, sig123)
+    if rtn != 0:
+        print("Error: mult_G1 {}".format(rtn))
+        raise SystemExit(0)
+
+    rtn, pkmult = mult_G2(sk1, pk123)
+    if rtn != 0:
+        print("Error: mult_G2 {}".format(rtn))
+        raise SystemExit(0)
+
+    rtn = verify(sigmult, message, pkmult)
+    if rtn != 0:
+        print("Error: Invalid multiplied signature {}".format(rtn))
+        raise SystemExit(0)
+    print("Success: Multiplied signature is valid")
+
     # Clear memory
     kill_csprng(rng)
     del sk1
diff --git a/wrappers/python/mpin_ZZZ.py.in b/python/mpin_ZZZ.py.in
similarity index 84%
rename from wrappers/python/mpin_ZZZ.py.in
rename to python/mpin_ZZZ.py.in
index 944a609..6e84805 100644
--- a/wrappers/python/mpin_ZZZ.py.in
+++ b/python/mpin_ZZZ.py.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Licensed to the Apache Software Foundation (ASF) under one
@@ -129,11 +129,10 @@
 IVL = 12
 
 
-def to_hex(octet_value):
+def to_str(octet_value):
     """Converts an octet type into a string
 
-    Add all the values in an octet into an array. This arrays is then
-    converted to a string and hex encoded.
+    Add all the values in an octet into an array.
 
     Args::
 
@@ -151,7 +150,10 @@
     while i < octet_value.len:
         val.append(octet_value.val[i])
         i = i + 1
-    return ''.join(val).encode("hex")
+    out = b''
+    for x in val:
+        out = out + x
+    return out
 
 
 def make_octet(length, value=None):
@@ -288,13 +290,13 @@
     hash_mpin_id1, hash_mpin_id1_val = make_octet(PFS)
     libamcl_core.HASH_ID(hash_type, mpin_id1, hash_mpin_id1)
 
-    hash_mpin_id_hex = to_hex(hash_mpin_id1)
+    hash_mpin_id = to_str(hash_mpin_id1)
 
     # clear memory
     libamcl_core.OCT_clear(mpin_id1)
     libamcl_core.OCT_clear(hash_mpin_id1)
 
-    return hash_mpin_id_hex.decode("hex")
+    return hash_mpin_id
 
 
 def random_generate(rng):
@@ -317,12 +319,12 @@
     s1, s_val = make_octet(PGS)
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_RANDOM_GENERATE(rng, s1)
 
-    s_hex = to_hex(s1)
+    s = to_str(s1)
 
     # clear memory
     libamcl_core.OCT_clear(s1)
 
-    return error_code, s_hex.decode("hex")
+    return error_code, s
 
 
 def get_dvs_keypair(rng):
@@ -348,14 +350,14 @@
 
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_GET_DVS_KEYPAIR(rng, z, pa)
 
-    pa_hex = to_hex(pa)
-    z_hex = to_hex(z)
+    pa = to_str(pa)
+    z = to_str(z)
 
     # clear memory
     libamcl_core.OCT_clear(z)
     libamcl_core.OCT_clear(pa)
 
-    return error_code, z_hex.decode("hex"), pa_hex.decode("hex")
+    return error_code, z, pa
 
 
 def get_server_secret(master_secret):
@@ -380,13 +382,13 @@
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_GET_SERVER_SECRET(
         master_secret1, server_secret1)
 
-    server_secret_hex = to_hex(server_secret1)
+    server_secret = to_str(server_secret1)
 
     # clear memory
     libamcl_core.OCT_clear(master_secret1)
     libamcl_core.OCT_clear(server_secret1)
 
-    return error_code, server_secret_hex.decode("hex")
+    return error_code, server_secret
 
 
 def recombine_G2(W1, W2):
@@ -412,14 +414,14 @@
     w1, w1_val = make_octet(G2)
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_RECOMBINE_G2(w11, w21, w1)
 
-    w_hex = to_hex(w1)
+    w = to_str(w1)
 
     # clear memory
     libamcl_core.OCT_clear(w11)
     libamcl_core.OCT_clear(w21)
     libamcl_core.OCT_clear(w1)
 
-    return error_code, w_hex.decode("hex")
+    return error_code, w
 
 
 def get_client_secret(master_secret, hash_mpin_id):
@@ -446,14 +448,14 @@
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_GET_CLIENT_SECRET(
         master_secret1, hash_mpin_id1, client_secret1)
 
-    client_secret_hex = to_hex(client_secret1)
+    client_secret = to_str(client_secret1)
 
     # clear memory
     libamcl_core.OCT_clear(master_secret1)
     libamcl_core.OCT_clear(hash_mpin_id1)
     libamcl_core.OCT_clear(client_secret1)
 
-    return error_code, client_secret_hex.decode("hex")
+    return error_code, client_secret
 
 
 def recombine_G1(q1, q2):
@@ -479,14 +481,14 @@
     q1, q1_val = make_octet(G1)
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_RECOMBINE_G1(q11, q21, q1)
 
-    q_hex = to_hex(q1)
+    q = to_str(q1)
 
     # clear memory
     libamcl_core.OCT_clear(q11)
     libamcl_core.OCT_clear(q21)
     libamcl_core.OCT_clear(q1)
 
-    return error_code, q_hex.decode("hex")
+    return error_code, q
 
 
 def get_client_permit(hash_type, epoch_date, master_secret, hash_mpin_id):
@@ -518,14 +520,14 @@
         hash_mpin_id1,
         time_permit1)
 
-    time_permit_hex = to_hex(time_permit1)
+    time_permit = to_str(time_permit1)
 
     # clear memory
     libamcl_core.OCT_clear(master_secret1)
     libamcl_core.OCT_clear(hash_mpin_id1)
     libamcl_core.OCT_clear(time_permit1)
 
-    return error_code, time_permit_hex.decode("hex")
+    return error_code, time_permit
 
 
 def extract_pin(hash_type, mpin_id, pin, client_secret):
@@ -553,13 +555,13 @@
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_EXTRACT_PIN(
         hash_type, mpin_id1, pin, client_secret1)
 
-    client_secret_hex = to_hex(client_secret1)
+    client_secret = to_str(client_secret1)
 
     # clear memory
     libamcl_core.OCT_clear(mpin_id1)
     libamcl_core.OCT_clear(client_secret1)
 
-    return error_code, client_secret_hex.decode("hex")
+    return error_code, client_secret
 
 
 def precompute(token, hash_mpin_id):
@@ -588,8 +590,8 @@
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_PRECOMPUTE(
         token1, hash_mpin_id1, ffi.NULL, pc11, pc21)
 
-    pc1_hex = to_hex(pc11)
-    pc2_hex = to_hex(pc21)
+    pc1 = to_str(pc11)
+    pc2 = to_str(pc21)
 
     # clear memory
     libamcl_core.OCT_clear(token1)
@@ -597,7 +599,7 @@
     libamcl_core.OCT_clear(pc11)
     libamcl_core.OCT_clear(pc21)
 
-    return error_code, pc1_hex.decode("hex"), pc2_hex.decode("hex")
+    return error_code, pc1, pc2
 
 
 def client_1(hash_type, epoch_date, mpin_id, rng, x, pin, token, time_permit):
@@ -660,10 +662,10 @@
         ut1,
         time_permit1)
 
-    x_hex = to_hex(x1)
-    u_hex = to_hex(u1)
-    ut_hex = to_hex(ut1)
-    v_hex = to_hex(v1)
+    x = to_str(x1)
+    u = to_str(u1)
+    ut = to_str(ut1)
+    v = to_str(v1)
 
     # clear memory
     if time_permit:
@@ -675,8 +677,7 @@
     libamcl_core.OCT_clear(ut1)
     libamcl_core.OCT_clear(v1)
 
-    return error_code, x_hex.decode("hex"), u_hex.decode(
-        "hex"), ut_hex.decode("hex"), v_hex.decode("hex")
+    return error_code, x, u, ut, v
 
 
 def client_2(x, y, sec):
@@ -703,14 +704,14 @@
     sec1, sec1_val = make_octet(None, sec)
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_CLIENT_2(x1, y1, sec1)
 
-    sec_hex = to_hex(sec1)
+    sec = to_str(sec1)
 
     # clear memory
     libamcl_core.OCT_clear(x1)
     libamcl_core.OCT_clear(y1)
     libamcl_core.OCT_clear(sec1)
 
-    return error_code, sec_hex.decode("hex")
+    return error_code, sec
 
 
 def client(hash_type, epoch_date, mpin_id, rng, x, pin, token,
@@ -784,11 +785,11 @@
         epoch_time,
         y1)
 
-    x_hex = to_hex(x1)
-    u_hex = to_hex(u1)
-    ut_hex = to_hex(ut1)
-    v_hex = to_hex(v1)
-    y_hex = to_hex(y1)
+    x = to_str(x1)
+    u = to_str(u1)
+    ut = to_str(ut1)
+    v = to_str(v1)
+    y = to_str(y1)
 
     # clear memory
     if time_permit:
@@ -803,8 +804,7 @@
     libamcl_core.OCT_clear(v1)
     libamcl_core.OCT_clear(y1)
 
-    return error_code, x_hex.decode("hex"), u_hex.decode(
-        "hex"), ut_hex.decode("hex"), v_hex.decode("hex"), y_hex.decode("hex")
+    return error_code, x, u, ut, v, y
 
 
 def get_G1_multiple(rng, type, x, P):
@@ -842,15 +842,15 @@
     error_code = libamcl_mpin_ZZZ.MPIN_ZZZ_GET_G1_MULTIPLE(
         rng_in, type, x1, P1, W1)
 
-    x_hex = to_hex(x1)
-    W_hex = to_hex(W1)
+    x = to_str(x1)
+    W = to_str(W1)
 
     # clear memory
     libamcl_core.OCT_clear(x1)
     libamcl_core.OCT_clear(P1)
     libamcl_core.OCT_clear(W1)
 
-    return error_code, x_hex.decode("hex"), W_hex.decode("hex")
+    return error_code, x, W
 
 
 def server_1(hash_type, epoch_date, mpin_id):
@@ -882,15 +882,15 @@
     libamcl_mpin_ZZZ.MPIN_ZZZ_SERVER_1(
         hash_type, epoch_date, mpin_id1, HID1, HTID1)
 
-    HID_hex = to_hex(HID1)
-    HTID_hex = to_hex(HTID1)
+    HID = to_str(HID1)
+    HTID = to_str(HTID1)
 
     # clear memory
     libamcl_core.OCT_clear(mpin_id1)
     libamcl_core.OCT_clear(HTID1)
     libamcl_core.OCT_clear(HID1)
 
-    return HID_hex.decode("hex"), HTID_hex.decode("hex")
+    return HID, HTID
 
 
 def server_2(epoch_date, HID, HTID, y, server_secret, u, ut, v, pa):
@@ -951,8 +951,8 @@
         f1,
         pa1)
 
-    e_hex = to_hex(e1)
-    f_hex = to_hex(f1)
+    e = to_str(e1)
+    f = to_str(f1)
 
     # clear memory
     libamcl_core.OCT_clear(HID1)
@@ -965,7 +965,7 @@
     libamcl_core.OCT_clear(e1)
     libamcl_core.OCT_clear(f1)
 
-    return error_code, e_hex.decode("hex"), f_hex.decode("hex")
+    return error_code, e, f
 
 
 def server(
@@ -1049,11 +1049,11 @@
         epoch_time,
         pa1)
 
-    HID_hex = to_hex(HID1)
-    HTID_hex = to_hex(HTID1)
-    e_hex = to_hex(e1)
-    f_hex = to_hex(f1)
-    y_hex = to_hex(y1)
+    HID = to_str(HID1)
+    HTID = to_str(HTID1)
+    e = to_str(e1)
+    f = to_str(f1)
+    y = to_str(y1)
 
     # clear memory
     if message:
@@ -1069,8 +1069,7 @@
     libamcl_core.OCT_clear(f1)
     libamcl_core.OCT_clear(y1)
 
-    return error_code, HID_hex.decode("hex"), HTID_hex.decode(
-        "hex"), e_hex.decode("hex"), f_hex.decode("hex"), y_hex.decode("hex")
+    return error_code, HID, HTID, e, f, y
 
 
 def kangaroo(e, f):
@@ -1139,7 +1138,7 @@
     libamcl_core.HASH_ALL(hash_type, hash_mpin_id1,
                           u1, ut1, v1, y1, z1, t1, hm1)
 
-    hm_hex = to_hex(hm1)
+    hm = to_str(hm1)
 
     # clear memory
     if ut:
@@ -1151,7 +1150,7 @@
     libamcl_core.OCT_clear(z1)
     libamcl_core.OCT_clear(t1)
 
-    return hm_hex.decode("hex")
+    return hm
 
 
 def client_key(hash_type, pc1, pc2, pin, r, x, hm, t):
@@ -1195,7 +1194,7 @@
         t1,
         client_aes_key1)
 
-    client_aes_key_hex = to_hex(client_aes_key1)
+    client_aes_key = to_str(client_aes_key1)
 
     # clear memory
     libamcl_core.OCT_clear(pc11)
@@ -1206,7 +1205,7 @@
     libamcl_core.OCT_clear(t1)
     libamcl_core.OCT_clear(client_aes_key1)
 
-    return error_code, client_aes_key_hex.decode("hex")
+    return error_code, client_aes_key
 
 
 def server_key(hash_type, z, server_secret, w, hm, HID, u, ut):
@@ -1256,7 +1255,7 @@
         ut1,
         server_aes_key1)
 
-    server_aes_key_hex = to_hex(server_aes_key1)
+    server_aes_key = to_str(server_aes_key1)
 
     # clear memory
     if ut:
@@ -1269,7 +1268,7 @@
     libamcl_core.OCT_clear(u1)
     libamcl_core.OCT_clear(server_aes_key1)
 
-    return error_code, server_aes_key_hex.decode("hex")
+    return error_code, server_aes_key
 
 
 def aes_gcm_encrypt(aes_key, iv, header, plaintext):
@@ -1307,8 +1306,8 @@
         plaintext1,
         ciphertext1,
         tag1)
-    tag = to_hex(tag1)
-    ciphertext = to_hex(ciphertext1)
+    tag = to_str(tag1)
+    ciphertext = to_str(ciphertext1)
 
     # clear memory
     libamcl_core.OCT_clear(aes_key1)
@@ -1318,7 +1317,7 @@
     libamcl_core.OCT_clear(tag1)
     libamcl_core.OCT_clear(ciphertext1)
 
-    return ciphertext.decode("hex"), tag.decode("hex")
+    return ciphertext, tag
 
 
 def aes_gcm_decrypt(aes_key, iv, header, ciphertext):
@@ -1356,8 +1355,8 @@
         plaintext1,
         tag1)
 
-    tag = to_hex(tag1)
-    plaintext = to_hex(plaintext1)
+    tag = to_str(tag1)
+    plaintext = to_str(plaintext1)
 
     # clear memory
     libamcl_core.OCT_clear(aes_key1)
@@ -1367,7 +1366,7 @@
     libamcl_core.OCT_clear(tag1)
     libamcl_core.OCT_clear(ciphertext1)
 
-    return plaintext.decode("hex"), tag.decode("hex")
+    return plaintext, tag
 
 
 def generate_otp(rng):
@@ -1411,12 +1410,12 @@
     random_value1, random_value1_val = make_octet(length)
     libamcl_mpin_ZZZ.generateRandom(rng, random_value1)
 
-    random_value_hex = to_hex(random_value1)
+    random_value = to_str(random_value1)
 
     # clear memory
     libamcl_core.OCT_clear(random_value1)
 
-    return random_value_hex.decode("hex")
+    return random_value
 
 
 if __name__ == "__main__":
@@ -1437,127 +1436,129 @@
         date = 0
 
     # Seed
-    seedHex = "b75e7857fa17498c333d3c8d42e10f8c3cb8a66f7a84d85f86cd5acb537fa211"
-    seed = seedHex.decode("hex")
+    seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+    seed = bytes.fromhex(seed_hex)
 
     # random number generator
     rng = create_csprng(seed)
 
     # Identity
     if INPUT:
-        mpin_id = raw_input("Please enter identity:")
+        mpin_id = input("Please enter identity:")
     else:
         mpin_id = "user@milagro.com"
 
     # Hash mpin_id
-    hash_mpin_id = hash_id(HASH_TYPE_ZZZ, mpin_id)
+    hash_mpin_id = hash_id(HASH_TYPE_ZZZ, mpin_id.encode("utf-8"))
     if DEBUG:
-        print "mpin_id: %s" % mpin_id.encode("hex")
-        print "hash_mpin_id: %s" % hash_mpin_id.encode("hex")
+        print("mpin_id: {}".format(mpin_id.encode("utf-8").hex()))
+        print("hash_mpin_id: {}".format(hash_mpin_id.hex()))
 
     # Generate master secret for MILAGRO and Customer
     rtn, ms1 = random_generate(rng)
     if rtn != 0:
-        print "random_generate(rng) Error %s", rtn
+        print("random_generate(rng) Error {}".format(rtn))
     rtn, ms2 = random_generate(rng)
     if rtn != 0:
-        print "random_generate(rng) Error %s", rtn
+        print("random_generate(rng) Error {}".format(rtn))
     if DEBUG:
-        print "ms1: %s" % ms1.encode("hex")
-        print "ms2: %s" % ms2.encode("hex")
+        print("ms1: {}".format(ms1.hex()))
+        print("ms2: {}".format(ms2.hex()))
 
     # Generate server secret shares
     rtn, ss1 = get_server_secret(ms1)
     if rtn != 0:
-        print "get_server_secret(ms1) Error %s" % rtn
+        print("get_server_secret(ms1) Error {}".format(rtn))
     rtn, ss2 = get_server_secret(ms2)
     if rtn != 0:
-        print "get_server_secret(ms2) Error %s" % rtn
+        print("get_server_secret(ms2) Error {}".format(rtn))
     if DEBUG:
-        print "ss1: %s" % ss1.encode("hex")
-        print "ss2: %s" % ss2.encode("hex")
+        print("ss1: {}".format(ss1.hex()))
+        print("ss2: {}".format(ss2.hex()))
 
     # Combine server secret shares
     rtn, server_secret = recombine_G2(ss1, ss2)
     if rtn != 0:
-        print "recombine_G2(ss1, ss2) Error %s" % rtn
+        print("recombine_G2(ss1, ss2) Error {}".format(rtn))
     if DEBUG:
-        print "server_secret: %s" % server_secret.encode("hex")
+        print("server_secret: {}".format(server_secret.hex()))
 
     # Generate client secret shares
     rtn, cs1 = get_client_secret(ms1, hash_mpin_id)
     if rtn != 0:
-        print "get_client_secret(ms1, hash_mpin_id) Error %s" % rtn
+        print("get_client_secret(ms1, hash_mpin_id) Error {}".format(rtn))
     rtn, cs2 = get_client_secret(ms2, hash_mpin_id)
     if rtn != 0:
-        print "get_client_secret(ms2, hash_mpin_id) Error %s" % rtn
+        print("get_client_secret(ms2, hash_mpin_id) Error {}".format(rtn))
     if DEBUG:
-        print "cs1: %s" % cs1.encode("hex")
-        print "cs2: %s" % cs2.encode("hex")
+        print("cs1: {}".format(cs1.hex()))
+        print("cs2: {}".format(cs2.hex()))
 
     # Combine client secret shares
     rtn, client_secret = recombine_G1(cs1, cs2)
     if rtn != 0:
-        print "recombine_G1(cs1, cs2) Error %s" % rtn
-    print "Client Secret: %s" % client_secret.encode("hex")
+        print("recombine_G1(cs1, cs2) Error {}".format(rtn))
+    print("Client Secret: {}".format(client_secret.hex()))
 
     if TIME_PERMITS:
         # Generate Time Permit shares
         if DEBUG:
-            print "Date %s" % date
+            print("Date {}".format(date))
         rtn, tp1 = get_client_permit(
             HASH_TYPE_ZZZ, date, ms1, hash_mpin_id)
         if rtn != 0:
-            print "get_client_permit(HASH_TYPE_ZZZ, date, ms1, hash_mpin_id) Error %s" % rtn
+            print(
+                "get_client_permit(HASH_TYPE_ZZZ, date, ms1, hash_mpin_id) Error {}".format(rtn))
         rtn, tp2 = get_client_permit(
             HASH_TYPE_ZZZ, date, ms2, hash_mpin_id)
         if rtn != 0:
-            print "get_client_permit(HASH_TYPE_ZZZ, date, ms2, hash_mpin_id) Error %s" % rtn
+            print(
+                "get_client_permit(HASH_TYPE_ZZZ, date, ms2, hash_mpin_id) Error {}".format(rtn))
         if DEBUG:
-            print "tp1: %s" % tp1.encode("hex")
-            print "tp2: %s" % tp2.encode("hex")
+            print("tp1: {}".format(tp1.hex()))
+            print("tp2: {}".format(tp2.hex()))
 
         # Combine Time Permit shares
         rtn, time_permit = recombine_G1(tp1, tp2)
         if rtn != 0:
-            print "recombine_G1(tp1, tp2) Error %s" % rtn
+            print("recombine_G1(tp1, tp2) Error {}".format(rtn))
         if DEBUG:
-            print "time_permit: %s" % time_permit.encode("hex")
+            print("time_permit: {}".format(time_permit.hex()))
     else:
         time_permit = None
 
     # Client extracts PIN from secret to create Token
     if INPUT:
-        PIN = int(
-            raw_input("Please enter four digit PIN to create M-Pin Token:"))
+        PIN = int(input("Please enter four digit PIN to create M-Pin Token:"))
     else:
         PIN = 1234
-    rtn, token = extract_pin(HASH_TYPE_ZZZ, mpin_id, PIN, client_secret)
+    rtn, token = extract_pin(
+        HASH_TYPE_ZZZ, mpin_id.encode("utf-8"), PIN, client_secret)
     if rtn != 0:
-        print "extract_pin(HASH_TYPE_ZZZ, mpin_id, PIN, token) Error %s" % rtn
-    print "Token: %s" % token.encode("hex")
+        print("extract_pin(HASH_TYPE_ZZZ, mpin_id, PIN, token) Error {}".format(rtn))
+    print("Token: {}".format(token.hex()))
 
     if ONE_PASS:
-        print "M-Pin One Pass"
+        print("M-Pin One Pass")
         if INPUT:
-            PIN = int(raw_input("Please enter PIN to authenticate:"))
+            PIN = int(input("Please enter PIN to authenticate:"))
         else:
             PIN = 1234
         epoch_time = get_time()
         if DEBUG:
-            print "epoch_time %s" % epoch_time
+            print("epoch_time {}".format(epoch_time))
 
         # Client precomputation
         if MPIN_ZZZ_FULL:
             rtn, pc1, pc2 = precompute(token, hash_mpin_id)
 
         # Client MPIN
-        rtn, x, u, ut, v, y = client(
-            HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit, None, epoch_time)
+        rtn, x, u, ut, v, y = client(HASH_TYPE_ZZZ, date, mpin_id.encode(
+            "utf-8"), rng, None, PIN, token, time_permit, None, epoch_time)
         if DEBUG:
-            print "y1 ", y.encode("hex")
+            print("y1 {}".format(y.hex()))
         if rtn != 0:
-            print "MPIN_ZZZ_CLIENT ERROR %s" % rtn
+            print("MPIN_ZZZ_CLIENT ERROR {}".format(rtn))
 
         # Client sends Z=r.ID to Server
         if MPIN_ZZZ_FULL:
@@ -1565,17 +1566,17 @@
 
         # Server MPIN
         rtn, HID, HTID, E, F, y2 = server(
-            HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id, None, epoch_time, None)
+            HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id.encode("utf-8"), None, epoch_time, None)
         if DEBUG:
-            print "y2 ", y2.encode("hex")
+            print("y2 {}".format(y2.hex()))
         if rtn != 0:
-            print "ERROR: %s is not authenticated" % mpin_id
+            print("ERROR: {} is not authenticated".format(mpin_id))
             if PIN_ERROR:
                 err = kangaroo(E, F)
-                print "Client PIN error %d " % err
+                print("Client PIN error {} ".format(err))
             raise SystemExit(0)
         else:
-            print "SUCCESS: %s is authenticated" % mpin_id
+            print("SUCCESS: {} is authenticated".format(mpin_id))
 
         if date:
             prHID = HTID
@@ -1587,7 +1588,7 @@
         if MPIN_ZZZ_FULL:
             rtn, w, T = get_G1_multiple(rng, 0, None, prHID)
             if rtn != 0:
-                print "ERROR: Generating T %s" % rtn
+                print("ERROR: Generating T {}".format(rtn))
 
         if MPIN_ZZZ_FULL:
             HM = hash_all(HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
@@ -1595,64 +1596,64 @@
             rtn, client_aes_key = client_key(
                 HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
             if rtn != 0:
-                print "ERROR: Generating client_aes_key %s" % rtn
-            print "Client AES Key: %s" % client_aes_key.encode("hex")
+                print("ERROR: Generating client_aes_key {}".format(rtn))
+            print("Client AES Key: {}".format(client_aes_key.hex()))
 
             rtn, server_aes_key = server_key(
                 HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
             if rtn != 0:
-                print "ERROR: Generating server_aes_key %s" % rtn
-            print "Server AES Key: %s" % server_aes_key.encode("hex")
+                print("ERROR: Generating server_aes_key {}".format(rtn))
+            print("Server AES Key: {}".format(server_aes_key.hex()))
 
     else:
-        print "M-Pin Three Pass"
+        print("M-Pin Three Pass")
         if INPUT:
-            PIN = int(raw_input("Please enter PIN to authenticate:"))
+            PIN = int(input("Please enter PIN to authenticate:"))
         else:
             PIN = 1234
         if MPIN_ZZZ_FULL:
             rtn, pc1, pc2 = precompute(token, hash_mpin_id)
             if rtn != 0:
-                print "precompute(token, hash_mpin_id) ERROR %s" % rtn
+                print("precompute(token, hash_mpin_id) ERROR {}".format(rtn))
 
         # Client first pass
-        rtn, x, u, ut, sec = client_1(
-            HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit)
+        rtn, x, u, ut, sec = client_1(HASH_TYPE_ZZZ, date, mpin_id.encode(
+            "utf-8"), rng, None, PIN, token, time_permit)
         if rtn != 0:
-            print "client_1  ERROR %s" % rtn
+            print("client_1  ERROR {}".format(rtn))
         if DEBUG:
-            print "x: %s" % x.encode("hex")
+            print("x: {}".format(x.hex()))
 
         # Server calculates H(ID) and H(T|H(ID)) (if time permits enabled),
         # and maps them to points on the curve HID and HTID resp.
-        HID, HTID = server_1(HASH_TYPE_ZZZ, date, mpin_id)
+        HID, HTID = server_1(HASH_TYPE_ZZZ, date, mpin_id.encode("utf-8"))
 
         # Server generates Random number y and sends it to Client
         rtn, y = random_generate(rng)
         if rtn != 0:
-            print "random_generate(rng) Error %s" % rtn
+            print("random_generate(rng) Error {}".format(rtn))
 
         # Client second pass
         rtn, v = client_2(x, y, sec)
         if rtn != 0:
-            print "client_2(x, y, sec) Error %s" % rtn
+            print("client_2(x, y, sec) Error {}".format(rtn))
 
         # Server second pass
         rtn, E, F = server_2(date, HID, HTID, y, server_secret, u, ut, v, None)
         if rtn != 0:
-            print "ERROR: %s is not authenticated" % mpin_id
+            print("ERROR: {} is not authenticated".format(mpin_id))
             if PIN_ERROR:
                 err = kangaroo(E, F)
-                print "Client PIN error %d " % err
+                print("Client PIN error {}".format(err))
             raise SystemExit(0)
         else:
-            print "SUCCESS: %s is authenticated" % mpin_id
+            print("SUCCESS: {} is authenticated".format(mpin_id))
 
         # Client sends Z=r.ID to Server
         if MPIN_ZZZ_FULL:
             rtn, r, Z = get_G1_multiple(rng, 1, None, hash_mpin_id)
             if rtn != 0:
-                print "ERROR: Generating Z %s" % rtn
+                print("ERROR: Generating Z {}".format(rtn))
 
         if date:
             prHID = HTID
@@ -1664,38 +1665,38 @@
         if MPIN_ZZZ_FULL:
             rtn, w, T = get_G1_multiple(rng, 0, None, prHID)
             if rtn != 0:
-                print "ERROR: Generating T %s" % rtn
+                print("ERROR: Generating T {}".format(rtn))
 
             HM = hash_all(HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
 
             rtn, client_aes_key = client_key(
                 HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
             if rtn != 0:
-                print "ERROR: Generating client_aes_key %s" % rtn
-            print "Client AES Key: %s" % client_aes_key.encode("hex")
+                print("ERROR: Generating client_aes_key {}".format(rtn))
+            print("Client AES Key: {}".format(client_aes_key.hex()))
 
             rtn, server_aes_key = server_key(
                 HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
             if rtn != 0:
-                print "ERROR: Generating server_aes_key %s" % rtn
-            print "Server AES Key: %s" % server_aes_key.encode("hex")
+                print("ERROR: Generating server_aes_key {}".format(rtn))
+            print("Server AES Key: {}".format(server_aes_key.hex()))
 
     if MPIN_ZZZ_FULL:
         plaintext = "A test message"
-        print "message to encrypt: ", plaintext
+        print("message to encrypt: {}".format(plaintext))
         header_hex = "1554a69ecbf04e507eb6985a234613246206c85f8af73e61ab6e2382a26f457d"
-        header = header_hex.decode("hex")
+        header = bytes.fromhex(header_hex)
         iv_hex = "2b213af6b0edf6972bf996fb"
-        iv = iv_hex.decode("hex")
+        iv = bytes.fromhex(iv_hex)
         ciphertext, tag = aes_gcm_encrypt(
-            client_aes_key, iv, header, plaintext)
-        print "ciphertext ", ciphertext.encode("hex")
-        print "tag1 ", tag.encode("hex")
+            client_aes_key, iv, header, plaintext.encode("utf-8"))
+        print("ciphertext {}".format(ciphertext.hex()))
+        print("tag1 {}".format(tag.hex()))
 
         plaintext2, tag2 = aes_gcm_decrypt(
             server_aes_key, iv, header, ciphertext)
-        print "decrypted message: ", plaintext2
-        print "tag2 ", tag2.encode("hex")
+        print("decrypted message: {}".format(plaintext2.decode("utf-8")))
+        print("tag2 {}".format(tag2.hex()))
 
     # Clear memory
     del seed
diff --git a/wrappers/python/wcc_ZZZ.py.in b/python/wcc_ZZZ.py.in
similarity index 72%
rename from wrappers/python/wcc_ZZZ.py.in
rename to python/wcc_ZZZ.py.in
index 3ab6611..d899eea 100644
--- a/wrappers/python/wcc_ZZZ.py.in
+++ b/python/wcc_ZZZ.py.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Licensed to the Apache Software Foundation (ASF) under one
@@ -103,7 +103,7 @@
 IVL = 12
 
 
-def toHex(octetValue):
+def to_hex(octet_value):
     """Converts an octet type into a string
 
     Add all the values in an octet into an array. This arrays is then
@@ -111,7 +111,7 @@
 
     Args::
 
-        octetValue. An octet type
+        octet_value. An octet pointer type
 
     Returns::
 
@@ -122,10 +122,13 @@
     """
     i = 0
     val = []
-    while i < octetValue[0].len:
-        val.append(octetValue[0].val[i])
+    while i < octet_value.len:
+        val.append(octet_value.val[i])
         i = i + 1
-    return ''.join(val).encode("hex")
+    out = b''
+    for x in val:
+        out = out + x
+    return out.hex()
 
 
 if __name__ == "__main__":
@@ -133,8 +136,8 @@
     DEBUG = False
 
     # Seed
-    seedHex = "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"
-    seed = seedHex.decode("hex")
+    seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
+    seed = bytes.fromhex(seed_hex)
 
     # Master Secret Shares
     MS1 = ffi.new("octet*")
@@ -150,12 +153,13 @@
     MS2[0].len = PGS
 
     # Alice Identity
-    alice_id = raw_input("Please enter Alice's identity:")
+    alice_id = input("Please enter Alice's identity:")
+    alice_id_b = alice_id.encode("utf-8")
     IdA = ffi.new("octet*")
-    IdAval = ffi.new("char [%s]" % len(alice_id), alice_id)
+    IdAval = ffi.new("char [%s]" % len(alice_id_b), alice_id_b)
     IdA[0].val = IdAval
-    IdA[0].max = len(alice_id)
-    IdA[0].len = len(alice_id)
+    IdA[0].max = len(alice_id_b)
+    IdA[0].len = len(alice_id_b)
 
     # Hash value of IdA
     HIdA = ffi.new("octet*")
@@ -165,12 +169,13 @@
     HIdA[0].len = PFS
 
     # Bob Identity
-    bob_id = raw_input("Please enter Bob's identity:")
+    bob_id = input("Please enter Bob's identity:")
+    bob_id_b = bob_id.encode("utf-8")
     IdB = ffi.new("octet*")
-    IdBval = ffi.new("char [%s]" % len(bob_id), bob_id)
+    IdBval = ffi.new("char [%s]" % len(bob_id_b), bob_id_b)
     IdB[0].val = IdBval
-    IdB[0].max = len(bob_id)
-    IdB[0].len = len(bob_id)
+    IdB[0].max = len(bob_id_b)
+    IdB[0].len = len(bob_id_b)
 
     # Hash value of IdB
     HIdB = ffi.new("octet*")
@@ -285,7 +290,7 @@
     SEED[0].len = len(seed)
     SEED[0].max = len(seed)
     if DEBUG:
-        print "SEED: %s" % toHex(SEED)
+        print("SEED: %s" % to_hex(SEED))
 
     # random number generator
     RNG = ffi.new("csprng*")
@@ -294,105 +299,114 @@
     # Hash IdA
     libamcl_core.HASH_ID(HASH_TYPE_ZZZ, IdA, HIdA)
     if DEBUG:
-        print "IdA: %s" % toHex(IdA)
-        print "HIdA: %s" % toHex(HIdA)
+        print("IdA: {}".format(to_hex(IdA)))
+        print("HIdA: {}".format(to_hex(HIdA)))
 
     # Hash IdB
     libamcl_core.HASH_ID(HASH_TYPE_ZZZ, IdB, HIdB)
     if DEBUG:
-        print "IdB: %s" % toHex(IdB)
-        print "HIdB: %s" % toHex(HIdB)
+        print("IdB: {}".format(to_hex(IdB)))
+        print("HIdB: {}".format(to_hex(HIdB)))
 
     # Generate master secret for MILAGRO and Customer
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG, MS1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,MS1) Error %s", rtn
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,MS1) Error {}".format(rtn))
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG, MS2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,MS2) Error %s" % rtn
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,MS2) Error {}".format(rtn))
     if DEBUG:
-        print "MS1: %s" % toHex(MS1)
-        print "MS2: %s" % toHex(MS2)
+        print("MS1: {}".format(to_hex(MS1)))
+        print("MS2: {}".format(to_hex(MS2)))
 
     # Generate Alice's sender key shares
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS1, HIdA, A1KeyG1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS1,HIdA,A1KeyG1) Error %s" % rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS1,HIdA,A1KeyG1) Error {}".format(rtn))
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS2, HIdA, A2KeyG1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS2,HIdA,A2KeyG1) Error %s" % rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(MS2,HIdA,A2KeyG1) Error {}".format(rtn))
     if DEBUG:
-        print "A1KeyG1: %s" % toHex(A1KeyG1)
-        print "A2KeyG1: %s" % toHex(A2KeyG1)
+        print("A1KeyG1: {}".format(to_hex(A1KeyG1)))
+        print("A2KeyG1: {}".format(to_hex(A2KeyG1)))
 
     # Combine Alices's sender key shares
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G1(A1KeyG1, A2KeyG1, AKeyG1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G1(A1KeyG1, A2KeyG1, AKeyG1) Error %s" % rtn
-    print "AKeyG1: %s" % toHex(AKeyG1)
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G1(A1KeyG1, A2KeyG1, AKeyG1) Error {}".format(rtn))
+    print("AKeyG1: {}".format(to_hex(AKeyG1)))
 
     # Generate Bob's receiver secret key shares
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS1, HIdB, B1KeyG2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS1,HIdB,B1KeyG2) Error %s" % rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS1,HIdB,B1KeyG2) Error {}".format(rtn))
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS2, HIdB, B2KeyG2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS2,HIdB,B2KeyG2) Error %s" % rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(MS2,HIdB,B2KeyG2) Error {}".format(rtn))
     if DEBUG:
-        print "B1KeyG2: %s" % toHex(B1KeyG2)
-        print "B2KeyG2: %s" % toHex(B2KeyG2)
+        print("B1KeyG2: {}".format(to_hex(B1KeyG2)))
+        print("B2KeyG2: {}".format(to_hex(B2KeyG2)))
 
     # Combine Bobs's receiver secret key shares
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G2(B1KeyG2, B2KeyG2, BKeyG2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G2(B1KeyG2, B2KeyG2, BKeyG2) Error %s" % rtn
-    print "BKeyG2: %s" % toHex(BKeyG2)
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_RECOMBINE_G2(B1KeyG2, B2KeyG2, BKeyG2) Error {}".format(rtn))
+    print("BKeyG2: {}".format(to_hex(BKeyG2)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG, X)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,X) Error %s", rtn
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,X) Error {}".format(rtn))
     if DEBUG:
-        print "X: %s" % toHex(X)
+        print("X: {}".format(to_hex(X)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(X, HIdA, PaG1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(X,HIdA,PaG1) Error %s", rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(X,HIdA,PaG1) Error {}".format(rtn))
     if DEBUG:
-        print "PaG1: %s" % toHex(PaG1)
+        print("PaG1: {}".format(to_hex(PaG1)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG, W)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,W) Error %s", rtn
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,W) Error {}".format(rtn))
     if DEBUG:
-        print "W: %s" % toHex(W)
+        print("W: {}".format(to_hex(W)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(W, HIdA, PgG1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(W, HIdA, PgG1) Error %s", rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G1_MULTIPLE(W, HIdA, PgG1) Error {}".format(rtn))
     if DEBUG:
-        print "PgG1: %s" % toHex(PgG1)
+        print("PgG1: {}".format(to_hex(PgG1)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG, Y)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,Y) Error %s", rtn
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RANDOM_GENERATE(RNG,Y) Error {}".format(rtn))
     if DEBUG:
-        print "Y: %s" % toHex(Y)
+        print("Y: {}".format(to_hex(Y)))
 
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(Y, HIdB, PbG2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(Y, HIdB, PbG2) Error %s", rtn
+        print(
+            "libamcl_wcc_ZZZ.WCC_ZZZ_GET_G2_MULTIPLE(Y, HIdB, PbG2) Error {}".format(rtn))
     if DEBUG:
-        print "PbG2: %s" % toHex(PbG2)
+        print("PbG2: {}".format(to_hex(PbG2)))
 
     # PIA = Hq(PaG1,PbG2,PgG1,IdB)
     libamcl_wcc_ZZZ.WCC_ZZZ_Hq(HASH_TYPE_ZZZ, PaG1, PbG2, PgG1, IdB, PIA)
     if DEBUG:
-        print "PIA: %s" % toHex(PIA)
+        print("PIA: {}".format(to_hex(PIA)))
 
     # PIB = Hq(PbG2,PaG1,PgG1,IdA)
     libamcl_wcc_ZZZ.WCC_ZZZ_Hq(HASH_TYPE_ZZZ, PbG2, PaG1, PgG1, IdA, PIB)
     if DEBUG:
-        print "PIB: %s" % toHex(PIB)
+        print("PIB: {}".format(to_hex(PIB)))
 
     # Alice calculates AES Key
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_SENDER_KEY(
@@ -406,8 +420,8 @@
         IdB,
         KEY1)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_SENDER_KEY(HASH_TYPE_ZZZ, X, PIA, PIB, PbG2, PgG1, AKeyG1, IdB, KEY1) Error %s" % rtn
-    print "{0}'s AES Key: {1}".format(alice_id, toHex(KEY1))
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_SENDER_KEY(HASH_TYPE_ZZZ, X, PIA, PIB, PbG2, PgG1, AKeyG1, IdB, KEY1) Error {}".format(rtn))
+    print("{}'s AES Key: {}".format(alice_id, to_hex(KEY1)))
 
     # Bob calculates AES Key
     rtn = libamcl_wcc_ZZZ.WCC_ZZZ_RECEIVER_KEY(
@@ -422,7 +436,7 @@
         IdA,
         KEY2)
     if rtn != 0:
-        print "libamcl_wcc_ZZZ.WCC_ZZZ_RECEIVER_KEY(HASH_TYPE_ZZZ, Y, W, PIA, PIB, PaG1, PgG1, BKeyG2, IdA, KEY2) Error %s" % rtn
-    print "{0}'s AES Key: {1}".format(bob_id, toHex(KEY2))
+        print("libamcl_wcc_ZZZ.WCC_ZZZ_RECEIVER_KEY(HASH_TYPE_ZZZ, Y, W, PIA, PIB, PaG1, PgG1, BKeyG2, IdA, KEY2) Error {}".format(rtn))
+    print("{}'s AES Key: {}".format(bob_id, to_hex(KEY2)))
 
     libamcl_core.KILL_CSPRNG(RNG)
diff --git a/src/big.c.in b/src/big.c.in
index 3af1912..3a7980b 100644
--- a/src/big.c.in
+++ b/src/big.c.in
@@ -1387,6 +1387,90 @@
     else return -1;
 }
 
+/* Arazi and Qi inversion mod 256 */
+static int invmod256(int a)
+{
+    int U,t1,t2,b,c;
+    t1=0;
+    c=(a>>1)&1;
+    t1+=c;
+    t1&=1;
+    t1=2-t1;
+    t1<<=1;
+    U=t1+1;
+
+// i=2
+    b=a&3;
+    t1=U*b;
+    t1>>=2;
+    c=(a>>2)&3;
+    t2=(U*c)&3;
+    t1+=t2;
+    t1*=U;
+    t1&=3;
+    t1=4-t1;
+    t1<<=2;
+    U+=t1;
+
+// i=4
+    b=a&15;
+    t1=U*b;
+    t1>>=4;
+    c=(a>>4)&15;
+    t2=(U*c)&15;
+    t1+=t2;
+    t1*=U;
+    t1&=15;
+    t1=16-t1;
+    t1<<=4;
+    U+=t1;
+
+    return U;
+}
+
+/* a=1/a mod 2^BIGBITS. This is very fast! */
+void BIG_XXX_invmod2m(BIG_XXX a)
+{
+    int i;
+    BIG_XXX U,t1,b,c;
+    BIG_XXX_zero(U);
+    BIG_XXX_inc(U,invmod256(BIG_XXX_lastbits(a,8)));
+    for (i=8; i<BIGBITS_XXX; i<<=1)
+    {
+        BIG_XXX_norm(U);
+        BIG_XXX_copy(b,a);
+        BIG_XXX_mod2m(b,i);   // bottom i bits of a
+
+        BIG_XXX_smul(t1,U,b);
+        BIG_XXX_shr(t1,i); // top i bits of U*b
+
+        BIG_XXX_copy(c,a);
+        BIG_XXX_shr(c,i);
+        BIG_XXX_mod2m(c,i); // top i bits of a
+
+        BIG_XXX_smul(b,U,c);
+        BIG_XXX_mod2m(b,i);  // bottom i bits of U*c
+
+        BIG_XXX_add(t1,t1,b);
+        BIG_XXX_norm(t1);
+        BIG_XXX_smul(b,t1,U);
+        BIG_XXX_copy(t1,b);  // (t1+b)*U
+        BIG_XXX_mod2m(t1,i);				// bottom i bits of (t1+b)*U
+
+        BIG_XXX_one(b);
+        BIG_XXX_shl(b,i);
+        BIG_XXX_sub(t1,b,t1);
+        BIG_XXX_norm(t1);
+
+        BIG_XXX_shl(t1,i);
+
+        BIG_XXX_add(U,U,t1);
+    }
+    BIG_XXX_copy(a,U);
+    BIG_XXX_norm(a);
+    BIG_XXX_mod2m(a,BIGBITS_XXX);
+}
+
 /* Set r=1/a mod p. Binary method */
 /* SU= 240 */
 void BIG_XXX_invmodp(BIG_XXX r,BIG_XXX a,BIG_XXX p)
diff --git a/src/bls.c.in b/src/bls.c.in
index 6cfe38c..94e6061 100644
--- a/src/bls.c.in
+++ b/src/bls.c.in
@@ -25,15 +25,87 @@
 #include <time.h>
 #include "bls_ZZZ.h"
 
-/* hash a message to an ECP point, using SHA3 */
-static void BLS_HASHIT(ECP_ZZZ *P,char *m)
+// Polynomial interpolation coefficients
+static void recover_coefficients(int k, octet* X, BIG_XXX* coefs)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX x2[k];
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(x2[i],X[i].val);
+    }
+
+    // Compute numerators in place using partial products
+    // to achieve it in O(n)
+    // c_i = x_0 * ... * x_(i-1) * x_(i+1) * ... * x_(k-1)
+
+    // Compute partial left products
+    // leave c_0 alone since it only has a right partial product
+    BIG_XXX_copy(coefs[1], x2[0]);
+
+    for(int i=2; i < k; i++)
+    {
+        // lp_i = x_0 * ... * x_(i-1) = lp_(i-1) * x_(i-1)
+        BIG_XXX_modmul(coefs[i], coefs[i-1], x2[i-1], r);
+    }
+
+    // Compute partial right products and combine
+
+    // Store partial right products in c_0 so at the end
+    // of the procedure c_0 = x_1 * ... x_(k-1)
+    BIG_XXX_copy(coefs[0], x2[k-1]);
+
+    for(int i=k-2; i > 0; i--)
+    {
+        // c_i = lp_i * rp_i
+        BIG_XXX_modmul(coefs[i], coefs[i], coefs[0], r);
+
+        // rp_(i-1) = x_i * ... * x_k = x_i * rp_i
+        BIG_XXX_modmul(coefs[0], coefs[0], x2[i], r);
+    }
+
+    BIG_XXX cneg;
+    BIG_XXX denominator;
+    BIG_XXX s;
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_one(denominator);
+
+        // cneg = -x_i mod r
+        BIG_XXX_sub(cneg, r, x2[i]);
+
+        for(int j=0; j<k; j++)
+        {
+            if (i != j)
+            {
+                // denominator = denominator * (x_j - x_i)
+                BIG_XXX_add(s,x2[j],cneg);
+                BIG_XXX_modmul(denominator,denominator,s,r);
+            }
+        }
+
+        BIG_XXX_moddiv(coefs[i], coefs[i], denominator, r);
+    }
+}
+
+/* hash a message, M, to an ECP point, using SHA3 */
+static void BLS_HASHIT(ECP_ZZZ *P,octet *M)
 {
     int i;
+    int j;
     sha3 hs;
     char h[MODBYTES_XXX];
     octet HM= {0,sizeof(h),h};
     SHA3_init(&hs,SHAKE256);
-    for (i=0; m[i]!=0; i++) SHA3_process(&hs,m[i]);
+    for (i=0; i<M->len; i++)
+    {
+        j = (unsigned char) M->val[i];
+        SHA3_process(&hs,j);
+    }
     SHA3_shake(&hs,HM.val,MODBYTES_XXX);
     HM.len=MODBYTES_XXX;
     ECP_ZZZ_mapit(P,&HM);
@@ -61,29 +133,31 @@
 
     PAIR_ZZZ_G2mul(&G,s);
     ECP2_ZZZ_toOctet(W,&G);
+
     return BLS_OK;
 }
 
-/* Sign message m using private key S to produce signature SIG */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S)
+/* Sign message M using private key S to produce signature SIG */
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S)
 {
     BIG_XXX s;
     ECP_ZZZ D;
-    BLS_HASHIT(&D,m);
+    BLS_HASHIT(&D,M);
     BIG_XXX_fromBytes(s,S->val);
     PAIR_ZZZ_G1mul(&D,s);
     // compress output
     ECP_ZZZ_toOctet(SIG,&D,true);
+
     return BLS_OK;
 }
 
-/* Verify signature of message m, the signature SIG, and the public key W */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W)
+/* Verify signature of message M, the signature SIG, and the public key W */
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W)
 {
     FP12_YYY v;
     ECP2_ZZZ G,PK;
     ECP_ZZZ D,HM;
-    BLS_HASHIT(&HM,m);
+    BLS_HASHIT(&HM,M);
 
     if (!ECP_ZZZ_fromOctet(&D,SIG))
     {
@@ -151,3 +225,126 @@
 
     return BLS_OK;
 }
+
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    // Generate polynomial: f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+    BIG_XXX poly[k];
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_randomnum(poly[i],r,RNG);
+    }
+
+    // Use predefined secret
+    if (SKI != NULL)
+    {
+        BIG_XXX_fromBytes(poly[0],SKI->val);
+    }
+
+    /* Calculate f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+       a0 is the secret */
+    BIG_XXX x;
+    BIG_XXX_zero(x);
+
+    BIG_XXX y;
+
+    for(int j=0; j<n; j++)
+    {
+        BIG_XXX_inc(x,1);
+
+        // Output X shares
+        BIG_XXX_toBytes(X[j].val,x);
+        X[j].len = MODBYTES_XXX;
+
+        // y is the accumulator
+        BIG_XXX_zero(y);
+
+        for(int i=k-1; i>=0; i--)
+        {
+            BIG_XXX_modmul(y,y,x,r);
+            BIG_XXX_add(y,y,poly[i]);
+        }
+
+        // Normalise input for comp
+        BIG_XXX_norm(y);
+        if(BIG_XXX_comp(y,r) == 1)
+        {
+            BIG_XXX_sub(y,y,r);
+        }
+
+        // Output Y shares
+        BIG_XXX_toBytes(Y[j].val,y);
+        Y[j].len = MODBYTES_XXX;
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SKO->val,poly[0]);
+    SKO->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX y;
+    BIG_XXX coefs[k];
+
+    BIG_XXX secret;
+    BIG_XXX prod;
+    BIG_XXX_zero(secret);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(y,Y[i].val);
+
+        BIG_XXX_modmul(prod,y,coefs[i],r);
+        BIG_XXX_add(secret, secret, prod);
+
+        // Normalise input for comp
+        BIG_XXX_norm(secret);
+        if (BIG_XXX_comp(secret,r) == 1)
+        {
+            BIG_XXX_sub(secret,secret,r);
+        }
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SK->val,secret);
+    SK->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG)
+{
+    BIG_XXX coefs[k];
+    ECP_ZZZ y;
+
+    ECP_ZZZ sig;
+    ECP_ZZZ_inf(&sig);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        if (!ECP_ZZZ_fromOctet(&y,&Y[i]))
+        {
+            return BLS_INVALID_G1;
+        }
+
+        PAIR_ZZZ_G1mul(&y,coefs[i]);
+        ECP_ZZZ_add(&sig,&y);
+    }
+
+    ECP_ZZZ_toOctet(SIG, &sig, true);
+
+    return BLS_OK;
+}
diff --git a/src/bls192.c.in b/src/bls192.c.in
index 3857f10..6058456 100644
--- a/src/bls192.c.in
+++ b/src/bls192.c.in
@@ -25,15 +25,87 @@
 #include <time.h>
 #include "bls192_ZZZ.h"
 
-/* hash a message to an ECP point, using SHA3 */
-static void BLS_HASHIT(ECP_ZZZ *P,char *m)
+// Polynomial interpolation coefficients
+static void recover_coefficients(int k, octet* X, BIG_XXX* coefs)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX x2[k];
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(x2[i],X[i].val);
+    }
+
+    // Compute numerators in place using partial products
+    // to achieve it in O(n)
+    // c_i = x_0 * ... * x_(i-1) * x_(i+1) * ... * x_(k-1)
+
+    // Compute partial left products
+    // leave c_0 alone since it only has a right partial product
+    BIG_XXX_copy(coefs[1], x2[0]);
+
+    for(int i=2; i < k; i++)
+    {
+        // lp_i = x_0 * ... * x_(i-1) = lp_(i-1) * x_(i-1)
+        BIG_XXX_modmul(coefs[i], coefs[i-1], x2[i-1], r);
+    }
+
+    // Compute partial right products and combine
+
+    // Store partial right products in c_0 so at the end
+    // of the procedure c_0 = x_1 * ... x_(k-1)
+    BIG_XXX_copy(coefs[0], x2[k-1]);
+
+    for(int i=k-2; i > 0; i--)
+    {
+        // c_i = lp_i * rp_i
+        BIG_XXX_modmul(coefs[i], coefs[i], coefs[0], r);
+
+        // rp_(i-1) = x_i * ... * x_k = x_i * rp_i
+        BIG_XXX_modmul(coefs[0], coefs[0], x2[i], r);
+    }
+
+    BIG_XXX cneg;
+    BIG_XXX denominator;
+    BIG_XXX s;
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_one(denominator);
+
+        // cneg = -x_i mod r
+        BIG_XXX_sub(cneg, r, x2[i]);
+
+        for(int j=0; j<k; j++)
+        {
+            if (i != j)
+            {
+                // denominator = denominator * (x_j - x_i)
+                BIG_XXX_add(s,x2[j],cneg);
+                BIG_XXX_modmul(denominator,denominator,s,r);
+            }
+        }
+
+        BIG_XXX_moddiv(coefs[i], coefs[i], denominator, r);
+    }
+}
+
+/* hash a message, M, to an ECP point, using SHA3 */
+static void BLS_HASHIT(ECP_ZZZ *P,octet *M)
 {
     int i;
+    int j;
     sha3 hs;
     char h[MODBYTES_XXX];
     octet HM= {0,sizeof(h),h};
     SHA3_init(&hs,SHAKE256);
-    for (i=0; m[i]!=0; i++) SHA3_process(&hs,m[i]);
+    for (i=0; i<M->len; i++)
+    {
+        j = (unsigned char) M->val[i];
+        SHA3_process(&hs,j);
+    }
     SHA3_shake(&hs,HM.val,MODBYTES_XXX);
     HM.len=MODBYTES_XXX;
     ECP_ZZZ_mapit(P,&HM);
@@ -61,28 +133,30 @@
 
     PAIR_ZZZ_G2mul(&G,s);
     ECP4_ZZZ_toOctet(W,&G);
+
     return BLS_OK;
 }
 
-/* Sign message m using private key S to produce signature SIG */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S)
+/* Sign message M using private key S to produce signature SIG */
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S)
 {
     BIG_XXX s;
     ECP_ZZZ D;
-    BLS_HASHIT(&D,m);
+    BLS_HASHIT(&D,M);
     BIG_XXX_fromBytes(s,S->val);
     PAIR_ZZZ_G1mul(&D,s);
     ECP_ZZZ_toOctet(SIG,&D,true); /* compress output */
+
     return BLS_OK;
 }
 
-/* Verify signature given message m, the signature SIG, and the public key W */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W)
+/* Verify signature given message M, the signature SIG, and the public key W */
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W)
 {
     FP24_YYY v;
     ECP4_ZZZ G,PK;
     ECP_ZZZ D,HM;
-    BLS_HASHIT(&HM,m);
+    BLS_HASHIT(&HM,M);
 
     if (!ECP_ZZZ_fromOctet(&D,SIG))
     {
@@ -104,6 +178,7 @@
     {
         return BLS_FAIL;
     }
+
     return BLS_OK;
 }
 
@@ -151,3 +226,126 @@
 
     return BLS_OK;
 }
+
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    // Generate polynomial: f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+    BIG_XXX poly[k];
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_randomnum(poly[i],r,RNG);
+    }
+
+    // Use predefined secret
+    if (SKI != NULL)
+    {
+        BIG_XXX_fromBytes(poly[0],SKI->val);
+    }
+
+    /* Calculate f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+       a0 is the secret */
+    BIG_XXX x;
+    BIG_XXX_zero(x);
+
+    BIG_XXX y;
+
+    for(int j=0; j<n; j++)
+    {
+        BIG_XXX_inc(x,1);
+
+        // Output X shares
+        BIG_XXX_toBytes(X[j].val,x);
+        X[j].len = MODBYTES_XXX;
+
+        // y is the accumulator
+        BIG_XXX_zero(y);
+
+        for(int i=k-1; i>=0; i--)
+        {
+            BIG_XXX_modmul(y,y,x,r);
+            BIG_XXX_add(y,y,poly[i]);
+        }
+
+        // Normalise input for comp
+        BIG_XXX_norm(y);
+        if(BIG_XXX_comp(y,r) == 1)
+        {
+            BIG_XXX_sub(y,y,r);
+        }
+
+        // Output Y shares
+        BIG_XXX_toBytes(Y[j].val,y);
+        Y[j].len = MODBYTES_XXX;
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SKO->val,poly[0]);
+    SKO->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX y;
+    BIG_XXX coefs[k];
+
+    BIG_XXX secret;
+    BIG_XXX prod;
+    BIG_XXX_zero(secret);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(y,Y[i].val);
+
+        BIG_XXX_modmul(prod,y,coefs[i],r);
+        BIG_XXX_add(secret, secret, prod);
+
+        // Normalise input for comp
+        BIG_XXX_norm(secret);
+        if (BIG_XXX_comp(secret,r) == 1)
+        {
+            BIG_XXX_sub(secret,secret,r);
+        }
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SK->val,secret);
+    SK->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG)
+{
+    BIG_XXX coefs[k];
+    ECP_ZZZ y;
+
+    ECP_ZZZ sig;
+    ECP_ZZZ_inf(&sig);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        if (!ECP_ZZZ_fromOctet(&y,&Y[i]))
+        {
+            return BLS_INVALID_G1;
+        }
+
+        PAIR_ZZZ_G1mul(&y,coefs[i]);
+        ECP_ZZZ_add(&sig,&y);
+    }
+
+    ECP_ZZZ_toOctet(SIG, &sig, true);
+
+    return BLS_OK;
+}
diff --git a/src/bls256.c.in b/src/bls256.c.in
index 135d450..43a90ad 100644
--- a/src/bls256.c.in
+++ b/src/bls256.c.in
@@ -25,15 +25,87 @@
 #include <time.h>
 #include "bls256_ZZZ.h"
 
-/* hash a message to an ECP point, using SHA3 */
-static void BLS_HASHIT(ECP_ZZZ *P,char *m)
+// Polynomial interpolation coefficients
+static void recover_coefficients(int k, octet* X, BIG_XXX* coefs)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX x2[k];
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(x2[i],X[i].val);
+    }
+
+    // Compute numerators in place using partial products
+    // to achieve it in O(n)
+    // c_i = x_0 * ... * x_(i-1) * x_(i+1) * ... * x_(k-1)
+
+    // Compute partial left products
+    // leave c_0 alone since it only has a right partial product
+    BIG_XXX_copy(coefs[1], x2[0]);
+
+    for(int i=2; i < k; i++)
+    {
+        // lp_i = x_0 * ... * x_(i-1) = lp_(i-1) * x_(i-1)
+        BIG_XXX_modmul(coefs[i], coefs[i-1], x2[i-1], r);
+    }
+
+    // Compute partial right products and combine
+
+    // Store partial right products in c_0 so at the end
+    // of the procedure c_0 = x_1 * ... x_(k-1)
+    BIG_XXX_copy(coefs[0], x2[k-1]);
+
+    for(int i=k-2; i > 0; i--)
+    {
+        // c_i = lp_i * rp_i
+        BIG_XXX_modmul(coefs[i], coefs[i], coefs[0], r);
+
+        // rp_(i-1) = x_i * ... * x_k = x_i * rp_i
+        BIG_XXX_modmul(coefs[0], coefs[0], x2[i], r);
+    }
+
+    BIG_XXX cneg;
+    BIG_XXX denominator;
+    BIG_XXX s;
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_one(denominator);
+
+        // cneg = -x_i mod r
+        BIG_XXX_sub(cneg, r, x2[i]);
+
+        for(int j=0; j<k; j++)
+        {
+            if (i != j)
+            {
+                // denominator = denominator * (x_j - x_i)
+                BIG_XXX_add(s,x2[j],cneg);
+                BIG_XXX_modmul(denominator,denominator,s,r);
+            }
+        }
+
+        BIG_XXX_moddiv(coefs[i], coefs[i], denominator, r);
+    }
+}
+
+/* hash a message, M, to an ECP point, using SHA3 */
+static void BLS_HASHIT(ECP_ZZZ *P,octet *M)
 {
     int i;
+    int j;
     sha3 hs;
     char h[MODBYTES_XXX];
     octet HM= {0,sizeof(h),h};
     SHA3_init(&hs,SHAKE256);
-    for (i=0; m[i]!=0; i++) SHA3_process(&hs,m[i]);
+    for (i=0; i<M->len; i++)
+    {
+        j = (unsigned char) M->val[i];
+        SHA3_process(&hs,j);
+    }
     SHA3_shake(&hs,HM.val,MODBYTES_XXX);
     HM.len=MODBYTES_XXX;
     ECP_ZZZ_mapit(P,&HM);
@@ -61,28 +133,30 @@
 
     PAIR_ZZZ_G2mul(&G,s);
     ECP8_ZZZ_toOctet(W,&G);
+
     return BLS_OK;
 }
 
-/* Sign message m using private key S to produce signature SIG */
-int BLS_ZZZ_SIGN(octet *SIG,char *m,octet *S)
+/* Sign message M using private key S to produce signature SIG */
+int BLS_ZZZ_SIGN(octet *SIG,octet *M,octet *S)
 {
     BIG_XXX s;
     ECP_ZZZ D;
-    BLS_HASHIT(&D,m);
+    BLS_HASHIT(&D,M);
     BIG_XXX_fromBytes(s,S->val);
     PAIR_ZZZ_G1mul(&D,s);
     ECP_ZZZ_toOctet(SIG,&D,true); /* compress output */
+
     return BLS_OK;
 }
 
-/* Verify signature given message m, the signature SIG, and the public key W */
-int BLS_ZZZ_VERIFY(octet *SIG,char *m,octet *W)
+/* Verify signature given message M, the signature SIG, and the public key W */
+int BLS_ZZZ_VERIFY(octet *SIG,octet *M,octet *W)
 {
     FP48_YYY v;
     ECP8_ZZZ G,PK;
     ECP_ZZZ D,HM;
-    BLS_HASHIT(&HM,m);
+    BLS_HASHIT(&HM,M);
 
     if (!ECP_ZZZ_fromOctet(&D,SIG))
     {
@@ -105,6 +179,7 @@
     {
         return BLS_FAIL;
     }
+
     return BLS_OK;
 }
 
@@ -151,3 +226,126 @@
 
     return BLS_OK;
 }
+
+int BLS_ZZZ_MAKE_SHARES(int k, int n, csprng *RNG, octet* X, octet* Y, octet* SKI, octet* SKO)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    // Generate polynomial: f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+    BIG_XXX poly[k];
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_randomnum(poly[i],r,RNG);
+    }
+
+    // Use predefined secret
+    if (SKI != NULL)
+    {
+        BIG_XXX_fromBytes(poly[0],SKI->val);
+    }
+
+    /* Calculate f(x) = a_0 + a_1x + a_2x^2 ... a_{k-1}x^{k-1}
+       a0 is the secret */
+    BIG_XXX x;
+    BIG_XXX_zero(x);
+
+    BIG_XXX y;
+
+    for(int j=0; j<n; j++)
+    {
+        BIG_XXX_inc(x,1);
+
+        // Output X shares
+        BIG_XXX_toBytes(X[j].val,x);
+        X[j].len = MODBYTES_XXX;
+
+        // y is the accumulator
+        BIG_XXX_zero(y);
+
+        for(int i=k-1; i>=0; i--)
+        {
+            BIG_XXX_modmul(y,y,x,r);
+            BIG_XXX_add(y,y,poly[i]);
+        }
+
+        // Normalise input for comp
+        BIG_XXX_norm(y);
+        if(BIG_XXX_comp(y,r) == 1)
+        {
+            BIG_XXX_sub(y,y,r);
+        }
+
+        // Output Y shares
+        BIG_XXX_toBytes(Y[j].val,y);
+        Y[j].len = MODBYTES_XXX;
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SKO->val,poly[0]);
+    SKO->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SECRET(int k, octet* X, octet* Y, octet* SK)
+{
+    BIG_XXX r;
+    BIG_XXX_rcopy(r,CURVE_Order_ZZZ);
+
+    BIG_XXX y;
+    BIG_XXX coefs[k];
+
+    BIG_XXX secret;
+    BIG_XXX prod;
+    BIG_XXX_zero(secret);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        BIG_XXX_fromBytes(y,Y[i].val);
+
+        BIG_XXX_modmul(prod,y,coefs[i],r);
+        BIG_XXX_add(secret, secret, prod);
+
+        // Normalise input for comp
+        BIG_XXX_norm(secret);
+        if (BIG_XXX_comp(secret,r) == 1)
+        {
+            BIG_XXX_sub(secret,secret,r);
+        }
+    }
+
+    // Output secret
+    BIG_XXX_toBytes(SK->val,secret);
+    SK->len = MODBYTES_XXX;
+
+    return BLS_OK;
+}
+
+int BLS_ZZZ_RECOVER_SIGNATURE(int k, octet* X, octet* Y, octet* SIG)
+{
+    BIG_XXX coefs[k];
+    ECP_ZZZ y;
+
+    ECP_ZZZ sig;
+    ECP_ZZZ_inf(&sig);
+
+    recover_coefficients(k, X, coefs);
+
+    for(int i=0; i<k; i++)
+    {
+        if (!ECP_ZZZ_fromOctet(&y,&Y[i]))
+        {
+            return BLS_INVALID_G1;
+        }
+
+        PAIR_ZZZ_G1mul(&y,coefs[i]);
+        ECP_ZZZ_add(&sig,&y);
+    }
+
+    ECP_ZZZ_toOctet(SIG, &sig, true);
+
+    return BLS_OK;
+}
diff --git a/src/ff.c.in b/src/ff.c.in
index 104c461..dbec31f 100644
--- a/src/ff.c.in
+++ b/src/ff.c.in
@@ -21,90 +21,6 @@
 
 #include "ff_WWW.h"
 
-/* Arazi and Qi inversion mod 256 */
-static int invmod256(int a)
-{
-    int U,t1,t2,b,c;
-    t1=0;
-    c=(a>>1)&1;
-    t1+=c;
-    t1&=1;
-    t1=2-t1;
-    t1<<=1;
-    U=t1+1;
-
-// i=2
-    b=a&3;
-    t1=U*b;
-    t1>>=2;
-    c=(a>>2)&3;
-    t2=(U*c)&3;
-    t1+=t2;
-    t1*=U;
-    t1&=3;
-    t1=4-t1;
-    t1<<=2;
-    U+=t1;
-
-// i=4
-    b=a&15;
-    t1=U*b;
-    t1>>=4;
-    c=(a>>4)&15;
-    t2=(U*c)&15;
-    t1+=t2;
-    t1*=U;
-    t1&=15;
-    t1=16-t1;
-    t1<<=4;
-    U+=t1;
-
-    return U;
-}
-
-/* a=1/a mod 2^BIGBITS. This is very fast! */
-void BIG_XXX_invmod2m(BIG_XXX a)
-{
-    int i;
-    BIG_XXX U,t1,b,c;
-    BIG_XXX_zero(U);
-    BIG_XXX_inc(U,invmod256(BIG_XXX_lastbits(a,8)));
-    for (i=8; i<BIGBITS_XXX; i<<=1)
-    {
-        BIG_XXX_norm(U);
-        BIG_XXX_copy(b,a);
-        BIG_XXX_mod2m(b,i);   // bottom i bits of a
-
-        BIG_XXX_smul(t1,U,b);
-        BIG_XXX_shr(t1,i); // top i bits of U*b
-
-        BIG_XXX_copy(c,a);
-        BIG_XXX_shr(c,i);
-        BIG_XXX_mod2m(c,i); // top i bits of a
-
-        BIG_XXX_smul(b,U,c);
-        BIG_XXX_mod2m(b,i);  // bottom i bits of U*c
-
-        BIG_XXX_add(t1,t1,b);
-        BIG_XXX_norm(t1);
-        BIG_XXX_smul(b,t1,U);
-        BIG_XXX_copy(t1,b);  // (t1+b)*U
-        BIG_XXX_mod2m(t1,i);				// bottom i bits of (t1+b)*U
-
-        BIG_XXX_one(b);
-        BIG_XXX_shl(b,i);
-        BIG_XXX_sub(t1,b,t1);
-        BIG_XXX_norm(t1);
-
-        BIG_XXX_shl(t1,i);
-
-        BIG_XXX_add(U,U,t1);
-    }
-    BIG_XXX_copy(a,U);
-    BIG_XXX_norm(a);
-    BIG_XXX_mod2m(a,BIGBITS_XXX);
-}
-
 /* x=y */
 void FF_WWW_copy(BIG_XXX x[],BIG_XXX y[],int n)
 {
@@ -620,7 +536,7 @@
     FF_WWW_copy(x1,one,n);
     FF_WWW_zero(x2,n);
 
-// reduce n in here as well!
+    // reduce n in here as well!
     while (FF_WWW_comp(u,one,n)!=0 && FF_WWW_comp(v,one,n)!=0)
     {
         while (FF_WWW_parity(u)==0)
@@ -719,7 +635,7 @@
 }
 
 /* U=1/a mod 2^m - Arazi & Qi */
-static void FF_WWW_invmod2m(BIG_XXX U[],BIG_XXX a[],int n)
+void FF_WWW_invmod2m(BIG_XXX U[],BIG_XXX a[],int n)
 {
     int i;
 #ifndef C99
@@ -851,7 +767,7 @@
 }
 
 /* r=x^e mod p using side-channel resistant Montgomery Ladder, for large e */
-void FF_WWW_skpow(BIG_XXX r[],BIG_XXX x[],BIG_XXX e[],BIG_XXX p[],int n)
+void FF_WWW_skpow(BIG_XXX r[],BIG_XXX x[],BIG_XXX e[],BIG_XXX p[],int n, int en)
 {
     int i,b;
 #ifndef C99
@@ -866,7 +782,7 @@
     FF_WWW_nres(R0,p,n);
     FF_WWW_nres(R1,p,n);
 
-    for (i=8*MODBYTES_XXX*n-1; i>=0; i--)
+    for (i=8*MODBYTES_XXX*en-1; i>=0; i--)
     {
         b=BIG_XXX_bit(e[i/BIGBITS_XXX],i%BIGBITS_XXX);
         FF_WWW_modmul(r,R0,R1,p,ND,n);
@@ -908,6 +824,47 @@
     FF_WWW_redc(r,p,ND,n);
 }
 
+/* r=x^e*y^f mod p - side channel resistant */
+void FF_WWW_skpow2(BIG_XXX r[],BIG_XXX x[], BIG_XXX e[], BIG_XXX y[], BIG_XXX f[], BIG_XXX p[], int n, int en) {
+    int i,eb,fb;
+#ifndef C99
+    BIG_XXX xn[FFLEN_WWW],yn[FFLEN_WWW],xy[FFLEN_WWW],w[FFLEN_WWW],ND[FFLEN_WWW];
+#else
+    BIG_XXX xn[n],yn[n],xy[n],w[n],ND[n];
+#endif
+
+    FF_WWW_invmod2m(ND,p,n);
+
+    FF_WWW_copy(xn,x,n);
+    FF_WWW_copy(yn,y,n);
+    FF_WWW_nres(xn,p,n);
+    FF_WWW_nres(yn,p,n);
+    FF_WWW_modmul(xy,xn,yn,p,ND,n);
+    FF_WWW_one(w,n);
+    FF_WWW_nres(w,p,n);
+    FF_WWW_one(r,n);
+    FF_WWW_nres(r,p,n);
+
+    for (i=8*MODBYTES_XXX*en-1; i>=0; i--)
+    {
+        eb=BIG_XXX_bit(e[i/BIGBITS_XXX],i%BIGBITS_XXX);
+        fb=BIG_XXX_bit(f[i/BIGBITS_XXX],i%BIGBITS_XXX);
+
+        FF_WWW_cswap(w, xn, eb & (eb ^ fb), n);
+        FF_WWW_cswap(w, yn, fb & (eb ^ fb), n);
+        FF_WWW_cswap(w, xy, eb & fb, n);
+
+        FF_WWW_modsqr(r,r,p,ND,n);
+        FF_WWW_modmul(r,w,r,p,ND,n);
+
+        FF_WWW_cswap(w, xn, eb & (eb ^ fb), n);
+        FF_WWW_cswap(w, yn, fb & (eb ^ fb), n);
+        FF_WWW_cswap(w, xy, eb & fb, n);
+    }
+
+    FF_WWW_redc(r,p,ND,n);
+}
+
 /* raise to an integer power - right-to-left method */
 void FF_WWW_power(BIG_XXX r[],BIG_XXX x[],int e,BIG_XXX p[],int n)
 {
@@ -1094,3 +1051,32 @@
 
     return 1;
 }
+
+/* Chinese Remainder Theorem to reconstruct results mod pq*/
+void FF_WWW_crt(BIG_XXX *r, BIG_XXX *rp, BIG_XXX *rq, BIG_XXX *p, BIG_XXX *q, int n)
+{
+#ifndef C99
+    BIG_XXX pq[FFLEN_WWW], invp[HFLEN_WWW], c[FFLEN_WWW], a[FFLEN_WWW], b[2*FFLEN_WWW];
+#else
+    BIG_XXX pq[2*n], invp[n], c[2*n], a[2*n], b[4*n];
+#endif
+
+    FF_WWW_mul(pq, p, q, n);
+
+    // c = p * (p^-1 mod q)
+    FF_WWW_invmodp(invp, p, q, n);
+    FF_WWW_mul(c, p, invp, n);
+
+    // a = (rq - rp) mod pq
+    FF_WWW_copy(a, pq, 2*n);
+    FF_WWW_sub(a, a, rp, n);
+    FF_WWW_add(a, a, rq, n);
+
+    // (ac + rp) mod pq
+    FF_WWW_mul(b, a, c, 2*n);
+    FF_WWW_dmod(a, b, pq, 2*n);
+
+    FF_WWW_dscopy(r, rp, n);
+    FF_WWW_add(r, r, a, 2*n);
+    FF_WWW_mod(r, pq, 2*n);
+}
diff --git a/src/fp12.c.in b/src/fp12.c.in
index c8b4765..4371cb8 100644
--- a/src/fp12.c.in
+++ b/src/fp12.c.in
@@ -107,7 +107,7 @@
 /* SU= 16 */
 int FP12_YYY_equals(FP12_YYY *x,FP12_YYY *y)
 {
-    if (FP4_YYY_equals(&(x->a),&(y->a)) && FP4_YYY_equals(&(x->b),&(y->b)) && FP4_YYY_equals(&(x->b),&(y->b)))
+    if (FP4_YYY_equals(&(x->a),&(y->a)) && FP4_YYY_equals(&(x->b),&(y->b)) && FP4_YYY_equals(&(x->c),&(y->c)))
         return 1;
     return 0;
 }
diff --git a/src/fp24.c.in b/src/fp24.c.in
index 5470a70..d1cf0fe 100644
--- a/src/fp24.c.in
+++ b/src/fp24.c.in
@@ -104,7 +104,7 @@
 /* SU= 16 */
 int FP24_YYY_equals(FP24_YYY *x,FP24_YYY *y)
 {
-    if (FP8_YYY_equals(&(x->a),&(y->a)) && FP8_YYY_equals(&(x->b),&(y->b)) && FP8_YYY_equals(&(x->b),&(y->b)))
+    if (FP8_YYY_equals(&(x->a),&(y->a)) && FP8_YYY_equals(&(x->b),&(y->b)) && FP8_YYY_equals(&(x->c),&(y->c)))
         return 1;
     return 0;
 }
diff --git a/src/fp48.c.in b/src/fp48.c.in
index cc5394e..a7fd7d5 100644
--- a/src/fp48.c.in
+++ b/src/fp48.c.in
@@ -105,7 +105,7 @@
 /* SU= 16 */
 int FP48_YYY_equals(FP48_YYY *x,FP48_YYY *y)
 {
-    if (FP16_YYY_equals(&(x->a),&(y->a)) && FP16_YYY_equals(&(x->b),&(y->b)) && FP16_YYY_equals(&(x->b),&(y->b)))
+    if (FP16_YYY_equals(&(x->a),&(y->a)) && FP16_YYY_equals(&(x->b),&(y->b)) && FP16_YYY_equals(&(x->c),&(y->c)))
         return 1;
     return 0;
 }
diff --git a/src/paillier.c b/src/paillier.c
new file mode 100644
index 0000000..448c0e2
--- /dev/null
+++ b/src/paillier.c
@@ -0,0 +1,315 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/* test driver and function exerciser for Paillier functions */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "ff_4096.h"
+#include "ff_2048.h"
+#include "paillier.h"
+
+// generate a Paillier key pair 
+void PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, PAILLIER_public_key *PUB, PAILLIER_private_key *PRIV)
+{
+    char oct[FS_2048];
+    octet OCT = {0, FS_2048, oct};
+
+    // Public key
+    BIG_1024_58 g[FFLEN_2048];
+
+    // Workspace for CRT precomputations
+    BIG_1024_58 ff[FFLEN_2048];
+    BIG_1024_58 dff[2*FFLEN_2048];
+
+    /* Private key */
+
+    if (RNG!=NULL)
+    {
+        // p
+        FF_2048_random(PRIV->p, RNG, HFLEN_2048);
+        while (FF_2048_lastbits(PRIV->p, 2) != 3)
+        {
+            FF_2048_inc(PRIV->p, 1, HFLEN_2048);
+        }
+        while (!FF_2048_prime(PRIV->p, RNG, HFLEN_2048))
+        {
+            FF_2048_inc(PRIV->p, 4, HFLEN_2048);
+        }
+
+        // q
+        FF_2048_random(PRIV->q, RNG, HFLEN_2048);
+        while (FF_2048_lastbits(PRIV->q, 2) != 3)
+        {
+            FF_2048_inc(PRIV->q, 1, HFLEN_2048);
+        }
+        while (!FF_2048_prime(PRIV->q, RNG, HFLEN_2048))
+        {
+            FF_2048_inc(PRIV->q, 4, HFLEN_2048);
+        }
+    }
+    else
+    {
+        FF_2048_fromOctet(PRIV->p, P, HFLEN_2048);
+        FF_2048_fromOctet(PRIV->q, Q, HFLEN_2048);
+    }
+
+    // lp = p-1, lq = q-1
+    FF_2048_copy(PRIV->lp, PRIV->p, HFLEN_2048);
+    FF_2048_copy(PRIV->lq, PRIV->q, HFLEN_2048);
+    FF_2048_dec(PRIV->lp, 1, HFLEN_2048);
+    FF_2048_dec(PRIV->lq, 1, HFLEN_2048);
+
+    /* Precomputations for Secret Key */
+
+    // p^{-1}, q^{-1} mod 2^m for division trick
+    FF_2048_zero(PRIV->invp, FFLEN_2048);
+    FF_2048_zero(PRIV->invq, FFLEN_2048);
+    FF_2048_invmod2m(PRIV->invp, PRIV->p, HFLEN_2048);
+    FF_2048_invmod2m(PRIV->invq, PRIV->q, HFLEN_2048);
+
+    // p^2, q^2
+    FF_2048_sqr(PRIV->p2, PRIV->p, HFLEN_2048);
+    FF_2048_sqr(PRIV->q2, PRIV->q, HFLEN_2048);
+    FF_2048_norm(PRIV->p2, FFLEN_2048);
+    FF_2048_norm(PRIV->q2, FFLEN_2048);
+
+    // g = n + 1
+    FF_2048_mul(g, PRIV->p, PRIV->q, HFLEN_2048);
+    FF_2048_inc(g, 1, FFLEN_2048);
+
+    // (((g^(p-1) mod p^2) - 1) / p)^(-1) mod p for dec/enc with CRT
+    FF_2048_skpow(ff, g, PRIV->lp, PRIV->p2, FFLEN_2048, HFLEN_2048);
+    FF_2048_dec(ff, 1, FFLEN_2048);
+    FF_2048_mul(dff, ff, PRIV->invp, FFLEN_2048);
+    FF_2048_invmodp(PRIV->mp, dff, PRIV->p, HFLEN_2048);
+
+    // (((g^(q-1) mod q^2) - 1) / q)^(-1) mod q for dec/enc with CRT
+    FF_2048_skpow(ff, g, PRIV->lq, PRIV->q2, FFLEN_2048, HFLEN_2048);
+    FF_2048_dec(ff, 1, FFLEN_2048);
+    FF_2048_mul(dff, ff, PRIV->invq, FFLEN_2048);
+    FF_2048_invmodp(PRIV->mq, dff, PRIV->q, HFLEN_2048);
+
+    /* Public Key */
+
+    // g = n + 1
+    FF_2048_toOctet(&OCT, g, FFLEN_2048);
+    FF_4096_zero(PUB->g, FFLEN_4096);
+    FF_4096_fromOctet(PUB->g, &OCT, HFLEN_4096);
+    OCT_empty(&OCT);
+
+    // n
+    FF_2048_dec(g, 1, FFLEN_2048);
+    FF_2048_toOctet(&OCT, g, FFLEN_2048);
+    FF_4096_zero(PUB->n, FFLEN_4096);
+    FF_4096_fromOctet(PUB->n, &OCT, HFLEN_4096);
+    OCT_empty(&OCT);
+
+    // Precompute n^2 for public key
+    FF_4096_sqr(PUB->n2, PUB->n, HFLEN_4096);
+    FF_4096_norm(PUB->n2, FFLEN_4096);
+
+    // Clean memory
+    FF_2048_zero(ff, FFLEN_2048);
+    FF_2048_zero(dff, 2*FFLEN_2048);
+}
+
+/* Clean secrets from private key */
+void PAILLIER_PRIVATE_KEY_KILL(PAILLIER_private_key *PRIV)
+{
+    FF_2048_zero(PRIV->p,    HFLEN_2048);
+    FF_2048_zero(PRIV->q,    HFLEN_2048);
+    FF_2048_zero(PRIV->lp,   HFLEN_2048);
+    FF_2048_zero(PRIV->lq,   HFLEN_2048);
+    FF_2048_zero(PRIV->p2,   FFLEN_2048);
+    FF_2048_zero(PRIV->q2,   FFLEN_2048);
+    FF_2048_zero(PRIV->mp,   HFLEN_2048);
+    FF_2048_zero(PRIV->mq,   HFLEN_2048);
+    FF_2048_zero(PRIV->invp, FFLEN_2048);
+    FF_2048_zero(PRIV->invq, FFLEN_2048);
+}
+
+// Paillier encryption
+void PAILLIER_ENCRYPT(csprng *RNG, PAILLIER_public_key *PUB, octet* PT, octet* CT, octet* R)
+{
+    // Random r < n^2
+    BIG_512_60 r[FFLEN_4096];
+
+    // plaintext
+    BIG_512_60 pt[HFLEN_4096];
+
+    // ciphertext
+    BIG_512_60 ct[FFLEN_4096];
+
+    FF_4096_fromOctet(pt,PT,HFLEN_4096);
+
+    // In production generate R from RNG
+    if (RNG!=NULL)
+    {
+        FF_4096_randomnum(r, PUB->n2, RNG,FFLEN_4096);
+    }
+    else
+    {
+        FF_4096_fromOctet(r, R, FFLEN_4096);
+    }
+
+    // ct = g^pt * r^n mod n2
+    FF_4096_skpow2(ct, PUB->g, pt, r, PUB->n, PUB->n2, FFLEN_4096, HFLEN_4096);
+
+    // Output
+    FF_4096_toOctet(CT, ct, FFLEN_4096);
+
+    // Output R for Debug
+    if (R!=NULL)
+    {
+        FF_4096_toOctet(R, r, HFLEN_4096);
+    }
+
+    // Clean memory
+    FF_4096_zero(r, FFLEN_4096);
+    FF_4096_zero(pt, HFLEN_4096);
+}
+
+// Paillier decryption
+void PAILLIER_DECRYPT(PAILLIER_private_key *PRIV, octet* CT, octet* PT)
+{
+    // Chiphertext
+    BIG_1024_58 ct[2 * FFLEN_2048];
+
+    // Plaintext
+    BIG_1024_58 pt[FFLEN_2048];
+    BIG_1024_58 ptp[HFLEN_2048];
+    BIG_1024_58 ptq[HFLEN_2048];
+
+    // Work space
+    BIG_1024_58 ctl[FFLEN_2048];
+    BIG_1024_58 ctln[2 * FFLEN_2048];
+
+    FF_2048_fromOctet(ct, CT, 2 * FFLEN_2048);
+
+    /* Decryption modulo p */
+
+    FF_2048_dmod(ctl, ct, PRIV->p2, FFLEN_2048);
+
+    // Compute ctl = (ct^lp mod p2 - 1)
+    FF_2048_skpow(ctl, ctl, PRIV->lp, PRIV->p2, FFLEN_2048, HFLEN_2048);
+    FF_2048_dec(ctl, 1, FFLEN_2048);
+
+    // ctln = ctl / p
+    // Division by p using the inverse mod 2^m trick
+    FF_2048_mul(ctln, ctl, PRIV->invp, FFLEN_2048);
+
+    // ptp = ctln * mp mod p
+    FF_2048_mul(ptp, ctln, PRIV->mp, HFLEN_2048);
+    FF_2048_dmod(ptp, ptp, PRIV->p, HFLEN_2048);
+
+    /* Decryption modulo q */
+
+    FF_2048_dmod(ctl, ct, PRIV->q2, FFLEN_2048);
+
+    // Compute ctl = (ct^lq mod q2 - 1)
+    FF_2048_skpow(ctl, ctl, PRIV->lq, PRIV->q2, FFLEN_2048, HFLEN_2048);
+    FF_2048_dec(ctl, 1, FFLEN_2048);
+
+    // ctln = ctl / q
+    // Division by q using the inverse mod 2^m trick
+    FF_2048_mul(ctln, ctl, PRIV->invq, FFLEN_2048);
+
+    // ptq = ctln * mq mod q
+    FF_2048_mul(ptq, ctln, PRIV->mq, HFLEN_2048);
+    FF_2048_dmod(ptq, ptq, PRIV->q, HFLEN_2048);
+
+    /* Combine results using CRT */
+    FF_2048_crt(pt, ptp, ptq, PRIV->p, PRIV->q, HFLEN_2048);
+
+    // Output
+    FF_2048_toOctet(PT, pt, FFLEN_2048);
+
+    // Clean memory
+    FF_2048_zero(pt,   FFLEN_2048);
+    FF_2048_zero(ptp,  HFLEN_2048);
+    FF_2048_zero(ptq,  HFLEN_2048);
+    FF_2048_zero(ctl,  FFLEN_2048);
+    FF_2048_zero(ctln, 2 * FFLEN_2048);
+}
+
+// Homomorphic addition of plaintexts 
+void PAILLIER_ADD(PAILLIER_public_key *PUB, octet* CT1, octet* CT2, octet* CT)
+{
+    // ciphertext
+    BIG_512_60 ct1[FFLEN_4096];
+    BIG_512_60 ct2[FFLEN_4096];
+    BIG_512_60 ct[2 * FFLEN_4096];
+
+    FF_4096_fromOctet(ct1, CT1, FFLEN_4096);
+    FF_4096_fromOctet(ct2, CT2, FFLEN_4096);
+
+    // ct = ct1 * ct2 mod n^2
+    FF_4096_mul(ct, ct1, ct2, FFLEN_4096);
+    FF_4096_dmod(ct, ct, PUB->n2, FFLEN_4096);
+
+    // Output
+    FF_4096_toOctet(CT, ct, FFLEN_4096);
+}
+
+// Homomorphic multiplication of plaintext
+void PAILLIER_MULT(PAILLIER_public_key *PUB, octet* CT1, octet* PT, octet* CT)
+{
+    // Ciphertext
+    BIG_512_60 ct1[FFLEN_4096];
+
+    // Plaintext
+    BIG_512_60 pt[HFLEN_4096];
+
+    // Ciphertext output. ct = ct1 ^ pt mod n^2
+    BIG_512_60 ct[FFLEN_4096];
+
+    FF_4096_fromOctet(pt, PT, HFLEN_4096);
+    FF_4096_fromOctet(ct1, CT1, FFLEN_4096);
+
+    // ct1^pt mod n^2
+    FF_4096_skpow(ct, ct1, pt, PUB->n2, FFLEN_4096, HFLEN_4096);
+
+    // output
+    FF_4096_toOctet(CT, ct, FFLEN_4096);
+
+    // Clean memory
+    FF_4096_zero(pt, HFLEN_4096);
+}
+
+// Read a public key from its octet representation
+void PAILLIER_PK_fromOctet(PAILLIER_public_key *PUB, octet *PK)
+{
+    FF_4096_zero(PUB->n, FFLEN_4096);
+    FF_4096_fromOctet(PUB->n, PK, HFLEN_4096);
+
+    FF_4096_sqr(PUB->n2, PUB->n, HFLEN_4096);
+    FF_4096_norm(PUB->n2, FFLEN_4096);
+
+    FF_4096_copy(PUB->g, PUB->n, FFLEN_4096);
+    FF_4096_inc(PUB->g, 1, HFLEN_4096);
+}
+
+// Write a public key to an octet
+void PAILLIER_PK_toOctet(octet *PK, PAILLIER_public_key *PUB)
+{
+    FF_4096_toOctet(PK, PUB->n, HFLEN_4096);
+}
diff --git a/src/rsa.c.in b/src/rsa.c.in
index bbe41b2..ba996bd 100644
--- a/src/rsa.c.in
+++ b/src/rsa.c.in
@@ -136,8 +136,8 @@
     FF_WWW_dmod(jp,g,PRIV->p,HFLEN_WWW);
     FF_WWW_dmod(jq,g,PRIV->q,HFLEN_WWW);
 
-    FF_WWW_skpow(jp,jp,PRIV->dp,PRIV->p,HFLEN_WWW);
-    FF_WWW_skpow(jq,jq,PRIV->dq,PRIV->q,HFLEN_WWW);
+    FF_WWW_skpow(jp,jp,PRIV->dp,PRIV->p,HFLEN_WWW,HFLEN_WWW);
+    FF_WWW_skpow(jq,jq,PRIV->dq,PRIV->q,HFLEN_WWW,HFLEN_WWW);
 
 
     FF_WWW_zero(g,FFLEN_WWW);
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 9636194..5c13d80 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -209,6 +209,7 @@
     ################################################
     if(BUILD_BLS)
       amcl_curve_test(${curve} test_bls_${TC} test_bls_ZZZ.c.in amcl_bls_${TC} "SUCCESS")
+      amcl_curve_test(${curve} test_bls_sss_${TC} test_bls_sss_ZZZ.c.in amcl_bls_${TC} "SUCCESS")      
     endif()
     
   endif()
@@ -223,6 +224,7 @@
 
   amcl_rsa_test(${level} test_big_arithmetics_${BD} test_big_arithmetics_XXX.c.in amcl_rsa_${TFF} "SUCCESS" "big/test_vector_big.txt")
   amcl_rsa_test(${level} test_big_consistency_${BD} test_big_consistency_XXX.c.in amcl_rsa_${TFF} "SUCCESS")
+  amcl_rsa_test(${level} test_ff_consistency_${TFF}  test_ff_consistency_WWW.c.in  amcl_rsa_${TFF} "SUCCESS")
   amcl_rsa_test(${level} test_rsa_${TFF}            test_rsa_WWW.c.in             amcl_rsa_${TFF} "SUCCESS")
 endforeach()
 
@@ -262,3 +264,27 @@
     endforeach()
   endforeach()
 endif()
+
+################################################
+# Paillier Tests
+################################################
+
+if(BUILD_PAILLIER)
+  set(deps "amcl_core;amcl_paillier")
+
+  foreach(level 2048 4096)
+    amcl_rsa_field(BD "${level}")
+    amcl_rsa_field(TFF "${level}")
+
+    amcl_rsa_test(${level} test_big_arithmetics_${BD} test_big_arithmetics_XXX.c.in "${deps}" "SUCCESS" "big/test_vector_big.txt")
+    amcl_rsa_test(${level} test_big_consistency_${BD} test_big_consistency_XXX.c.in "${deps}" "SUCCESS")
+    amcl_rsa_test(${level} test_ff_consistency_${TFF} test_ff_consistency_WWW.c.in  "${deps}" "SUCCESS")
+  endforeach()
+
+  amcl_test(test_paillier_consistency test_paillier_consistency.c "${deps}" "SUCCESS")
+  amcl_test(test_paillier_decrypt test_paillier_decrypt.c "${deps}" "SUCCESS" "paillier/decrypt.txt")
+  amcl_test(test_paillier_encrypt test_paillier_encrypt.c "${deps}" "SUCCESS" "paillier/encrypt.txt")
+  amcl_test(test_paillier_add test_paillier_add.c "${deps}" "SUCCESS" "paillier/add.txt")
+  amcl_test(test_paillier_mult test_paillier_mult.c "${deps}" "SUCCESS" "paillier/mult.txt")
+  amcl_test(test_paillier_keygen test_paillier_keygen.c "${deps}" "SUCCESS" "paillier/keygen.txt")
+endif()
diff --git a/test/test_bls_ZZZ.c.in b/test/test_bls_ZZZ.c.in
index 92c4154..c433631 100644
--- a/test/test_bls_ZZZ.c.in
+++ b/test/test_bls_ZZZ.c.in
@@ -42,12 +42,14 @@
 #define G2LEN 16*BFS_ZZZ
 #endif
 
-static char message[]="test message";
 
-int bls(csprng *RNG)
+int test(csprng *RNG)
 {
     int rc;
 
+    char m[2000];
+    octet M = {0,sizeof(m),m};
+
     char sk1[BGS_ZZZ];
     octet SK1 = {0,sizeof(sk1),sk1};
     char pktmp[G2LEN];
@@ -107,10 +109,12 @@
     OCT_output(&PK2);
     printf("\n");
 
+    OCT_jstring(&M,"test message");
+
     // Sign the message
-    BLS_ZZZ_SIGN(&SIG1,message,&SK1);
-    BLS_ZZZ_SIGN(&SIG2,message,&SK2);
-    BLS_ZZZ_SIGN(&SIG3,message,&SK3);
+    BLS_ZZZ_SIGN(&SIG1,&M,&SK1);
+    BLS_ZZZ_SIGN(&SIG2,&M,&SK2);
+    BLS_ZZZ_SIGN(&SIG3,&M,&SK3);
 
     printf("SIG1: ");
     OCT_output(&SIG1);
@@ -121,7 +125,7 @@
     printf("\n");
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_OK)
     {
         printf("Test Passed valid Signature / message\n");
@@ -133,7 +137,7 @@
     }
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG2,message,&PK2);
+    rc=BLS_ZZZ_VERIFY(&SIG2,&M,&PK2);
     if (rc==BLS_OK)
     {
         printf("Test Passed valid Signature / message\n");
@@ -145,7 +149,7 @@
     }
 
     // Verify signature
-    rc=BLS_ZZZ_VERIFY(&SIG3,message,&PK3);
+    rc=BLS_ZZZ_VERIFY(&SIG3,&M,&PK3);
     if (rc==BLS_OK)
     {
         printf("Test Passed valid Signature / message\n");
@@ -182,7 +186,7 @@
     }
 
     // Verify aggregated signature. This should fail.
-    rc=BLS_ZZZ_VERIFY(&SIG,message,&PK);
+    rc=BLS_ZZZ_VERIFY(&SIG,&M,&PK);
     if (rc==BLS_FAIL)
     {
         printf("Test Passed invalid signature SIG = SIG1 + SIG2 \n");
@@ -204,7 +208,7 @@
     printf("\n");
 
     // Verify aggregated signature.
-    rc=BLS_ZZZ_VERIFY(&SIG,message,&PK);
+    rc=BLS_ZZZ_VERIFY(&SIG,&M,&PK);
     if (rc==BLS_OK)
     {
         printf("Test Passed valid Signature SIG = SIG1 + SIG2 + SIG3\n");
@@ -217,9 +221,9 @@
 
 
     // change the message
-    message[0]='Z';
-    printf("message %s\n", message);
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    M.val[0]='Z';
+    printf("message %s\n", M.val);
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_FAIL)
     {
         printf("Test Passed valid signature / invalid message\n");
@@ -232,12 +236,12 @@
 
 
     // Change the signature
-    message[0]='t';
+    M.val[0]='t';
     SIG1.val[0]=5;
-    printf("message %s\n", message);
+    printf("message %s\n", M.val);
     printf("Signature SIG1: ");
     OCT_output(&SIG1);
-    rc=BLS_ZZZ_VERIFY(&SIG1,message,&PK1);
+    rc=BLS_ZZZ_VERIFY(&SIG1,&M,&PK1);
     if (rc==BLS_INVALID_G1)
     {
         printf("Test Passed invalid signature / valid message\n");
@@ -278,8 +282,8 @@
     // initialise strong RNG
     CREATE_CSPRNG(&RNG,&SEED);
 
-    printf("\nTesting BLS signature for curve ZZZ\n");
-    if (!bls(&RNG))
+    printf("\nTest BLS for curve ZZZ\n");
+    if (!test(&RNG))
     {
         printf("SUCCESS\n");
     }
diff --git a/test/test_bls_sss_ZZZ.c.in b/test/test_bls_sss_ZZZ.c.in
new file mode 100644
index 0000000..57c8456
--- /dev/null
+++ b/test/test_bls_sss_ZZZ.c.in
@@ -0,0 +1,244 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+// smoke test for BLS SSS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "config_curve_ZZZ.h"
+#include "randapi.h"
+
+#if CURVE_SECURITY_ZZZ == 128
+#include "bls_ZZZ.h"
+#elif CURVE_SECURITY_ZZZ == 192
+#include "bls192_ZZZ.h"
+#elif CURVE_SECURITY_ZZZ == 256
+#include "bls256_ZZZ.h"
+#endif
+
+// Support multiple security levels
+#if CURVE_SECURITY_ZZZ == 128
+#define G2LEN 4*BFS_ZZZ
+#elif CURVE_SECURITY_ZZZ == 192
+#define G2LEN 8*BFS_ZZZ
+#elif CURVE_SECURITY_ZZZ == 256
+#define G2LEN 16*BFS_ZZZ
+#endif
+
+int test(csprng *RNG)
+{
+    int rc;
+    int n=4;
+    int k=3;
+
+    char m[2000];
+    octet M = {0,sizeof(m),m};
+
+    char ski[BGS_ZZZ];
+    octet SKI = {0,sizeof(ski),ski};
+    char pki[G2LEN];
+    octet PKI = {0,sizeof(pki),pki};
+
+    char sko[BGS_ZZZ];
+    octet SKO = {sizeof(sko),sizeof(sko),sko};
+    char skr[BGS_ZZZ];
+    octet SKR = {sizeof(skr),sizeof(skr),skr};
+
+    char sigi[BFS_ZZZ+1];
+    octet SIGI = {0,sizeof(sigi),sigi};
+    char sigr[BFS_ZZZ+1];
+    octet SIGR = {0,sizeof(sigr),sigr};
+
+    // Secret shares
+    char x[n][BGS_ZZZ];
+    octet X[n];
+    char y[n][BGS_ZZZ];
+    octet Y[n];
+
+    for(int i=0; i<n; i++)
+    {
+        memset(&y[i], 0, sizeof(y[i]));
+        Y[i].max = BGS_ZZZ;
+        Y[i].len = BGS_ZZZ;
+        Y[i].val = y[i];
+        memset(&x[i], 0, sizeof(x[i]));
+        X[i].max = BGS_ZZZ;
+        X[i].len = BGS_ZZZ;
+        X[i].val = x[i];
+    }
+
+    // Generate key pair
+    BLS_ZZZ_KEY_PAIR_GENERATE(RNG,&SKI,&PKI);
+
+    printf("Private key SKI: ");
+    OCT_output(&SKI);
+    printf("Public key PKI: ");
+    OCT_output(&PKI);
+    printf("\n");
+
+    // Sign the message
+    BLS_ZZZ_SIGN(&SIGI,&M,&SKI);
+
+    printf("SIGI: ");
+    OCT_output(&SIGI);
+
+    // Verify signature
+    rc=BLS_ZZZ_VERIFY(&SIGI,&M,&PKI);
+    if (rc!=BLS_OK)
+    {
+        printf("Test Failed Invalid Signature\n");
+        return 1;
+    }
+    printf("Test Passed valid signature is valid\n");
+
+    // Make shares of BLS secret key
+    rc = BLS_ZZZ_MAKE_SHARES(k, n, RNG, X, Y, &SKI, &SKO);
+    if (rc!=BLS_OK)
+    {
+        printf("Test Failed BLS_ZZZ_MAKE_SHARES\n");
+        return 1;
+    }
+    printf("Test Passed BLS_ZZZ_MAKE_SHARES\n");
+
+    for(int i=0; i<n; i++)
+    {
+        printf("X[%d] ", i);
+        OCT_output(&X[i]);
+        printf("Y[%d] ", i);
+        OCT_output(&Y[i]);
+    }
+
+    printf("SKO: ");
+    OCT_output(&SKO);
+
+    if (!OCT_comp(&SKI,&SKO))
+    {
+        printf("Test Failed SKI != SKO\n");
+        return 1;
+    }
+    printf("Test Passed SKI == SKO\n");
+
+    // Recover BLS secret key
+    rc = BLS_ZZZ_RECOVER_SECRET(k, X, Y, &SKR);
+    if (rc!=BLS_OK)
+    {
+        printf("Test Failed BLS_ZZZ_RECOVER_SECRET\n");
+        return 1;
+    }
+    printf("Test Passed BLS_ZZZ_RECOVER_SECRET\n");
+    printf("SKR: ");
+    OCT_output(&SKR);
+
+    if (!OCT_comp(&SKR,&SKO))
+    {
+        printf("Test Failed SKR != SKO\n");
+        return 1;
+    }
+    printf("Test Passed SKR == SKO\n");
+
+    // Generate public keys and signatures using shares
+    char pks[n][G2LEN];
+    octet PKS[n];
+    char sigs[n][BFS_ZZZ+1];
+    octet SIGS[n];
+    for(int i=0; i<n; i++)
+    {
+        memset(&sigs[i], 0, sizeof(sigs[i]));
+        SIGS[i].max = BFS_ZZZ+1;
+        SIGS[i].len = BFS_ZZZ+1;
+        SIGS[i].val = sigs[i];
+        memset(&PKS[i], 0, sizeof(PKS[i]));
+        PKS[i].max = G2LEN;
+        PKS[i].len = G2LEN;
+        PKS[i].val = pks[i];
+        BLS_ZZZ_KEY_PAIR_GENERATE(NULL,&Y[i],&PKS[i]);
+        BLS_ZZZ_SIGN(&SIGS[i],&M,&Y[i]);
+    }
+
+    for(int i=0; i<n; i++)
+    {
+        printf("PKS[%d] ", i);
+        OCT_output(&PKS[i]);
+    }
+
+    for(int i=0; i<n; i++)
+    {
+        printf("SIGS[%d] ", i);
+        OCT_output(&SIGS[i]);
+    }
+    printf("\n\n");
+
+    // Recover BLS signature
+    rc = BLS_ZZZ_RECOVER_SIGNATURE(k, X, SIGS, &SIGR);
+    if (rc!=BLS_OK)
+    {
+        printf("Test Failed BLS_ZZZ_RECOVER_SIGNATURE\n");
+        return 1;
+    }
+    printf("Test Passed BLS_ZZZ_RECOVER_SIGNATURE\n");
+    printf("SIGR: ");
+    OCT_output(&SIGR);
+
+    if (!OCT_comp(&SIGR,&SIGI))
+    {
+        printf("Test Failed SIGR != SIGI\n");
+        return 1;
+    }
+    printf("Test Passed SIGR == SIGI\n");
+
+    return 0;
+}
+
+
+int main()
+{
+#ifdef DEBUG
+    printf("%d bit build\n",CHUNK);
+#endif
+
+    char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
+    char seed[16] = {0};
+    octet SEED = {sizeof(seed),sizeof(seed),seed};
+
+    // CSPRNG
+    csprng RNG;
+
+    // fake random source
+    OCT_fromHex(&SEED,seedHex);
+    printf("SEED: ");
+    OCT_output(&SEED);
+
+    // initialise strong RNG
+    CREATE_CSPRNG(&RNG,&SEED);
+
+    printf("\nTest BLS SSS for curve ZZZ\n");
+    if (!test(&RNG))
+    {
+        printf("SUCCESS\n");
+    }
+    else
+    {
+        printf("FAILURE\n");
+    }
+
+    KILL_CSPRNG(&RNG);
+}
+
+
diff --git a/test/test_ff_consistency_WWW.c.in b/test/test_ff_consistency_WWW.c.in
new file mode 100644
index 0000000..12d3a1d
--- /dev/null
+++ b/test/test_ff_consistency_WWW.c.in
@@ -0,0 +1,287 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+/**
+ * @file test_big_consistency.c
+ * @author Samuele Andreoli
+ * @brief Test for consistency of FF_WWW
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "arch.h"
+#include "amcl.h"
+#include "utils.h"
+#include "ff_WWW.h"
+
+#define FS_WWW  MODBYTES_XXX*FFLEN_WWW
+#define HFS_WWW MODBYTES_XXX*HFLEN_WWW
+
+char *Phex = "cc44dc413faedf280f429f57881d48047e6041b16774b3074e81c6d2b2753269e61db41fb6a1bddc43f4257c49724f1d2678df0fc4d05032d228037c6580ed4b35001f1c01d788c1a5e2dfd3f676b25646d7df23d62bff478c5875327ca47b0145153fb316ad2289687fbc6fc113dca2d592e9761dd0d60577a1551c1cd37c29";
+char *Qhex = "f68a619af0db4e19ed9c32569b25650e4cd9d9b3949bad18ce58c77770413e823c92dea3eb0a0a41425b2a0ba4e329c42d89bba26548ec3544a9798c887a0e1bb419e73374202505ada6b63c63ba9af2b10ab7c80efe4bf752cb951e6c8a763d6fa6430c23547f2e671303bc3e9591f45696f25c2da64939ff2346f636581e0d";
+
+int main()
+{
+
+    int i;
+    char seed[256];
+    csprng RNG;
+
+    char oct[FS_WWW];
+    octet OCT = {0,FS_WWW,oct};
+
+    BIG_XXX A[HFLEN_WWW], B[HFLEN_WWW], C[HFLEN_WWW], D[HFLEN_WWW];
+    BIG_XXX F[FFLEN_WWW], G[FFLEN_WWW], H[FFLEN_WWW], L[FFLEN_WWW], P[FFLEN_WWW], Q[FFLEN_WWW], N[FFLEN_WWW];
+
+    /* Fake random source */
+    RAND_clean(&RNG);
+    for (i=0; i<256; i++) seed[i]=(char)i;
+    RAND_seed(&RNG,256,seed);
+
+    /* Testing general equality and equality to zero */
+    FF_WWW_zero(A, HFLEN_WWW);
+    FF_WWW_zero(B, HFLEN_WWW);
+
+    if(FF_WWW_comp(A,B,HFLEN_WWW) || !FF_WWW_iszilch(A, HFLEN_WWW))
+    {
+        printf("ERROR comparing or setting to zero\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test parity */
+    FF_WWW_one(A,HFLEN_WWW);
+    if (!FF_WWW_parity(A) || FF_WWW_parity(B))
+    {
+        printf("ERROR checking parity\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Test last bits */
+    FF_WWW_init(A,0xF8,HFLEN_WWW);
+    if(FF_WWW_lastbits(A,8) != 0xF8 || FF_WWW_lastbits(A,12) != 0xF8)
+    {
+        printf("ERROR checking last bits\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Testing copy*/
+    FF_WWW_random(F,&RNG,FFLEN_WWW);
+    FF_WWW_copy(G,F,FFLEN_WWW);
+    if(FF_WWW_comp(G,F,FFLEN_WWW))
+    {
+        printf("ERROR testing copy\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Testing addition, subtraction */
+    for (i=0; i<10; i++)
+    {
+        FF_WWW_random(F,&RNG,FFLEN_WWW);
+        FF_WWW_random(G,&RNG,FFLEN_WWW);
+        FF_WWW_copy(H,G,FFLEN_WWW);
+
+        FF_WWW_add(G,G,F,FFLEN_WWW);
+        FF_WWW_sub(G,G,F,FFLEN_WWW);
+        FF_WWW_sub(F,F,F,FFLEN_WWW);
+        if(FF_WWW_comp(G,H,FFLEN_WWW) || !FF_WWW_iszilch(F,FFLEN_WWW))
+        {
+            printf("ERROR testing addition/subtraction\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    FF_WWW_one(A,HFLEN_WWW);
+    FF_WWW_zero(B,HFLEN_WWW);
+
+    FF_WWW_add(C,A,B,HFLEN_WWW);
+    FF_WWW_add(B,B,B,HFLEN_WWW);
+    if(FF_WWW_comp(A,C,HFLEN_WWW) || !FF_WWW_iszilch(B,HFLEN_WWW))
+    {
+        printf("ERROR testing addition/subtraction\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Testing increment/decrement */
+    for (i=0; i<10; i++)
+    {
+        FF_WWW_random(F,&RNG,FFLEN_WWW);
+        FF_WWW_copy(H,F,FFLEN_WWW);
+
+        FF_WWW_inc(F,10,FFLEN_WWW);
+        FF_WWW_dec(F,10,FFLEN_WWW);
+        if(FF_WWW_comp(F,H,FFLEN_WWW))
+        {
+            printf("ERROR testing addition/subtraction\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    FF_WWW_zero(A,HFLEN_WWW);
+
+    FF_WWW_inc(A,0,HFLEN_WWW);
+    if(!FF_WWW_iszilch(A,HFLEN_WWW))
+    {
+        printf("ERROR testing addition/subtraction\n");
+        exit(EXIT_FAILURE);
+    }
+
+    FF_WWW_dec(A,0,HFLEN_WWW);
+    if(!FF_WWW_iszilch(A,HFLEN_WWW))
+    {
+        printf("ERROR testing addition/subtraction\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Testing shifts */
+    FF_WWW_one(A,HFLEN_WWW);
+    FF_WWW_init(B,2,HFLEN_WWW);
+    FF_WWW_one(C,HFLEN_WWW);
+
+    FF_WWW_shl(A,HFLEN_WWW);
+    if(FF_WWW_comp(A,B,HFLEN_WWW))
+    {
+        printf("ERROR testing shifts\n");
+        exit(EXIT_FAILURE);
+    }
+
+    FF_WWW_shr(A,HFLEN_WWW);
+    if(FF_WWW_comp(A,C,HFLEN_WWW))
+    {
+        printf("ERROR testing shifts\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Testing octet conversions */
+    for (i=0; i<10; i++)
+    {
+        OCT_clear(&OCT);
+
+        FF_WWW_random(F,&RNG,FFLEN_WWW);
+        FF_WWW_copy(H,F,FFLEN_WWW);
+
+        FF_WWW_toOctet(&OCT,F,FFLEN_WWW);
+        FF_WWW_zero(F,FFLEN_WWW);
+        FF_WWW_fromOctet(F,&OCT,FFLEN_WWW);
+
+        if(FF_WWW_comp(F,H,FFLEN_WWW))
+        {
+            printf("ERROR testing octet conversion\n");
+            exit(EXIT_FAILURE);
+        }
+
+        OCT_clear(&OCT);
+
+        FF_WWW_random(A,&RNG,HFLEN_WWW);
+        FF_WWW_copy(C,A,HFLEN_WWW);
+
+        FF_WWW_toOctet(&OCT,A,HFLEN_WWW);
+        FF_WWW_zero(A,HFLEN_WWW);
+        FF_WWW_fromOctet(A,&OCT,HFLEN_WWW);
+
+        if(FF_WWW_comp(A,C,HFLEN_WWW))
+        {
+            printf("ERROR testing octet conversion\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    /* Testing multiplication/square */
+    for (i=0; i<10; i++)
+    {
+        FF_WWW_random(A,&RNG,HFLEN_WWW);
+
+        FF_WWW_mul(F,A,A,HFLEN_WWW);
+        FF_WWW_sqr(G,A,HFLEN_WWW);
+
+        // Normalise for comparison
+        FF_WWW_norm(F,FFLEN_WWW);
+        FF_WWW_norm(G,FFLEN_WWW);
+
+        if(FF_WWW_comp(F,G,FFLEN_WWW))
+        {
+            printf("ERROR testing multiplication/square");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    /* Read P and Q primes from hex */
+    OCT_fromHex(&OCT, Phex);
+    OCT_pad(&OCT,FS_WWW);
+    FF_WWW_fromOctet(P,&OCT,FFLEN_WWW);
+
+    OCT_fromHex(&OCT, Qhex);
+    OCT_pad(&OCT,FS_WWW);
+    FF_WWW_fromOctet(Q,&OCT,FFLEN_WWW);
+
+    /* Testing inverse modulo P */
+    FF_WWW_one(C,HFLEN_WWW);
+    for (i=0; i< 10; i++)
+    {
+        FF_WWW_random(A,&RNG, HFLEN_WWW);
+        FF_WWW_mod(A,P,HFLEN_WWW);
+        FF_WWW_copy(B,A,HFLEN_WWW);
+
+        FF_WWW_invmodp(B,B,P,HFLEN_WWW);
+        FF_WWW_mul(F,A,B,HFLEN_WWW);
+        FF_WWW_mod(F,P,FFLEN_WWW);
+
+        if(FF_WWW_comp(C,F,HFLEN_WWW))
+        {
+            printf("ERROR testing inverse modulo p");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    /* Testing CRT */
+    FF_WWW_mul(N,P,Q,HFLEN_WWW);
+
+    for (i=0; i<10; i++)
+    {
+        FF_WWW_random(A,&RNG,HFLEN_WWW);
+        FF_WWW_random(B,&RNG,HFLEN_WWW);
+
+        FF_WWW_mul(H,A,B,HFLEN_WWW);
+        FF_WWW_mod(H,N,FFLEN_WWW);
+
+        FF_WWW_copy(C,A,HFLEN_WWW);
+        FF_WWW_copy(D,B,HFLEN_WWW);
+        FF_WWW_mod(A,P,HFLEN_WWW);
+        FF_WWW_mod(B,P,HFLEN_WWW);
+        FF_WWW_mod(C,Q,HFLEN_WWW);
+        FF_WWW_mod(D,Q,HFLEN_WWW);
+
+        FF_WWW_mul(F,A,B,HFLEN_WWW);
+        FF_WWW_mod(F,P,FFLEN_WWW);
+
+        FF_WWW_mul(G,C,D,HFLEN_WWW);
+        FF_WWW_mod(G,Q,FFLEN_WWW);
+
+        FF_WWW_crt(L,F,G,P,Q,HFLEN_WWW);
+
+        if(FF_WWW_comp(L,H,HFLEN_WWW))
+        {
+            printf("ERROR testing crt");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    printf("SUCCESS TEST CONSISTENCY OF FF_WWW PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/test_output_functions_ZZZ.c.in b/test/test_output_functions_ZZZ.c.in
index c32bfc0..fae38b0 100644
--- a/test/test_output_functions_ZZZ.c.in
+++ b/test/test_output_functions_ZZZ.c.in
@@ -304,7 +304,7 @@
 
 void read_OCT(octet *oct, char* string, int len)
 {
-    char buff[len-1];
+    char buff[len];
     strncpy(buff,string,len-1);
     buff[len-1] = '\0';
     OCT_fromHex(oct,buff);
diff --git a/test/test_paillier_add.c b/test/test_paillier_add.c
new file mode 100644
index 0000000..4d486c5
--- /dev/null
+++ b/test/test_paillier_add.c
@@ -0,0 +1,155 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "amcl.h"
+#include "paillier.h"
+
+#define LINE_LEN 2000
+
+void read_OCTET(octet* OCT, char* string)
+{
+    int len = strlen(string);
+    char buff[len];
+    memcpy(buff,string,len);
+    char *end = strchr(buff,',');
+    if (end == NULL)
+    {
+        printf("ERROR unexpected test vector %s\n",string);
+        exit(EXIT_FAILURE);
+    }
+    end[0] = '\0';
+    OCT_fromHex(OCT,buff);
+}
+
+void read_FF_4096(BIG_512_60 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_4096_fromOctet(x, &OCT, n);
+}
+
+int main(int argc, char** argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_paillier_add [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int len = 0;
+    FILE *fp=NULL;
+
+    char line[LINE_LEN]= {0};
+    char *linePtr=NULL;
+
+    char ct[FS_4096]= {0};
+    octet CT = {0,sizeof(ct),ct};
+
+    int testNo;
+    const char* TESTline = "TEST = ";
+
+    PAILLIER_public_key PUB;
+    const char* Nline = "N = ";
+
+    char ct1golden[FS_4096]= {0};
+    octet CT1GOLDEN = {0,sizeof(ct1golden),ct1golden};
+    const char* CT1line = "CIPHERTEXT1 = ";
+
+    char ct2golden[FS_4096]= {0};
+    octet CT2GOLDEN = {0,sizeof(ct2golden),ct2golden};
+    const char* CT2line = "CIPHERTEXT2 = ";
+
+    char ctgolden[FS_4096];
+    octet CTGOLDEN = {0,sizeof(ctgolden),ctgolden};
+    const char* CTline = "CIPHERTEXT = ";
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        // Read TEST Number
+        if (!strncmp(line,TESTline, strlen(TESTline)))
+        {
+            len = strlen(TESTline);
+            linePtr = line + len;
+            sscanf(linePtr,"%d\n",&testNo);
+        }
+
+        // Read N
+        if (!strncmp(line,Nline, strlen(Nline)))
+        {
+            len = strlen(Nline);
+            linePtr = line + len;
+            read_FF_4096(PUB.n, linePtr, HFLEN_4096);
+
+            FF_4096_sqr(PUB.n2, PUB.n, HFLEN_4096);
+            FF_4096_norm(PUB.n2, FFLEN_4096);
+        }
+
+        // Read CIPHERTEXT1
+        if (!strncmp(line,CT1line, strlen(CT1line)))
+        {
+            len = strlen(CT1line);
+            linePtr = line + len;
+            read_OCTET(&CT1GOLDEN,linePtr);
+        }
+
+        // Read CIPHERTEXT2
+        if (!strncmp(line,CT2line, strlen(CT2line)))
+        {
+            len = strlen(CT2line);
+            linePtr = line + len;
+            read_OCTET(&CT2GOLDEN,linePtr);
+        }
+
+        // Read CIPHERTEXT and process test vector
+        if (!strncmp(line,CTline, strlen(CTline)))
+        {
+            len = strlen(CTline);
+            linePtr = line + len;
+            read_OCTET(&CTGOLDEN,linePtr);
+
+            PAILLIER_ADD(&PUB, &CT1GOLDEN, &CT2GOLDEN, &CT);
+
+            if(!(OCT_comp(&CTGOLDEN,&CT)))
+            {
+                fprintf(stderr, "FAILURE Test %d\n", testNo);
+                fclose(fp);
+                exit(EXIT_FAILURE);
+            }
+        }
+    }
+
+    fclose(fp);
+
+    printf("SUCCESS TEST PAILLIER ADD PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/test_paillier_consistency.c b/test/test_paillier_consistency.c
new file mode 100644
index 0000000..7c1d1ab
--- /dev/null
+++ b/test/test_paillier_consistency.c
@@ -0,0 +1,220 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+/*
+   Smoke test of Paillier crypto system.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "randapi.h"
+#include "paillier.h"
+
+#define NTHREADS 2
+
+char* PT3GOLDEN_hex = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a";
+
+void ff_4096_compare(BIG_512_60 *a, BIG_512_60 *b, char *msg, int n)
+{
+    if(FF_4096_comp(a, b, n))
+    {
+        fprintf(stderr, "FAILURE %s\n", msg);
+        exit(EXIT_FAILURE);
+    }
+}
+
+void ff_2048_compare(BIG_1024_58 *a, BIG_1024_58 *b, char *msg, int n)
+{
+    if(FF_2048_comp(a, b, n))
+    {
+        fprintf(stderr, "FAILURE %s\n", msg);
+        exit(EXIT_FAILURE);
+    }
+}
+
+int paillier(csprng *RNG)
+{
+    BIG_1024_58 zero[FFLEN_2048];
+
+    // Key material
+    PAILLIER_private_key PRIV;
+    PAILLIER_public_key PUB, PUBIN;
+
+    char pub[HFS_4096];
+    octet PUBOCT = {0,HFS_4096,pub};
+
+    // Plaintext to encrypt
+    char ptin[NTHREADS][FS_2048];
+    octet PTIN[NTHREADS];
+    char ptout[NTHREADS][FS_2048];
+    octet PTOUT[NTHREADS];
+
+    // Constant value for multiplication
+    char ptko[NTHREADS][FS_2048];
+    octet PTK[NTHREADS];
+
+    // Encrypted PTIN values
+    char cto[NTHREADS][FS_4096];
+    octet CT[NTHREADS];
+
+    // Homomorphic multiplicaton of plaintext by a constant ciphertext
+    char cta[NTHREADS][FS_4096];
+    octet CTA[NTHREADS];
+
+    // Homomorphic addition of ciphertext
+    char cto3[FS_4096] = {0};
+    octet CT3 = {0,sizeof(cto3),cto3};
+
+    // Output plaintext of addition of homomorphic multiplication values
+    char pto3[FS_2048] = {0};
+    octet PT3 = {sizeof(pto3),sizeof(pto3),pto3};
+
+    // Expected output plaintext of addition of homomorphic multiplication values
+    char ptog3[FS_2048] = {0};
+    octet PT3GOLDEN = {sizeof(ptog3),sizeof(ptog3),ptog3};
+
+    // Expected ouput is 26 / 0x1a i.e. 2*3 + 4*5
+    int values[NTHREADS] = {2,4};
+    int kvalues[NTHREADS] = {3,5};
+
+    // Initialize octets
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PTIN[i].max = FS_2048;
+        PTIN[i].val = ptin[i];
+        OCT_clear(&PTIN[i]);
+
+        PTOUT[i].max = FS_2048;
+        PTOUT[i].val = ptout[i];
+        OCT_clear(&PTOUT[i]);
+
+        PTK[i].max = FS_2048;
+        PTK[i].val = ptko[i];
+        OCT_clear(&PTIN[i]);
+
+        CT[i].max = FS_4096;
+        CT[i].val = cto[i];
+        OCT_clear(&PTIN[i]);
+
+        CTA[i].max = FS_4096;
+        CTA[i].val = cta[i];
+        OCT_clear(&PTIN[i]);
+    }
+
+    PAILLIER_KEY_PAIR(RNG, NULL, NULL, &PUB, &PRIV);
+
+    // Check public key i/o functions
+    PAILLIER_PK_toOctet(&PUBOCT, &PUB);
+    PAILLIER_PK_fromOctet(&PUBIN, &PUBOCT);
+
+    ff_4096_compare(PUB.n,  PUBIN.n,  "n not correctly loaded",   FFLEN_4096);
+    ff_4096_compare(PUB.g,  PUBIN.g,  "g not correctly loaded",   FFLEN_4096);
+    ff_4096_compare(PUB.n2, PUBIN.n2, "n^2 not correctly loaded", FFLEN_4096);
+
+    // Set plaintext values
+    for(int i=0; i<NTHREADS; i++)
+    {
+        BIG_1024_58 pt[FFLEN_2048];
+        FF_2048_init(pt, values[i],FFLEN_2048);
+        FF_2048_toOctet(&PTIN[i], pt, FFLEN_2048);
+
+        BIG_1024_58 ptk[FFLEN_2048];
+        FF_2048_init(ptk, kvalues[i],FFLEN_2048);
+        FF_2048_toOctet(&PTK[i], ptk, FFLEN_2048);
+    }
+
+    // Encrypt plaintext
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_ENCRYPT(RNG, &PUB, &PTIN[i], &CT[i], NULL);
+    }
+
+    // Decrypt ciphertexts
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_DECRYPT(&PRIV, &CT[i], &PTOUT[i]);
+    }
+
+    for(int i=0; i<NTHREADS; i++)
+    {
+        PAILLIER_MULT(&PUB, &CT[i], &PTK[i], &CTA[i]);
+    }
+
+    PAILLIER_ADD(&PUB, &CTA[0], &CTA[1], &CT3);
+
+    PAILLIER_DECRYPT(&PRIV, &CT3, &PT3);
+
+    OCT_fromHex(&PT3GOLDEN,PT3GOLDEN_hex);
+    if(!OCT_comp(&PT3GOLDEN,&PT3))
+    {
+        fprintf(stderr, "FAILURE PT3 != PT3GOLDEN\n");
+        exit(EXIT_FAILURE);
+    }
+
+    PAILLIER_PRIVATE_KEY_KILL(&PRIV);
+
+    FF_2048_zero(zero, FFLEN_2048);
+    ff_2048_compare(zero, PRIV.p,    "p not cleaned from private key",    HFLEN_2048);
+    ff_2048_compare(zero, PRIV.q,    "q not cleaned from private key",    HFLEN_2048);
+    ff_2048_compare(zero, PRIV.lp,   "lp not cleaned from private key",   HFLEN_2048);
+    ff_2048_compare(zero, PRIV.lq,   "lq not cleaned from private key",   HFLEN_2048);
+    ff_2048_compare(zero, PRIV.mp,   "mp not cleaned from private key",   HFLEN_2048);
+    ff_2048_compare(zero, PRIV.mq,   "mq not cleaned from private key",   HFLEN_2048);
+    ff_2048_compare(zero, PRIV.p2,   "p2 not cleaned from private key",   FFLEN_2048);
+    ff_2048_compare(zero, PRIV.q2,   "q2 not cleaned from private key",   FFLEN_2048);
+    ff_2048_compare(zero, PRIV.invp, "invp not cleaned from private key", FFLEN_2048);
+    ff_2048_compare(zero, PRIV.invq, "invq not cleaned from private key", FFLEN_2048);
+
+    OCT_clear(&CT3);
+    OCT_clear(&PT3);
+    for(int i=0; i<NTHREADS; i++)
+    {
+        OCT_clear(&PTIN[i]);
+        OCT_clear(&PTOUT[i]);
+        OCT_clear(&CT[i]);
+        OCT_clear(&CTA[i]);
+    }
+
+    printf("SUCCESS\n");
+    exit(EXIT_SUCCESS);
+}
+
+int main()
+{
+    char* seedHex = "78d0fb6705ce77dee47d03eb5b9c5d30";
+    char seed[16] = {0};
+    octet SEED = {sizeof(seed),sizeof(seed),seed};
+
+    // CSPRNG
+    csprng RNG;
+
+    // fake random source
+    OCT_fromHex(&SEED,seedHex);
+    printf("SEED: ");
+    OCT_output(&SEED);
+
+    // initialise strong RNG
+    CREATE_CSPRNG(&RNG,&SEED);
+
+    paillier(&RNG);
+
+    KILL_CSPRNG(&RNG);
+}
diff --git a/test/test_paillier_decrypt.c b/test/test_paillier_decrypt.c
new file mode 100644
index 0000000..c9fde68
--- /dev/null
+++ b/test/test_paillier_decrypt.c
@@ -0,0 +1,199 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "amcl.h"
+#include "paillier.h"
+
+#define LINE_LEN 2000
+
+void read_OCTET(octet* OCT, char* string)
+{
+    int len = strlen(string);
+    char buff[len];
+    memcpy(buff,string,len);
+    char *end = strchr(buff,',');
+    if (end == NULL)
+    {
+        printf("ERROR unexpected test vector %s\n",string);
+        exit(EXIT_FAILURE);
+    }
+    end[0] = '\0';
+    OCT_fromHex(OCT,buff);
+}
+
+void read_FF_2048(BIG_1024_58 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_2048_fromOctet(x, &OCT, n);
+}
+
+int main(int argc, char** argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_paillier_decrypt [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int len=0;
+    FILE *fp;
+
+    char line[LINE_LEN]= {0};
+    char *linePtr=NULL;
+
+    char pt[FS_2048]= {0};
+    octet PT = {0,sizeof(pt),pt};
+
+    int testNo=0;
+    const char* TESTline = "TEST = ";
+
+    PAILLIER_private_key PRIV;
+    const char* Pline = "P = ";
+    const char* Qline = "Q = ";
+    const char* LPline = "LP = ";
+    const char* MPline = "MP = ";
+    const char* LQline = "LQ = ";
+    const char* MQline = "MQ = ";
+
+    char ptgolden[FS_2048]= {0};
+    octet PTGOLDEN = {0,sizeof(ptgolden),ptgolden};
+    const char* PTline = "PLAINTEXT = ";
+
+    char ctgolden[FS_4096]= {0};
+    octet CTGOLDEN = {0,sizeof(ctgolden),ctgolden};
+    const char* CTline = "CIPHERTEXT = ";
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        // Read TEST Number
+        if (!strncmp(line, TESTline, strlen(TESTline)))
+        {
+            len = strlen(TESTline);
+            linePtr = line + len;
+            sscanf(linePtr,"%d\n",&testNo);
+        }
+
+        // Read P
+        if (!strncmp(line, Pline, strlen(Pline)))
+        {
+            len = strlen(Pline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.p, linePtr, HFLEN_2048);
+
+            FF_2048_zero(PRIV.p2, FFLEN_2048);
+            FF_2048_sqr(PRIV.p2, PRIV.p, HFLEN_2048);
+            FF_2048_norm(PRIV.p2, FFLEN_2048);
+
+            FF_2048_zero(PRIV.invp, FFLEN_2048);
+            FF_2048_invmod2m(PRIV.invp, PRIV.p, HFLEN_2048);
+        }
+
+        // Read Q
+        if (!strncmp(line, Qline, strlen(Qline)))
+        {
+            len = strlen(Qline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.q, linePtr, HFLEN_2048);
+
+            FF_2048_zero(PRIV.q2, FFLEN_2048);
+            FF_2048_sqr(PRIV.q2, PRIV.q, HFLEN_2048);
+            FF_2048_norm(PRIV.q2, FFLEN_2048);
+
+            FF_2048_zero(PRIV.invq, FFLEN_2048);
+            FF_2048_invmod2m(PRIV.invq, PRIV.q, HFLEN_2048);
+        }
+
+        // Read LP
+        if (!strncmp(line, LPline, strlen(LPline)))
+        {
+            len = strlen(LPline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.lp, linePtr, HFLEN_2048);
+        }
+
+        // Read LQ
+        if (!strncmp(line, LQline, strlen(LQline)))
+        {
+            len = strlen(LQline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.lq, linePtr, HFLEN_2048);
+        }
+
+        // Read MP
+        if (!strncmp(line, MPline, strlen(MPline)))
+        {
+            len = strlen(MPline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.mp, linePtr, HFLEN_2048);
+        }
+
+        // Read MQ
+        if (!strncmp(line, MQline, strlen(MQline)))
+        {
+            len = strlen(MQline);
+            linePtr = line + len;
+            read_FF_2048(PRIV.mq, linePtr, HFLEN_2048);
+        }
+
+        // Read CIPHERTEXT
+        if (!strncmp(line, CTline, strlen(CTline)))
+        {
+            len = strlen(CTline);
+            linePtr = line + len;
+            read_OCTET(&CTGOLDEN,linePtr);
+        }
+
+        // Read PLAINTEXT and process test vector
+        if (!strncmp(line, PTline, strlen(PTline)))
+        {
+            len = strlen(PTline);
+            linePtr = line + len;
+            read_OCTET(&PTGOLDEN,linePtr);
+
+            PAILLIER_DECRYPT(&PRIV, &CTGOLDEN, &PT);
+
+            if(!OCT_comp(&PTGOLDEN,&PT))
+            {
+                fprintf(stderr, "FAILURE Test %d\n", testNo);
+                fclose(fp);
+                exit(EXIT_FAILURE);
+            }
+        }
+    }
+
+    fclose(fp);
+
+    printf("SUCCESS TEST PAILLIER DECRYPTION PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/test_paillier_encrypt.c b/test/test_paillier_encrypt.c
new file mode 100644
index 0000000..97b6800
--- /dev/null
+++ b/test/test_paillier_encrypt.c
@@ -0,0 +1,167 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "amcl.h"
+#include "paillier.h"
+
+#define LINE_LEN 2000
+
+void read_OCTET(octet* OCT, char* string)
+{
+    int len = strlen(string);
+    char buff[len];
+    memcpy(buff,string,len);
+    char *end = strchr(buff,',');
+    if (end == NULL)
+    {
+        printf("ERROR unexpected test vector %s\n",string);
+        exit(EXIT_FAILURE);
+    }
+    end[0] = '\0';
+    OCT_fromHex(OCT,buff);
+}
+
+void read_FF_4096(BIG_512_60 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_4096_fromOctet(x, &OCT, n);
+}
+
+int main(int argc, char** argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_paillier_encrypt [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int len=0;
+    FILE *fp=NULL;
+
+    char line[LINE_LEN]= {0};
+    char *linePtr=NULL;
+
+    char ct[FS_4096]= {0};
+    octet CT = {0,sizeof(ct),ct};
+
+    int testNo=0;
+    const char* TESTline = "TEST = ";
+
+    PAILLIER_public_key PUB;
+    const char* Nline = "N = ";
+    const char* Gline = "G = ";
+
+    char rgolden[FS_4096]= {0};
+    octet RGOLDEN = {0,sizeof(rgolden),rgolden};
+    const char* Rline = "R = ";
+
+    char ptgolden[FS_2048]= {0};
+    octet PTGOLDEN = {0,sizeof(ptgolden),ptgolden};
+    const char* PTline = "PLAINTEXT = ";
+
+    char ctgolden[FS_4096]= {0};
+    octet CTGOLDEN = {0,sizeof(ctgolden),ctgolden};
+    const char* CTline = "CIPHERTEXT = ";
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        // Read TEST Number
+        if (!strncmp(line,TESTline, strlen(TESTline)))
+        {
+            len = strlen(TESTline);
+            linePtr = line + len;
+            sscanf(linePtr,"%d\n",&testNo);
+        }
+
+        // Read N
+        if (!strncmp(line,Nline, strlen(Nline)))
+        {
+            len = strlen(Nline);
+            linePtr = line + len;
+            FF_4096_zero(PUB.n, FFLEN_4096);
+            read_FF_4096(PUB.n, linePtr, HFLEN_4096);
+
+            FF_4096_sqr(PUB.n2, PUB.n, HFLEN_4096);
+            FF_4096_norm(PUB.n2, FFLEN_4096);
+        }
+
+
+        // Read G
+        if (!strncmp(line,Gline, strlen(Gline)))
+        {
+            len = strlen(Gline);
+            linePtr = line + len;
+            FF_4096_zero(PUB.g, FFLEN_4096);
+            read_FF_4096(PUB.g, linePtr, HFLEN_4096);
+        }
+
+        // Read R
+        if (!strncmp(line,Rline, strlen(Rline)))
+        {
+            len = strlen(Rline);
+            linePtr = line + len;
+            read_OCTET(&RGOLDEN,linePtr);
+        }
+
+        // Read PLAINTEXT
+        if (!strncmp(line,PTline, strlen(PTline)))
+        {
+            len = strlen(PTline);
+            linePtr = line + len;
+            read_OCTET(&PTGOLDEN,linePtr);
+        }
+
+        // Read CIPHERTEXT and process test vector
+        if (!strncmp(line,CTline, strlen(CTline)))
+        {
+            len = strlen(CTline);
+            linePtr = line + len;
+            read_OCTET(&CTGOLDEN,linePtr);
+
+            PAILLIER_ENCRYPT(NULL, &PUB, &PTGOLDEN, &CT, &RGOLDEN);
+
+            if(!OCT_comp(&CTGOLDEN,&CT))
+            {
+                fprintf(stderr, "FAILURE Test %d\n", testNo);
+                fclose(fp);
+                exit(EXIT_FAILURE);
+            }
+        }
+    }
+
+    fclose(fp);
+
+    printf("SUCCESS TEST PAILLIER ENCRYPTION PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/test_paillier_keygen.c b/test/test_paillier_keygen.c
new file mode 100644
index 0000000..0b65b2a
--- /dev/null
+++ b/test/test_paillier_keygen.c
@@ -0,0 +1,287 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "amcl.h"
+#include "randapi.h"
+#include "paillier.h"
+
+#define LINE_LEN 2000
+
+void read_OCTET(octet* OCT, char* string)
+{
+    int len = strlen(string);
+    char buff[len];
+    memcpy(buff,string,len);
+    char *end = strchr(buff,',');
+    if (end == NULL)
+    {
+        printf("ERROR unexpected test vector %s\n",string);
+        exit(EXIT_FAILURE);
+    }
+    end[0] = '\0';
+    OCT_fromHex(OCT,buff);
+}
+
+void read_FF_2048(BIG_1024_58 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_2048_fromOctet(x, &OCT, n);
+}
+
+void read_FF_4096(BIG_512_60 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_4096_fromOctet(x, &OCT, n);
+}
+
+void ff_4096_compare(char *x_name, char* y_name, BIG_512_60 *x, BIG_512_60 *y, int n)
+{
+    if(FF_4096_comp(x, y, n))
+    {
+        fprintf(stderr, "FAILURE %s != %s\n", x_name, y_name);
+        exit(EXIT_FAILURE);
+    }
+}
+
+void ff_2048_compare(char *x_name, char* y_name, BIG_1024_58 *x, BIG_1024_58 *y, int n)
+{
+    if(FF_2048_comp(x, y, n))
+    {
+        fprintf(stderr, "FAILURE %s != %s\n", x_name, y_name);
+        exit(EXIT_FAILURE);
+    }
+}
+
+void clean_public(PAILLIER_public_key *PUB)
+{
+    FF_4096_zero(PUB->n, FFLEN_4096);
+    FF_4096_zero(PUB->g, FFLEN_4096);
+    FF_4096_zero(PUB->n2, FFLEN_4096);
+}
+
+int main(int argc, char** argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_paillier_decrypt [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int len=0;
+    FILE *fp;
+
+    char line[LINE_LEN]= {0};
+    char * linePtr=NULL;
+
+    int testSeed=0;
+
+    PAILLIER_private_key PRIV;
+    PAILLIER_public_key PUB;
+
+    int testNo=0;
+    const char* TESTline = "TEST = ";
+
+    char seedgolden[32]= {0};
+    octet SEEDGOLDEN = {0,sizeof(seedgolden),seedgolden};
+    const char* SEEDline = "SEED = ";
+
+    char pgolden[HFS_2048]= {0};
+    octet PGOLDEN = {0,sizeof(pgolden),pgolden};
+    const char* Pline = "P = ";
+
+    char qgolden[HFS_2048]={0};
+    octet QGOLDEN = {0,sizeof(qgolden),qgolden};
+    const char* Qline = "Q = ";
+
+    PAILLIER_private_key PRIVGOLDEN;
+    PAILLIER_public_key PUBGOLDEN;
+    const char* Nline = "N = ";
+    const char* Gline = "G = ";
+    const char* LPline = "LP = ";
+    const char* MPline = "MP = ";
+    const char* LQline = "LQ = ";
+    const char* MQline = "MQ = ";
+
+    // Clean GOLDEN keys, the generated keys should be cleaned
+    // during initialisation
+    PAILLIER_PRIVATE_KEY_KILL(&PRIVGOLDEN);
+    clean_public(&PUBGOLDEN);
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        // Read TEST Number
+        if (!strncmp(line,TESTline, strlen(TESTline)))
+        {
+            len = strlen(TESTline);
+            linePtr = line + len;
+            sscanf(linePtr,"%d\n",&testNo);
+        }
+
+        // Read SEED
+        if (!strncmp(line,SEEDline, strlen(SEEDline)))
+        {
+            len = strlen(SEEDline);
+            linePtr = line + len;
+            read_OCTET(&SEEDGOLDEN,linePtr);
+            testSeed = 1;
+        }
+
+        // Read G
+        if (!strncmp(line, Gline, strlen(Gline)))
+        {
+            len = strlen(Gline);
+            linePtr = line + len;
+            read_FF_4096(PUBGOLDEN.g, linePtr, HFLEN_4096);
+        }
+
+        // Read N
+        if (!strncmp(line, Nline, strlen(Nline)))
+        {
+            len = strlen(Nline);
+            linePtr = line + len;
+
+            FF_4096_zero(PUBGOLDEN.n, FFLEN_4096);
+            read_FF_4096(PUBGOLDEN.n, linePtr, HFLEN_4096);
+
+            FF_4096_sqr(PUBGOLDEN.n2, PUBGOLDEN.n, HFLEN_4096);
+            FF_4096_norm(PUBGOLDEN.n2, FFLEN_4096);
+        }
+
+        // Read P
+        if (!strncmp(line, Pline, strlen(Pline)))
+        {
+            len = strlen(Pline);
+            linePtr = line + len;
+            read_OCTET(&PGOLDEN, linePtr);
+            read_FF_2048(PRIVGOLDEN.p, linePtr, HFLEN_2048);
+
+            FF_2048_sqr(PRIVGOLDEN.p2, PRIVGOLDEN.p, HFLEN_2048);
+            FF_2048_norm(PRIVGOLDEN.p2, FFLEN_2048);
+            FF_2048_invmod2m(PRIVGOLDEN.invp, PRIVGOLDEN.p, HFLEN_2048);
+        }
+
+        // Read Q
+        if (!strncmp(line, Qline, strlen(Qline)))
+        {
+            len = strlen(Qline);
+            linePtr = line + len;
+            read_OCTET(&QGOLDEN, linePtr);
+            read_FF_2048(PRIVGOLDEN.q, linePtr, HFLEN_2048);
+
+            FF_2048_sqr(PRIVGOLDEN.q2, PRIVGOLDEN.q, HFLEN_2048);
+            FF_2048_norm(PRIVGOLDEN.q2, FFLEN_2048);
+            FF_2048_invmod2m(PRIVGOLDEN.invq, PRIVGOLDEN.q, HFLEN_2048);
+        }
+
+        // Read LP
+        if (!strncmp(line, LPline, strlen(LPline)))
+        {
+            len = strlen(LPline);
+            linePtr = line + len;
+            read_FF_2048(PRIVGOLDEN.lp, linePtr, HFLEN_2048);
+        }
+
+        // Read LQ
+        if (!strncmp(line, LQline, strlen(LQline)))
+        {
+            len = strlen(LQline);
+            linePtr = line + len;
+            read_FF_2048(PRIVGOLDEN.lq, linePtr, HFLEN_2048);
+        }
+
+        // Read MP
+        if (!strncmp(line, MPline, strlen(MPline)))
+        {
+            len = strlen(MPline);
+            linePtr = line + len;
+            read_FF_2048(PRIVGOLDEN.mp, linePtr, HFLEN_2048);
+        }
+
+        // Read MQ and process test vector
+        if (!strncmp(line, MQline, strlen(MQline)))
+        {
+            len = strlen(MQline);
+            linePtr = line + len;
+            read_FF_2048(PRIVGOLDEN.mq, linePtr, HFLEN_2048);
+
+            if (testSeed)
+            {
+                testSeed=0;
+
+                // CSPRNG
+                csprng RNG;
+
+                // initialise strong RNG
+                CREATE_CSPRNG(&RNG,&SEEDGOLDEN);
+
+                PAILLIER_KEY_PAIR(&RNG, NULL, NULL, &PUB, &PRIV);
+            }
+            else
+            {
+                PAILLIER_KEY_PAIR(NULL, &PGOLDEN, &QGOLDEN, &PUB, &PRIV);
+            }
+
+            ff_2048_compare("PRIV.p",    "PRIVGOLDEN.p",    PRIV.p,    PRIVGOLDEN.p,    HFLEN_2048);
+            ff_2048_compare("PRIV.q",    "PRIVGOLDEN.q",    PRIV.q,    PRIVGOLDEN.q,    HFLEN_2048);
+            ff_2048_compare("PRIV.lp",   "PRIVGOLDEN.lp",   PRIV.lp,   PRIVGOLDEN.lp,   HFLEN_2048);
+            ff_2048_compare("PRIV.mp",   "PRIVGOLDEN.mp",   PRIV.mp,   PRIVGOLDEN.mp,   HFLEN_2048);
+            ff_2048_compare("PRIV.lq",   "PRIVGOLDEN.lq",   PRIV.lq,   PRIVGOLDEN.lq,   HFLEN_2048);
+            ff_2048_compare("PRIV.mq",   "PRIVGOLDEN.mq",   PRIV.mq,   PRIVGOLDEN.mq,   HFLEN_2048);
+            ff_2048_compare("PRIV.invp", "PRIVGOLDEN.invp", PRIV.invp, PRIVGOLDEN.invp, FFLEN_2048);
+            ff_2048_compare("PRIV.p2",   "PRIVGOLDEN.p2",   PRIV.p2,   PRIVGOLDEN.p2,   FFLEN_2048);
+            ff_2048_compare("PRIV.invq", "PRIVGOLDEN.invq", PRIV.invq, PRIVGOLDEN.invq, FFLEN_2048);
+            ff_2048_compare("PRIV.q2",   "PRIVGOLDEN.q2",   PRIV.q2,   PRIVGOLDEN.q2,   FFLEN_2048);
+
+            ff_4096_compare("PUB.n",  "PUBGOLDEN.n",  PUB.n,  PUBGOLDEN.n,  FFLEN_4096);
+            ff_4096_compare("PUB.g",  "PUBGOLDEN.g",  PUB.g,  PUBGOLDEN.g,  FFLEN_4096);
+            ff_4096_compare("PUB.n2", "PUBGOLDEN.n2", PUB.n2, PUBGOLDEN.n2, FFLEN_4096);
+
+            // Clean keys for next test vector
+            PAILLIER_PRIVATE_KEY_KILL(&PRIV);
+            PAILLIER_PRIVATE_KEY_KILL(&PRIVGOLDEN);
+
+            clean_public(&PUB);
+            clean_public(&PUBGOLDEN);
+        }
+    }
+
+    fclose(fp);
+
+    printf("SUCCESS TEST PAILLIER KEYGEN PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/test/test_paillier_mult.c b/test/test_paillier_mult.c
new file mode 100644
index 0000000..f2cf70e
--- /dev/null
+++ b/test/test_paillier_mult.c
@@ -0,0 +1,155 @@
+/*
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "amcl.h"
+#include "paillier.h"
+
+#define LINE_LEN 2000
+
+void read_OCTET(octet* OCT, char* string)
+{
+    int len = strlen(string);
+    char buff[len];
+    memcpy(buff,string,len);
+    char *end = strchr(buff,',');
+    if (end == NULL)
+    {
+        printf("ERROR unexpected test vector %s\n",string);
+        exit(EXIT_FAILURE);
+    }
+    end[0] = '\0';
+    OCT_fromHex(OCT,buff);
+}
+
+void read_FF_4096(BIG_512_60 *x, char* string, int n)
+{
+    int len = strlen(string);
+    char oct[len/2];
+    octet OCT = {0, len/2, oct};
+
+    read_OCTET(&OCT, string);
+    FF_4096_fromOctet(x, &OCT, n);
+}
+
+int main(int argc, char** argv)
+{
+    if (argc != 2)
+    {
+        printf("usage: ./test_paillier_mult [path to test vector file]\n");
+        exit(EXIT_FAILURE);
+    }
+
+    int len=0;
+    FILE *fp=NULL;
+
+    char line[LINE_LEN]= {0};
+    char *linePtr=NULL;
+
+    char ct[FS_4096]= {0};
+    octet CT = {0,sizeof(ct),ct};
+
+    int testNo=0;
+    const char* TESTline = "TEST = ";
+
+    PAILLIER_public_key PUB;
+    const char* Nline = "N = ";
+
+    char ct1golden[FS_4096]= {0};
+    octet CT1GOLDEN = {0,sizeof(ct1golden),ct1golden};
+    const char* CT1line = "CIPHERTEXT1 = ";
+
+    char pt2golden[FS_2048]= {0};
+    octet PT2GOLDEN = {0,sizeof(pt2golden),pt2golden};
+    const char* PT2line = "PLAINTEXT2 = ";
+
+    char ctgolden[FS_4096]= {0};
+    octet CTGOLDEN = {0,sizeof(ctgolden),ctgolden};
+    const char* CTline = "CIPHERTEXT = ";
+
+    fp = fopen(argv[1], "r");
+    if (fp == NULL)
+    {
+        printf("ERROR opening test vector file\n");
+        exit(EXIT_FAILURE);
+    }
+
+    while (fgets(line, LINE_LEN, fp) != NULL)
+    {
+        // Read TEST Number
+        if (!strncmp(line,TESTline, strlen(TESTline)))
+        {
+            len = strlen(TESTline);
+            linePtr = line + len;
+            sscanf(linePtr,"%d\n",&testNo);
+        }
+
+        // Read N
+        if (!strncmp(line,Nline, strlen(Nline)))
+        {
+            len = strlen(Nline);
+            linePtr = line + len;
+            read_FF_4096(PUB.n, linePtr, HFLEN_4096);
+
+            FF_4096_sqr(PUB.n2, PUB.n, HFLEN_4096);
+            FF_4096_norm(PUB.n2, FFLEN_4096);
+        }
+
+        // Read CIPHERTEXT1
+        if (!strncmp(line,CT1line, strlen(CT1line)))
+        {
+            len = strlen(CT1line);
+            linePtr = line + len;
+            read_OCTET(&CT1GOLDEN,linePtr);
+        }
+
+        // Read PLAINTEXT2
+        if (!strncmp(line,PT2line, strlen(PT2line)))
+        {
+            len = strlen(PT2line);
+            linePtr = line + len;
+            read_OCTET(&PT2GOLDEN,linePtr);
+        }
+
+        // Read CIPHERTEXT and process test vector
+        if (!strncmp(line,CTline, strlen(CTline)))
+        {
+            len = strlen(CTline);
+            linePtr = line + len;
+            read_OCTET(&CTGOLDEN,linePtr);
+
+            PAILLIER_MULT(&PUB, &CT1GOLDEN, &PT2GOLDEN, &CT);
+
+            if(!OCT_comp(&CTGOLDEN,&CT))
+            {
+                fprintf(stderr, "FAILURE Test %d\n", testNo);
+                fclose(fp);
+                exit(EXIT_FAILURE);
+            }
+        }
+    }
+
+    fclose(fp);
+
+    printf("SUCCESS TEST PAILLIER MULTIPLICATION PASSED\n");
+    exit(EXIT_SUCCESS);
+}
diff --git a/testVectors/paillier/add.txt b/testVectors/paillier/add.txt
new file mode 100644
index 0000000..dcfd8ba
--- /dev/null
+++ b/testVectors/paillier/add.txt
@@ -0,0 +1,700 @@
+TEST = 0,
+N = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a71,
+CIPHERTEXT1 = 17cc5e81709f423f7d8495bd1067e4ca508775400e082f151381f4fe382f7d70b8fe1a33d1b59252c7813bf04c0cf3cd3e8ae66739319bdb152eac1b85fb8ce7e764c7376cebec6d973e0585818c319e0ad23abe9ca45c003bd1affda99ddd09b5af1469d4a526fa00eb9165e16fc9b6dd34f3f7997f39c000ff47424962513e72877cb12260c10eb540dced8b2e604dcadabcea1a150f4813036aab0dabb1658d11bd43faa125c5f1a7635b83c7c5ff110734344292cfba049e15fc4c54128fbeb5b7b0392d5456d578af190da2c5231541992c7b98c33871796b6e7f9fdb6138d352e6338fdf34d661145f8e0a89bd04e43a64eddb6c7ea66113ebd13588d5b1fce74861526e5b520e48c45c4de3356985dae717772cd91d84fe8c0642906736145b9a840b5d9e7c2895e32a8dc6d159784daf1066aef5d137a2547737bfd0cbbc54a4416fd164114997f1b13c2a30de7522ca2c4824886c6985dc0b3811ba69b8f749411d66957dd2a0d5afcd89f309d2e1936302af1209cbea66f70e30b1d6906728e49f39dc66fc88f9bf35987522d91adeb61f478f4f72c058425528aa6e2867390acad6d3bb3ea102d3ec044d7f157f9349f02260fb197ed69dc167ca6882007c951e0d8e78820cbe7242ad8ff4a8ba69511db0f6ce607263ecacf60c15befa323e753e85c8e1890b5b288555612139868222d481418f372556eaa9f7,
+CIPHERTEXT2 = 0509e5b6de7b47cf394db6dd9831e26f86da8aeb01cd85fa3ddab2a69a23080c42c8e51caf96e87e8b5ddab011f3ccd5500b1a6785dcf46977908a10b421fdd3a8686f7ea172cb2f18fac021a6b09025b391a4b0b8ff3e88e182e76313dcad25af6dfbf61cd4ef4702a3fd29ce50a75085ebe185e13c7295df2799e5f4a4969dde48c255c4c6aa3e92d23622d6a88f67a8711add9a3822e338bd38b359a12b562c096aa11c02eee50f4d3b6195104a72b14d115a993682ee1dc5d81d504a2d6ab70c77f8c3e750f0e7a622f9af5fdea4f5b689faf0bdbabc4f6aa3dbeb2507a6a08683241b0bc49cce4661bb835c360606a6687f5495d9e767c77697a728ca0aecfc983b0afdfb8b2fea92f64b866fe27726cdb2d406577d3a9db67dba96412ad80a034a45a8bee5d5ace785d86dd169e5f23207c10e3dfddd043c7e3fcd08772675a473ecafed7b0fc0d098b99f68312ad3acb044686a3779f9a447c1a0a1df27c4a915a9d6870d062004068a1aa35516644ec188110174d89559e60c6cd0cc2cede83ca9d0f431152d9a7356b7b0b424f3aa593c2f13c573e4a866aa42abdecbdcbfad0982994839553d4477d31e38e663e8ecd6b7d5b6e538a201b8474def1f156c99723baa05c1d0407ce34509a2e78fbc0a533002bc47eab7a99c3b419449f24d45cd68ec72b3f5832f39692a931ea24645c2d58bcf3fa292c50381490e,
+CIPHERTEXT = 020f58b8a3fcd250cd80cb0d94c7b77258eac08cc0e924b773b38c79fda4a83360e8f895ed5c6245149b71a0d0a8b8464fbf7096bb4bebccf32e1bd53d716143234353f7cf6b6b540b068ff139723006df00297cacec8a11c58f3fc596bce1ed04a2d633b60ce073bcd4d8a195c945550047ce3274d42406e9e5d01c537b9814bda8d0e5e5cae5947783b78bd9722b0cfac3108065b94df8caecb02df1df62ab584f69687a3ec7cf2e16a896d91b3ab4d7fe01ff5a05737f4c63d075176bf6f81e585f288e8e73278b967ab21c007ed8db7356753979191ca9b6ad53b0f12a49cb47a448c6e4aba5f6ecaf5fe69da47546f0c57b904e82bdc837f4148abf96e86f1743904019873e316f78b7e4deeabdd039e041de590be32f929d4c66378b10718a2f0cfc27dba41fd9341267b16cd6f44fe060db266590accc4ef3435e3c3fb37eaa6ef9dad177dd11234c147b1353655ad42e184a9bb0d6bf9b89b16afcc27c500d88a5b4ff7ce69a0a5b3d8a4a5f0dc7f82615a5c9f8a7858be2fd5862b41330b3bb4995305a3b77c3d6aa1637bb09a58c93c5c312648cae3bd68a2a16eb4a20b825fec4faf871548b3275cdc4447d78c2feb0e1488f0eabdfc0628bc9bd70e41bb9af4c0d1f63de1c8fed92149ee1f124070b18c66ead54ba0ef0a6caefe8a7670fe0b1b12c6d52e68ea31a18f8fe7470540865e24d1a359870c9bf961e,
+RESULT = 0,
+
+TEST = 1,
+N = c33be27a8a7f546bc9a79bb93c3c291c4895d12da019ee10c60b672392314ba0b403a2bfcd9192719ddf6e25b40a0c5a715eb613da045b5187862153fdddf6e928543791b86dd59aca152191020f364580f385872e3bfd1b13c64a0b5fbf369f73aabfb291ea3d3a55e7c96c476d310da82aa7342d1e1dd0201e739920fd32dea322d0bf9d5ef30bfd45acabbc2d635a584e724ee1b5a26bc34b90df65fa10b1144a0ca5f5b4065da974a70e893bcb17889aa726ab25ece9cb2c8a09fc7ebfc6c3a4b573d9954346da939b5a81341d1fab471d5dee7151df64fa5e5490caa8ed262893150f0bb78b73696a6f68daab62073c32b1a5444401f95bd30818a31d59,
+CIPHERTEXT1 = 8e549d0447cfd2419b65cb7409a18e578b37255e2492d17f883167b0880007bc5181b86259b53ddd981cb2b0aebf2e95f5a3b748f1e5efc06919c4136f31c32346ae5944583af6a66ba77ce17033bcdb8a216a3079ec9e6fa24efa33fdd3b0d4ce9524f9d9386af35f8ba9cd2f7a19e6814943803fdc973253826882ad61a8f03b7357ed5091542f2727a3b842423acd4346e1ec158d01c7cc5a498844f13b0229871fe3e44182a1efad14880e2b36d99b8932f6f7572c426be9e5aefe546c53f8e3a23d600282fc2c75e17e6062f0804a7c899222d80f8a9a23d824439a21532d2ac8ce943d57e4716e7be18f909d1f84960f4e8fb753b9e5f3d106b54f3ceaaede5e31a21c777bff3d0766d539d6824a1a7221c9368ea137e81b6793c53d841efc09bd2dc81c0841a6a3ac7b973f59aceb87c94ee222f4ba207600bbd2b4511435d1cc92bdcf35b62b83f43627d2c6483be85829d8354d84bdb7c24a6b8cd8ed7edcf6a1d033a27d34130a4dd63e107a73fe1c7fedc5914796c8a8033df0a282bb85f270df5b0ddf397ec57be747be2ed3f6cf9586dc09e706eb29a32fd32dc3e74e84cb8e5b01b25cad0399a4a1fefea91e4108923db1e763a3a056af992df5dd34cb7668880654ca3bce200074d06e1e8fe3a95b433d3beb739d8f19c8b2c90c37a2503527ca7043e12cd2f12a30dcc015a24c261d2c23263a327d922ac7,
+CIPHERTEXT2 = 25a463e19a35eab09af2ed4b37a9d7ce0ee4e60452e436596022657c277b1629e00dea7fa2100db6198fcc61d53c55c94740a984a3041105fd3056c58c37913c709086ac1805ae8b6f8ac96af89f6d477702b35f58638e31f27d664ec21efdd4ecf06bc91503fbf69aaa22c987c16078bfdec8cfabb136a85207d7c183e67c1625c9e013e124a7240fbe2f2d176226434595e2f28b4e6b0cafd56ad823ca4b3631f7224904d7762db77cd5be8e6731a024d75a18f13a148f0dd9f9b2be079948fe965e4a85ef652fc0e264d59080fcc9162ed3578e922a50d1c6cfcfbe1ab3834cfe04f3493833e09394e1bbdd92402c7358c44a09061c36496b65d09fdf6b507d03a2ab8601be4e074a7aca2ec8c3ae9e268970512e56c8cb93ec8cb3304528cd140968ee4a5db8cff70d14b7622bce3e78b160d7254021874c8fd8473e588b90f96bb532edfc20c3dd38c287b19731bf864daf665c86012aa228bacfc75f6127f3c441cb028722ad99daf5ecfed6e7b228836d58a68ce1f52c8649cc97bfc56f36a67ff7b337c581330a203819be904bee50d11e8d9858e25b47ae2a84e26380e49f4079b7b5b331b55fc84933b2d914dab489de37d742fb1e730efec25c0b78470424c648623241ede57198aa5f939d93ef35c494eb5400f9d8a45fcda9a8317516e5eae31ce33dc8a7b0fc04c32ee7b7e746791a75f852ba01e582d8a544,
+CIPHERTEXT = 0ad5777f3d88c15ff2fce924033171400e3e5fddf773776130a5dde9879a3dc6a0efd406a9ad40edf81a52ef2ee98eb9c76e8915b758837f7e38927f4a14ab0938e2401e56eb2236783aa73b8fa1bd5656d31e198c42715a04258e9715a3f8e94486bcc90f57473b6fdc6a5d7b999717d74f3bbec93e21603d6fcd80b4807415f49389b7ffc35a37b09f31f96e9a69d7ff415281d1ec2fad8c5a716446e82a5a52202ca49cf94717b1dd15b99192c819bed6934f5144fa0474c77240502dce6f426a7f3a6441820949a784711e3235c2075974aae7df1677d1e8498cbe28a3a65eeb8e20d1435e936bd612943c432b702cc2c24f6a17ad8bc54392f130501e34b5ed550c112e401ef3da6f6a9b9cda1dc27b2b6e5eb3ad48be26a8314c24f265a52707097630a6668816f196aba6d3cfb1dceee96f4a03305b148b58c0f7331ad55b428ae324d6ef922dd4c9be7191067dda110a7be71589c69f19cd60fa0122eb451c1701f60a06d4b8f7688c421c657277fb2e665dfb84aa0edf873cbf9e75d203041d4bb24986bd79e38c7a100e63ce2644f1a937d99210a809fb444a323a17368014b277587eb8eafedadcac2067f2c9d885b5756c333caebc4537a58a53559cb4b450f0e75a372dd3c93f942867d44680dcd4045b15cb12d0de840e6374f6e6ea73b34e2fdf9ee11910c707e306b08064979c4e50244a8cdb9275748e53,
+RESULT = 0,
+
+TEST = 2,
+N = a00400138b72e51c34aeb49e8d1da25ff859ee34c3764315918107bef1c921d294d96deee3aa0bf6bd9edcc07e875467b567d8f7873ae90e37de9d7c6b9641109d5b31c82a9b5b30d5b1a704b9c8edea12e77ca1719c8dcb4c7d0f09ed79299a2d564828456a6faba29ae7368a477e9fe78e4fc773f0283581c022eb3c134576d9e12e7afbc7421d1a0902988505a756bfcc4899987a3ff8a02a743b469d4537a043735089bce42121945375c680732c60e1522d12ac3e24fb49c7e77492b97164d8d5647178a2afa874a3915bde95174bc5c7ca2b4907591b5298cea8ae1f85ce8eeeb0c3c40dc11473d6fccdd89c4806eb23696fa9d20b04f49b6a862454b9,
+CIPHERTEXT1 = 3f9d3576e1fc9ec27e42f59acefa196db8093b8ec466d5e07e0e6c7a66e029cb0507d3b7b7f4d512a56a2378f795c053af5e3457ee9a50694dd4b2781c73644c6d8e6169d6c2a695befc7858815cb9a71a96c59e6f52edfc0030f64e170f253a79534ae4db5ec12da65d6723f5b8141d0fa490abd2992bd43a7f642be09b2a03c8203a8faf1499d9eda9deb5bbd1234200bdb0846d5c3eaa71cc6ae7fc3ba0eca5fd1ceed804e421ef9dc11a7d66ef72e6d19cd8c45ac0894dd3b35087daaf05aec73d1302136c3225cc71d6b9781d81553e2e39241a02c87a673eec5fd980c874a7a81bd8836c3bbf1d84260a3ef543a5a8482f206b1bd04ede86b5113259c957b2b2a5d9e9032536a0f7f0d62a9c8532f3b2f111bfa55325783d4220bcff919e336a154a8c38a1ab89935e0989c7dc630dc90c83e8d4260b3fc1089c084a48c8159bb4e56acc1c2d826440f46588e4d59e54c8aa4a874d446a4a4d2bc5498a4e36a2cc91a8878ed0b48f4a4c1d32bfb317106c62af4f585e504cae024c29b7b1135a0a384d8ae8d32fabc92c52c1176835b618abe5df81d820ac9695a3dbaa27490f49741f7164e8be6a187016329b358ef8475a8be7d8e5160521ab05c851d02c3afc52876142901ea9005d4ba8b686cca613b009c16f2a3dc48d4e96cddb9c46a21baeacaedfc53b78f603adc8eac0c3685cd4a3ff551a77c091ecdfbdc3,
+CIPHERTEXT2 = 2df1914ec69f613c500435e0363df3941efa4a11ae556f552308ae6e40c7f2accf5cb1c6d9c83e7194379e7330dd1203375e3bf4c6d184179b723965d27010899883fdda561eeba889dc4a823d72f306c99c06a7e928732ae922edc8613829af38587d7aeb7e16aa5865bde937922eb41555a0e14ae8ee4409f042a69b4d970400af6ac002e2c225c4fa2ff2fd354a3cf1648ddc270dd02f46292881fbd7f76ad8b640e35662e6c703f33711bff81a81a42d3cd71df9b76e19570f434fc9a54371fd25708f1f621522a646bbe84760fb170f914350874ea040e74185a7bf74c9c300149f8e57972081dd9d55d13f71ff12063e0f5b190237da6b1bb10835719039e0371ca170a7f8f7cbe6d86f9f3c7050d09bb2fba5a2d234d09e61b7adef292164a041d273014f7d3f2f1e53e1b2201be1190eb3d378b4bd563c618c8ab8acdf6b41c7301b232644cd3d3b48096961fc0f318967df60bd2ee05cff1fd1f10882aeae42e041cc674f17fd55fcaf16f73fc0689bfb94ef7967c94c47b7c4a9c159d618b0a6f84ff165de0a0552c6df430e8b11885d487e612760881a754cdbcc8b7bd7a58452c06928eb72f417a6ce9f0c7853590956c885ddcaf3700ddf0e1b0a18d95a38ed4594d48b089e97741dd803d438476b9111e4eff0512d89668adc1ea7e43d57153737f61fbc096972493dd0f7613949c1883f64d0ca7a9be9b429,
+CIPHERTEXT = 1e526ca4502214f8c4566117b2f8572485d3b529d67fab2726abc1d388b15a48daa09feb49a953f16959286e74896f5386a0f4346db108eaed2bda8d019a9deaf46624eed130f385bca0b208bfef8e4b36d690226e9970fb6b322c8231e4f4943675fa653188c1abdf0bb4fb1ef7c8f36ad3104444bff2adb4d2bb1229bf3082f597e0eab16efe49a25674f3ef3a1be2f90f2c57a40ea7ea0ce5fa9c95ce1d09ff8843ca4e30d1dd05889b8c916574e14e8c0b312a840afc334d3447d08b2d02292cb8bc2825cbf2789447812f315f0295f0cb9722bb7f51a60877e7b657be11eb953bab89381b0632ccd6b06e7d3da6c32330bfbf714270b362015578fc51c8864d31eee69b056a2e732ea8e25055ad104fc1a62ac7165947655be5f8d3da2035304eca32001867ef3935ce8629bc03a5de0941b3b095c387ca6a749e4bd815eda043f6d09e0e5afdbaa4c796af349bfe8f5618c93cea131a44760189fbd6d9f99078300ea300594e640a42a1ff41432786df23bfd1a20aba57c16ecc336b430b2971d64af8e3e0abb3c4c68bf43f680a66513a745f5456bcd7ebcea5cb6c0f5db2b4418a20ace6ae36bbea8d18a904f2124ba358db48f8af8e713889de00e04a19a4906129f81553d3133e32e7c56f8ae6ebe42894fe1b6e4e4d276ff100fe282ed07c90d46d7279a3e72b1cbc0cb04a1bfd820548d9b017d508993ce6b8e3,
+RESULT = 0,
+
+TEST = 3,
+N = dc4754337087925e77ebf062f4d3a8081761ee306cdacb625ed79192dc0a8092ca86533b76aafe9f8a3cfc132f962a51edb7174136f8b1943eec08a4e4c6212823c37b1164ae9da74f785b3f570c9fb6d513fa2acf183765ca7ca69abcaf1e441eec6702d045dc83f7bc9bbc909b1f0e24cf4742e3789cdc9a5660853d9d8d571bea5b67bb9cd9568e851ef2a5ed8ac7b8e06de5f27e4ec34dd2b8efea841ea88f9934e3ec06599d28dc6bc1189a1315adc08b16d7d7ebc2ff7128f99c8aecb2a635cbcda950f90a57224c0960081da99d7b2c837e2e96128657e1b32d1177c4aa526140047ce10525a40985c487ce2393a59c70d74d8158837489e3e83a3567,
+CIPHERTEXT1 = 6aa235fea25fdf29c83d46e069f412c249aebb308dc66be203e49c3564927cac4367df528aec544c53d2c2fc484db30af2853611ea33bea4bb3390f7a00fe88728bd222e4b9e37280964a1079fe25595b4cdeadd1d3866b6d5ba06d0765ca022a504b40e32a265a5eb919a4b3df3b6504842469a69ed8a7c4d9123d5ad501ffb7e5b3833ac5d874679f30b109397aa212b65d961c8eae993e69cbf52e1f2c0cf9398f3c126bc002d6ca44408849d233c5d4c53eb1485768d6a69e3338db888e8da42a3ea2a98d6dd49b16de4046a8e476a63e118c55eef022d468d7d14db575bc8fafe9fe805f5570fa191508a8ac2533681ba7ffa159c9366486c9872650b33b97c30d33c35a9f03d0495748d671039dde9277c5fd435ff410eca1924835d4ab4b551ff0d40a64957ce67cfe4a8c02ea31af9362ee2d0ffda33ffd33731afdd313e00951bbe50fb873553ddab39d897290b4e15deb03bcbf97d5a033cf021390637de3f8bc904bcde4210a3ed44972efdb9f5a28c7c8e6f7dae92e252f88496908b0c0992ce45576af49291d090e6a2dbd2ccade47b6e7d3ca4794c46a3946167783ad550d85053a4430ba0b53ec7c68aa7acba62d42b00e6b5a42d9f6ef9d15d835397619292ed527aa58b2b6b7061759985510d11089d93b88f48719f8eb1a4e9f39db18112b29bc11c2951e41a8ebea2708986aa732eb526d973807e200d,
+CIPHERTEXT2 = 5d4f2f9a4bfb5ed834c1fb9cf7fbe845a015328c79e5de8f12e6afdb2f80c30a990f0a0ced05a4bee2af386d3187ff839ea0f8a0cdd6c9e220dbf41243a9f7f9d838e8e638f687dbd95b88d9b5b34c73f9af7fb2d89b08c38e7672e870793be9fe5105dd72f542792487ce30c3610768910ab8a852d549ce7cc07f8aab6e82509dd23e17a9820ff8c30fe5b82222f7d099a3e3c5aa49bf7804c04d69e915977b481be328b396903f80433656a9831fac677aa1fa00bb779147ea9626697fe41464abd84f14998621bc84b46df7c88d5c417680ab3bb6ec02dd2ea435c27cae831e4a051b0e2b14eca5a33170bb126ec19c71d3c8cc0a4ac5b0b88c75f47ed7ee35498891c5f9ae9fc76c62562f9fd0e9f67b8f82ba7097c8a31d0e56bf04bceb1509c0f17e93c204e9491f638bd4922b4b6df720a712943c71ae2b76f87eb92af67f34aea2e98f9303453eb29a00710bf2b7e310028f044252538be56933e09dce454eac4be66c4c7da6574bf0de587003227029eca611071237855f5d7aa09dbf4d6abf4aa683415c3766d16e9390ce7227bf89c7565de186705e24bd684cb1e6c013f471eb02f9206064c3fa208706a8bc949064eec17718c77284e3ea1d4608b77b8898cf410600132b41bd96a8c78a0e0d7d5e0bec05b8f110fb6ed59af8f69f7d992db39fe71672ce068b6113e1092b261a0c68d1ae781d3f7a08b70906,
+CIPHERTEXT = 3b536dc2284b0a81eb9cd5cdb9cacb909ee48139dad35a9e02feabde69ef142d7df1dd4c180e525f435aa91c7bb0640c894bf585fbebfaaa357388c2c8f4eb43e465a0137bf1038b36268b62b2671180da1526b7f9431898b003672a98329bd10e3696282919ab98a56504e026d57941c7b16f8390aebb56002158a752f991ad295a9d84989c5fc162e0ae4aed152d2995240dd5036a432da9716c425007be8a84319fa4eaee7e6885a0d39f21e6b5e67f2e6633e3c336eec8269a983ab94d4705f9660dc89ad98fc5197a16d982d5e9866667e8b62dcebc7337ab9163bbbc7f568dc7fb8570bd33a6fd5e9db57301857bd4acb0c33fbce10e892d299381cf9ff8a10e234e607b4d69a93de7457300414936146802ca156d0dd02df06c85775d6c4ac5965e81d4669538725936cfe97a6b4d77eb62fbb7c90bf15219ad1b45e76d047e60da1d54f4d557f3a8f1f8111765ac07fc93b8dc4670a9076d098d63073c12ad7c0192389c55f3abbbb8b7b3b170e1b46f5b33113f6f2988ed89291a6b75896a8cb5617d954d5817f8b8764e23538ce05dca143cbea26a75d317889c39f094edce7d5f200ebb6e66ac361f9e0fb734fc17261b69f458e5363129781379600e72c767484a3700b4bba8e2c145b4a0521ff4e3c61a6d49571fb43f1a7ea44c0e3f23f549091615fce7e53dd36cf0ef90ef61d0617aa9a77bd6a7828a2cef,
+RESULT = 0,
+
+TEST = 4,
+N = b221eeec9a1b409d13d8d36791eea7ea0414382a31c680f829635c323bd3aeced4934346c890f71b4f5fa360855338db79bfebeb070a7992ac3784d15732c8b63611fc5f98640ebd331c27fa8f2a76a84db1a27530504e95ee18171fc55daabfe24e293e0bed8eac1393de549195573f6cf2fb4ac50a968d1330b7cdd853b42ccd56d5fbeac7e67f90105eacc54558d0a7c4ec16d56aa63e0b4747d67abfd4aa73ad33533500bf5756a7d9a2d3f89982ef9367ca168eebc105c937a1fa1ad0e8458d72367d9e674d7cb699843ee8cef2f4a5e307c9a6de07680c92dc595f9aec0c7df36d4409ef42485e46b8bf199dbe82af6447165c8641bd42f4a5b7e8e4a1,
+CIPHERTEXT1 = 0ca8111f47fe543fd660ba64d944f1c701516d0f131773ed2bd603e33949d70dbf0569949eeb4d95d66e14e243bdd04072c70a75e4244c6057121104be5fcf961274d2a0bc4687c473538e9c6f3d1cc4999c66d72f432b7b89fffda22c4bc9a086ba9369bc336d4e969ed4bd5c7fea72b8620bd275185b2970c80f7c9a7d08e9bb08be1a25343842bf4dc7bd608328df72c9807d1f85b83cfdfc0ecda0dc7ec0bdd5946e5b5c3b6bcb9d76b02fb8413b221419664f3012fd4cc8a0dc452f7a3c1e87df173852be92f2d4a9c981653c2866f587f6082df4dbd8af260547abc8f2a9c558f6765b11d083e249c95dcd778542c6ca20146c8a22d78b4ff2b5bc688eecfa823bbd6692593397b49eb11362d1cfb4c7718f978b49ea80c370a05fd3770a2966b66a41213779d38186fe847cbd2e99e0494180d6683ac14ca24c674abe1484d7a2186b3835f0e80c856c7fd9ab2b865c167d5e20d6e1ebad47040083b2e88d7e8d403220ad041026b4bfeec4ef65fbe1e9f1210f9467b2584fbdb420a4f3174f017a1228fcb27cbe470392bd1f7a82dba61bcff120702723de1ca233b41bec7081b0b8ac5db1db454868b958536f7c3fe26af9882bfd6cd52d53f937f39733abba09bbb2f24ae79f42724eb15cf1d07bdd9d57725dfc91f8ebeac7147a30565990615a51e8840220ac427977e7d4f71e43ab434b31690f78ac3a2f2339,
+CIPHERTEXT2 = 620a24b2d680cf411350fce87d06377b07dd8d0b251875b6cb44d71cfdf0e097d7e8cac31b244ed5cf7893b7d25a47698ab07533e6e5a6038a201a1ca230d15070e1d6c9ec021788d429712175e2c671fdb334b8071ae2fd4f68b3ae9fd7ea0a051b31a2e5e4c917ce8ca34af9ec74123626a4dcaaedf301191266fff7358a02430a03ccbab07917ec40ff33f4c4f3ef59406b3b8c46cb01f6c43b306a2f34bc9d0c328b37f8e4aad2e6ab1ced61a6cd6178ec13083de3f444fb9bfab560bcd1fd908f5ae26a5ec228edb210f89f555ab16a92eb31d553d37ce0c5208f610cebf862c5e2e2bd122a61b54d48efbb4f522c9c3a53d4145d86b0925714edcc7b44c95b97f40e670c88226a229ec6acaae16572a6cb39ce564b6e5db361a3a734ec78ea131c16fc09fdd3998e2a290f9ce5d3dbc86442426e1e40727e389ed259ee56a3ada9754c17896d4dfef6058311cb363701577b6c80496639b16e98ee956e80d7127d98f0fb55019449cef4e541424e18518d3f5bcef446eec05f24256c0aad49ba5c52273c5743aa2012ac00cae638f13026f42a33ee300d9203dd5712f9547c8f0b7920777a9ea3b9281d996393135261c2b8f1e9d48311778b405789a5fef09c14214288025af887622002d448497e7da99779213e9915adb852c969ee05083dc39100c598965478e8d1e5b5dc481f1624637ca50730300c75f163cf3e,
+CIPHERTEXT = 09fae03be8995d75829ca9b84b714ec18e0a66394f938136ccf30440fc56e5bcb721e10eac6341447b455416e3d526cec8c5919ac13fa1ff29f0a7be42ff5b541ab759c5b2adc4475d3c4d7858dfe3dee7d2e4d58aaea101b652eb215de07d902e11d5dacd6bbf2f4bbddc7d241dd228c1f495c56e87477c291ac4a9b5727888241e05a73987b5c1023d57394b1b4353d66c5811726c4aff0bdebfe060935c72c5511b913c970ad3d9d343b808e7d7ddd047cf644568e63080fa33925b05d8bf6c3c5ea111366a9cdae1ca015c62bb845c0f7fdc32f7cf92adc2801a00530edb5f24809143c5fca0f927c5c382145ed5ca933f4db34ea7de533caa143dafc6c9fa8922d536bd2e59ba52a74331d99eca59ba8a4ec424057f05a8e45e88c8176fd8819ae3106e51a94c54900ad6cc12df98508ddecd5f0b089c79f2e10d8589b2a30ef7f7e8200430d57b033d731961b2c75a3fc2450b1abce69685399b7282eef2a61eaebf642bb40bdaea5c71a439c9c7df8423e8949fd029b33deec2524bdba13f725f0577b68692aec28225f053d4ce1b3d2e84a6ed6ee18800e02795483aa6e6366ad9fe1319faed13ab07d31e8004880c0ad244efbfd1d1ddb1909c18d8214cb5f13001738eef468491cdb1c7b125cac23a1165cdfccfaee764fec6286fdce3832aac972373950667fd99cbbdcaf854aa48bcfa935ea3fcb67349997de2,
+RESULT = 0,
+
+TEST = 5,
+N = d806e6759bd05eabf401175dd93f3bd426bd0c521904669c49cf796d370e48810c36afdb95b96b6df530bb7f39405c1ee6a4378ec9cac576f5d75fcd4d9aa7a5d1dbdb14f6689791887cafe08bcf539164e1d039a74b8d1b99cb3cc28eb4ba3fb721dcde23f474114234a86556a85bd7fcede4aef3e2f35087a17d4ffcc89406d2a9a93ac6ed713822348808d621d2c4a88aeab347bf8e6e71befe4e939b7cda900d1710dbd0f90640842fb07dfc5c9ced909a6c463f196c07941252ad1f489fc89e85eedf68641d8a9e85644e037ead64fcc80bfc976f43559eddff22bbea0edd42f15415611773bdb05be2468aa0a4442846a7bf0fb118d93a307040c0e6db,
+CIPHERTEXT1 = acee4ae6a20b11d85a9060166b12dfa0ca27bae09c8474e45a32da9ee64b65d98f00875e142a4f0d555dc10f5292e4333df68be44501511b81e37927012512302b8decd6a443155af88c0a20480a98797b256fcb801b38e4e0120b5022034b860795186d86d48836619a6fe036cce4c8995b8c32965e31d2de1fd9183028766172bfa757d11d72015c01d10f2e2525f2895017c5745e193da8396d7ccb983a03d54cdd99dfeffb5e97d00de6986b4c3f5cdb698d68b7ebfe35e8ce4024ff866c09e4afdc9189c2853d1939ccf195dcad38e89a477289794e4a0d302d305ebf499d29ae31226b14965005ec69350298365acb065429cefaf25aab1692aea034e878bad5684fee3b24317764dd905ba1a0419d94b6cd63944af7f7c781e5655d111c64ec31854027ff759cb30089e147c28044096606bf9220a240bf265ca23d7c46c0f032cca2c712f9ad7167b7322b974d29ad18095abfbfb06d6e034eabb4b8327670bf74160adada3b8b81793ab9921c18ded210e09b34a042b6c6b6775e7eff5d85131b9690b27c14709d5dc8594ed0036ad99dc33b56795b93582699441bf1216fd10e8e2796bdece26cd3125706a10334dcd5b5903b34bf3b21740264346846504edcd93c93eb9c833579dab66031b391412f296d35e8232dae18e16c176a71c24dbd9e418e4546ebd1b0e4d025a6f211e4a42276be9275902e947ba2cc,
+CIPHERTEXT2 = 91656afa7d3a6f40e52be09e4e1d300bc8a92f82a55f244cc11bab4906be3d95df4b18b255c37f2c899705cf76fa8f79daee068033b4196851a6997435064173b81dd2f27aee92582271a6274b4d48f276762c094b2c3a5bb698f8d18192eaa8c3c1161f31ad4e5e34f78057067ad4e4dc0643b9d04697efe1428d2e48dce19bd63ac8a57f5f8a7fb9746e5045dfe81fc292fd5b4a441d39baf0559bda410615cc6b45b0ed75b6447b9dba1505afe4381d83e00294f98b5cf44b817c9b712f45b833abce480814bfaf1e687fd54889fd2401c2511451385c06aecfddfee8edcf1e72e4f0e74d656872f80b1fabe4dccb85ad93cee379718b6b57ec536f07741f2b8f7dbd63078aad79c8e04245567fd1d218b54f4565beee9fda0ac73f4fbed6074be5052eca54a4622e9d375205c845f3e19ae1e61705cdcc739a8a97ae976434abe90c50996360d3999bad4f692ddf8b88f274211b3b8ee20c7fbf2e2d4bfc28ad557ac35e59e5b85d94a07982c7e3d08f3fc4976a6d070c7760ae4da43c246a630c75bc79a5ded338414f1ba0338004d8f617bf3ff39ec11a7521821c22c555395d60fff99c98775e44144cb3addf5f29ddc6a4db9e19df1ae875bce53c86d5c2a8a93df83d341145c1ea1a7134c8c2b8a430573c3cc39f833ae8d3e5ead321e7eb22833acb0e5e0bc4aa0b6bdfa5c8819e59153153d556b49b38ae19c2eb,
+CIPHERTEXT = 8cd4a537a81e1a1547236f42bd5366fbf22b4d63cc4935714092ec887df106f5e82db486c067eb4e9bc81cfb15c91cb05006550fa515b4395e96a168edfeb64c95090011ec801d3e46849eaaef1752124f5508b0aa3599614d3f7cdf13b7dcf1c33bcba15b39f4f986270371d9ab225b9c8a18955f9366af053ec581cefc3fd13b037d038acde1b91c3b391086541a25ece1a61bc502ffd96466c614f93be318feeaa68cef6a953162c2cc05a2acd8af350d609aee9f05059a30048e0962137e2385ff7104935ea4cd27ca1c823383c4b837ab0dda24dfb7f207709e6a75a84af2697f61b0b6debb7cd501e2421e46640cb455f5cee866ef2f7ed366684ee291f5dc0a4b953516478ecf2d9bc2d0936da0c149b1970d1f016809b559c06db10e03e24b4efd5a3ea57c2a3b1879d36c26c85c6ed5d35f789b0f047a7799f52d3cd4d507de1e46c018a8a54e3061bfeb7b3548b5a0a332c6cc036289a201546a8d2acbcc33f5cad508da75298a3d04e811b2c3a76df4becd8642fc4a4a9fbf7b1eab94f67c165d0ec983f831f54b0894f740979b573af2635c5eaba79c3e392b8c4a024875e4a2e92230454f202a3d50992a847746c07e916bc9b15f3a4ffbc7430288b915240347484efa59351eb37107f342987f301ab4a86ed7d6588172dec40ded07da25a82ca45a91569b233d5fc0e4dc2c4777883ff135b460672819baa9,
+RESULT = 0,
+
+TEST = 6,
+N = d9ce4dbfd3dd0aaa6066161eeef1f97f8822dd58a053351495bcb30e1d571ed196705a7837eaa002fb1982707edffd106729fc3ebd323587c68c4667f3e5892d345f9e48c486e19f24d9308be5f3bac2b078db016c26deadbf89d21cb3688505cb02a67317c2bca79207544759a6af0b745fff12693142c9122731c764baaba3581fb9f0aa6917d9bc1bfa0e177585b22626481dd54bb4e3d17aa3e06720b3d9dae1d8597a866f4df0be97ce5f52f6e9325054cdb07a351ee0e9b9118a98a764d4b17b49c0ad316ad2aeaccf4999826a8d33fb7eb50839e8ee13f3fdc678923b98013e180dee0853581c37c4ed343d47cbe820b7ef4af30b19dd730ba924b999,
+CIPHERTEXT1 = a881cf3875f8aa6f4e7ac7a46e767e8e5aadd675c9258e30d57516d5b7700d44f8d1c33ac7a5ff95fe31524239b5586f7b6b5bd1e7761a79820aff587b04564c8bf713f331a5d841b0e939ddd8014a6f5aecffe7658af21c52436382b65c0b56926f0caaf56ffafa53b24ae7e0dbda529e571c6bb295ddc48bded001135072b57c6d9fe1255b2eb4334da5d9fae1c857e83410bd59d8158305ffd9f98d0c44bf599a81399c2c0fefdc8612a06781b8805d4bd78295dd6a3e96b3871ad18083c080d1f15b0522a402ebd4c4b4df1c92331172d68853ea0829e61c8c1d735fb956be477417d5103db5368e8495fea44692d25b24ab3bf1bb037601b257951ef2de990266a236297dc79921f6f5f4bde4b611493a702c6dcea69442370e66d82e84a6fa257c9d9ae555cdf6b96e6b526a761cf965504018b27c6aef3b6ec18eb24d4df8de4fa4009076ea8c6b2c178f22b99c2b3405420f3d38958c141d94986ed0ab1c9916720a5437430fc24179a3058b454c66e8e4088b23108dd94b198556bbded95e551092064bf64e9d9f406440da4982630cb4940d219045d52195e4feeebaea2ee82709940ae9ba9a7ed27dbd5e1899835842ffbd2d2589edf8ccf3a1d86172cb3594fd275eafa2470fb871607fd3c2d08f60fb71aec1bb03619d4ebaab1e2c041dfb1cb05af134c944a4c20b86e34f4397abbeceee111a4d0c90afd3a8,
+CIPHERTEXT2 = 179970a777ad84fb168bb1ef08784aca6e65ed6fe54ee6f94ffb9324f2209b75a2f20528c18c2867f13054869ad6de19e95afea6cb65215f4e81e96e1bd65bf4ec1b4cc4a532dd015e1d5bebeb5b958c60d052977e750292e9aef4d7e5de06f4e1e3fac21d1e14c6cd39d27aa419b4c7424229ba01b103d45104af32b7a51ca78b63b31c764a73627d7399b6b3e0899e687c7b4c4a9bd77f9aac7b33bd8e10bbf52d535bec8f98ad4e25cb2b4621e8465295f7a2714a3638fc8cf01843c19bb2db0bbc7ff616bb719cbea338f2914ce0013a7600c7d9821de18044366691f335cf7878e713865f1f09c5e4d1f514be4d0629158e74250607d980c96c513f8d137c9d9235042e4b1b8ee87edffbf8d561d54e3b10c6711faa140f8ef94a95c34c82a4ebc494a9e9cd37e71f736e758302d363780cf46bbe16eca6beb1faf9fabad9ed3f30d208727f90356458c7c126419709559e83447feecc16dacae10e1867ad74a4159ef0e9844280c07a2ffedc45744381251cb8176bd79cafb5c667ae1f12787e0dc4382900b3ef35db87e33e6797641967f4e551a0d9f88a07734a42b1d384dcf3b68797e1de881234c3b7e615f53ca1d7a70dc0921e254c9a6ba31fd8dd7867bf5d2cc23e2714e152a87c276ab49ca3d15ef530aab1212e46e821caedc9f9d865896c49a88638b0e22da066b36f079940e417f41e3b7b611ebf50005d,
+CIPHERTEXT = 85b877b4cf46fc23380f7c850945e4d1a339fd8deb3912b45669ac5d8b8d15de3be0fb2c00a14433c04aac868efd78e2d120712a4cc6bfa0d70e76cddeeae992191abb93f44571b67b8a8d641f8e3308d12130a68b629965859d6dd5661f911a34185b3bbd2d02d161d2db90115e845009432bf97384eb27eb35904434ac9db8d6a99ccb30dee9110cc8ab9ed90ea67e70103d62ce06fe77a97254810d0dcbe20d9fa9a70dec0286ead9edcd12ecc112804aa071d3f257ae26e63cb638982f59c7001304b6b105e895915b76b22808d15bb99039bb329c0082874b5fe6927d6340187fd6323ea359bdb3eb17bd1e1ef485c55607f6fec0532dbd5b9835bade1aff16835560ebcdd8044f4de08d777544c3f3c1a8baede472b2db2234ef24f845ced18f6d7d6448dcb52492e667cba19200436fd6d104d28b993b294b0cb72145b30887e01f9a8f90109fd074c1db19962283e555f0100a0e9ca45dbc67195c511094c9b1acd83f5dc31337ba4db86a56e1238bff97243718630e5b3ca551164970e6a0eec0e028c8fe8a2c330a195d13673e619b46aa291c75bdcb58f7c3d11e3b70a9de0ca7a477c6d4a6c98be249f418d244cebdacbd780c0cba967bc963eccc7afd562607143db4d5d90631ef128784948b4f9a8e5d536ec000a20dd3408eb75537c6c00223173e50d949f8363e6a882ebdc163be508f6993189d896b85ac,
+RESULT = 0,
+
+TEST = 7,
+N = b182d6ade49ba1c0f7308a56568369492b651219282f93e223f24d0f6ad4e78ab56cde3651c71e3199104b14aeb00ec7b8db09e1cf6260fb655f189ef5057251176e754165fe099ff2f8b1ea0a3657e77cc8bcf270bbf81ecbd7c0efc8a3faf099480f6e0194da2850bb255295a693f6ad9480b301bef748276bfcc8b3a550b06ae9c668ca4da4d6a558eda9a76f6a36489a8b90b772af30b1bb955160d979d3440ba3550b9c4fe3dbe42a603d369ea70e4c0c7977fa08cbe60867feea19d12853aa07e5a507d4d36c5cbeaac5b1356b89017219095f1e5d4643038f49b85b88fbdb1a762a96dcf60680592796c84230be677ab01a19579dfaa6fd2cce21ee73,
+CIPHERTEXT1 = 614817afdeb9d23759de439b8547db90cb6e4720a67efa1903e2683c7fb70d80677539b26ddf4efb6d52e619bba392c2e7b92307023c07935e9485f3101741dff98a03438e8da877c6af407088b5ff01cfb19b90d3987c950af0b7724d5351738b1985768e872bf61fa723dc8a32cbd91a7a47d6f39ab24c1c4318dfd5832aa5f69e645fe86f6d9271dd624f71dd9772d46e4c38c8a6b6c2f9bf0d36678b80eb81d19a1d19d3989a2d3ebb5e1ea872add148414b344829ebc9a14f138aa9a4899555e00380ed740f6ebbcef1efae8dbe45676c002de0c077ab07cd87b223452d3b2b492317acfd047705635eb384f6ebd27c811327dc03def4e45b3e9fd864326ef585ff895faed2b43cb9e3e57ee758bd4e17d0c0a36854fdbfcb291a19e43eed3972c8b3b2b0509c759da5c320fcfd1706fccfca7fc9934fdffd1e8f4d144d01da26b861cb1a0fa5f3a694f4aa71ceca051e6183ad938c187386af3f2520c390bf4b08b5fd025f46a5eb0ca6ace0ff85d3f3ee7a412b01c88c644d421cdbec33f928320b1cedb783ddf2d37683616ea521f13a3260495bc1fe2c21c03a16190b94274e4038e352a81b2d562d97b0dcbc44f2cf4f5c85bddec5f13851f535b1a719d3d004ce193103bd23cb4d35cddd553ae049ffb50c7c9033170c0a39e3e89dc2c00f57f3c7556079923f906346fe87161d62b3d04a5b4d593aee0e7ed1ab,
+CIPHERTEXT2 = 3d160e4b541829258322550cda59b622e9ea9aa680f792224176325119dcbdda9192ed70ec62834604b8dfdd5607123b89fd5185cabd964e8ae4c0400b7fa7188369c3192a337c0f62cc62d5bf8b3093dabc6b7e8c9040848755360041b5317b777d08f4ffbd9a00c4018083fb24a2e5b9588124530ac84ef960bdd968f7927c67226930d2ddec6a6279f175987cee29fedba3210de54fa8990c13da8aaa12058c6f2f1f33c207e880d2810b5a5743cb01a7a0e92aac0254b791b1a7c06e8a89057ef8afb3965ed965570db06dd32169e99a765fbb1f1315c65dbb608bb26f8d76a849bb49ff8f5895375686e92e1a8fbefb7aac32391de3d372fb3d5afb63637067fbb2f89babaeac97d6d7bf147d5a7c17124f827ed61e620f24c65df12e623ff32e878c39e57eadf776f396638cb7829fc336cd0f15446ed9319cb2487ec84bfdf833d9b7ccd9694bd1e2e24c0fcc6eb80384060742a0f6cf8be7af012710a39ad9c1a4ff4bb7e7ddd8cb877570f92229f2669b531f9a501f6b5b8f8ff7ba839e4ea05aeba00db6233e0e7368b1ecd8e073f97f46400927e4b4f5ebd4ab663b0bae34243fbd9c08a569462d532b0778d567eed874f7123186d1caf7af82f67fa78fdeeece4841c86e120223141a5d3a3877df9348d3b86da88f7370ee2017276cb327f8482bc4831e7566f95728fb18dcad7f21347d500e1e0b00ab32b8cb,
+CIPHERTEXT = 1b8afec32080bf96742bd4c7f12ca48730a8923cdc1cbe8f8f66bad4abe9863a23072b0f5fdcffef77511b1ac29e68120a977189ea84f561884c248182731f763b7c0d4c74541dd7bf60ed2ee63ac8dcd442c01be6f64ac58c51390aab3b091787b3b06710fc5b0f2a62f3ef4de7c5bbac8f565626512f5e7316d9f60f3aecc89a3dbb21b0458d8e3212db2c067c4826b878ac822c72914335419c989c53c61e9372d38d9f37b45e342f3dab1630ab4aef44d6f2527b5d60acb1c68453d490ed01433672629c691e94df1f9d4419b1732ae0017474482b0021ed2f92c351446bbd7024837faa42c65369780f941e28330aed77fd3ee1c2104599f2b150a31f76847362faea8c589e594a2e3b9d1101fb3b1950c18a7a022e6212e743a7b8fb41b0159c796fded4cce645a0407c2598796a01cad466e0532f83955f1fc4451ea5314bbedcabcc5f0049a6b965c6e77bf221f463435f5357574b9a128b45817def0b5fc89b610447f4444edc8bef5bcb0430ad222a03eea95ea6aea829e2409ec38f6f691b04714ad2bc14836f8496db3bf89e3838d7341957b4f298236296b1e9feb4ad811c3466c50e1b5cea67848e06d31eaf7d499c36bc747bf3ff9007437820f3a4c2d99715d382788ff522712ce2758640a4e8bd57501ab4b3c4775b64fe4c90a19605951d9d19666c097186d7a4ec1a9bb2e3760d54f32fd345f38553e1,
+RESULT = 0,
+
+TEST = 8,
+N = d3064aa703a1db6a64ace01c2a76fa43e5b8f051ba232a0f5b35f75818b5cdab43d1ff09d2d18c2f10bc8af2aee4cc605f89174c57bec3fd9259ed9be4815efa06a5d35035f040b64d2862c562936efd735d647ab2bc1189fdaf32dc289bccc0ed5eeec1b3e5524c3e747f23bb30c4f089eda47eb7667971ba56aba378b528137a2325aaf8666f0861e591d51f6d0017a1277a740aa4624d7610853743286b7896a62efc47c68f266d2c1445826267d89bf39d64e9177ab33c8896047fa74acb78300abcef13b2eb18fb921622d27c5e0c7010256df1ed937e817600e2eba0ac729fc2a11e3f45f09999f812f8524adfe3812d96faa396a165b12dbaa55b6eff,
+CIPHERTEXT1 = 1f4ff4a0a816a23aa6655024733323ce10e54eec851a2a02b7fde6428b4c0b976dd4013a887c394a5c365c8432aba9fc389fc44df1ab499f3d7605cbd2543b19faeeb5ff418134801e23ba8822ba208f3818efb83ba4e451759d6e473e79a2b5a68a96ebee784b13b56b00e268b20099e1d70b7758b0e9dc4450c9616d1b8306cb2cacf24d5b2316c7c66191fd7a933b9aa6dac1273b2e8c6a797260da37e0d0ea906ce5dba0a4ab988a39f3c3303492ed48d30dcccfac09796fb9a49685973b4b24f7435cbfbc35c8957ea1cdb165a168a804298317d483f892566900805cab3c566fbc405cc403214b17b3e7cd5f0bb9d8e8ce89bc3e643dcb9b8913a9ba6cf5c08b55508b2fa69be6703dac2a82a8939172559a61c3a1ce82fd606c11e8878917051c70073e7680e20fca5f3b0f6a3db8165531a088da53964cabb7507d775bf39913acf1bb450a5d8ce8a7de15a6a7ef4cd01a53b053cc2a0d2b16e91af056af3ec12394467d049349d97034e59c943eaf30545c3132c330dcc54a7944ab0dc87324b7a4c4e43949e1ba96e39546e11916686b2ecbe38ce5db51cc3bfcb1a8133d58a6ebd08318d205ad6e49b64404d7dea28e434f7c7093b11955e21ee5a1178ecae227275ce3c462a9ec3295f7032d629b291e2ee708004f9b33579e3a341de28f5702a2afb21efb60a09744dd2bda0a3febf6166cfba627da86058ade,
+CIPHERTEXT2 = 8591bdc0790d7ec10076b523c54e57d7ed42c3819b73d03100633390603e8054c7d5aee2a40aad599f04e1152d00dedfb4aa1792f83a9fbe4148af70a077b6c4e88e3354f0b3332925c46850072ffc6babddd0b6835f966220e4fc2239bd2bdb36505a6af712f200dd07a9388f99e445a6dcbd168ce42e3b64469be99361a9aceef29c889183e2e0b7a68d3446f290ff5d1342218abd26cb759d38202c4175fef46f183909e61cfb164af30c3b63338342b8124fd3211f45a49ce34556ff048a8af3180b33a44f525496da759aca4448d751c13314f13b1df80d17a6195b6508208c03220e82b3ca4e19e72c6b199e88c31990a47cea538602641365a337e40832119b472d98588baab8c3eb8b735ecacf6703ffc55c1cdc0081fa7371f9ced3aa7311058f5b162de6c8e2c7ab396d310e3f072c0c9de4ddab7309a710157319c6331bcb40fd4979a98b339015ea3f8c2ac9b2912010c7efe8902f657060443e66570311932714aaaa41cc6213787f44390fa6c84d825dc0f8f6122bc01aab473831a90492d754c1d2fc1cf1ff5829b296f386119bc5680ef964cdefc6ffdfa98b6416aa1dc01638d9533c31c849fd2286cd3d134f615fee886e094d978ffb7fbe3338140568a361ed93af1112e6e4ebedab1d9c43657f963f6416b31627b88f980e63d66cddd7b958642bbb539dee9693e7f5c43530e8e4ef486371d629713d,
+CIPHERTEXT = 6c570e82e9ded874dd691945b4f3f1b901224093f885a53a186d8678eab9c567cc186ceae191c049d615f58fc6da626596c57a5814a3a9f159cc5bc7c6be7b7ab5ee9b9c29068d9d52141089c7e90cd52040789df4a1c391038dcb0ab93f2f7ecace80705921eac863b8a15e8029e6786fd8257b7f612fc873c3e1267cceb810e43c0691b68727cf1679e9b4f9dc7a80073f0ae9de852958f828e06017ec7f9cca07231dcf18d702cd7ff9fdefa83f0ebfb6303cce49ac52d47bca4448ba00e362399003f7e761d87e3d05bcc050b96f8f60456e96a93f42a39acbef969402dbe51e84ceb49722831cee2f8a040684cc33f17364b143ef22abafb46ae28ac311693e7629c3511880fdb9dfbc22ce3a6bea7b2fab02d41df5f907f1dc3b01f87053ea8bf4bd7277c57f5b1ab88945f4686ead07707e52f6e509baec5961415c3a4726aa8596230f649d0697000b88c387c39a2c99372a2fae8496cc1508ee462ae71f37d373211b3737556858fc54e8aaa002e099505aadb5c61319c4a51f9f3befd1ac571cd45a9509aebac25a2ded5681d9d075b0662a38d0546baeeba38b412825f2e60b4548cbef7b07ed37ea654fc70511e6588f9444a58fcd0d71509e41546e2d3b29bf9f69d7265d9eb20720da16b05bb9c2f136036fe2649bc86d90e7be6148f6fef78a1ea73b5f979a518912e460edd2fe432bbafedb917967d1d756,
+RESULT = 0,
+
+TEST = 9,
+N = d8e595930320ea3a600e26dae5ea89c853738e661e6f48116e21d9ed6eb1f6fda289e7a8638b8c52c820d33996cd79eeb377285963873e3702be24dec6f1ab7b077d2298fe531bf435185f048761d2b088258468e3cdb2db4dfac64752c396166fe90ffb11402f8bd1992478eb41e04e3035c5e26618ce6c242b848f7a28d1624964e4028d0578dd375edb721840950aecb04ab159c74d7d6ec2b58879d6080fe91f995f4ee111062af4003b014577ecbb9036c6fad2218639b6d323a3ebc33e5deeed3c89e378e6f77b827c70d70ba72377e4bf826746385a7e1cfc323119a1443ffe0df5d7999693ad2a8d47e74a1c707ca8ea62091816514b234ffa7d6a01,
+CIPHERTEXT1 = 0b9f8045e9b6c5754e21e6f9ce1f8b9dcc31aa4ea4f21daa8e2418ed8c748f2d97418c88463f7d934293338bf838727139234160a48306b33c99c3eaa7b26f531191dff02953793c080a500d23130bb381bfdcfca71a5af97da5032f70f46b38c89ecf517f620912ef0056626cc02b52c0772cc69e212f32ee928b9ac8b91816ac3dee3dde86e23b8e1ebe638009298ac8256d5a2045e26ee7b04060b171e76e05664466ee4820641354d6014c0c524ac4233e6c61c0e6c33278a3f0c8e611e43395397bc467b5c2dcc42d90ea80800cd70b7fd477900371a191aa170391ee07f4b76082f04be5e965deed35cce134228c92e7b73c7a3b8ecf40d113a9e8ad16b689edcd9e930cf215b70a381ea80f53e427d13ac922353d81345d5e144da78186260c3fadda6b1e5f02564bd3ae7d73e91801fd87df656d246ac7bee906ed4e46e0c116a1a83348df82c7fa87706cc92979644651ea7d9aaaf0247420c0291b9fec0ae34139fe69d8fb85a0d3828fbe1aa844c9bc195f9cdd13c400881729c2db9689938bcae6e609d4b482dd9b0c699222627e8140b674ece241307ebb8f6c2ea4d196a1e7c1f7ca909d9a4d83451cf3a05d7d59e7e9a752c08fa8b9ea74849a456e4e475f1af002dd18ebae74e6681a985d305e7e8b47a391cc1acddbdd0e567635f4ae16d5c0210b42f363feb9310ed724fccf9ba97c50f61435563c7c09,
+CIPHERTEXT2 = 8a2ad93e266ac9bf0d4808de9f933cb3876879bf2b9cb6831a0f5099ed65db5dffae97e4d3a37c361a646a96e21a5c1b79bd91159af2d4f1a8c56357d0f8552283a75cd71b953d0b129d623e9d1efe3ca13fe48b659c2285dead8a6217e54baab27e9d1e973f72032f890e2094c9c3f328b30eafe7c3caeceef751079f04fc0c02fe3bc9fcd6679884d5ce0a17798cf6cbb356ba23b81581e1c6cae9be45d3d3ee89a769e79a6bfec49d3398416e8248fd0ae1ac2baf6720c767e138a995358412bb15a639cdd27bbb074898e11d052c1879a2b337a9b649750b0450c23f1c4e619adcf1e1299dfda9daef4f2c27a141b9377fd801af327f5f6dfab6973de4c5762a7a81bfcb33db26b19dce62fb8e18c40a97894a208428c405ebc356a01bf8eb9710664bec97a6be6eedd0def132354e8eede96f23f26011572101e9e7719152fb096ddfd4055e465678fb2199248832cb58cb9b17c19f18fcabdb47777da4ae48eb35eb34ec47521ee8856a4dc956abf2a7b3f4c6665e35554faa7083d67025b6c38ad07a52ca784f491ee0b34ec4aa5d790e048a369e8755ea87380d14c3b15adb585e216712541eee3b725ecf08b18581f531599c9da4efef2c891f5a8b0c9eb17d0532965fc9fe4ba25d054f3f339f63135baddb79985b9ee26215813df28221fd4ed7cfbeabdfaadb3413cc9d526e5fa697969d2b9d7b56e886866da1,
+CIPHERTEXT = a105eeec6f4e0fa0982e6a7cf788e3c3a46896f5c88a0a06f7ead653016d0507c0f08f4cba5fea6a6cf375f8acfe9a6784a8b78b201217ef66eaa23067d338897b1a01b2dd1b9906a4e7fb92a3a4375b22c63d2a7bf86ea5f4cfcd3d3b77fabbb5fcc82450f0bb25fada99c041945b26eb7ef8169b017c1dace403d478d7835da099e490eaaaba3f347502bea0889a5e395ef522d89b2cbf6f661cbe120c663b30b5b7d13803a55e4881aa958132b23e6ec421cb18ca297f15748c59031a6e03d54a8f234755a0cb28016c3062568dd16cfd1e9f111e5a78de3ef717b4ea60caf3ade6f251f33d0657034c3273a58dad3286a91a5510c1c1929cbf217bc75618e5effcef325e02961a6cb7682185ae850bf1b1b835c4c6f4e0c737bff096409851f5e1d1b76f75a5a07d20205743e8d81be57c79093dfee712023ce8b034e0fa6069fde7ca22dc157f82bd2580f7d63e09510de6dd623f15d1cf833f942bd315afaf5909e45cfed129a5b5ba9b3c76047e2024e67fc6cebdd5a91c9d8b3560adb6d93a2a435e2a20afa9540f29cc6ae264aea8a563a170797aa72d812ebc1edab6fe319d7439e3cda9c7d8c1e4cc63449bfa4b13181e17a6ff889673f237687f829542934c640964b93fbc296d8c1ef98e1ca9573b816f315353fc5ad6b6db6cf2d2357123bfbf10274d01da37bec8b472eb12536f6034797f3945de39f5b53b,
+RESULT = 0,
+
+TEST = 10,
+N = df8a2911415088eccd583c6f9bf0f7c65e83c19b189a9ab4c4afc88f977fb1afd4c4e66f66cfe488bd20989aede7b76f46b095c97339e345fe7bcdeab0cf63fd013d7f3114bf6d5c990cf389d3cc19d1f0b92c197349daed655f828ca43bf387cfe12b52033437e9fc3c510ec3f30a953b24989846a268ea81597bafc08c958e0440473b662accdd8b91c76cee62310de5a50032beb3d6ad328e641c63f5c02d4fd42b815f9b3e6abb5f70e69bfff44cc677f065d2c69e5d679f2d52c6defe7c786cf212c98ceea9a65dc24580afbfcec4eba93860fd8626c2a04ffa03460c19087da66ba2a179387a7606f77885865707bbde08e0e05aa516b80ababf98effb,
+CIPHERTEXT1 = 0883a5c18c6b1bb6e931ba0718dd7e010a221f01e28388e02feb2f3368281f12b536c0a93b00ca46ced961d2ff0c9f74b9b4158a7388312410572defde17ef29d241b4b90eaf68ec27e928d33b6768117de0dcd7597ab504f6df2fabaa4b1e22401d04e45687c399bcfd66b731cc63e3699884ae0e266ef9fd0d2efb8ba59ddc69e79f3950b04bfdfffcde65cda8c92a9e90970fbf227356506e3f7552adecbde45b32d29e99b1c9f654839149f660ab75c93d6460a2a1bce7ca49b4bacf16bcf8595a9fe020af216a1461ac7ca2ac195a4f4ed873799e9f7b78c279c680d57f6e383a3f83eb82745a3510a432e2817aacf866760b23923ac0a804b14d759271a07c05f1cfea633422e749998a9c9a37d03f33e96219479d4b2d2a68d71be43810e0031d367cbd44f90670402705cd750795a3d56ebd1fd24a8976323bf9fa13ce6a6bac2d647c566fcad442c0d1174303bfbfcddf7e70bae3db2f948a56bf6f9b3b0dac371c03d4ebebd6042d6510fbe0310bd462256f7e49694d2df097b756f73d3797f07ee7cc569a63d3dc2b989ebcf1b54aa69c5191188e99f8a87a7ac4852cdfb910fb03023e5d41a8ecc17472b21a15df71d5a5a2b80b50b41d34a6fbf0ae8093d09f1e719284dc3a86cf1876e893daa84d853f688ca0f2732487db5214584da5b6644fc9cbbf3d697be8c029b331397b251265588b7bafc958f99bc2,
+CIPHERTEXT2 = 313f03f4d29204b59989634a7fa41b01000cb26f22fd2f92c5676ce1b123ba6cebe309b8f2911684862f2ca0b77973ac4e809789c50d6a05fdb6747d2a1cf7ae5e50853eed40970a28d8e4d6e437d1ed8de975a797c526d9d7e60915d8647beb9cec7817dd455019ee0561611041f2022aff9cb6006232fc54ac68311d23b9ad94f6b952ca630e905d27642db957d14539731bf9275012b5e255df6ae4ca9b65db759984b3cf9b3cc86f9615451ec4eb9487befeb8daa2b0396895c522f2b54a2415542516f94583de6d0556d038ded9cbcf357be15b3f7d9a0e687babdbffbbbdff72ea1d56b3998b76c1f5c80fb8d9d11755de859c7d2449e5c3bedabaccbf2d644cedaefeaf182b6a6f5d5d892ecb3f2250d69616e185f777ad127fe34729fd389c8c61fe4d440714902d9d8f61dde801e11ee60d8303986eca2f18a95cf42de47aaafd1242580b5f06fe0fb29e05825d976eb365efc46aafc99640101dd3f368edc6f8264206af37cc2f4752286db2dcda1a8b31ad3af1f96cf059ac0fefa206beab77ee7c5c7f11f340d42d9db9e28b3a54639722f62d3082a1d7ab73879e2e94ff06f2993d0963fb393ed2e63ffda42182bd49309d689fdb35d5f35b887f2843142639db8891eda961ec2d3bdbf2af92bb75addb5f49b3a1bdc13b087be0ca9c9976ae6e160a3460c266195ea187ce7ef0164405a39b369a4ed4b4be00,
+CIPHERTEXT = b7ed74bd23658fd0b3279f4b721acb10c947b69ec27165a5b9badc32aaace108f96b0bdd2ea347441f3995e54c9d660d04f19e29e48783b29a0547f789750d42baf267a09d58697f4ff4f84fe6ba6df53bee82821fdcfff5b49ea8aee9a72b6de8265dee82b365d0fd5f3fdbd4b79fdc8ffd227cea6583f1e55bdfc15e7d60dd5f7466594dce3778612e35c3b8a445819e02c3c845a77dcf662a7f89937fb3fe216d6db9212e55dc4201558a478b0a0479bd3a1d3fa446237844b5526bf0041f8664f8a536a371e8e8feaf131a121c4a8e555b4a88414866478820304154e1ec4edacf68abfe01183edd9905fa4d981ab78fd23a52262cf47adad45a9d9982d23b4d509da25afeda766aa976dd2847b138f7da157886c3d93bd4b3d0050492002396e769a70961de43d2df5cc113d1e56c5f729cdf67ef0f510753438ed0f331098b5172b405bc710cccf7ac3a907e3c047272a8c7fc733300117b74588e2b69ca650415878d29d9a33a258df6a8479b0b5c6ae63a04bd81e18df2e4bb2e5b849485cb094adec36be9c748444e8a48bf1c21dba8307fe29150e78fcc31c76936f33820abe1caedea82b2a5dccff55ac6ceed685ef9744673ea7e999cb6c9fd05f193db3e3a5adfaf78668ac3e87ec8562522ed1800324f2c4ad1769a2f3973ccf4ca8a3108959fb08ea625ac1bdaf87361f6b264944c0c04ee790d327d15c841,
+RESULT = 0,
+
+TEST = 11,
+N = d005b1d3b33df7b5d37bd1f03737050ab4d76c1c5d4f626950fb192cc21bf2c995403e47b4f08e6f287247c0d07fbd3e5bf22a271684d49788d0f23395df0c5649ac7b8ac0d433a061683247d088d67e9314014f375c7de3de09970966f35f286c278b3d61f2736bcd5d1537911b6864cad7f4ef3192643aca2d81f12fa6da8697496f51f71c29c981f16c80e1b58fc6fc170f6fe9b59d815571fc774f75703a608cffc2736a82a91b07f59f49469949401f49db9647ac0ca2b17f7a3b0868925cc7de4dbb112057b3757167edbe712e9daaacc4a0990c44ae51035030e6faae62fa006b7d595ce1dc98909820b1292e011690265ae386bfa0c36bcca529fa71,
+CIPHERTEXT1 = 306b62b5e6912dfb025fc0935afcedfd946a9c4efea9cdf5514a4321278790fecfe4f945f44eb9405902447b5d90b111cba263bd3fc4eafa20ebb7919cf1ace90abf759487591adb0ba39f5afaaf88bbdb55bcbdacd7caf806395a11ef3a27e95fce8c7ac8d3c25310537638f117dcb29a4a9e712d7f61a5d37a4373d9740ea0ad1898475078617c019a5ee20a57a31264506c3f5a7afcf25d00631b242a1b474a03aff33214d85226015bc75fd0b122c0ca7911ac559c2e74fac940ddbccb8f8f1ad1f67d46bb059db00f74402643e2cbd6666b650da5128e19df10e6041afa118f596a4eb601552f5ac470fcc096f358e0ff874572caa3a769e9fb3d6325d0630905840f160b0d46e45df9aa07e8bd3ca239cfdad5a4af9093260827f50d0a0c7fa5740c4c2908b1f2579971ebbdf7cb223836817fd209ea862e743c27e9168afcadd824839542614ef12cfd9e3c623aee214ad953db814a4fd94264027b210b4a1574b7051dc4ed2142298a349c31cdaeb05d3f688f8acf4d17d2a68290fcb3bfd47a12c77ab450691f0cd5d69b573fc3994df55e01f0aad335e13ceda125b6c768d5edb20f0a3f2e45eddaa049dd4176823e0d13af95f45e15ca564b964f79d1ef4ee3b72bfa528692f6f56cbcd4e36500e03c6838fca897e95660d597e4565447522e2d81e0afcaa779efbbac7bce20fad87782665e4351a6bdecac8359,
+CIPHERTEXT2 = 4eae5027e97f8d3c60de24dd191dc4d55bd660ee93e0b9fb15332b15f111eff2c1bbdf869f77b6bcd971003465c768ef4c34323c18fec9835bcd69602a6ac544a7807ffa3622c1061bab1fa88c77dba760b9b2e64ae9e5dbd61b6db8de905ebcae78ed94a96348039ff19830ff814e353df280a93593bfd21e0eb62ad32aea5e702157c6c3d534c3677efb57d00edd231a683fec985cadeda2a496d002de6356027100d18d55f83d1d57145e0fd7879bdaabc7d695d2c0a0922557a148aa3439b3fa48b552da1a5bf09e9b29ea887e3e66716eea0c73b329e0f42573a1eb1f2a93e89ba350267c57c1eea791c3a460ad46844d66e6d6099cdf0fc2701201175f2f42545c12670b9c1121b123eab277d474ae3d5547e3e9b838de27a62828fcfac5d6866091aba81335199fe5fa3c4740e69c364a699db12f8b5d480002c16b415c20996fb53b6298ea78418f035d62cb935ba3ebd48d501974018d41a288b28b4896351b377a573bbf520b9c66db7d425a31c64082820fd304412eb4dc37dafb8a4821989f83a1b191033196663c73c1006268d0548b3a341c435dfabbfa79e7acb5acedc62c520e3f0956e72e2d0eabd7ba7b707dd90949313b7f604ad51670273d70da6b2585eda67f5c167de5b9e67acd43850eb98cb85a86bfba53a6fcd1537688c0214bcdd860326359d239d38f7b46c0e28be27d0fd47afe7e4117ae9f,
+CIPHERTEXT = 9e09ac223205b940ba1218848da0243f4b3cc517ec01df406b9161775a10c87c4b523e40ad3d1bff96775fa453be833f651c09835a2ed1338734fbeb0d529647dcb2e2e553cabced8f6fa90d3c4c51b5426fcced03107fdc493a5ef5ec47f519ed1b7e68a5e058a49ae3b9ab25f04d2b06ef0bc675db691b95a98a1f5c32dad4a996024e5095d22f91e0a38dc7d8177e6c6ac70758cee740546fd0712071c760994db3a9ef1fbe67543304f82ed6fabb1b787b6858dcb4d92ed5bebfbecb662d4ea6e6d196e5ca4e6fc997f4868b9e3b681d77e2bb0472bad8f776bb60a0a3a99dae007357881b4313436cc916bf0bb0ee71d39d87eceac9d1e596f8e959e3cf05a337cb5af9735a970a5e1c5c6d84ea51f72ad59cd529de2ac73736ac56a7aa2c5033fdf7ae7bb25366473f617c2c24873e5b46bb1b082c43fdaae17b7e2ee1c749dc971641ae4c4d5e45761b9133c67ecf12ff200babc7d2cae7b4a4c7d7060d0f3f4c9c252bfc3a7418e6fe5003f566de02c58080b160cc1ba806a9da3142a4e6965d57093bfa29805634b06ff4185efac275b425904dd27dc367fe4b9c5eed78fb13395ee1870daf7b9662c7124ac24b960a43797bf017d1ce833f592950d94653c51fa1c1ff3ce57710b9f26f312fad69ff1e4ac00712968b197f3ed0b75b213b79203ddc8d1e20dd34f3cc6177ab830b742f33e44352e322a227de9e30,
+RESULT = 0,
+
+TEST = 12,
+N = 9f8d1f284613cfeb870abeb212b44b1a2e9b970520fef0dbf2111ca713b8da9d214aff2ebbbc81b4cb542e88f2686371eaa61fc07b1c8505b875821192b5abed9e2a14cc4c47e136874288158f6fbcceadaaa0357c2e8814cf7c3385970deb265b2d81f222fa3734893243f3444257674b7fe184698cb45f5003a874939f50395f7607139fbcf1f30b61416c87fe2bb5cba6989a6e5c9884500b6f6194d1d00265e350d3e3f743ae9e077908326c6ecab7bc69baacaccdf00683ef8241a1d902cad48f66a7c4b20c971a0758ad0a5f49d7d75e0e0cf437ab9d292cbc47504dec663f47f1b0d6de2fe0fffa18d89a1a761d49efa4d8395ea552b878c147dc9efd,
+CIPHERTEXT1 = 0a43ef686ff34b22f9cf0edf3884e810aeccc16251f05ea36e49fc0d714a1e92b151568afb7b143afb78abe6dd5bd48d7c60294e8425d03ff7512acc30af3c114fb1e055c1c3159c1dadc08a84cf92f7ba624a43b4d1a54bc3037522675315b778066f935269f49d361c8e8ece40c3e93d7282307131273aaf8b10de813c18cde3ba3248bc929a1b71e7790e87a8e0ff18c26ed62c07186f268dc1f9a7c6fdf7a5f85864413dbdd0f54e8185fe0a5f751901ba5000754dc1f440a2733ffaf0a48c2d59e9ee5ee05bdedc0e9b376e4163c9596a0ec9a64fed99c219cf66afab76d27fd769b0bd18c4d88baa1c76452685be5d6fbaccd0c7438eb9d2b0bc6d45f4b8dba38be377a40de2fcb0ac1bf9ec8d6ec7f04fc3f266584cc5d8803da1b692480bf87d74e844fde15431693116e6339bb4503ed20630dd06f52e96297c4ada6eb596a0b063f8097e13399949c626758f3d4ca2c6c52af9bbf86ce17f838789de98124969ca7caca2bf68bc0fdf4737e3eceeb59a6d7c72949c514ac28c27e27109c1cca6db194b85ea4a132ae402d61f5d258ca1e69f3b77d873dbb6fc2dd856256249471773a8f4854955654760c609c8d5f82aaa5858d30fb011c7a105a85a318e8487127895748efd6b5b1234cae0bb2f2613483e412989397d5aee9793be44d7c09b714302f1ce356a21bde8c5709e17586e83709c9b52fcb10ca6dcc2,
+CIPHERTEXT2 = 1e481ab815532f515f9728f7419dd4ffbdafdddd6e867a9b8bbcdea6eceff839adbbbf2211be0edeb47c4723e1fd397fca9aae80f8b25b7400ff616f54571ff29debd9c017e234d565c243b77f83518a3fa52ff76fabd4b5506ec10cf828aa53fef8ee7887def69eb2695ff752f287f984d40cce73d6e7d34dfd049f723e485833cd0dd4e2e2a42b74204d48096e2ead43218739ae58795f9521976b959bb2a6043c6c80184aab04ba82092c6eafd0ff5cde7d0623c44c20a0a5ebd37370e9e44215c3718dcd3be209fb4bcb169771180dad92288d09f71553617538eacceea0c6825e0e63164ea76634ce880b613b4d4f9b5fea332703a60924478c8040eafc47f7d3b8d8c1cb7db8fff3f4a6b0d3cc353338a31c2a46300dda4eec8311efa57865047b4c8ce1a56bf4bd9c0abc1f7d96ade48a9dcb08a875d9c92eaa0e4d175b994875370baf07982d3ec0d1d251138b9d3143b154d20ded98c51dd0d6f7b3d3b13f146bb0bcfbd52a01da1d6268234243c644eeaa92b5030f17ffd43c999c1cfbe56cd1eb270854498182c63148e5a36594fc8ebc3f8986392ae3740a7a3236816e51092d4dc8974d7908babcc032d0e4f96ef927e7744d5813a9cff1a3a2d76127c86f0eb7be7489c1e170bd8aef61fd23dd4ef2435d641994511e5113d4623aca4dd967793971f0f23af1013c6bdf8489fe031e72f536214c89f9819276,
+CIPHERTEXT = 097f669e94e220688f6de3006b550d93b769ae0febd7fd4e8f7ed8006c22fcc5407443e0dc0ef7e164e57103257adccd5abcd8cc724b53169599a1b9a484817ad1f0a3ba13517712ead8a8bdc7d31a5256f0eba60516791efe6accac1efb7cc02489820dea8c1fb111158e814eb3d2f010786a2e88f153ee0e258640e6d37b9afb3b4495dd70a803d61d637180294c719e481272ad8c9dc3d482b4c570338ea152594b5506d8bacd7c5268966b1ccf2db831bede8690303436635faf9be080530e3d903c283349299fbb94b5f7fd8f6e95c4bbab913793d57a2a5ab32f73825cd4709827c03e5ae0b7040d9802a06082d511abbc5489949ead884c54fc2c1e72945d75c3393fcdf08c3150e3ea186ad8655b36453e4d3c71b27867c08a2da2a866f384518651fd07c26f95c70a2806bc464c030ee73f540f7b97a6e87a07b190e0f69e1e4ff276026f76128f75cd6445e97275356bb7deaea28c89858f5833477c7788b12bf02f243635bab81a46057c5780e32825c8b03c80ca3725723152977ad089bbfb18fccba8c134b2416d95235d0a96d64ab94298cdc5a206d270e8580ab1bcdf5a4aab26459722e2682d0572f727f3d322345bbb14e63644e5540a0897b07f8076f7173a2dc4982210f68d860aaaee9162e0bbc287735df27d54b383fb237fa500ac86565156136633fb4a2222678fb48471be1c79d70c82d723be6e,
+RESULT = 0,
+
+TEST = 13,
+N = 8c06eb994d096f2f28518d1f27694dbe653c33c91a2995890226e26f1a7557b61825a899b88c0820709c2dc9cf452b2c75d278debb06e77ce5b2dddd134964b9bc4ad10308ed89f1dac09436ea0deee92c782883f7da682e738b4ecb78570d281a6827e27b6008e2eedf30f394ce4d292f18d876c748dc63980dac9113c9600b143b5b6ac80e034a63be58a9a134a1a872750b5a1fa6991585d1f3355c098653de35eb24d644cf4078bc2007bf190ef9397c8f9a0a7479e4f448a7a45ec8d0b24f277fb266ac267c0c2bc511ecd159edbbf9bddcf3f5b377b1ef688b8bc7238e4700e4100d3feadbb24ddedb82be6e6a940dcb71f5a5483ed1f35fb374a41e55,
+CIPHERTEXT1 = 465edb52af827784b289ec3255619962a5991d00ebd36eed4c449bd4e62a170e47409e04d042fed65a38c0be725934297f3848202797737eae7f5d09e186d0ccc2700f5e7a9202821e1e224b8f9d0862e25cfad12876399bcb459c0dc80aacbc614831ccc1cf1ee115f043374d9baa71e55c648883d085ce35c764e15c4a95d2c3aaf03a743f8cdc51538be3ac729eb4fa4de31a2f6aa43bc6f7906d418235539454a422b5cacca1f27d4cca34de8485efbe548861f6306188cdd80061e482d31a38b31d5a5bd08a46dc34fe56fe1dc94380fcdf40f388aeddac398bd4bf54d646521d06695ce0adf4245909ebcb096fb7f967548b16bfe3b46970f145f756eacf59a9fd398d9f6e47b19fe0454cdf408485772effe52688544590561e4587a281852369e1af15fc4b25cceda8387aaf0300fa8f3ee5855ab65a504348e3e6ba052f42db3aa15a2bf996e4ce830a5b0a84d0e268aa80ca108c82eb58f40bac2113ebfc96ec603b101829c856758cfe4cb9cf3507de3c2dd838d51d42ef66292ea893c39a1765a2a2150e08507cd9f1d9d29a7e11450e0b37f3ad5c488d8c5b77472bec01755bde192102c7d89dc042922485e6281c90c4674d23b415d32cf9ad51ae95a518d45a9eed62dd34b147ab2c18d13d408edccc478ce9dae7acb0ee1a4d771b3d8a698ba936f8ba76983ae69bf35e8a32bfd2c05270f0805e2963b0d5,
+CIPHERTEXT2 = 1bce2896b7481458bdd0fc0e6bfefaabca3d227b8a53442bb1cf5a37c5973baed8256aed208ff53775e09fddcf32c98a1020a80cd205f2655f0428cc59b5c9cecab5a254eb0612d013a2404a9cd055ec6f2a82682fce8c8392485fc1b349b808852728823299e39ec5922a6dcb3af329b5f9859e1f8e1cc06ddf7f9ca1e87968bd6ef81a920ff999252b3dc218c0dd6a91d79af3624d690c36bfbc60843ad3be73f3b3ff7af6a0a2be5ad85392c5c280128eb721df65849e73d0e462ba333eef75d4af4c87a885649c329cd940a14550beb13bf5debbf06bc5418a639dbae109cf69ab82be4df8acb537a7db4a5c105112efb8da0af79da6b45800bd35edc22e83bd73caba516a3204cd3597d41fb94d72459ad067fa419c96a6ad5727423060a7286f2b145de3a2c41d93f2e7bd111e3f7d86389e83622752d075da2582e7a743fff31719425ffe95ab2e114bb94cd50610728c653552dc00496157537221ca480adb29ce57ea8311864775a2370444187ef71ab709ccb3add5af2d1cbcde07f45e47d5626a8afa72a762a374634e0d3107d4b20df3c43356eb6d64787505c5eb0da29b79e4966768ce596bb5a19d5face59963cb1f88e085d52f4ac8abaf4da249a13cb1439690d16d60cca5716f11d02501e561b11c3d61dfb2f5b32c341483f9bc0d1e9d45b8124c566c92fa970cf0784cf83b11b9cb7dbb077b14f4e5f7,
+CIPHERTEXT = 3455e56d6fa0d216e4d8b8b7a59c8166e7d45b929be941660e2357ccbe6cdf77a85cbd94d40a751a75fc42cfdc695f246face81f9b0b4c7dae87cc724c2b2c87d9fd425f957d946648f5f03dd13f65c0d8c644c5dafc2a37fb4ef0977042f2359429509d4d9a2275c668ead5df142c3b16a5ae534c7a22e020d7fb50b15fc8aab5cf9cb7617bee18ee6506c19884198061afbb0559948bf8b937cf46111bdad880a085531de96ff4e0aad1e46487c7d1aee4f5c6c31fd5077d09c2e50c8290695347f57bf39dd7c878d3c73ca7771b6a6175c133f8b31673ccdf8b2348794a9059baf8b1ecae9dfe197550845e22f3db2f6c3e69db75bff87733a99edb4ba259b484867be3031d4fb735689e13c38c9817570bccfec1b023b060a8c925c032793a412145694d55eedb1914187374aa988c60c5f16128cc17ead30c2cae3b57f9e018234dfe3bbe22305448d51140314ddc52cfaadb1d883b1c35a283385fc1775fffed4ea294bd0e89dc61c6e09247c47c72c752375b472f971cc6c31a94d8f17595628ebbfc3201fa34e8006fec7a301130e70e6103a1ae8808fe44f831e23c38bdc5eceab88c3099508e166d359d28e095ec40c6200ab4a96e25015145d47064c896c9d01f6a27197349e131cdb6243c94b67d7fb8448a683a83f00bd455aa4c6fd3f95ecbb6294b58f4a074b0c21d2a8c0d752d67c6327e5b8c52b9797202,
+RESULT = 0,
+
+TEST = 14,
+N = b77f5a813f958a3bfa04d59c79936e2b5dd4330384391b727400467a458880c2be2c3f9bd696c209ff45ab57c723cb93b48d86fe09a7762aa60cbd8c5184db846b4d3699d0f4fff3992a04e22b6ccb35c1cb6880a83ac71da84a0494f61d8910125c16c38217c0079deb7c0adb5714be48b742c80f269ceeaf8b951d988f8958ea50ff97b26da6f04549e3ed1b59c46fc4114c2543f2dc17e1764a01349ecde9170821b0eed441bb738bbe5edb01a5447254f05a98b362af1dd0b8701e3f3f78c1089bebb943fe3b42df185a34d662fdbc41705c3f45476d3bad4202ddf78313d3936bd107f5c6e49977bcccd1dd00fa12f42541c5fca03e015ce59763b29eb1,
+CIPHERTEXT1 = 1a5d3ebb826ec507717d20689b39af4b55b162829ddba7c52ba3801fbfaf31f9575877b1a9422d8a3121c12b991663bc99dab65ad72f30f35d0bf02a241a2cf01e5a34739d8336061cf07fb896ad66a9559473ba13994a1fdb769ac83a5a08e925bf2f3f37d2ef9614a8c8551037f68ef2eb9323f61b93bac84f52726c92d9ad7363c5376da006effe32635d5434d09bc121dd4436754222e4dda1ae42d182f5608e0edea07fa6b2fdd2f18d33930508a490b191310323042378756b2a76b4491296dcc9fe66d843d038c4042ef770adff654988de095f7793ecf6b95672dc38c4d84b61c1f7822f546295129e13edf1f75ed0054f87b430e7b859f47281870bed914989f199b296809fc61fe84e9097ced24b5278ab75ffeb326f34bbfe703fae159862c773ab06195c342b99684238bba391942d652007b465d6027c88df6e4024f7b2b56ded483e5fa1459ef1c2dbc8515b440d9bd86481f2165f20088efd844a17f526b6b645ec33f3061a13bfe71c70b612e918192d32e5b8a46c838c3130344894177b92bec67fa7f5ccaa5b913cc537490218a39ef59ec5f744e9426f7b67121dc7f09c5b2444d8647fed206523055babe9ca6078d7895dafa9d1bbada9efbd45a4fde35fb41f0defcf7f231621efc4f9baf55ae147fa634d2202648745c80eb54a50ceacad7f4c4965ee902dc63c5f8010cc81f7ab467016ed0c43e4,
+CIPHERTEXT2 = 220e023a56047ef8074e1a2dd952b2e5f3df3563fabd0e7981e147b7ea0a52a21e70e6d96435020eaca0114b8e59a421db98b3a90bf57535fab2fcacc7565aaf52b7a0f99b0993427e2ab7010c04a9f96b948c51ba1a59bd389c4c3cb613aaf27db961ac1ddbf0979d7b6b2b41df69e821d61050e684228092ff3fb9fd76bbafd4e2da1a99f13c804574ca8180e3a3f1b014ff05734968a651ac104a2ba1dfa0ebb7f53611fdca82e08016a5c88a5e4bd8c92904d5b8d530ba0e4da13a0ae943137bf38f04900ac3b1bd03e6ec4f40e6b566fd5bfe41a7f8cd1ebc3a2c7f7053ee5e920a19e4e59ab22b4a147ce091304dd877cf69d8678191b693016aa52a67e44d8098c683feb4cf358adca8625ccf49e5c5a5158e9e908a589befc3f697e33597443e40c1a3ae7b378eb0440ec2a334d0b8a96651a06fac5438a46bebce1546d882008378510562baaa0341a8defa794b59a0fcf0150ea01883ac5dd4b43f1ec86f368df5ba520977fd05580a75404539a36cce89e4b67878bcc06789f083a3556ca0664b3055d984331ff9594f1093a8567b52db44ab175653cca7d5c869cb3d636d4b30b4137b112c53a17fe3713dd385050173c90db0f4737a882c9dac9a2a50ac9ad1c1e0827e80ae27c38449194080b3c008643120b8579bc8112ebc9ee09c29c036bcea348cd263244acac37a1895333c2148a0f2238a412a3f0e5a,
+CIPHERTEXT = 10da88adff9c5c02db70b880f684df25af9fb67cb22d864a3e589c9820679058223f37135afeeac6a7ae0ec0aec0ba5d6fe7551b024f628cff44035a8180e71820f74f2f74879505ec910e81bccaa1a0d5ddf39a995de093bafae3d771391c981b2825b458bf907c469a75106d2d61a8da4a340aca44b49bd8fb708b03c5e2156e0ca14a18dc1f66d191edb5791ce024dd5a761389b9bd586cb5c9311283450ea0891a407adc2957e026722ae85bc6bc2391e168cb7e22a785055f2a0e9f3a7b2a8b394fca090f4ac123e1b65b40f724a9b5a7a141dc67b331294c75aca91367f56b2e8033445cd5660417c6a90608674a2c717d0e2854ae377e278412bed8042fb9864cc375ab43be498b6a4e59c30675ba7c2b5f5d805ca2e8a83df360f9f7df8b7e439f943fabec3553630ac8c30643245cb5c12aa7c115e93fa7d31b5dde5c0b425d4db10521ccacd0b9e966e513101a00322d18a3ab2238cf136cc5cf704fc07af7146c46d8c75d57dd3aea4305bf1e55725bb4afc88160b91847d8af4b553abce25f60c3dacb3f628213239f4e50fddf3e449b4e45e9517d2e15bc968c6bac486a11ae72feb1226b5c3ab72ac70ba39e0712074c7f637e8501317518aa7d46dcaeb53e176ae9a6bb71b894af9b6ef9d982547fabe1a9a2f778bffa2bbf67ae8123863a903281758b53ab1280d4b67326e8c145e0c18b92cc12c4d1a92f,
+RESULT = 0,
+
+TEST = 15,
+N = be43cd5a65bbd55f9add7e9edb01a2af6dcdc6aab36cd64ee0deb15dad8fba7a16682f2bd08590048b9ace8fdc66a2f18843c4072a57c8416d34469e18001e5175a5516122882674f1e61a62b4c31769e9a44be96c793b9c5a475fa62d4920056ff84572c62f6e511a1fd24f25594859243ef9a5829b6a39aa6fca7d527a875fc6745e12bee2ac76a766ca8813a306759392fe81540bce14a99e8e78a011ed2f13970ea6421ddc89db2c3bf0166d93709211007cc86122f2e20a2f87624f8d8915881be7dd341a06931eaa90b60b34d396b16043369083dd68378582d5c556fcf4066fb3fd44d239fe44d9b591a41c4bcf9f6275157359ac24c62c04134c2d87,
+CIPHERTEXT1 = 178d57efb6f7cc25432704f78340ec538c87ed62762def0b4d74a10b8d47142bd811e079c2c63d0b450a79d49c6092b1b84356ba050fe086b1a2e8416e1676db8df62c100b582103ebc8ac9447a5c0948a3d0c7f803aa0b657886518caa22cab0af031cda8596bba0d246249b255ec07edeeca52069453ebd03887a209a3002ad2403c433a7ef22f4493842f1f797116bef8264b391a889e82aa1f5bd871236a33b8a225c8961b2c06ab6c80e23c6616099f1055ddd7bf8171babefcc5bf92a702de7e79e57c18c9e25524567e0c827940b31e1d8646d18c854497441bbd9fe58c87a75b16782cae46fed098c71775022bd3c66e3557a7eb40d0dfe32f0539d309e3f2565f0b80cba9dd1cd86f1b24cc1a9c49af50eb2707a1203dbb9ec77bf701be74f4663fd0b79aa7cbea9a54b695373de05d829470251f7b3da73038bdbc5fd0e68fdc2da380857d771140f123254cf037f6f72cb4d8e012fa12c7586d528fca419f5849770c7cf75faf4a787b86022cd5347970d98c3020fabab5de221961ca90cb9104b26c95632057622527610805a89329f46042d787e7e458be6b3a2e29028014dce94440c1bc975db744050c2e9908122cdf4456fd95ed7eaa44a19d1e98fffe3f4829000d3832f796d695272021d7c809b339e2c0a1c72646df7d8dea759654015e03dd8fb48bddb526b1aa51c5070831b8bb9831c52a17255632,
+CIPHERTEXT2 = 6e03f42ebf1b4c69109d6213ae2ec4d8f9ab0c10c1bcd266042d3838ba2277c52cd907ea44e5a4b435f31090c5f366ec08de85b4b31c5fbe6c51810151b9042bfde4b5319e03d6a0377a5911d720c337b65b369a72c2ac2f321f10a83b5fb289f31c4e66752bf3b39469e99d867868cac252cf60292baada29292edfcb5b6dfa01492dafc195de5ac42c8041df1a61537fd07040d55b5c0ec42ca27bc99e461122f20757c1dd3fa1e832172154cdfb1a042929895358e8a54eff835da6c31845955c3741627c3cc65463cd24a4585c6fb73d84a67e8c6a0c9f3a6893d060b17b28c84ef8051bf244a1608baa0f90200820c9cb5cffb9efc08cc61ba03d69a47abeae0b52088b93a8acb49d1e6f1de79850003be5ff766fb6a39fbc33687d83c4995c63ce4732ca9b498039d85c15f3ee1feb66c3edbed8aca73dacb58b87ea2097cd14bebd2ab7eea5f6fd43df4b497754f85e751dc2773615292e52c5725d4ef49165174a80c3f75bb3bdcb3f6cede8411d5106cb3846bd400eec23631af4041a2cebf875a8fbf7b0245b943b9374780854972201a5c4541f3845aafe5d4a49b393a068eac007f18af7f5d800feb252bcf4dda88506aaca43560f16d5c56c3630c09f99310c2313649e9217573fc17034ead8098a8a625e383462a510598fa3b36b8c0ba5d54c40eb712fe9e5e188f942994b94527b68feee55367874a884e9,
+CIPHERTEXT = 0a577e57568f65ce219f84821a742ce53f6f5f9cd3dfd43c68fe9d210b0df03b72cc76221c6f9d7e771bef8342ec130521b019b8851becd6c9ecf9f8023fe9164567f1e2c9732f8aa61314f377d8c1541c7269d871b93c5a22e8e915668227ad04945496ff4cf3cf60d332f90c78d66d7c4e3f28044c5286cef65aa7bc09a4895e0c488e8bfb21be227f32c61438ebcc0a68dba880a978551d6b3f57a1f9f011177545646645f1810a8dd19cf092b63a7fcc25689fc7a635b03ce2c42c437be61f1e2ce109dcf68da6cee7989e4d5f2f2e313e0a29c15c98eb4cc24768cea9e2c3a56ce5d46b4dc76e3af9dc72daeb23540054ea9495ad198c200b8a33f598a63bc4c3b47e0fa3ab2862b28f431778c2be00f602ff3ab8b82ca44baa26c14ef495151abdfedfb7471c8b9239abd1c5d01fb73eba1d8b182858d7e278c84b2304ea1e41d0b1a9cf61f2333412cf2ca047b79473e9799d67b66189df64065446ef9b0aee000e01be953aff0ccad9a9e5a07488284a07d33bfe19e7abce6a939628d6a62009bb2d9679b419e2990f4065ae52ae682d7e8349c4c907c7d5642eb83638ab70b180c3003580888165ffbd2fa047971dbeb185da2f2e1695bd78a997730baffcb13aae71467b07bd5ec138b8641a1d7995d58c01f0b4f424be8474434d54d22b4ba9204c8809ed3642fe2e1062bb76ce6425f4ca3aae914c9df219366d,
+RESULT = 0,
+
+TEST = 16,
+N = b202aa4f91d36c96d6bdeede2b519c9d068f01508449873f285a229cf2462cc1880e326a1be4f509c0d5ffdd9e13ef690358bca0bddea5589d8c3ac0e9f5d7b418ee36f1cef28e231bd65b49606d4aca508d46284f6601f03c2bcf4b1dca3da2dcc31342a2da8d0665f439f35c3735d068257bce5d290c569e513edad55c7a051866b22875775f9174cc82297be9fd37779535c099da910f847fa3a9f125175a9419460b7b39d196110f38ce34a1efb1b078b2b1b1a01e72055a374feeb1dc4a3f4e001d5fc5d949d6cdcac418af80b5154ec7c102f9eb3c3526be54cf7fa37662dcd6bd288527306c9f69acdf8325e4f2c604e2a983a3d00cd85a7c57afb829,
+CIPHERTEXT1 = 324a804891550fe2262768a41ec66421d9eefa91089aca90a6222c131533350d9f8547aaf4b901937cf557e5fd24922c91a96cfc86798e6f22c0162dfc310ee7997823a99209cf0b2d7de5044662a2f3b7a21c912b60c802e8f0122275240063792fd2c5d09f8e4e3896bcf791599dccf556ff79a83e02307414c972b4112427ef4f68792ae076f5fb01210736536c14945a0dc7e31829ab1b0c86baefc52d7bd3d51e8a951a597dd77e58bf12e7b3cfefd622d982dbd195f9a48ef184b7c67eef744d3de531acbba66194a56a0f2213615d6c80aca256a67757ada66d4be708f7548e10198f6375e395f4cfbd9e43eddf7c41869badd50f553b57ae0cc18cbc02b7dcb5a8d810dc50dc044ae938a2d9b16af554bf35cc5288348031d50a20988a8ac3f7ac17f46b91dfef9c00fbca9133663b3e1255f90804a9463ce3ec70c430bfd281b94394a5a4a093415302411db67a4c7fd84f569a4f999f5bf8087a321c7d1ccaac3137382b207cc4c138e093c69d82b4aafa665abbfbb85293ad28945ca62deb0f6c5647a247ed515ad0dffcbced582b78945aa098cba9716a4ba2b45d567c409233923b923a6579205bb50f79c684953815a5959d0e8bc21c1965d64f7a0bc9340ee9d4fbdc8e948d10f58453d53c5a1ac9aec0388230089547900736ad026cda13a65b7c775ac61e2618da41e0d0ec9a61983233765dddbaef7a5c,
+CIPHERTEXT2 = 0ac41cfae2536d6e1f6ec1f0129a91830d91f9ce270bc3a3e99584ed6bf299b029117cf6eee6fa62d115c6c33eb5267348e1dcadf87e28b3e96e1daadfa9c6d180761db539b284ccfe4c2a10f1ce621ef20acafad5d4119c446b94385b4cd1eab7922b950f01cfd1e81a2cb47cdeab1f9ab250572d0f06a93c2c15f7fe66f1865155a2efceeff5e23607bf8a1fa72c46d483c407757646cdc72b61f2f559e3219a0ca1f879f6482706f0358f8b3d074aaaf0d974a2e086119d52e78c6c2ca504d7c5eba80d2d0e3fa0c2913294960ec3690391673e4dfc73cbbfca32ee65aa1934aa49d15adeae4e1f35f9afa8840fa84b129283650281de0c167beb30ad628054910df43ee943c458ae1e103aede8c8a70472288ad7d3227d479dca672ec57268046962d22d9cd2fbd7e2983d2ba93603cc1ba9db2c600686b994780dfca8a2cac69765b8b3a4fcaa5a71ad27c2bdc4865dfe718f2a45c1e12126f71c78541dfd986c357f651e1a67ac54ddb15043639af1d9029dd3c24be4edbf5a940e62003f7ba87e9df98bd3f996253554b149f89d8e68a1110b3fc6216d0b8b60a429861233deb1f34bf5a2250dfe2e04728c9e9620c0de6abd4781602d263a23c289e52aa223ebe50c7a4c14a7a990d69b33d7271eee9bea0a049eceab80c4a87e58cc38a3be38ccff9e25cbe21dd3b9845087c6a46ef43a9764c160b0cf48c145d735,
+CIPHERTEXT = 021467eb160140888ad4dc74ac656d73cf1098ac164517fb1c8c7f8d143773720207e71723af5b5a7736f281bd498f5981074059a59725e13721b411011c849f5e8786a69bb45a6e85394f06b09bd12bfff12f60d8794bee088de511f4a8d2057ea698dbaa3a3bcbe5b477c5770859d90866077e182501457b047831c0c4ea850e36a7531368ecb7f23070d8431e7a85e8eee13e49448bc33e40b6e772df786c7d2770e74075b95ec762ef7732e71819538393dc31963f7b6bc7c7d676b79be4967270698cabad94b4635ff9d87c9f1a5c357da6aba7ce3d34ee16e33edc4f2c7fb490c64a1c4cc1959cf1811adf8c93dc71241ebc886f8a894c244b385e42dd6e5d5384099872b136b9cc5a2f3d03c221d7fcb273adf9b5e98728f2b7f414a69966528a05d8a4878e53319d9bd058ccf34d7f91ba275c7669d88b97d933eaac3e4d27d991d2cce2a9f119dbaf3151887d7c35819359f7727e3d5260e7c699f99ca8cb18d56332a875044a3625e579afa8c50491bbdeb59de2d0fc1cd94b4b1ca2525c94b026aa33b8f6da2765428258d9e9488db8ae91232c6a3efed68a6096f704a85690f329ee423feb4cbe6df2eae2d52923c8d1eb5484c7d8a97d59708380b3b720b3f36ed951fc85d93e8751177087653b42a1dcf594f739364f90f5699cd5a19f0e275159ab8ff74efa7cdf6c3b668b58518d6292721d560b4919c35e,
+RESULT = 0,
+
+TEST = 17,
+N = 96eaf09e4955a62bf8eb0d092905765d3f7c4226fa8e86e1f3242a3d45d6a9d0b248b7e608517a2f8df453dfaf9a841243ee456b3ff07b0e1c4298b64cc427245a92196f9481ded78db3cc78c5a5a7608112edd96af3cf974263107a5a42c6afca98c1089c09c02ae21cff1fc4644a6eda522b794c2918b34ef8ebc30dec2bda2ed24816fab60763daae8f310686c3c9ad61d84d271930cae144e6d66a2cc088fa49a66320f66d029c78e6bd350d8278f94befbf3dccdc6a65327b1571984e181f14b032af6cb5a5f60b6250e3001cf1a52662371e1e431a388fec54d4efafa16a1fbb2c1e0cad720d3595f2e1cfada3f14ddcf294d15222e7d464751a4c49ef,
+CIPHERTEXT1 = 28f3e4f8877009c9a432a557fd2338bc3402272a47cbde8fea75da20415b98bfc89836527463abb9643df78c84f77ddbc605842e1d48b6f84d897ba56a0b16acc94ebd286ab45ebd77bc1486aa7795d71b8ba516418d633776c966281ae55df46da54888e6b401be3e993c50a58b0d0e4b9e687034228ba53849cadd28f75c971040d33548205976c10ef012fc97070b1da9142dd413a9e78ffbc7cfadc9458452e6767f5a9394d8132932bee82391a706f90f9333348e794c08819a06dbf9c159a243d3244d8011894c8b91b38f02f7a4d1a2f1e28674b5af3717175c99f4159b3fb223c3e66b6114ff9100c63a3141342847d431b905f063d162ed02ac3e0afac2c59eef47296e0b7ee77e601946b66b64931f7fa866b003ea7278163cd4a54609db7af876c3cb789917ced68a881b6baa1759129b1dfe91a3b5ee6aab7f53d90aa86bc24980d274feeed1930c985edd5a9ec57bc2c214a87b38a37a2a9ef74fa0214e5e12618f84dccab09eca74ade2f87e372e318b2b76d967aa7c18bc0ee0b3ea7d377a314c25757dc4f4e05ca54b5b06c873eb43db3c02f0c6cc8747833105e7c19a9e4e4e82c5a8199e050dc464baec0286d129bc2f036dd9dc924885fca37401a5c87704c50deb151f6c1fa1a579326aa5c425adcf4087e3a497ba1eecd0ff8c72fbacf4f84aa63e0b06cbd6dd8c2fb77b2cc69daf9163a3797e75ba,
+CIPHERTEXT2 = 43ae5fa3212ced1708cf2b6ac0388f798564c98aa6589f8001b97afe94816178bbc12fd15915c9d765601a12b043e8aef89c8a6637dd22d17c7d97915359b025562a899cae32bdb779a5da6eacb47e8095789dad3a31a0976b63ebc951d6ad1491fd0f16953b9be567bf40e908eeef7f4a838d33abf58b58b681a906bf9cad78499f7ef6de42217cc4a1c7fd7dbeb627a7406624ae39a62fb1fed432c1c3490dad5ffc31fd66d2af8a8fb2aa37746f9be5eaf93dbd7a68b4b3b2082a2f0281b479232ab763d8e69f3bba16445a6fbce1bdaa09b0293ed64cfad3852904ca24eb23bbdc47611ddac02b48716b2a3af824a894e5e9e56933c562deea4e6759522c9276fa9773faf8190eb333dbeb06ecc6dbbc9ab61422997c63bc74bf1bc7476527bbaf0f305041d6f6a1cb04390abed000253c8f0db16e41e7f10f7328f3af79163fbb1feeb8792df1f21059bc4bc284f90fc75cf635cebbb48c7879066fe8b99c008a760fc5e1ea50c686493a07b5dd96f6ee2480ef5bb9de17d49ba5a5622e80c83d52c26b3d814cd0f4e3e7e611f24d9c22e0d18a9203297537cd64289f22418527a00cd3c05b440acc3cd380576be5fe7202c899730fdaf5e1e38ba1470430c4f51398bc15fea513570233a1e500be8432e743e1fc7aaf3a8e843a8d199530f7a965a51cf7596552b561d17a3d1f10bf19b6f0f1730579297071e4d45169,
+CIPHERTEXT = 2c408a77f043ae26f972e011a1fdc5976800418838afe81f39c357628640354b7edb463db49ecd39517c8ca20f6ceecf8e326859809630047d7166c630d6a5e755fbd943e889a8d8751e802922ed339f6ee33bb168e33afc642766a3c24f8412a3df324f7ea08a1815ad8e5448eb74e570c2e792805eb9bab9ed5f656e7841b280e6ec6ba3df8707d4ef5020e271bf46db651d30dc07c50a6ecad68387e98a7bfa36a6927d70af5aa0337bb4a81b00d86b71acae4f2aafa91a570371ce502eb9074a69fa692a94f3e95968c57a42a6bed28d51894e411e9b180463d19e9db31f9644b9c88b7e55267bf018ce6973aee09d2bcbafd7e39abfa730144febef2cc8960bb486a9479539cfe2daaa17a3d173d4bdd96beca7a74702adf802721f72dce9a3c692232a2b9044b4465c516f61b152808429cb805e1ea63b508f4e74d85763bc342ef9b49456d1e96840f71cf1db113ece31d59e64e4c4f8fe0a207b4781454171215dcbaeb55f744b6f7e057cfe23a1963927de73d7960f97dba6e91d1acfed9a30dc24284e04fc75228bc073b75baa4c441853ecb8d8f05e4cf2634e8534e9e5eb264f06a256d077176fa4f5ce4bac1413ae122b2cca54c09650f438f42ae355eaf29a60ad63517636060c13a4a6bfdba52482a3fff8ca968b752d6b7579bd966c4647b04b71148d721c25256f3da6724bb681db0e1325534163d30ae2,
+RESULT = 0,
+
+TEST = 18,
+N = da31a5e68ac3eb4d1820f3442b137e7b09b86bc7aa808397916437b61b5342226ca3f62b6917baf0a698bc2ae7df727ee56e165080bf9d27937955eaa568da6efa46c9698b922890da1750401440a4bed4105188558e328c1fbe97a6e06c4c3a18815f9b7600d98f18c13af8400cb1607a8f2fbb16a3b04b370123b9a1ae7834c95498704057a4415f492b778064385fa3fadecf193c4a10faef97a354cff49e0384cbead7e18228c43bec86ad6bd349d826d14c3b33df4f7079b3cfc09efc447a78699ce1f147a53fbdeaa745c48c2e57873b10dad71af5fe531decdb8c189a8ee73a07664003c5417b1763a3fed04e8b603adcccfc93c66938c350e70df043,
+CIPHERTEXT1 = b574b72d433c63189a2b7fea9d6827c49d83570af3edf6f5a0abc6ece4439c9b1c8ae26b293946a1d75913284d2033b5db9cb8b0030fd16b5dd32b249225586d69ff00afa16060be90aa0e150f87201f0c6da4c5062073555bf7c6b6a598e5c3a7c592307a49d392bf37434726acd398f678b2484cbb676e1707092ec92de6be4d9314542fdcd612d7a986c910adf9e76faf594b096e6def591fae59bb44778ee7b0d5b76d59c1638bd629e9037da3c9dc32e36bccdd90d7e57992113d8c84fd248510e27ff3ee8bdca49c907deaf4cc5a2cb741016a9b5a79fb8451ea2d6e5b1fb22ce5d532f8444a5bb435a31618517a0b6bdc9a70aafcb978a7857816b0873e77ff6a45c2db2020dd9b57ce506530f501dde018f3ebdf15bd5639f628f9d2e2225d31775411f8438957db280c78927957a97b71633c76e9d0d023872593a769b38f94b50c88cf7fe309a97f39d67f398d767b91158d2730d91b1bbfae08aae88cf0e5418555b486266409893b6019135c3b2654ad7b881dfc6b709b079c724bd6772e45a1988e39b5c8cc8d424a4c83732813d318a7787765bffbb68ae80d9a430d285c7f6515840936d68ae9522b671502be1512cf8eaf42387b51f4c66b1cbc63a0ba5aa3b5ee6d0227645d69f71916b86a264f9105bda08a954be92be042ae8e0faa60b8ec5ce0a77475ec519a48723a5c9f4dce59288199fe3cf0ab45,
+CIPHERTEXT2 = 50efaf44c4083cce177c1f50462ed5b01091b7f62e4be1c54f066e6833ca80eb30c739db892ca0a2b5ba89c2eda106b00ac80e6dc090e107a941271947e03d37df018786e0107be01af4cc74ec47f8acf55885cdfabe7fef2ec62e1e2798fc157575e723023bab2386e5e7bc7f46c9acf7cebeb18f85a15a815895b023a75d225c4aea5fc4cf72234b02753613a59fc1bfaf5b16f0db091c6ff3e736dc6793d680e4b4ebd0d099314e75c1c4aa20dafc5e9b21c55d77d3af1a3902cfe3f40f6fe9e283714bf56ab0375754c67e0f04e44a8ac54c1c718e6a2a5023b2dbb774a34f163062f9f35236eda8a8dcde5603db939bf763b1a9d5b6b0be39455740004e4ee3b25c3ecd581d39d4f0f6217edb5f926bcfa65aed97511d888e9168cefbfdfd73c1cfad5ac5906cc7fc26046c42c6675bcf8e1ba392d0c64776184007eb30240f864262af010a350c277d86f319f8b7252e808600295f7535eb822059f405e3e1b9e9844698eeb98f3db519354df1e42df7a41a7236a93124e8c11f6aa6a8846263a232d443e40994c44387da90978073cfea25640c7156ddb059d182778f32fd78692be267b6a14e9e25d33178de0a778444070ee73d87ee96b66a3716e8f09fcb3b4a1cb8593affaa2dac0b2f96b12b2b9b84f1cb0a3a74675f2965cff4d981b37c33566fffc93dfc06949a2dbda105a66e4eaa34883c4046203ddb1790,
+CIPHERTEXT = 2e29142b42f904037b45413833f638fc3c24e476d9b0c567a2e7a84a683e233d4c55c38d2cc0246197a1d4e4d895924bed73928ccf533ace4e9a4cd872eb884583bdae23df3db5b9931bd034c370119356be1877782144c8998026db6cc9153c81479ca33dbd0135c3b93b7800a07b2931d9f72ecf5c89865e02905c06eb68bf6f09a70d36a8ab81beeeb4c4c62035a34748546dc20785ba8bc5b0f62574bb4e4817784b58b2553d6679654fb2c31d162667a02eaa7d7f0a2fc9489006f7a2fe127c18f040de3c33f4c216092eb149c9ee76bfa521da3a26ac5e9a9c677dbc477f5f62b0e5ef3340ec2e48ea86ae8116497d40bd715f2ecf44ba588fc4c9c620f8b5fd62a44742a079137dbf12db185ac5bbe25173758bfef8a1fb25804cca298ea2c1164bc8ba982b5ad24276ab9f59f556ea8330a9f3c8fb10ee6494648c94231d267789590269a8cf99b842aa6805ad4c167920d4dd7604c2f7dec9ec3a038a5f1c37e4a3bc228e55106ab8b6e2117c39d4d663e84b57f119dad609f1aa484a7baa6fb9eb86323c293b06f76ed9790d9724ad6303d23747c394f3ca7dc89dee1ad02ec53d5d74f66fc0f9020e8d8f4cbc8bec3e95305577fe7f46c56934ac17090f063a25573c0d564c48641edb6d83f0b748124f0715b5f472a79738c51760a61b908fe072e23dc17ff461ac44dfe9814d53f9c0228fd871e49152be2e4c,
+RESULT = 0,
+
+TEST = 19,
+N = bbc074771df61751575293b34697cbfc1ae123bcef7c50fb49e5482a4e7265256c5e98d4ca443bda060cbb4a41020757e537ca837f7b4ce36c3ecc157215a3abd1c42cd14bc2f036791cf26bd380a55c05027ac28c9a54abeae3d8ef852f7ca5765bedcd0c60167034afd79214ab37bd4413028f3538f2b4b42eff038f7d5db870bb05d0e16dd0e700f87b47437ef39ed0f8378c4d12c0b6a05410884d2e73fefe8e1fe148e8e8ad41b3a05868039fea21cb091ecdfc3d2dbebc82123ff44de72e1c0b0f6add1c747875e62c8bcdba898bc288fc076224da80ee83b89a74c5015265c9a35021a09ad6102117b81c0ff8872a4c7abec3f36a54c3becd87553409,
+CIPHERTEXT1 = 2cd26047d0288814816b87d019cda54efe30e2748955551dd64039f027c6bd93f480007f0728538fc2f35ef68f69d25cfaef66d50b1655b843614b9fbc15eab9286fad5afa279ac691efa6461354c0711bde171973e39f47f1c50c545031fcbc3d10dcc496d20ca1e2e2478a2493ea869e02f1bc26ddd426429ffd8b8d8fa88edd76bbbf350c73b248e1a0ea329b205fcf6d451dea512536d4a7a6b556eceafdfd6c9a95561baef40b8e6f285994bfdfc081bc8f4787ca8ab574da6aa24c93519014c4800aa7fd3a4959141aee25a7d32a04de1666ab76807b9d86ea53c4b2d209ecfb90c67b46b2436ca6f53360069b43ac93248a03faae2e6faf88a38bdb366c1b1268174c483694f7a44fd3130401ac1083df639496f36f2edb27302bba60c925a03f6fd400586d2076042ce4bf4b6e02396019526a8e4ae3adc3f3a4e489e4d426c99b62b24be22c8d5d1231c0fb72bb790c1a7c9542d68eaaaa73989dd40b97f94c9638b7c2eaece19fe37c76103645bfac438d5fa198caf1efe34d5666d4242421eca15f02218dafc16abe5c57722ba2bc8bced157857ceb591dcca7a18aff38938a221ca4d49e0e0929261c457a2ecc5484b472e57585017b66e9114f8291bbd6c356142ec0c0cf714def19f8f38c5a932f7893f6a0efddad11a09a3298205597018a70ff88a2f89a25b34162259ceeccbb339834e28314d640d3950f,
+CIPHERTEXT2 = 7b594a26d419bd1d73653a7b47946af590dd552c3051c467e9e0f2b34922be3b511bddaf347a8ae6b2b2a3be9f5ce9b6ab02957d374d2223256631267b72ecac800c9b8ae1e562567e746bc3355a6171cb19dc60dabc7dbe4db3ab0b4257a0d5b0e332130fa4327575568ac18518574f4834e0d8c6eb5d339e3c0d92003e19cc907702a165987ada3e4d5aa8b8eb33059b7238130862d2f8cce994b6fc8c05994a7198b7ad8b1787f34f1fb0292ce003c86c7b8d20ec5f80a7470d22ad8ba35090f7b26d60652d9cfe694b1ef90f68a48c0eb5f7413adad1f0d74f536faa819d2fccc0c7c21aced7c6f3bf8bc5863d610b0bba298c075fde8d2f2159aee9459e396d8e637e2f71dfe28f85fc9de0d80d216ef6528491967d2865c8ce5897c9e56edf07aa9c6f884dbbd3799a748a1c7dcc3bddb5cfa20d197e87d8ca3aa3176e1ffc5fa1b4e2c68ce030850798cf74877476510fff03b6258065e183dff70c093edb5d906ab5701e45f2f752207518c24102f079aad062e58e042ee802d8fae34417f0fa2e47014577e04e7a17402e3ac3d6a4ceaf1fad45b7114a53f8198cfd790be39ba63058410809cafbf75211ee95b12df3c505b47e4714b46ae69fe1d0fe70a65a9c434b68a7c2e5d0fb99a8aaa0227c5a87375347bdc76fec09e567141c83737dba0928c7b3e1e579e21c30f6f847c1d06c9329ca27af357b68a3556e,
+CIPHERTEXT = 140bda2a2eba1fae43a5e190f91018b5b215f0355ebb54fba5f4a09b10f89cf4148331ef586bf422cc1fda54326ad1b4c325acccc77d12ad58a6336f657b3ead501d240482d8e136d36e5bc27686c376ad13e14872afef05f2b06c66af06570dc1c301cb102ef9d42cf948bd1d58fcf0021de522c7abece6b9ab43d2ce0df5730d59c0385b3c1ffbcfb8438bf5f52de9ac200bcaf5aa6fc4205d07f6cdae200fed7d63d4bbf8a740cec14b4f3a77f26aadb7747765496178de15c98885c160107ab58afdcf8dd2f4ef854e60c2c0168e902516e992220d5894da5661f25a1672e37339225b9548e60f5b3a0c8743eb44af92108d610abe684766ed4f1394b7c07205cdcbaf0786a7f5443b487d6fd63a881e853781825ea0d551671d888a91a6b46449afda598844a8edda9bb5b7fe3572aaab53f49767966226e0bd10ae1b2f95cae7c4e57d173bbb1c3acb97c667d9978c6c7a2fdfec321e34fcccfa98957b9ecd8225f1867959264b0191f5a219d6ecbf718f0fd36502173ca4395fbfca4e6be5f3bb40a2206e955acb6d7362a772ed64537e34454e2b2a679d5b55b8fba9bb0cd705172a9bdea7c8283d8717e302fd4014dc60febe388c912152bd9e201ca4b72ede1e631e2dc4e6d02e3026a8d59628dc8b772262502e741f47bc205df2568177b285fb55d1b80e2cf2ab8741677ca9e686a30a6ab02915b1d0692078a9,
+RESULT = 0,
+
+TEST = 20,
+N = a11248848527865dfd9f21836b128bc03016c6d4bd30969f329a2a4099adfc6969d8da91f38da522bb8141b1ab87bf7d540eb75938db7296999d2b8cbe8b814a275792b572590dffab9cf9833b2f753520fbeefffc6f226e8dcf8fb30d38fadddb94b14e537a28477fb1ebc0d733e0e240e1e4535725feb724cabd0d119e6811e18fc4e585a773440f4bb428888d30282fd408bb363c869406c221fb02f2f85756368c17b2109609dc174e263af6a3f10fecb163012cde1c594430ff4ef09dd46a2409ad4ffb742828395603d381f1b247597f9bdc4a72caa63998ca513478b70be10c61b2b8f0ea4368f23bf69b424f7cc23dfedb7a3d00f615a8b4e4f8fcb9,
+CIPHERTEXT1 = 477c2c6f30bf716119bb3de8d8da71dd90a1ca04c37d9ca86d599153d1a4a9452e92f1a666248c7a64b90a6d1a5c135b1a179cbd0de415acd43b0aa0556c44353aa8f41e1c736d6c8824330f55071962b7b59af21e59665cd302446670ac27ea469505bb8c4080075e329847e60d1cf04bb974f4b6fbe6ef9bc360e250a442644d4c88d7fb444c77b89648a80ba27bb56358b419d2d289214d3eba7f2eb2829d27399d5d627223ca517a1cb6e5c5bdc0348340065668a3b56a74502d38b3e5f615a18025c43e79db59eb2b2ad64bbbb2da9a528c6b36be51f41880fd6b198d74b0cd316a6b9bc188080ec7db5698535265ab175fd92b9df2b8c611bade7b11d78c359f1b87e8e7ca14f1dc8ff2936fa1eb496c47543bde7c7b965c374cf68c07f41d6adaa2cf009d3358f043034f9c2974f5bd15fc72928061284309aa3d9ab425d8027b44a9fc0f2c211b0a360d2ac49fcc72aae85908948ae71a7d1e5ff0cb4b3e527e7b8e45e0add5b5a43aeb9098c3563f6764c4830186dea398bf2d3d856911883825b572e457d931d8c2fe8c5f372d91ee637d6888281d90192b3f2cea90b3a5cf5a1f528c20e3385ccda71a7b90f1bb3cbd884d28858f65b336c2b7338b400e1f9d6d4370b4f02637da96dacb11f2ffc6b165b1065d8639c19da9240e07b03b389d7a20f119e15b7c099686ce2053bf89204d8872a88972c4413dca59,
+CIPHERTEXT2 = 300107bd4075162279ab4122feaee46f47b354047c12cb34485edb67c73f8f1aa5b7286c9b3f8b401d028e27151a0b9ec5115f6bf36d678606209e198d3c08608558fac1012729f5e4c1a665938d403e19bff473497386ab078caa5776e2a6cfc4d6b012a12b0363b9fdba10ba34f324c405d42014d74816e6482608b32f8b07c019d7c0cf6c733bf2ee2c3e9393f806265eb408d38ad9fb2fc6afa16e1caff4325dfc00ef6ae8d6c84d4b6c8fb6cd50bb0735858760fa8a684aeb237e0bc7b067b4b70e2b7dc61b11cb4134e869be2284c46f6a88abccd59f19b6afbdd567e4180b9db05986c71674b4823ff6b61200213a0a9f109be1689a15ecb8ae1503f89b4c20050da514683ddfbd39ea60e5faabcd01ca6d57c5f2d935e9fc0022079a03d947a2371d0786d6e7c44a20013970884d83f98450b7d819d83676402a61e614f2b8375b00549603c41f5004d20aa682a2d5ca97ab39f6186e27381b2920c3e41b94ca50ce81a5abd59b1d5e0cdb920d8a06da6153b9975be3e0e9f9e6698c04a49810816c0fd95bc347bb34d892f8145c1efbdc3839a664fa97484c6cc5b17a6ec4b42afb7971f20087a06f19c3958c6098448ee7f54abe3bb70b8a7a19a7db0e937fcdc1315a6c03fba4472fc3c23bc6a7b800138a172f9b6e4983302765a396ba23e4143c6247dbbf823c6d752ad4f92975ad2a03bb944304b6431edaa6,
+CIPHERTEXT = 5ef16c5f09f4942b5e15f0f9888819fd7b02d8779013999101edefc1f490b0efe2f67046735b50c6747455ec9e6c655a1c41b1f91e0238ebe7715c3ea94088d8cb17fa68f5e6f5618c5a058d23f0aec6d0aa078b71056c5bf35ddd0a986160ff474cb563c30dfcb84225c099f15fe7d215e99098c55b0a2e3a686f3f13c95412ec9a870ed61151ba11f9e28084c5e91fdac3afe510f0be43c84f1b31db33c3a3d686d11c69fd9a8465d0eb975a174dc9b3cbbfc868c0bca8a2db8b5426284ee684da9a3c046411781543c79acc1dc17192e002b74ded2ddf9e1d92dbb8883638dc0b31a88a9f6c1e5f78fb8a2ca191d07f232b364a52896f0d42e1280bc419adb1d770b809510add4061f493ae30ec464811bffe9217f1854dc23c2b60fb572ec057a1aeee543bdd6b44dcadd72928bd427ad60450f00349faab1ad43a090e05970d8d4bb874ef23d8bc240abff993a34b9285fb8fa18cdda3cc852b73eae97513f5a3210f4e21c81e305f04a1966ff8c989155f51e0de2d897cd2e982db5714d23ddfb0fc4f5b74fba62ab7f8166d9fad9b7cdec0b0e543706dac767a4a6429a62c44fee346d356a316710f79dcc75676643ad9a377ea98fb117eb53482395b2e2c1f8518d27d56f4c8f169d7cd4cc992515c8a5bbb9775dc5e7dc51301b10e8e74f6cea82329e0e802e790b6d96ca2f0a35596f6175da6f4afce2086b30322,
+RESULT = 0,
+
+TEST = 21,
+N = a8339ddbc4a409234c81a78a36f2fec05fe5071780621151a8eb34dd3fe10e561d8e58a43343688ec17579bda120e42b4eb66ee8062d109d4afb78e2f6043d8e9c4125c026164ffa38f1f3f8a47ad37db2c64d9d48804699ad6c9ab13f285e68515ed8344dbc8a73eb890c200c930d4015446442f24ba74fc7ca6f64197bd5e5ff55d2076617e2ee66798fb4d8fb96f07b2081eef3753f821b82c504490e472081c3a26dd54649f49f21f47094fca67329071f04820fb9f033803958f8a28af4bbf9f5ee26b827af251a5718c2eab844a396d3681e58d04148dcbb79166ea79bd4e91388d2324441e0c0cb9d3759230cb2dade042f52e87336c7f9daf751e0fd,
+CIPHERTEXT1 = 5b6e824806ad8ef95cb5a519b629594dfd2d6960e22b06cb8942b908842867dea825b851bc0e75144ff0281f091d9962825c31ce527a611665b9e7ef64f6823cf23b47d94fd262a9c1838fdb3c220c69dd877b6d5f732ac59f518fbcbeec8577f4f932709eb3c9ae76227c68483d781453ee9cfda60ba9b46ac455c742af7e401a6fe9e8ddbb0a16e62d219d7cfccd1dd29c70da48e8a0af86994574b64983446429ee553e86f6aa6bb7e3217e3a2221581dd148640d2eb6ef527c9bc35a32df13da31394f5b003ba30d7ebbc0c3fd3f36e4f3b21a04f5bee63aaf40b6e2e182b8fbbabad270357325c5c253837aee137410cab265fcc20d798cd8be6973feca8210d49c8f9fc0f233b5e31a8bca5de4b582af253eba322a43350ca287b8a34e190bd7c6fc5af6f295d857b3a044d82102b391740a7fd3ef1a890ecc4c33eebab87b1e8f042379e087460a1a6554d78d6a7aaeb1958fc49b6f659619aee56ced1774e2136c281982c61c80075109fe49671f0e120bad248a6858e616147c40c3655de38f60420d928affb3d7401470e61ba60012711c903d01377e3fe6f2b0d1f23b5c09044d3ac3eb9ab53b4dfddc9162f3451a123c2fd44b321debe91fdbe728e93d48708e16476fbfb4a02242112c888808a3a0ace02227187e240835566cb29f768b54ae02bca666f769058fa49c7f14f515596757d2ea4b47bfa47153fb,
+CIPHERTEXT2 = 064187257e3ca0295f08617255a9c7ba805615d5734464ce977e1d961c7c0fe606ad864b7084d68ee9cb586c8767cfebbc13d0c0119774203b233ac0db8fd5ae518e2a14c7b8a3652421ef636fbfa720060d75bb2447a295b31695ed5d0ee366788bf877f543957d8cbfc41f8bf5410a256ac8c6142297c3ac2c174dff07d445b917d718bcca3c08c06a6d7822dda1706d932a83feb6738d5eebb993cd521035227be4ced6c05f191cb7cd7ee56955e0686ee2a2606855862deb661c242be93668b1d5bb04d274c0eb0d20aafd692b77dd64d3c2f69bbb67104200fe3a6bba458474225532f0ce3c41a45652e5b49145181900e9d1c8330b1839edfeba5d3a952677be100e52beedb3fc50366810bd612b48312a22b9f7c4bc9011955211144e52263d0031c172a99d835207994485ca4565c0c0475eb6ec30d5b04ccbbdb20d38d94e986863da19dac13e18e7332cefcd61c3c8b8022c91e51ec27de36c561dd5d97ed0658b69a62d5a826e5f0104a5b8a0bc4799d2c7a1221d9350be23b1f89be0249c2b056d393cb3719205486e1572957ccac7e3037f4290e87472c0f86af8a11ac6e2b90dbb4c37d19b4b026bcfcbc445cbd5fb1804f235eb4bf3e85bb374a7e485f9d3658d8d4b8873ba2edaeb2cd147bb67af8416c8ecfe5a180a13f72d1e421a81ab6b3363a80a7cd3ff1f6aafd1b358fc6c0c1dbd9737862c750d52,
+CIPHERTEXT = 6b96ce013f734aab0e11c96dbd046db53e247d8ccaecd25e5d87b74d45fe7032869905f9d620f82e49a416fda62e8d611001b26529e59d72aab28417eed2215cb4c7b241184fedd27b587250af8b20aa48f0816f02783c3cd717c8e5b63209fbb0fee937d76d1f23f8417fbce491ff348fc29bb802dee5e9065d613ae16e9df3a0a6fad825008d5ec1f4053247d5d81eba5410dcede5051640dcd4ef78a7bef0a4867ea474364a8535366c1738450875c20b449f2d8013c3338acc1931d734018ca8feff2aeaa4c7bdf49dfa3b996a4d9ac46c1d3ae1ecec93342a6588665b17970023d03cd73fd986f39305c1512cff5a597caafa5d4719deff036d14a419ab6b342e754b0f864b370e408bbd60fb9a56971dd49904efb4bea26493a0f002bcaf496d4977705dd329ca9886cc4ecbb1b8a00cf73dca5d3db94e7baeb6b7d6abd2b3264d7f424b404fef30e4ed13cd5b1ad82c37492c3cb0c7f63a7b9a76b3fe3bf1a815b1072e6b58eabc3e176c11147ebad29e322672bd65aed68b5c66b035a0083abc76d7e16ca673609acf479970666dec1c6fe440d5de8bf2e32ae020e3e8a954f970c33c48333c6247b0d4b47f4e412dacb7cc594b844df48ce9f60d1f76308e9e5880f87d1ed723e7112d9084a05e4d9e5626fe607e9070eb786cf162a2e1576a73d625f3532498c29aad5186b25a34bad59c83bf92c5bc6ece8b50ff,
+RESULT = 0,
+
+TEST = 22,
+N = 9832db686aa1b9649a17fcbde159e652b83df6d44f38a053932c07f8c7d64258ab946915d04993a4da122e400f908f350c860b5779169d56e99e5764bf7b9dbaa7e17b132829c6cfeb3e10f1b902fcb27533fa8a9c8f374be70afdb8e2cd2ce3994541f749d42b3bc4d975c6c96c6f716d74bf5f0d01d4c60a1634446ec4a8681e544e5bbffd84d84e6cf19324276ef453cf3bc70771920d269e41ab24d50c491998baf9788cfc2e796e9cf658a5014b51d0f428d816e4c6a02d4212d3216ebf4afe66f27e422ecad8f052d29fe2d2ae787e83bf97d9c010c58ea975ad768c8312b90f3f5eacafdfbbf84e6350e2d3af8a0d0795357c25bd5345863fbbf8e007,
+CIPHERTEXT1 = 3566f7064cda2e50ee848431d1c82ef6f62ae70743af7301756d15764ea42b2eb59536f34fa65f2f4db0fabb29684c8ee7bf8c37d407c5d1d0610e5d145857cc9dd9331b5b2637cf1d32e70ff5b463d6244f1bbaff71e1bf274b5c8ca9bb604f4fcdc3ef80f11b646f32a9bf598f1c0e40285f8064475da164a5a10849239d84200b5698e1935463f6294e5e08ce0a796c8d304cc442b46ce9bf2b05eb8b21e1e0b9103374d88c3342af255622eabe97293d27cfa8dd378d83438caaa700e5813ba78267d6ff147c30f6999994f2f40c33944c20b84db1c94e39e8a99abaeb3173e9bf205e30ffd6847a36c38de25846bec05d65dfd283867ed2e2fc02f50052d08551558e01b9c7f93fa3c158ec04ecd94b76d1e44c797e5b1b9df98b48add8cec88f98d807afa74d76f91f2aedc699cd00fe403e3268d0083a0ff37de06fe4be21c76da48d8dc0ae77f615d64e065906fc6f21685e6517d621839c9038dd913b9324ca1176679c0994d0d62c1e303187de4211d129ee8145e58a5bd9c24b9ed99731625d3bbc60e3938794171a3c94600a1fca5afdcc2be45efd8d049b59787f0a6ff0230f128784585a10921e586e7e6d6b58c563e8bc85837be9546d0ccbfe768be673c6317ca7967b6a41b8bff8bd1ce623079f70ad45b9cb65271700f732967d0b8204459c681d5a4a291e2b0e3004c8c28dbdb112b88d22674ed84d04,
+CIPHERTEXT2 = 55a8973d231c1fabc70453279ec597645b130972048ecaa5261ee04adffc4e1bf064c53af6bcf7831ff1024d1c5ba0f46f15017e36bf6ea467bd4d4fa78554275784e901fc3e65b165b1bffc2cb2b23923ee4feb7c914f8116c5333370defecb08e449aeab7eb02a04693235349f34e794484f2c70eb2657e16e877bac4ce69593646d4e03ca53b08de08c9d6e974a83b575635fe655a25fcd438cf846338032573a44f705df58f86b13f5d4bfad7727f0a726ae9e0e5a8f09cf62960b9f6d8ca2a5cbc0d278ea7f91cd6666b9b08f92e7d031da21cbdd3d90dfb63d333e5dd3117f9a13dee1b705031f89979564f44ce588599b11486e603a22e39991a6a1d4d047cd42492f2dab54412eb8514447406af5c57d6e12f32676b97d058919cb9dbce3d597a05b6df3d7e979d95c386f711073e5a76a335d307cc65f327d47650802eb7d5b53637178b1308f518f3cf73296b279c408d81ec7bf3dbd6f26b5e6081fc8ab61c0b3bd8684d2779f541bfbeefa40f59c6dd6ff42eafd5fe3827a6eceb69ab5a11285a35fe83992a0a5952b34c6b62e941dbe6a9c4fb172c07e0efc64b9108ff7081572091f76bab7108bc49a9aebba912d9e0967e576f5edc00f9616b58279d024f075c4bb4e4e6a44374ab2e59bbd1f80645a0ad58add31b391b718b0d24688ef50b1154a226e9c9208323cd3b4a3905a5332e63552a38324a7dbb0,
+CIPHERTEXT = 1634b6b5edcd89349b5f03db3ab287b3ed7197ab5a2655d783f5bdc6cace3673c6c11ef755d85ea0248df7118bc05199ea5395a1a3216b150a447a12962cc8ea66ceda17f13ff51d9d2bba7ee1124d277a0fdaf74664725e95243f9d6f5a3f1a59b90c00015eeecb78fab78b3ae0aa68669fbed377a9725f2121d2633b37a6b2d88336a1b1148fba5babaed174999eae7dc2b51bbf70b092bf18627b31217eedd56310dad3fb89b68e49daf407ca7c22f26efe094eca601aa5bd35008cc47e487c4f2c04b7615e210177798aa31e15f2966b1085192f7bbd23b87e14265f3f2d517d36f7c0c8286eb7776d12f5046c877babea2d6bfa9e5e2ec17c24a751136552175ad2d7f7881f8cbadddfe66d860306c48ac6cd0512828571af9a826d2203319744202432ee2e7e6075de6857ad59dd366ea42d48a3b219be47031ae3b7f094386f6c2395916fa28f54f00b89b40a134ed889efe6e12f10f01638466ea5c72be7fea8922efdbdded644f5475ccbe4e411e73f3d3582d8d5f8cf583977473976fc92ea637c1a1902c75f050d3b312ae28a81a7b6987b296652f898b8bfa7aa10fac93e0e4e59963f45339f6060ae8f09e5d35b97e269cf134338b4eae9e5261c5cd44e5d86b2cc73495871ded73d50461f57eeeba27b0293e3618ca97c6904b507744bb2084e6faa2036181a53760d73f52288fd403b8a2e19bc3fc45592b2,
+RESULT = 0,
+
+TEST = 23,
+N = a6d653f168770cb17309d1e443423ba76548e8c6a4ce9acde44b0f156877bad4af901200ecb4695d45e4919347abcca89cafd8d44b654c0501206525f29dedc03549cad9c6de02cc1de4e27a64c00846cb3d1ba996de016c51fc3c84285bf3dfafe0ef1c5b0a3c8c4ad85c8f1069fcbd2263f04576cfd2baf06f5595f6802d172771cb26c6eaa1cd857c7c1eadafbd9f28371318971eb1b0a27b12f779da0bf21a45ff67dac1cce6627db33f57032b4a323e051090906cbb5a0dc0648a09cb60757251e4f0efabe933460e2528af1782364994c607b28ef5b7bc74719be35b54961b88c9d4a5c5ec20f1102cd0790cc1b8109fc6d9dbe2d7362fd74f5bada373,
+CIPHERTEXT1 = 171c6a369789142477b9ceb8a55da47439103b55f782a08331cc76f059740cebc3400d75b54a1d9bf14258b1b7aba31830399035d3a84fb10d767aa6d8f7c372061fae4c43550448ea79a09c34986b2b96614598c393a8864541fef98e57478ab88c77c7211db6b80c211b2f2dad1704170a87c7d26b0775c113a288cf5893153072d14efc364d176e0cee54267c7a61c9432f8d89b7369a8243a9a014833367e9f591815ef702b24ef0b6be1d1a82f505788f62311d37e97e0336eee61543649be60f0a6053fe5ff85c63fa603480e8ad5e8f4be3b41a36411d12872dca25d4c2b88ac41c4dad24a6a637e430626ff21a89cdf86d1a0db24cba27e94618e27b6ef20c65d6fbffb86bfc06c54bfd7047e64997f7f9895c5a550fde46aa884dd02ebbcac66354923ed8fda08b1b788717b92d7a57dc749ee9aafcb5c8c5ac7f5054efc35dabe30390225260f9d3691f5816a86ec7b26b66f7c96bf9a74c769f4d1a0047eef66ea5015981ee865d492f0a05611fdfbd871e1205e575f88d09b162ad7bed7745247b226eec002b53aa295104f533580e20705c6aafc5e926188c169c53d7026b24c50c5af7597ae6f07b11480393ef0422b0625a94af94384833f923de10eda1ff6e74273109a004cedcb5efb4d4b9343df1a6c4fe129a11919a50aa1999d4abed69486eba7fb71d7f71112bced42c52fe843cb476b9008d3bbab6,
+CIPHERTEXT2 = 46bd62af07ffd99df2aa65cfab9ad9ca40d7cdb9550f3022bf49405f608962a235d5de791ee578841397e1d7386ccec335f0e39851aad4cdd8e8f06c66e1b82202105c7f97f7a63a88582fb9e87793ea250e3f1fe599e777467fe36637e2e9e27ec0a396a4c3f219bc2a33cced17df74836ffe3f1cd825b60926930ab03fb2f524f06b03bc610843d51f79c604f34654d4e1bd6d4436a912e0b9fa6a6bd73d0cf2e12e5ce2c18d797a46818d36f4e19e168d7de383076059ae03cbd3d42d07b35dcaa06e5d0ee4918221a69cc41a021da87e8edc82085a8f600c43764d2a1e15d8a209c1cbdccc73eec3d1b33fb60a53de6eafe7847f4ee5dfa4bce570d095b634df36257478a893c7aeb7da07276d9ee339c227f5d2a42eecdb01f805cdc1ee20fa2cb544c5b529a6dd2890ca3bf974a56879cc338320d0ceb92383542a6c2b2e4e370709f073caa449dc75d5070edec589d58f95a4665ec8c1d55f845feee98601d618b4bd25195f2a33494568fbb171fb869fa7fa087d76fd0ae8a32d48a3076f95895bb84b150de0503918f12f875630eeb6934bea6a2b86237f5f1818d72006c520219d907223c0f83871816cc14d04cedd6d90a305fd184bfb0d75cf42c343bd68d106a40050a23624186d0f46fb1d11d5f310215b8264971b3069c0a1b920a0be520d95cc4333ca253aa2f756afb0e32b4bfdbb2e0815de92a16cfb15,
+CIPHERTEXT = 0aefd47c37a717323db59f79cba37fbd8132876d6f2e2baf1e4f72e262606a1d3d70c38cf5cc5961a7ecb93c8061c9a487742c9309215c1cc94cd2173ae1b4061f3bb4e325586af8b4bd9431470c41664365f4ec1cd3d42148cd5e895b221f2dd0415decc716dd4d789d524fae08e5ad39080cbb25639dd6c9e2c6090b874d01e07c389eb1355a998a0efa4ee99feba9accc2bd6cab61bc7829eceeaf1bc4ed5978a545e0bbf0b81c1a568a6bfad61a33f88e260e3c84c8d5061c1c13df5dd64bf03e12e9f9aad15be593e752c32cdd2c5b403f613de2e1b6f86991d70ca4f49e279cc2222599956d953a3f0fb9613f9d6600f5a7bb92fa2c7d4a34898f5b34fe92c0e0ab9f062b258170bf05c32ed1549285f568839fb0a783da6edf4afad9098b199c2de4b84a7d60e27a989774afc8715a8c9c84be670ab721744fae7d57e977fa175f20e0d973b57c0545b90ffc328f3be2c35600d502337789a933d00d78ebd783d58f022decf2fe04d90d5113c9e4603576b523e606525f3e3f1597803dd871485cd89275d3b8911f655473e591bc00c30b74155876f7982c1c9515b4a9c69d7385cb794f8bdf20d4c220ffa8e52cf8744bada5acffa99c0e6186ed91115984cbcf915ffa96c7d8f2daf4b65f074c77b1d09088e52fcfa3133f7275bc6fd4c33ac95d232ada85f5415e1ca56e713be83dffd159339857093e4292e597d,
+RESULT = 0,
+
+TEST = 24,
+N = cc41da801ed961d7409678774369316318ad4681a73758ff1d3d74e403f818d517205a7afb54a083d0ecc03d0686b998cfd364e10613e1203c29a793baa5ec4a7bbc7b0a716f43b71861a6780caa179ccdfaa0bcf62be645dbd68a36807c99de4df526545e5518d9c695d75a39c3495d3f346111c047e64270dbc9b65a5a62e3946844f4a95fe327a6bc8d287b4a6c391f6ee51480226467ca53f5789a2ad701c9e024f22ab7393729a9e501e9d57acdad701df79738bdb396582541a7e37388a67059ee02e3172afabdb907fc638835540f5523423253fb0f49a90c10dbcd176e250820a7317ea068d10cfee7beb1fee480d74dddb7293c75a52c9eb0aa0c69,
+CIPHERTEXT1 = 6180242382df0aa538c263f127701ea4e83409884ca4dd24e40340e0e6348ccbc83181ee428b5c29c5f0e78f705b7d8387bac21252d61ee81363b75babdd30a345a34990717c8aabdda875d81c246f8103548a053206b93157ed5b526a292cdc6b0aa8d7676202403eec0a547736d5b04e66d0a957dec5fc927457eefc2c3f4536bc204198cfa0a33bbdcbe0aaf9def2669d5756f67d83620287867672c65c9da314f451f084987a63acd2a79c67a32a7e0b2ade46e920b8bf8e3f6896cf30c9292da69b1b05137764e662d6442cb634d2f9fc1d5b7beb815d6c81cef045a21618b3b37a26232694e37725e5504e455bdc9ee928bbf786efc9178ac5e2ed7b029a83a0bb2975f2c76aadd3526fecf7a14db49741aa40bd976151696f805c89c67d23243cdbdad78f4b62ce9e6a7ccd2b7ad23abcb4b1057b332b1eacd3052d505a97f76a28a74a3ff7ddf3fd8a6d3451b853cb71cabcaa4566e2b3bb5cc63b0f7991516a44f873e2e98aa7fa875a746a819fcd38b2d0f292d8199c8043561ed8a6cc507b563cbe7dae2c15c648397776a8120ed1b555929601326e1c2b3d0c791b05f1e466680e65396265c4ecbcdf72bcd4c575a9abc67665019c5a2e60c933166649da1fe46226580f88a49633d7147fa13bf5214a2b633697f577e759aa522a6d0cbe4dedd48a68ae3d1a39e8ff74aae63604010ea4ce5bc0268202159b5b,
+CIPHERTEXT2 = 5de4e657abd9ed3b34f3376231bd52957dc5ae81fce653b0f5147bb2eccd5596fd97058d01d0adc620106943150075f2ab87ef1fdb416805a39d1609b3cd5f0fbd6a8f5510ab0fb33d6bacde6211f61fc0e57afd5d7b028191d7ab0fd0dfe7234cce4ece3cedf3b01d9ed5037ffc1da0b5c121963173f31465f3fafcccb9e456c1f7443a30aa7832948c83cf1bab34f5c6833185ddae16dc19b0707043d7997b27a3e40a304fad28198101c9bc86bd437156ca2e05dc8fb0119e2493a38b626e07299cfa25bc042b70d5865677742736911de1e4114cf7e02cf9c7cb7da4c9c7e0885878420dd9cefafa0f2c3d576cabf3475f855e611bf4022e51daaa0d45b5d5d8b8a2657fdfc7b523755552a840bd206db46bbd56420b578558153b5b4af58b61bb7256681a568ec86706a4917a72272232d94bd16139391f5771d7cb2c0f009c11129c95879a6cff023d186fe3ab3412b8953455cfa4bcb2586d6ad8cf14f847ecabc52fba1bface82f283fa95723fc6d87003e926e8b637c22c5f051abc065c8046ad2a9fe26becfe2efa2c25a2e49d2d7b0191468a264395b16b7c00f1ee9fbfd40d04d383b64aa8e0ca3ae45fd46f9b75c6601056b869fbfbc7fce816b4e880260b4013c955d6664387e8f96f0c4ea7db72f6880317a811525611d4bea2e9d03dcb22124895b894f85183bbb377980024944299ff7ab755cec7dea2f3,
+CIPHERTEXT = 6eec9b148ef5388a4545de944054bc161ee19a6f5b0ba7d0924a389c8edc1cf6490f86c31741b8e127375417b0fc015698eba20058f009c1523a9f8f65b20339a6471136f345ccd5858ae29933b766a838f75b2ce58f2c38fd25fd61963dbc4f07267ff9427bec4a309862d62abb0928edc190f6e3d2741dc6513b7c93bbcc1280e6d354e2bc1911e92cf9427008e2cd02099233242e9d35061c03bb4462115e1268c1527db7f411c14e7d1f84c92c122424e09b832a6ead33ab11945df7eb5922d3fdc32163953a5ed634403933db6edec9f7d6d1a01842b3b1625001cb52dcb50957ceeb76ed27b5165d99b61efdd11d3f4b4c9ab4c567f43eda6dd618d5a8242eee596adece29e6e6999efc7a3e80b9850e2cc3044f88a65e3a3b8dcb3bb9adc868f0078206edbf56c947289da58181f1923af6a1c279aaf0db0d558f59406c3376425853b8dd352605413047bc884eba00d5e82a29a325e8d5d958fe85b75442daf3cd020a80dcfb86d8a10b157fcc14ffdcac9b983d6d7a8462d743c767029093ec9a1037c5ac64b0b01ce6824e80dc3693edb7a211a71c9adec141e3dc76739e0a5e08a840054aef0a37ef6f67748a6da11ff03900600417395caa84387d1308e6954edc8870c09ab18ff851357925c22fb99f5dffba1d968419cc6be8a3855a4f1e4cb1786ff6c039bd6017487ed32905b66b10c5ea1bbd87a2068054,
+RESULT = 0,
+
+TEST = 25,
+N = bdf3b6479aea140e0087deb9592776dcc14f9b02678dd7b0b21b3d54f7163704c528edfa25658523330f4b13e4beab4049cad99b768a01cc8c289771a71efaeeef9439edc616fb02cb103123e3b373769505e736e93c55e9edefe6c405c19408eca28239f150ccc8315ba1e14cd85e62a67fa3a14d0f2114d6f8adaca8eece4b042aa2efc35562e9a0d7a500bfac31a6130f4ceaee154bc229112ba9a424b6d779214966e680ef470b078d9bd7ffcce4a9fd0f789412f423d6837d3019220745d16120605e9c35d7d092ca40950caf8464795c1149cd205902a663750cb00501e2a95f908a3baa72a4266ff354f29240ea2839a0e79be0ccdd134795c3f3d7c5,
+CIPHERTEXT1 = 854b74a237a344b398041ac1892d520ad123dc7d535d52c3024e0a2ca3f17e9ed8fa0792958ca83537edf4c93817206604227658a4e3cba80dea9f017b2fb6d76888a443d169c122ae427419ce93cb45ad2cb5bc8fccb27dbdfd8880048ac6a9969ea7515fb32141df72b4cf3eaf35ccc570afbf6989167914fb63a3854eed93260506c6ef1dd6d9072b86856be852ac704d76e12e7eb27ae0cf5f7e4308ae209b1ee609468d764796a953cd41e383a8b482a17097283af8c568bac2864e79f8a89a35f69a33dc3f583c6f483bafa5838c08d5e62a33f2a2df6882ef434a02972e9aed9b27aab182310eeb9d8842269c4a4bd2e3beaf9c49eae1d8f5b8a8b105097cd7a797d7cd717141366d316c5af6e01a6f352edac4d59e733c900fffb9748b46e3ebe456735602f97c278f53e851ec3880a0de99cf74abbe972b1c67cb136fee444a3b1dfb996679b15e32bcdd6490774d9852ae149ceb8c6d0af9357e7997e450180a5e9e7a5c220f0ad4c803ab6bc7ebdfdf429820a88952b19430dafc394d47ea835e7c6f2d5185ed2fac91037dfaf5d1cfa78a64dac848e68099745416b2ccbc77a81968975c58614968ad5ee12d9692bfd1754fc7723f9ffeb6b4b0233551df1ed48deaab8c2a30010d7f13cb05c13b8c6aa4c48f7093db61f498d1dc4c712f8050300712cfe06109af511252b6f001f1c4dfff110cf6f7855e361b,
+CIPHERTEXT2 = 441876c5b1ebb23da08a7b08133f18935c6bb85b9c9bbbe8a31759d445b0b775672c5a6fd0a25bd28f8aa09a2a7cd8e3830f3827e8e4d3e02661e02f575c2275d33eb786e958463becf48d902c534fbc19260b839f0e6b778787d866f9827c566b515334bbe529ba26b9a06894ce8227b8947ff2e95ff6836af0aecd5ffc6ad7173a3aaee5b82fbada494abd7c66eb6928bd5a8284829b3c5b8b84db6b597359e4cc72045de0264649cbf4f3f535cec9dd36f324391190e15cbeda99ea9485536f171a3e4853e78a1984abf6edb9c8bc367403aaa7e8ade801214a62db44f05397669317dba90c58d68c50ee1a3a3ff1f66bfd07d6f510eaa359a1fb0d2760b14bbedee0ba9a447ed143981198c7ac94569f111206211fb7bc654654b4bbc31f0debefe63ab47f30bd964594fca81d3b28bca32964925e77e47be812fb4e6cb6a6b52e704c7226599298e3fe0ac6207c10f184e81d2460f884274ee9a7efcf8dad9200a167cc13eea5189c1815bedaa6581b80d5fea340c911d0affc143a6f921c065d477f46f8e03ef306d7e0f891b009c328321db9d3485d2c4fc0e3db51d81159e9f3aec9e5db3ccd851c28a1f2c30756d1eed3cb46205e2744a36ae9d497eda2b965bdb726483dd39fddb1b4147bb525d4d7d2169805eadd602d49a1dcd337bbb53ac4f899c71c2f2b8d10f8ba260ba228e9d7353a50cbe72062012b1132,
+CIPHERTEXT = 47a279598c051d9bf781fed1d873c89e4ee7f3fcf6752e229a30ccb2148607cc082107fd3946c7d9494aeeb1ace9253c941bb0cba8863a3c7132b6b28bcc41763a1afa8df411ef66aeb80e942ff370c0cf6468ae0d01418483dd535ae464c0ab8738b9a7c29882a6df6f7ceb70e47fb6777f839715275f42a408b5495bdff55c84a2fb7826e4eb55e7eeff45403bde30d2ffd91e00099270606c2ce525bb3a4fa825b9b30040471c2d935e10b8d956c051852b8befdf08512e79fc4c16cdfeecf3e13eccb2f71ccf48f1f8d123b7b181760d3e1a1b3724f17ace426e5040b33429ce4539a0555c3b2f8bb3d2feedad239fd8a049cd5d21b995007e3a94e7501dbfc3a6bf4891f845858b4ea00720e93e276c73c26bae8fa7f1bf421e74508beda82150228d8023d9a62be9773cbc97a6c5bc50bf252928ade8da6802b6045d39b7d6d81e0949307132927f34616c5c47bfb285db3642b6b2602fc628257c780136fe605b1d0be1fe7510df99033ec014a30e6d94c83c3d7730ebdca08d63e38dafb8f819687b098511796a2ad4e69ae172c860eb6cc640f371aa36b429b27bda12d5fd4f0073e8f16598a80be3f215ec0553fed5ecb2720801b79d2dadda6fbccf0ddfb8ca876d19ebd5cb95c98215b951b5fad0835b8dc46ba418dd9aadce51a68b49ba76dc472c3ae3a277cedac6da7fb8634e8606fce80a7e90cd1267814a,
+RESULT = 0,
+
+TEST = 26,
+N = b985107e514493683f5543a83ed095756d83e62c7deec99b195f285287b3165ee045a368c77f5e7acc155a4fafa8598cdb631d0966b2eba783a9e817dee07f2f0e9a255c721f88b0876f4e5fb9f57be4254b354ec0fd96bf4cb7fd00ed0af0671f42fa9a8b23878a3dc4f79214da812f13c89bdf0f04f034cdee04634da9200d79cac62be4215fda25b9869209f99794543bfd6a2d4743588048407a0d53aa3ca83ed3665ef4847b37dd2ff67aacf7ff376871615b6c44d7a4d5cd34ba2e1876950bae2afec99d9d2664baad3fc0505f88d5f3bd83a1fb837f9387902545c54b0ce30d26879d9541db07e05b37dc33435bcb2eb6bbffd8e3d710cd79483c25b1,
+CIPHERTEXT1 = 3da89a1ac457e60efe51697fd112af139e9665876b3d712beffaac539c58bc6e5f533501548da5c2dc2a7388aca7ed327966a47b5c8060bbb9b6968755076158b369fdab6866c05d5eadf1962745ff799ccff1191f370eda1cfb6197e672d489fb1cdb8ca970b94c22feea7962bbd8518aceb80e124421834214ce5d5c12c0ab7ee8c2f7c7fa441f10dab8b10a9577d801ef7526aafa1f2b167e4a049fcbb37aad562274373665f2f3440814354fc7bcb4798494d34d95b5430108740aca19ee95c05c8a3355f90183105304989793e6d4dda445322ccfeaf861b035ab977a835a508617bb662ea6d747dfb52b452f3366a83ad05fb27e5586fef825576136161214caf370614055116c82a66aa51460df150be28aea68b2e796de4c69563d6557982996baaa7e06bd0b1eb3c299322d2b0d1ae467f30e3516aaae6fecc939b005124cc8dc911b4afbd654e06e9a3def068eb6a70e2c192f4ba2f698f11193fb35827fbc74edd53e7ef1e5b749995176aaa8fcaee8d5645178cad4d4a9bfdd8666fd686fed78c333d59542c878a8ffab1f28d1a2219353d071975a18dac697d5a93440bfc31767b6de8488e77cdfc61e29c391f502f46d816d8d36bd4c3be28fc0335ad822fbc2a45f2e89a8363138b09ac9dad895f3d3a2099780b52dfab06618552eea0dcf9a547ce23c99124b33f403570523de99594f61bdd2c041bc1853,
+CIPHERTEXT2 = 42ac9a0c079832a42cbfb678e0e3b4f33e0859a34aaec2c449fa92b7929ad2fc09ad88df67d41ec82a655a095e09684a915bcc1ea9254ce046bf1cb770b7e48d202164d466f68f0e9d59b5772f1c3d68b9fc6e10444583ed177d6a597fc979aa68ac0705c41777546a5adceaac966359138b5e226eaa7fcebc45657b2cb2eeb86809aba8b63c140a15af3d4b164abf7da7659d4936aeeca5d31a751af2469c204f8137e3d70a3cf52f28a7b80dd5656a5833a21044cc02f1bd6abe1e7adc8fd5aa0b3e4e598ba73e174513d31e42ea1b2ec0a83f1b3b0d5d950918108d72e74c93d6ae4bff3588b58de7665857cf6a5bb48309ccfda4cc87e407d6a989b80d3dae330b3674b6687cc2ceb6597dce625f15a46a22647fe2aa611e787d8a69622ae1870fb638c203c9553e566fbb675038e672fc0916c6d33a2c2740b73719156b95276adbb81ff91bb2ed1333be3ab3fd6c7c9b138e3701e4106e1d6fb46202a33072c05c425ea2d4d42a2457b6dad6bd61817e90555967dfb23ad9ca28a35a655ba7ba3f89ef1083b4fbae7fa8433b2d70f9c273e24e316a9860da2d1d4ae13999d0d4a5c368af101f88b917870905d17a3583a2f2c74280b5e23e67d7244138bc6f0cd236a4986c18badff55012620b4625be5acdb649eecef5bf2e94a0ebb7b167a1af1d2d0d2edc225a7cd50f7831660346f6127cb1275a30276f4f64b247,
+CIPHERTEXT = 04ac97937a243b1a8e30482d6ce12c67e0632859c7cc95daf6146eaaa385c44fcf423d48f5f0d9d9bdc6edd923e370b23efc17b7c7ffafe4db11547d5d62bb629e333ac8363c436639901047f255411c8f0401526b4bc4b23109c577bcd2464f0a476a87c1e4f207cf4474ebb9916591d9b5a3784ac40a21f7b88e38c4e05b6bdbcaf055d576388927c88cad49d90344c423ed108335c725b82805da116c1d9adbde8a176b8c9ad3c5ef028880d0bbf4fd520d6f508099bce60b631580ecf715a3d0e3a972d2568c68349e32a53481ed72f4cd98a1824e163ac0f4da813b4d6e8fb261f7be9e95b6d53a853e0a5f45b7eddd499be0eb28d01fba9670b50520aff50a9d9c68af11efd22c9845353379616033e99aeb3cef48583c27f1e08f43dcc0ed9ef3779e538b010e30af2e473ddc8903f1f0630ce5daa69910eae26689a0876e46e88a74442ecd8586ece89c3885b8b2d33760ac058270846b5ed7f5c8fd9913eea94bf4b1c4ef504c988e333d5162f51ee8d149d29c10672ff457fcea888f07b32d85aa95feeeb07d335ab403e47f329b0697c30c3525327644b28907116b974bf03a456632553ca64c2a4bfceaeac3cf9959f65b1be09546c3f572270c65dc953ea8c8c4132afa1c8ce303d4082aca44054a3ccd175667f704ac493dfe0f850bad6f422e97558fe48785c0425cc5758a1ebf1b2f4c1749b8afbc581dda,
+RESULT = 0,
+
+TEST = 27,
+N = bb7a6cf9b37fcf6bd300b8cada537a8acb584f594cd5d1267be91825b0b8ffdf45dc24ad773e21ae6266e65c045aca10c67879bcf0432cbeafa3561ccbdf2084a80f8816415debf9f57eff586dffb6ee9bb2982ce5b6d3f88186a5fdceff3ba7deba2faad42d793e4ee263b23a51e2ef57f413249482bebb079282f402b70876c5931599a2753031107efb6b7ac516316d866c6d3a5af23718482a3867d2b60d5b0649d7e8a414637e8fc400497b530322610578f22434e78ab6c57a5c967d36eac92ef03e94e0b86e6aa8172ab49fce0bc97bf62a0fabbce2c64ced109646af5b716fa9fd6813e015f73ccd6cbfc6ac9255465281ab422c1c8b7af731e4d221,
+CIPHERTEXT1 = 47f3d25c22acabcab9ce2f973d4d0bc75b0a04542dd5d85c5e6569257c7a7f8d9af88d26b5de04cdc6d078842a5d34d41bd935bb48ac677db444702f158c1108a2c17c672fdbb0e40b24615664094ef04f3aa62b4d955194ba89be1ead548899f939ef759cce4a8cd71d58228e606431981922b90cc2ea8a2952277808d0bb1d9b0c5b2585ed938b8f35bc5f12ce8db51b53c991ffb1ce28f19f0fb75fb95af63c8bbcae3c0ebfc1db4241a8ad50b710c2d27197044b4d733eb486762f4a148158c468af7990633bf79a5cb928c2529532bb58951533ecd546a6b0f267c674ffbc3abea278df8ad8b92f40f8377ae4e7ca98ffdbafc3da51ed1528844e03504d7be9fab8a9cabccbf925a12d0dac1d68f421a25ccb8cc61b8e6220c1b16731b659eeb2f57ceafa9718190005d85aff6cca8d2b3d1538feba21929b2bf7ce9e3e1a7d0929da47198280093f4766964ae41a500d8898c3c0bcb4ebb38197960d54f67184d07b0a83f9d89c87b7680b08d9921dc6729743362292c0d5bafa0755bc5f59001957255f95a5b615658228c3597dab693723ccdb9fecdf6d465ea5faba66410cc1987d94a8257119880a9062c9f7e4feacde47fa2ebeb2ff63a7b5573b4f54c8bef421ba14511be95e1f89b7610a1f7584981f1d795e9a3bc8eb1d013291d31629864be5858ba157660dca51a1230fadcc6874c876d6cefebeab9c6517,
+CIPHERTEXT2 = 2a7220a95bc90e7f4ecb1f561578c388b5e41c69b2a0ec87fdcc0a6ebfd940bd2ba99d78d94a2b1ab31069c4ff7637a8514ec52268f3bd32cbf5f2fdfa848d7ed5a6ee72c557bda67fba6f06c954cb9d05e8479179423447e673c9adca56ee65371ffcf5344074bf8f44ee73fd7084405927400a71c340d53297f320e65601e8e84fe85e99f2bc5a4424b145458051416dba78d7d089f9b02d78d1b73dfc232f61f38415bf5e3d63dfc393095a71587317281b532b4777cd924685450900c31ba7838e9d044c41e85cab3303fcef8e2b0b81e2b4f93e97dbb4abb0022a75ec4bd857a01ca492e0f7d53636348905ac5bad790f97edd521ac76283db8825381ccc88762af6c3ac204feb80e58e86dc90c7098f3075e3e37e435d8650cc90f1bb1bccb317c9c85b222570cef2a96f7147d82d248dfdc4266a7d77cbe53407ecad8dbf40b8df4ea20f33f01e07c19435d7c3f4e6024b46f1fd77611d9bbc372cf9f32a93d1340792a0589668f6b3973d325437cd4b1d2621d18ae096e4887c94465ad16d21e038c2cf452cc28a1f6148a75b7488927bea02d438f7f74955c05abd8671d72bc6ecdf9d0fc861b06b3ab5df0c7ecba910ec52ba42101eea082fee2582334c0adf613d0c81b46c76570f0161004e8adf2e9f145de0e07e9edf71b1827d7046fb409ce34bca2f3ae4d5f30ecdf4c19facc876eca746282712ee0d6c743,
+CIPHERTEXT = 8613a522222228fb8a9a617bfb1bd524a927f848f7873e9156afebb21bcaac70d217248008dc27b5f80c622ec1e4fbc0bc595faf64214f5ebde86a1b69ceb9c077f0492e9d1f8a5a92297b96fae8d3c5e15726e1e363f236a03a5a315edf3816683837a9f89af7238ceb8ec5b8c1b9e346f6a4c9fcf736e0f0e7649eddf4afb0196615ad75436795d2e1c1f0111fc84e8fac37d5835e164dc0820a48cba7cc1a55111d7b92d922eb0f5fa4d2bbae4ad898168b8305131d8d38f7dbfeb87724f75cf0dbccdfac334ad5a79e7a764d6d3848d79362afaa056ec3fe1138c6e35c7ac1fb904adbafed3b512e84a09799521b8ac4ce5ac7a83d534ca34ec737ade0caf8fd72bdd10ce4b0a73e34b7805d41cf5768e0bb4ff0ec7fcbf4bdad296c4db95fad6485aee1794e7c12750c491501968ea21080ca90afcb63e2b02071f14fbd9d13ad224f219d64bd92f81423878486db20f9a516de2766543f77455d76436e2b9aa0fa96cfdee3a53cbb360a5fa72f290300e3844a070ffb9b1db69c0b2a5a15aeda81cd033ff181b8216fe181ad4584eac575f6f3524dfbaecdc8fcc13247beb56f980049a92265e81fd4eea7ea6528cfa02af5d1890f704beaa6ef2203d0602e3d0cdf65a31b3785bf7cf7261ea781c8ba0a92b25685eb4e5e50dfe23f6fb4522013acef235eb85a22d7cd2e9c97ba0c933d0cd47ef7cd2e97d3e9b2436b,
+RESULT = 0,
+
+TEST = 28,
+N = b51b1c402daed2fe1d431bc926d937200c01ce64f4f36ac30e36bddac19a34577d6ad28843dd4d14cad934e60377372218279af7f3e1777baaaa20acab9378f63aac8dd88accbfde0b6f81fad61b5c415de266d51545e9a619006aa74b69657a3745405019562f9ad5d0b93cf0ea1066f7ab1e4c45d1a96319aaf7852cbd3cd12ca3614e2220639a0c0ad7114f079173405c288b1e6dbd9d7b01b604f52deb6c7098fc7216e54d16c6695f7a3b4489cb6e1a685226bd35b4a3f917822476ffa5ff94f88d654dbc1715fdd8eb90a28f2f988932447e4dab23610d8876b8d04ff431dd26c223b0dd9982e3513a43bd72da47d3ee42417f5c711ab2f8fb43b410a5,
+CIPHERTEXT1 = 733624a3c45122cd513aa5223e8bafbee5e6d94c78a43c877b59ffd8ac704526e7791c4b243d4e3c36ecafc4ed95d05fff0ff973d6b0033eb821aa95b667fc04dff7c78efbe77f938c2241e56821c33188add40421b5c31b99f469d4d1358ac7067ed3eab830978a73f0403d868192f2d0a7eac7f7195f55461a3096ac6fb8b14fbfa9c75babf3c572026abcb2c16da34f8f33fab8f8ae7c0cca190d6f139051a9b754bbed5c672ba4e9e083ac8dc4686e4cc3d419ce8b0c60ebecf4ebb7c8348797451085d104fbcc8b92b2dd8f3dba1fda57ee5c3c392a851b4dd10a127cfeca642d36efa6d87ce90c1aaa542aa0dd00915583e23d6ec7417a95257c06528d73d94cc039256d916e5f085095198443ea07d38285e90598bb5a740edd7252acbaab1cbe5c45fb0133d470ae73ebde045d7b441c2a252d9ee28acd3f21eca80d96574ba08be264214ab81de3469389c1a0eb7b104ae39623326e0580e10f09eeafe14e22a68e23be2373f2506466bb0f5d7d713a3459116a383476c7fea303b2016519edc42f46489b43ce9eaca364b4bb2d7500fdc11a5ead01b64226336e6bc859fa45b4678bad80cceca38c690767cd51950c7fe4be6757cfb660ada900e899078db103a02290169c162f83e1e3ad2d4cdf91ec2676c8035f6e59da64dceca8fa64849f5a9bd2ebc560a179ab14e1150c8dcc63f04ccd950fcfa3992ee00f,
+CIPHERTEXT2 = 31657f92a7127d091273bb6fd5d4af62b3160178dac1b2cf7d3fe494eb7eb6cca942d409f2bb41de05ddaebd74f4afadfc83422485ed579a49decf30354cb1bdf672fe4fad9542da48ac34f6f9ada97c87f88f76969fcd3811f2c7cb5ac229a17556cbd902c56d60f5904a235c16f813b378772cdeb0b1da71937b4c8af5c0b1a7cb2bc2e6b44c29b479cbd178897c281964ffc3fc7164f305c31665bfc8d2aea31af91fe13e23ef4ac299770a12e9433ed6321132f85b9cba8105dbdfad72fcddf0f32ce617e6ece5077a0081d73ef2936c6c824a2ca9a5dcbc01119b682cb995671673d12daf87fa72dc6bf0abd4b5a7f7cc784a9c2ab5e5345f6386cbcf9607d1b6258c74c16526b6ad9f88d4ddd7751e8d8a1eb694f6238de40178325b591255b447d2fe2c87eb3ca290d2c19047a747ddd2840e2117cdd1a31a5e780a427523ca4123f35b7bd14cb39e0dd059f5c02bf53765f19b130eda7edc71ed71565797e37ad8dee826ab64b31df0490863cc6a72e9cb56962a8f676c530d68a13c55cde3ca11a48417249cda6cf082392e6b24fa8941b04d7dbe0dec5e71bab2b345ca3e2e86c9e7b3916cf4c4af617b7159c99064d0ff52b785f60bbbbe36fda002a0d2e84b694fb0b4b5160817167859a4819060f122614fd9f48e5369d0b1fcf467c3ee07eadac8fcbf3ecdb63a17c2e6370d89f6ad559ba95be76d2790bd92,
+CIPHERTEXT = 07a9ab05bab0b213b2cdd3c142374e5fa4a016961dc6d21c34836f54fff2d5ea7d95d5077c0fab36559ada12ab5238e58a4be064448e87c7342f4b225f55ce0ddf4da7b017f14f4a7863be4dc9c25f4ad96879fea2168ffccaadec33beef383e94364bbebbf34f4ac63a0efac4457edd1d2e54a030497ade4fc4d5952b0ccb46c3797eec140655220909a44821d4a0401faed4499d7af4a57c45f1c30b2cb8be847ca864f0fca2e8c5b9a6b26001ba6cd53ecface037e97dfe1be66281bbff562e1c5f159d814450c4c49e2bc2b4b787140eee8872d911a8dc53419ccadc94862cdb34bc40913cfd9fdf87f840492128e4b39163aaea166c52cfdb9793131329041d2833dd9de517df6462b7a3f905d1d45e8aa5a9f551440e1c48ae8111d345939e818be70b460df40c284d9cde01493f28a7c43c31886e01b780d287145397a61e143d37edd098e00ded0f9cc52a8213da99c7198c8ec47594fd9e4846693b7a40ae0bf7b8749ceffa184f8c1661fecc90bd5b3b86096373f568f30c8e663e1d914dde4e384f0be622e0cce3e15f2f41cb37baa9b65fd9edc6e8d509a85b36f5b65597fc63e840c5ab15f32160bc1d65f51a1a27fe89ce59714725b9ea49f8c9b446b1a68928d856f81fa3794d686d1fbe6cc4a738c4102d4ae8ba69a37bdc1aef45a533534d64ea935537a1f37f818c3b691cde045589b83e3b4d1994fb6e,
+RESULT = 0,
+
+TEST = 29,
+N = 983961f2a2c0274a524cd1ad3dd2f093e3b441654594b1058aae84a2f48653e71f1b35d5d29a43a6bd2baf933d21f46391ec3876a2ce39e19584601a0bf6d7f2c92decdb341734e09c7336743ff3ae5a1512b6ca3e1a0c3d451b91dd18f0445a35674385dcb9b552f08f5a5b09d147ea197aae2432f5b04266164e829d046c578d45ac14794277681a3a953f6b95fa063c307b447afba52db0cd6bc80cbde5ef58d81858da30201f830848d2b6e2a5606af35d50bbf4e38cd4eaf897df17aa5f0e94886746a70c5b073fc915a62b5ee22873ed28ef1c02d8b6a5e8b30681fea1bde862cb5f4ad6daf461ca73ec36a013b5c112661910dd195c2c8929d53932c7,
+CIPHERTEXT1 = 49431b10deaf8a17a14c3378b57bffd24df305705867e25a65b5a481b1ab6ac910c0c3c40319dc120b995a2519657a2c30ecaf9f138dddcb59ad2f7b6a18eb48d19b67caac277c261c6fa6e9939f4db62d3d09a3078c64877b6e79d3d52158f5da2e40ee426cc5fe390bca0a8f03350ba357b9b551239ae875f3a22d7f8d598eed8b2729f7879ab158f5f14f6f081fd1706b82b743d52f3cc9a2b4569d7c7ffce8edc3b5d604208bb858a179b689876482cc89c53cacfe026e75b7df21e0461e1ddd635eb20c264acc1ee087293835c87ab1e0fe6eae1e7378fc2f789f5b2f565cc67794cc2d6f7b3f8af9dc332a24cd5dea15365ebe5304652d1b4c4400ae7dc9f9d7040f66c0179b6ec9982ec7a972bc265e9aeba4f9e81274b037b0677d27168c1866f89c10ca45380e394aa9e5ae051f6c61edf2545765f3315e04e3a79fcec4046d2643a588e61947996d3aa4b5f3f1fa0efb78d8ff85f5af44f36ce7bd3301c2a49bd628ddbb54f41d3231971ce1a9dadc7b3db7c49baa289a91fb078018fbee1c701d1cd8a2a352737b91cc158b0534a3630717c20ad13f8eaa581473ca3fe51cb24d64067addfeb165c96283c5c37048cf232ab7383b8be675455bbf941dbd72e580d1da1e17f9bbd2932fabfd693e88c56ed08f19b1a72eb65e0ed5e5be86bb85ad9c240898d130bf8079462ee89d47ee4c57899b397c093b6717fc,
+CIPHERTEXT2 = 37d3b358fb01c1f1a71325a90a86d619619c87c0d8f9f8de527de2bcede9c7e236ecb1d9518b2b61733b7c95a59b264f30049fd2d4f10daa012d98637c09578ffb658f20946e53bd14611f909f89b6322ce6421bcdd035d0df5c2dee0dc5e6856a4aae361e863b18377fffa015722140d4922a2aae90b40b152a60550f7083f6bc5fc4a81dbb2e2490fa3a567dc5d88fe92265ea49fcc8782cf716feaaf00d8160440bb5de7ab77b183d87e8b4a4c1f894fa7ecf63358f1f4fde5c5294e10978f92e3d4eac9146d4ad69dce1cad4da42463bddecd79d007a591feb2dd9d3b1349019845ed2f03d99a4e3468f728b6fe2bcd649b32d6ec694f399c8fb74ff31a02d9961d9308537ec360acc49d038aa1d97a7254647e102a521ebd0ad11d369f78f946cc476fcdc7cc0af539375c78e72c538ac62e9491783e480751c63616a3fa79fa53ff9db2003cc40e25f560ca6948b2226dacfc37ccdfd46d5a5017adbd3026449e7a6c1b3b575edb0cbd47bf7d97a076fccf4308a3fad4714c553a4cabc51b856d879b4c613930481d0a3120f2b81f7bb20b54b4149c9d0f85a9afd02cfb19f135e5831c022187d13168eea81b735133da58bcd97cb70ed2659e2ad25ab386b3f0e4b9e56f9366443723fcbb35d3e4e26c035af62ac3601044f281160c0c1689fdc31844a00af2acee41be1edae3f2891304d94cb0870f663d379768464,
+CIPHERTEXT = 510342cbeb508b4b1d82d2c2d556710002e5e6cff4205ef6257fa8c73d878911e6e4e904ab3b2e3abb280fad6bffd3452820b13486f9eb3b8d6e17adc1d2ce00e982b72882d61f111fd4bf87b965d498b597c17ea9b63a8f968b977f7722916f0f55e9b66ecb5164819dc27d4cb0828b2715ffec449991c1289739d81ba581b161d611918ebb822dd179bc872e9617cd3dc01e476093c169618a9787ab03f8d28b34a32f841a3c0a05b481f7a93ad6d442c998f567ad0f99cd7fad57b3c5af6a5c67a0615fee0d112c23ef755ce6728edc41bf1cc8b90eac6f89bc50a360cec08016341fb90e8001e860c88eb5508c93a8b3da313dd2a329f5c07ec13afc646a1268c5effd12c4195ae3e3f8d6f9e235694575f6f3c953cdbeb1904979ce525cff77d62cd224d870736d12d92bf78a107411b1b829870331b6aa52ba5b0e164f0a67f13ce8601cd1c2bd98ceb1d4c96679573281385e74def08f2de8e61ce8189231f122cd6cfd2a329da22b735f209823de7af942dc3ae5a8fa378aeab85c8d05469537dcf8db34ac9d9efcfe292d4328510297cc399f27046d0e153cdcec94a69e2b409b69f1f3ca4c2da8281488c218fc07153fd9d72a4e3d7c6d0b415b1b710e146fa65fb4f416441475d8a040bfd93d1a1418176e279bc1e67e16a94f63483fdfca91a0eb452cbf4adbd8bf109b7808bac282975d9c1d42215d48aeecde,
+RESULT = 0,
+
+TEST = 30,
+N = 93cdda68b48e4365972b311b3fcf07fceb86a3eec38c11fcd8d334264045ba25b1a1adee2024312b9092c165e6fd7d3e268ddcd104fa8cf936afd9513c05fc98030f3439e55698511d95b6a32b3d6106da84b3d5657a4e8254f6f8f9a1d3f0856c72db289d27acd702534dd60ac8443b2f6889dd802ee098f33ea6efd68d14968d07db719ef40dd270d2eabb0f0f14742accf0dd5aae783c518591075032edbbbaf9604fb4a0ec83a4b1d5e69c8e9318217e2ebbb0a6ebb12f094efe6f995962573f8e8b7ea47563ec338397ad65cc68827acb7b2a205b22d5284bf8d4896f5796c93ad306f010004ba75f1488804fdb31603e01896a5b60b811163c1c00f7df,
+CIPHERTEXT1 = 100a3c02c5921b3dad5a57351255f21a2c8dd2f25ad952624404324e4fc379cf3a68acdb95ba7421dbcb40e1041ed9e93179a4597c031b7dbb8bcee2adeb17257714a15053a4b7e8f9824dad74e89e57beb4dbb006250dd3e72679e9a72e7484a5bcb379975c82b58e136e97014feff13a6ca162271dde23dc085e077289c74ad6dd833dc5e3638e9b3f787fe4a636680db6b74da5079002b973b40cc57db3ecfca68c840fc88ecaa6d5d5c64a0e0841ebc096e07f3eed99723fb16ce8488c6c0c82980e7b253f16465a1ac3a6729b9a0f966af2155581585e9afb7f8b1e2785e06bff7de5c2589ca68851e84c3f8e8325fda537cfed399aa119f840dd6abeeda6dae1ab1f2bcbb64af177d28134c48b0d78c7b1e72c3dae19146dfec3ee0101774f9f80db2e31869c18eda94a185cad893c4906f7d942810047a6dbc627585a3598a2dee3a043637e0e20f98ff6cf6f8495c71b4fe92f9d11022373470ed691a40453fe04e218bed6bd6e91cc42e5331a425345637c5126b43091a02742aaaea3a24950d3afabc67d550ea3b0d7a661fbcc9be28ffb432d7809f23145d8278f2defdb0256305367b533d3361f334b5a572ad167dbcbf3be532cd0e81048600869f73170a5aeb96c94a5d2b8370bea72dbd54c7b359e6dad9a20af80274a618a49ee5577df3baf214943e33f41dfee7e1408ee734987ac0a4ba1f025d1d78e6e,
+CIPHERTEXT2 = 0d7f6d409fb228cd1d8faa8d807d7325d235b4c8774c8f47b7b734efb2a5082b7959188d8ce0a92a1362d53646c6abb7aa945718b0ba869c5a5fab7fb33ef22065ad1f53454ab2446365382cc6c9c32af4445554bec76542ad71762d67e4cbb263de1c43c0b51c57b81bdf52a506cb0535c170c1f9da8bd99f2e5795e24d8e340955384ce79990edf72b2c8599fcf8cdc270b37c5bd2d4a4b1232b2b9f87b7e37652e5590b7a8fde46d845e2322910b843a875c99f7c5a69f434b0d3ccc8f407f2dc5ff739de327e0d8978352d7082773586295674037327a32a0264b739834fdabb784f82f193909e6c2c12e035de7810f799de61dc90ece2ed17e36a2e66f1a0f2c3d3850377b8b7ce973cc266e258aa97b96a511f1ef03e0d272466f87ca8f2afebf9ccad5384fb9036433d5852c0ab9bfb1bfe792055984d4b1fa583a680755a5ed79dcbd8821be4f7616cf4a5e2ad44da95dbcc09fcaacd0bf943d0d97b3d9cc64314af412ded0cf24b08ebe38eebb1ae3a439ff0daa71e7d098119064703d80fdeadaf7617c8224c5c9fb27d4bd673de12a6cf56bd5042ad4c860eb6ed276289695cf2b9c2e4ba4d5ef69ed304b894d2b8120e6e16659d3a60a348f92baa988182b4b8efbc2614e8f6a01f719a9e6f4596d3f5aaca2af6d51ab622a95b374b0c0d22ed7b9d85aedc453b7706fd96b04f05311e4b889e50a4923caa3f4b,
+CIPHERTEXT = 167512149a7c1b5c66651df02d2c28b5f50103a7556fd301e9796e58ed3b0361a30c8266dcb40c75350edcec10ad75ac295dd0679db5439726eb0c4f9d50334bcdd8b60974f53255a7025b7dd9dd86b43aa79012b7a9091a03b283a9a12426641772280edf039eb905921147fc65cd644e00cc01620e36ca4da9c25168992a93a798706b79316e7dea85f63a05e5f20a731dba037e1154b621d583a072b4e1633d9baaee1b082c0240036480da1bac4906e1664aed8c505daaa26f03e5ad0876488ccd15f3e28ed55e30d8d1b2d7699afc97c060c5c4843a4ebdc07c722e26519875d41251cc8085824a7a2dc9bba9ff7403ee56c12318be596633159518ff1ba379deab1d70d0a63eb044f14d82d47bae522be062412105e6b755b919e9ee26eff1f9c7fed2d5a96fc5dd6f5bcdb3f0f22aa31bfba766c788313ee903447b076adf89008cb09dacd5bf2252b9454be693961e3b9fa96ff4d181399e5c6e8a00765b0a6b02a62e76b069f61da5e0d8f7e558622f910f9394af61e0b9a50b12557e98389ed6e5935260080e4f21564629bd716859acb632391e00ed39a0975f5ff88e1b8914c235dbb3a56bc080a12f4b7566122cb955cbc6820a6437fa61d222d3d6b62a87d86b663c2a90b0b9eaac15860bf966b334ebf5e16d0191891ba3c4c444e369ab2e15d12bff2c44c8696ab52577e70f1964a9ae29b847da5dd92294,
+RESULT = 0,
+
+TEST = 31,
+N = b8fcbe9c5a7a3e05675a647bf4d2c758de132921983b35f848ae57826483241ecd5bac61431d07f1c2adf8edba154291b80a574c2c7deeea2e6cfa6d357512df920c90dbb4c96a5743c43af52452b3916c4416058868b110fab4f6b01d570d6225f7769f5eafccd61bacce471ce77887a6c02fcfa57dc2c339e2143a954885739ee5ab5be2c1904f031faa326ac7200f5de5f3f8d02be60a573f8d533eab35c0a9b7acf2bd1c3140437c99a8435c6c4ceebbba59df9762ee0b884db0f41df9b5b084cfaf3a93cb663e6c4880320be551c80739ca1c7311b93b26d43d37c44b3375005c2c82e205d32a3f4d645c093df943bd8d66195822591ca585e7a3450967,
+CIPHERTEXT1 = 2498594ee719d7dd68565b591445eb7d381d7bcf1bc3fed486b01557473fbe699ba53a2f396b5b299a53a8e8f3cfb4a174dbec7d9ae5ff593c9bcd5af52243e6f2b3be8cda1da8e9584914188ee47cd65325bc52d2f97b3dd198a484debfa927cf06116556d4b4cb25a3b243791bc15bb28ac1d9b1bfac51b641a23c2dcc374d269cc0dd9a5d2bdad9e31563ed6b182240b8e28a1ef3766effb9b69ca20cf438d94a97f56b2c90f5747b62055788d38f7f4c2bb0156a9861d1cb4367438cfcc1b4d993d82e7e8dff0ecff348ec48bb54254f6b14170ceb87344bbe953488eae7876554a791a1ed49755681853664213e2f95590d3d3986bfd7274da028a85ebbf28a05dfab5fbf31c3d1b42c3e4770ac0c5c052bae59d0bd3110d912cb30e14bc5c9b03a62602e1a312245b8a37e5b5baf8ce13b3446972517107bb71ef4521436254578d4103f4db10e56e2552b4ab8077d49fef887da0b46a47904ac30b7cd8c49fcbc36da5ae14bd9db5df0948a0e9ece69f4c1d4c9afa936b21c4286877cbdb0c40a12499bfb8455d892efed80a6bcf54b1faa939ae0107fd13d8f1fbac24ac4e30547a16f86f88dc00a161f5cac884198c0d879a20178cbbfb498950ef3e36240a45e0b0e117b2026c39e160cf20fe129d71278b5c14c18297b6895612b7d0ac2fd3dd8b3a47e2ad94dbd49ea2530c18d0046f4e1c9619c406175fdae58,
+CIPHERTEXT2 = 28ee6397b83179e1f195eb2b45a01c7a290548ceec57a315c1d439f8e3b9f3eeb0cb7740869b6c27f74a41605980196247d936d2b020dfcdaaa3154a816768c8dbb2d3e5d63ded4c5f899ef78c71e0204e3827b9048babec19c2c291c30f0dc6a8275eb15a7b3ad6e4f78a5a550ea2d99e60976fe3b2c1289081636dd4fa8b5141a22ff464b002064c94ea207b91d4fec64e1e5c82d7f6d85970f0d7f431e3d1a0c340a064bbe7ef2c7e0a824fd6ce2f64e5cb5abaefd804f62d0b4e26f3413dbfbec89f93a52e6edfe3e63bb16186d333060dafc8ad4bb0406f1142c5dbf92b164d356b24df2476fa6d0062151c40416a82ddfd305a4c40cc3691547336bf2fc4636e3e7a08cef4736dd12ae731a740677863bdf7b6ec674dbb7860c5b94b144009716acc8db5d0a6963a1919002f0f650349f03346ed0336c3e08e89bb81891381340d725c0bd7a60ae80de727bc6c88a6f8ae7c644a04cf0e2996ab1a619fca5339bce5fae6e3a00a8d071b8944360f556d5e9dc820e8c1ea0b48c83f70be6a81b7dae15426794d1aaa21f1fca2e4f6fc884364377e89e5d1a0eaaba0c7a6846ae44516726a0757f8a80ff687994fcbd924e382346f8138174ee1afd585671afd2579fc9fa9104d8872da8366520c2227a11af66fa011bb9a9edd30dfddfca3d032eb949a3b23e209344b2b56487e6c4c7680840f1b698d7577e409db65b4,
+CIPHERTEXT = 0a06feeecfb7f950eb5efe7f816d22e33b44eb3e4a1710c83eefc4348103ec22f9f4b262094cc5908cec62329a9676982dfc8803bf22cbacac5d73efd1a0f1ef9740965eb06c474f4e9c0dc6548c76f3c125e3ee4b9e8284b3c3b983e0d857d4d9970e5a0cb15cb6d21e27fda9a21ce994817d952c3098c9abf8326ed317ba12f5c39bdde860fbb16b031b6fbdf2bd0b32a8bcbf0150d0084e191df35b55a0bd6e03a84d5ddb312488761dcd3daba94acaae2d9c620e70aabce2d6b28f87f8cb935212e1c1d10d8a43a11978832391d4af561245f1cb20e1423ad1f5de89c475ae4178964e23d3408404374f09c4833719f8531285a7657a18541692345dddf1d3abbdb694d65e53caa90461a1ba11db7e5bce8b706adfdd6792f7318348a5799ee4ba97c706ce72d66008f9f305b0998ab1d03631727e712ad38c1aa664ae3a261dc8b0de9ae158b78b3e8215fa4bbba9d4a6b6ce3f28f56df610d3ffde9a79316f5f38d93a615637a4c799207378a8833a29783e11696cfd890aa60f506ec3042d268fad92de0c76a7252706d741e4e85d65e9d24c399456c6b2586e3977da0887c9b6aa1ccf64500e1bd03e79cba55eaee52b9847290883a3b5c5dca821e387b8f6625607fa6541e4b8b7dc4541dba82ca3c9fcad78d875e288a1f93cd7a88f53cbb3ab2a101b972fb5062aed5a916c308d62067e8f790571edda4bd3c927,
+RESULT = 0,
+
+TEST = 32,
+N = cd11cbb23a739385cf488b2494498d96316be0e3571b73744a303d4b7b0e485d7e454338195570cb4e61fa0f0319b3fdc0e878a96fa8fa8f514c527098ab845dcda5cf81665c77760851d76be574e4a71b33ebfc01e0697eb7278e4e484cb2876b1ea73682541dbe4570c36cedf46da90f95349ebefade2e40718744839f48002212e695a2ca3cbab34c3f14f7ab2ded02e5baec26494152c9ab47f918dcecbdad9d4b0e924938f72de1c27fc12cd964e106ba5645bece22b684ae7943d364fde45722ca32101352b4c87e7a8683053d840ac8d020a000b8e3866237b2d439dba72c5b014b2e3f607deccc112cab46ba4b4b98cd46bc7f3c98a048bbc20447f3,
+CIPHERTEXT1 = 7cffca888cb1e7a79b1c32dce6db0a14c54d9eb0e1e3a4f086b522a1e25fc107d4eec20d1f45d345f8eb0abb3024fe765b99886a4786b2dd54dcd6f42da8888c1c87288903c6354928de4e947728b3b4e33aecfb4e4928d1e77546b7e2d91a58b677f619bfe38a4ebb3d1ad95cab91264630c762617dbd7c11441943ca144a4030bc5fe6f49cf2f28e85e6abaeadbba3de7aad08edcffc31ae6bd518051174db54ea114ca89fd8f557ec6834456ce881f36ed7fb76c3454dcde086b39258c780d958f98f2d5c760b21be06a28fed58d6576b6f05c29ca55eb018202b8062970cdfca8f6c7ec8c3877ee2b54720d9e8903c2405a6cba9e1a04f2ba203a64f51e5718d939221d3bb1a165034af514632298ff925dcef7259b46fcbf603e38e0af631b7a86baf9298d841df35c82ba4f06f32350148570d6ee84d47b92c9211ad4c70991b911d125615747ccf9e7a42ef5eac016728737c4f0104b6e965925a5095f40b7415ec95662fcae8c2ca87405ebc91a33c25fead59c74d533beaa763cba6b4e3f883f8345b452a03ec849a9ba9242078d385c177df69dfbcadf67c102d0e064afe8db7d9fcb06ea23913e3c34f19a0155f228cff865474ef5ef40c3987ac98d2d49b979c332bcd2d23b68697e454400510086d36eea42c0697bb3c00d4c06c621a28dc87031667e0f63917c13bcdaf784f87b38f199b49aa828e9adbc516,
+CIPHERTEXT2 = 01a9f8429c79757e28bb720030202bcbd4df2543d2692a1ac4427865de6ec95c8d6dd213c4b1ea5067ea148af7d6459e4e7cae893a4d4513d0ced801e1f965eb0c88c075faeb1585d02f46fae65af7ba9e99b82d6205daf1c0355803d7068896101ca008101a4272186ed1f0e197491187a6c1e11e125c13880278a1196e7aa48f5acd47c0a4c9b38a26cb322bc50f679138a59c6dc90485d87ff0dca4bbc81ffd00792c73d47cc9a8f4be6e3f22818ec7a428298c443c4053d0a2213b39a37073602d24d81d147b7e52eabc655fb5c04fc883dd01f2538851ee77890b2504a473d5408d02d84ad5b0b9b253faba860b172914e67b6bb7bd854792646b9760739bab7d439456d82ef037e86fc0472fa527220cb195788b5b4a6dfd3933d06dc749f8f1581a00e85708d01ef023c87ed52434349837b058b4f874178e9df102d156737ccb542938cb340cad9e767aa5c7f06cbae005cbcfb814e9b6f40ac5a01c912e2d02996a995c382f26aecae9ee2a61136fd4bb0b4e7bb879bd47e694f8bb96b9296d28fc1770b4b0841d54f4e7b4508a8d7731c10f774f723dc8af3384e7965e1addc19a854e0b419348f18cef67ecd3c7b0a98616f918ac19c4dab347895b4f8d377756d7eab2c560b0825040c55e8121c444def12a6e9115be4a951ab82e303f95c498611e8a495a730ce323952e8834a02161931e441029560e774ba2,
+CIPHERTEXT = 7403474f4bdd2444eb8c94d8f3f8a06ff86887933b56518b25bc08271838f730c3db9cc7e6827bfe8b4c45933cff2cb8e4c8e98808278063b93355142caa3ed3926a0da7a8532cccbf02bf49cea54d6a868c3f2034876018c81bab7f6ed3aa2a3966420249796aec28bc2f052590dfae59e4e3a66bebdbe7ef6082bb88c2cca6ef2768edec6b683e354a27c7885839f77c49fddde6294553a935d6d1f3fecd732248aca506812b7f765d1c1d6b4bbcc509b8f3a31a6f4ea680fb044a3324a895c947aab4f44cd5d74876b47a7513e1bc4e7ea6fdbc6abeec058a5f0020deb5aa04ddcc2ce5cab9089ebaf14e5c155da14e45d935689481f2bceeca9a5e88972b407b4383f3788afa407be2c1354bdec7e73641b10e1477d9a05c3dddc6dcab57bccb78a09c87c9f0e3a5d4b5e33b84dd3602bb629656d8b408fc3e0b31f83df6cb7f92d75faba98ea3f7503c0dccd08c4f812a05d9e110f8b832d189bf19073dd7a661acd6d5d7d82f9c95836d72a3916c4fb8d81063ea36e959339e0169419c50d439e4c2e44f8a58086e203d9927724fd3ccbc4b4f64fa7eda11cf16dbe65e5eba1c8f32a6710eab8584fe7801c879815b1bb52b2a27b9446c8c718c478ba6d8af78b5aad30b9ab90efdf3dd49d0fd53a17db1c7adfce2c1811a025f7d6857fe25ad88d7a8d4ae80dca860796f885d06b9d6ff595b64d8616d65ec8fdd8eee,
+RESULT = 0,
+
+TEST = 33,
+N = bad80553477a84a33416d76a31b1c6561633d218894863940ba205d5254f47ec3db2d5d14956a5cc70e8374a30ad6d539b2b2f7bff32291bc687340b7a1815829a9a4c978a4a90eb07a509fb32b69233d2f7541d74c51cba114c9efce65638153e9cf47f82312a8ec57bd8f3bb55d3b68d258a219e5ede0374521d2e35ce0333f745bca85455ca9ad677461e18192b41e9a8077e4701c00db1987a8f2e92078d199030de2df04dadfaaa258a55c5ba82af77ce1e73363fdc49c664e909ee481108ed54371a864f0589a524e67dcd1ee1de109338dfa34692600151b99ff61a27a698fd09b699449e77a9e107d759b63d1523cf5fc9bd58161a050ac71d383c57,
+CIPHERTEXT1 = 08ea933663995b2ddccc12eaa89722ac80aeacb971e002299707c14e462e58a353f899ac91386b5dfc49bf9f2a124b90b68b065aa16fa52018ca7b42247d129012668f683c2f09be6af34cf74faa6013f5aee1d172bce3ceeed98b31973b7cf8279405152ee59936b5f73bc28f93b542a5b7c073237b8800cf1dcb8573634a2837b41f5168e77c8354afd21407ed72a7edc3ce55cd390c5f63e2537ba1ff47fbd860d3db8467e342bd10c4a62617689653ce803280b10f11628a46a0554b818a91d0ee759cec15585696093cdc67448ebc058673fe9e050a16491229ed6d78a02934bb3dba648724a25acca82bdc51b181044ac1769ed11238e59671260b1179bfa9b0fe7260550ecf67e033884a7035b5dfad2af395aacb35eeaf279ffee84d158d10a4e13e179670b554a20fc6634c4ef185c38c6d4fe7f8cbc8d7bedec4d844afbd4a63d24845e5fdde25489367a30d5aca6b8cf981b3cc7a2381be65a7de8449e16a7aec7cc80d3d9d3e26344a4923a646bff2815952b55662ac4c7169b783fa491041ba9284322c37f01b025f2ef6b1080d6f73a9d65ae8b2b01abc55734e44cf07b856feac0ced42bf20e1abe985889fc40a11ded46f75d3d0297079c70aa648c0b9436c43f8e3e65bdb4bcfef65eea0b940a84509e3bf2788f8e64a3a4cedd2638bb255694ea27d68a81185d4331d805174beee01ab2ba1c886287c07,
+CIPHERTEXT2 = 2e521be5443da304034ed9e3e56c40a3645c3b877393cbc3c7c967c3e69f16941d66c2e066ef68593dd96edc1fdd6034b8f92fd7620e7576024e2735777ce9e3f92dfe7a33bea7668dcf0f7a767fb1978748043db14f6cbfd5fd9d84cc81ff4475da28b494e024b5561905545931b37f24c7f48fd2f8cb45452d674c66a89aa376f1db1d9080dfe01ba152c11e394a61fe7f627fa5f5745b29c2a763d173c51ba6f2eebf8362e9948810941646d49e4b66b752e3491e90b4f6713e8d2e34ee2913a232acb860134eabce7ec9383b6cb20017c89a936274dc5fd52803d488968681e9e32f6aa7a152833c888203fbb4a88994c90b9cdb22b1fbe53247ce45268c3280a57f2be0ea96a564bcc756f059ae5347d1accc340e810c396db1f06bb5e82c915ef35fff250489505790aa68e308ecb3c418f8d9dc1afa9bd344b344bf8ca05884a79d69b34133ad66e2ffceb5af2a99937987cbb94768dd03009c9033bad75f90bb0a639c3354f962adc3366440f2b7cf3c5406fb7e506642952f2b30440b9c3f21c7cc923213184bdfc6f6afee8eb1a1ab35eeb65bcd39f78a6bc3329004cb8afd111775ed249cc51246ebd56627b7bffced44004324dacf09c1a4b86539798e9a60b581653abf6395654bb0ea1011604c9059225197456b24b0ebe812e82c8fea130963764ce8bd8268a2d57cd5c9d60c89bbc18163a8026b1a87b46b,
+CIPHERTEXT = 3b44e242b119fe298c7103720e5f8e12b373455249efb64522611f40f31f4b701e9c9ca4c621ce517838a40ad90d64ea9dbedc923be1ba5ad9a5fb5c48d73ebd0e9c9b9f74181087d2e6ef5b50c714b3e6ec3b2cbf50507cb780f46e147253f4b6b1694f77ca49cdbfdf4364fe6447a6e56c7c05bf488b9428206867b519b969e0ce789c452410c63e2841f9d770720fcff65e7c37d631c44250193d3a92fce70d1bf102750ef79067eb49181bdf457252ca0cc81a2cf9ec071925b582e0d7ca5fc7ca7eb0cf33eaddf81959b4ea59716aa0458179337f5365254bf7a026c084c1c6ab812785f9c95f2420e31cc2da14eac7534519764a4ac3ce2a86c4d30a33b2f043e8ff1790f33efd13451a570a414a64b70396ba98523d2d1a178d66968baf3c6a0bb7c83b1e6f82abc19a75fee3ef9e81d80a0b515d97852c32557f02f7c3a2626fe833e9fe9af587d822350e21532bc80b413b9d540cc5a572e4c12307fc29740f7706670a26053bcfb7774392aa28e6f3dd6e89ba9f3acfa7830350ff2d14a65cf45d613ad793d0fafd6ac3cf47aba6b09fdfa4f101f9298e6aef13a87b37faa39291f0bc614a4d8dfeda34d6d13742e92e0e53996518cf098ac16dbd3583ea0b51817cab52fa972cac91e61b251cb6a48481a1ba324deec817b607233e6c4a93578a35a9510416620c468f3a5086afc563949382ef313065e6ef9361,
+RESULT = 0,
+
+TEST = 34,
+N = b4967db988a9e3d194a5cfa008dcd9809f34d22968fd44fdee9ad1d01cd16cfe4db602dcc84720c09e234a60887e26a7f2859508e0f8d7dcc907c775a28f30b20cee2eb0334376f58d426b5d76ce2286f8346bba4a01783453ca15c410a5a71b0567deaa03e01b4fa02621f02c31272920b31c2caebad2512a13797abc8f73898b67c2d47d852dd0710a767c6f026c65dfc7c4169f4e89ed0c9017af8a179b83a3b5f8b013407171204e71cfd519af720ed7801fbfd80b0fa09d5492bca8919ff7a82423ff6e4d3a95bb5d466babb39ac632e2628606ab240e694fa464ee529b6faa24addfbca5847384fe5f7b22100f1710cbb2bc39ef4e48565d90ceb49e93,
+CIPHERTEXT1 = 4b09fa1a7613b1f4a59ef1f3404da9906e0cfb0619f2d450357d63b662a44ce2185eaf2e092ddb9192aef65cc07f883580a07e341e57c298116467e569125507892cc89f2a6a0095abe650a0b386054b750394d7b62f50dd5b4946902dcbe0198e512fcbd31c72df7859ec27e66181ad75f532ceb9ae61705f0971aad692ced4b9531c1e66e235457823a6023302e427a2aa387eb3df4d7736df6a914cab6a8713fdc9e9122b03e01b8614baabbff5784c81d44f532178443cbd16822694418ce7441260351b6864333ff8b7aa685c8e4773f2e7eb4ac653c31c1bffbe13878da0f2b3e4352107c4b684ce73ea452b57bfc00e0c7cb6436db15bf8218d77b778de22754bf78b88d9311fd76924bc5233642ec51ba35af4efef3954a0cf1acee685e4cb262e2337e042faf7b844f7b62e3bae8e51facd46d2b07edf84134c7e80d6fc69d5ac556e08b418d87144c170e8afa6bae07ceeeb74a1b5710d8f811f54b3a75ae5391be912af46c6940087734749c0123cf73835184bf236a013a4776ce72d009d2ccbe9d3f1e98ec672c64d5ca2ecbe4bcabfeef0901246987e8954dc58f59549ed99afe9691fa9cdd014f81eed737b6ff9999e02724088e2abcbd1ff9328b3897b2f78a002a317a3dba2251e9e1d2abe8e2bf6439b4191d61c6c81f209d7bb6e06a5f29e7755eaaebf657b2a9f745f0d0e944b85e42fd9c93b54c502,
+CIPHERTEXT2 = 1d8962ac2e6ee6511cb7a9e75870d3055c73f1a66a328ba211a46ad789e03d2140581c4ad56126b3e0c0675209265f581802c0212eb8f0d9b6e31a4110d6ef2b78c96f9055c49c59dba523c9d0d50ad1f818feec154b198e2ad62686c6f9d4d8396c09b9c959facb80976d80844cfa9deed4ad5d0486624a0c016222d9e0cf79f4baf73118caeadcbf61c120cc77b66c5a42f94acf3cbe2b5380a8f9de47757fb539c7956fc428d80766235febb0e3ba0b4f612b84774f653bbad578197dd57feca175f6a4ede9394cadd50b7e4ccbda5908aa5fc99e7cb383936903e656bd84b5e0c581b6762a0485b5eb6fb2e7d0d93a7fe9090a7acafa1c4aa9505c07e7df4a7e6acf222b7da1d35ed4f6024e28d08a54388fcaf996cc5fec983933371b368cf09ab32955b40e95e69d0beeac3feadde8562e1ac04b545e13b078c273e5bca75f88b0a77735ad050d5a982712fac1adfb362f7c74f61444d661426c4f0719035e72d662eefe9be3ded9d31f3968135c4f29d74c567edef079db42290c734e9535ab97502bb5ab51309bc242b774db506002fd9f55666e9272fb003e47e1ceff203ffc4ead5ed0b7bd143b66c18a1a003b8eb18d56fc95ec9931164fe2b987250525d367d03c88f63249d3978c2ba092a7347203da92f9722d910a75a5584faea4d5cd27a270886e40b20d2c891e18db92f4ab33a3d8170357932292da814c,
+CIPHERTEXT = 7824ed2f67a1639a9a1f167734cbf81b4bd6543faead788ed545f94c2f85650a1548be5d2bf4f975ce5203e12fd3874b6beb61adde0e259f543a1637c553be9438f765ec56e0bdc7eb6e7483c2441804ae6d3cf1a881cec75a5e4b5047d0731e1ad988d60ec6ea501cf9258b4dfd2b7c27f279914af8f1dea98b5978fcb56e6a5ab26d9da14946d634ed16af9aa3c97e6363c197bb4a0c3a907994c504f15c5d8be34e4be36cd20485e5a344d8785fca111add03936b73e623615ea7ef55880eb5d7fb8cd52361fc00803d199e1d59d785dc379829edbdd127132a3feff5149fdb43e91e4fc8317f24fe99b9ee44120ead65da3b6a8ec296899299339bab31e03ed6a12353e8fa0da0fc0294d633ce00585257a7de9a6814db26b9527cac97a7891a2da44f24f460c9e53c8ae4426aa9206199265c5d66641389bbd9ad7dff89d5c051b15675a5e2c627c351ce8d01eee3c128e86e4b49b4a2936f378ef08cca1988b9b3169983cb435e21774ed0c7c367db5ae2477525859833c645fa52730207d21684703bdad98a29a21f26dea18710c17ab78f9c111c3a638bada5978ed8940f7ac39f42dea8b68de6bcf86cfb210e1c523217a8d51cf01d263fcab9011328419812e4c0c0a254c2e69bc9aab068fb13409603f8405f1f6d494659b785bdb1a014d7aa26920d54047a568179a0ebeb9c48c6cb8a6795574891e08acfbb80,
+RESULT = 0,
+
+TEST = 35,
+N = ae578c4dd18a633bd743fabe8c66a5b025845df53bdea1f158be5cd75779a061edf303039e141e9562319f7c0f4fd46bece252fff1b69d5e1da63b344f3b5479ffef177e31dc3fdcbaa52df2c8936557f9e16f3c332ecb03feed24192a9380ec2af523a75276d5fb77f05df3875f760cdc79c7525d511fae277f1a500a4b29b5650013818731a7f1507042b6dd1e9b513a42b6668cdd56f8b5deb76eaad2bc9da58076f243c760e78c284da89ff706816dcc2f8a74c5c91a30f0e69796359d9481d1923e92028503cd17f6a8ece4708f15b27d6d8c402da6ef5866c2090ed3a60e9d40dc0d894e79f2350bad16b83e14c2c98c26cd5617d6ad76c66f50118095,
+CIPHERTEXT1 = 0c1e17b1094ff592c5bb79b763b9f69f1510ac60a84c82be371c40aa0467e2df22ef0c1a921ed50d8628d8c9728d2a60b5e2b8e49b7e75319d2709a756b4ec114a5b0841b235b5aeae351a46abdaf7d1d531880f7e29182030847799cd8d637597893cac33e85d135e042f1967726c1501c65bae5fc59d340810797f395874372ebcf890d7919e6dc128c6babc8814f87b5caad96a5585260926151fa110d3d6d06d3057ab484f0371b08a6a355a0c968d7120d2a24ecc69670adf047e5e19438c9b2bcc316979c184ad87e0b12074637953c04cfdd3549776732a9e77003579d01b45c712d2dc8eb20215281ed7b9a2e44bb6956dc17ffa9368e48725a4f3c66a3507beb2874c03077686310765d2842c9831f7beb2925c7f4e920829b9c2168550562ddd1f001fab42866e6d3a626a2d6a1900edbf5b507862f7f7a1ee0a492ea1624dd92de699c37698f12cffdaa08d5a146dd9abdb03755726b18d9b2865d422c29312b53c89010f38b2aeddbc81c638c365b93ec3fa62d4d87dd74f148d236eac268731286dfb24b7071f5644542e12d2276e7ca14e0cfcf9d4df2db9cbb8992f830b790101536b4a468e4b7034a861f31b9855856c146ffcdefcbcf8d67f3db1f795d110ea9d968c4e655d00e168f676a89977e6da87c0e85cfa595cea59967bc5edb61a9d741ee09dc857c0ba2bf3fcbac65a0749f2f34900d0a79d9b,
+CIPHERTEXT2 = 379cbef5eaeb7af524ac85d63acf37c7fc0ce199928382a9037b4c1e0e29183af141f13571ff5382fbfe30de4859ee9bb42857fe758d88367023ee67cd0a63ce01c7f347b4ebd1dff5af34c7e657a7d0f36a962ca08b28207bed6877770f458830806b15ce7614b6ffa2c1a4c4875bb5d6079b2ad7bf24046a4a1676a7338817aa37e75e49942f1232866fcfc99d98d6f7aaaa6b960ae1c7a28b6143fc7db85dc84f7117b05fa12ca1a664314675370deb7fc981727214bd3c452586b4959fcbb78923198de727485f4018848aef2b062e48f1e36b75a406be3f37134bdc7bcd710d29c963c7f8b84cccd6ea3a7ded4efcc7972b32bc1e560c430ffb06ebc1463d184bf5946c0005c8422adbd7da5c37c5367d7a7380e939e8244d07d0e2f98970d0014530fa8fa9293af36b6fc928fda1ccaa6ddaf9b54f4a764e2a8869211aff1aceebbae7d8bf3cc5332909a582e868e21f7434833564d98eff7a4569b95268b390a267ede1573be7b9577c39f7a170b3e64b962e1c6ab0e371e4b53ee3c4b17134d1e914c3f8c706611a7a95afd73d78e65f4b6f3e6fa887027fb88fb962ae6e9a09aa5df406bfff3b0aff5ecc835e5fb73b9270835dacae02904f56fcf9f8933c30b7acf56884f4f4f1958ba144a470ab364b37890f8c0f65a2d228f3552ea4403eed9e6d5844286cf2b3989568a817b5db2386157cb6eb487caa200a9b,
+CIPHERTEXT = 37016db7ab8573717dbf877eb31a47b507fdb71ab1e99433db0a024271b766dd81a315b9599d6028179aa302a80e909dcb768e793f94320fedc306ba8522dbc4d3a9a426193a2c6f54f6abff50f87e0bfff9ad6842a5088387e7055840352db631d0c70980fd38d7d7412050bcb0e2122a5c5d64174664f59cd57afd733ced3491a2b025c6f87a8a2c7a2701bef5d0b37f979ee6c3b4d790aabfe605b34796fd38fb5f96289780c3a827ffbcc579d03898102d20dd5f18d8237025b420fbf1f1394e750606f15046bb667e304b41c3a56b170376b8e20d7c27783fa6f481d36dee1bfe0c2be6414d296adcb291b74c9b82e2df77fbc20e8bece28d8de1bcc579aaf47b428b50fbc3292c6a0fcb686bee0af403b697f5743f211f909b42888df012e7ca0796300a538209a51dedc54e03037745ae6e4ad5a6211a80a417611ba13973c020ca611adab4bab920d65b7496472c7cf7494ac364cfa8ea588014cbb57cfe217ce8644d2b8457716a092f1953f2df83619f372d994516da44c498df006a61c812593375a9cf3ef9d4c6caf545a99720dced9d797a9c5220c2be657d702eeefc75abf6919967e9c3725f996ace6b5e8ac4585f2fb6a48c09953420c2bc23df57a82023d01c5d1990ccdeed0a89119c6cc39dd821bfa19912986d276c23e3178254dedec12df17c94e4ade437219836d8273bc335161613beea76d63b69,
+RESULT = 0,
+
+TEST = 36,
+N = e4d01277bb0d46c330c31e1e3990876dd8e94294ab0b03d079295d02c844b7c609a49812b6a1235e377637c630c0b5a4c56ece1e00aed4c2815430d89f8aacb3a52dc09acc1b106da73677a8520b8e33ee7121411cce166e67806006e353bd8aefa6ac98938ead2b8bf198159bfe94430eb53ba53551bda15a3ffbe4bc8fa11ae787bef99133053bc7d10f650cd045bce677eea0636e7156e9307d567b7b69ca667697949339d02c9e8a2ee4d893e945ce12cf70673d80e59932c6e0f725c6180471d74af37ee91d9fc8ac1457f68ecdf6c588fa0684dc0d492163ab342fd3f64864297606cb6e54682bc376db97ede33d1e9e2eedfd1fac95aec916159d1e7b,
+CIPHERTEXT1 = 6a6e15a57d1621dadf9e448fc30a114b2ed4383feffa96c541cb27528ea7e627b7a3a1b7176c421b2e7cd9c414fdafc7fa7e5d6ea343c09eaf9cb8c1de5efaf72402181420280735cce99cd33891ad9ba23cd669cb904119406caab49537d7704777ac84b10d4f5f9c5d066f49dbc28e9aa0dc7a445e87f6835e1890b9b9b15816c83bc6ade310023315e04970da7dd5e64583a4574943d588e972353cecd4d9b2dcbe8c6950d8cbdef5d480a1fd48764b602403fd72a4a0fa083fd6957e4586cf0ba5f78684892a3899e4ba060de221401362adeba366d7b4d20367fac846356d1bd7b700af18adc2351a779c83625f3ea06da5a4fa3704f7b1500e6967c457c072bc13eab501c91d86448996716f8d87ebc7a1442173c1cfd369748bd1c60fdbcc8fe647decc770da22396b60090e07ce4b45004dac43cc3a907c6c784d82a43b755ef442e05216b1ad9f79eadf88b4e7f8cc054c859e90b2fd948b9f63d307dfa29a7b4bcb1085bfa13e11e96a18a13a5f34112e30fc39cd6c0ca2a5a0eb5fd98818ad995044aa884001eeaf6c8fcf8ff265e9bbf9604fec0af11feda49553b31de9026a2f504ea891d7d4ce920325bdd1b077664ad46b2448399620d3879bf44afcced430dc83336c3e8d66b9a08a1a8d5eabe3a6971e8e8b6dc059d512834563da5515fcf5b2c63e5395c00ae75e360b6cdad4903477d0fd0568c9ab174,
+CIPHERTEXT2 = 550cba4498be35daab8cdc819f38afd5e078650f5a365c6ae5486d4cd8d9aba71905ed3d3f059937fcf9239f7bc5646c4bfc58327372defd50469eaff5e01c863bec3907befaf2073c7ca7e96c1d80eb45ba2fa0bb1d67aa15dac07945bcace9e3df6490b1e6960c911815b63174f2ccdb2eb285f2452ae69cc9aba44ca6d51f89fcd43d1f9b08d9cb7fde45de0ca85f25e2c29e552649295399f5cedd94670313d5a5f52b6048d4774c71151b50a27e50fbca60b731aaf861ad3d7f9dc6ff2dd8c38408060d94983e8037a62be1a218bd16f348aa73883ad57e47fc891c5e2b97a16b3d6ecf257a94a6cf8c8df3de688391d38cc358bcdd21684c29049d42de73ce3d50171921d1f837f6f727cb47ae22189f0de52448ab68c4ba2f5f9884b916c07bff356a038a164387df769bd09776ea3fe95698ccf77de394b4734872172b8058fa63ed02ca7fb86d1bb3f97dce9b16ccbaadabd602b5454c46fc5779d863a3b68e077f153a8333e5ae8f48a10c204a644724612a67c3f648354f33418d8a7737e1ad0403f00ec405b8c2e3ff6d837e9a502911ecf3f4d1014323feb4b18d6b4557582baeac0a54dca6bd6cab347f04b33b9d8b8e6ab4d9f57ea99f1b365b955a2d099272c10fc38fe052673a23c1a398c9a736e2aa5c5a61cbe45f08118f1285532e00a6f51fcab99393c373de44a427506e2ee8d956f3ab045e181c79,
+CIPHERTEXT = c8b4cb7dcc13cb260a14a3f7a06e6f2e8182a23bfcfa3a599f8b5d97617d23ad483e875a4ce45b561f1bb6ebef51c4b4f4d85571f60b84490ac4460755df02d45adf6811f8a49cfd5c1f936d7a04a622b50fbd8419fb010a06d310e34412975c03fbc3a7061d4e5c5d054456422302c1b959eb5e67a213cdb67f956ea5f7cfbed02685cdaeffde015146cdf75a4932d5775f958a3387b9296166f991458f50ad9f54295dba8f9d3c67108a458556fcc37cbac2dbd4dada47cead0670f638d6881358434c9c19c46020efdd336a9046d0c1322ca913b9bd9a4f6fe6e147b570d8845451983806504a81e8237c118cc2ccb4e0fadd81a5a2ef5022f95e0a121f83a732d26825011b1cb4c999bbc72ac03c28520b8274a9973d10337a7439dec13b3b32df16d062bf391d2ea524d263aea06578e7411cff5a39e600092359ac0961ea643a340a85a492df6989188219af30b5bd0494f1ff41ce8fc8be3f74cc6cab446e3d8172b79a6b7bbbdb51fc7d520455ae6a7fc0e6aefca2353543bbb7cb9d761a6d97a0dd0f94b61c9f067af15347158bd554a9f5a2915ccadca627d8e95204ba84ca5fd02419e05eaf86f13bf9e889962ce21ccb52b711bd258ae0af02dda046758509808919b2f4fad51e9698802320601b9fa66b45eef9ea6284b954180b7a41637e1f7fe1b0f4b5b08b51a203eb8db799b0c1c5c9234d2ca0f3bb87c8,
+RESULT = 0,
+
+TEST = 37,
+N = c181bd47561ecd6b6ed2d3a56077bfa0870f48fb190406d68f5f027b90be5e6ac30fe50592f19bdfe2aa92703ea0540c8acc56e1c3c7b407fd03f8fa0dc4639e1be14b4e38161102b140ac5f79e8b729a7bd9e9985bf5563eb3acf3e84226dd0d57ccb3816d54b3b0f8874a25ee8fb3ea04f11d5745fc300fce4f27f24390a9b4932595d1659789b7df5054ab661db850b41923e42c9d214ee723250abe504d23772029e9d857be057fb47d48ff8e252580b0bf82a28205d528814d63671009af5f8d8d010ea6507e13ede2e9e249e0e618c284fb76cfdc434cdb74cac93b3a3933fff4583cf0953c221f87b9095c54bd88573f23427fc7326a935271095543f,
+CIPHERTEXT1 = 47f341690fd6624adbd85a19c2f5725060f1d737c25b389ebce9e981855063325a49a4ea070a15194ae0dd1570d228ecabebd4967b0242a078359244f0cfe4fd518915178fe63554d4a484199a055a70bc4a80cb35f65a2bc414d0ca17a70324ab8dbbbe04ba6879802f47031ec9e77691b81ca5e8e597672a5ef22ae3e50482cfe841f238f8e3a76ba4e4b53dde7cc40caae52673b2720efccbdcde0deeb170b28e39556084cdd80250739542e129de0c4a03d42c8421a32c15bd61ba33392d14752ac9e6d69ba6ace9354878a752da3c09090ecf846943acd154751a9777d7a28e959fb07d3b556df4c7698a8d483ccc6b30e954c4a9268b6cfbb206d5ef47ba16dc945c83a5764d30edd2ba35493ce6ff4c30caddaedb705595dc466894e7477f3fbdfc16fe9c2cdcd18c21629a76cec3035a641bd26c6069caad7a6bc4ba4f2a11bfe5730f2fb6049324f5391584b27e5132cbe7bc0d28799de678a50780f84e7bfc5028421d2f730a5b13a35a4fd2b854ebb7a7671a4f52f59edbb6590f417e571bbb8594f51d3abb8437a1d216afffd56878b2a14e5fedd3601f9bc676ee4d7489670611d540b659948a52a33e22ff6eea812e78df48d8bc54a8c6d134d0ee9dd52db2d5d226313e58f5c236d42c633f8cc734dea35d67d39cbe60075f53e7ed6f8cd9359591269d370975db2521d5aff496788028ed62fd9f5bf0d44c,
+CIPHERTEXT2 = 906a3e4494b52db3cf30686fa7745db4dd1fdb99de56bc4a654eb8045c2a42c2ed7979da168e8f9b2eb0059d25e0225faabd47279fc414924693dc0954ec1eaab73c60d3d485c31fd7cf9b61b12d761168d52dcd4ee57dda250e3e0af2a7495b74a322f26d7c2a6c25b917499f1fd111505f4078472713b825b583fc1fad8265a802d672c94953faa2cf73aaa7ccc1441e16b8d8d3757b319dfb191b53e562ea86aafe4c3b2c724591ac15a580a9a1396ea9f04d34e978296d8a3a5b4251b34b0a26091d02e539a137db9d444dc12f292a4c7c0f9ce4f573dff982a0d6e668a522a7aa71005d98c8d547a179cbcc344d3b80454270752dfff85184775e656e8a8c9bee8a9234a32f99a6a01a184ef0b678788a8480f433d7cf9e616faffca75c902f2bc2099db8682256a42944808c9beeb7d68aca4619957329e39df41c0d1a30dc616c65dc1223a383337d793c36c4f1da1c97eaef7054b7d76d4f5769755e43c75a5deef00d80d1133358dc009aced5bf08e689a7857da6eda176d6547f1bb347ebda95e61e3aa58e4854e506cf1f1b9a5d7ebb28e10e276d4bb18e25810b6a7920487df7f5e6019d847783c8a0a2bfc29d4c9cea5be86792757f38e7052e795c35e7ba815d18639e84fdf35c62b58032341297dc717663a976750112376b842b4506058ed6dd1bf17cc0c27179c35a9602afa937146e9a06484629046aab,
+CIPHERTEXT = 06e1a24e027f87c2b4aedc4edcbac6df2fa5687b1e7a03b387b93112e5cb998802ef12f15d9dc2b034ac684bdfbb1d6a5df6081539299cd656648b879265eef1125bb3affbcf66af46d1070656c86bdc80b1c379dbf0c46945a370e4f80d9cd29b4f9fdf100f3690634ac39516ca6d7bd9fdd10b40859b062a27b052085e2a24fb72075abb30037b4ae23a5715d141031c36b31917db45ff6ed07ba228085c1468250d618d0bb3cbcdc0424a8264b9961f3c800d6d512b8137596e0e6ade19365de96e45654f228f1ce5883f399bdcfa08845e4575a8949417452da32b2607f3fd16c9f87c0a76dc589e432a5deabefe3dc7f14e7e1e245a7a9daaf43cda64d55a208ba5b1b2bbdde197207bac7dac609080a9520afd452eb31d6899960d310171298e58542d6bc7dd58215648e348b1d985d466a591f4e21339149cb73e7c22b8533c28cc36a38f30edaae9420e82ce5188b16d481083d8d82bc60ab577df059aa8575ba7eb71ffbc0b69f75a9b9d8105d6c66c0391f7c5456d8be4679bba0972411d3c525454013489a2d9c4efe9fb9cefc0330769d007b071d3a7793e726dd1700e0eefab410536e286f2e27cf0829e9d8dde82d5d8f6d94d33d3f05af3d1d9da2ab49cf9b98f6a48b15d6e2f12933f93eecdacc2327a7e120d4e5b90639818f43d14d6952891bf338711c9df28cf704004514692593410a7976d05037f04,
+RESULT = 0,
+
+TEST = 38,
+N = c2ad5f1af8d1a149e72cee2f303003815ad76e1e9eaeb8aeeb1defa355888effbe7f9b9a72cb079c72a5664281a65b4efcff6f39b57e1e8e91e06eda54d675938bd2f4806aac6a9fc7f9084e8d050d6f1d7d94de689cc0e1c2f21eb2fa267d1f420f2af5af71072ffc5c0d2a07bd7a7fc781195ceb4072ee58c87c8ccfd85cc4909419bba161936e1ba1e8ab7e5ce6d2fc1f2104f4a624436b2bbbc5eb9c371369e81ada4248d953e2dd18992b24adc6393cc872d52debe6f5a2de6766b7ac9826475756d9f86d20670bff78f979abf33d538091cff8bb616bdb039b8ba831609e283f1e6cede1d6775a128f2b75b8b2ee4e160f22acad3fcc3bcd7718ba2035,
+CIPHERTEXT1 = 07a4a1fd51bea1b9bf751eca925d52e44bd959791aec7e35e2b4fc2d4781363edbd19f9e6f750c2188fe37c1c39dd3b3d7da9bb76363c96be659a1884e71de9cbceb2cce264f93203fbf35cc491dd4fd70203a27ec8689f29e085f6b7945ed04a3753422c5763576ba948117549d10412e83c33d82724fdd807013d4f2214f88a2c46150f08dbc18e823c1ca8b299a9986da1f5db84cb3f933e41b32da81cbd99db75bb0e525d2b78ba7ea2aaf7d695c03c1cd9a5cfe8a44db446567c64a180d0b382009ae9f7e39e814821767ce035c299a4e9f41cb458f76bcd5634868059de2fb8391a75acbaf3b9cb63aba0753e60ed5c4a20277b068ac250c5f85fc5d2fa921953309681d8a2cf0395afac9ab434e8f13ccf54f1b783c8a1d45d0fb8a5f6a3d16e318790db17f782aa19ceac3f96ab330e714573ebe4824f666a7b537058516696c8cad5a46d61b230f38c58a03aafa91e0c9aa3f3d486a3f0f65a9a14287558fa200237cd7c73a10b46054202378bc0488ebb7aba9f8b919476981679911c952aceeca446344d97c039bdcb6ed3b5d214a51ead0aa5d15de369fa2cdaca0531b8de60c09adda4dfc593182bd5d5b3b723ed890e12ffa6c02de44ca5be66d1d0ed02fef546cb4b29953a7e8160542c1b93de21ce22b6942445460dbb9c0348ea0ede28995863166eb136517a320ff24be3e24e85b1a7ca4eeeb555d5775,
+CIPHERTEXT2 = 8a7b486dc4b7043c08f5c7c16412e17841ac42503bbc414a9a94d82de7d8f471f92af9965123418de9adcdb26d931f76432816839f63a4d55dbe028401e9635e4cd7b9e1a1426556145f15481fdcf114ae709f31813285bf524df91bf7aca19d2c5c78f262addc7634e83eb93fe4331c2e339eaf16903239c24980ca44862cb2921244d513a3b9264556617aff646f1798ae863fbe0ac5ac2a042afdaae0520a584a0dddb4b69349993eefe910bab6e1a5a6f6e05bbc01b36980568943764fda2b989d0fbf5acad9a657cc93e18824437adba84bcd6004ac8cbe6a9f276c7c60aac6aebd339a1473a45224bfbcc55c026577a74214f6be91659b153bcbc4a12c2540e675692f21e0ff23c59756bd7552f5a814ac8285e22fc0a5b89548ebea1d5ec83fe585f7f08032900e30f5c8062293f9f98d2aebd0905045cf79d9518c99a707b13188927ef42747e17f3d93148215208f333912672a7e3d93ec3634e4d30dae603bb93f1f9969f77b3850a4aa0c191b51eb4c02862d5fb66ae609a9522889edbf21be6725b2fce710d05ccfea1bac90a904380bd7442da51f368afff5d57cebd167a11513c56c205134dda15586689dcefb8a6a61dddaad6d6b7a1ebad7f4caaf12d85816b48861ee3231be5c421a9446f86ffad3345bdb3bd59c4ecec2e99b753aa320bb490d7bfaaac90fa3f73f01077a65997ffe73f6d782af3aecfc,
+CIPHERTEXT = 13fc5f6e4df003e6b60a36fec29b5227b582b1135d7be3ef4f1d41c70d5bae3b7cbd0cecaab68db571670a717729ff25acde0c35eeda969d9cda0afc20abb2042d9a2d3285be904bdafad915b5b156eba8d01000c5e27e6d64558fa6378287562fb20eba67ff44574bb56eed8cafe8a9b489bb28ff3056fa863144e3dc477c8f162acd722ca3974a364308c7e781f4ff33c25eb3ebe3d0a9779ea98c589b52a19745d4e5980e4aadea4e320c4c37f5142665f9690b1105f387a407c1dfd6614767ba8b6e795d5110bbd83cfe53ca657b378d70ffe43735f4c8d195f0ba3d9b0d180f7331f8e969f850c9734ebc8bb7c0ea99e24b8bf4cf9f06bc785739a13b032f0a0e07de5435742fd0cb988e5a9c276b2b69aa3ac0475b58b075b5a4f19fa6909f930aaed1dd0d3f47185b4d373ea3738f5c2b5ddb35a471a912ddbc3a6d4744ffcb93be3abf03f0d06a2d2761c1f2e41a4814e22e4ec2a5832beaa6f35b270a677c27261cff27ff30c2829aca146beca2ffba8ede9d02a8d85cfc1f839546acbce0d6110db298d92611a9a3ee7816ff8b5f7f980c13346a787a9fef813b6c60eba0540f93c1d31aaa127f160d75bac42cea39af6a5905cb15f15a9ff4aca89ec8c8187cc2070347caf9f1ed9e44094ca4655cde14f35bd93a63a2389279df9098780f478478f5661d8679895d6cb2a56745ecd9ee15de3fd49635852d0a72,
+RESULT = 0,
+
+TEST = 39,
+N = d3fdabc069f1bcc40b03b66695e911307d2cd2dc25dac7259d22b0545c5554bedee263d31fe0fb9cd1512a89fe799d15b0a58f6cceb6f54eac2930869d275edc3622fa4b808f1af33956e3266defc5a2eb92ebbb25514d7a0041fa5d6afc065068ce2b5db4f445fc07ba4ae012e710fc1403d699b66552a2d6331f9e0a14b7bd8dea285437a3999ce9cc36847344726cd20e6be9d343a32a49b116fda984c5bec371cffd3911f3f66f995347de31e5ca538316a812445746eb16cc86be4f0fc21ee13b3fa4e011961207c312a7fdece3b327e2695da96aac9d327d2c5c28232953e70bfb24afad7690e0d87dac14dbc2955b5be7be104cf951b518649d8ffe97,
+CIPHERTEXT1 = 7cd02a0fb752289035936f5a456ee93db23624481d55f6652ee1f286ba7cb52001bfb145e8b75a17eafe796afbd76dea6208beb347262cacae6a5ec26570b4a3f2339b951df4eb6c161834f1433a326b04f772365fe5f0a29450228de9707b555c2002fd61d3a1a3310a0eb212dacf2e7dc84bf915214639b2ec7fcef8092bf27a6263225f266a751ea0403d7b43fb0e196fcc72a12f49fcc34e45bb8842bbf47a888f20e9a614f60aa17de4937b7f5568ccbed5c33dd6ff0b76c9d22073b70303da1bea1614f1ddd6f064fc5d0abb2328548d7f2a8b73399fa724ebe4149693611c12966c4798e5296450e3915e508d8f8252deb242fdd6030117f07a57ce34c28f77961087e5ebd2da0127efc3ef1c7525ea71e5c8efad007c983cf464a5e50df68269b5383cbc8f9f7bbc43df0c75ab4a01dbe6bcf1e450b60bd4191851991a43b81b8973b08c99860da8c448d092df6bfa282464dcf7d68ffc552b8b2b91d8f9243741d8d5e5cf87a473f4da9a45367dbc7e7ef877eff30698705898f6c744a1cba223c43655625927a245af52343fdc078eddd88198b9d718f80015160606b8d90f6924891bbe64d18da4ac21781a2934b903fec763b17f02cc7f9c7dd64d3d5d043017851c7e0a240b0b7aed7e5f12352c830d06384e89b0c123dc6d75044346ca12f6720ba288d0c43488457a4af0b1d4857897632df069f8c71ef4cc,
+CIPHERTEXT2 = a6336f91c0980f7baa13f4387bfc686b4936d8b81093be1f10d39eba52c3f88792288cde469bb401a50480a92156a2d17b70922f65b93547301bbfd7abd4ccf353dbd8e3201133ffebeb4345d127651f23393f7eb9b2dbbcdce773e8fb17bbc8402bbfc4f443a9e682ae6469c01814ff79bce14ec79a95f803800951dca1a1270f244304f298468b4b64c21b19586a19c4ae41b3979191e36320e21f8f0b847a6ec897f731ae83b18193900fb8b1a7b44e965950f2d1b38c8c6e8f55b95a80b2cd3fcb3af55b77f93dc3195ce7ace0ecb7232a8628900b46745038cf33a71791846b190f684e5c4dbe64429bb613075c199fed845460ffe985dae28eb27aae2ad8e0cae2b5c90baf5c4eb287802365e13169d51fc3ffd9cca2b51e0905179a9c0513d126d7ff8ed3cd562560edb079079dfc3aa9ba0d9ac0a74d14fb6971c7579ec12d2f5933a5413f19bb7bb2028bf61acd6a789641ce26f3992894f133a1618b7becedb3b3a8dfd0369ca42aaf3190becdeb04ca2d7fe0b8f0f03f4fb24828164d5d02f97c62ef11c1fa760e04ffb839112ec701db25e0000446f33616646ec472d2d6be0a4b2b4f8a8990d3ab7bd7123e89968b219c154f2470a903891ca618bdef25f38f2d49eb4f3553504345de55c07c844d004e30e5f9a783205ed5a72883e24300d71dc5a5fb5e0c418221805935b8a915bc44e45afe51939159138e,
+CIPHERTEXT = ad6a454b6a5a97a2fdbb191c795d8508cf0cd82776d7880a25026a6141645b0c484ce1c6a4bd06bcb3d480afc130bbed1c3151d359f16a81ff307639988029c83a64204677d7c1189ed53d4d856ec5b42ae6d58b08c14776da4f8447e3acb6c0d97e165cb1a00832a3a962f80141f70f34f77389c09b310555a88e46fe05264b9c003e7caadba9375c8d662defa77dd908264f6d4d2bed89529c71831289bbfa1e19e8d0189454e2ae6d88d81c43710e6cf57d2cb89fc46dbfa8e81df0d005f4849b7c96322e319b79c87186d11da2e285b2560b4d3bc4a44a239e8fb390d98ac252516f572f856ed900b4fcf790da3b1f71ef2f73e41d172c6d50ca43864af308ee0b389805b8c6fb7031b1446e70f49a1db8ce14ad4af0d77f7b15f9270aabb6cf44838385e41d6c1df85ecaac29c04a53f91fd561c13267334837da30365a8659cab64755591ce124c512b6362b011ca70bad1bc164ac6ba047c36e62f4ee6b06d69f59ec5ecd79989dab43cb61ed50de2ffb192da6ff4f4588cff2dfe57b9db2cc96ac51cd85c1657d859f766bc996c12cbd3d1a839077151f105d073e5ed9accea119d931a92afad073e9c56a200f520006cdc07a707567aaa277d3126b9da12afd675286c8eaa9293e82480a5f90edc9f34ec9bd9426e31ccc0830adcf87e79f38eec4ebabdf10c6d82c45a89fe304cd605b334e4c0b5e030677b18c1e,
+RESULT = 0,
+
+TEST = 40,
+N = d8bafefe73945b1df308e6df9843d77141cb3b11757d54d55a2b90888058677bc12f0875ea22880153bac28d4a2eca3cbb0fff8d984f358000dbed8fedd1054ee607ee6522e9f99c1b57e151e0663b9c800088e33d95c2621eb2ccde74e16a3b8edc10f477033ccbd07f3c34f3e9955ae4f99812347db41868aee955a2e011acb25740812488edfc07985f9b8e018b0a8d7779db3e0fdf1a5061511fe8435315d5f05db03d3707822f011e9b8cf2f0e46b6815c9d175ca3532f574a7b65d5d2609f3eb7c15d3d6df6a839608220facd9a8d40d494bcf79eb44a1b974f3e7684f30bfecdef6825a661166c92ec32480b4ad69bd0c1938c9510bc676d3a46c1e05,
+CIPHERTEXT1 = 13cfaa1b74dad0c923c1a727cdb9aad9d4bdbd2b88b1c5cc857d0c4b77d271a17e273868890de2c83f8ba0aac57f8e52995e93b8e4c850f824a084a39899ef8032d9cdc7355ad327a48e807de956fc449063b8729da59bfd26053ecc5bb81f74993bf50f7360bd7d8acdc5943f33016c4c352d99c7f95f9ecfa7022020669729eef78487548a188280a5e54cfd3ba25ed8807615710848f1059a65707c174c6dfaa6fd5e0668fdfa98f1003b00168816a3139b0d8027bcac498bbe2cb0c1e8a4ae39661b2d7dbb2206751acf358e6b185657a8eaaa593c75fad6a599e734b5365a0eaf11b780ad704203ea81e4dc8aed91a86eace8012ee4b7ee24cbf2da5e261f4acb498af6b28660540f7f1d26bb228d932e9fd82a20e9a6088862307faff2bdb487e13244bbe3b5664b233f8804f246ba09787f9ae0e2b4a7fd5f7f3ed2e22de04ec5ae7e13f651a019ab501df3b621ad701c41ee8e5f9b23b27cd5e4e1500251186054a25518ade9a691676433833a2cba6342b60dd6d53ac74ec7c7214f626526a912d6ba0b7a9ceb90cb385ef9bf6bbffbdf8cfc907318668bbe75dbfd9005028658b7c10df8d71859f611ea70bbf8015d786e144caeadff1b9237e0fb141c96e9a4f46b2d2287af3757dec1be60268d74880b8abe19d4c14b95095675a7c2ee752179e609514148420e8354db7811755613e7e96755b3c7fdf66c2d4f,
+CIPHERTEXT2 = 91c7279c107dd757c8d6022d4fe7a82af86931514477207efc30a006a52f463758ec41f25ce5e49717d642469cc204772ca5416aa0611cdab74cecc55e86cc54a706564f3897e72b7dac17490ac5e4f2f8a97a9855aeb5ac99db33ff648657aa51ee999014db7f3c92506df2d1538cf3c57148bfc56cf3c932682d3ed41f9f02e66211ba6a2af4b5c559998132e24fb729744647b97e50444d48d9fa28e25885b5421f890085c364d2f396399a0c892d3b830c7581d5031d6e53c6b789570bd16a0378f7996c2d2fe5a145f3155075d8120958df339243b679dd03a0727945ccea1547ab1b01775c2c91bbec653054d6b4ac02a30e7bce307417ea7009378aec7a2887a1333cc1081e2ed1bb47d61fc5f1069fb21b60a74d7dc86e802146c0a2630e8ca9740ee773d10527250f7a3642623011fe12c7352e7abfa5cc60b8d5baa12cb999ec52cd4b279c6fe9b1a060994b59b389af677e1a3c483c9d3072b87ce6a90999b23667a95d113fffe473ef723ed199e0501d0383596670ff1c300de1c8cfef00e21ca23c59e9a6a17f10b3b77a9f4588f6f2414fa92b87e3a7efced21462da8ee1f7d7e7db39bdfdb71fb726dfda4ed622d537d950b029cbedd3798b2c37bcb71aeeec0f2151c754377ea26c6f1d2742de5536ad6a7f635d10aa816f9227abc646d6b84bb14d434c552db3c7633a9c403ce080a004249cf99cce011a,
+CIPHERTEXT = 7b2eaca3da9096fad8737cb4cd2b7171f3dfc973dc2ec2a699f4e6100c06f9409ac0cef6857e066e86c5c98d82635a2e8211557aa75778f58414d9aa2f135bd11ba4736158d683726530486c4d64fae8be7ef137f12690cef28e50cac2c73bea867891ba173b14e0cef7c57b36ae61b52a1e04a6f18d032c8fd5703da304701ba6e40bc29402c404522d639999bf2c6e7bef3469661d4b0124b0f41d3da43079d03c962eb2c8cdde7b019f7f6267606f4262ae9835e81fbe8d0f3227b069a31f4c4764cc746b5a0343099922b57f05a87bc58f4faaf3ac57e715e3cf2727ebf64b625962dd8cdc366cbdef9e1c2800d8cd10db06b9ea872f93d4928d44c92ff2fdc620aec02134ae5a31ac5febd7e7781ed1d05f0db1a4f5ba8639e02ecf8333b1478567ea7877649edcf58b7c3b2e9525288b82ee9569de8be29fc4db555d0c3bf945ce8c6d942d040920a5f1b5d10712e99676a7207b03e30ab8fc098a05b557da73a2aa5ee3cc029ed2692beba27ce7eb74dcbcb526c96324e5aa11e6ea54f4dc623ab5ac5db03cd954960fd49d526f041960791890f0a0d589d58d6b0622b3c8482ed2cffa65a671636dd87804300bf8f223983572fc47e74af3b9fcfecc2ade71657e4e9f0211d5992862f1049ea2b17fd12d1ef50061fa820446e103d3f4191d567ad5b2ced14aeebba990dc58797fbb1e21dc777a356aba0661215da1,
+RESULT = 0,
+
+TEST = 41,
+N = b72588885392ecb1c0153780b9a47aaeb6d77becceea96b5aea45ccbb069619eec9b3362587e5c4fcf9665d4484b64726fb46edb8a63fb93b51d9ca9e03f0c87541f59466e70c56a480f5b5b04d71c86b1ae754042b04d0a5a30a216c0fe27b900286309c92d9a1b819f4872bcdb23a2f13fa0a7c5012e1e17e36fa038d321678ef85abd264a7e4e396e8dfa2deaa389b74257cab13019f5e43ea7d9751c878fc6dc2e8f124484911e1defde46ad1d6cfdb5a10184cab88ba0c916ebc396b82cfeaa0a49d576434cc7aee3b730fd278484b8913366d1b38c4457f52e3040cdaae3bf311ded93454830efdfa4385fd5e9b794ffd4ab0a9a50f54f194065d82671,
+CIPHERTEXT1 = 56ab53fb2529c688467debb547f3f29cd3109b3a7368f77535447fece2ac775bb0903c47579d0fa26b56d8281f7b82f18e905a05899b2b4526154057ff2b10d47b6a09b15a3c4f5bad36634bc92a9b6a7a94079735f5a7e23f745127883bafd01aedb2efb165d770f3e0205e2c143dd81e94223e2535cb5a1027e873ba934da6c4bd564a93a0c7d11392a1e1cae798417d7a4acc5ce69360baaeccb1faabdddd3f72c0b49b966ed9179cd978a5483a189d52af36cd0e740713b2786d1861b753ec809d079d4d9f5ec2265f883791e4ed01ec87f401b0259a4774baa7aec106b0d35a6ad3daf04abef2696857def60f727e828eedee2fed53755be738612609e96845c88bae5ca530349760d8b6706167823b72ac1c94c21e3c12da031da03dc3d634392b9bd65e2c202119fdce7cb65f36c00831c0f2e3517fca19de408a8f40da8b98cc1e685ff95bf70982a891b2f4dc92362ac123a86cc5b058a56e49d85d54130ad072977ab10ae155b745e4366bb365adf5c1cb014af7dfc0825bde14580acd614d40b727fb08ef52ac4c6ad6f614f01af5ee18314686ad3846889778fdd019032fc12d1503e7ae14a4d5eadf27f18664975a0ea47205eef408030a1fe2d850ab64913d379fb9fc9ef798eaae2d4f97b2a9afd7bbdab3599b86c0eb609305eecd59b03635e58830259e26ba8efa3e720f6364295bd72df89e9b0c06b0a0,
+CIPHERTEXT2 = 2c1b58d0f63d6273613cc9d18d9861563ac20510501559e1beaefae401e9b2c4695db3096e63e351ffb96c6f6b5f3320219080e990e9aa2cf69660cac31bd6fe8872988409c16f9bb71d6dd2297e8e5b3c57e3c6287430bd187202d15d33778e7d72b300895a00e64783b8c754cf2f784f6db74de2f432b33dd0db1b4af9c670932fda1c895a366f3829c6dbb6167e6ef5163d9fbfb4c56459f97d2188154b815c9c8e409ca23208c38a159849974e826292bbfbf31591d15e13913e60bb268bc5a740263f794bb3f47ac86f9fbc5369f4ebc742699434d8fd82a1aa30912c44c7f7aa1960496e3c0bc3b0e79ae1113245fd7c4df7f276135aef1f31759142e210e83ca2e0611b14daff285d802a3981f47f78e1710b5b478dbd35dd28bdd602e72ec82f74b47c6c1fe067780e7a2f50066ae6d1c6f278f1c1914e28760b26cf6f98145ec5e0a52549d3de6d0a6d3846e5e180f4eee22d4702f29f32d0de3c76165a99461138bc77775c8d8a2cd78b2d98635157a2d7b264243f4f1edb7d4fc3ee31102f9dc00347a495d0a3014bec14ee416390fa58df09ccdf217f017d80938d2f1d9e1ebe6ec7418f3f9370e63fa681b2eb2ba4eed7a62613b5869ca993a61395b7a900a14f9f4a4cd091ac77d6eaffb95641fb0ccc5fdedd6f25e57c989d60d458538474c9bd0d093d5187b8d547b740b4fd203c2ea98dab7e7d86f700ec,
+CIPHERTEXT = 3200b39881364c08c7c1bde09dde66592c7fa668605c3839c676c8782f30db2aadf473cf3575ba5e07cd9c95ac4f4a60d62815e183f0b3a3e84292218f01a85a1211d547fe1c77dc6c797c2311f534f4e43c196630136fe69fe4380ffb04b8caf85b7df8f7e5321eedfaf105009df31440a4d09bdb036229fec61043a009cb713e906325ad522fb6a0ea3f674226b2aa3186f049c206f97e95458a680566a1b3ea74449e922adf93f1f00007bca0315d12494eeba0964d1b19621049e1acbbf8e2c98d821d1bd9a7df942af01c5b4eac8902baf8eeee6d4a355555b58e9fa1a0ca1efb4facd1f4d42e7825bee1107a4d4ce9c52646a4a74c6d1e76d3bfbc3da3a0e1ed24891e67b7586cbca213ddeaa12c661038752c0a80e7855a7f6b5290952c5c31dee2522412e058e1e7f7f5269769074f4c8ab5b9daff99042ee2c667470a5b9a66a5c62bc1bec5746ca0cb9d36a936a77d5041874221a534dd2db1fca0e7933cf93cd86aab347cce123803c34a178db8120665dfab196a578dc06ec6e8b314762b2f71f8a31e7fd08c5e7d2b6e7e75483239fd49a9aa9f457de6eb4d531760ccabc3ae0057cddbd00a1eebb97a08298ad4a1531861df8196251d8cca368f24ae55558b2de783a376fb294d67cf99376a9304dcccc4182e0faeb9966b619aaf3e7f5791a90c7a3d16117377d36f0532c1884dae950bbe3ecc8df7c283b0,
+RESULT = 0,
+
+TEST = 42,
+N = ea56f679b4fc956d0bd727a785a78c1f409f90f1e39d54e4653140a60da52b4dc868e61da8c226b9df2a90fc16efb370bec48bf03f08a9ac96c3baf56c7b20d918a50092570c227b9020892fa4d39c96279bedc82fd41e45594f0df9c250e1a1280f7106d3c9f62cdcef1a1e2597d16cb972f5b52ab6ff4116e2f7273c95ff6d4f8d164316b4a0e8dc8e2872a529e9ebc2e1464039b5b0fd27fbcfdef1dcbdcef46d933e96855de621a06624998d8669110fd36b7e278abc3f038e460bf77d6c4bd525a4e11d72d075fee8eecb2c46648289b58f2b24f04aff605d0d80ec1367f737f172067547d487f3ce42e4e0e8ef7bff04b35d2851aaf014c32ac440e849,
+CIPHERTEXT1 = 05fd028ce0a0d468dffdf950eaed2839ec778ec42bd176fa3b9649c61ba45d89533eda6abab86c28c795dde33d563ae858185e6656f0edf8607d86e6f50a555db007bc2dcfe31de465bc5768ddb324feb7209fcdfb1e8dabeebfc5db9bbca602c63277c24e8d4edba9a460c3cbdb72da56d61b7be84ac51e9b9641d7ae59c679b826f713564f6d994d892c19b87006d56d4be63ed25f7282ac274442828118da6e5902f8e18dde2952c8ca2794708a435ad9c24a70dee3e6bea84c825eaed2eaf1d6c63c26b916d85577822f73e01230b55704596b912145680234b1c3157e0ddb33a1eb85322ada27b57560acffbb5af47418122cf1a61d38b3a54ef3ac5904eefc9d9a31b1dc419eef2628d9d8e67e162f4ad627ac4899ae6b89836a46bf541871d69fd6a18c923195253fcbe9cb53ef3afaa3bad12e18b1b8b92b421fd2b57589982e32ee68bf6e402de06cb6e325fb1cedf1b91616bb2f25dcddd98e4d8ac9b61aaf9973ec18b22c99a994a3570047f003764973833158fd241fab3ffa7d5ac34db67083bb88669816265a98e388a4043dc36a75f469746f90032b2c315eba83f218b116e698a67a0866e40ec8ef65ebe77293276d3c386cfaaf1b88e53542cfce96672b256a8ff81c8f147514397a0c1b54882914c30805b675e452ea4bd0730ed0a2bb6a6fcb077abb2f41c000f0327d100fe5d10aac2359949f658032,
+CIPHERTEXT2 = 4f484a7851f08578497d8a896febf78407082b5c77ffec883bda7aa57f55a3cf4a0a14c70b4b6701d3e751c8dbe1bf841bebbba0d2a4fe42348d04ff4aa43d095d9d60d580ec0c2691db16961f3028632c85016dc3cab40950faaa199f0468e052c4b74766c4f2351b1c186d195a571cdabb7dd1051c691adc567c436443de4197d5fe827572d7d52769587914be4cfe01894cc3e1f8bdcb00c930b6b18075dfbd7bcb6fc4b2ee0b163fff8b0a32bc29ab3cf51d08f151c6afd8cb18530ea677c2a13b8cf3938666c15ccbbb600f27503c98b95fd9c6f36c3efd4578d1625e81d307763805ffdd13d51478a8bdabafc088ff991f15b7b2d1ae2ee3b3bb12fe41bfd6b45f4e1fee13b5754f5f9898457ae3ccc983757a0c2a82441afa7d3d9f7cb85e5b65cb71d20f5f4264b3e294206d07c46eb9190de4d27987d144b3cdffae415c0225b3a6345a915c3794284a03ce9906b8719a2b9146954d76bfbed0097ca91fcb9de06efcd8365bd587dcbb4a0217e476ee56598c8a5f6100054ff5e66c6934416f235cb20917ed329c84169e66aced3c713f1b3f51bdd68469c1e68096d1672afccdda8f1fb82bab21c5551c907ab4dfb19eec73213242c62b7e12de3899d5c6b1cd5a649a4e4c3b234beaa4540c36d2a5eb35406905782799e6a1c6a56b3e5860fbb1be11e1a416e4b0d3ff449dce8907435e0a6750a2cbfd3b2ff662,
+CIPHERTEXT = 98babb7c83e07011d3d79f4a39b4975b5a7154d6db674a43ea159bfb7ef57c8395b36d4cae1f22687f79b4a59f524b7088d3520416496f76c6f891c506f97240e90a515af3eeb7ddaa306d8c668bad5c83292ed9e280299855c15a51ddd4fe2f673912541b48c91034aad2652748814720fd2a3b80949cd5b0a5b439d808d4e480954e62c8bbcc5c8b187b9b10307893d83ae174224c6667c0f6f76a681f89fcf96e46f43cdd1f8de2755a241db135c71cbc6df81d6bd4375f877914533ae41bc29e1b9e086b5037fd7deb6de0adf5f5db241be06211ea9c21d55277901fecfad5daa4178be8ef7e79a417ea151450f6eb2e567432835b4dd2243377d6a669405633bd4f7f3f6cb147567ad85bca71427a74cbe4d4405cb466db0e604a0800e4ee0b10a199392436fe7e07192762edd606ef4cc4168421106847be3cf1edbe3ae0a52cff5bcd5a3422748133fe21c60f1d92e9b626cb004be961fac948b998b24eced4d4853a6a91e45c4262ce9537638e88a76e3a8598c398b465b6eb3d3803eb6ef9858d2e31c82cdc028575463d409300654b343066ed0f9cc3f2e823059dd005b1dd681df1df4c799d9aa886412639fe66c22a6164adb2ec78ebd987909a6238b574072aeff93bb6d95574f8beef4d9c11e184ecb2a623e2728b37212a23913627ec3cd65ac4cbccafe34fbbb8c1bcd7b8508366e0a82c3b4b984794fff1,
+RESULT = 0,
+
+TEST = 43,
+N = d29f8055d61911e3676fbf6e68244b0d3ed0238bbfbfeb86cb7b6a322d3bc37296b5e795e9d1c260a550408a7ee63ee197a708c5eba5daf201392124c3e6fc30e92fb689ec2a66506c257a6c36b1d4e012f85f3620445a5901efa40748ce95522f6739a80dfd7b770e49ae036f3477d340dc545fc36f29f5c7798a7700dfcb2966e9b105cf4fbb91acaf0a7a8b7aea8434baf9a99f002c250dc96015aaadd1f9518789767f0b047f22ad6462dd6ffb52d15fb898765909cae5ba2f06112574261d2e91e8384f49a2c0c7c8462673a4510fa1653c874f9b0500a56818d17e5c5f0de3d9ded5b231ec49fed057b925d8867aa54e2ae2ac16e61ff41576f5eceb11,
+CIPHERTEXT1 = 2982ee6d2626a03f0631331834bc43e61a5564b7117f6186cda594c19fa74d2b929b6027888b17924b55de760211f1ccbcc4faad8b5cae00a1f6fa47974c3659ef07ddb2df5eb2d76fbf28a31a2aa2346845e75414b4913e44b562ba10be4df0b9b8cba330c5554142a990f2e741eedd5c3de0efbb11dfc2e229b52f6873d755d59271e1ee8037ea43b5fb95fa4668f9fb89109cf5b664c2920a33995dca949a58a4bd8184339c6256c81537a993ea56030b1af92cc63ecf25da864baea569e82011b36dcd6f1331279e56347674de4db4933f16a91ab55676766e478df6da4c54a9117ba462700b36cab647f64ac1f7ef367034d1409dae0bf7748ded5ff916fd6c1ec3d1ce58ed0e04181a344547e1917ab4ae7a0b0c1859efe20d6ede73b17683e0302b96d830306c53cf075ae7f88a63a78ce12452a630a7ad5a7c9a3f2fdcfea296a36c33d6acf4dada1eb023714bdaf9dcf2e21058378eb57f0cf06830303bd60a27141a2fd93b9fd462f0d31339a4a847f06829ac82f2342cb69fff69238660df42f0eef38cb71fd98d346d1b39c96c4e993cb7dcb3f5731dd7e12b82d6b05b11e08dc04fdc931c086f5e6e262beef978f1a306259c30bcec5295ff067fdf8d33ecdbe428bb61df4b235f779f1411c9502b66da8ec243485f8191aba407650da95879811361121700d4ddc665f1e59e9a24c4feed665b70f4df2c8512,
+CIPHERTEXT2 = 85ba0cfb7bc7e4640abe8dd2435594b192f01241a7d6cc583707ff02cba6f8c16ce7bcaa2151888e2fca2d773de6eb311856c39a135ed16679059b44619fb3b5d3cd177ca201244b8b332df3e1b01965def9b6f420d92d8c4a65f8001776d92c793f13382e94fe1dd97677810d996ac70f328f1125088b3f997815f9c9a1731f44e457f9da3f084b331a83a43236909426e10233768ed43e247ab0ca88e45e1025413fd6bedac919fa49701f9294c0acd2593569481af98530d608e51754eaccd697499511c3b2a8e4abbe53053f9ac6cc25a1031bcc8f2c72eb6310aeae455f8c02b4ee46d718f12b0132cbfee420149e039bd1767de931b8939bd5b4afa9fad523c823d566847b5e673130abd7d3c108e9d6b6a7d968c2de473ba7cc7374d628ee83122d98c2b36a527b9070b085771e5cfac0fb717e43740391bd6d4372ee83394e8b05f80bd1181a246e40165b44427578bf54144eedce998cc1fe6029ce2119ff401a13ba51fadb6c040f6f61d3a91387a0f3b5b3f0803b6119006eea5d8ce553630e15b2ac2e5877b0fef323875f68240e88ed168db27633e333373409eef9ed400a1061b5c68624cd6c6ce790c6da8dad70f9fedff978e99b1f19b26ee28a846f9ad5f80ee6484d06840f5e3d27b056b23105bdca60132fc5522ff07c93a9dce32ba2e8fd081eab6143f70309d6c2d053c3fc0bfd6731e5e0ad97af70,
+CIPHERTEXT = 41f2c36c5dfe8bfd246d12276a32e663e81a6cc0be3fba007ce13321a4bfef40df67479bf240ac8d923de482c2c7507c17efc97858fc8c4ce38063ac5585cf3f50ff6409ac0438cfe9f92c4bd1eeca2a41f18276a9e4e7982fd0539e13489fab959d040b155ca0413d55c74a068906f0cd01ded028c5032a7eb828a8c53b624a6718dd21b7d4c2bcf20ecb30c97c6b7322e51d953786af7e2ffa2c22d00bb5e9f586d0a1e72b6eb6382df6b67fc97a8a454126ea24fc0337e682e6df73e1b60c00a620363c53156eb8235863178421e5e098f1bff763aa69639141ed5114581352a48de3f6c763dec48f28386519c61d3f4061bc90d46ff092a02ba53819a2bdccebad0b9c16b58271f7acf2202fc4aab4c9cfce0ed5a124e31a9273a567501b7c28dc64bcd59ac0726795e77a01656f993194f3e51f13b566ae30418758d4d7d22216a8b0b72715fb086551b4a6587a55bed82f57331bd6fdc104ebe4f7889fe1c36e569abc4beb84ec183297c30c3aeef4dfdf6f5f1c123c970c66cef35edcf01f3069430fa6ea96b2b8f63fb63a19c8ff0323a18a6e46dcb31781bd0948156881e16e833f98234a30573ae383241d247f1ec6e5de1480a81e11cfc08b79e36eb15c4821876652693fb89054e6cb1ef21c66978a0f1e6e58a6035d347ecdf7d2f3df9cf24f0989fbf22a49795fc0b5c9569f2b2322cbe4879eecf311aa770d,
+RESULT = 0,
+
+TEST = 44,
+N = b5b1386d8df649e0287391d71cdd39e46c055073f0e96b7d1487c4e24d8a4d5dedac129ee9e0b8c5e33fbf58fa0db91db910e69fd066090808a26b7c7ccf643f1cc9a2cc4a32fbd099dc12db2df0c22a1095d3ea15b9627d316dbcb1c8e765456c5572a02a20b1cf65bc9612f86f75e79fab45e972ab82987a974ab9433d93c61b25ce0db0da4a2183ebdf97ec11fb2baf1513f6d608316fe639a2b8402753eea6ac991e58c9c7fa90cb954b8dad6266a742ca557d2b8cb55a6b40d67ff5e3516f3f68656f2d2918ef9dcec5848387ddca8a01a230e696db0ee9417e2e1cb17070792ab5e4247ed3dda889819834dcae740ee278182c65094c2a72afcb7f4a45,
+CIPHERTEXT1 = 6f144052eb0b86fc6c8463b94d89e65c116deb61ea1864d201fda59d8535544a19561902304e404ef2cfde53461350e642b5fe5f0a7ca9f8a0a8ab37af5663dfb5181332bd0bbde1380272aecd939abf0b9856a5792bfebfae55e3b9dad1ef8dd56ca329d6b9e6a2df182ec4597662597ee05dc9efdf08c8cfdb04adf26e0afbaba5d348342d55718b4224d310a1f60c251b62187b42414071937fe86104e070a840e8d1c637e3c0e9093e020a84a8021ebc7b4d4b53edfecc0c2415ecec7c61efa84b3229282e682c628f50734dabe74621a18e339151d0dd5c1686882fffe8a530eb7f89709cb8e3ee0c640b383b8796f556cf5fce66fa95b91c9462f4b54848eca4a1edd68b25c69eec4de7892976015b5acd5239c5fff9f99261d5ac17a3d0e6812ec18dc31d9bb2c98a82de857e7bc772b62d2f328538ca03a4de4453f994eb103ae2671cf53520498fb7e08de1729b18c85e1f94798e76be02f29455e62dfe57e3aa1306117fb13287552070c851189c59571481257d15e64287e5c4044c42844569a1e4a86f5da99a557fc61cefcb59869877e2c108c12f8a5faca277816fb170eb88204c89844b32cc9794689ca08f7f862a72aa52b690b903130018cc5300b83cc940d9719f15940861a4e9aec643bdc9be4bb0ea53b0182fb6d2e71ec06534fa2f03046cb28e56c54b3ce598e1997aecee51ae4ca048276d5cf207,
+CIPHERTEXT2 = 2a9b8c4d6fd5286a3ada5851ad59c5e8b1a923fb417e9e2c2b794b9a5048b1fd569c061678904db2b185a35f9d3fe34e8dc47e66e4108e4b04f18931e9bd9948639fc206f7855ceb3d19263ebb0a56a1d2e707e553a98577401386a6af8847b7b2abda4aefe3df41de342d3c6906927415af0b427992f1dc2b8bb84a377d439ffc09c04a2716d1e8c6d73646f1fe04ab935e0f2f0eca434c9825775052fb78b1e44e0c1449a6899dacf028570705cf429e2182ab816a41a200137fb62ed3b1c5887c3b04898ecc16f998c486f70ecc1658cd16bc3c25f291b675dacb20023fc02f6960c67cfe80d5b48bae1772c8b7b86624cb266fe3beafc7f95fe768c32d703b287135eb3863e585679cb43461208089b3a11bc5d108a9239964ff46449de8c1f0cd6575299b2f7e87defdbd93bc15c111a9d67aed2baae5abd03ecb3a9d733e482f62982af49a91fc66b1a21bf437edb3f7ee35bea5815c6d2b35665c15e18e94941a1bf28dd8d8f384de9ec7d4a8abd192d853eda187c5154644b25902c6fb829d7546f0b0933827bc3c98d7bdf90bfeeb2791a0c56a1828741ce53c9128e741279a1d055db9f46e079d28c589054c20d26e637bf485e1f351399a0d0208eb5f266f79be56eb36af3e3c0db046bc5c89ff020dcb8fa056f516ef3dad3527b30cbe7ece05af639aa951aa47bc410f3112a7fa908c694c69a3fb1475735479,
+CIPHERTEXT = 37d72f3bae20d94860cf249b71b0e910ec3ae8893c43524f0b31b38b5cdc450ccdd5cc98190ef31124a32de64cf788c0ebb7326519c15e97d262a37c3226386f065c532f2826e7197d41ffcae72220065fce881654e18488ab9b27c42fd32443c05c8eafc1af365d110a93776b6f9a65d93e860ac1f439749f898afc92a3e400878544675c5f81d52b54e2dff356ea613098e05b0e21c9e67b337bdd41e4ed4171413e98d3a53865354a07fe192032ace05573d23e9352ed73c713f692aed7cb6ddca36d24e2e5574cc60a04156b94fc29ca93e33e40114b10a5d3302d4e8a37b021f5e7ca167214159343293f0ebd99429df81a71e83bb4a56cc3cf9d8e786c7945592570ab168e7cf5483fcdcb056e06d957c69bd1434bd53b62802ff20deabca62d2f1c9b58e29aed952e48ef4b3976c95a3dba5d3856ff69206fc9962bd921ad1b9026a2d3dc901cf8ee94ebca7ec74a3bb9360f3e76986938bc6b35a8466404a46b2f9113daece81f34a7ff163a220a8a1d573d2d01b47e5d90c7e7379f73f4381c17e2621b1c910eff7ab8aa459be2f7e77d14eae49833880ea3e831656a1b64fd36ff88c12c0c1e36e92b166403b7b3bc851dbc80fe1971e59d1e1d331e4b04e24337e127cc3be82bc0145914bffe7dd938bbc2a614c816a141d779eb14f8301a52bd218ad50f2e539963726d7a643220b38155a4415a9293cf8f0650,
+RESULT = 0,
+
+TEST = 45,
+N = c29f360e65e02b2892f074527a963e3bb4155ac8141019989c9d6a39667e064edbeea753b0931ef66614dfe5b64dab10f20d11862568290983d01e57f51b426dbca372e4cafc66740a3a2d3a5fec32179684333b4f4f04ebc8aad4d61bffa7a618bc42ce4c313d8f900fc98e7a9e580dbe6311efedb3d8cb2a8ba6bd246cfa21214924cfaf8b74a882830e3e14767064d2316706e703dcb93446b7fbc818e74462eba23565b61939888a18f0d00e69aa84fc48eb41f26eb36f539ed90f0b1657e9e88a87f2cbc2583aa8e453594eab0a2afa51265d4e3a5382777b463fb06c8a977c0e41f316daac52a0588f0cb121cc1c25a637afd5eb4b6bf27bacf1bc5a8b,
+CIPHERTEXT1 = 6687f0c8fdc77a8d0caa29ac757aaeba6119a050b4b5d881f350e8427cff8a33c64316116d5b698ceaddb6d1b1ee729cae65a7bf8cb03a2bd87b8c6a8d56752767f666b6c17188f606da2ecb89090142935be4acc20a2e944de98fb3b5ad2bb3538c1790042de56b0bbbce2c81641a8be329013bf50f62c7098750d284c7cdc3eb520bf2707fdb7bb1010df4bf9881016164b28bd2e843ee71985d763d4bb8408a94da8789d44f98327361d4bcbf0a1a2fc64491f6a39c87334e0d2fd03e91797543f9242321b45e14f8603314422aea98edc82b5afc6e2414b43b2742b1332125c95d45f70d4b7d57091c73b2d43324082b2ba3be8b32feb46b7d86ff2f5049eaf0f57ed938ee172cb9d66bf51abda964aedff1c82b2448f022c97469f7522af1214a29a602faa0e8376d7cb73b7b69dcbcbd19599f15522b18edefe55f20564efdffc65e8e5fbe229ddb0e2b80459e93c339fba38bf4aa352d7e1e55249a1bc376243230fa85a9900595cf1bb11b82172454baad1eea8ef92f69e35a4861d45327284780847d24c082e0a293ccbf212bd8b83329085a04195e99c57f4c4046e373facdc54ed9990a7dbd8831488201abde9d19a1bda0f4d07485fe75d056830a2169b6075b89cd573c4ef8542b23ca7ac805a611e6b511d8eaed68bf8e6580bff3d4f1a72017a6c354016496e0354beacce4bb4edad0b8bc0cf11124c6aa8a,
+CIPHERTEXT2 = 73a958386c3afc5f5cb8533c5dd9e755daa6b808e95e6decb80bc19a1a64d5f9c4a2a89528cfe7f22512966271bb844e41c7ec67dd6506ed08b2c72015874da255bd840a8ba1fcf33f16ed310075eed7f26552420f5a51e293d825558f23401918292b780722c649754a72e626d9ff185b1b77302e71f6470dcf518048a4243d2238fdf61364e84e0fdc62bb3a9bae93a04514b46d59ecfa0ea95a261c01a7b568c6627f9fad75da0f5035958c99e9628b8f0cbdd1d4fec1b9f209308c5466967d4f3d8cc0d78578663dd7535d81d1244f9a9fd3755198302a3df42550d3d5eb8b54715bcfa65faff926b75d400300a04c59d8d52865ebe61704b2c34e0f75832ed292812fae58a850343556fb729ee845c31b9ffec4a1e4b5ee49e49f13c3ed0e8527ed5be8bef63c29146d9e5ccf6c3356a02dfe88b1025305696432c0ddf9b5ee938fd96eacebd235869886630c2eb0a6007deaa7dc3c04d5cfa00d5526b36cf8306e1b2bd305a6d3fe221c00c38486a5b7deea404958c7630eab7576e16b50c88a1ac6a6d822fa2eb437fe860d40235033074102d1fe8555ff8af9ac5379d09fc16dabcb7078af856d65b15274173ff3847a6c7c11b2a4e02551cab57ebdeb9d2617365f72e55f27680687cd9396132a883961a790dc6703e7845080c0d024c02bde33515e960ca24a249dd16e316e97bd551f09eec867713dba09e9a9ad,
+CIPHERTEXT = 16017d5a269033be1df3f8b5a387173e11f9f95326f7ac23f11c7a65fe3dda03cb280a6af89948889729136050e7a1b2cc43007bd3d335c114f9a138b5d1471106beebe9e0d1d98716d2387ef8ff380750dee996fa983dee11f3ce8b124ab0e27c818884678e2e0d49cf272e44c7c9172767dae3e0d97aaced785fd201d590b7b0d578cdd0353e3ff72f6e67c3177335985b3db9c664b9a74fe8dec9099d48ffaa6717678b63bf3557628bdc4b78ea5d1ca92492ed3204fcc2ac494a563e697827b921d5fd92916ba15b34019272132fca6f41d48b1357ee12d767581c5bfa31cc38ca0a6052b808d145feddd424ad158f03e3dbb0d130e1eb2436ccdc11b9122bd7ec008df29adb256d10bf51966e0402bf6adf5294485fc505cde0e27e105f6b364bf9a89056ec9551f53b8121276b43a3aa1fafaa5da0b46bf47dac83eb633b8d4ba9cdf72eb8844daa10749e6ccb590c7d8e2e002f8fc5ec5db6c5d624cdd18a86941f1991d351ea8fcd9e33285ec907539a38c40d1f614e40cde88112310e9f73be34c03f85f11720b0f118a5ba9526926bd3308604424745df651cddc99e2c76aa52a904a9e151de9c152527ba94428ddba9f916d76eb5bcf2e13296eb4aea0387a740bde6e353058c374d779daac1ddf5fceb5cd0aded4019f9cb52ada62701bcc79753aecc45c6fed2671c13fce5d4ad9664995379f406e896a95360,
+RESULT = 0,
+
+TEST = 46,
+N = cc83b8073d576d7f14d005e1e80985ef130859e830d8fb8befe3188faa17036cdfb3804e8fcb4573c571ace567d70a67c1a866116d3f6fd953d23dccaff3797a37844593aa799a5d3ee48b503fba15360211c46d8f7e40beb8de5ef91dd8ab29c30b28d48d4e4f36989d1d4ef2633cf6e16e6d87c5144b426383fb7eb5941c6ad82df35e06740657aa0af5db1480f2e1119d6b51afc929a41412bd6f0a116169867eeb3664e6022f0a9020deac3058e6e0fe55d5bbf513d76f3192761bfd370d56b9de437ab8404fdd2505d2c683534568b7539d7bd2b2e82b1c8933f674734aecfa4ed045d52054a76aa5fb00c4eabe4688f6a6f7a3f702a9684f670ee3e2bd,
+CIPHERTEXT1 = 5f894e2be494628d06ba457646338bcdf9a849929237c685676fc078309151487dc136cf788bbb7cf36bcc162b517d2287ed358b78c12b467262c05b0f817750d0b4dc839f7dc7df126aaa4c62c00ffb79ba0b31eb1455d8e77e50794e118f8fe90148e6750460418c5401dabc3bca898943daac6f88bfc9711185abd4496668da2dd009823b368896b30e66370dae5871b02572150b58cb6c988026cd039b2532ed84ca0d36b1d35cb4aabdd276d4d17db62106cb717b40ce8b873a471c32c9cfbaab06f55be38de11bf07d54a7a7821a4186ea5b901994587841be8eebbdaec45f345f1d031711cd9e9d9e41096aa394f728e8617007148b05d1eb47e384b68a9dcb45f039cd8793683123e9cec2244bfd335264ec91f74b549e8c7c3b13c323ed2393b8892fd62b69c06124eeadf7e4130d4d4fc6dc5f1c1a62e36231eec61d31e1399ac9917fa03abbb72bd9fe760934304eff33461076caf1aa3e0986d5051d7102a2237c3d3cbedca4b6739476dab34ea0d85a884c70f7d1631c58808b3e9322c82e688112a9dbed02df5b822fedc3b84c76bca94927f1a160f1fd03a4497527b72e367f4d8c05746e20d7eef58a1faa1bdfa876cb39f8f8aab902d433d2f939b88c4862f56862bd37cde8c3596f3c1203ac8dbd4337fd3b2d0ce96e2c85b60ef1ba2adb9f4577987234c6d2f2a2adaa9b9e6c40b1196692683b4abcba,
+CIPHERTEXT2 = 29cd1253cffa0a99dc24d3450f9d1913589f25596d704da85205c2094c7d9e0b430037256310557bb2004f17e12440e110346a97c22d7bf673b78eea69a35bdc089e50154e63aa59c0fb28d22c547ef3f01185addd213c0b8b3044ce459a24743bb19703cf0ba07669521f44bc82a14db7d2711c35d99d345ba7ed5800126fd1c9153738eee87dfb61adf71cf519b1610b6e46b6145c1c5174ddb34ff31b5ef14c48a5766e9ee55f7cbcfce9e7547bfbe92a7e7f493539c3d7a9a63b17c6514f01a684f9b5f915655d74c04783b31429ce4fe5be4497fabc17c16b0add038789a1c848c3aeaeb5c3feb0192b34681817f9d24168a77ce72bd0404412ef1dcb39f77085928b1d4cf2ea65837c52a27b033af6187cfd91a31ba9c965dd5eadf2d8271465ad01ded8b435cddd0947484bee287568fe166d262efeab3718aacb2df63877fe1016fec42c8aa7c1b4c912bc6950f9721f64ca7909035c5bcc446d00bb8fd5a544f6e41bf082dcde8ea52b0219a6f061bbc4692ae6ceec05196ed958cf33e7e9e07b5d1572c5d9efedb2b23e3002c1b37b271aea38aede1c4a79a4c6e079195e63552a3d060f0776fe37b7c0b7e50954b36a0506cf14948a64a5e56a25d3ac3c70a6921ba7759bc63a582d2adc6e21caa600ce3a43fadcd6f2e1673f92e8eb34705ba7def015f9278c1a723ada774bd61569d2862774304bc4403cea2f,
+CIPHERTEXT = 7324ad9fe891a529f45c1ead59b73dbc0a83db22f6ec6e65657692bd2595b623aa9e24807d43e1463a99f7174f5baaba55e554a0eeb58a7dbde0d31ef101eae8ce269ad809e3572a95232bd7326161fd341a28c533967289a4bc479b512816ea9833fba8a356da38f80a7b36493726fab3d446ae865b4b8e496f4599e10ba4e7b8757b43e00a28ec6992ffbf66f51f90e9c4f44665ac137ef7a777017af7ca68f879d62db4c9f1802c7958ac7d19f14c7533d695942ceeb37a7f66ffea90ac5c13dd80f771c41cfcbe9f97919a3888ed66f25fdc79679b4eaea6fc51450e79069317a19907b8af695ffbde11148d99f9d36863ae7add3a866191a4fafa9e05cf712e122cacf6891e63d4c5e3abb6c9736e3ec584022023608ef11aaa6465e303a5e1214e4e453b87b6633fe073cead6de3d6490e244b32aa345670397c28d910fd5de50c62505bd98a0df22f0e7c2ed0eec25cf78c1ad0fde06c6613ce2dd76dcceac366058f0ab3ca3aa37691baea24e25cf3377eb2ae0daf4e5ff704a20fae61b92c376e51f91878b20c85f143ba9f977188297755d90ab1c92ed54eac4e66e5fcd57ecafecd5b22b5495196c76db92b73d4804dfa1b21059cbaba00f222894be62fc330249a5b5144d75e11ac4b9d5272d070dc447ca6bdf16f562226e6da1e8e1eec08093d12544dbc3d7ecff00b965b4eead829ac84f12893aae9fda660,
+RESULT = 0,
+
+TEST = 47,
+N = d26e7b074819574210f0b9721c0bf467f24a629e56ada20c8bcef21f47cd1c0ba98f5392ac420d46664412c2bdcf3274affa0638455509eb2d84058f3fe944d2bb1808fd32be9594103cbdf514f3379bd79b879bd4b24250234b2a1c73cd5696b022d1d8206f3490c3caa6ced9fc6e1c0674fb5d44775f18796273ebbdd90b1e1bf2e363aec78bc2da57cc1097c57b7c72ce82fd8fa453e7cb57d93b441d20269c7e7dea4ffb922557a2d556f63cffff0974598344e541d9a4ec71b3e7fa57af0057bd52cfc8548e23bcc6ad03951b8f8ce7d2de057999d121031318115895afc154c8a29d1b71787b29d64bb78f13a60260c9f8f331c1eeed1fc1ca517ca8c3,
+CIPHERTEXT1 = 2c88534ff51d8b0c5375f1887449664aac3e68f54ed555b848e0301d7b18295df0d4c20973b083b57e23b060b9d84f40bc11280bccb30f9321025e730e99e24f81ad1e19f44e66ed6148fe94eed009806b9ce6d94e71bfc443a7bfda3d0bd04d977446f1e97a02f7feb122623272bc17d32199f866901c4d47f4c5ae174f3566cb8167b51446c194d3cf483ad42e9a7ceba39d6d64e054f5c7f3b5f328c1a39e85634ce01102ee835329006ea6e5e2a4a58fc5d6ad85ee7e0a523c965b1111991340bcfdab7f35359294f889cb2b47b66455a350e7d2973b830a47a67e37b5732d745f0a6e222f5056117f6302607b00d0dd037ba0b133a28d2acccdaf6b5cf46216db39ba05c15abeffe7e546df549d73b4fc38eac4f27ef0941b510f1737d1806c006fce26e73998e40104d577314a6a4f5ae91911d5567741e18429e1ec65f1e1578dd0b9dbca289e5fcd9654e2c2b25801a11178e80187c8eada867f58f91c34c87b21be3a89f7cd4ce1867309972759ebaac1dd28319082c8131dab0022db49b2a70fafba72a7d13c221767d5d9794371049c1ecb6d81f21083b7f4bc05f272e71717ba0ca106d7e83da43db539bbff180d92b6bc41d6a373fddda198876bb99d97413521b19d5b534e4f1960f1d22057d68b1628da2bf3f0b73ac42996bf77227c6361d6151256ce71fe97c465c99237089fc72d78b2bdc5e8a12288f0,
+CIPHERTEXT2 = 11451ef664c9f046b2d7c7c4c988f8c578fec3cc62505231b541f6d65740e8168389dfc4f46afbd9c870cb96def00b88666e9e09e083bc7bdf12728e33378a7fa0698b49a1306b8509159212b50e0babb6613ddfcb853e3f1b663f8ee606f3d0cdb8ee98e8469d3564feb549e0c86d5e1f249efca9b8c1e34817e74ce48d793cb320b1aa69d49c5d1497523522f9994203dc586e7cd4256056333e3fb0dbe4ef0c127c99af89a351606c8c23d4a99a97e6298e8623c210c915feff9c5f3ae3cef7a76a8d52d1f5a4c529b1d4e56b380c02f5df97ea7e0f7a3bd0b56b4c75c9ea22ebaecbac775a46b4d5e0c59c7e59c8627069d3498f0af5bae208587f8acd08177d4f3823c5e539510279a61c4bb981c0197f31c62fc1f36bebfca2b0be4183723d6b3252a05bf4faaefdf4eb5e4032b596498ae410c0e1f1a2f085f580ad3599d71a0579e20a5c33e776107ca41d4df2df8208cf7f4b9a56b55fa3c320340341360126c26cd6a4007890657765438b77d289963fd4b8864e08f060aca1ca8cd40d07551f6663833fb70390a783273f84a86094d8e76304e964d9aa1b277e0a491c6b3fcf947cc68e634bc41c7144ce2581d0165195ad10895587497a947d7744c5f53445c67d7574df260bac5ec95f33423d4fa8a17819b639ca35e558152cbe1ce4b778c71b86d7b115ed48f7ce64164a329caa46473eb036cd0bb50e8fa1,
+CIPHERTEXT = 61e2d11687b5ee1eef6536bbdbe98e304ca932e131d8b233f748ce695da92e9df846c29bc4b7706c0bbe9a2fd0b4b0e5793631628790411aa4d65ddc8128211dd3d6e4b95e0880569294dff77267333fbcc7924e817c50eedcee1522836abf600811cc6b0e718e6bdfe938e0c5b3a97dc82e9ca5f39aad8e49c418e554ddd7152881adf786b38d0123d066bc33e51fcc9754d0bd2f6b3c28b590cc49b9115fb8483f159c5ef676d3cc0444a17a48bd57debf0ea1d43dfdf9a49ce6511128c654a6d7a700d666c8dd3d819c4e4f202f57c631c9da111e9e340daab388933b9db55299730986f4b20ddca93bf6734af90ef313f1822bf3323b6ea47b7696cc5592b4e8d9f62446d4ee213048db98349a9c1cf15a4a74b2779bc6507c4084cbb574224817ea41a97d3986d19270cdccfa60eab3d487c1de9bc092dfea037ac05ed8751d06f661bc85ab34bdd42408d73890b19d7cbfa2de7fb4b58e58453b12265140acd6943df4647fc769d6a31e89860c8013ffbc2db4d46a99882789150c988e984f0fd07f664ee9b00537c6ef7eec13de4b19d78c9693e52f28dc62c3137c8de17cf30047938a75bfe87435b877a515a561ef9f335f55fcdb6e5874176e7b2c85bf6019b37082fb69070ec0691f900d229c49f46a2312d172dfc9d8f2bafc4afbd4e89bba60143f8a70c0af8d2290ac74e0e7fa47d488a1c2c38ea15821b07d,
+RESULT = 0,
+
+TEST = 48,
+N = a965f9ac65b99d04eca2fb61dc47d24e72f1c8dd3f5646d2bd4a5892ac250dbea022610156a53760a7fe0cfd54eb475a37327d1b7b94d5a632955fe6370df1c41f95f183fa43613d93e51763aad6fd91d3a2e17b286deb5a3ef0c9f9c3ce721565dc835c75e22e5f87fa797c45b0664de2b2ffe60afc6cf66cd7648d55ad524d3adc49a7da6e041e199869dc08ab58e09c418da1096c1e742b049a06adaea4d55211286b30ff1b838eb2810ebfee20da9af0bcfe018fd8b3afff015e5392cda1e186cfb6cc871bfcc3b01ff238dc8886d65b8f8426d820269ea61ff95dbd9b44a1de6d48f5fdb05c17ac9f49dd6e9187b4de3fe511e64805c94ff9f002801ad3,
+CIPHERTEXT1 = 557a6591d1feac6f8f9f9493c9b3443ae8a602b981ceea31903d5f9b5d315c1af476a6e70038ce12f6fdd72e3bc2867a66b3fb3e521a060a86c6a2b7b949847b31c9bdacd7dc40e6bcab7911797dbd029b2b3492f193f4935421439521151e97cd00aec662be349830c6112c37658513cc1e979a8390886196ea7a8abe67286e9bba6f51d93a348955cf4b8456b79b3d5e11eaa494dde89f91d1fe17fbf47a11f8684f31a1b5d33e570cdcda7b317b9683f5eece10200b8896de22118bc62e069e72335bfc59014e9234fe77e0f9b0c2cdd4cc69d7b24a62bbe790deb916cd65610872d73316b9a31336858cbd7ab6ce9bf29791799e667aa0d9977e13e909ec83af4d501a552eb85613636ea8aac4f4a7e31965f8cf780add7dd1efa97bbb45acdd63b11be24846cb68bf86966b470421e022aff1e58f53ea6276b3b40dfff0c4f2466660e34db555991db69736ae88e69e22050282c3a7dcebf214d4b78443da6f4d27a99cda0fc4b770d996296ea3f9e37edc203e3254f3ea2a84d314d3911fbcd0c24beee0d7780de1f81d8fa1562ec38218129b47764b72b98ac7a13d3078ba2f0831c3e3e13c8f3a687ebebd826fc709a1ba741acf852d01c7e3c40fd48b12ba65f26b3ea130fdf89837931e974100acb2dba5c173ddb0e39177a7efd6606b3e0632c810780afcc8da3a9a848d5978b27da053e02166a36d6fe175c5f2,
+CIPHERTEXT2 = 4aa0d0f93f83ed04b0efff4796e2433e44959a7c7ca2f122dfd44393170ca2ef33d585d7578eba56928129924738975c2c0c92f52a756aed131888df0dba20631042a9513e94915f4d9061ff342f7782c9fa108eeeae723de7b12e7e8212c11e02449c40e9e3ee675c744caa207e7d01bd9bcbd23609db5cd0b853365f1e8e9fa7c925e4bb27d6a628e50b940f2e02cd42330e9fcd9eed719d0a9ea4c70606404d4802c63beb3d2f7948901e0239f9347a09c980704c5968082f7151f64b27d201f10a65c5a6b0b92fd52031553025f7d837faeb83be9224770aca8fec0c6433b7148039514186a8a01c3fe73e81bd219a28669d8e84df0e5bae51e1bd52cc24f491f1697e2751bc856a958e1d1566d8c1a3e86fad668eaf1d2b43953d4b182889903f2c398213dcf928c60118a86b70d5a4eb3e5a6056df20f83c3d33645e785fa9b6391cd278c9aca9d0281231d81ac9f87cb007c0728b6163664e191d9f871a79bc90ac1abe2bc10e75048e7a404fcf933e9932fc89a8bc26375dfc3422f8b3d39f07dee5c8c2fa73117c23f0f2fff012bd6a900b673f5583934749fd36b23ad18284b2efe7186b465a77307c35ac075f83d9650604bbdf6aa45c734268c6fde23c7f612be2847da10b4ffca2f370cba02c42b662a0f927d95694dd58d71abfe06b7551203e838d24f57d0e7738dec39c40ecd72c50dbd33b4bc7348de74e,
+CIPHERTEXT = 4c3760542d2bff8b2993a82ed9c9fbfcc3440e6a1a8219b7b466476f67013b329848b1fab0f1a98da1f91c774b737c77d44710a6a509f198a9ac89d08bd9e4f0d94c104041f6805ee3576ab98f12068109bfc1237818515c02c630a823372aa6e861a30b68d19bc6e3529e436e2a4685b92de371a24cbaa0c92f0b611a5d45d879b2d5ab8fc16c6cd1c6417a9f456475361d9eaaa9f3ab7ef722ece3cecbf91f6f196bf917b0c6b8e31a8e0984d52fd1fee4aeb115ed016d3affdc700e3fac280ad2391f70fb2310140cd1a6dd2ddee895b7e07a686a64da2ed53a5d838c14f7c4c838d8809a8d4dae9ed1e6af0d977cecab449aae0a39bdfbaa470312169c6cb5ec2e62e087f28b93bdb81d041ac33ba270697adab2c0ba46cd2f512bf94d3007af5d7ee567f11ad3aaaa4b47310d4194a7341bca63145481685b155978da3fee3a4c1442906b83fb7d02f203c9ecfeb928aa5dc55eadaaf4d7bad2ab94573ccbc39dcdb4eb0b1282b59c7ac70d53088487ebed7f2499faaa09a38108dd93b7d279f722a34392b11f1c94d1559162a4dd27e49635c464bf13e21c8bc3f3c5e49df4881dcf68dff8c3d6097750040629d44b15fa063ceeb0b3c4141dd1947c1deb9e272ee8389c562ef3a1212f68354971051531bef2e570954ab5ed7016c3a85858dbd026db26534e86f1c0de8ec1111176f331738def53afa1c9ed48355cc9,
+RESULT = 0,
+
+TEST = 49,
+N = da7f78f72ebc29603db80ec6039b8e49ab92474f60377acf1e682bc966093dd8d5403c40b1ecedf90e3fd158aa16c057f38485bbc737447ca3ac3ef5535615974e3fc35ec6fecfbf6df02522e85f24b22a13a8973f683dcc9e833e68856e4e8bec5bd5774763b8f8feacde2c8afcf2cf82f7b13fe705c629db87fac6eb136853888c13cdf1e84d68ff1a6a62013b2bc1d71723f9215d94975db179e470a37a9697ef3e06eac36a38dc5a20e0d8a1a8a413aedba0bc9de40490ede3f75bb6f786bd150465f90af6a185f62bc9c1616313af5b1cb7cfc4e344b1d9780cc13b46c9c18ceee59126ff072e352c645a295bba588e7d3a554183a6f3d0515b52b9559d,
+CIPHERTEXT1 = 8e84b0a118cafb8b4700f7f0a13406356f7d65b5c2f61fe5bc6184f0facce0a93a17f38c68d2484b6387645125d87cb71d417c83b56f8c5374c79b68e77bf4e0d4f24db2441976cdd35e9b87502d2ef62718ab9b5680f2a9c6afdab23decfe268b5e0a805bebfd20ba73adde2a25249f9e86ab89cbb5e02f1f5b979ffabb8f1c8b56947b56fd3a90e4e8019bf5c58d0c122d4d9f4263d4f6772a73d07b220d066e779d6ba524fe6c4450d191add04c1f9bbedb8e1bbc5d1e5e84be1d8cadb869abed5a057de1105662daa5b63f71e0062070f8fff98b0d08d89c0e27d3fb8b9817cad5efac508a81829d63f0e5ee5c0d2ef8b12e7e33817903ec7632dcf5472441306d8aaf744b8bb9d23dd90572cd3454f442a98c6e0dfd17b7b8864cae09c91ee7356c36fac22d5e4e5a3df25a4e02505d6a7929319fc8924d32e3e3efa1d36e49dca0c56b1f2bbb18a4cb66ace17dc884ddd6b268a2e5dd0706cb4c3b2e4ab58582a72c1c1ac14bac0d4a814de1974e934765705afffa00637337defe26dac2029dba91b8f74f09d62e890ae6161aaa7e3573a7d2c907373162142b228142e9e51ceea4994037fe4c5bcd5c789a6e0e07f6cec9c238f374f268385868e7b89980b5f281c227f806b17fea25ed2faf475823bb30f1ec43ca38103a62651973d213eae4b62d46980ebfcbb284d6ae7b9b43eb21d1c8a9577b423f50c1c6abe7,
+CIPHERTEXT2 = 0a61f5395060d970777ce4022f4fd3fb111af0a107e01e2441306e23601e1816ea60aa3eef9a0af206dac5ee6a11fa73741d8574e09356fa6db2a766207fcce52ea0cc290924f06dbe7606d5c9f34095d5475947e7d123b1677f95e38d41e1faf7f5c806361c59ff0b2cb536e1f4074b17dc7b856412748c4047b1f73a8a83e6fa0691a0a726460de602377b177f1b16c5bfdea39ddf30175ba1ab9873057d6d02ef449f6f7fd78ac2cfb6705764fc2a05fc1ae6268d436ff62ed535d14ec233e0c9437779888ca0d267aaaabf12808b2cd1a431d0746fb191250a441a030a6d09edd9af427ec1b4027a2c8118ea3332b3a79aba4c2b5f8a750e3e1650f735466c4a1d10d33cf2f0400072d757ecee39eb478bd8c4fdf64f815c15b918e210a27a504c44a3ae842711228a95ab25328860a6e2d90fb8b10f2a174322d5dbe0951a9d6761bc9cb2f4cca257babc5de739832edfe90fc071784244638308871ee1bdd540394b2ed9fd7a6c578995d4609d4b8f6937806025781e5e533845681d29168e774cf43e147449824a54c7f7c9a2e08dae5d8906146c8681d5d7122839bad7096f29ce8b60819cd0c8ede43e306edf531f264273a04832c535dabe3fc0ba020a9087f0f211cb609ac7ab1fb60eb3f9e30e2dd61b7870b6c93b3836a05737c5d5b7312bf15d5b07ded661b474684935591eaa005e10cabeb4e7e0e41389fa,
+CIPHERTEXT = 0d6f8974b94342d7101802ebbdd89cd3ff667a9740c5492f84c6f8d9ee6e5c3a3a59da46567fb75a1e403bd7a8031c9905bc38debb5defcf9e73589d8e71c0579971a23fe72052ff534aa8347da97c65e06ab4820a3c73dcaca061a9738fa60fc60dc85afda804fe50bc49853b868f9945db99fde2b1d779e808f13aac46c66ffd7c2dc1ecbf72bdfd9159543d1b524bdf0f9e62f229d1dafc36d80537724da2124868a9c1984456fc0a8a375aae07698a61c441073eb1ac4163b6821e7451ca644c773d7242cb2d72d15bd243362b79a1b2f8f81281337efea47959fce58af8a610c93797e62c3d03ae28fea910c232044fd1627ee4d1cc1150eded94b801474717d14492227f0ebd9956f417802d25a206ca2e7f5e95928fa28b1d00e222f2764667b7a4fae01c53beda4e268ef8334e91a6790eea687a84ee4c65848c64b8bdc042c7255f3ec7b0012f1f34ea00e0fe3cf6071a06c545472bba4127f0efeeb7ab021a730610877dceb36f7d88597a130da76b772e37a381cbe07ee57bf425d7c49fae946019ff3b8ba7eb5b60d4271e466301a2895dd88cd132f33c3ff58ea209537d36b9abbd286bfe600a57a23ac8f5226662e9f3e862df186e430b0a02c2cd93d6482e2b89ae96668d08edde522b21360e672a7a3ffcf36699a63fb52a0ba9e054804b6d711419a15fff00d7e390eb6ea3f998e7734491904829850918,
+RESULT = 0,
+
+TEST = 50,
+N = bbf5e31d9dab003b5554fe088427135beb282f47e31085e2fa2cad6ac8297d1e04fef871a3a26da4a7125862034905972f6146669444cf09864e87540b1d1f2187a0c6d7e9809eb5324ea1774eaf3df76e72ee5cc9314d29205b1bae181261e31e65e56f62ee2acc6747ce622e00b7af66199106b33694c28b269820ca4ecf1cae7e05da6b0ae932a50cb35fac0a8f74380db38c17f3a1b8a8312891b8d95ff70eb88133f05bc6f9faacd8c4f3736873a76182f302cc9abe66feaa750d32240d5998fb0a8edc455c504408fd20950b1042cf6f9886842d973c2bf0e8c009500158ab19d4943d100c42e83fa9176757fbe5992aac89f806760a3ae473d2e1ca93,
+CIPHERTEXT1 = 8724fceff3d911e5360e489ee45cdcf3fb53f692ba11ee3d3d02e3e62c80037973da4777d5a7f7702ec1428cd6df8e78fedec1f29b8a6d1ed05a224f1eb1e455ca03a03cac4c55a012ed4085e062bb58753bcb812c731f2d4b186490fb310e67e22f3a48d307084b1f7c2a3541a06c849c5e18b7ff50b574a302a8547268eae1cf3880c0d5f03327b1d6955d9e8a986d51e88469fa16236d5905077138c62d662d48c21f6d75cb45104afabcac94d664ecf263256673897ac96e25541e10bd24b48706c0b269b58198d4c05d0559328727e7b983f759f89bc31388c6a01015d37ab28d9be9b85b075fd0b078d71cb70c288a1cf651774e28d31b03958c3f63ff0c8a0e1361168aee3385a7502c63cfd2cc03481796e215d1d4d466322527bfbc0be1c38c89e09112ba42e041648a7a369659b30cf3ecedeb11b390c198e0c7db856ec46ffcf8d062467e211a0fa9d7fc8c41f5266f8f99d8369a949a7e53cdb3d63ad57b974a8a1c214ebb1828d598df0595fd17482f870c471897f0c3688ea3d91296abb86cfda1410fed810cd0c12c153a779ff59239eb346ac858c3ad435fe01f776d5093c12c9af24d0488ecea1bf7e7a6c57c9cb8883f721f3217dac460ef09a414991f21d38ed62fb2f1966febecef054625a4f8f89229238bdaf54aea8f4c9a3956f252a26320d9d52224c8a72ff79a7c0860d720e1db16d7c38fe3ad,
+CIPHERTEXT2 = 1d19e56fbe6fa88f0d5866914251ec3fe0457ace89f89012ad0548d976e6f906905b6daaa556f593724255e208c175a72147c6fbcd3006b774b24bb43b18b813527fee780167d2538cbe080af552f82306b5d1a24b314d6a798c230f2f8803f429913ed603cfce1e1a0bb8f36eab38eec76b2ed3f0eb953d88ee06ad00dab794ca3d0c41c6d4a66507ddf6379875fb921a265c14ec5dbbce938be068e894a186e4cbed3661fdaf363c2112a1173b9991b1e364d6eac0d59d5bdcd28875751c731b882137b914e3504833b5d6dd046c7ffa39a3b4452337111c577e648be9fafc18528478c2bfcc0e49a267925d8bbbb1d97aa41205602463466b901fa331f2899317604eede02581de5d5433a4f00ac9796e239a305db471009566330a6c4d817ecce5986cf7dfb13d5724643d18e8b8c219ec7be74cf3453750cb4c19e173a16ea5ad1ada855d4ecb6678c5ad91c6155200b300924eb31526e9e61a3e4397bfd86da7653a5002e76b09c4849caf03da8ee2c3c5951f0cb8526c620630448dac62dd2efc98ab064d13c4b27021516ab89f4709e4bdab7d4620676dbb5eefb8ba80d378e7a9060da900618ba89ca41cc379ccd3d6e3b5310dad2147f0cda0d5b2bfd75a0bba8d52fc0b8e1ca59a427ee683a6046d428b200ef7b3a728ee4dac331df428a87a9c898cc28e454487fcd6bd0eb9f0e5c9e2870075a6726d35ea269c,
+CIPHERTEXT = 6aa0fbd2d8f4e8e4a3cba64b4a9911a2b6dbc293f1846cb4053b387874fa121a2be3b62dd52a0018cd0acb747a64b64b131167031dcd61e00794a177af689753cc4c9ef5f1686c388c82281ca234a70726271abe8670bbd488cc703362a1c2d9bdb36f793636ec2d81ece300975339eb196cb7198104177f6c16d6b3ebed7b7bb706757789a655a65066f131f41ab50e32695ee99bf753f2db968ca4def1e0d8f244e0b4d345f567cd1d355c774379eb73c51700f1d9de37ae33732bd5bd11eb68e602c16b55905599f402306a101154eec12320ef1b30ebc623f7105b71be1b8216038a3bba19369a18e7a8cbeb9e52e31b2a319670ed1ce3667f918547932c1d303b37a190ddbbc864fbf40e524d57199b99541bbe69b5e4bec11595d25918702f2da1be4e5064bb21de141170bd68ac26f3f4d944704af6edc1edbd5e395c34ef6c062a4673f4c1285a800116a373370a091253622d42913b744eff851d477594be560c3c527a134e674aa3ca9441f85984013a60c172e7c6aa23d3d0b25c892803d2583d88e81cb74cb618b2dd9f357a9d2a3b0c98ad1dcdcfdd1285c6652acefc45ff6fa2b6f61aaa733110ae3e7c2e7847259c314ae3e27eba00648c9e5c6c17d2d328027474c3b3be3a5699d173a50d67bdeabff0f4fac4f0c1249715f45a43d1db7e6a456801dc9387f783acb174fbc47e2b5eb9ff60e8384ed3fdff,
+RESULT = 0,
+
+TEST = 51,
+N = a2f09d87cd39d0acdbfa9ffcdf2c428cfe3d14401105363f5edd0a21c93e3e66376de8331123fb6f309cfd148c447f6e97f5e752860d54ef350502083afe8c8825141405c2fe2e60b2a70afe8ed5bd4663cece835a26f054410c0f86840046f342d587fd65e1d8166a00f78faf0b0db8afab177f4d0c000153d6fd3279b98585d7435f0dbaa8a578e02850beb03be70c7ad8ce5ae3385976330015ef6f2befdca5717d873320f5a548398689cd7fe83fae85abb439ceb65734c45efb3a853a68e9024cf0d948545ef50eddd870a5b3fdd5a609e99e5dac1a385bd6216e778d022ad0d7e130cef912e8178dbefc08fcdd331baa286394d96cdb5c161207e829e7,
+CIPHERTEXT1 = 39a63b4ba352d79cdb86837a3cfbdfdd4fa09dbdccce47fcff9703e4e713736edb30e10c21d4025112895d858d5e466ea1dae6ca1c27668a59f9722b5880f6e51d06d2c3529339751350a5309dde0bad3d2589b6e201c1dc6998c04421e79ed06559d3fe756cd6a80bf0f2ce6a654f17baaf604cd4ab6fedb6af8874dcc5a8bfb390bfd2272021c7fefe9f4a1dffadbbc74250d4d1b2d7465538700e7fe3bfc42da37df35f78467c5b6a80fa4ffaef7f3418ddd6c5da7029112fb2d17202d9338542c9d893f06514ff821201c51379e9338040248d6b5a1e8e5650974790f0d49fc50c118e7ff5051666ba16c80880ad19a056b93462cc7cd018c4ba2ea4e7a2b812a8d796dd546df812d65a0d851d8b1c9c14866b5d77810cf9ae689e2ec6acc695d8888139b32111379e02eb7c5b0f4adec06d79c0d9cb35eec1d8e9bff66c55abecb9f53a4092c9be78fa6ed5ec1a0170e9fe3983407330cf3219fb25eb9a538cb60d6125b2f07bffa2554bf06698cea04eea6c88fb4909aa8532ac673de59fbba9c68ed548869057f154ea853b66f0b00024726a44de5e234455a41efbe5ea504acbeb08fc18fbbbd79efc5b9daf0b8e58ed03cac53c87cc2a5455f0028d527021383f3781eda9142f5f70741e8aa2887ce862e7a691dafb1fd561d5f94883c166851aaceae5d536767d25be95b7c590f446865f2c99bd21dfb2cb973ff8,
+CIPHERTEXT2 = 58c0a0aea194d4dc5af15ce1bf53d26d4791a2915e377201bc775b8f3b5a75eef50c5e44dcc9140fabff3b7a53b0867f3c10959a58849fb6628840ae8ae4e3609d5dfe8953b9ee0a8ad1e51f5683591218f2f82a0139ee58ba0ecab8b8ef847fbd9a128b061d871435b14fd44eb82f51d753ed3141eae99e2cbe26f0ec38c3f781faad3c9acb9670c5552df6bcc86a7527dab67ecf6e4a0a34c8ed5b6f9e918bdda53c3c7dbb9145fcfc5d6bb1d35659464671c4eab64477b0cb7a9a6040636e05995bf3ce675fdf302176b58ffccd761472e79d85851fb19d764ccbf431ad13bfa74e8e2570c5a8dc61e4bf16c570785e854f2c3b654ae91acb9e0f92c9d2097b40cd791602673ad00472b30141b63faef8d76da8d3efe0e4dcee745247cec3fb8fb69b30d57ee12edf3175686ec173309a8332230b4129de0f06ad2bb00f0469373bc06d042edf291b341e0bd8f2c1e6d3e719f4f77e810a5ab7dcb26c26289b3fc4ba8c37f863e15cc1e9128319848c1f63834f37a628ccfc9dbf89dc8aab4c41ceb71c8cd1ed8d6df5c7aad441cd189f772801f830846232bdba141529c3e4ab3080f2f238e74a91642988305aae99e4d1faeb3eef21b61121c4a8cf3fbc4d28952e1b34d595ae59243d9b803c77f7f72d1f0b4755697a26891fba6f9080bd55a6b9e6c348c3f0b683accc5cf91562cf2f8a35ff29f069050587a772ac08,
+CIPHERTEXT = 1acea2ea43ab3e7c691c3e662a9c5e4c55494e1d9da3933695e7f5fa9a9e1d90c6426c8830ceb23297a6f01b48d6468096594bf46bf9b4326362b45a0fc53ebc9046cbbfc5cce65b4ca1b4cd1db1c16b3d93fd876ff96ed3e11ff205346c2e4d84134e6429ad2ee15ffc95bb2706e07f9017580bcffbb17a18d4d7788035caeaafecdb2b5ebb16708fa40b9d9a89189ce42affdebd27f2de88c60c28e506533298e493fdd9e05348a2e95186e8b5e6404ee16783290696b74e428bc41bc252d6524f195d8ff73589dbc8b3939e8ecfb99db2e620a2c0c370d365965ddce0c9af8c72c41e3d606fac33d6b4eb7604bf7a47a7be0d04776f7ebdd77a89cb66a5ccdb54ce43cf57a3fa1c528d3185f4441fb71c3387e4f63e1bef962cf2ae0d57d207e1c7ff50aad8f50472b5dd49ed63ac881e9ce5c268c9b870dc4cb7b8864e7f40a6e4cbd392e9b700b9bad86515d0edc80fa50539fd1b74173f13fefb6626d2c36d0907dc656686a7e940641132f7c7840675cd6bbd19c7d2cf15902d135e71c89c6f8220101a648e99899bd5d1817a53adf2807d34e04946054ff1a55fabab04bdb1fcc27cc21f433c5fc4ece8658c380f19b838f49cacb923e52de1c9c38aeb74298d318f72044b028bdf3ca5a7654eb2e3f7a1981be534f93469fcbc2723c9d899da5d66db4c467bd3e0fe92fca3e5bbf7e5bf1d6d7d965498d694676ae0,
+RESULT = 0,
+
+TEST = 52,
+N = dc36b949335ca2b19d79d6dff0036453c29886d88a1425befe3410875b755c39e08281bb8213e052229c45eb587d8246a99bb66839bd36236110986adadb6916786e4302b4a91041288761e4f60e3e650ddc9b833d3cb3fc209cd879862e113a716f0b90903e74f7cc4f63e8f3487d180b8f3b67cdb3a69cb6e27ca015ec57821324cd24d19f11c96f368e7fa993543ffae986a1260f01dc76d25831a38cae77317ff30b8d62ac8b073a51e6a06221460f4fcbfcdc26353a4cc1372e5e6d44129c63b141d91c0f9519f9323310aa7fad9dc182e63323989ce4bb78381e07b70e73f97de2c02b9a1bde3d6524c743561ca1f0768c8b244e5ad08f1fd7fc8e3fb3,
+CIPHERTEXT1 = 1a1b4d74ebe000da9fffc544d96f41ec896e60aba1184bfa1668ce78d78ac0744d7f2cf96646b5a765f3e1e41282f6bd92891c0ca2242552faf8eb1a559d5e06a05ac090b12cf8689d3390e29b367b20cfe9a795db01438df2eba652261783a3521281b21101516daa1178696d22a5f74b510de2104a8907d11049c2934cd05dbc83e332abec008322567087f41015e2e580e928890a84c3749db103abe91cbc0b9f34cd6a7f72700473927829f4a9d1468060202350862fd44b47770565623ef1952845daa506076e9bfb357d086a31ecafeb9fc043d669e917e9784a967dca28c9a5d299b94a9b4a58a3dfffac2cb050cd307cd8ccaf14021fbfd94756c895b06fa25aa0cca23d64114bc496bb3c343d75fffa5363c501ebc7949b74bd8954a81d1df6361632f9d6e47af8e8df8888db67ee26fc580347b4cc46214f1d55fcd1eaa3eccc44010df62a89a121889b7a3339c088bbb6413735c52c48edae74666e80c91c97cbc8a4906d7c5a937312d78ef57733ffed21d8642c0224d01f095759ef406568bb49843a98923a20ba2e799da5822c7fc8aa17954d471c4d68751b73e53ac4cf31e1dd450f4c511f7668a751b53294894793bb4b75c870f2ce7fdf113e6bca79507af3be08f14868624913efddade5d91faab05a7184df5d00f0d25eb90438d832fa9c13807362ac09a566bc8e87ff4904098e44b388fd63720da2,
+CIPHERTEXT2 = 291e0a234a7ad0308e678a159cd46758252778b1cffad953014c4703e4e8946a91c59c00f0a6146c4e62fe6cd271bd350d8fe80b2e87d48d0a100d57f20ddb6eb041722fb16b7e75898361bf0b0cec4f72b5d643ec64289d33542d91258a3f731013e867dc5c25378ca569c34eaea6ca5a75953f78c3ecf9f4ebf66df36643b0cd015ebe502b6a85789e14a719759086b4a94782c58b91136482a67175469ff0678490f5a5d432461be9738b5cf0491b1a854707482492fe90f6de47416beaea8dea056b2dd513623a30504ca18035430c2a4467c4c6cd397caa91641320b6385f61a6341fbb56122c399efb5a6cbd19d2bdd53910edcbdef1612fd0a3838799da3d7193f8b6f2dc64ce3810b6e65fb3c3dcfc0660e564ae458569dd51433045ae1dbd4f6fa4205b9673398199c485640f67e4948e51dfa77daaf9c777de9957b4a5b08526fd30498737f81da16042e159f574053c8d3e3bf4b70b0c1491eaa4528ab7f34b7c5bb71964e172ac16c85f5b3395a2f6b53e52c9cf23f04fe314b45844042cd62baf8c654810419de06b49235fa6ee9d01677c86191ee4c2d6997dbbe389ee38dd339ec967b11578adf30f3c2d16656006dd387b2f9918b83f8720ffe7be4d409941b26d03d5132215472bc8d9ff0708c9128ceb7d124bc570f574c6a61a49a74eb69b038972319d4b685562793b51362990c88c3a8f72d9ae2597,
+CIPHERTEXT = 203c14c62421123e85b976d9e93eb472623df4bcf4bf715975e04e95989abe35c9c8e3d5f69b6f707090935907eada5d075c5fcfb72e3119edd87847c2a018a87f84c97e222924f4272a5c0bfdc80a06f312acf1842b12bda079917e619103ba03cbe1502cb7303210f03675505656a961b2ac68e3445066fd9ae0f69fc21a08de3bf46c603d9840c63324f7957080d2edd1911e7b3fd345f19d7150eae3c8da42e6203a4d0521e3ee6d8023317b26d9d7f464ce0c047fb0fe3835275a1682961a29f016d073ff9205280f0330a885eb0bb05629962bdf15634f10e81f0d7bea0c967c686ffd13e2a499c60e0f6e81a15828d1d7a4bbba9c6de2c4530dfa79fd239e657ac1c48841f3dce6386a74f81c30d80feea725ae31487324bfacad0fdb4a944c3c673f32a5058807e6f98a76e6130bf653894112f22aa9e2cd196f4520c6ea8c6abfeb0b390abcb1c56ce957408e640de9a0fa18edef422f4b2a85c0fe3782c67f573703625bd269f826af8ca20eb19f390aec496ac8a57dc9e27dba7063549a9d14640b5ca2b28c59694c0b30d920641a7c45e9a6a74d9d33e6f9b0bcc3e2d4307c2c0f78d4fecdba6495c43f83ec6e6da6d8a27dc7f2680a9c6068a4f26c5850c6d12e4373dd6f4cec7dbcb429f06287c5209c7a3ce92586643f737770d735ff99d91b32a4cfbdbb7b78bb85d140f491594a8b8a095d3fbf2236d82e,
+RESULT = 0,
+
+TEST = 53,
+N = b6fdac221b803ca7165d2f99d6a71d11cfb2fd7c7173d0f1d787b8cc9906ac0b1b30bb2b58d37e5265762f79aed60cf557402fa84c64c7e6b486929e4ee15a352eea0abd7321ee05e62db0cca668d96febf5da029041e6e9bebe416b2a6c8154edf15cc084970c465017a066eb08c6eb2097af6b60fa6067638de1c96f9f9239436a1610094edc7f5dc15cd73b961e95bedd74da50ef71bbe2541944e09ab87abc79ae9d58179d3c3104970e7fdecba8fdbe880cd2e7fd256ae2ea10e7cf5b76a53f3bc68a4b996b5ee6d3b11a661a79926ef07356d429c1829a30a07025de0016073c6842904f266a3b4d565832dffe57734d6d75782a08414096827025ac2d,
+CIPHERTEXT1 = 305f3c2166a415a76cf8f5229e5f9a9ce60a393a77830f5111a7d07a3d50a05d9755fe07aaaf746cec60bd92a23e3b8abde160d2cca096bb277591b46b5563e0ee310016140193434e43754112cc095cae731c3f90243b05b27ff3a2ab9a7cfc680c9d69b894f4dd31761ad701bf58235d9f5a102ac782d9cb484e44b6c6964ae20e166cd7223d95b6f8a590001c6869466ffe64978e6b65031bbca2e6295b494267cb3a453205ec965c5d54569b8883b6b2f40322068918e308a739455eb0fa103cae887aba83a4590c9778f97b04402ae49bc7a9cb359db6282b56c6bb6f0dd45d867255e79e2c99025ff08241a66606fdcbf29daa227f19e7d2175dd90f63852c9cadbdba156ffa27936352ed926f90e326bc755b13fd7e2082a8c823fb090d7b1c9eab8db7a6eb1ff8e1042cb4b20cd6dcdb310ed0e5dd75628a2a8f237c29a66eec0f44e343d2b8cfd7d49aefee8dac6ae12a5a7b2c9ab845c5ca56b1df096fa2ca490c6965ec7a41a3eebd301ee109200dfaa8c57d6aff11eae8b96e69c4a0edb28f401f0fa56e8e30fac604e74b7df476537e528beabf372c387ebb9198c6ce1f27ccc0e42a37b1dd9bf282add4a6b06c6c918fe3487aeb534f1e1653f6bbf5d7bbf52c2ffa8e89e5a0ad33c6b8196b19e40732ec947de83467b15f0ca0139c8d78f90d48f04ff1cc3660380b5100f1ae69f0ec7ffe34e96ece9e0652,
+CIPHERTEXT2 = 26f9e46e04905e67fc45ab7fcd9006a6e1979811ecffebefee3e26cb342d4d444b2d941b95aea423012eb13237bd3b9b2c12a4bdecd620bcd941ba16b1a0ac29929cd86c3c160ba5d0edf6a0b7293255332e18e3b74cf9f08a291bda70c36f92e6d2af77d6a081a09f660dd8f37998a55993daf019e79e6f7fe13d0f0da25404e82033ae0c34b1aca3d28641e2466633499e7fa65e6264b8e944011ef542605e5f11ca49ae6568a8f55d876d304713cc5dd738c2714d5ebc9c3908d539cb2a6eb872cf29e9e6b41f38a31eb05ad3aa4f693cdf66ab370c0a7c365a9fc40039f0ed35007db35eadcf3a034b6c2dca23ed73008ce551195260b078452a50fe44b308e54acff2ad980398737a7663f3d1335e32ee20ba053059b0bf5f00a9035974c7992178669a8de8724d81983ffe8e5542cb093577cf8777d0b23249deedc663fc066f38e60cadc7f32d1a09f0fb22d41143d5444337eb3098c95f8be510e0ecd5291f13289d7ec8313ef737ac51e507213a165f8844de309b3bbc16629ac8d4b6c344228926283d5e01cb29c6c0f9679d291e66d92e90a389d5f3d04bb1433c72a28a89df70a54b26770e40586fd8a87c5b10a69577aa0f16d922eaaa0373b4605d0ba60d77973f57d2433cf2db56d8320440b47d0b381c41b20dc21d70d5ddea1ba3f45b0281802d4c30ed2dfe31ff236baf72b8ab7b2b98e87b5e1d07ba65,
+CIPHERTEXT = 0cef3c6a3ace000867ccbab7b6bcee781ef6808f2c716839d6faff8facd759a3ca8203ab5bf1ee66f30abe94eee04fd5127812ab38dd0301988f80f7bf47690c5d5a37a447fb3131f2f94b50ebe415ce6ee03b1760296e07af8c976acd51a8c2da2a2236420c3a56fdcdd920d520ed7fbd13f31f90c6d3c6826d8f1cc5bb439330be38a2f0ed7797ca178bc13be1e3d8b8f91d184558410b45d17be0641ddead7316684efc765b114e009205e59a2f69bf6e32492402c1be3a39c78c1d628b320539dc70d623491226ed3e646c89d1dbaa7ff8b7099f8d88fca164246a673d7673991c8336cf7d8a2d884dbdce813deabfa68216107543f42e904c6209a74640a89f9a9fe5e36fa262bac925f82c37edf5aea1f4b0eced1723fa1c38d6f7b197389bc5917638e9e1fbfb9db55915590237a7cbb3e8fa7c038f5acb6c8045887938f05ed21fa2d208a1cbf9ab221c1703271834b070ff214f111dfe2a04f9aad60af182ad258b1086248d3fdee168975de1d74b1384f6fe14e7b8602852628d0a73fa69a4eb6001ccf074759f5746e5df2617f51e1c5cfba29a006fe9b428416667227db1544470cfbfdc41dd98deee3f21c5b8930aad0b4b2584af16e9c1b86d7bc8ea59a7dd050511f778951927b2fb55569ea0d7d95c70eb0402324c5985d1f52dbe44aa0e862f90780cf1642ad81473b7924b194d167f371f4b59b76f8ece,
+RESULT = 0,
+
+TEST = 54,
+N = c6576187994dfa28979e590832ad739aad5de641f7ad04e8a8d8a726ab0ed42646914f82fc19946f6108e58576941325ed1f04a8daa7f2b296f8cf513cf92c3f1cfbd1527aa85966f6767b3a76144250bd696d23637ef88fc0a4531bf6604a382cb00ce162ee4a4c66a7ee909a6eb029a8dbf824e1233fc22401e12c265d0a1846aa15a3803c83d5aec406eeba58bf2457a29ca58994920c006a08e27abbe3caee82fea938642038ae711ae8698d93b5760ce60f1fca3eda71e94953d2eed9f5dc9270f3368331062169d06583498f976b78107027515db87d7f25ebc9a4f82d19be9b777d5c276e1c98dd06dd47eed2c10efa5c79f9a2638cdc564f9def3cc3,
+CIPHERTEXT1 = 56cd1acff118c72c75881b593f8f961b4c85d8577c73ddef68fd886ef031f65b42492558afe8e1cce4bd49635e998ea058cba99b661dc7f9ec3d11b1b43033d7e8dc39103d9ba8725ccb5dd89f442ee9404e0098372640a4f801a019ecb743e93822b24627712969a6c62d7617dee972cab7380d8d2296beb3e6f095f6a2094e712ef5fa1c561f9c1d24f5fc8ff6486a1c8bcd81d9abc396264f095832a6aa8350b07aa07ac80816b44a9574e2f8ece1b9b91684c566aedc73c92b3115697a11cb455692ff1680981699d8dd1417604a60d65b75ffe2a0eb18f7ccce0127e354902f45dd48808b0ccbf0a366d2309eb8ff3c6513e228656437295a9a433cad102b06831ee73a88c9204ac39499daba4ade69738098104fa57fb648005bb45b296c4720570700c0687f2ce21d01cddf2470f9771ab8a9ed4a8730d2f94fcb7d4f51fabda205eebb432ecb22dd7851d107ee69ee5477b430ff2ffe22996e9cf122c9e0f86a0a799fa5727af322f43bf2dcc4f25f584e7dc5919bbdfe5687ce99ef21d241db52580cd8bc29acac8ba00591103f3855dc20ebb0c7d11beda68f5373800a7514a70b7c6dbefab1c814b276c33e83e34d3d1792e901343a6fb42e3d708495bf887d24f259e66cc719702f51d9bf0c753f27ef131fecd9a2569efbeaceb9bad463c3de8deaf88d6d6e89c33e1babf757d8f7c980ea7564d4475d672a3d,
+CIPHERTEXT2 = 1b2630b6741ce3961d2d33b39af11fed94f028b77852359d6347b1b670655d66f12a27350b50f87ce7bc85e5635038c7e68cb4d75d8c4cc4df522bfb83c66fe2cf7bd2bd27e66f678d815dfd0312943f239dcf045e5e2aea2d6eeefaf9bfc475256147685a62496b40fe86e19eda6269b04e2c8c0322f43c2ddb5c35b5809c35bad712fd6c94027604fe68a7391d250b1a363f06e3377f8452d0b12f7fc884327164ddace637de4b6aac8c13fe3180baf2a69cc3b4fbb01559c40dd2bb4fbb326486f5f7df071d01f9ec41e3e51cad1356b975e62f5513033e379ea1540cc8b32c8831c48496e54caabe294a2e0a2e0f1720ba4db138660febe1d5319483ef9bf42751ddd96b334db225f5e670d094b0fbd8c0c04331ed6db77a743cfef8938b0fd22cc4acc9e1a72dc71f8fddc8cfd2c6c688ec17ab74ed9658262fc0360c31ecbf8315c0fda3d26dec7ba71759f3342ba1d15d992b383a163151ee2595ab9c44b30d793a2a3f95b2f34540c34babd77e45bf3fe2d4f36c808b14dc2df54f485c5d66ce256f0df994aab5cbfb8bc116123ec61da2b00b5af8fc4c35b7bc54859e9694d14f00a6b0d4d461e49f2db6101ab355af91aeca6973ce022c8e373a0ea5969eccbb0a6b1ae0de102c8b37bf81e18c1520bac4d78c87d3897fb2260f1e8fcd37afbed4410f5135e4ab2c7634215f25c2e2cbfd2f8efea6580e5466f133,
+CIPHERTEXT = 5173027eb299dd3f671b514c5176cc2fae7a4aa56d9b906ec78c5c8f5f5341a00d7f00d5b1819f6f5432c9ad49016844c7f50c35834da8037bb07e3b3b8fdb72329ba0fdfac178c173e03ff03e77dd3e4e5ce325fb854a6796a1aa858a87af85962081e320fb2afe87db23ff3b1c7ebdb5dd168af0a11e5515e9d4a796c5b7cfc9c0a5d77e0d60e3bb1402fb4fd0ea9f8cbfdb6ef86966c035b108f5369b18c71594cdaffa772a4a8faca0471e1aa72de6341118aef41806a8deba8698223542a9881c3ba260bf72245c6dfc36200f602e41d7136ba2c58eb963acb0b91093034d38dfc7e0a0c2a387a374acdb54f1cc614eb876451a87310b145f447ae602390f19d15d4a4a63d6665cd7c458ea8ed5448f1f6d2b682a468cd6ac88eb34d31b89ee6b34d0876013bfca080fe06971e874c22de7b02969df805b1158a70d9a7ff27ba9f12943a4f196909c5ab997ddb58aa1bf45d0940168930cb7158f93fc23d04bad45d8a8416c677ab6d1bb5f1293cb2eae0cea93c3c8295526425f0615b6296f078c6361a39761356d637f0f20abb65dc381919b1bbcad8524a4b45434b68b5e4fc0b215ccd950cf3847b17ca5c6fa9477a363012b250cd0b3830b7f2ade090713427d5f9852c5c0d5d17f3b5de0d44b2ff7aa6a4b3125741eb2a735b047bca35d783d4619d62369d603410e8b67428557a3ab658ce0eeaa918845c4ff5b,
+RESULT = 0,
+
+TEST = 55,
+N = d6e2eedee8b511c2ebb7264ab15f2285dd277e35a47aacba0d1b71a309dda22facfd6758933c81332e23d29d43343fb4738290ccd3a6d85f2b2db12e52ee05fe2a6d22bb50c12fe376044d2e5a71a19724eebc1e880d23f33f6292c948b4cb22d2f07430b7ec29a32933f9f883025852c96c132f270747c21ab8e549636c1a32df3f09a7e4f6a91c6a40c0690548d8f30c60fcc54991c807edb8a2816674d43add20e60b60d0b11b975b58ce4de5c1b930e3d51e6535818ffe2f8b11598b8e5cfc62320802d087446289e8733de2ec347b555991be3c53f911fd82cd393aa5c4ca17189d98aa7401036df77a0ceebeb8bc7fb3832b8a129656e9c9373210031b,
+CIPHERTEXT1 = 408c8db4cf2e471ea42e7a17054a3be3ea01acf1028f9ef13d23acb2b177cb8f6b75ed8bc82d176a9a944260876ed9d2359dd6dee6e6c3c608d7136595e3adc26a83e5c041e192978cc0f89fd4f845ec73a74b0cb8d79ffef41bcf08d841b7ed64f488a01a9aaff685af66926456cbc29f3357dcc112a32cc9014d5858867da9b15dbc7ff0b9dd6c242f4da8d3036bc9376c154585dac078d3562052b4da00a53c964d435f58bdb710d3025c16dff2aa5bd38fc1d775d6109813398be23685676b6a9764d0ca7419108bd1a0fa2386e7bc9bef43262e2dfeb671876b2dfb8a662fbff912fe3f18c954aeade6a5f6831d2773b546b815d817ea103a5871d73f98d0c423929b1c4ab131956217b97e2ca14fc1f423649b969de6a68faad08dd021acf22c4ec4f28e09eb9d47658786266c7841b51cd6ce2449a152b06cfd0753a48de58f29a745c5614f2bee659aa594b5a01d5e8ae8ab9349d30e04d10f896afc436a68789fcea872b9cbcb105f8162ae16e779f03d061b7ca829a45d95cabea30de06cdb70c1bedc4b300ccb19d1a15877c4a641c9ea17b9670401ce28bdfba6fe3deeae5cce035adf8000b1b930ae383e447a32f1e5bb61eae5ef332e35ca229f2a67c4b7ca15fc99c4524c13b52acf55630d7b3934cb37f733c617eccd11fa40cbc50fe7d71e8574f34ce2f4cf1a623d21fca5765792727dd631986746b27c,
+CIPHERTEXT2 = 9581ca266616208a935c37049a17414b4c1fa57327963b1b6142e7e4da7b08523cf916410d8e369397f4a0da9996ccf85752f1303353470ff792b38499e6a9bf76e5ac66b1e8b0d496d419600247785791a988f676f330c8157034f9a3d0f1cfe618ead3c6dc98ee9748620f735668b3877b6e33d7f4b8f2287f2927478f2b950c87ec8105194fcd0e789fddf71c31d18f1f543d543bc5cfd5e45dad76742728ab4a077fe81aba7088d003bab126728778f5037942ec6e3f2c4169a1f0ce9a827e1db8d153bef22ec86e28b43f9f22f19f478a34ca78ad26795df9ec72563691f4da13cd343e7bfcb9e9ab83f2ffb0a470aa773bef1910aa9828d1b5ab893b49e76c3e94469f56530768579013713136bd457800cf02375e6f701c6e93455f8c57b287e6d4e8af9a018d86d92bde4147e8f5632924db469dde48d02b79498ce3cc8bfce3bf1ad3f14cf78671cebae98f4f7e430623197bc0ae0dd9d371248f4e163882e54e630ab75077930f0cebb0e00140c0eed966809e0ef3637d71c5a335fdf93ac046c106405edc9a28008cf5577e13436ca5727456fc64b5979c5b7c3272a3f5acbe98a603b413b280808b11afcbedbe4341e0a2085a66f5a8efd5add80625071440c8b2c1533880119add1e5bb51c657b3772bca0fb6244f35caad4abcc300cfb7e51571c3b4cfd32eaa50999ede2773392b81078b1c5a0c93cfe5737,
+CIPHERTEXT = 815474b1a86145ed53f90b15a8d781a505ec72420d1848944c74e5eba6d914e28265864a403fb43479913874b42371b7d6e422d414038beaa77bd88f9cd72fd9f429ec4128f06689f60c2a73694b9890e376a0eee54fa04dc24a5e959b9b42db05ea638f8694bb9f0f9ed31d42de8b1b38054d1a8b6b2219b3bb2264d024c78255ecdc65787de3f9994e6b64adc1b9c6985d2955e2cee5451d5da50aca472fb736e566b1e57c57283d744d383fd8b85e4abe0535133a2bdbf5ba2ac63b170e1e7f83574454729930e1fb1b101dc94f557d69247e1c6b07c77db416aacb7efd3e55c8a31520c88fe8069c52718a7ab161ee026608a8edec5e3575adf4ac7cfde4352faf8660d71f496038203a8530ed34b00c2484a4af07be2d52e5860bf05095da293d4158ee2978a21b226cea1d0c1f921abdb2621930421c0731f1def58f82d9c7f2d1412302b79edddad69ec183f08b14634633ac137f2d628c2bbccf3bf799349c7dd4f68becf02350268a6c234c29c8a53567beec3053ee6b8651609b833c168b2fdc58a9fe8a5cc2763e9933a1d850914cc9c5a41c84226fb4f28ebbb48a2d6f854362680e52cf2402f8df14024b28b5800cf0dc0ec22a8cb20a203f4ac6afc34ee95db92add7a24d74c49143d9097a1c707c0f1bdc7be02f3cca8f31b178a90de3b158038c0135db8a76e7ba18f7b54c150d014030ab06c901f3ce260,
+RESULT = 0,
+
+TEST = 56,
+N = ddbb6821ce77ae5dbd13b030bc04e4c10590a3bc9e9c05f8b5c565021e166b9e87b507e502f8c75775bc532b4fbba6fe4bedf078cb42e56ad802eed7881c65647f43200fa536d80072224dbe0b3a7acb56ebb5e656a597007aa41bae988c752fd7d22d098571fc442a9454dee8c66a298f9b4a11a41b278a8a8b4a3c619283000785b3ec23d3d05a16dee320b399a52f3384ca9799a2fc10fb9f9b8bb1fbb133dd740e0e06737d1817b86ba403446f50203eb51c7ae13ad8c6ab22e23c7cea2eb7492233fa4964704d7f84aa384fdd96c74525752019393ac1810be8e72acbc0fd8079eb4cd4939d529f52bc1ecfbedaad37aa4dd61929154d26ec30262d3ba7,
+CIPHERTEXT1 = bd2c4cd001fcf54be1791f9a0865d4d0d95896581e35ef5b840cbe22b5bc456b120d1db825559db1257b2cde80c66e34fe0c3fd8d82506a14495e7f9e988554e0c8823047abeb08b4044f5c3130736a0dc4fbb7cebb099d127b8fe6efb6f85058e46dc2a4fb4235a0c2ede301715588189cd7944732bea4f8a58a21bb58ca3300d7d7d9007e9cba5575a4a1fe3cd37920b0849da9d77ecf22a7266d8fcfd3ebacf6410856dfd73d5b0b2bf51d2a1afeeb2491a7cafac6a83688428e3cc6c6d2b31da431619c5136512851dc513273a0d88669946dc3b82690e1a7401416d27c2cdaafd09443bbd5bdd9189e76c38e07a7e9c852e4bbbade6610bff31bc2e7ac466161a17f383de7fed8aca0099dfe5c507796bc92db8b5276ff8cf080e9609ac429d200875b7484d2b842b0c5f74ecf4a4c99def05195dc2a1638671fa744d9d486e6e06d599d57133b3ced8692ce34bb2c4f1c4223351d8ce59b4bcf120f773871111cca125f8913011e532443dea5580d98472379bde694d0a5ea1147b594d07635ee569dcc9d4b7ec741a23812390f9337f667432e42ba02215b533a7680f8f387ca7f439c713950956c1dae1b7937a6bb49fe32b2b560b68e96352677e66cedfb9def4b0a86697857d2f8d01d940eeaec6480ffff0e5a18cfbdafe697cdcc535eeb4fd6783868bfd4ab45a77a197b8d73567d993dc55d46a71264f9c3c68,
+CIPHERTEXT2 = b482711d12a198564b67287150979287db648cdee6b8a50c43fc5484a05f7f701840d14ad1888f612c9f69217ba427c67987197a101f164135c2ecf5a6c56bda72cb325869fd94f6779e98925d62a5f92094bcf0ca8972a922c2b233b7c9746c089b4675a907e877d73911dd5cb3fb5c36dbb72479ad24663e9171e9ab2881dfc784283e8da26fd65d7b90525852cf1d5774d9d08b51375e924dd51027d6c315546bedc26f4395c0ba62368ac1ccea08d9551f63627ff1fb5647c1048d031d4dc5eedb6b89467b9d737b95c899eee19c0d37a6ed63c82a97bc592e4355adb1da66f208ee926fd445227d75aeac21ef6e011df51a03f9adc7cdf4332d81b5786bd78cf951eec3c1792ae82b893cac1818f3706436cb29b588411e659b18b9e153d154e075987421ad19e68dfac50a4c890d610294c095eaf064ddeced0002745b6382b70cd981c71d6829299fe4f2bb064f6f47ec87d54764c7dd1adfb09564ea6808826e4b8a8f2ab8f5ed6a6516dd1de949ac9548bc3733b6d35d054489e127fc1939ca98a000ef306065deae3f6ba5a548c11410c4d94bf953c475bc4ee9549e95841aa3bd3e9403b3945990eeb2ac8c9c35527669f3926769675cb1848f2a65ea1ef066735e020e7882cd7f3993c0cc0b8e3e2d56cfc33472ff37b0e90c3062bcce2464d33244ae4dc03b3a5988d1ae936af0820d9e67271b731086e80461,
+CIPHERTEXT = 7b26c22c1d34cd97188a53d41a6e5063b8b6a182d3fa65c52229b3f21054472de620234ac3806427de97d3cf0ca18e079fd41bca7bf5e759687adc3f2ede313ea95f584c3b8a56835021cd18f374e3dea474753418206c4237d81977c5f379983ceda9db32420f85f9741db359b6b9c9a515056efee7f5d3a7793e41fd54f4a43c13a2b7d3e789f84f50184ebd30be415cd9fba6a3425d4a404a2f8c32138964914b40df58bd437ba09c4b38d90a554eb1be2c9ec7ae39947b326121b54c047ff9d2f7239406ff5288c3d9be2b8d0b1ac40e4c9caea701def9af9f42b24200a14d25bc33969df20f18a6b1b42db2f976a422867a4d9b782ca637fbacc00350a769a913e5dc25dd65e72740cb3fc0375694134c637d0274e721a83b8119e24c7ea5688346c4ec5072adf8a122084ed03b5c5827be47e5866c5a8812040ea29dcd14a8fefd81222e792631ab16e5133cceb14d2712ef99fe02c835ccd8e9b6220949174b43daabdc3a005b9833d28ab1193f461031155c9e2435a7b42d0820e37128f88a55490b1d1f53b4d455a23aadeff77ae473adad57c55283489cd863b24e71e1e214b6c1201d6330b565e65066a504df8915d56c610fa85e8f0154e3ab2b0e6184d94b718a0bc286a82a8e35a882b373eff337bb76104741cb0528b0ea605b9705e1e730d8f53cdd2419a61b6b653423ec4a97466e5652cafabb642014b9,
+RESULT = 0,
+
+TEST = 57,
+N = bbef700ee88a1dad8db03624ef0b8a28f01cb04fd1a66dce21b9e997b84c736e66ac169625c7131bc27d2359bd806b062714b20f1d8d4bd88b8db290c64ad5bc17017e7b97408eedca4e82b061ba45725386dc9b65916cf3523cfd2797403fecc5b328cccacf44f773d9f70be1ef35ae4a312d57acf3ddef989d85a1fc758e3a50f49a160ca0a8f9d495773f0aa79456fc97f2ac04c92de309c6078e8cf4c13637743acf61d9badf865d967e2bfc9da3dce33bb20e15250e0d338bbe532fcea8939f5391c6e8c50646d563963ca3d161c2940058cdd5fb08ae86c0becb34752408d28d774efa3e29cc0478381694183a595eb68186b836ff35fd493d6a8224fb,
+CIPHERTEXT1 = 0381ca7889d0ce7ae7ce56055a6a809e37072e25670f84874a6d86ee174901a4814b43ee8e759f78c0b8cadc12a51cc7251d6e8a1b6319f1abec69c85850bfe6d8036a67d9997b3d4bff46d2b9d24d8dc2418f919dd90f89a364f7ebe2684ea77072e9a0772a5f9952f385a39ef709bf85116724e6fc14d49834c3bf9ea6e7e3b33632f396790b94c81d5bc395470492bd7713662b04b9ecb02ee896ca0557186917a6ff82a6e8fdcd7bb6f38c32e62232c4b12893c4b35edc90309cbdc609b4796d0fd810e7bbe3226eb6e8b8bb435d291a8f98d77355e93565aa5befad84fed90daaca740cb192fd9595ace63e42a1f17f639fbbe0023c48df1b4b84da4b373f8f63858a90f512e839ff614e2ce1b6b92d62f2df8801b19ae55afcf1a3c6b2b31d1e40d870a1f8851603b93bc9e0541b4142c3d3f066131120d5c8bc8d546091542e3bebaa4a296f0688e762536eb753df8d5aac323f721475fee5b866d410ccc3904fb31436cc7f54f2abf70bc5cc2f2e239dd4530b2b3b256edf9ae5c7081d1e8cf436e890b826a263e66a1ebb1dddf8412d8d68927e260ba4aa6658ba0afb7f6ee0412ac4eab82b999654f782d4e5aa663188bdb351fb00776fe5ee982f57d476b23fc8ebe7e5b5bc2e95221f3a7921e98cf834233a6834d5d2dad25ca0ed5afe65dfddbfeb0991c6af7afed0e4f9da9602508effa789ac99d7e7982f41,
+CIPHERTEXT2 = 633beac96f53113e325227bed4485b166eaeb7a7fb6b5e9fb3fdc0e4a6f67d5693eac9dbffac6df79afe1837a3979e759861d4f0857f9f1ed7fab66955c2eae200ac109f5053b04d143b32da0e376ce43f151ddb0f8cb68cec62758e239a7b9df5c157b800adfce5bcaeaac2d9edf58ad62cdca6a9406a517caf368ef02fd427245463530158f5aff97a5c6b7bf90da3c050c9658e828d956b10ef842b6088b30fc9a898ffa8adfa99512c5c15e8329a24d3d19807e0e0609d3a73a01e34b35790b121bd00a908df54d1eb8615979d2e9dace2184cf602ca1889bfb5bea97f3931de819f7ff694b08dfbe610acc7df08710e7d3565a448493ca06862f917fcfe8d23f87248003d0d1f77be614eba2f393fafe5cbba3ed8d22e1ddcde80b7941909da27d2176eec382a7a7e72eba6361416e47155fe7816a18b3ac70466234b602384d12f6377b10f8f4142617e2d5fb0de53b4cf81344bb83dff6a01d4419c38e362c766b5eea2c3a8386787746f0532da46c1a8330981d396c9d46cfbcabce718d6fdf18a2ca628457e0269aaf195e1bb5e58e7c004298aa5dd7b45f3f03ec129600369ab44be5b3e70caf89607ded9a108901edfc4a61e2e33e95bc7b0b0fb12c280f075ebe7b11063e577b10afcdd71be50161773bbc68f862112cc78e77cdb6fdd1d110b875215cfb5454fd10a0a074c03e459d2e3bda1f83bc813b7f7bd,
+CIPHERTEXT = 79ba1aa26ddb150f950fdadca26880fc6bbbe5e14df018eb3858601a90a211000ccc0e2afe4020be547b33f301fd8a724a808373750ce16ddcb3f9153ef3611ebf7af43351af88f7761ca87052a0e8771c59623b6ca4b335f0a833c06cf116ed5f548d93906f035b79cfcd03cc0ec8fe48a322bc70b6b48980a067988f39e4b95117502d4bb770e2865589d7ce626b0877e5a681bcd528cda346092489eab54765eee069c417f6b22e8252085728a4b13aab609690cbb5378327b47f76a09e6fea0a323268da7d51defdc0ca0ff8d458c68ccde7de8a7d64c4ceb89da7dfbfc1c25211918827691400cd9200bf5d77877f25b3e63647988000419648a555bf5d2288599e3b178aeefb0731a592dc456ba83be09948722a0519a5400747fede97b5151f9bf0d73c199ce08ac91bb8038316e735925bd754ffbb16efb0b1b12420c33702384be02d4f24ead3b350e0f5641df266e24b02f1274838dd3184d7427f2b7c15c9c5f168af0d348ca67afb6624df51468ec84ef5bb8e096a582877149ef321668113c1627b15e1177f52a5ad971eaf0fed204a11f4e22dd90e3776b5007702cbc81c92fb3601367d234fcda1621f6655644774a7d275aaff70dbbe053ae4a331a89fab81b2f33bae5e1eebbf91e48a219a99d275193092f7bfef31a4bf0ffba977a9a5ec3a3d43ba23d378e3228f5c153a9b7dbe065b7058256d57da80,
+RESULT = 0,
+
+TEST = 58,
+N = c5e0376614f19e500883b62c7acfb50ff14c7a931c06ed9ee75591770766fbf439418cbb75c952d53f4596ca94bb90ecfb23dbacc4a261f4d43974dc811f9d2c2b3c758fe98111f55b1adf7e28b782c8dd9f7f567b34cb2c1a2b8ba6adfa2076936a421a3d28217d931d53a3b79c04dc8d9e9e0909f6905ac133daeebe1649cd2c088b9a781f70e9d9d27e9e33d5c9ef7b8f49866e08bcd4e635a470d32f6fa7c1f9b298c765334222ff3aea3103c73dcf3b6236a6fd46886c6d771ed92e25a24be89a6e4260d2aac630e92d1141fec8fa49612920696a0e112976a2624ad5f0c14758f02f872545df731f7a41311537b62a76c958a4882e368edf853043e9cd,
+CIPHERTEXT1 = 6ec27ffc506e841e0a703a7c64f8256119378a0db1b9e3091dca0096f3f4275f91cc0d1329011ef9b547956ef29ed0c59239edf873904b679c7fbcd0142c0c4659919a4484e956856a0f66fa178b7b896245bf7ae265a76d4dcf23aa603c5423c6d44775b78083aaa0c35ae98134503c21444bfa66d09b2f3245959d0ad655d70d888f5876ab5d98b7775273f6c889bea67a5df2a9981413813c986e112f701a0f949040ed473d972915bb1e4da04a9454a91ec1a39252bfb0be99a4d0b390d922626ce9e866d2ca1da1f89d201a8801987bddc2b4b4d3650aa865c42a16b32fd1abf67bd80096d22b69ffecffecbbd89b7b8a86292df2c27ad6e616d776aa313745a25d46e2051e38ae3158feac7f144e286373c508f4ba679222c583a583c4325d0101b7654ecfde57b095ca46f9c0b40146042643358ae96f6937366001963a4232d51b134d4246abbc9e22bd1de65ea21a76521575448220b1445627858e1100068b26aab05fe60e58439c14e09fbc613be20ce776103d4505dc73a40a77750b552ec3d0c416531022f8d2987727fde921e3b285a2c6c160b5a1eae0dafd7b68afc33f49adc1e55c68219d5025b31fe085e03f36cb68a13ac0969583c07b121e33ba223a83d8d23c4e67816e6b3a3e311ade2c9603c2a071e62ee54a533ba82964573bcd5a1c0a4e59c5efd5cfa118e3b050f2ac75f516a941b1bbe581de,
+CIPHERTEXT2 = 2192bd4d4b81b701aab645d9e2573bba01192eb6f540b86686fbc22c69a80f1f8d4af89e6576cd0b44f57abd4ddc7850d43752e3c0c0a44d7e9d72983fa7e1b1a06a006cabdd6d27d3dadaa152e55e0f6e2acb59d10efe4daa83ae8e6504cdcb78a95712013bf1dd21a45cc96725910cef8bff79a5312c4b7c20dd8f8502fd714cb578c97888d0766b3dd197a39a67298cf006d966e8cf95f50f696f60505ae2d03bdfdc3bf352dd871ce4a3f0cf7b713520ead028fa410ec6139320ab82b209b14d13c519cf13874c9ab35decde6ce9212310226c71336dfda2d1a7038a31cb1a479d0c8d7195c96f26792e53b9442379d7e84260a035b280a013c7ef46032b83f9633931e02bcc3641e73a2c0017f918e7bd1f60412fcf325567485a924b1ff1880f861947cd9806d3284b36215942e3762c3b2cdca72d23e0c91c25aca4a38cca2971fb5eb604cbc76226c5ae86124d3daca2cef43789502248e14980e34af1729692c61d4022037328f7e7dfcfcc0fc2a1114be47f7c1bcfb2b58997349a9a8eae543cda486d8f42645d07292bdf153dc8fa4a583502e023b08ddbbb7863285018d19e98b0530272829d8cb09407aafd0fafc8f40a2f9f8958eb70d35c3c4538c307e30378243476fc1f51d3bf66a5f8c4dd4166ac26c3c35808dba5821173bf485522ee4e3a8f1c3bb7627439760e0f36e17e5b9145de3e1972d77379df,
+CIPHERTEXT = 768232e6e75c4895fd0a6c0a276e9244c396e16572ddead9025502c24ebbb7af17fdbf29460acd1aacc2ecca264b707f39eb331be907e772977a4feb43c6e6d61c70d48be065eb990edeb9af1e4a990bd46c7a79caeea039dd086a87fe3530f38463dc320c70e76117290b872427e0cd2889cce26f7e12f5f17e13c49cd9bcca5d47a2d777df4b77dc393112f56d43e1e1cc3c66253f89735d9445ed6623dca484f58cf42901df8ac6b0697038695661721f7b91cedaaaf2862cd52d139caab4392d54ceb3f40b1cf25fe6b70d2099686bbc9548b448bd7ab2c2a3da118969ac3e32a9f3fb1d4d6715e42c06b7c67e8d23d853f2635b9f33bc2f66629f48fd1bf316f6337f5d5932388dd39eb6aa630643788bcd3bff7503310ca133424e1cf73513fec8100c6b0d5447c2b8d002a73b96c30e7470b2c630329e0f168ac8192f3903f089fe36e41f0e4ad77cb3bf62fbf5ff6c28f9df279f66790f87d29ee6d791b02d50a7c0d9f5d491914754378e01930d3b3dea2ad854499d732586c491702916cb18d1c8b063c24ecd31a653414f3445a541d44bd747355bcdf6596198b2d367a8593183912108e22f19e5b636f26750df27f5cecff7e012573df26c61f69289b8e52133da7b6a9f3fad90eec75cf989534e8c2efe261282c70403eb1dd8198d87f333e188cec01b8463695218f19197ab9857b0963cde210dcddf4084a3,
+RESULT = 0,
+
+TEST = 59,
+N = c44c07203853079f16158a9272be5cf842ad89247afc3e1abf954d2a92f28635916511479167c35ae3712260a7805a3c11c05eef32e7a54ab41aa204e942ae6e69b8d280b8d78adc093cf1dcbb160556346999ee9beb1d0ae2d7f9200b9b3ecb3db39febeef13a1bbf47014cd06a3ef52954aee2e3702b701fd6d9a287f6ecc30067fbd26fe2ec4024ad36db351698d26403c90e112d6edbe66df643dd4c4f2b9d4e43a058910e56be386a0af767fe2c93441d6dffbd3795edc89e7f038e88b8cc80ac0aa7163a4d77cd08cd0b0a9a448e50976750873592313257c96d02c1d58ddc7f69ab65860f8a8c402c07c96aa48db6479645c5296d2c6fca9de1c6f37b,
+CIPHERTEXT1 = 0a3d3dad0a038363675d557370ff97abd211d1bdae5f1c12c446ce0ca73f0fdacab56fb9fcdf9d2348c9e3ecf3d767cc2332f43a9ea61c5e0a215b6b648c14704eec95d388e723778abaffa0578ff5258e0311b9c66e2f556934e21da9f32488025df45101d7fdb650212f3f1cb3b04f040723f246704974c3a410c89504fe38d770118bc7aeb13d673793da9e013d17379b477c995b3431f49e84c90a817fbc211497cafd48c841099e63d156ae182164964453cd3afba055dc8cd18b0d1eb9e6bde2b5b2ae4b493ed4d8bf927ae4185d31318f63389740b4502b538dfe5f97401c851e0979c558aafbd32813e4d472554f28b7d0179491bd3264e9586a64fdf6b4da22de5463d54906d0135bd719bc53fd9022cb7f103f11d6143632253b7b5af1ed4a11ffee763ca4c65d045010ca636437c6fd74097272aa05e0a9415a7ee059f3c028ba98396682f14ef149fe7277253f155afdb329a582c34537746867a2aba12c8e7ad23136bc68d70b73b0645b0d91522e81a3aede76b4ae2c874fa1bf1b202e0e92a0537382a103e72bb36334f6a52e0de3c24060832f203f81e40ac0dc832cba441c81ad0ebed032351db7ce459c8990b35c725d3fcf00ddf90832eb22150513404f2a7fded413d6c47c0014d7edace8dfd084dddf42865000887e9bb40e1100d4278bebe553eb892d18087f8cf1a700110c8d4939ffb7e9cd45ba,
+CIPHERTEXT2 = 705d2fad7ccb583dce1d7c991c4c277623e7bba1364be96932178102425fb0f2344c83d407efbf9a511c808f6c5c4a2e0bfa8013292b319dc4453e10aaeb151e8e28ac62119336a50151d45772b11eb4f51a758404e02332c04c056ad270d8b06df7dcabd5e0836454777c55b9a14ad97ef1ebcce830f808bec5ecdc15722519800c5c4c0c2aebe1ee651359ecce448ab833f097dc0f1a7f144cbe872adf9412af08c7fbace0c3ea06eb61c8c03143f96b2e167a51bc3f3f8d8dc84726609d5794c2524b6a814e89986f93eeafb0bd22edbc733432c1d6d177197c9ea97adcd79c6e548615f6e66938de50053351594ca5940c7d55cbdcddc314f353ea19accbbdeed88632e9430655d0b117000c2901bb09495e7b5f1791aa858c3235f5297a04cc5ad2a8dd775d7075aa2f7d764960094eb52ca75215699a9924abcc3d9defd90a8f7653dbd49312ad2af17524587dfefb883c13800c1a8a7e19cea867caf2eecc177f6e2666dc9aaa09d09df45b755102c05d123c97a6e53972fd31e6f6b7dc21ee41baf3dfdb9635233d7b530b48575c2cd58f025823ec64581fc950c086a6a809c6235efdd1319569cd95c5d5fc3297570bb758ea0d68a3b9d93f42827dba56d8ea58ce985a7321745dd457a9ddf2e07db25acebe1830f38fa5abcfcb6a6904eb364970130a10a6581926868d7167ead2921da1e783bc08e4bb1639b5ee,
+CIPHERTEXT = 4d82d9d45a831d7b0950158c9f820033f7c0449ed227d7fbcea0bb9980a714123add74c0c00665309208704d72bf2e04e10f9ad52d48a662cad221ee5acb4081bd908919b7bcad8ea4ee149bab35479791bf6d101dacf83e4d42555e0cc8a007517b4f28162f3c28cba92933aa69bcb0f4a51e673ba0e3782d47bde3ff4bfc99b153a53dc4bd582015a6f9cd7f3f5009bac09d3b13b3c302ce2d044bfef1bae9cffc67005b5844e1715e02d8e64d3d38d5f54b3295a2b5cc9b2eaa2c2278957e9021df82d005e893cc57743b2c285c9ab95fda310e4cbcd951277f7494aa627760a5c2ccf1e2e346297b4bb65983b16f5f74b3f3e23c96daa9a8e619b8531d064ef70555105f96fc48b811ce29dca8349734943387a213583091359be8f4ab3ab749c770a6edbe9776c6d2b7cf214de47a6fb0a1898a049cd3b39d25c785d248b698038c7278671463cd3076e0d8873acf080f1ed07fcae8fd820c88ebe413a990c1737f49cb0cd8596bebafa18b76ad8af671824dd93a63b9fde0263a956f5f01215f160db8d57c57391991c714a94bd168e3aec0139fa8cdde42c07743ecbf24f75929948475841768b0cad709e7b76e9e4c614b8bc572878d1daafbecae3a756eb281324edfee0b97c901f47ff9bcdc9478fe55af8dd648b0bb98e7aac6f3c3bc46f68613bf4225a61cd7c02ab09cf6327c731cd213c30e9c941fd21f8d4a,
+RESULT = 0,
+
+TEST = 60,
+N = d47c35799bef0a9a9c848b2ea8935daad583b388310b784ef3dd3c407d04b7cb6eb2a7377c6c949c7f8f72a567a4610810367c4880b4c12b41859012d6ab517827c5cb76dd02a4145ca3537dd3b1ffa664ab00367e90d363b09f1314e26e8858654372e790183b794cb0387d343323f71593dab57f30aa4d1178a04cc12401828b764caeff9748a511df57244f77d56b1d918a0677b8d1bff3287f75f4b3c662decbf8ce60cf13093e18859e5125572051a2e878ac46063f39567a88bb701256f9087870ebb51a44bdb6c79c98777753aac9b1271354319e40c23c382fb6f478c617ad78d7158d3b8c17736079a8815320dd144a0a3a5507857f2bb1bf9c0bf1,
+CIPHERTEXT1 = 5d709be8167acaa4f0b6f0254b9697bf25966c3d13f6a70628ac5a23c7e4beec06977433ec29e52d54e13a8417b0aa105643b049f985cf6cf47f0ddd3c22cd0a9a2a73ec569345abf328f3596af520bed0dd45ce96137bb97f0d4469a0065b0e6736f6c86fb7943be8f0d91eb8b4f87a8fca172ce1ec49d0ff924537a3a004013543cd19d057e452b98356a25f77d1bec38a02266ac2f060658677ae9b3927d5306d0246fe73c0ca2e2bd20d2e619decc1bb2e28e9831088a12761326454129808de2a0f88483645218adfa4c1d74ddf2068e943affc3abf7d820db92442f92445e681af20537a0df2c105b1082b8a2cd753fa31f14ac7a913391f77a604b49223fa0854d1d6b3a0c95c8aeeea4cd158414d614a141dce9f78a2148d6168f60a1e2386804d396f05808ed79452074a844824debc254e706d364e9446003dc2b9ee1eedbd47b08250b30b4a0f40e88912cd19f85baba976aec7a19e9fe75f319c69d1b7eaf0c54754798cc97a6e6fe8d98076ec9a96a0a088c12d918b4b19966c606554c7c7b41ed0d8388aa4797bc45910f6a5b32a426d02e88f4c20a73048d67ed583a7941cc478110dc50d726e0916cd0ba43c206cc714b195c0652d9ba4fd25c31e25d6532997e111dac38b92bd7d4ffe6586416a07057747c5cc5bef9a8132fa1281b95d1be206cedfe6c5c733b8a4b5d4ad9413f61318b3b9d04540a8f4,
+CIPHERTEXT2 = 02f27faf0ebfca45980d32029d714edffdd777f71b0c42483e3f2470b11e4c8dc6043ed5d69543a95e1ee1a79d4a3b99ab66ca40da9421bbd7f6905ff9d5e71981d518af3b91e48e60d38acb8edb7cb1ad35d118c2aa1a0ad7ce0f42cae2b541a970d22f3b069180cd67b9eee29e7257d260ace778ec86585d3ba2848cfde534a0d456857c1d32d4b66635f6f32336dd7d2531ff65ff54a2446cca0c54028bc625183dde0636b568f8e1d8434f4cdd90fb7b3c9255a71417051033a8527b2e97d27b068598a5511685805b88a97ebe186dc19137b9ebcf35a8f09e280c9c4953e0ac1e27847ae0ee2fbab18cca3e163ad9c4731adece128112d8ab43736645e5af053f57320800420451286927b528d06fc97913c992f16bcb1338c428d3d9b5a96600ac31fe7e601d29f76716e882dfc0bf6db50de9ddb74aff5212b7109f2fd3ed5b55d8a9e4646b2fc33995d8b80556759e5fd9094ad12da4dca8f98cffc6999c975d52d82be196fd09a369b7a69d50f68a62ac5927338d461250043ca1b784eae90b6be6fcf104022e3eb0b42ba330bdeaddd82ec4a0f3c15716dd88aef269beabd0e25922f863d0a55fa3fb17d28559ab11c715e0b1b9c2be0262f033379a0d68f762829fb006268c830969f3b04abfb618511070cce19870809eb0ace5a4155f3f0b570b13e9becc89dc15d575406865c22172fda101c868b877eea3a1,
+CIPHERTEXT = 034ad3b8cb8e723f08fd6f304e72ce09fe73ea668086ccac037ffc98352e7e3e97f80afdcbf65de5f250e383a9aa79b667410c0072324432dbea93711a518254b88512d55b931fde8b2757478f871c447b156cc79508794297fd17c1d17744a35b10a4b54654220fea61186ed348e8293f772faf6010715d46bab85d3b13fb5dc0ee30cd5e17e45b86bc8713e74e196b668dc99f22533dcabd54ae7b7de75824635d84531ad3289b855be433b586a8497bb47aec81f865e7f3c7cad36df8f50520ac89f0b541f89fce37a032b5f579597a9a46988ee1066972dc0f5f8f1e9c0de8f89d5c4fa8726b91b697c3604a3cd760034d3e3f78ca9837d096fdacb7d5a589802666b6b550dd223c6ac50365b1a365206d2e8155976be5c85c03083c3e52bc1d1752f1d8bf185dd20293fd764f82faac9dac2830ae35450c44c8a2df4fea3de27f09019d1eacc51708d36c9e619cadd4bca06dc7899f4902166a75bb0c3d99b6e7e79105e7f062cb610c98c5bf0a111bca673d07189fc515ea220b01e0c5118f5a7772a82ccf5dfb8b5390cf97b5bc860587bb095d9e47663a6118c3c001867e745d40fb2ff679318ad18d14aa24fee700de68c749e52fe4242a4df5eee9e6ff8c9eee8fa959afa174236d75bce87d77b82c7f4290b26878f07c968f38084c82c5b25eb58f0ec6a1d4aea8ebb34123063e6dcda9274a598848ca88ca3229,
+RESULT = 0,
+
+TEST = 61,
+N = acd94cad733f39fde078ccf7c214167e4173510a3a191b9c984bf210b84b14de0b1b913d068c1a45676a99678283510594069ac594ab508f0b43d84ba72fff6530ae4aadc577d0ec59b4baec9ac8a07f99f143837ced47fd2fffefe48d92f733dced1e51e7ec239d363f6ba2a441f08c96d03758cceaec0bf391ba83ad3fa94de39ba46cc6f4d79a4d060810d270645795d6e075287956a8928ef51934eca9618d973e88359cd03aa33344690c4320a88a6607895ccd7b707be73f8b2b49a39eb5179116428817536003a80580769e7a67a4e2f5e101f387dbfdcd98ed826e92dd6c6729cbea588735cf5aaf837e7e4b7615f0fbd3dca528b3f663a3ea91e0f5,
+CIPHERTEXT1 = 41aab5933530db9d53c4cca622d579ff15ba35792030b98a8dfb3f54ced0d10fafc1acdf9c38d37ad012223bfac63361ec5ea4227f1d8f81586f4ea982161cf5580305c874134c142884d86ef46097455a0deaf71cf19ccb5c20c461cd18be18597c0c1b8685692694c9292532b6a5f850a663f3415caabeb2e062a5cd50baed1380916cbf3b87780fe02dda5464f5dbd9f95afa8b6bcbe3c7ec038e9242c157fd9044b4b4e7391978e492e57fd61670c54f23a5752c9e445cf3a8627cdcf982741b9766d5f2161cb8cf92f42d3b75426faa9a261550ee32df2ecc5c4ef7b004a1fa3ce5edc4d6921242ef952e6f6140826cb41d370e1dda32e4ef505190689b4b170d5e71cd40afccc8c951fcbc264561a7fa50b986cfc69303bbb7489e6781be43d4feec92426ec1f72b719ca3f03d9e0b4fb6f33bbb17d8befe81e5355de5cc7ee4f344aa25d8351d1f23ef42799f6dd54a2a4b84e18f54cf3e17d046c269c3d8e9e50aaa2413bb3b5737e6024eae5d3ac62c8124de126ab706c64bd704121035664e79d8fcd7c7d0207b9be887feae0f0e36511cdcac1a646055b1bed3e280d7f19296cf443dbcefb910cb3dd263299e0e284dd287032c085448b49f13610ae996a81ae6cd887da66c94fac616f3d2fab899cb1682a84a8fa178275cb975c15cab28b5530b5bf48dfd3d034e69191a476700aa8559a1e0b1554173494f7e,
+CIPHERTEXT2 = 5241a0e7a4450ad6900795b67a17035da3d723104354304fa4baf40a4515a51b4a637ae99b82c26a027da64b0a8d28c2934bc09b96b24f6be1f3a2850f7bd54d7d13621609c660729ec1c7c0f2935ff69905f02f7a827da8b8aaad6fd5971c9a9f922e09cd37df358b6d6b57f9b74bd75d4e3aa81368834c61267441f459850afd46c6c2f53dd669ec8a59e98510ce9d5884b091f355d0d2f692f6623bffee7380fa8ad28e36a1f6d4450eb66103d6931caeb2752fbacd0f4e6fe9a5fbd1b60dd48a00d8d28c1d13a1fcdc15b6cf2111778869876c8b43f7a14dbb919bcf90e29e36f5c9726f9b4513b012ed2dc232ba519cece1aafa282947660ea1921aa49340f37d28e68fdd75c7fddf670dc5afbdd75348b1b6ebf0c9633e314996a4deca2c61774e033af013ffc145d237d2c36f5b13ee29fb55012c1378f402bcbfe902219b0318991628f779dad713856bccfedf85a7d6fecd0fd324ac161aab65224eebc793ce70e0baa64add38828f6bbb01318251bbb44d48a5a45bc279eceb55e340af9c81d84cb3698b52f3ddda257314c0c4272b572fd37e14b304f003bf526bd363d80d12dee0c6271c2e5a50ac7c5e4ccc225e14bf459731528a6932ae6d438e0cee6120a217b63308a5097047bf005c84925f6923273505d11fddee0e856122254553c7212c990c071f9ad571c6122db77a11b679085421bb92c0c47a02a0,
+CIPHERTEXT = 0b1eaac34adf4890a242e2bb65d397f49cb9caa0dbd171919ee362daabf3922ce9e0a86e72c5ee9adf04be7f0f9b2fd569febf20f811fe3422dfdb078e0447bcd24c1a5f0c6f4be4924f762cab4b973c9bb6e73870b3a6524d93f4222fe81b1640452d8372c798adc7941079470d3c6a98890d9a5cf064cba065d50a29121c365c20d68d62caa09d34ffa89c6597eff48fe158b121f530facc057cb8e7145d454557abfed609945b6ce6ddf3b4152b2c8d42fb32fedcb0ddadee4c0be3b1db7d3b8d9293699c6789ae30c6a98109e1960b7e524cc556ecdff1f2745fe53faaaeba8e2aa738f93c631ec8c060e27a5eecee3ae7b8206fe963ff04104a410f4c967666457a053138decd97d0040feef4dd922212c9fc375789e861affd305e3894ec546f5c21e1c1590d53930e4d99ef8d7e903a83db4b0a2e30cd1a57ed2347b3a96de10b3ce6ac1cd507b5ecf13485bbb40ca99129b320991a5259e42c7266e17e46eb2cbcabfecb582a0bbdcd128e54cb07a268d2cf00a7ebf2b9053fc634ed1318592b9f1c922643ed5e4823e2a5c6986055a6b49473ad764c91fb97db0b957319135d7a62534210f9fe6c63afc1523e6d8b9c16bf2fa5a4b82f5f259c0722ac0161578495037c490fb1a9f9c794bc4e8016a3497f7422fa1e98224094f89c2b9e786000e8c8d866c6e7349bae56740a342bd44c062470a1850f2eb2ec47d6,
+RESULT = 0,
+
+TEST = 62,
+N = af793d2d5aaeaf6a8db026103fdbb0de5b4d3ff6dad3fe11945865f704102a385cabb9ee8c0268a6e7c54f06c71f9f3e2f2b0eb709ca4c32f3ae20107d47babe989015e6aa48305450a62658054192893e6ab9d5348a6655cf7d9fe53a678687aa2131c624f27210360a07fcdcc5bd2e46e5efac21380aacde42afa64ec1ec0ad8dcb7a49647a8f2e3b7ffe9a4ee21c290442656719a3b53bee822831c23e6c799a010b74453cf783f930a40e8c09c4cccc1280315a44acccedfa1302cd0daaa03f5d0ba2dd672d2eae3b85f79b1c9854fd524581f0fd66214a4b4f9f81dbd0282ef7bd39aec62c7d5b286ee1769386e3e9c69f771b3157c618e9042a219cee1,
+CIPHERTEXT1 = 5577b3633d30c04ae743c4043689ef7bf053f9c92ed2a5eb70809d6fffb30d437b4e6e8d84639d44297399c200d87125a3d0bf51aa33001de1fd8f36e8034df74e31f8c3fc8bb8397c1a4b1d0518bbb6da2aa822411540f6ae48e6d5f478be08b2b07fda17aadf18f0cb3c7f139de33967a0ea8d98debabf7d544f9d56a939bdafb365e05d678dd40822e8203d50acf49c6e05d7f4f384fcda2a0b5495d84c4dd7470b44493a4cefb5befe88cb8fdcf4912f2eab6fd05fcfe8cf4837ce622427fb95acf4c81c5d16ead7d85032a0a6bab0a2dfa4ea153cf2cf06bff5778f272d8f78e701a36bae4d5b5ceb5f77fea85171412ef5efdc2fed592df1d67309d9ff173062ce0bb250b28cdb1abdef6d91d2bea411e05f15941fa798f391032dc3445b2c95104762b9d6eb26c6f00f4f688843e43eac3382f883f3ec3081b33925833a2c2436e86c6e745db30cea46b3556f1bf6f404f28ddbfd5cd80ffdf49ce11de5d15a071474ee6ab84be56b7648edc370f9e7d78d01a07c8f5b6bb0cd8afb3eb781e5abf3458395f0e6c03ddf49e56a977f0890481dfee42869e975c24d8fcf00022345a50324d132b34d386b7d29d06ac5cc39a3dda28f4598bf1e1f8c9ba6aba085ba54d26d27c386785bf88db2fa5abf785f78a1481c1091b961ee5e93b959e54e182a2682372871f3d5bffce4fdb92b5bca72b8935d11b33d6b8ec4fb42,
+CIPHERTEXT2 = 778ca4c6f0e5785ea82d9573dcd532aa7861ff91400d8b2c025e507f10b88312fc9b9d0346aae94296997095f84da1e688cd52f55660358f51ef1897c0ad30045e53c426832cf86679ecb0abb655c6a7d5d0a42fc30e2d118bdd390b6e5dbfa85687fe3cbff96dc6d34680f355061a5894b9d31977e30dc2c5a5d52fd52a18ef99c13bffe9fb81da27628e15e67cb2ab404f5f2ee98c58bae50116ee3b15e670eeba223e18172ce4128d93d71bdb7ac47daff7a2312575b73f0f471a587bb9ed038308a3201331550313cebb56833006b394e05dc9cd1fea58dcdb112db09c537df353d34f2d58ead73b55dd690b2fe6f4221d4f0f1e5f662bcff51fd9cdb60f3a03e6e72bf5da6437f2b321064f457dd14981bd03037f2835258d115dcb162bd73c8bcbd37981add53c3d32f5fc8703450846b37616538098db1d807a90efdb52e019f987b21b094d9b152d10d3ca611660857f5f8fee4a517b0b27f41022d19d7c74d2c7fc5e4f139750e41863195b33f8b40eeae90a82127b8721c7512930efe51103fb747fdb42a88e99bfe76f2c33211d7e163b9ead57eb5c3213f4880fcb0fe2429a090be7a24c38f1ba5865c81af9f7acaac886e9490175d561c92191ae21d278bbf302aad98099aad5d5df9feed807cfee56b568540900fe8d78559bf0bd70d14acd03ef469e7937e4b0af6c561cd34133e6ec278a48f6b38b891fc6,
+CIPHERTEXT = 6e05aae4e95e32f61061c4c140e598c9db6f31ad0e98ff3d887064d13a0dd13f058d087e127059d01ed71f42826020361c411fd7d5be25653ad5733767f6a43ee9914a531d3dd94bcd3c3159b8f9d6c0bcdf59d0f36f1196b4c28a98c33041a8e92533facc83348e8aee42782640984a337844784a98468693a61abe2d71705406e2d0aef982c74839e8fad31e0bb1243d3f8aea0cb1c00b97a9d73c85f2f98348a429ab2febda65f339ce36f895df50b84ac372f7b31b3549efd6954d17c4585c623c7715cf979f6d6752083501546b035b7f6a7dc34d7b22f6051faa63010c5f38da0a92497faef9a51526a379dcd95f5480dc4c712e91fa781b5155271f81988fc4914c88dc371e81cc1deccf3a4a81418d96475d06d767615bb7fd6980853944632c6007f3dabeae100b6b2240c6c3e8e4db1c7c666ff5856a955adec9d4b19d3bd3425376a185655ea68ff84ddee72f232f6eb136c83654f8fd36cd7091fea1d06cfa02b437fd66b01cb3b2764e9369132fd658f1b736843f77c0773229f090bfc1506da561f9bb2401a0264113c9e0975fa3b811d1e0dc54e8b13dcda25b9f757c75d870d5a28589aa6c633f5eba1558f102f33fd23bfad1d42f4a55ada3c29af27f4b43441691298b26ecd0c31ce28c7e940de90df16d3f76ee729c1c7ceb2d7737968fc477594502b85b576d68c64c32f8bccfb50e4e94b2c7c74d21,
+RESULT = 0,
+
+TEST = 63,
+N = cf43326ce7d15ea3deae04ed069a1cf402973367cc02e134590ea7f8480e1de1e44b553c41544d149c353a5a5960ee4f09eeb931daa484e7ef613f1b4b1ecd21cda6c671a8f5588d107f09aefe8812e280560cb646737adb28528cf2a665562097b466f2f61db7e4a13845e1ee981edfb99c7b3b6785ad5150093a6e00227d8f9238730b08fa511188455633daa7fe6b1c9daab27448f34ad276c2a118c6399908596d231c8649978b5156e5a9543d684abdb1ef9bfc1c6f9bcd974e09eab3b400c6ac7fcc605a9fac5f9cf71c752d3e338caf7d02e790fefdf6b46e64915727f197e73560bbe3110fefbf065729a3fbedbe65d3cd99842fc368bfc65a199bff,
+CIPHERTEXT1 = 3500d764b9f226d33862f81ea0dfb3855ad1bcd812bab8f6f92af2cb3e2f601215da89cc6dc4d13da58cab8579a6c0cb8ee6ba9e344a480f1130aa7bea1aed25bb8bfd56903259ed0e7e35c7a6d39103e3338af6512d7aeb65bf5cf092c4b686ce05d5ce8537b4190f00902cfd569d91fa46833541fcd227a7acd92c8ce561faf6e1fb52374da93febe4a46d1aee33028afeb1a35a7fbf785d97e0d49b5361ed93c9477f14fe9a9e06994f4611dfc6e7857cab00a207211fa57b27bfa05edeface4a3ba16db6a459e086522905d0d35e18e4b8cf330e90488335a47e202b4fb827c1a0ac74ea1072f9174004bf0e74296a1db0fab9735a89010dca576b74138acb995f4c3925ea55bc2ac0d668d9b34fe1bac88e4a65cee9450521a8a4c5953bac2abcde312b500ad385644b154ec9c00fd76f8fb535cf4edb761aeb687eef2c54bc9bb06bb68b903e1993b4fbec6a821ade7ce4d4d24db1532124c22aeb2241bcb2b0e6b4b3247883fa03713099bd3347597d43dba009103ee7f47a8e7c13a3c1fa99152b649620a5851bcda6a6275e0a70ed068f3c86a0c2ac2e967537f2607031002c260131a13bb333a0d721c6808583675d9351ac38c199a9609cc62f54a767c7e896dbdc81f9a616c269eccfd8315ba79f06552064eeb8bbd117f8dad2748139b27593339f425b1e355505069b4435b6dfb0149e4b78c1a3139352fd04,
+CIPHERTEXT2 = 3c311f43301dc80d74954eb0269a6281ccac16fced7ee1f4aa6033b11997bbe8c6e26be04154deb54a564a97a480304bae9143f820faf4441cc814686a36a444a82f53847477b3b89e8935d1c8b4798309a91ef680654cfce711e7b504212fd8c941985a5cc01b6c0166e3b0173f48d16f8aa78cea889e54ac645ac588f688f56e61eaa7ff9a945572100728211cb434444d5e551bcd696f1e39d4c233279968313e532c0b23a86e4f05f45e25ecdf592dcae50cce6036e49f0151a116726febc7e712a1b596149c8ca236bf81592dd1ce9e148272eb9ae4315d697cea2fd9e0fbbbd3b2bcaf31d8e1c4cb30bf4381f55d3eb56a716d2e58da3cb43c4548910dcf33ece4d2e2c34bf192e48bcee1b7700f03d12308766612846eede4d4aeb547a312af44fb7be0d6506a23f6a9a847bca978afa8787bbb15283b56676b9a59f6870dc490d21628e2dd3ffaf4c327f8dd5db7e5424c0bdc5dd26abbe58b1eded2d855b185cfca3e7a273d4dac362a4262820887b9b7b2513122797a0219636bbee47fbd535bf25623f064c1f66be9a48331b40aa8a9a053ebf79db8fcb445df0ccda3598f1ea545722b67c98ba12d8f86fc36017a91c019baed647a7525ec919ded39235d081658a5ae53bda03fd4f96f682bdae997b29887dd9203e1675afcdec6c4527f367e71d7890ec9c0555cb3dc15526dbf22923f9c3b12ac4458af5663,
+CIPHERTEXT = 69d56c07dd81cb4b212fe560900104130a0385222421b0eb5a64c01d6ba84b1ac73e5b02be5835a1962879c90a479fce6044033aa01a0209fb6b0b6c23c07a682cf3cf2b0b96a513b6adecda8a2f81026db8289d8ae39a009041b75481ef8a22e02c42adce4836955caa53e6efc57fbd342e259348b8daaabd6ed49baf56f27baea86c7fbbee8dc69fd5026e3aa432b54e7d9210a97ddbebe811f19d69557750a51453c4a09e787573e2612e0c89b8c8a0813e7bb59a8fbcb7f3aedd9075652b9c13a960953f01a92d514bd2547d9644b6e6a69181abd2ebde931365ea03eb0c40413d65a11f33666671955c930fcde04f9c8c33d8bad58cfb689fdc1bd42ae3dc6429679abc86a5b641315bcbb7cc7100f36f1df77bd239765afc9924cedf52a47382d25529337e3bf37127617fd14cecb1519b397a700f4b6fd85acd9c87ba27210f2da1de6d7f381812c60cdefceae03df4cda0b9636117ce4807c76b769de901b7b15c95dd31cfaa8de6a63abca362e2108e7d7a3e4c3ac650819ab01e8becb2200cf153373066ebb164b089e1047fccc476d52372de337de4fc2ee03424fad21e70bdc3c14386f9fe60f73cc1873cad4f20f2b9f5e4ca4de57d96d78ad078bc9a3178282c234e87cc20ffbc3d367c1f51915024f0e0ec1467d8776cf9750c9f4b0a1a03d895ce60aeb8b711dd48e7e7af4bb3513f872637c51bc1182ea5,
+RESULT = 0,
+
+TEST = 64,
+N = ac277fc7d6fdcc4980dcdc744411afbcc85322e5aadc3e933e580c5188300c5e6e17b2dbf32b5c91c0fb090a9ece6b23fb744c4dc32fce1813a4d7be5398b34e04a7b9d9dc0e2e8f95034ca972f760002b0fc6ade018f72e6021a9f971c4b43e4d5cfc9585a76650c81e649467a1352148a44669ceb3c65cca477c6f99812eb6ba53dffa2ff36ac7958b00cd83aeb1ce5f857bf6f54476cd139ebb134d9ad2c7006387647c19c9185e49f470db5d3dd76f80bc86e63dc933a05e6b1076d376f8c272815a5d05d4d2defb342b01edd36ab0cd43a6cf04f08756a72e4bedc1cbee518ce479c0a025537d9df5a85ad5854e099818e0ffa59f95ffc3d652b1670c87,
+CIPHERTEXT1 = 33089954f486f6bcf0d2ab605ea2c5a5ad0a8a2d64d78729b37e8dde2cf6267dae9ecc56382e89d09eacc714bec7be4b59a1a35dcf34ed6ba8c39b57cc5b614e60ac80f623c21db4f6107d6f65c307f279f6ff4ca4510afba3797b8c40542fbe835ed846241afa77186d8184d511b67c231ae341889741d5f9bf3aa8bde1e845d08f26ab4c4ebb02a8d05c6510542f61f7cc61ddd702541e448bf6b80659b58f39260c509ad2d033dadc746cf9d1d85678ecb0fa5e7d2e2fedccf266309168ff82e3e18788378e2be3311c247308cadef6e7ba9748a6f33aad1dca47e72cdc65c9915c781db92aa74750b00a727ad0649378a2b54649b7ad5f4d3cd23d7b7ecdfa25ea631d10440dd44105a48c10e70b88f3f2c7178934727cdabec7bd803125f7948e48691601ec01c20e51e4d51d36ec69c192922dd03627928dac0f2a5d6743c8359e6306be91e4551b0436604a8b933b077f6350672bb097cf3339dc328ad852c5a66eb0471a7ca8da7e01dfed82bcb73c1dade021fa323dc63469ce5d516c46482133a0c8f6e9b0e697429a1c571ac9c0677eb5b1f231f780ca93feff2164d62b0d5f5b24b1942cd7d4b3e0711ce8c487f9e4f22d4944a64fed0c488c345493ee5ba14719142baeef93cbca15e67ecb2e57ca2f59e798b1b6ebe76a52d6e4f6354fc9835a88e4ad71eabdc3c4fcfe3edc03c216a23c30be6c5a81fa39b7,
+CIPHERTEXT2 = 3a2ba6dd299b2b04f35812bfa6028f962c2719db22b865b2264cbb0724bcf7bcc39a23c919cb50530857f3f707333e301c57ff8db6693efd4516a92c21304efb3d16b0bb859fffde84a6501b174cd444fd71521d7f48f221f7609a455dd42c047df220c5844db17ce7762192d4d7be0bc2181c8d07c8a4e58f53bbee4edcfaa2654f29ef710fcd6aff66d47f10667551ea188017de0a05f7f39816abac82cbd2826785c391a0c75268bd15c5d13d6d6dfb6a81a2415615e17096562194db7151b89ec9a539dbb46db910a3e6061454187d276d675609cdc45db5587216f2b1c1847d772d4f31357daa5ceb3d85d283159c89322d737f51014113f85750239b8dafd543d1ac5b62e921e9c6f379e51e8d42d13dab83757b2d9851af29a900a00e93db624b5ef92c4e4dcb557ac887c2134c858850d85bf8913d536740026105c7dd30e81c32f95f5705c1a3dfae73e70a30ee8ebb0a36f91db13856c47ebcf99e7a39ea6f45ffe51e909354ae265615606cfea82c1c2084ddaec358b55b5d7d25de5f2a60e6e5407ba29bbc311c223fe5bdb9b338f375b354746f342d4851d98a535d9b325b47d2e5e773d1f14a1ff27c8894a5da74369b31e2610db880e162735f6cf3283a549c122ec22ab9713ae06700ff878dc16ded27a21386fa10b4e74ed11a90e8e11bafa40a120b5f69f02afcb1197612ab8c6a23d78d5abceeb35526,
+CIPHERTEXT = 45f2b4a886c553d1128fb99d2622116d76e2b983ce462598718be952bf0343a96505ed9ef6c52771ec066ffd1dcb949fa8cc75c74a990779950732c543bbe5684cc7734b4f54365497cbc198624ef5c6116038e1ab9e497f258920ae2c0facfc9ad21c6cf7cf9d0e45a43c3785a7a3773e3d997e2aa34a247711f513ab2831359f80593de59cd4404df3395af515f8c7b903d91417cf7d833a319a9de5dedb733a3a386ed878ab76d9d59aaada6bc18c9027573c5d0cbc4ed06f69895d2ceaecf35e8293146e2890f1f4e35052644614fb9d9489ffbfac0a417d077841005ed524ae9e834f045058e977fca1f21bd3891c984960450a463d608bdc3e3adc7c848ebc8a57ab25fc2e278b0c4e0029d88d082a50d189e682fe74080a51e5f2efd3a4e205081dd3733ce08aa8fad9cf1ef61caf70b6fec7d97661ec014a13ad6622d75f9502bf615e399f3b6200e65f368625c9d5994da541249651d3b55cfb9994e9bab86b273a3d6986efdd4fc66e296aaf4e8fb9be88ac42e6f762c1c96b52b4ee242a26771918ae7af4535a97d359bfdc34169a9b8f94d69b37817fa3b82ad047e872bd6755e76040d61ab820eb6e6b7e1c0e80b1753c1557ed399197180a3106da675d5e2a9923b0861e854abbf6e01e2d9d8d0ac267335f58c79895d3ecb1581b8120af1fcc0104003318b2d10f34b70f51b8c6d1dbf2c12b6bac21cb59b7,
+RESULT = 0,
+
+TEST = 65,
+N = f309c5766223cd9230b487623735fbfcc01cd0ed1246e38bbeec1356bdc94c576118b28379ea67da2831b6c790b390e7151a0dbcdc1ec2ad72004c7f07c1c5b5be7fb26da9c0b083a105c70b927121aa3c17236929da283f1afc133d4fb9cadc979f763f64cd3a05783997b17a496ef33b1f6db073e5eec8c108c0d446ac21ad6539b9db022005903fde91193c25cdd546cc4db9ba6d4f1b52a3e1d1ad48aa7ea18d6a1b1ad6a90016e60346a082ee8ff2265d07717df33bb96fc5edbc6561e007f83e4ce4af0565dbbe908fa4e21c56236691ee2ad045c9aab95a214c32c1b2cf9f635299a893e7a5a4f4a62d7353a5ff2ba300d15e9bfe76e0317623d131a5,
+CIPHERTEXT1 = 685f59b5077a26a0111524f597fb6d8ed50794d8be0188657702907db5aacc9b10bdfa02cc4b82c0fc913490367b2eea60b8050e1cc22b3da1876a2cd588e7270c7c44c6d05a7baf7195f24036705955d73268559619e679e4fde5a97f8b4c3997d182dd7c16d3122dd0248bbb9dacc4d2b413548a28cf8fabc9f25d381e659afdc1f73ee712458c15acfd9d13f6994180f35c8f4d11fb2f533533f4cfdefecde36224e31ca154077c1336780520f944661d4905312f1d141427412a8f1f9058eac3f7681e52b2f2f9b2a91968ccd1b143d07652448dcc94740a9d03dbb992c781595fccdb21026e38733cd71522304389ce91dc9acecd5847649019f92fa8f314442f68af03415d7469b1406bb2cb1df845c861da43433c488ccd4c47525312dfef3c60b365afe8d05f14f02644e5fa270fa6d4dd1b6780056eee32fac135a2ef1f7e1f0de3516912613149bf85377f7c273d057eca2800770e7a303297ef06ce74f6eb679ad10c0fd4aa9b0f57b798d91edb38fbdfd8d900d3a3c236a211332ec59b07cebad9a8f78d392e5fa1d6abe1115a33b413b2b7b78fe4b89941bd28e5e5de50e0ccf64aef02b0f9afecd0b8b1fad21be0f8ee05b9c7c31442b7915de84854ab385dee4a9ebbc974f9180e6933720727c6659a2454818354b12db9d435e91a64b386e2e9a1d8dac3e8c65fb0f42aecfe527ab5b71a590a6c32c45478,
+CIPHERTEXT2 = c6f9d8faf1eec181e75998ec98d74914d5d4bcf229526e2d1d70d73867aceded313f44a7cff8bb7ce4c0daeca67b7ffc5f674a03af9ed6d91ae8f50a7fdfbeab126b8b0f21cf34a975dcbc065f27d6865a1f8875b4f468176a124feb7d8503b16b5d23cb33e77c9c0ebb550f055f2451ce573523c0981ae40f43de3c2da7666d54fb500336f208a2f75f01d66535b87f798ea47199fa0ba0cfa0cff26f38027ca29e98f07c18eaa2bdb0d2e8243df2495df9ff938b0858e5b2955728d569986cbfccf37d0a85b73408525788de80748471d24ab86f2557496dde92c4895131789041208182a7e40d171b4cf740635aedda4221a8c49b69244ab73cf923328f3aab34eecef14929db0e78ff45e7a101fb8a959d921233f5cbe147ea7f2817119ebf0f634e96d2838f82061575149bf84afeaff129ad948a84b050e83d923e108cb2a2e7c6946fe6167384a19cd896049450e78afc157feed845d92a67cd67ce4adb72558e81e6370fc1e7b842ecac896073c5fc8d787d574c7df17e16db95b16f33c33223d875beaee09ee5f8df6bb23f80870cb8321be24abdf691dc280892de83835f92d98e0a0b3613d0426c07948d93cbb5f7e0b9048d41b42ab343eb33d6acd15423aa465bdaba6c97f088a63094e7d15800a00be4d8b7310a71998016f35c77a3b13516c060f14b0f19c7f92a94b4a7909f4b1ab78953beeb608ec252ed,
+CIPHERTEXT = c2d542b9f610cc79ea77864657b21ab5a689b91d5de14132c0cd79f84023a0f892f6125276783163110d52a66cde3e62194894c7a911d5cd40476c279abfcb911980c4f503290c2df4fa6293b94f429c2c761444b85cd639c7ca691db7df31e066747115cf43f4d83e7ba7857d225dedce150d3a2024c7e8059900ad8382d758ce9f237c3b65d7cd85772bb5fde243364de086c4834149f48c0af25ffcc55280b3d90f6ff5bb18898f20cc79c9827feb87b09b7128b70bdaa64368171a92374f283c73f3aefceba60ddbb1823bfe4e29cb70ef40ebee60f59b73afa0922a917d1871b6a92ff2c60578ddbe895a0f1f90526645611b9897e1a2b6b23a0d3aec92596125b950be8a6f1e577f280f4d502fd31d5aa1ad03bca1c4f04c0d6d27f6d7f8b42bb4c39620b87d77dfc8848c8d82562c44913e76186f14736d040916063027ee8bdb59e34586f8c4ccb127a230efeae5fd94e4c3b527a9ea0669b17195eafaf6e83f4f81927e0388597b9f84be3a6aea9a218d51fe7b44e2ff1db0bb566a509e6c551c27b4c2f34dd36a14cab7088bc50bd9d2938b74d04802ba2c3fcb45e9a2a42e037c69f1eec85ef416f1748844d924220bb78ce04453560161904b10d1d322a12080393bccf2a7cf0133ed5e436b76b2239db3c9899d6e6b2f473c541b663767d4cb18c70e75b71e6322fa1dfb1e802563c0a90a0dcfcddc6debd792,
+RESULT = 0,
+
+TEST = 66,
+N = b55ea56210154950ea7924725c29bf2e7abd7600a8247378dc8dcf2c3e60bcc69c919aaa2360c1fb69257e719636232525b2be2bfc225e7936348de612766be8463e49b51e7153d42c46f5304c0deb007b9f6c3b1cbbf1e4770af628bd056d3947942cec076d25d6f395abbafc3931b5ab9ff0caa2e350dcb4822d6033c5413ab88ac42fd3920051067335f36c59d5c78366a3f21764ccf77781fe09d7b93b23a470e86a6a018715d66398f5be28fa28d4fb9a71f2d024a2b10c7044b924abe52e496e0f7a6d3cd02e41f96b60ab2272f8323a60651bc210a3736e33ef54d217ef90a95454680f0367a4631ff22d0a784bc8fc74f46db3b58f55886be65b673d,
+CIPHERTEXT1 = 031ddf285da542fb8ad3925c9f11016717233cb8255ffb3878daadde1259753681362e69e924e6b35ba67eb8c4fc5218a2872d9a276e342f6a69cf14be0e10f2bd61d4b6709fe389ff3c533368e2943705035febdb10f428648d8961f6da17cf864a2a45a8b8785c5827fe88b1f202260208dd2037c0fa7658152112f4244eef9b2baf46f99bf99c5c81666e26bb7efc58146571ed0ef584c861dfc60a4cfc9ff6e8b64fd6e3457de714f18587df76995ca571479c79507ca16a6b0ccb522cc7f57084a80c5cb3b08bcb9f757475a442680cba8f343925fb11357fad174aa7e69accf12f274155d4a7956583336910b39950a7b13cc96337b93b873930504ad988c0589c3f514fcf0ab38ac41e2cbdfbd196bfe654b84daf35d141578bb98833ca3411879f5f41509f5e75dae4c305d1480cb3a764489c5fb2a1b5ef50b0524ab9f38389c15ee651e40db6d3e0ffe314446ede22a6031453dfbb6378cb22fe6c0152b4609f2bff05a8cb49477f4a4b3097e2a3b82506b2a6f55581ee1db3ead68b2c6d0993e705e0d54f268542de4d1f3d1249b097f12d64950e17e6609dae2cff04776575bd0428eb8d158ac847219268605bd4ef76a929249c75ca316db0724613739643aa2a9a2a5451cd7c4072463d8c16ab9ba79ea0e8a556927953d4fd1e28963a5d2c3ee50228144dbbbd6f68063471183337d47b062f416e0c5d73ce,
+CIPHERTEXT2 = 1f9c9c7923c9ab7367e1ac45f8cf9506313751bbaceafb3cb447db412c396fa86cb04a9ca09ef9a0f5dada8fd1e3964542cb9bb8bfa3636a3f9c6fda03e4d9bae0414a44288680aea751b099ec654938d051f1044467f46305d2297dc86e7c9070960746777c3837286ba6e1e8f2633d09a677e6d952f95845b0448463a20204d1e1fb20374eb96256734dbe5893ae6287107d1cbb78732ad75669f4854bfa3b6ddfdd94f9b27435bdba11d517eeb7035e220ab41e63995e64f023c839375d8b99dc71de0be026f5be4097673d3de3bb8f41467b5d4d50c87ce942e5d30602b269c190342843dc50d570da14bc6cbb71e8c4dd9fe08157017bbd28194b514a22d76f0a7ec3912ab891361bb1e64307a72dd4a8e44226a3c23dda2a1badeb869f878c6e86929ef5450fa274a6902e766c191aaa23ca4ccb14ebd9263bcedcd0bf170c0d35d2c83309d90da5bb8f154f112c91fb3d175f9d3fd3ce788d503b78d6ec1d89efb388b8e484fff1d37ef28e35078343560a2d9908bca7edc0714f7d66596d69158607a194f4ebae60bfaeb37c67d4e217241325244375df39e101f54231cc7a6301492adf2213f91ed3b56f23c664d3f530917062e22ea1c7106c3441cc43bc68fd5a0d7f6df4548b78608dedf1914bafce62859e6e97e9d88ee3f1206cf311f530ccfb5a0751875d42dc05f647e163da7eece174dcfc91814e2abe1e,
+CIPHERTEXT = 47c7ffb054158b5b75b5824cb1a1eefbb70fd9a66b8bad2110ef7d84765ef66509a43a899f4966f8eddaeac59659ed9a746d61272bd14849a802482e8ff24ffd4e7730e7bd946dceca14c06b2af102d9509ae8084547c9db71f7a67c941fce173a9860fe78dd7dd45027b725e1f89c1d58f16bef204ceb763eb8f3d5290eea089b1c79e2cefc31b0ae97b7e368eae34e3135e89ac865ec9fccee09666c1dc15078e6291dde38fbf3f0dd4d7379ad49128045162d52507fb87e93cb536bc973a5445e21b8f2e58af5118cb10beb60a5b50873c34a7ef1bc10ca94c65461e7c57b9a4b1fa2ffb6c58b5d1f1c78fa3db4beaad519e8bfea215099b7a217d18c83b189029c262226beb9d575329a90ee3b61b48f01933f11d7a9d73ade946a9bb624b5a6aae7d9c74af776a135a561d30c0c00a0390819d72e45ac0d587d30b27a2960ea62f6ad9042b466f79a7606b360c6b8a070a0e0569e4885276011160a3e4af90e3e3e6939617aa1a392d5b24b17d462031a6ef846e4a69ebf7b8df387f116693bfa6c230b8ae511963133d0d888b080bcf7480ae06c765cba8807fb1edcb1e2cbbe0ee969d635f78ab3abe4d6c762046bcf7eaf17ce6c91800598691d24008a0f9ac304330f68f54609ed3f3f5c67979557045728e7ae8145a68ba36ebb1afa38202883d3ec3d055c2ffb79135dbee7d55759384386b4c45c70d2dec2a469,
+RESULT = 0,
+
+TEST = 67,
+N = b534dcedb1d94b352983ecc31f4f1bc4e6faca2175f182f170e39a8725826b495de413ab1f93c6d89ffa960ea4945f308d48a890b4cacd92daaaa4a50b25259ac9ca89387def402c2bb072564e60ef28743a94a9aa055f8883435d967167981e16751ebfe6356267d8a8c58dbbb55a7ee2edd38ad9f2dbd42323040613ebb306af485e13ae63b775e9eddbd7baf943bd257c17b6f4516629b073df745fe02961112fdc532ff0cb797ad281ded5c0c53c9d72abf79d3f45073b4509a8e3202cbdcda8ab97eb97b4b1f74fdf41271dddd251e2b60707e6ebea046a68e0ce575456560ff1f9aafa509ab4d1945f2efe2f9f79c3dcd3d4df96492a78dd343a2b22c7,
+CIPHERTEXT1 = 3f1a8cd85ae94f9b451bcbff37b7527a1bedc90452553236587670cade043b5ab239565b56a5b7bfaad1b0bb96f3616575d74d9ce2a81f6520d4c56dad65eadaca4b5c40dfbd1ec50d2e195fee4b95c443b4248a63482f1cfda50bf10e27c56e576f4a80b0a8bd69880bf5e46e8b64c2669162aa41a0b72b98dbb2e062141e5e8488658529154749599c5c2475dc71d689a70b951c012219bc43c279e6fd5aad2560c1dbae624678c0354016867c217db9c8e2d42b48776917811487cbcdf4aa0ce7a4cb1fc89e5968451f32cffd4e2646c22900dce9aac03b418c7a16df72e25a9bfc7335dff067bdbad18e1781e4041fdd0a0f0466a262bebae48840df8dec33981f583d7ed8634fe6c38bf9bafa999a5a4f57a89b00713d86f470202bafb1862b7c23ff21a67bb4f3739cbf6c179cc6e9cd73cb0e425cac49114d8998c691c62a0237b4b1a881cecac2ec2f10eb1828dbb04ddff908547442670dbccc759ec7eb02b04d658c0f5eda3a6b6d537595599a8213397e56a954824884e948879ba9b4b47ccee662063b110a6b933c56ec87d6034a9d479a07c66cef753f7ab14889a83155ef3707bb3867920e5d1be32c6b9963eede91c8a261dc6e4e762674b0791dce7d9e17418a3a0da1341bd069a95660425dfb52678312d918403d6d3d118e7eaa19db8ccfa9efe44d4bdc4d81257ac2d8273270137de8d5c9d003eeb168,
+CIPHERTEXT2 = 4906b0adbf1161b3d3890e04b7e0c2edfa37b3915b4d774ba93e8e0b4237e99051e5d53b153f1887e77293261ed229c0f0a43800368aae813c01172c485c4e7c82e33364ce48b1769fec94239952893ec751b9c6cb5beab4631911a20e66cf8a4f48252f63ec5ddf157308e5ff8097f1b0bef9ec59b2185706297bb9bc933fcb718c2df3bd4622b8c392e987f5410b300a71dd01f83a2060d1115384e4feeeee681328d692748fb23c6b984da32ec69d51e2d56594f5a91623450f3a7857a55f3b31973df3bf9f4e857987447ac0ee0093bf22e12e15020d7e7d9a045f67d2b97e5a8f4d0577c3b7bfc63fa5913e2acf857650e14614d8b01f80a2861a6ce2745afd29abac9b4b89e65f8eae82825cc135450e0ea2c41d416293001a43cb6b8b158efe84105baa963a707bd13c500051823b78d5f8cbb82fbc07e0ddfc93be1fd0bcb23304aea4b41886f7d1061eebf90d07555938740590e16d96f2e64b74063f1554a3b99b97497efd5157a8b620cd7989389b18ce468b2d30a8d3261c08f59310c66b2810a98bb438946c97a4238a227bb4899aab0484ce4ad40545ac1803bb1a68871df2b4569639e0e595623105ae15525926b0d87fa24d841212eb7a8b6cbb94b8da4da414facb549c5158cd6c06492d01ec755fdd67b757bc6f532242cc9b415808bbe1421fbbc7cd5830a8f6174d31f2d7b5ba95b46bbc8e85c51c7e,
+CIPHERTEXT = 7bbe4fa3f0d9774914bfe12a5d74cb3831911a88b283233441b557f334bb5f5aeec1478ef1952e2163ec952418ac0bf9024e792c58555f924ff32410413e02039f2a7969c3fd95f8a0765b9f6f15624044438c15827ecc9747fac8a43ebf41fbd4fb47eae7cb259b32ebf42e3d0e1c8722d969d51d911eed2b112fe9fe8b90fc277d679f64a67ad91b57f63b172bd35db581dd8c80bce5ef307aafc30cd565e14035eb811be586c69b911d5723e0f0c4bb4bd0e41e8c66321bc9908f5aedcfb9d5265096d48e46b94a4c88a3eea1c809993264c8d4610a6353f184dc332389dab2c11d50e1ed2dadb7368d95deb22c101cfeb8ba82123f1beb9fc26765f2a5826833f44cbce6b6346780ecfaa0f96a5e99758ca28013655dd04d6ea55639aef028fd2400440e26eed4993171bd29f350d556c43cce2d80d9fc60abc0755c6f73dc861d4f145d919c09b19bba4fa4b3611cf4b838f85eddf944b84b23bb0d8757a40d5f1dade396c57be19ab880a75fd7d26c9c4293f1d7746b2b6eef64e6e9f237dda66bb1d05b837230481c0079b2d37e1b2362ffe2cbe0920e986eb590494b5db2a0fb9e0a50ffebe8bbc4fbbafddba5694e62af63895680fecfb83c755d4eed083a088a75a34ae7dd5e42137808bc47284a21aeb4f4548c5e5f757fde78fa38ef9b1bcc337a46779a11fa5b9da57add730153737b3391f8a62075974f3eb2,
+RESULT = 0,
+
+TEST = 68,
+N = 97ead1bdf274770d301b3f440c5eeab2810f212d0eb254e6b0af493b3bf7c2e2056c4730df86fb4fdd8df4da52ea76a72da286ec91de6c472e920bacd12c28bf24148a4b0151b9e2264eab553f54e84361b8103a7335e2ddf7ea2fe29f6f4268fa501b0e497cb4519aab69a3bff15f1f7855928f865c90b69145895c9d84e4c2ee07a51f0103db9cfb7bb98260f29151f2bd702c0e62e41d9e7029db2b49d473b914fc0d5bf2c7bf235daf1ec990df5ab4ae9c1bd91d3427202bc52f66ea2e4395bf6850c0c728638d0bcfc1310fd5e3700faf840754e9314bc9dc57a6b95adda53d3c65abf2a24f9d0a096105f550b0e472d96f2fa3012e252e1d067ec3a809,
+CIPHERTEXT1 = 531a52ceef413e0ac8f483f79516bb5a9e25882bbdfd0879381abbdd054fd7b45cb172429cd47f796e5a48131b380e030e47b33f4af2d6702e283c06ddc9eeed862d477b6e83350c1ee7c64c50e8befea26d9717bae497fd2a7bc43d793ac593ae62cc5838540f34ef295c1f6fbfd51325631fd65b79bfb05bdcc1d141d2292ca64024e294d3308b94aa84b3bb809f17ff5ce453d0dbaa02b197a815707e580b2fb376a89d987cb90dadc52198f84ab6f8a392e456b8af89c685f19e11dd0892401baf547f81c2a7162f11d10ec7d3e00f5d96cf37e3d301f3f05428d858d263677d7c32658493adcbcffa2ddc729d9db8bafda3356bfd4d5fba9a1965ab8f5b80d3de656c7d682458ca224f8ef80f545f141347869b1c51fafa47121cf90b0375919e254b153afe936c96a8fad14bead9c51bb6d5aa6c5acbbe1e6af398f28b047afc220283fe0530983f6f37a597ad461d28ea4731459efefdc10cb49c7cc8af87d87f7fc7fb3b9244adbd24b8b43e31bc03ba4fbebd773973165a237f2e4ace282ec2417a6c457c608390295e607b7972ab7de1ba14704782dfb8cdbeeaf2707df9eae9ad056cee854d849ae59f42171c272d2ab71f89c9bdbffce03c19b575823951b9924f43be0c0f66c1c19ee53b450c3e78eb9218256e2dc9b5d81a952920f063708180ddbee77414199f8da3380704189a787387d98f53d70e0052be,
+CIPHERTEXT2 = 38fd63fc8961004379aad86e3f86fa3a6ecd0c5ac2302f264f0024fbc03c795b726cce75f3d9873d449f3972513cc898f644be7c2402e38ea5b132b6044cd38bf2a0b539f9c4548c8d1a429f04283b5b9fc1ee3717bbebc6a62bdb97e013a4e3ccdb9ce9f8e8022e66490ff079f0dac4e8f0e232d2fea46d24ee519708f57ab8de29e5514796b3675680957e21ec6ba364f5f862a38622eb2f6845f71e5d5fa71a662e9c744b14b71edf677bf33e5f65a2d0d92ce014b97ad225d75a2900d41656922540575940fbc5fd24776cea9f9ed09ce61c1b43bafc4523cbc1b07dbca4d30fa69b526796a42057972ec04a75063b4607fdca61b177401f017290fc1d36cf5361213876b4e745b1b022460c08b9d87b583bf6f1deaf6a8e2ba1a984066d946255f77c7710db5790b1539dce229b89e0424df6dfbfab9225a3bb10402ae88fb3acf2ae037c1c3ee8feb84b4ecdc51da50d8a0eee6ff0f17495c8feed7f2b735444424dadaf056968f1adb6e4ef2cd9d1b0edb528df7ac35051c8afb8291f4c10d510c69d550141289c69e61bfd8e045c5f97f30d56daa6d93c2441a329e42d3b09da30ddb2400e3d7dd361c15f0f07d31027c7829daf8e5dd10644b6cde97450306dccc27fd77dbcc82c81e80d12723c1e2d7e3384b280382b25d6062a3b45dc0835b54068ba1ed11498b0f1abe935286d24b0bf1a9bf4773d46e3c7c513,
+CIPHERTEXT = 0a7b583d7f4db70c576f84522abc71f6f2f346eb938d943748850054c0b3f89bee4250b7c46e6fa2cbdf4e835e2921b1ed88d14ee2154f02146369d8d86f01342815e28e1d28b335810914cf1bf033a9e7aa78847b26f45171d9915de55693e0e96b622c66989739860f72dd89febc301f046028dc336da621fa5c786514f0c82cae62e17a2a32caa5607a66ae8f9768d7c719e26b95c792add43146d70d8f5677f83c1564b579a1486bb01d9c865b47f58a5317fa56aae79d7dbe95eed4bd947de517be7ab9a1c8fbf83c93fc675c90411cb801f27c0474d831e73477b22b863e1632aa026bd8c70e1ae3840387e811ddfdd9b9c05c99cc416a18201bf54df2a8a9bb17127cedfa3a6ff02c4123f92e5e9c00135924aeb787f4d33bec68fc039a14f7dc99ad04f08422225bd516d290c958a140ba2e762b7e5d8c29e9b69f11dae50e1fad6f4f7470b3672d871ef6a958a13f092b551513b37adcf835c3427ffff492868d86ac1932c0467ef8fc4d39151e4605e5df4808caa335f5a62728849220a5d440a7acaa93a2af66059df379abcaa32127a18bc042c98fb9f0d511949044eca99e00e7329a3ee66bb1fd66a4ba4c5dad97a419777fa537ee12e6392071d3102437c22d65cf47d0f2c95ba3a186a0e2ef83e00590745832bdcfec26d3474b2b006e4ce258dc5143092a58b6518626f8a6abce4c4ad351bd8d4e6cfd30,
+RESULT = 0,
+
+TEST = 69,
+N = c8c09aebecbbd226c49856ff3556fc440696c3f5d2cb9c76b6539222d58f7b283a1e8d67cc5ed5d439743a116a97ae9eb6fb624c0ece49ef7fffa2ac0deebb781b789df0ca3024f509d4d775c1377467fa92e8a88681d426bc32bbbf87bcdd6e82a4d16aabaec17d6039d18cce59c4a9169600b59e4c75c4b6da6ee5ccf9d5ef595768968148c5d501e5327a048cf50e13dee589852477e0b2a6dc553703aaade505144056233cb950a84f9be35fdbaa3c61ab764603c6cdedbf639e09f5ca88437061c95033d7690005b8689c53dd5e853702aef9cf14450bc0897b2fc0d8e9dbf7373585b8285a9ffb1f86536b6f473d66f4b319f75ac8412113cfa1b03c3d,
+CIPHERTEXT1 = 89b650141e7547696744ea3b8d0e99ad2d71ded6f01636a84bae164957fdeac75fb9d262e3ebf2983b9c8bf795b22839745703b8988a88c208258efdb14b1c6537ffd3fce53445761ca8ea39d4800396cb5d7a3c2baad80a619f59718d405afa94218bfc13c82c762793a32e3202b64592fb4f225e7e38455d3c8c6bbcb12d808aa325ac44a69ce0955ea4f24040651352872cbdeb2baddb081387db3051a5099e2a65290ec4a644a5330a57512c86bbfad802c2ca2afffc210a2f1681b88782830e0bbdc4d827507d6d25b8452378c8bc0aca30e9eec082994c4d8a1b2894383218823b8a398ea392c3a74923fb6da8d67f01691e941946d3b338870844bdc12d2fb33f29a8ab0e404c4ce201a4a4a81b625f47bdb616e42515e77738e2f758c3e96ca022a15614a0a6fd843d32374e13a8d77feb509912968f041f68860719a3a55e98621208ae0d80a97fb1c44eebb1f24acc95b1580acee8156638219a59c71d302599bb8bfca2f3f85600c72f34c4317738657c505d060b1f03072782f82e7fb06214ba6f313916b93f85d391bb9eace96f41fd78e53b8829eab1c57f844a35ffb28d8a8ef9a3bfacdcf45c79125c4c5a0c9457a6cc582bc5ceaff4c14c436299ff909fd0b7c552a6452c3832a370e657228123a1fdfc78c321e105f318a56d255407ce10907bbc6c3ba1d3073414419a0943b747fe655597ddd1226d45,
+CIPHERTEXT2 = 2dae843e7eca93a55bcc3f3b9b8b30df50dd3628012cb741da0a3d501927414bd245b5f05c2e6d497c02f45f4e7c3ac9431c89846fc5c5bed632b94e083c328a5a076bf6552a4e19484a4c4bf4cbab464a4193cdf18b176d985430b6649df30b2312e417e71a64210113dbba218f66035e356e99ef179d0380a13d647f3b47b6cdd324b7964f6b3ae94160d50907fef6a52cf1ca652bd1592c0f119e419e8e39c0d1b74f1c483233df094eed3ab5a167a31de7efc67347a5b3fe7fa456d6f9ba647da5b6824bbb4ae422a0c3a0351e1399e3c922f8b5d7a55c1c80ae0316e94a426a620cad8f1af36e29a92eb65375f3101964992ef6f7a60a93c696cbafb82f32201bff0f4decff12b9875adb4d5a3e7868c1014f17929092cc4a56891a8b9c02244b56664dc0f05d9a1982dc13dc4376dfc52817b6244f1666795c3ccae816155ed2f4c730a2007b167d46ef8f20e9ae89b1636202037bd180740d425c204981687638899af295e2e261828398969ef8460a6189db645b8e5d7637fa8f3ff11af5707b4fab42fbf178ff74c52fae3058bca5f1dccd308c9a120d58c6d26e4687fbc21c57911475a9398e57a4ce92f4d6be841ea9848aefa18c815dfcdab886f97ffd646e9c9b1f13f0ecad22373f4d7cc85caf3b94a3da6d13bf1259da8050c22f2252eafc54b66be92f1a08f2ef30cf063e2ef51f0a21a63f7adc7c9bea14,
+CIPHERTEXT = 5847119d14db39908a66d9397bfefffbd5e1ea4659b57af0c6da55a64a84b7a12356a65e48ea2599fea113bbd119416cb0439d05545d7fad5d0c3e337d5006cf4bbaf1f0efe5605c05d3f99583971a85d73d10177d8547ada51d96b4c681cc163e8447ff93b3c44a531906b43a88ac1dff2f32e9e2102bd5f5a74144a78007abfbf63145a5b64e2571fa91032e22a365ccb4e3254589bdf4ee70684ac2af3ca14675aebcb6d974d671664653c5999f0f92dd9bde352ac06247b15d300b6549473d892e6ecd4c7c93de771c1c9e9d6b2e1c35d4957e74d06f5786235b8c10b674e6bb5f507e48c27c3b46f5e7cb76bf9915c088b94fa123fdca25793784b55408d514b48eee6c4e3c397d6d5460e7f6a7f17af1c6fc60e85da382cdf6c495a5cc29a8fcd865fb773bffe68a1a3c02a004d1a2530ff0977df06ffb1684fd2ea3ebf10335a27b8f8b7ae391470e3a8a3d98d3091149b7c6d7218130e5aec124d760245970809c580c9b921938089ebab1947c618ef58efa17a71558074ebf3ecd24e54c0e19e0f2d204782e2f5e5278ffced3a94df24445453b0c76652a57fc57ab35f8d671d56c9e05d54bc72647f48c4b6fe5456d82f5d6b7f5207cef6f67582c0a10413aab6788aaa5f2ac7154646085c72c5af7b7dd10117f404bb059c01aa0f31131a433c3114e7badc9eb6b71d540252a3526183cec4aa65fd51e0d673cb6,
+RESULT = 0,
+
+TEST = 70,
+N = b52fec0abeb77f631ea7f6eba645a4d0b7eb3415b1aa172947f432996dc875e998ed0e7a41a8625d04a4dff45f9fbf3acaefeafce0b718104f455cc4822ab92bd21c4c6247e1596a99cf5b9b938874c2ec97e61124a497a8a996cb2c0694fc9827435b125bb735d4f80802f119d650c327449f196edd05b71f1374068d5c8c8b04088699e2e8df4890707d67aa038600a0cc4e0f8e4c9e68a2a8d3b62418f17e0ae11cd1857cec6a40dc595ed8dd0bb596df20543e03c8f443af46aa45d591522cceded2835135d58265ce6bbe4eae4eef12447dda0450e02bc20052556cdd28019087dd1b2d0193977e57e1f3ede1a2a5ffde1df370e089eeedf7645fe613d3,
+CIPHERTEXT1 = 7e1ed1ed07b315ed0ae39098279159cec41c50f280e54e7718ed9a16643d4dbf84ecfc08d0e438772f845853a50e9a52d91905b746d758fe813ffa0f5714741e35335425580e7f27611197929fc37acda2e9e54cdc91b193e54120b73ee71fbdcf5a3effbe019f852cd6694eee51615ebbb30d249322ca4683a4a13562db70234d73b02767da52dcda36bf2509bb3faa2465091685d7099194f997cc5f66e872c966f2d82a5e83848bbe1f095b2f7880f7b15c64d5e42f7ad47cd40a3c4d209eb1764ddb56ca549dc4ab0af0a7ae2b2d7def42865beb98dedbfed6d043176c31b7da6fd2c74acd6c3664adf35da34f83b45ea735f031a47770203184fb275981b27c48544b1fbd639be8061a32e75913208975215c46444688cd4d3bbbf49b10f56824603fce7440a163a2e90c5da16be5cdd3b711731c110b7e34c7bb92bdd1a1bdeceafc339de12eef6517184be9e5f493482190c2a6b4b0105d057327a927f3c3fe1869f55f0daf51d0888dc4c8136ed55b73d8dcf8c53ecc53fdd6c2db89f9f6005305b52486a4d874e5750e690fde7a95ad4e2c1fa9e56d00e683b3002da6b975986ea6b9d960ea42abd3f63ac32de241df4045789e2ff8606acc8d6ccc52ba0eb8c7b50f70d7b5082daf448a2a6d09d72dfe0d9e179af24c82da24bf39aeb5c43807938c0738010e3745590711e97eef2810ef412db1be5cd1c952bd49,
+CIPHERTEXT2 = 58d064c7f2ef0008cef6124b1c835b6668a473743d1a5c1bca239ac9ffbdb33cc64b8f7589b3b1a48ec617588975ce782d965ee5f89c9d508420af0a837fd819de8bf59d4ed04340388125d1613a8b65a489f850c18bae609b4816b0a80761dda33fdb3a9885d14212585253b32678cc918942a9b437f9e7a276bbc75ac2bf246aa09eea292f9ea9704c674944d089bedd1f4f6e80b506891e7899d74973e1add73736a212e84b3e2956bf6b0ed214666afeaca28f61d153ea7a2c1b1f512ce180f544baf62f6093f55415a61f1917afeb1852b32ead99ec9d5507441847b745da83ca16a14be626b73acb9c879fd96ba6b712f3ea4db1b85c072775124815e8490ed3008457ccb416afc98254adf797d1cc985dc693381e27122853f503dfca8497f4e528bc59dd1bafa5c0edc7be2e5478e8a79e01544b59cbb3d8ec821f0de42d5c2836412f502a8bd6cfc03bc47f5816bb2ea17a68fb79ccd1dd88d69d3947169c728f3dae1b11d7c2e511bb93ef61a376d66134db4183148de64ced0de35be2a764f25e97a3b8b3da1c677d1572bd243b9d89112bc0552896c3d6c81f275f389551890e1775b1419bc5470a97b5d53fac517462a6cca5b137fc11e785f2b085e24e4764cd6e228691853e86fe0581b57bb7630b6e7afcb70e129faf100d948dc5ce5140cc563da5fb47837543c31fa885412f2207898a807208018cbe48,
+CIPHERTEXT = 7163214fe96d2ad3f9586974100814c57d77e09bce400e3bf0312ebfdc2ec2dcd770af87875f9eba69f2c6a898adf8aef95b5f8a71d8221b99fcb94ee836ba89a50e1ab5d551e5df416b8ba9f367a360745f9877529103c6dff3fca2a7298ad7c8c9fb75e72dfee011474a49e62e5a6f2a891f6d88c89b49bbb086662976cd803869551ed21252eb87352313605ce586553507178cdebcc347b986bcab1a509637e6001b1a798922c0fbd87f32517064e8bd412d75cf58e267f60ba5f6234a63052b1028184caa874964d9a9c370bee37e209aa885758bd7475b19a3b4a4dd577c8052391b96dc7e64ea96e4e050854cb46f436848a3cc5be33fab02cdb055779775aaca8b9497fcc03fbc2c6196f7cd6ebab7610c34858e7d14c77c99b2704fb660b02106b38bc5da9ad128a05d375a2b0e65e975c48b02d104a656c11c18a5f3bb71003475d3b29837a6691c318318928a42a03ac42a246c4d86d6cae32d527effeefceee2f28fcaf93460d6892d2af934ccd7419796ee56122e9d9ef9e92b978299474616b31645ccad6f2e1c4aff96270d04b3f6c666305c06ff67e8fd2367e3d097a94806a1267808bcb54045fd5756133beb3a375424b4bef443efefac72aaf096b481879641b942a56e6d8c4b25dc448599902d62f25348999d25511e13107eb9b40e6517f87af9892e2509a59e903d168817982d8f4e7f7aba55c0d3,
+RESULT = 0,
+
+TEST = 71,
+N = bab7ffc1f43f167f693aed8073160a48355a2c48ac694b2ab3b27a171965472a05d4ec399da785d3ba21bf5f722f50a9652499b97243e24d5ccfc8fdb7b246b3aa9b6bdd53e783a38b3c0c069c8aa363b04568eefcde5aaf3b22da8f72474c26334bb3166c10a5832244da0d158bcc043ceee05dbbfcbab3eb595eba3de2c02a6d0bf0c3d8b56539d94d58675b23cf0aa6fcf2f70340e9ce513e4f9df6fc852fd6584189818d7eac2fbe2d613dccdb4662c0d8819433d84024320f10b5f07babdb0483f773bc66cbd10f2926bebf897c453bc86befc2031b33c176fa02f7fe3b26e090a27c1f4b7151eae5dba78f2f255ff75e93da800eff36f2d3c936de4221,
+CIPHERTEXT1 = 6a3cd6c3f78273ced2b055f374905fffafd393319ca1f6c412b5f7c370917a2a027aef09e03f167bb4d0e2f228e669118d2ad8992df33a01610aafc0f1ac4f0c7d5d71e6a98029a3f2ce716a20c15e3948095259f18a97043034e6a71800b8a3ac469a2eb996734cabd4222424f8e742bdabce07754723fd56a568fb3795dd302b6129da5f8d838b6c0bd118386b9484edf0b1aa56f931535ff90a2afca909c5b24850c8474ea6d607aea9c8552da146b695c991a41b3a571b83d1e5906146b63191e201a202ad842ec776263335f9c0899d0da89e542ea3de7ecc27886a4a4ae23c99c81776a124be99dae83c3e4bce833406c0841f4758dce8f71206b44c45bdb93fd84f745944b0fea41581bc2460541f4f72fd4172983bdfbd02d441f2038da2ef59b2c014977c9935f4c8f8b7173296417ba7c60de2cb22fa60043603dec197feff9df98a1327b58bc0b70b9a3c17ce189cb4fb1234e849cafc6d8fc004aeb5a81cb25e89bb93650b7329d209bf6f4ada02be1f889945a31c006e7c8257c268e26dfafd0c9338283b9c90fe39bd270cd77c472408eb48dca44cd6b1c29cc3e4d5fd8ae21ba0eb204c8bf472f0e4f9eb3fbac3518f53562ae0320352cceffae02aa6a6665866867f863417d74601d2a87cc5e85401cf57c441c9be7e6479e17615299b7bb972bbfe1e504e3518c0670401131151d92434992ec898a1abd1,
+CIPHERTEXT2 = 36d773127e4b100c0f45d1e70d986aa1f4dcfbd1e80bd63987592ad0dbe6e81907ced66cc29deda9b3fc3e5a999e695cbeae58b8c4677883490c2e805ef4177f7584111c43bdccbbf0e3f0d778ed4505c3f8878d27f41f587bca648df05558027f2322289001c2b73eb3df866ce39fe318df6880e5cd09bd7df8a8a5d4c44ebfcd9e06c83a2a0e44f478aedbd31f9f68f9d9d6e3855b6c9e4821389fd67a48ca7a94f4fda627a2892f6b7401a04cd3b8a4862cd253edcbef4a72a0ee0bd048c428f95d209a5f84231b933d04bb81655686abfe12600b4da393acde1da0f8967c22b87b535509039dc6cbe23b98c9525b66f78d341f24cd291ba599e7cc1005c4784ef5d0672becbec9d59f0ce0bced717ea4296b1d128663da658bf5740a2d77a7beaf2756490f63f06cb282da2be3bc43d05b44ef72046fa68036c53b3a05084dbb5d824bb68891c0e560d4e42f02678b88262f8e0be5c4e6f8efaa1ac374d44e98ba7d459dd817c313ec88dc61cced94a48c3df8a92fb1c9d7c3821f32196d12d69ad9498fe86bdfd78bd74ad90c5238e602bc3301019f4f0f3594c928607aa3db6f31e7b760cff3bc4f3223393a47713406989d982af33b11958afbc69642496c13258fd0e63036d5a829fb82f5b45699daec5b2b32a006841ab7f094849425436fab21a4f31c41cf9689450c0c25c07d7304be72bcdc8ad88ed6e47af767,
+CIPHERTEXT = 49cdad48765b33e3d844cc068cd7a1f3ff0072978b701ec0f724f598136117902d42171b6fb8aff5b94c84ed4a604508de7c2c56b72418024651c6c8fb338aafb6c8fb52907f49da5dbe9635a15c60b00eeab7ca4824fe84b42316a405ddb3c51d51cc76ecda5859b99ccb1fc77eb95a45088902d6262e64d96424bf7632c9e89ac1bdab08a3d7919bfa7dc8b58853eadde871767affb335e37573350b308b14eb952f968f6b8bb10609c530356472ac9bbbeb9e80113b38bc30dd4d0fb71f064b9ce742a63d48dbaa91a2371ef4c5856e5cd1b9342439d8e8b1d8cfb8dc9f190b87a209f5199a79164d9a5340f305d3c89c3ae9ee171268263baa0d21d94297e2df0d800fa3478d259aeaeb688719b3551671734168d1fd1d232bcde95aad8e751b93f9ad8d0a22e0717b672ef4beab9d5745018901270aab65842a67b617e696b9a653bf1e46602fc095170e52c05b8d13885e464a58bd6cd24d495ced2bcf92412e514374ddbc6026925d1fb2587baa15cf6f38b76be10ab8ab5e3816d77480d6055b7811cc4c881b3cbb51d70adae47662b58d445a5d000d142342bd7d3780187a28629e4d39583586907c41a86fbe8572ad88ae61147cb777e707765f91bf81220e972aa4be3ecd13d24120ae3ab799f64229c2c87679f900d8794f699466e22363e1d409d52810c027efa32e891eb7444ac9f179e65cd83f809cca111e,
+RESULT = 0,
+
+TEST = 72,
+N = d1db7e7317b25002b7c56ad4b5ad99d7c206b09e3ff5d1fb0537eb3c83eab3a5314f70b236f7e521c7e3c9c4436bbb4eb28a870e2fa219f121db056eda27c1cb9deaebb466d10ba63ea851941273b890fb2180ec70819d0aebdcaa1470498ef6152a31752e2f901e67fa2f79eab78c4f7cd825d9390e13c2949f3e97e258b9b3f8157c998950b22e3689bde14b238923fda368d272c817100ff2aae814d99c5d6fe7cc867d27ef76ce72d1f19d44fe56f1260bb87c8a3f0182d9640d575c3508973c2aea6c15ea202026ba03ff8589c7f6b5843b569353ed36767bcac28a8bae6a693894700d810754be27c857233494e8b6d03ecd4c8bdc11d8454ea14988c3,
+CIPHERTEXT1 = a55609b085230550ff24ba20f85d378b4a9ecb13b9830de52035e5d26ed466314fa58c3256c342b9f71a32c071aec6daf91d15c5f7d4a182e0eb398cfd9a5da89fa1e4c4a093c0f157075387df31076a8c2417b96eb43e69e2840c26ef0ce2ac653c69dd9aa242004ad32f6860e9f7774f1ce6064fb81dadf5fb059fac45d39d5f6dd6604fd5eb03b16957bb60210f300c3173e7e734d0ca56c51a236b15eb9f72c8bea944a66eeffb23436aa84ab2f5f4e55205432d4bb09f38feee5765875fb667c1fe1e42d3195ebd3ed0c426aa0afec2e93d958aad4e67eb2bb9dc24b86f16b7da5e6411f2af4412e3fc2b67c97cb914d16c13b1b323aa0dc906b93e70527c677226f9e5a0df6d6c670623ce4237626b3c370d5d320b366488cfd5708c2c5445eedab9679fcc350ba9c8189d26a300a0c70f04e87d4eaa45004731af2b3cf0054dce64b3bdfa5cde3b2edc7bd619a77fafbb2bf8d32af5bd5bc9b40bced34f4a01df5ad72542ac85c7445789f0f10be156c1d6147fa1299458641ae2f951a10d8c1d9d86f8680862d7ab4699b13068a1516e37528059e19f2d537b2b22f7f88449c1b01cbfa276029ef8735ca3e60cb3ab6466b7884cc180b1e779fd0017d8060811e0d598899974d49518dc471d62eb228790e3dc7a1a408aeb17efc01c910cc10d125432e2ca2e0a79ca7610b0141d0df56ef14d96b9ec09368364c12a,
+CIPHERTEXT2 = 725e30a3ed92e8a9f030e5cd5816fcd100b37c474c86810e22836596fc2e2de37611b021a2f9461c2ee088f479bc3df8dbc00734da63b510cb5c61f6c7e8fe885743ed4aa08f276e9e1f7d3c17cb0fc35a293a9c8f541e8d50aedbc5ad3cbd4c5edef72573fb7331ea37004cc609395a6532b9965a499207d4d3bc61db12fc31f46ecfb82f8a8aca53ef0ba1b056a96b679c23f4b6ae19e82aed24329834275b69058ece5a2134bddb6869b026d8fa444ba2aacde5bfbfc7efe5ba4ae2d2ff003e39ae4f9c0d888803f2c1f7784acee841e7cbbc43c785d04295e33fbd48fd2ada5cfbf34fe461e80d83a7c0398f520a24116ea4a6b60b8f265f449fb14ed169a8ac868fe55fb5b72f64c2f7f0814ad819c0c281009fee74e8d80af905b403a36d1416e4b8b2cae55603108bdc68d6865a148f2755640126e51d293c36ef080147beb6eaba8bdb1933d7d1d551ac8368500fbf19ba9dd60e8660aadc2d5c8761724262afa417b1042dd9b41eede5a713f7961792c599799908e0daf0ed8b342073710bb7384270eff29869a852b622f8f07327281053f076065a7ac51568d68973dd3eb4b44834324fb0edb1214e5cb3133139d2e4411a540c3fc8e65d2b5c90ff938609c3842b50b462ffbd08621eb525c4bf6002b9939ec6f8e121183111093986e4eff76fb707f274bf75ead66203a6870c86d18c5e0ff6f093343fc8d61d,
+CIPHERTEXT = 8e56ac87d61735284881cfd1e5e9a36efd6d00b897823d379e78ff88b5510065a81311ba27840497117e59506608cd409dd851404f3f672ecd9d6ca21130383d5fec79f1213df362205d8123298224079857ea3f9ff804ea566cb2c244680b46c88152bae0952c625a98cfca7f70aed1c5db4d0ce3073188e2a529de1f6f31f85a4edd775332d8db6a69815b7362bc442ea706195a915f97744ac1538905beb14aafb98a73c067291caa2474fe062d9c71bb6cb815b953e3e916e3a9d7d0e9be5dee565f97b0dd286aba32d71925b3f951aacb6a49c620fa02d9618d2dea5f2f86aee03f82578481e664da98257b1263298ac2d4d0f3375d24e60b41c37f80063eccaf69f44afe1b7a2e8f1c40083f2a8cd6b4c751e11e202505d8940b441410c555ca2409d5bd645f14a0cb74eb21001f1d5d5a57817f9f21661aace466856f2d6088d8e6d2d2f9b8426301169f0aeb926e20a455e0e707adff1add42f0ee5f03c56c2cd0c20e9ab68dbd5b168e3bb46b8e07c6ca6d4e44688e126210276dc2edddb944f8cdc6b0ee20e9736787640a058cbf45e275e2c41c1bd0a49c50c8a8793003d2fbe1a9bdff77bd797a5fd4f909473b42d4b4b9bc86be74b0e168b33ee4d907c4796425fdbae0047353ebd98f8d1e7615849246a7f8f2001bd59ddb066f3c122cadce2d88d4444588e642f416f557d7e6e31ca58b4276d21b766a0853,
+RESULT = 0,
+
+TEST = 73,
+N = df397db1fc2838d834244288994cf57e4ab988ee4fa763ece8b3883874728de7b69edef4807a17495944e81a374952df09df8bf12e26e6b5e7fadcafdcc1f802ae8499f0c30aeb971a86c8fe9114c55dce749f86e9c9adc08a78d8e7ab35bfbabaea9545976fb00e2c1989d93af21b160fe066c7de8ab17ef831932bc0b7b8336b4cdf03488106adef507e45f57bc963c6f9e38c22ef5f67ac35afb064899f394602ca21c65598a40d5ee888d7d3c51e1008a8b014fab4faa6bcee69e473e9318890736d0e65a15164ca4c2c7a933eb2cacbadcd4716bd2934323c8ee4ac1bdabd06e1efee3fec114b114bc644bf44e9edd21892f754003f81f7dc0e480b8699,
+CIPHERTEXT1 = 4704fc582b472e678ebfd07abac43695b7bb50f8ad2bcd69024591a51200f96e4cbe25546cdbaf2c9d1f9f7d69d1ca156a2911d4529a5cc087cbce8695d109a20268105d74c8d6ce6d915d87f43a076750d4562c9bb428d9c6514f9f9ebfc6db7642b77442ab1cc91d95ddbcdb5764e31e23f4f5d8fa26f908d07f4d43ccc711fc07304740d85ccc8fc26caea307e8ac9158f37f2c51d754d927a8167bbcaec474280d9bf1ca58d5580ba050128883c871f120a6cb23a434a3e2848150d2bbbd64a0a47f14243ddcd0434032cc8b577446b8d817b9347a4eae555c4798acd1a8a0cb159946b8b41849f89ed3d9cc9378ac0aebd04eb99412af28750bc79a59b794c44874caebde3af1f7d8817c1c3edf4535760bb651b33779723e0788b6282228917b464d6aacf20be2d00460f028458510aabe32e6c8c92a2e6c0f0b5593bd9c29afc6c8b7d3633cb97c3622c30f576584081888978b29a548addd9b7f4226fca2889c3e711070be9dbf944b3f96c890776400e63aa3d2ac79135c95262221c34a0fc2df86719ec22e0c0f1239e2373115c40709ee07945495c3862f3270b7f53cf7a5558fda21f314460e42976e0a7ce4b4c9ae4fa2ac445ac2e27bbe2c4d90947aac20b1e3a6bf9d9ff47647adfbdf5a8b46a2ee2efb30855f8a1d125f7ee70519ef3fc4297de86bfee5cbc333962c5c83fc6c03e3d2595b70c064e372a7,
+CIPHERTEXT2 = 7e6f9136bcfc612630e35a214d7ec7eab0782a83d002fd38aec59a53f5979f20b7bdfa8d7df4b9f4b5c8de7c2e8657ea6d54c10323aacd019504b229420be7539e0d917e02cf7e780f533712c03e96a4761c528ce29199a371640985c70844ddbef95ec6e2b2c6cf769e0751bf18f5f8e350597f55a21b325741a1acab511596cb9e1dd6804b1a96692116e2968341de4774f4877b8f5c37afabe2a5c33fa90550dede683fbde5fc883db1a5eb37979f86a513927938f5a4247eb5af00d06462f78a94a631cf70dd1d9e602fad13c86e36e3e2265980fc76a50aa34ae6dd680fabdff889f932d0c248392d3a8ecbf6a215ea70fa4369e9b22626c6663f8031e71fb49c9ec2630daa1fbdb24ade8d47cdb5e3a87cce1791e144d869e4cd5311c3cc7201956c0800b050b719e008093052f41091b57e385980750685bb437d6fce78fc3bc6788c4e313d7e3a2afe41dddfe56398b3704dc6f13aeb13bcdc402abf2b52ff8cdce7e546faca4c098dec0fc7f9913ad3d457cfa4fc4e6ae730392c17c43072bd79cc203c89a1d856acf949fdb13d4988a9943f595dfdf8031cd817f72b44efdb23ac99b5fce8b353f351f7ce21cf4689215028d13e96722b0434e862a89313d034cd1f204d8a7ee086791d7566fef3e7874c892c40ff62082bf3eef46c2c2d125aeea011ecc8bd16879e3798335ca1c86b9a8e9c4258b1f1c006a99e,
+CIPHERTEXT = 345c31f8896e6149eb06a4afd0ef2cac19032cd69b38e6feab226a4fbdd4cb5b8b10f04d51f442c59cf67304437c560b882cf9d1476e7b80b5a195a4f4522bf094640115607f8021063046e574d6b0a8e36da798783d10c38eb292331d7a42673250c73589260020add8d2e7660b7e866ccda16ef8b211a33711b57d736bcf5b76621f74af0cf692494299794cf8557179d39b51f7a7e10928ff6e0de4d7aa6fd5eb4cfcb1dc9f32da1985f4dfc48420c7ee2f8eb1e8f1e33b4461c984464589d79e9ec027890fb1116c1ac5fd44aa651d4f933900df6e213997f57e48ec72e3b19e4ec12a8a419926ae919e22b3032f07c7e1ad9045c19257cb79714f06adb3d96f2397a2e40ad0c0476393c922fc7adae3151c3784ed706381e34b0a01b29778af0c7f1de1c3447e83a1a48ab34b811ef498e521a4ddd8daae41e4dda534f224a9d43c0b11396d22a7f46bccca8a30f1ba07e861070ae1673f8d56d55019cb87faa52e0766aa73e078abcea11301e6091438d928ee51349dd202fb058aff44cd539bd36fa098191538c184c2394de34b5651a3fd792ab6bca04c5a539a1a106763acd7e5711dbc543ef880d7d2ad7f956dfe82cd7ccd9dfab73aae8e164e8823c4735c16d6c8c4cdf4122fb0555e21eaa1bb43a1f5a2f428141bd13ad9a0c6a316791654eae471680d220b41d6fcded0e4ace73578bd582962fe8519779ac0,
+RESULT = 0,
+
+TEST = 74,
+N = beaaca5535ac35bff98e9f197c9262a578040d2e1527ac9d038d877ad037066db4ac3119da61660c58e21d31102ca72a30d92f3a5c06a502804fd3eecb46381f636ddbd3ab8f66fd25acacecddcf510f6af2745f0c2d147c01425a20945c1f267fcfd8eb07d1463aa9446fec59da24ce4cdcf955450f94f699cfa489c931d7e3b8516a5f9d624b4dafe3c32c642681959f5a8263a6ff32b6b27216b855e3d0a2aba82e94f5da1b9381da4c2badcdc5dae1118db60fd8034e56879474af89b8787ee17af9bea56e13c6c0db94b238c9b544d913670ddfab98aafecc1594b250ab982028bcbbaf0b534776455393674e2dbc72ceb17cf7a94882230eb9183e2c49,
+CIPHERTEXT1 = 6b06e6c450408960fe025734357146ca164cb5a2ba4a45d28c56dc69081b1a95b7df13f5165fccc9188194b4ce59d52806af6c4d05c28b141ea8bf954762e3d27c62b19298b7b86412cae7112762eff3ae54436b3b69de0d33a10cb5bcd2fb4b71f5ab0414bc46bb0c5a219e7e3360e74ad2ee83b3417cbc56242917f9c8cd35bea262c8f6c4f45d1addff42c42bebd971266af553efff067912a8a5fe24d385b8938a563098e2bbcbbabbb40971a32749c37a0f96e22e69ac51915fc64d465d58a19499ea42adc54b3dcd8c61087c52e9db6c899bd0f4ae20e12a017b994801ae09072c4e10f57548657d4ee78c45515f62f7e61d7956e1d7f5e76a8902dfb2d10656167afc9c0d95ef7d9af3d46eae274622c5fc24ddc481d4a1043ab6aad9d9fc9139f5f05fafb639dd2baf9df925402da3a15a9339d635bafb8dd4da6a447499c593e2b9b26bfa4bec21e633bcc0eee097e9694541320cadb1324670b17e5704fccda03781fcb6582482c7e5656d278a2b4e85808860b10707ab2ccd54f028dae1da9fc5c685106e675a8a0786166dfad5c97dea52f4884176b9b573de7927fd27de9560440962a1297a1ef069469b88ae2a757ba518a0f7609d5b0ddc176b7771e0eff196c924284e7f72db06b0494affc58c0e1436a27ada19fe3d5dec145c7bd4acbfca7ae29fe04addddc9a5e9e1fad9b6c9d859d8a0ce8a89b01f94,
+CIPHERTEXT2 = 1c75884d4eed991650a5b33a7f99d134472a84199e61448958d6b3bcab1a25942b227252ff501c31602d178d6faecf6b294c64759d5406acbe99647a36679f4963382f6afcde2599dc9b82251c8f8c9aec28872c03c7e343cd20014c4ea7e5a4a7e75c10440dd132d56a41df00b84fc49c7295165c47fd6175d7d0c689bfe8ad5021b833a4cc42a8f46171974ef84633aafeb6eb0f6c3820b1c558c4b4180af7f393a8e3430c403c8a590d3629ee7a56a11aaa8357b86e119286541af32f969644f314db7d26deb0bfd540fdebed061aca473c1b61db9e34b53ccb88b5a54f463b8a91c4c85196abad8e48ed37667d85b17eab2f2fd4d17af6a3f9fd016789609a1e07f15ce862802f40fa81ddbc8aa19570b92b097fda5d03ef8b3d7ec4cffe7812c432104fbcfa0e1489d9f60f48fa36838b6c0474cc0607e408579d16b9c9004e0a3a7dcb8f652b57124fd1a8b7a9cba82a9c944e318f60feb517afe7c6b45e8e9c701c42c22d4512e8122b87dcf72e2820a2c73997c22bd614e4baca5d9f5fa5731d676d38f906a5bbc5b6c7dc2f0e61de673f1f157d9bb1afa0a3730021d7018560ab53b09324c12f8f1a12ae5e842fe6d00a9bbc128279dee35385bb159172085c2ff3ff1164e5112681ce497a26b9db0b760e63fd6df024d3468e161bad4d0acea491df61aa91041c22dfb214b55fced3c86ff3369c30ecc7a136d7bb,
+CIPHERTEXT = 560c08faac408526cb71a48622dce0c12df02f9a12545b0ffa51ec3e1a3c06cdcfb5e7b5eb3f0e9fef3bae7c709e3fc49f195826a1e9b0563e02afc76c5156305a4f081f9a5dc6af0b6084b62a97899457d6e87e82b013395ef25d2de5cfd6c89600103fae3646fd392d039e773cf915dabe913b4526e6532f602c4657892d15accebb8c1240d71771fda6bc4681c61295c0d75aa6226c68bc6c12557186d69741633b927395d1d06fdd1f999e3b1ebd85844b35d515b8f06bfd2f6914055c47d136c4d71c82fe337d1ce6c21bfac7b4d05e2f293e50623b7c3c2e7046bdf969b9f4fac4061c4d61b55d1756e384654893a734caedee9fe1cb78bfe4b6c5a6e078db05aee28be6c1bb19c99a298e4f9235f3b882e035dffb58bcf65e0f5833b2f103e7886d39e96f80d1d6750e423f1e46494511fabc5695730bbbb23f5a9b3aa59f5c78c7c0b2d2de5c2ce187fd995ede8ccc5347dca4e86dbec6edd5cd39cddbbcf46e71e43b21153dfeacebd0a334a98be4f635be09102baae0e96076b363233f6342c5630cc09e9c086abcc04d8cf8b04ade3ac4137eebb4a4ffd38e6b390efde1c1ff6e2957d6e78517c4d68c37c9c24d520060a9d512ec777cdaa6b8468795f2811129443e908fe23cb065b0fe5c2dadbf380fa5c5d579e4d1c39fdb687839d95cd4f85a393961b4bfbe56e482909ee2a84ba081c39360c287f3d21e0b,
+RESULT = 0,
+
+TEST = 75,
+N = bace1eaca7b85428177c82d8f697aee1668940e5064eb59e87ba88ea5f7de1fb2d22b769202f9cd1436c4acd4c99ca4e1c8d402ae9b56e3a219ae05321becd652488582b6dda6c68cc1ea9e6176fd4f4fc119fd1bc35396cc547b9035f269e444330403a98ed0bd689568256945eeb8e1db1826a0971c70e87d0f10c309b2ab9131c2d3900d06f8a1d9605f644cfee6332bfb40f240f952e3d7e6d3947d0b06fc64f2b9dcf53c92a360f20edfa4244130fba909532b71bca6c34a89db1f47747eada252be9f9025ab09b7fa4ed55f70ec72f5769a85b1b6e9d2fad5cc09e6fe648c0a0494e9d3fb7c2ef0ac86a29a4ab9d3fb51821d61dc959a174a197b4e6ed,
+CIPHERTEXT1 = 33160b9bebfccda13bb51abc757ac655c2af5eca4dcfd3af90cac82baff902f86041faa70a724eb1cd0fdee6358e9e76b0874486fd5cb3ad57ec53d76cd66a12a5599578238beaa657147ae292d10a31fdb498b525ae854f2c82f9aecad0a4f66730b1b81488e1befe4bfce7adabf7eb38f37ac589657711b4affa7b8483fa6e1a6d6f13b0160aa9b04ef8aebac809e7f28bff081325b201200cfa80934c24626ce6efc1f0e1087796d161f096483936b6bc7b070d9486c010d13c2697d77f0615bebf2747b1a92c3d1027372940859d4a1db63e23b1f974ad217a09d8be4ef6be065f0ba4522f0a6808c8e2ab727969257fd0059f4479fda3236840bd7f7f0081b85469e39b60b0cf8cf5c60ddc189657729062a372251d4d86391956087565579326549303a71a3f4c71b184cd311572b1eda7cd1fea2b0937d80000c9012dff5ccfa9b4abb8435f4c4e5c746213122e12bcf7b9aefc5aa5da0b60cec6ea9ea9b188b9e87553b00baa77070be70d80967986b73daee83ce5fd93b6f2c27914ff19055a991a3998aee9f2a615805d3d03f1cb2e86f537c5f7717a025c43e1166b742a1d5f190f03fe55652cccfa13ba5fe56e83f70f53fea7b00666d11f1a4aa53125e801e3280f30698cd40373be73fd89ea014ef0abfa0f00e3208f93521adce6c99264369d7a67cbed2df543a0a5cd4f9ae82ef8be320bc652818cadd762,
+CIPHERTEXT2 = 744228f6986545f4b49c733dcbc05282fce9c6504e562e43522df8ac138d08edf66a777a629e87117b951f28349a6062905abd43e61881673e238a578c8962769047fef6a78ff6dd86080d6b487793b3525424ff9c7519ada39160f92c287da681e98db1ba85032cb7ce940b0d4e0441aeb1ad362a8b910554860992402df8f69ef38c74c0582558a6b13e5f0e9774c4cb0fb2df1f9836ed392fa784f351361c4c1920209cad6d5db19d705410bbfd3d3e2f8a1a0aa82fd77ef9c57d8cbcdf1c3acd4487ae2d6cdbd9cba6bb7f5c7f628bbc4b4ea611102bbbf3c7432f83237a7d7967b2e5cdeeb128462ee45ca37a52a2d9d961ba40fafe3d457493e57e8bd68e9c3eabd96e4d968b3066f87f5e00851ea99630fe55a6f9ebf3e80298a734a7e37d071977edd8696eeec4771306c6e8bc59831cc4f771472be46beed695376bada44615df43a969a0d18e37274378e06b5d806f0189dbe45f27b6476f41f50a04be75134e66e1e9be518458a875de5faa416f6d390ebb47b7b3a5ff360d1a79fd2057734a32c59cb6fa54de4e3de3747882b320d3907f9a3b62622ec385ebb8bdd8d1e2f12d597e5e8c7eb1a69e6201937c9f7da075106a48afc2f4dbe8c99eea35eeca013c60d200794563716c59b22c1b944d3b6137bc7bb3a5b0698f1c1aa09950ced24cc97092b412b7fca687caf06d1cad51eb30db1fd4d44355c057af,
+CIPHERTEXT = 3e98fabf5b96c3cf032962557161109fa9718686aa478570c3e8324230e4b97b52d81fef72476e27fe3734411d92bf58268bca2cd358ae85086f6c8434313fa776d1b15d51b1892cc78ae9472c0541bf382de1ed89ea8aaa91761a7b76c373e61eca7a51639492731b9615bfb6c34cb91f2deed48f2bf20af5036846c483d1e7e6a4eb8c67b91514e06a214714a0805a5a0c808a19c499651de21db6ad8245f0bd326992dc32a9abc74253fc53f5dfa180e93d750019512376e0b40f8a7a0f4aeb35295e1a4d31d4d8a0d053ee7d8e830b08bb12f3d3b008087dff07bb070fa3ccb5fffaf7eaee2aa9506a306fe2e0dcde0cc4ff8f7a597b301c9bbe6bf93c6bc996e3bd21f80de76246ddf0fb57a237e86d8b00b4b418d13ca0dda9daf8fe67e3fc31e904a4188b801bbf6a16dcb5fefda5c895a34aaf53ebc8f5c3fe380895783d17c5c5a044f50981488d3470733c2630fc6a72514ac5d359301d6f956ec764781e9916817715c12c142d0eeee6ebbea70e79e161a4d28504252cabab6ef5007529823b82d016670ebe7c1e030fe64531290d28770b656b4cf51e189c56c9c9407d8b49ebec4e9faa59f329d344ac92e8797969eceb96e6265a34da0c130b922b45420792417d4c982a5eec0cef2b5c4b338630d76e9000b19a3cf6ece6bcd5b3cbcda4ac4ba6bd2a26c3ba105b8d6102b27d6b1e2f5eee3c56bd359492e2,
+RESULT = 0,
+
+TEST = 76,
+N = cd9dda09b242114c3edd40a7ca6c9c8181750c44c449bd0fa065270e9a4205a8c8d155375c36eea45c73bb57e3d636d35fbc52b4efc7e66c03e338fa361f0f5ed97aaaf27e190f500396579a817f8d6470d18f20dd445bc81be23587407f15c8babc030db652ace9b4998c3ae2f7e68c148144071228c4873515a3a3f072c32a0784ce5be2ff8a3e06517610374a96f40b5ef4fc868112b9f03859ff3d10b0d0a5bafd9cf3a544e4867ef5d12d7474a7828e8b9a38f16fad9fd900dd59922a2c7f328e80b7fe6d12436cdea2d513f524894d757394eef3debe71a357947c7461ab12388457545d0c500fa3b29b0d11273978f179572137a46e46334431cdd9ad,
+CIPHERTEXT1 = 5d2c4fcd336bf7109b6ac184742f70db3e7006c4bb6b093cc8fe6b58772ac896c0ec8c5998c3f77f12d4c15533d147798d569d87c2204ecb4b2adf189e64c6d80f449b7c36bb2f23600446665bc5647276f75e902a073d6523ec96f72114bcf5453a8dffbc765d462e0de77eac49b9687755f6f7793c13a665ad73e41b54b34496a872879e38e4860881bf6b9bca68673265432bda058ffd63574480a7e3804bdbf0b3bb3b50dfda0f904a6a80704edf66a2b3da7e24a11e647f2601f141c1ef62c8b6043cf8b2c448fa3234b1806a3ca039f6288ede57921b16e2ffbd78f0e3b8adaba70f9f34b7b7f82ae4f9135125015799f7ff17969294f1744e4742f9dfea342ad5937759106b3b213ece5db0bd71d43fc40446a556f9ad47c1c6f30521998df1c1ba3d9bf7151f29a624911e2d2531deaef3eb5b9d9481baae87c3ca846e41c909ff94a721a53df9cb62f75377456f78be6865359573c0ef743f8ffa022d3457303e07ddb336d8387649cd2a7b4d6ecbfe829503858067bb8606abf964e691765d0ec9c29d78c267cc157bdd31dae8f857315cb86095a5d295f2e64b15fe8202693364e3ee266b11e80f1084ba0cafe94a1586db99018dfeef6e80e84d03529d7ad82cb726c6f470fd37dce7e584aa95ce7d15b57ed1b2611ea631a53816db37a40f94ae61546b832d1e66c5f77b0427dce8b885f9734c817c0a715a7c,
+CIPHERTEXT2 = 67e37c45643670dc2eab961e83cb44df30c1edddee338f276f25baf79b4b6db1ee30bad7afb36a8528048ef2ba2e772bae9ccc3aff7ca3d3dbcdf36c883a956b126e0222282d3e3b9eddf714fd1ccff3bbc36b652a606ec3418887e87ee5f188a9d7cca1a947b5ab5ec8da1fef835fcb6ce3b5c8f3c7c04ca8ea26ed373bd833032b74dcdc481aa46324cd0d696c73d254dc692ac55ff143aac7f1294eb87eca973fca87cfa6498c42fcacf637d07c516712ea55a637efeb88e8617a4c9c28e2f9a49d27d2ad4c323fe838a93aeaf5765b5baf7ff2bc988675979079c869d713d0b00a8dac9924ac405459b05973ed74d237b2429cc534689c1d77c553162c3323bae8732a81581b9835507d5941da68f27d7e142625a1b961df7d4aebf9a303820cb0436846825be6e3135e9ef49801f01038fc28288b706041d09d1121ff560e475d162b4f8b773c716f643bd6850039ae5caed98494fdc569f8d83163c3a65a4ee8f7b66a54e22e860e9804e197e9b3fac0f2f2a730209bb6ef3f589cdd263b5b2780e968d4cab38b9dc53b28dc4d64ef0ebc14b5c1fb9aba8aaaaf387c6bd1c570ddb9a9526f57b175a56c77c237ed2f202518b760c43eebae6695ac99a54f401c308ce5ecda9e4ad13f125abc1fd4342e6d3b2d60a9c8da5cde3e8059391c2b4d1b449a867ca6740d6c3d38f63622432646cf1f7f70afdf108ce63ad53d,
+CIPHERTEXT = 5024c10caedd006edabc2f175fa93e7bf42c1b0d9dec53c76f5d06db94d3af14dc3681151113c5394489b10db1e848858f873bdf19612fe5713a42ea9413f56bda4b615c49b39271a1b06cc66510841ca9dc1f2e431faffa945378d4d86807d4e3a7066b503786c45275a8f51ab8705aa73aac4642b2824d6492b1a164f25e7aabbea300dd1590c535d74b9761a4f1187a1b3b1488d2a3ec6a45693db4a1eb4a6a62fe67a594c5b8b84884d8976b68a38bc1cb6ff8d590ce590717ffcd288c09b0e9a770ad7751c9157401e3528c4143d3f27cabdc2158e4b73ae0c0cc5b60cc9b703af6139f4bc290a4058f4831dd18f8cae970d9364ebf98207f7d8bae2162ee54515639fd2895b39687503178b1c448eedf61c8523a5da5ee65c537b2d2c0778a677a8ec635079573c118c59d56856bec943cb72fc7b39ef6682c0472c95fe545d67a96aa91daf66962673bb7c66e751d39fc7f67da51ca19010b244f49b396c096f5e94937b06b43db3ec6091b4adb7113543548f8448666fc7374f462afd3851cda3c5cb687cb6697065283e18cec66d1c278a46e45ec898588fa709d1269adbdc73dff60bbafc3ba59deb1f99d8b865fd7f1991f21a95068f37c54291f752a9f121158f61c9df312f47bd6f50f54d6f0196b0da9019381a0a12b48196642b886533605bbb5b75fdf5da043f3ee1b69bfb72aa4a3bb603e42eaeee66a2a,
+RESULT = 0,
+
+TEST = 77,
+N = d89ebaabf24e365d4606273c7e24bc019f7e99227c8e520c5438d824a3e9e9411ef58bde58f6014ba8aa9d441ee4b47e3225b650834503f24f36cb02cbaea490815117cae25bcba9cca2f9f45b2e9cb003cb2a350eb0924bbabf0c33193778b311f79946a116a0635f32ce536c9fd92e3dd2c0a9faf6a698112d885c9141c3df8c74d437e3591af9bb46cd9d25d787e2fc0ad778d4f3c702a6038a2762ae62dfa2a5202b738bee9e0a9bb138ef3ce4440c5f8f7682835704dd0a396835cb8f91a7c77b1e92c33a3f0d7ce2da5840ee52d68af5cfb1760dba3826012ec76f566b6765ee7f168acad4b280d69eb4483b2735fb53c348968071a38b838ac8403773,
+CIPHERTEXT1 = 6fa7707b44614f25ba1c8db0f7d8e9bcb05fe4b28554186caeb1a217abf0bcbd38a2ede6f1376b2d31e2cb18f0c63fa5f88ad73c9b88f957dd6ba0485e8f3da62d52ddac05ddc7c8a5a34dde31ff72f7d5a03c92b33512eb1a170a92a4de10e54448a0ed22531b111086253bb0dedf430e18002b296a402ecda4137b2925a8e3a4219d2541a4e4d7d49429d220d8a4d68234069cfbcf1f59f3e177698d6ae630f3aeebe0ac0a7e1173872732867f4aa12054349a896fb463fcc10424f458779f526d7b193aa5200bd1b6f265c039f25ed415495ae87d5208589340247f2759da226250daf72a663decc901635592581c8bb36fdcded7ed02a0e48fc5ac6a82c364d258a4b5d89461bf504550e3d34d22e421cde2e15e42cf2f0d956fb2ad89eb8de5ae0c42efd50e1f250d5e89d92fda4ccba27ac4784815d30f0706f8ed264284cdc8d8b5c3fc19efc8109ba9595aaaa0c053cfa442f1a28b74c61f4324f3010bfa064eb5ed94fdf75bf5e3beef7f1210a9b0c3447c6e933b81871966ca321da4139c0f9517fe9f07a56329edfec7fae25c3dd3a606bc61a85ead205f54339b251e3501219285dbafefbb4accd401f11bb806abcd09e3835ef57e1f06ff91f3db147dd1e9810f67b844802d5936630bb40a5f2994911c87d2b809f6583018ed3253ac856acf1039d871a529213e962fd29a956e62b114871a44fbe27d28bfab,
+CIPHERTEXT2 = 9589c8bae8dd3d2514fc66bca00250c38fd24ea45293d09ddfed64d60d95f281e69675b16ba71346c896b74ea83781e53c4491104cbd978d4fa54dfb956d6c268f4de20546d56392a8c0376da7fc5c614be1d1cfcaee9d8a47e31b99509e5b2b2b48caf7eb41ba46fec95e62c7cad7d8f477f34af2dd9e23ddab963d9dc68a3b79799f0b9f2b5312d805347b02261fed6059e176c8a0464e99ee59664d635593e0e6bd068a0fd8cb079cc0b5c03c10b0e601c9da34f7b9002ec2eeb56d88f73929a86feebfd33f23f1d31aa69259ad49bb4582627569b833d68e7e0df899aa3708923ba934bab6d9072a1d7558e443de8b4d8ff94aaea52167a34d8356491f83dd899aed70fe2928cc5e6586aaab06e0d167abb515a594466a4318a57c16e6e7c12b2a048a99cbb11dd38c41711355045f730456e6a8c02f6d1f6dc85c955b84fabf7e20e470f17dc860aecdf35ab0e3232e2ea5d9b41cba9f4832ad0fe64d278890c69ecf1371b33cabb9f1594a18b0689dec9a380a6f4c6cc39b34a6a6959da7224c538ffebb4969c7a0a2bae4e8e7d54b74940446bfc4f6afc1252959aa1bdbd81eef5fd4d2771334b051aa9005ef07cb122123a8caefed1c8f2deab686b1a559358794ca4f46c44f8cf99670a2ddad66aa760a45ff9fddbd6c1b50af91239703d912effea0b299d8f7abd9f070af5446c9f5b72fc13bde4aee53f4f63087,
+CIPHERTEXT = 2600947eaddc031f13d3969a6ff03e3be719ca24b78cf2dda3f38c9809ec3183709e750e1d2fa2d70108a577e77ad5eae42c361bcc0c8bc7c3dd73a142a2a21a897e24b177fdb33f39942bceed92958ed7ff79daf01c6fad73b7f457135c96ea4750d0cd0672d61c228770bc97990324a7beb2c9628e2ccc46d6b8c4dc11753b88d4a284fe8b1b2b739dfcb8f127c987d1dfa74fbf06994ea8698bc7034723ab900931eacdd9f483add40bf97ef7641e21d4bf1eec82e458524e3ddc6ca098091b2cc01f9e1269a51e3a322477ce0b301f88ff991bd7e85092b87d6c20c5d43537de8bf3ee1028d2e8f2a85d12e7237d2b7c3033dbb21ca48539ca0e1e7e1c2bba7a67b8704196bb2f9f773da6ad29a55894d50dd1d64a60aa35f3f69fda2fcfaf49ff9cfe423f2809c15872b7fe0051318e7c4d36de02aa6dca051c34ade158cb04e7ad070fffe5c83977c0816a1f38c7e38045b8c98c392e5718b21cc984d43e8d8f5552ec63c64ffe2978f4248d234424d881a86e8fca1ef15f857d551ab47d3e20b86be008cf10a7b9d3654a1977cbf3b24142362f38d189b2bf81ae8baff297e2674226f4004ac7984f36a21766bba8b0a4ad2a882a3b2b387b1f3f6169e4706d18949b29306abbbb806b8f78f683b488402c080ebc3784806ade4b3616f36efcc62caf007460bbcd2d85070fb6b9afc6a460a5606d9d82d8c0adb0e01e,
+RESULT = 0,
+
+TEST = 78,
+N = ee179737a9f2648669260834e2901dbf8315e98ca034639b6a1ba32d486fed21ddca5644f8834701b02f56a28a6a27c73d2608e18ee7e549393c945b5530d433a1d4f4c28a49f80b52237fe280a54ff1a9750c24f703e90b3e4fa10b2c6e35eae97b4f75311c4d36afeea4dbcabb1752f93e918ccc5eabb7c3d5deede1ea1b4370b3b551091552dcd18f4dc2a77cc09203a63c6d2805659ff906ee16567168f2a9f7dc219164cfeacd557e839f0d8d2d37a010ad55e83dcdb917f0f7e2e36147e2aadc152b7d32fd784d17c22fed9dbf7483db3cd2a0c142253141fad031c7ef0b6c03249250caae643736ea3c50430d6e47d9d88e0954d51c2ea901e1394f25,
+CIPHERTEXT1 = d332f49cae1991cdb8964cc92f2a9f3666004406a294955c425d5431741dd81eb2a13a0b883d9ea5dd8ba1bcd89f93b8753b7c81138cbb0ab915caa6ee83fa9388d2efaeee74d17317f865d089f577246dd0da1b77fdf777289598296a364f75712fcf983e09796de3fdf8dfc5072362bc66671543c27fa4748530c4fc449589906be1ed5e21099224ddc185c73b6307495248c82b1c0e61267be42def5c0c773faf89a0213b5f1ea9096a6e594aafd6d5d1b83fd2a9ea16e4cada0409094e52fd0c9573cb328108bb43e9791f23a6a62b228d055d2785c5e0211954c6b0ee3827fcc97bf7e826745ab798f0927cd4e855adc496035853622fe2742123c777faca6d9611d1627442f06021f1078824994ba8071650d8e1076984e8d15b6a2324350b2caed268deff641db73521a0bc3f3d1496b1b66433f0d245b612914fa90176bbc84f21d04ab729de36c947802d5168da136390fe72bead19f9a22368540fcd1e70202c3248300000332369a15aa1f0d55b97d5b30186fa395e84c5ff5304bedaa9f64dfb07ef58f11e7f0444d124b422d0042b01ce2cfba2aa1b96dcc19dc382c49e3e3844a05e6efeee5e06b1919f2e97f4f632f26dfd2405545dddc3fb857032bb65c4dd61eb5228ebd477b4f8c41e9904156f7c2d3711904bcda373a5606b68b429617fcb282d0b3e7ca2e52b83b5d20084ddff47880ff3e84886d951,
+CIPHERTEXT2 = c1cac50bf401354b9eca78e626cb52723cd4fd54bc67bf3df33c9923cca586a852c53dcd3ff25506bb13f1011afe8c5524d1c704e40e97aaacd0faf697ccf278a549c3b110eec4bc4f0cf4a893cc2dabd7dc9ca9bef2053bb82b9a7da5810b046db681cb5eeaf782dfaff00ec6bea57d3cfb4b475b8eaf8538c30c1b0c4187f040ddae7eb2eea9a4d468a792539c93d3d8a5b92439936e1f127c7dcfa34314a3dd769f0769b1e617f10ed0abc1a1e30889dde1b05af358c139c942ff505f92a5033482b685a5e8a31941d42ca06c7c2281bb6c06e537f8ec5febe7809bfbe5a24d9ecc22f8e0c1b425a9343c07d3f5dfb10cd3ac95d15bf1ebcda400573ae29dc1d5315321aa15b14994fde52c8d09a1fb8558722b9ae9d993c9f6cfd9ad5aea3bc414b09334e41cb36d16a358fa65338ef6fb088df84127c3d305c2756ff2c14a520602a34add434afb86d95c487c220240b73f67654847e0083af44832e91d7103ddc53f707476a59d6cc449fadca79bda8f1dbeeafc5c4aaa4010ae31ecf25f757d9a9d9dca65f66f2434769129735b18a548a8113bd979a1fd1d8d491535f5131e7509d0878a20a73aebdde6c3e3ee058665e60acad36b5e4662ff642048566f997bb7845c3aae43df01ed65dbaed26c56a17104eff8eed1f0333f916b928e68346f79fb2b725e08bc4daabe98d0c3f4dbeb478c5cada7d584b94e388032,
+CIPHERTEXT = 3f2f61527340ee2836654b2835bc5fd129be99c965c09db03a5fe86a74420b7a05b225374e082e0c2576bc10578034dea7d3bba08fd279a75a218ab6faa79a574eda861e2a317f4b483940cd34d3dcd84e38f98a732f6211978b235e80bd7c9f27486682f2926f50f8852b608d0d1970ff1d679016fc05c1b440c0b982436ba71c65e43cd3bf456ff535e7f01805595abc88bbecb9cdc1faba9668be121a3379ffa85b424a8b07315b30904699e5b0e3b262b92a517d6aa7621b1dbf879c5451df7f38d8d21e38cb0d4a467f811e4584a4931d8565d15b2344215d41942811e720b92ee36111ace51a10eec82f42859d15ca6b223367ee60cfe95d6762772bf2e3894985e416a47a5cce3c7e55ee256eeac0159694b793761644627825506bd69d6fd66a9a39b5d427cfbbacabc4fc5014b895b87933d511acb8dfd528ddff3a8431ce4c4f62c36daa0731473893fb520ea7b6d8ab8441e91d1d0c2074499dcd5fd0a2360395f078785d43db316f88e0e30feac5864ad4439c4dc9ecda702e4bbea892f4452836abadfc386978b7422d5b84bcd292fc35f42cdf2fe4f121efdfe8b07d82c39dc1e963be1ee3daa645b744734c564f238d627ffbe978be81e442e19e97b8d99ccc1a9087bc2740a1b63863d308a9712e7de3f6483707e69a9bf384fe699c92edf6765e85f814718b585990a9c6a1c5311f285ff911abe1980f35,
+RESULT = 0,
+
+TEST = 79,
+N = b27b3f64244e71f205b59fd01f52208c8c56d2569987da12f530cabd842bb55a2bac52f5211233570a86a4a9e3ddc8463ba951c75bc71bd8574909a1093e75376cfa130a16584e2136c5344e9b31f4b635399c5bf239d3ad7d1d121892a98111b6320d4a3feba59842b7d5419da691eb85dffad0301bc48269b93be923a61f17b6c8f79a070646ffd0636c1ce68a1b338422ee8fb3373a4d8d06eb1ddb930b8ae6879ec4de6097c1617743eeb37b0db0cfd7b2e9a9e6642759a11c587c6fe06f841e6687b2bce6601b2106529055fcb09575f26392e34485b06605615fa1b12d9576d5d7ab916f4b189c904cb016697f67bce6e229892901fe335930642e1485,
+CIPHERTEXT1 = 2d066504d6ef206ac6cdb2beaacf2ed0bfa80ba6434e0a427f662e7b9fc713dd11bd151af534e005b58ef8b50630fabf365c1a969c78db8b261cf181381c28c773f3759d119b7b3f9c91d7ec68da488a963b9f681fd59ff7afbab681428d7511a78812e0f9650d324912ad22a4b3f6dee9c1791ff0e470ce51d85cc8e399b37a71b3a729c4682e47c452e0efbb4f00d4dadfaf081eb29dd95380b58a88db1e77509770abe3d1ead527c33f93b38173023060884d5f471ceb8d713a2660023891cab4b8c356233d935eef4aff6322f63fbd3a2d460d3080072d4fe9cdfaef5ce13385b3160e0bd066736835d206939bc64cd7bd688f4dd64a491bf19d31638ab52f284692f3453d2e130ee9fca24f437f83a3eea86d17aedf8757ab10d10e538581282a8169b700287735d3bdaecb87b959cf49919991da6e943f3523b0e310917a328d454dc14f45bba0e5bd5ba7824c4dc93585940d03719d6aca59edd3307081f924ae6def195e853ed814dcd639414b49b385b6453e267e947a171f684285a68bac569193d7499857ead451d15be534fb7f986fd25b27dfde446a6e6deeb8bafe899f3f8c7987d3937194177db1f3535375fa67a398d376f752d052f3bbfb874598545fd6f8cd322a809c5fc6adfd1211fa81d5a8d2a591999a41b69089a6f30efb36a4a09b72c4cb749760846cdfa84dd6f758c788f8cc3b448db74053c9,
+CIPHERTEXT2 = 30fecebb5ffcf7017df061e4ba55180b406934a5dbcc316d70461f447e1db56ecddd7d9a313142ce46553eef571490aa7b519f36b63b9b235895885e77d8b48ff797d2e39fa863e22e1f96a2f5a471c7919f7e765fdd8914d8945834dce7c56873fc3148fad108d1cb163a9e3f3c6ba73d01dda391c62447155c4888bb961db81aa05977067c4b4645638878689c638d5615442565408a0a07467ee2bb15299fff69e1e06e70ff20879d9ba8ef54a1f4f8dc27c9735eef6e625b71724c074c296db5ffae25013d663a9d884b69df234d80b201192cdb46e617710705599ac4b33435f3eb3c38fcd25a01a53dc5cdac436f001b66a5a7497decec62768b2b2e93d6863fce015b839d73f7b7a4943f817dfa896cef5df8f6975d5d9fe2e75f4cbe983e6651eb9eef4a78f4dfa17dc7d2628e7faf707278792b0d43182d254fe62a0211f7d2c5f4ef0cf8b22146506fc859a1ce18c9d3b93e2629e75eec0a18b76ca0c0405336e2d78b0f0b944f6fdb9016faf9f1cf5f1eaa0793a5552d8dc0bc5b75716d7c474a95e42c7953ebc17afcfd0e6b0589371e60ec8376b2fffa0c9a958324171d7d278d7dc16755b4374c09055bf4bd3b1a1f32bfcbe0ef658c66c655a88740b3ca2f8dd9a36b088173cbb9afab850b1457f2426876afaec4195a8281da9a21537839f0edd573cd032fcc52196f75a2fcaa8f64aff68dbfa292c25fd1,
+CIPHERTEXT = 2d27c2157af1948ac695284923a6190c8dc9f94b6e48edfb3679a9d58c2b8b3429cbd5a9da7153dec59021238550231e88161a1ce594dccf52a2b7cec5c9645e3103f33ba9c4830055cba602f1df831c48b78cbf2fa61385ada855b231a06451f9062a96640e1bd52c4f429d90eb1214599f63183fa2416c4a597536b2f0d98d29a3f8e39e4db95d716042203efffb8a0cd02b6bddff2c3a12f1b48af33a4ebc753e9ca424083a486f9b2588d0ca1adfa4d98d7ad66b884d7e849519b048ec40ca850e269b860997cc8b07f16c240ffe4fe800ab02f2d5361ada2f7558fceceabe01f33c62028668611406a90fab509221f92cd75881e19847efbb940a08ceb864f144952622931b37301be6a860249d8e13a30ec31c3bffb874ca7e945d17d7321e92c63ad563f808fb5bd339355f33b9bc8276a61bc9f34d8566d8fed9c24301ef0f48e5e967e2095845d7c5ae7989cfb14672b244d609269edee0546d11e7dc2699103f23901195fe3f1e81584c260a2a40ec7300d37bedd17bce3d3e7cb957a1b995d0623612f5fcb696d2bf53c126a2f8fcf70d26adf1b9dcb03e9291b66266299211087b703630288d53a2a3d9342b573a98511f8618089cfc5847bf1e04463e77d8cc4c78de803ae2d97dcc0dfe117400ba34839c25442a13ba448bb07994f8812943163e9be63bdab6454f1350b3c73474189fe9423b2d254f54146f,
+RESULT = 0,
+
+TEST = 80,
+N = a29dc2d6963372e6222890b8eec3fbf003774649000f8f0844edaf9f4a44275e29c1e6a730853f28df7d5b546d9df2efea21bfcd8d0b42942ee57d0f688f64e5e756a4fa065da3ac520a417b1c1439f3fdc440f1805cbb81a7aaa5f681b0e42a1d16fbaf9bdf1542530e41f7f1f2e6a5a3af374fd0835bb7fa3f2433e7fd626efa3b4de568c56eff5aed2232c9637f23b5f2b0aec304107e6b966737ae0feac7f0e3870629e4897d38ca771164a213c357be093b4e087ec20394b5421cef5138f4ea877627f0a153ab426c3bec051d4472adb963d3a7b1b4ab9babba101ffc22811ea106b9837b470577cf3622ecb325a5b12595f3e93f5b6623da4a9a4cb49b,
+CIPHERTEXT1 = 18e165cc9bf808a3f9bea10295ed3dd42a6df8e10d90dc83d3b2ea76a2ece1df2fe522083f3dc37178c8d321379f84f3aac60fc4205cccdcb633f24cd4a585d40b5c36e82493db8e4a2e713cd4906c1eff6310ee084e41336cb0c935d7dfad87dad45d9bb622793de9240cda02e64e8fe6a104e3feaeb2cb0d3dc1edac2ad55c06f476d9b521418380beeb175adecd0d3b562b1206a5ce85f368f7e7cc7057c151f478d0a1dcc403fd51c72fafb9775e0abe3c1a29419261ddac568b59df8cc94114be78b04de9eba9b4de2ef52dcf762c1e730ebef652ec9561891ae2fcff07b2b6c84b1f3b364751d9db9e6cd28d31a90d32ea9319cb4cbf08c8ed82aaae0d0a8504f26932b557b6ab2cedcb7c25f1449d7e5f8f28c0a7cbb09394f155bb89a380310520b9d39fad0ce1e422c2a4b1aa72e3d9ba8dc989ec4181e887e0afa70b0074e2a62c339eccaeb10ed213546ce628367b1b8ad9d5cb96e4d0f50f7e3efa9016f8631fa5278053baa34fe640f8d18c0084f2d9d4dd3e18d009e831456254dc1d8d4d29c039d241d65e0eea38c33f541affa67de0a5aaad4b6d4414bc7766a75a34671732a7e6b0a7795066b9a1ef7110bba511e8b9d6234e44c7407322772da6b77a20d09845e555cbcaa5355f8c11da140ce38a4508bdb8625443f7f105c1c97e863a7b8404749ac0645a94be683f4a55e412a036a247f37a123eb385,
+CIPHERTEXT2 = 079cb563366df49862754bd62298e5f3f73f14941ceeb34a64a84d07b1a3a7e939cd171a162d1acd86ceffe3d980c5fceea4fa5a4e2d23a961b940cff296ce4dd64a50b2457ef258ac94524a7ef2df810b88c3b5fbaa43a69651c97c9489742d755423cd5b62c243f49f38568e34a78ecdcf5e7b96c060012777a6b31b01cef254b42591ef0c274336a8e76253d0e7d4c50e27a9b18a074af492f21cdcbb8f28e8d4364143fb4066560b3fd44bbac16810023af810295daae57e2799da898dab9dff38d4b735aa01272e08437fa70755b329a164b2c6e8912bda807ed46f1d8a38a1bb8be71ea5d0c8a1196b6c44eec75c2ed007004d2ecffb24809f6f0ab8e09a5032b7fca68bd4f0ad0f0c3877c3ab3a0f40ab8fef07c2e513d163f22c9e1dc71fcc94492034e6f4e6a2935045eb8b8d9942a213e6a0b797ccebc99c45dcb83ada15e68d9dc67cafc749307e4857cceb5f03287a8857407d30cb9baea66606a70277528eef8d9b20a96e0dbaa65b46051c16585bd9012eda455d6ff089c236b64a1312878fca264ba560ef9fe47729184bda5079891b5028a9eec94dbb1bc00c4ffec81fae8a8ca6149284947bab21bb5967dba7201a7e67a34af1f364a56693619925e2b389f63c0c40dc6f00811c103cdf8b4c3b0c18b166b4aa026251f4a6aad287ab3ef2c63d5a3ae6bfa73a82e09b82c21e1ccc740c1fc14cd63fdf1f,
+CIPHERTEXT = 4ce1053cd527ec50343a587ed01c2326067ac05d69141c6cf276151554d8d29ca0a727ca080d44ab66eac5f53289744efa2fc938a603ed2412f0cca22fd209d4b8ccf0dee56261e4f65c59afc141ec09fec9be7952bc15261dda0e20d9db584450dbd3185b36ea636e69219d405e8ac33be373b5aa8d5c990af4e98e2d77459a71c8ad54601533ebeb692deec896fd37ef83e1f84ff5daab4ca6affdf83d70e074d4e0f2419b1ecbbb6fb9d5e4595ca3734558a0aa81a5644855214db067b962bbe2b9de67c79a3e2c32d44c234d73ebad300a729f14d67c93458e7d9e191c444fd47ee8c955276820c732db404824c3eedf8d09dbcda8b4e28904d877da56a949ac43eecbfabb486236965b11fcd53893c9f9010d4558cc392b5fc550ad9f08b58c77a2e6a3afb4028c2bcc631eeffa759e31523fd7717c5ce3fcf6167a01af4119a2df809f174b86ff8731ca940a09023482f405ff9cb0cd827d948ab77a9c7f887ee19f89efe9c7adb2e4d8aec2fcaf3779c0a9817c9ec934c70842279e70398a31afe633e58322dbf2d10a48238e810af45bf81261186e1132ad801b43f49cbb14c6c8d81d32f1f1d119c0ef962675b1b5dda1da4a1a0e67f84a0f8b6ae2dd13d4e35a23dd4393f376e10aa2f2089007b7b6488dad1082d93fd621050e5d294665a48333d106470ea780851b811b4b5ec02e1a8939feefca0fb0e0799d5d,
+RESULT = 0,
+
+TEST = 81,
+N = ced26dad2c0492be49dfe44275bb5aebfc97ffb48a4f18e5eb5ea4b981675def3fb512f3b49845b5ffd263202ce889e5cd3ba50071f08fb9ccdd925a3af00bde6af7a9a88103ba0ccdd977716cd375c35fcb20843405e5520b0d6459bc6e34c0cfe0c919096c7d7b10cd122f416a89d5c23b08c2a37eafb8a1240410831d0ce6360a107b4223dbde140e6ad4c489117ce958686cdfa3f53aa2ae5ea264b3c2a314cefb4088b221d8e602859840d53d3d4e7ab51c4520bcbfe0c18fd391b5f73b8d1bfec9aef8f36bc11ddf3ba568be78f9124f88e6a84f64409400cd90f4ca3cea47d53e7000ce10a534aab99a4b89c669bf0d3aa260a05844d61d5c14147027,
+CIPHERTEXT1 = 88077fce1ee42e78f1b4dca555ab4efcbfac66ab66e8cd9b3a8ed49e34223d4dae431b229d28399d2f5c2a33fa47e07ef7b863f8f18912b47da9a0d811ee408c4e8491335436d333bbd5571aca385bc67d4b6b7b6d90f6db754f11f46d0ea490d3f30b34baf2f5c72c85ce62bff54664329771e6b69dd7e074ab212622719f358723a18b6fb3f63cbb5646f330c579e317b547617d14b2a8a0f5b98b59e7732f37e0dab9935b0da4021ae5c93e8d14a872fef529d7bc44684b66b1803456c4f979c725cda683160e6a23a40f0d3eee18b9eb72b30b91058d3ad0426eec36c2ae88cb1e24b338a2f36cde54d5a7898d5e11d24f7a08983248f98efc7fa619bca54d29e53c568947555af2719e01e57c90a31cca8a1f85e6767ad3e8783b34dcf7ec64840d30675f76ff338c38d4a4cc89ec3d2e601b9a28e4381b399152871b551eaa1d456f150c4aaa38ddca85e83d8dbc0ed368e26e25797abb64001b76c1767648d45ee12d7c782cf7ba0bf82576288829e9fae88bda8fb4157bd8eb7f11283c8fb5064dec1b0cd54a179229a37e0da89ed4c2cb64dc0b43a7c70a4819f6cc8951091cd826baeb32e5f3526e2b0376d11e6974c9b60897bf58e47a9aaa506b84688989f2b5355a9935ae4fa81c080be586383c271531b061887e0612d99b625c0674688d005592c1d8a92a27c0d33e2dbae5e4c227f3e5564304fda74a8192,
+CIPHERTEXT2 = 0097ab6e0603e823c5e1d84786e961737a6cccec68acf67ef0e3fc0a4d4833fd3ee209cfbb93e8f62091f6d5a6b2e650f9802a9c6ec2be1e698ee0f8295462c6454f8c516d82a6a27fb64e99cc64f811ab6f7d9fbe017961fdd08179fde5a69a18ce3e2686d021ac84142dea616f81440ba8cea00b22b555629c1d754bfdbfe982e2b519abfb7196d27743d633dca51a8fa1c115177ce44c6fb0502c5ba00c1ef2c270bc519d4f83b74c5692b820835e2584c02dc44411c808a7cede9d8537660ba5b9db0c8f373bd0f152866dccfc0b3810fecd4c1f6311e7ad655dcaf0a3ec2ac1015d1fbb631bb8a746ddfffe03cf816239a1cd7a39c2b0bc3658ffe2fb561390ce00fc1590fddb32bcd243a62dc41a266e7b92115aa4be5aedfeb6b142e091f84f2072cbba71cca7e5841b499ca39f6e0af8c4de0f740858b399eee430f59226abfc32d53c964d8928f690e6d140be10e01d9ee59d4588d738cb30e32c5e8ce00dbe38e2bf5319298fd268ecb8fbf88d00191c3b502b8e5668ac51190606d742b0737818f382703fb38c6a73317afa43e830b724f7debd2e3dbb40e5838501d42a6c775bd8cd5b3a91cf09618d48317b8b38533b1e43b7e53184afccf9cc4b85de3fa58959091c92ec92165e7802204dba4b4cce7b08c4d8c32ccd530701a3c95c5ab1e59e03bcadec09eb4bf6738c47bd19644d4a2b76f1e1fc4bb5e4ed,
+CIPHERTEXT = 0660aa6de160d8c00c589723ca7ced9c9b802d9d60867a338ac0d3da7061e3d65e73f91db2547df5530e2139223951365961c4e7265dccc55ebdf16d0d0c3d1ccaf9ba7f3787861d8254d4ef47410f55dc117107e00f64875087e710bf707140bdaf05b813badfb54c9a16f0fdf234a85fd8f2cbdc3e90f5c1d9e1a6223b25e428fb83862173082f8055ec4243d5b30c9746d257d9f3a4428bf7ade96993e3d2b95e773839ffe7ad7833f005a8236257278413efeffe024c25cfd7ea0d80d83def3e66ecb3a55a14fa354a83064f1d74feb81dd1a2d9afe2ba03c6f45b2e724070ce919f89a2436e0bf406f17fcfaa50e89e5203301c01be42c773291fa9503cee1195c3c88814a20196a1e21599ad179277257a715ee976fbdb0f6504b5800b233f0666f8fb916d0ebcc15351e89a715ca99661f9447ec73fd0c645475361fd19cec2be7ca7e805550ccf57d2166a4d8f859dc4a5e370dde608b85fc8ae33529bb35025d3f39e53a12fd49ca1b0ba3a760635b792a3a91cd0bd8898116af11547f502c5e96f0456f98141c65917596505c93af644e19b967c773b7b27aa856e70fb960d44509a6c71c835bd6c1d340d52229492256b88d53130b091f7aa628b6fa18f1f196238c7a4ccc632185a48ee5acc340f81becb8914c7bdadd9335a3c3f5aca5dcc6a9e41ce47193908fc1c9c82090aae325d56053afe176a8dd97eee,
+RESULT = 0,
+
+TEST = 82,
+N = bee03b609b1e5179966e0e4fa8ccb60c04b66ad68e113281c584f5d65faf1eca905b8272849926faf0122ea1a99ff212eca9f284504ba961edb02222a8bb71f3c6af4e39342ece61104f167d7ab00b27bea2c133ae100fcc319b2b1ed4e645b76661a70f22384e13ce39d4aa09a2fe42fc33c67f3aa8f7d6b805269c9dd6ef812c5ab0128c3f28c57a42a876a6de690a65f1f987222734f4064d4ce13adb15b7e9c183f0c2aab923787f71e5ff4d0042cfb40ccee46a2b8be309736c4a717e9ef6701117e0b9a19fa6bd6e557c64d1691bcd7b5e95638f207f0a26efb2e4a47e9a91a65a2ac5b419d2047b70f31763c8e6ba2141f1c459ac3f04ea67dbbb550f,
+CIPHERTEXT1 = 450d9df840a8c42f33f63e9c67850ef0236927410271bf695658f522528c8b0c64d168ee776b4634f252f9ec78f7bd290430bbec088e8af51b6bd9c627f59c5908ea192f6150a8b557ca07b45073d81cb07cb9dda38e5afaff7209432aea006a4a924da9628905d67916139bd477894ff8b65901222e5d02f2759ddc618d9af993e95eb81d1c2ee4516659fbd7a2aa71785009fa756a50e8543bdb01108e19a0dc29a0b9d03882774c0830ef13a945f581c4c00aa506262a28d293ef908587b6f4b9023c337577ea760312328eda8e02f205dbca8c278ce2975bbcb35a3651be2dbc675e1a5301c870f6091c981c9405cf65c6119f80d8c2d0199da7720cf1b5e323cdcc090e5566ab4b9624fcf5c98b2693835fc5593ebc5404b9b05dd175895bea87a31362b790b7ab0a8b1d287111bb34406d1972ab455aa47dca162a62ec88b6283802b13e21d5e0a48ee2b019b68e48d494253297e9de9a6479ceb75f0372b01ecf8f5d680f21a45532f8560e5d79e2b4e6401d1484088e37cc27a900a5a17ece63dc8333cd14ecb1586f72a436fd208dc9ab0c6cba6c59213cfdccc404f2c67ae15176f7a06fe871c4e008a9bc942536a0997b6dc0f8fb5c5629ca6a087a68a9bb80b640df6f8076fd447fc3b61e5682ce2a4fbf3a06e0a57aaf79a269e936f4e6185d440c39d2b79d88949d288c397b354a693ffe175ad4afc94beda2,
+CIPHERTEXT2 = 228a67969d536915a27656e603ca36e0902f001419bd04a73a0a53e364390e5e5f974e162a7266fdf63b2ec6846dd33af2275a91350cb85adf0c9499e87cc5bdb3964004214ad632c117328261f1f9eebdea5f51b4c8e4192776860fb1cb0c0ec88d7f89eb2930eb933fd731a72517f693b52fd32bf783547fe201f530e2877b17864a951114b17f4d1f6b02bbaa27c377baec4e32f44b6b8fa91df5234d4e5f4d4b0b181463789a5dd0d5b7979b6807ae11be3f9a98c5aca1870c676a68de14d906fbb4066e58b96662f85e8570d2940624c3a8fb238d97e27cd0c4a15d67c3440f04db95847e7fd24302aa73252657abfa17ba3e1f97f31454efaae59987cc391d5203358dec125b5fe2b8b369864fb4a2c93ae1e8728205aae3a9a356c249cbecc4c45e24c41cd03fce7f2fe144a03594c9446dbfa4fa7adbf08868ecc17a9c94a562cb819369211ddb3756bdcb21f43553b3ef034e76b97c6a9eefe92154847f933c23a866b69fba23218903b14a04b85e7ba806e89893b568002675d8aaf51f0a3fff0c1903392f61ffcf5a700e2cd91d0773f4ffa5b26c1cd563ecb35105918251e9d5b68c717dd058f2292868c6c5201fbfb9f8068734dd01b6c9b191b4b7b8d64b4602889e7dd754536407da37ad0000304d73a58975e0fa2784dc7c693c7eabe041c58bb60e713b38e8aa11e1a9faa7ea18988097885647270227c6,
+CIPHERTEXT = 86137d6baae5d146707eee8d6573b518fd831217bb353691c267ffd4efa2ed8cbc537f17681f27b0240e7359027c5080a4035990d37299d2cf248c1c85855ec46cb017ca76fae15461ec08263a9cfda1e9ad156f03e804ac400eb661ed8aa9ed93bd488533c9c506a32b04cd2a4b52122cc7378d4ed25e8874250e697035153571e8e083fa894d47989dd2c97173dd1bb69536e0db73c4c578ab778c99b631320dfff700fef95cfe6c48442eb461f07e8e28c44eb5b69c4c826852dddd31c593a0aae6e9546a4ad7ac43c89b1d47284c6592c067f5398dd93b1060c7b6a59c5720d60dcf6024a1de86bf50377c6aa47ed089debb02e67caa9ecd2adcd1475a6df677a86911e189671931ca27e787dfa7bddc13af741249fbd001652651c5916ed22bcd0911081764585a61509c60599d423bad3f73a4d65d903b77a35f4a368c427853fc6e6b8a57f8803882d4f02746ba6b9932c6d927d9bc2e6dfe7d2a9fbcfe2dd58f06daae46b64b13d20ea139bffcf196f580ef0f2f0b3f41bdd05d1001b3646e90c4ef93829620cbef24ed2929936507a6ba94a75c18cf1e8400baea889535820869f9c227c4c2e25a02e74867ec6d120d9c6d5dacd9a3c122a26cf4edb1e5e28fc48653f67ad746c1b3415983c107c03e731a6d0f0c0a8512d0999d4a6c039de7f75bb412581f86bc8396568cf058b3880277525889a2e1fa64b0b190,
+RESULT = 0,
+
+TEST = 83,
+N = 992c60f8cb701db3c82f6589f15c2b4fc8562a18bfc29f6c86c5e2cef2fce9d687784b9ddf09d93795bb70645f7e8323349d11d27657bcd6239b3bbde3ebdff6d7b849df084338a00a312a0ec3041769b3e931d13a9f771f5e6d73a54081ce0054d6a84122890493acfc7db3dbf217ea186e5aeddce45e40b7bcf5d87dba92bc32874d6c2663a14d17d084a75b46dac749e84e1b2f5af838fc9fb1da194540168ce350227ba63c55d54dddc2072c2bda6498240864ae8c73403535c4f6ab5d258e68563d6ed5772df6ac660f47b916dc2fc3150b9727526e2e40dc3ca86f61ba1a9bec17415d8b9603f1bc3531e14fb55adeaa43970ec5986b346bd5a4784e39,
+CIPHERTEXT1 = 18a6ffd236b8a9a719a20d18ae7fae002b7d1098ea01b0cf1d18b101fdbff38ef7a3b6511bfbc981448333ac49713bebdfe9f1020fef75f8f6ca9df30c39e439e7b336887e89649a0f336a227d689103e9a603fc1e5c1fdeeaa795ee74fdb91d845378f35aa2965aca0727f06192c5fe22abbc64084b18d128739cabfdd0498dbea4a43c416ebc67629e13e30e768b572ef589ca0de51d320ae368d3811c7c2ed8a5c84ede31412ec0176e96c70a07a33bbd3201dc8d8c7ad040928f1537870a089641154b71fc66eb975716c5edf482850f9a8b6ed838b43d1dd357fe64e64b527f8d365a15ad616157715a615a255f28722e54129dd812c4a0d6be3d9c03d4d0173fb65c1f9d03370fdc789913a7d53007d215ad9d7d9165ab76a2f5704e069e81914018ead11666f43a2688752cd01621dd8052ee09495c8ab6c48f7a75a5febe3c1242203181732c9e6bcc6f826e6bb4c5882ed17a9e85990174e4eee4e516ee5bc5b72e29846826134b38a1c8dc9f871a70bab571a7456691c88d8bc8892fbedc0706ba6adf36f533a83e6fcb7684dad621993883a0cf2b89571a51b737e0894347c06188fc37893b30a494bac9f9e9220b989f0c635a18521d4f39eb1406e984ab54af95fed84619dda3cb5f776fd1be3bebb76a80114c04834beb232ffcda9a17d14fafd76591d60442fdf3248991be671437b0c3dd2c9087c8119926,
+CIPHERTEXT2 = 4d849d99a3cc6a7afc4bf8736dd38700567b12ab5d2bb27f32e1a754fe9898b7639a9bbf3e3b3236f662ef56e99f457cdf92062ed08d32a29ebd5ef59fa810b79ede1219794adc7fa92b679996562bbe91381d4de6b2e4c71929b8f7f1d77149d642882433d8cc8bf8717738dfc5efb8b22a933af5e365a21d95b0d338a87d8e48fa75286e7646429d0dea5920507e947c89d68418c3afc10f24781a731df08f4b30159380bcc1ac2ca28500dd7240a702f12cd53577125959f36d2214f5a5f5e000f5a7181da60a80dd84b287b33c169cdfd9e70242437723aa033bfc23acd804f226b59a0bd189549feaad3969bee2ad2f4da16fee8ee46c272c5825fef4ff90e56a28be824e31b7db345ef80a137afe15a9299625b5671a35fc15d1c4c4bdb135f8b2ad42ddaee7487410707fb5b435384f048e91ae3873560a0bbc3280fbb47cc5cfa2b59ff67ce1b6118aed7b4ccb27a045000199a3760e157b5dbfbec2a45ca969c9b13a47d40c2403f8e285d39fbf095253d17a03bd6b43f497c8c722a0c3b67b75a1d94c310571696c149d894dfe6c292f107a565e9ce577df66ec7bf45172224b13bef085d17b92479aad3f78484b72dc92082c5b04fae8cd02ca063d45830911497359c5e1e6d390b22c61fd0c62d08f671830dc0ac60c0a2de7192d90bb633191368e496c70b15fd546d160d96994c05e5c252f378e54e958c849,
+CIPHERTEXT = 59beb6389472e87c9825afac4eabae9d342371eabe4806120fd589e131b30a7a3b5706ecb96c0c10c44e03c7a7958a1c91b4d8c98c76b0dc4bb17de1fe1d1e3dfd1afecf930a6a57168749d2cf5111158177205cf3fde893360c15a58b7f655d13d73e722b447bc9acc90a7bfe401b1270f83774741625adf4e3f0f7783713ca2438dc998d3f2f3fac57ee526f6e168ef3ee688600049e266f70751ef600531ba406950c3c9ef8ef27f706e2a6fd0b195c48a506e4067dc8465a87129740dbf711ebe4fde2090070c46ea6996f7bf2a38d0518262adb8fb427559dad0371d853b3bb2e0e2e36fd022326d22e3a6881b6ee780bacaa8f7a735b708c9aaf53f011394387856d30f6e14dad3b3fbdda11f80ea17fbd62c35e3ac8b0b76d6bfdef56f970303ae1cd6fee7bba87bc29b33023a89ce324600670b0540101f2a22525c51879399e452c3652968f6d8189ec8756d70d2a03568603cf681cc89c03b86ae047c7a9edb934b8d80c16c338945620558ce6f5e1d03a7ec1c091504ca9441021fec61ee1e47d6d2bae66a7b459b37d64d3b7a6c954b9d2a6dec525cb993055e7894c7f6f9cd640ab7242d52cc4bac40fc0f9685bc8a7dbce8d8e1bf5b25b70fa0040063ec0f34d24f344effce61499ae3b2fda4600d516b0cb5f9a6adf6de7787a1ef5528ae61c2bd0acea3be8c5a9f27ac784e59259ded1024e2618b39ed59c,
+RESULT = 0,
+
+TEST = 84,
+N = cf44c682b12a767e69f62accefc86facf79014200df28405004c107a4f8292ad7784ef9e74f145712f2c1dcb0a814fdaf98352b48eca32bb97af770e8f26a3d3feace2557ff221bd2656bc24aec658bd1f411366f835d9992582ae2a93c38f9fc1c601f64f846b5f1e0a570741bcb640a77fc420996635a084232edf5f5467e89689f1120324b778582f2eeeb4b20c16aae894090359c349704320d5939ff2b17680d6abc392e62e4b2ff9d467ff2ff749f00dbbb979b1171168a4c32c8eb6c8b1c70d5dac8e85cc7b70f70ab5b2ec1148171a712b3acd6945b8783dd3f1fcefacc5a217f2dfa0bcca733f982ddeebb9bc0b630d537d709ba4dab46f5f0fcc0f,
+CIPHERTEXT1 = 7a44a7cba2670fc155b88e1b9649b5e33dd7813a58bb2e8e02a9ddff388a53b5831cfbe7e4da2408fcc2fd6a6883992c1aff114558b406b291d489be6ced2c199b9a916455525a58c905cffa30b0f196e64ba1437845a2323a1fa44a7e25b5f79dbce752d00f7bcf05e56003a8ab7182c9804e8d28d0c5b74b8b763751aa85ad185e87a772e00355be6fbec8bdbf37d07fc6866e8d653584fd2222bb7b14071ee87f588a4ed544b1cc61a04eb00eadd53166fe3ed68d2b0fe38aed042f81f6385ca2b09da8c11ead34dac8a83e4637e79e586909fad8a6357141f91e50313042d240de3e843f92e3e86a299dc062130e4fa58a1952097abe39460b0bcce86e0453f39e20ca239f41c2366a8901f7b0c126f1602a64ed131a1c9a2f8833805dc92404fa7186d4e74855b1dfe8eda4a1bb34574a6f0086e9edf5550c669fad8417bec7b31e7aab30fa46d80546818871febc872d37cad85448843e18df342ee57fecf4d3a6256e4c0801f6bc300c6c4b77cf8c27692d505e30ee1deebf7050d0a58bbb1fc0587c3a50dbcad0032ed057675d97ddbc40c85f67121cbabe36900eb228ea0f477ac97394defe8b063a9828b52623aee09c460fdd7c321e7ea50aaeb4b222b144a48689c2bba252e68b50f30cdde8ba851d68c0ff469bb450a46c35210913845f9bde811130dffad3654d7b16670b99884aaa3f23569454708b970820,
+CIPHERTEXT2 = 1ff8f848b908357e338262002ae4cfd3aa30592ee00d60ddb5bbda82b4ff73cd815da102b1c9375db3ab141638f83703f5ad286bbe877678c5ecdcbcde3af5c9a0be80d10b0d2813e28234a08478cd9355808c48f42ae2d131d1258fbbf30d315dbff2e847f97e31822a0bbaeb0df10c8b5c7afc41950bdc6d71265c4ab83c41f5c0598f71e1d1b2a267a085ccf92cee55217cdf7cba0eeeab8c835175a3324db33ce0b49bd068c9646584ca72ac760bc1896076fdc4ee79ded40aca75dc28cb8e563c90b8f5670272fe6124d039cf4d0d0ea0557e2a1216fe13957809b9ec002812e1a3a1ddb5ecf2acda030fc5b55eaea6582ddf2f5423de7f9a08e71340d59337c83ee5d7a71100df83cf201a4b69545dcbb6b7d4abaf3fe889119e7003d07d8690d80fbd21cd6b7fbcadfa8b2823c6bf97fc8a9a3d674abba75b7904762fac3f7475739f3384e340c661e65e05d50696d554f653a6cbad6787a837b3f477f76db471c67f91260c0693fac2b58569f88ffa2bc97715fcd54b968c3c3d927d2eb21700128a179edf07797bcbb40a17d310274dfb931b4dfb579806ed847ed52d53601103cfa9967dd21e730bab64f8a1f763ae8506e432693042aa3b65eefe041060bcbc2603b1b416527140061658f629100092e7882a41a7fa7d07cecc34d36ec9f9245d96880ef512eb5fb3eec28f8c972361a25e5d780cc717fe2f4ad2,
+CIPHERTEXT = 0428466254da8f4f9b79abcbb1cbc649b4440a9e0da8b5cce85e235447ff8e931412ceb3a6f35b1d923d5709281912de81b6f1d076e0c7c644fa65aeb85c369ca6c9402de4dec0d0d4e57ae71b7ea7e83cdc282bd6ca372ec239607674f058ac504bcdb1d0de134ec93e3a83905ba1c4840ccfb6c8bcc1b93ea715772102fe2695f59700d94897114a9b8e95124dd96ec43f41f05747c454fa5388d5e7e6d89932e0ad79e569c7d4ef0465f1b3b36caba7a0d8d8d3040a2816e2c42a6830162a1b6f74eac6ccd4bef48d346b4af3eb744b14429bb97af03bf75b531fd587e0f58609f92a762419c80ef6a93ef6a577b7121404a04fa3979b53118869f95457619127729a84d0bdff208adab8683fc4708445f03f77f5bfb796122e1c92cd31179d6ae3ac3139a3884f820d1c98c91b54016df91065fa4c3c37b81c3d3f1b0d8659aa237f95d003c5c19fdfa9f0b82c209b3221366f63d8a036fe9784ddbfc3339dbb2e21815b4102104d002880627da3fae6dd509f49bfb866c8ebd8f527a4c168e055983efb4f0071dcc4d91b4b1d356c90cd9fa7bc2a9a5f4efa52b6617990fff68ed7e1f495d4bf0fdf6ace3fa2bff82d3f605b035cd02d1272c95fcb08fe52df7dfd5c4aed4751911802aaf8597f1a8cf656d909c0e624d97e90aacc344df158390f21bd60e806091d4ebd6ff1ae98b4210a3be991d8c9234a522c81eab3,
+RESULT = 0,
+
+TEST = 85,
+N = c7b67d59ed5575748de2f9afc7102f70b485517650a0a8383a9a88479c379681ee69ff5cbddae0cd37dfdc65cc6c1fdea4e5781c6e8f0c79af15d836558360692cd349e5838d848f72029e502541acdd9c38f3668e20cfa0abd231de226cfd23f10ea75d857684b13574988f1abe2944c7fb8dc54ec7f154b6720adcb84aa33c08ca7eeaaa18fc681b36bafb28bfe9b64c3b42fb0ee82d7b2ca77b9bdf534f4a795aeae78d9e522a616df5e553abe9ce807de1d7fe6e2e9687adce64277c806cc341b32ee98269c0725ab39d068d6718a8f09787f55b7d4795f13fb684eb15bb31c477afb6d95a55962c871d7f6ed9e89a0d9e695c162865768f1e0f88705797,
+CIPHERTEXT1 = 5de80cbfebdf0ea504b89214ab92105023704a39730f0552677d98ac4c90cc3d8270d11112d439da58cdea3900a2f181a9224e34eec9651d72e25ae17fe564702f3cae9bffbe3808bb753c4f95edfb293b09b42c5b78e8f0bf1d164bf66495116cf5605ebfacda660e49f07371dccf2a178e64abd2580daada68cb1591ab983af6e1be4d87d40714f05b01d9dd1a872eaaa428b3282668369dba032b4b29abad93e0417cb4aeb25f7e21390b9d1cae3ee8dc0dce6a5783b2a8cc5d8cbec6e04ae70614c7551ff1654b523f721fb479682ec5f98dba42fede2fdeabf35133c47d02f7316de6b6a3a6d184cfd04f9ebabe86a6de8157b17428cb8f3a22754e4364d6631dce2bb4e4fbb05afea98480a898318955390d9be6e8cebe3b9cb92d5ecc9e72e87190a25f821deaf85981fa3376009565ade9fd756cba6ef946952930cd6bb0df0a8c9ca7af1493a42aa7def3caa992accd320aac9ddd183a153d9ad42e8189d58933bee6e32d6437d0b3dae14f78a474f9ee26f3d5282d958b8bf3a43911e22aa538c1496f22a6aa1315ee9a4d212b662e9efd8353c7d3438ef9f0cc3812b14d6fdfd6c95323ee0dfd45ce1deb9b1610dcde7b75dd74f1f1ccda8a84233a4ffa1d7f59aa5e45b719e7090ad57b579475edff7b9e0cac03bc6b4b49048ce6706c3136a774a955307dd2b1743aff967f60368622962902e96173b8ac6105,
+CIPHERTEXT2 = 495d28464af7829f00c6fb11bf4ae3c5de1b29c68a517bf4a47184f45994a3850d121b56e6686f96334eed446264d55716ae112757a9a429537fd138b4ead109047945fc08fe05870086a33c62b0bd68da7b21ec7b1a893162a3339a2a265641a50277f6f4ecf3146df86a83383524d254a9a7be0afa1566275289ba789f1638608630756068065632da8796ce75a466dbb21b51c19aea59e9a92218eecd222e8735994e29756a8b4b9ec9c780a524e9520af4a6295855ff67145c65265491d01bd3e3356ed2e6e47b7fcef0ff8fb791b988366fc5f8cbd40129704319de5e197ea795770ba141c45ec2e9cde62eeaec07fb492a59abfb52beabebe81a38b8c8b734fb4ae546511a20eadf613e0700a82b9528e00e505d5fcf2b57f4757edd67486c13cbbd5b1a4d50a7ff6c1489fd10f2dafc52eac67faa3f522615ba66d1936385fbd0560f84ae5438a43485b7e3d4546c732acae6d76fc903886c1526eaea39ffb9844441f4a8ac3d44191d7a3c66557d7187ad1c2f0bfc99aa4ca157b6b2016ea95d04c4d77eb52fbdb290381cf3a3bfb6c2ce58c640060ecc9cd4e253e2978254be984d079e42cdd65f89a595f75bf9737014b4dfa3125b6eb2487080be61849efb4c7956cae66fbd76658f4132871308c6bcaaef3bc32c0a0bc1abb5a85859dd4b1f42e4b044aecd747c63fcab45e0f394f6bbc42b124c7634a9ff0019,
+CIPHERTEXT = 098960bf8e90d72f2926eb89e2c8e4616d33764744d997dc96acf24e73754b20263092550b9f73fc16d5f9f82ec88da90cf301600a60bd96adb1c240c0c0f2d242e685516bb14b74d0c3060ca191253dd115115ab32a7c5de54412a482cb664170a6c9428c75b053558cbf50fb3342d40de8474fd9e983e56b5bb7962f41fad6fa73f716826e92534fd8462ea63bf451b1116afbec58052ab90aa59fc7529434e304d7766b56b8c63c543e464d447aaef233f3f22245230439ce0f5e1a12b1d258a0e407d8fc3113631b435d9bea20814efe29c3a9908b6859b07d8d7ec37273318a9eb59916017a77370c338f97060db18c459506f7919b48c9a9b434ecf66e9490401a1430b3e3efeb4da0fd02cdf9661f37be1473fd2631407aa981ca6ceab26612fc48c025a11d3d57e6dfbd5fd88e7a315b063f7199cbc42edc2e13162389125b4836ab6d9b0cfb0ecf018da0791983ff6cac8bafcaadf68871bf7cf55bd6d48c8a0c3a3412450ac99df37a503b6640621c73e6ab78c2c2cd66adabba16ada3208f19304bc9bed2c038b95eac91dc190534b1acee3ef81ff409e88fbc467cb1a894081b8c9463e62051188200d0c91ece431292cd3747286e9b0d7ead6230bd19cf3643c23650ef67311dad80a4136ed80c0e467185fd04b17b0fa0939d450a9b9a7a0ea28ddc30753b71e032e64c2ae4eba59fe5f4951f0c6361db6858,
+RESULT = 0,
+
+TEST = 86,
+N = ca7aba6bd023a8b4d9167dfcdab8d4b4a2fa75123d732cb607ef89ee961cc7cf4ffe800dfac328778ed387074fe0f6f4b3f990a6a3dd32696f8a41158245d404020e70d0b9028dcd6eaaae30d8d8c34263324bb3c203bd5466384e79a3a623870750e187ec1a99ba8d81d5debf853a47d158111ef60c82e4496c46b55d8eff7d0f063f246025d6b65eac7abfa3c9e85e4bb85e49e02d472a176331de35849f2ceb952fc8b0863b8ce1a805845835684fa0574775e4bf99d39eef45820016b0da8450a4bf3f4b23bb1b6a088d8d7a5017ff5bf58ca4610d9fa275d467539aad7f018865e1aec43aaad996176fe4e3d816a5215da4a30d5a3e1a642434f1788551,
+CIPHERTEXT1 = 4bdab8e3ae9fd464b30fa72ddfde1c50e56585a54331ab849ad7580ebb7abe9e6ab93ffb24d441791580cf95fb3b5af418a65859dbf2fa193a83fc34a4448139370c08a6cf1f00237bd66499f18d9fa54e9aaa79e82f575032fd7f328e47d0029709227f2df9d9b87f7b583eb3f9766a5cf5c71212fbbb0cc669585b055166b3886d6ce28f2422931d499d2e4b8ab1ce4c279e843b808d3d3fe945256d1dcada03433a5d3ec4fd8a50749ad1b7e6008a07138ecca585eb8d2f4060f4f38577c6e09b5a834f8da6e683016fdff94272e18b7e2e422aeb43c67db77883fbe2954ce80e1dd3ab19e96bfd8dfead95c736bb6d1a9ea26670002a76107d7df2c4e599396bc04145c8f2a5a4885a977541342e39138a5ab4ef56de49f28ac4af69270388e50fcb03954868ffd2f6a9c7f1e7892d2465657081f553f82af1cb6406724ae65e46a507e65fb4219598ec889df54de921c9753884b0a3b6f1326c4dbe4e4860577823596bfac36e74bd6181245790fa84c12b1cc8c611ced19cbce99fcfdefe27ca673e50b0f693f0a7cec0991a714e920bfc6f43c4b01a74d43e0dac146d49ab0a497af0f7574bd2355d30f6e3eae57ee3d6ebe1c981a4926b5b2072f51b712a87824889d85ea20ae899e4518338797a7df020b728fda45a41c1c4ebe9a066640bbe9747d02f7cd12df22d0027b0195be8c6f67371367a8ddf76a15b4d01,
+CIPHERTEXT2 = 0290efef3c9535d94765875becd81fbd5792dadef4662103068ebd087eaeb276d8e031c661ff9633ec931f9107a530308a6c14766dee6a9c73595b955c93d7791be2e21f9003220f91026f24c075dc24a18035754f91c2e2d9c8ccb3cc42a6cf484b3a88b65d80696509562fd2cf5c8c8c9c8e0b58226c37e865eb17860e2360154aca67d445c9ac66cbcd0fb71e274908e02929884f248b2521a95006b2de6a0ccc4975d0896418e39270223306ecb2540c9b6772f2132ff791927fff3fbdfe1a7ffd1c8dd07a90b12682e89f9a5e201a4c5bf6a1df0e547a9b6880ded8bef769c2bf4b4c9652c025f093d7d129ff60f794f8d676c68bf4a5fb5ac672a05ac4f58301aa56891cc9fc69006fbc7b40b762ca02f0a15f6661e0b738b4338d3d7029fda4ae6d2a931744aa5a0568835735f311c5f9bf0556e562e89c904c911697bfd5f5882c10d7d1f714b81776f826d30b2b6fa87a49c4cc37e44e57dd06b62cda5dbc97fb099762196a1f81715b379c620f85f2c3cadc9a6dabb293853eb00b193ba3f855b508e39d75b7988f29ae90fc2465ed8ad79a698eaa6c85fb911149dafe74eed03a2b075ac1b9b350891f5408e589050d91537ba1d160a4855e5e04499f7a880d3ccc37e786b72c2624141132b5553ec2fafa4998e38483066d1d4b809a02ee4a3030571f007cf34bcb7af4e78c5d10c2b8556174935e15dc12745c,
+CIPHERTEXT = 6f7f0e4f74b7bf9d2c69b10bc72a9e085778133c66d486bda9fd04b627e24c95777624fda559c6837481ce6009b138d7e4243df1389a2e5a7ccd1e9e697b2089212787befab7069e09e0af31db8ef7d3747afe311b4a773452d236b988737a9e29213c4b909023270a95c8e558a6e63de2c411cfe6ac1a2cfed8e8da3a30122d172dbcaf212afa616b3b81a8fb1dee2b25d6d732efa94e2ecbdbab636dbbd26e73a5aad3e8bca572710221964848a7619f9ad94292da14d49ea70a9bbe6ea44568ff174084fa68daa3bedfa763f31a1dae1ce95cd4c1b3236d38a8b4c51cba1b5209c9ff46a9982c095ba7c3e3d2a94c46b9c7773e97dfd04759d18f0aafdfb0be4f6755c7baa4632f98692f4e44ee2485db141d1ed6ae6484d999ef9e1e175b5d377267ebb38f540713c3f3c14a9aa130a540690e456edaf3ffeebce77c792fc0a63bbc4ca5ec139bac8f746a35b5409c82242afa0552a044a679363885b52bd14e6691799acc7b84647c3c91d515469fce1f12a2a5feeecd6bf7c85cfddca0042eaf1bef461749d31fb8458a0fb5f7d653888114bf6f2c19cc8f9ceadf21b210e0d1b7f5fa9156bc4a8ec13dc22dccd613eb07fc01c2a8468fde79074ff03e168def477a7e2a52193abe78add5bf6938ed7de468c5251f5cac9785c0780b6db74252cd7ecde79360c5941eca8b995a623699aaf949024662fc52f889627cfc,
+RESULT = 0,
+
+TEST = 87,
+N = bb7cb3e93a6fd4d637d3f3556105885c2926b9c0d6442919aeb46463ae10db474e8981e5ce1cb745ee0f8fd77d139605bdd6cc1247b62e4b24e4f40c909b675532f3de2fc254870605bbf23c3d44647bfe1476b75bae126a9028cb6379fcdc868bdf27aa09c2dcc03845dd4c90b6cb2de861504a6c4cc341a9a5663fc1863a1fb26f25f7bd209c3e4a8baf7627136ddef1a81852748356c58f3c52e776cee6c4857af538ae8555283b6e5bd832761256e0a847190c6669394742df4111af929202746f9465758de8bace8eca88828f022f4267c8fc0ea81a6e6f16dda7eadd7f17787b505dbc8427648e4a5d5b5e2276c5124c5881d51de1aeb628485c9d3865,
+CIPHERTEXT1 = 28ee3fa05378858248edb214ff9133bf6767adf7df0a0c3dd370466fc94dc5d6018e7fb76e4dc8a8f0867fc7c34992c6353c9088e92518cea7232e242941df43b49536a5ae393291534e304c168396079543f38b9e4e02868cdf0903d4e6fb8c67855bd4e70a388b99fdf3a7c6ca5fe69e2eeb18e58ad527dd2188d89ae2c446d9dd358966685e0a075871b4bb98d8f4c11961ea28f00075b36f1281b29cf5f5afc30739215d15e6dde56bb7cbbbf8593c463b44c465277252676fa4d013eb12b40e73b8834c232ce34e36e57c7f9edfb3e485e7207c2eb76b02b792cad72fa99f6a6bbc4d64c287d42e61b9bea6a1c38bf025746c39dc150eb458772e4fd61f930d6ebde5740a73f65c5ecf0ec680d81b0da7dc53b1ea9358498f13e837e973fd2350fa8501edf74c0134d2c27f532fc48358287888765636b835a15c135eeb21187958fa4f0e1fe5182ab37c005f47138a0a914bac9a8c422bc013d8eb63c1289f66fe086404f2b66372df67397a747fb3a685e225903e67d77e633ad6a27863878e7d007afa6da8c05c3d2a7dad2a913f829d7197c6f345d6518b7bc35fea0bd676498d5a9d5887445204a652a648d66c7415f9e41f009d1f4232e18493207534fd21682a3855d6e013c32bc8cdce84bb36d162ed790b325dcc53a2319baf02748efeb5e0d7e02fa1bca5d5ac1f5f73c64787e1eeb74d2e6beb41704abefd,
+CIPHERTEXT2 = 548002623e3c6f91afa2bfa915c6f6fd06919ff64a55f636b4d26e918f05af929c1554cdfb0d729eb759109d00d702df3d7d003d69446bb68529c1bec077d9b6b21757f69dbc7f47b5a45dde18b74bc6a84980c152f4bf09a28dad57e94c1ac6844340dd8ff9c254cf2da0311f102fc4e92ec9aa34c4ffb0c2f1f16c28debd43a36342e1b4a00a641a3f4b89af7a41a18872a529c24200940ba96b3e102c498d0834dd61ee5bf480f2e0ca6a0284c89c67b25c0ef44d4b28ae77f87af65dd0d364a0037f5f879b24501d7199e04bc79129d41d571e5180d6cdb353bf2fd1ce21e3a716c9b6b0c154728eb6aea92e93c663c40c6bfa3a563baf6584e565d086dd72feeae790789fccbf8fc3b718a5e5de592a4820c0310470852b069865f468f8762384ac469798da2a496a8fdc7ce778279595804a83b964742161802ed52504810f4a271e8512258fff4d4588abb0e8d8007bc514a26bb3b045bb9e6f375fed7bcb2eaca782827d5d0687ef802fc443df55260dc1327540643049b1b010283770c80e3454a4a097bd481c9552588860b78b88ab72c2b80337f340ead2246d94ad2fa683affc8297075e7b147f818ea23b5d84e4c8f4f51b30d796813ef7003389ebbfbc6961e2d119345bda93b5d43f2e524c1aed375e86fc319e503b2e6a4f99f8a994ef032a3067ea383be56e2258afa441cf8127dd43e5463a05bab71677,
+CIPHERTEXT = 0fe139238b69d0a66718df87aca513295e5bb42763080ce3c3de3d2d125217442e403cc1610e9910bb3ac8802cc90fed05e1ef1732f6bd0f6ec5536413ca0f6083a28bec34a15fbd20232d6c90085a18f68e1e54f35f3cd49e7941aa9d98917db313b6607a12cbdcdf45e8180bea68e56560e6f31321355ae701109eb95059473b9e0ed1e3d52be984ec757e4371397045817388d6947ba1e9a57586f2efc9aa17dd7538fef01cc24eb76ef32fe45e38c0a3d23a89b95cb03b66b26283e7c13b42cd1ed5f801801a56330331276fc790c8c6d85b8799b8103b96861349a29e365b899f9988bfef6b688c98abf53252d7e2816c709f46067b342a4334f252391ac99027019574ac697e9c289f6241eaaa71d430a731e9e31f292a6c0e4f64acdbd1b73cdc2cba1bf4a26b0a886882826050014bb89f8c9806283d3a44ce372a2d50696ac03a36fb340f5f3d882fa19f5dfd23f6c20ff0288e8eb8afd2529cb25354630ea9fd6955d2c8e5a92e6f8294b217df6147d1d5b9059ffee888126de066ce0d19edee69ebbc632743b115d3f7fe1b2736721a59137e1fd98b0f4ed30e31e7a13f7b5268f9b6f43c6bc3f77edda8706faae3a48149eefa41dd9b57d06b4cb67f94f75f1d3cef35a7abdc9d2e673138d74445921f8c0e833c6ab7b804ec0724a55496a56abfc42dbaec3785e798ad654bf8785ba7a33dfc9c463dcb0c38ae,
+RESULT = 0,
+
+TEST = 88,
+N = e2c95cc22626f7bd01aea1a31885899895a7791e9ed50adf439db18558e3d07f441eaa5b137f7d3bf51e818e8ea20f204c25223e8d0e35f7a43ba833e845ba3049f10f0de9d235e7af48b08d0e219cf8301c3aba0b9cb99d7b9966b42c25001e2b4eede0f35eea2c44bb8ac12c2f0da83decfd3fb395a401183955a5de17dbe7c1e9a0aed0835258fc6819fca567a5ab7dc761d5cd809152421cab3a5291c5d9cdb2c84035d5b4fe882d9909395dbcc809f697fe23dccdf43001e4bef7a9fef0f2b5fe8fc04dc03fd61010fb016d835200747a1a671f3eb3940f5c8d62349bafd7aba85ae7ee590d1ef6e89335e09e02ab5610acb02a17dfce2cfb04cde4f991,
+CIPHERTEXT1 = 03c847d7d66f594d2ae6a2374e7d29cc04fc0ad892b15223cc8d61fe16e2ea4d80d5238e99eba7e47d75ba5047817ef7910ec37ea79b3ca84d17d85f1ca6cb243ccf25d6f644d03fafc2b440a0477906c31074a71e0abed75c5ea18477e38012ea5a4c79f19bc828dfa7c1dd3c1e9a89ff8b6ca9eda0aeadf8d3cec0b40a012c98adf243be36de752d083f176def2c8adefe7bdff5e10c6d444d520de4d07264862ef38b0ad73d60ef110faedee9fb69089532818d3dfd9677b35fe78fd7731c89cafd8ad5746f8633aa228529bef345abd983dfde8d1f1148f76a439c30494e62bec93646ee57b86b9779228f78624fafcb4ad19fe240c5867d7805dd80d7b0a679cc5308d94a9a1e4a67dc95c1924ad28748cc56708db95ca28e3bf8c393936abbb924885aff2b77582dc6355de7e87554a71a3eabf4b57f0f1e041dbe90287f2ee61773e26a79ab8e3e58ce9fc74f998915cb32d9475ca7decd7f4767077511c6501ffb101e44986c197970332a239d795d1cd1dde3f64c01ac5a0965394930f272a0470ccba5fc64a4a7144d7c6e6176e0d33af5bece3f63a1690c7d7874d7d736113330e6ee8e2433a1be9bbdadaa1c2296635f83e29809e467499f52e621acac9b1253737dd9d1f93e938c482dd12cc5b8681b6a9c4dfb029f4caff802c19b17d7f64e584ee5d37a972ee7fe729614dd5faa49aa97acce4ba244020f96,
+CIPHERTEXT2 = 8b444f5a8a182de589da35a00344739e0a715338c31b1df190f9306fdd9f4c205101136f6efb0394229e13efb3f9ad55072587463e1f16f0500af3fc5443836f5423fb8e738bf8cfb55be3a5c341e47f42267dca6e26d014ddbd86be5879efe7b11f2aef6f13d9c74ac32503b0d216399b1f91964f67bb1fd941db73eac9a08222daaece62cf390726b8874663e4f3cb6ef72a08b3dbb57c887910057bae00fc4c2ddb62c88dd3b7a0a8789c4b57ed5ad5a2a9d66f74d28b3026ec6cab102efa4ea365d7816f3906696369dbaaf10d5e20327d21e85455c9131ee2391149444b0ebb9d85fea1f5382177e99938a650ff63d6efdc99a14c24484180410d89145ff3dfd115301768583f63363eaf07fe243839964468e517339832a429678bd5950578f51e90e5f4658b0f56d43cddeb5f8a4f45d828713f76a7a2d4e2b1436a060404b5f92b67b63d52fbb4aba4f0c0bcc3ae212450d9b856d5275b5aa8bf766eb1c4b9ce442e2dd1abd340721da5cc21f6d55d208cb264c4cca4e96a67a3d007ab695f6a9de2b8ea83b059e4473961ff5d1e39ff2747ca214f8d8b24b6b03320a159ea6b5baf13f18e57fc02dfb07a1c8168a1f08d776937f57f6001ff564405fda730f2c61189ee51174e7f59b1c4a890753408d3087e60622c9a196bf5943ee21334327d4eb5c9ba6681722671a32f54b266debd7500987d530691d38257c1,
+CIPHERTEXT = 78cb83d67b1263d7fcff6d4e51ea68fab0fe7662cf7b90ff5b066b8f3c141430b530d137328c44cb4f07f68bbdd04d5be1993f95a45911318c81638438b0a81f61483984d75eee94f9c485dd3c4446707a0f8de3c16f5da7e3f8e436c0e81dc56e013a8e85e15716686a723f778abe17dee9a148526a4bed71a164973f2fe25e4ba47c408e653e5376a85a16f3115d258411c2f2d64439af62ef711dee346f982489b5a035714ae1c138b85e85605341053f76ed5475b6a8dfd67b5e63c59a0f5d59e11fe50fb0e02bfa89aed2b7b8c07ec6e06a96566e97e0a7c96dce81b20adcbec505565e3b11ce8583c28eab56cd49f0dab5eb1483d2bc9f26f8828c9b89f02e844b3179157b974943ab7e3d6b87b5b91af3d0c016f035af5dda2cdba31cb5dd1b6498bedf0e56e34974b38b649294b01a4bfa60cf03b5371ce5107dc810792ff34dcace8f9a41bd9fff1eda38beb1f3d95d5cf237700bd3f4384b058f1ff0818e0df81e9ed5ed873f7a85729f656c10a828c48a5c338dbb402e971f87ac0604f5c5c10c7c77d4e9c46905c5db29e89311b522bda0847ff23754ef2a70348469203b837ba4d2923c20cd90cddf4023074440f3545686b4f41cdf316f367d7c39f5273f67c3610671c88b0b79e51ba2a6a5732fcf9041cdb9880bd1909a5d01eacb966ecb68946cc0d2341c7783781cd2d6edfe23c35ebfe5aeff87f86f77,
+RESULT = 0,
+
+TEST = 89,
+N = 98165c0d492877e67c0e77a3b0906135150addb733fd408f6318364928944430ba7bcc710cf46e72d9841b0d8714780b3a36d95aa7fc60cc267e1ff21a7639fb18eb26e8c7c4dce83e01ae809e5ebb5e5de6f0b6653504b753e9263253f87c06c1ea0e9022069c43d5405aba800acebc5f63c856a190d1453b6d573c69a12756e8f5f16e6a044c6836daf9360cd3f05337baba88cd80569e21acd0ee7862132183fb62de0b75ca1db7cd9757f6fad4dd5c3fcbe3f6ac29b032f9fc646a15168e59240237e67f8d05bb785e532aeed34f96bd802bd362d462da8b8cc429e847f4a97ede2dd663717d19f7559c39a180fd898bf13cc982ca14c8b46c4d24a37d3b,
+CIPHERTEXT1 = 312ca1930814445abab81af131e9d495b36d76b7c656cd5401fc97576b696736f34a55d3bb1a613aea25c57c096e144e38b1fd1dac96549b5e3e6380b079ef60eb6178c6d02758b9221956f16e2fa18f50e9fb6820c0a29c929d3787ed8a8ee8c741cef41d5b4d9f5200f7ab072df272b58872623fa0738389b5abf7a60b6d4e12038bef5040d432c5fa3c241129d1930064f18ba8d246a91456e93c67099dd54ff75339a4402dba0634114c836cc9d90721837bbf82c4d0c9f7523fe5fdea31c0088bfd2aa6cf07cc0ae8247a4c5fc8dbad43341d4daed06752772d065c5f60aaed3c9d65041ddd34fdbe44b3e856e765525be9280db2f10d8fed5da538784db483b2b725abe0818d1c86c0be00a3f02b8bc37b59832fcbec9f06124162df630dbd9aec75d89682b85c3440acd8d4eca184dfbdfb76af70c1cc0879ca807e33b6443294d81c9ce2bfa8a96f2b586d18ec6bfb5b5484d8707915e92ec30035ab0332644ee550ccecb7c30e7c1c2ef18e4f359c2a221bd5fb1a910b8fe7629b78ad56b998922a76196317fa7afde895ae27dd1043a61d9151b248845cd2b53a847bdfa8ceee3ec77c43f97231f2c35558506baeab8ed5c2f37c239a1cfbd75f6c4115fd6cc81dbdd9af148f28f044d433fcf0761d8ab17861880b10d6da20ae32557fa51c8590c8f63369e674941f658cc52962051c04b0b0eea1d8cccded2ae2,
+CIPHERTEXT2 = 1fc27fd172386fa4697ef48912425bee038e991fcd4813b2e29f8f1a37c2dc282068a75832de639ed7c560ff978fe8a5aabe4301f4a0eb12f8a058ef6f4a7b81b2f1b7befb6f152848d2930abda1df0abbda670a99da3388121b6123cbd4d65141a91bc7877271b7c0e025beaba69b3b7dba221ed5ff33818b675a312e11b60bb79783a1fd7bb9b73741cb52b7fbeab98467776a817d767095396d948764cb43d06257c311fddfbe60d8371f08453703b1c326f4f614d78baf2aa6806075f0644ff0fa1bd613958d6f07176ee1e16ea79708940f6d9ca14061ee843a1b81a7abdc168e21760a0cc967e9c66a7aedf73974a6f2aa4ce03eee3c726c4e708815c547c8972d514e934c0531a3dc328cbc4d511c730e15a155fc9f3df450bb6f2b451a4b17123016b13e3c579c246f03af756735cc15f5c751a32d8215cdfbcdae008a3169d75e0ffaf4bcd685170af4ccfa0740f9bb8d0b426d2bac1be8a8c8ec0a9ae0580f6ce7bab50316ea98b42acfd05ba366e163db38e9fa27463adc111f5296a69b5fbbb99ba3b81897b46da4daace29fdc1db4f71a6047719387dd08ed3ec0fe37a26ac0313abdfeeb12fcf121eca99f3c5b1959f5e7559d0349c2317fe778bd6afbac11712f088dadcdf698e8f0b947c64f484f035a1eb30ce170b499c89490f4a1894727e1392e4689ca0af561b8b4384e29c0f3e2422425f3ae303670,
+CIPHERTEXT = 4a16660cd15208b7cd9a6f5e48a26e9a5a11613ff860ee87ce1e790b4c49b914934fd197f730ba8e24b96436b5a89f649f1cebcbde7deb8f2db2ea1662751b3429e4f57d75937ee67706e2fd51ededbd334eadb7127b0b23b0103d154314d27bc217a328bd51cdcfc9349c0ecba18dacdad8525285f0853ed1d1c033dbf4bda1bea100843c7efeee029387587ba1368489d07957a8341e7ff8c4db81a78b1e926f3b20a8171133359aa08ddc6d7bac332e18b93f559e794d2950135f7f1c447cd1a321a2e31b8b975bef21e89226c751d4e355a4f9c087bf90b6f09746af95ee9f486c3b7147e23befb094f785979e916761d11db91f8c52100e538cf40fea9f661251af92045274e4d633128865541d88331359cc59edfc07b516f4c891fe7c8ba99f3b4174df81376c106c0cce217d915c4982704c19871a2ae916561efcc02c204ba816b982ea2e071d41f6e788d5d8d961c3a7bc45fe1e4ccf1a0e8dcf405bf79d723f37475095d793e60330500144e53e4bee22709efd08cdf5b10a44ce61860bd271b463f547f2c58e49a8f7d1bd1d8a180d86fe7eaa801afd8651e0626b94b74066e343c688aba245542199b3712b3312e989836fce1366d6fefc43e11c846b6e9fa619b90ac7ffb277a6d6b61ad7e5eb16b1a9a09853bc2219622d2c3bce591e2482ce427a3c782c761fe2338d406b24635b8fc1ca6cc90bb1826246,
+RESULT = 0,
+
+TEST = 90,
+N = a83f02f2f92c41e48586904a53f3cf2d2f9b9fbadb4035539144dd42dbce3b862a59424c419befafc51b56a11147fe8de96ac8f832a1101df50495f9643afe47a85c26182fb13b44c091cb8ec212ce6f38a07c00ccc7520bc27609b75edbd6297d03675f16ae1c5aea6da160e7aed83b2471b2c4e250648151341855e19cc0d024e03b3a4cdd5d9140a580e76f7acbde9ac09985f6cc07047299b36e8c4e322af7b2687dfb5d4ec1ccbd0938a71c485b94293113634ee40b61d893dc213fb2337575bbb3a04e430108c87c90a07792311cabf92fc6d2635b5d76ceacd08c78915046ff63823d6a70abed27be2bda4906ddb97953707baeb5c4aad5d600fbef43,
+CIPHERTEXT1 = 628e6a8b8ca15e43a7bccf7fec360a6dda7e907d745484f4f6258d95873fc8a1116b8ddd10d064dbd337a93fcb4848b9be830fcc81cf36140e2b90d5994c97203372ab3221104dce93684525d67b9ce7ce34eb74d0b0bee0409d349cf3cdb99f9bd941b4d02364339fa52e1d496d7436b44bc9a984036445e1898f5922ae83c278955a488d4c3d13a8716c590a56962fdc9373ad3e66b32416b2a154b054d170dd6d34149dccc0011d2b07add5cc93bca538717179a86d3e33c35ee36149e9c97b198b39844d0a16e7204c3b4e27e68c5e4b442a8e30130bc369324c5a86bdeced409ac667f754d449f2ff8e2c4be14ec7ad44f3cb862b932aba6b7c5c752cc656b83d918387768bee9321b0353dc94f3cdaecf4e60de3addbaa2f12b5183f794b3bbfe86788238dc5c70be592c15263ac8bf940d64b483e04f47903c561d1822024f05829163a21bd068354dd643202a5efd25b3b565269eeeae7a534bb579379e3e2595d3953c93a9e65d8fd92ac479ede79d3d9391d377be5f2521bf9d3e0a428e60ffd7fda7eaeee3da55e579cf1caff1b4ebf1117f0509ddadcc9cd8e76ec3ae2cc4655eea123c7c6b1c21fed54a94223487f3b2236e90e010206cade0bb974dee1b304b0a0f6fbc4fce2612a4ecf864b6d8ae2b1165efb41c05be49bc8d9fc5618b4946125e7490b97806bdae58ef7e4d74c1d35ef66a705dd2c3eac77,
+CIPHERTEXT2 = 53b6aa7a247b561136723855ae91ce230dced27e74e7869e1a77ea5e5ae4ca5fc9f8c0df414ca4fb733f66776e5dee28b1c14ac429bcdb5999827df2dfb7edf8fe06035720dacff41a9a0d9afb152efd6f63f53d4dfbc921c851b06d0854d2427d1007f0b136715221f28db26c71b143f0b8d60a5280e7afdcfce0dac7371cba2bbf4c6fd65bf7a0169299a5f9e646eb27a698ccae03162e66ab89823217135c22950f5214fcb897ae0afaecb237ad98f26ec083ec4684664cfed4bd0260fc0825da69b7daa050afd98a1033cb7794b19ab2581aa6d30a8421a8b0256c2048dead5efb5f8f0fedf62174d8228675a656586834032e16305bcd27b8ae61279c361412970bcbdfb3dbdda5f89cd1a54bcc4e908a266dac680a193b44dba5f747dc9a304721309417fef6116369bbe1c6f8aacb0bf49821132a4d00e563fa88ccbd9bdba36059c9decba17a6713e4cb7a446e46176b8fce7cdabe9a082f254dc1edea527439acc9af89642768a95dc4dca443ad228b2946917e33659d48df6d90ce68f4f505a843d6324426d516e310a73f554cd6062b736d321a9f6d58f883de23d1afc47cd684ca002d72d27d382b154d9e92235f797e787246c266d694ef5c96a17cb5ba0c6663575f664759b10a58117c8271cefda9b4be9d0c0761ffadb5c6fcdb68f66e469fa69e34a1afb9505716c043466f857a335f87c305e8ccea6bb6,
+CIPHERTEXT = 2ab57eedb5b002cee20e6ca1a53fc8a301bbc5f79e7a6dcbb4bb2efb1e1448f04be96d91dde816483fca01500e6a4b9d1c10a8e451f6a3f267f0902554e87d5c0801f451912f41dc6fbe99080ee713afb91750e43a7c169fd8b41fefd3443d19a180f3f6394408954560fde5a6de37cff71c2776e6a57caccd5a34476c9c2dfe42dc13bb442a4c3b4ddeed32a05d711f676550a55ef1b5091c66e3614e1563145bdc8337261909af23795241920dedf62a19294e7d3aa7e4213a71c6c4b1a3c38be83d87081655955e7fce075a00a28853ce43871212e042998a8d22831b18905d12ff9307c86497410760178cadba01697c8e523ecf1154f47ce3df087569d471fddd3c644d6e034cbeb029cb26b76885594735ac84bfc24ae49dd8defe5c9b4cd54dd68f5b0ae52a72b48d8344f4ed49e45137ea12a1a11a9b81a7891aa27bc29d1b58eecae9663974e743398b8376b54eba39325b7592286c053286cb3151424ea0c15b158d763a9bddd4232d966b3c8fe0c94f995d09a43840ed05dd28feb6f166ca809f09598277b21e46c3791a2b5500d188ce69d92ddcce9c690931c0ce0bf20ed0bb9e7983c5a770641f87e911a2cf36e1011908c0c217061955da03ab9459a7f830da09b5d5c73d5dcbf77fa42a2e5d6a1bc85f9dbabea7e9a58ef22f60d99dc1888daa98f6e5479110edb32875c4e704d4d5df3018fa954519afa5,
+RESULT = 0,
+
+TEST = 91,
+N = d1379633234635a1444a6b70b66413836ae9e1a65041e79e612c922325788c64a44bb73e4dda611ab080b8f157e919beed7daec83a6897111f483e5bf1cc073e1e78d8b382a73aa88abd83a0fa3146baefd7e0916b79219a589444a814ea380f73c92add327673ae987d7fc2fb4a43912692e6bf093a72ce78a345ee19e435d10dff50d84263b120c37c5dcca5232636c71df46eed21f09cf7acf8b69a7f7a795289980a1f7c90e806d8fe372a9816074d41fe67ce0ff59e04f591007e2769bf3c5d9a8c78915314eb25552604ae7df079e15e4822c756280ce4a3ba04cc544552782a13d3578a3c00518f6d257ec6d87eab2c628e5e705eee7e415df00a71a7,
+CIPHERTEXT1 = 72a0e77a3e220efd6d00e88be6a5736f337a89037adbce2c3284607d1b760ea36836f7dd0b5b65ee8576298b6e28f506daa82aa5a00baee316add090a757b585810672b0e00371ebe13381218fc3cf5f6d762ee216f679acad2a5e89551a3e08f5812a6e75cc1451932e18a18dced1335bc93fe441ccf196722ec52055d137d9a37fbbd6d60dd371230f0b7fbda92a87f064be8a205d9214e43ac4e54592f1c49acb33eb26deac6d4a7fb6c03a1d2f2f3cd3e21c503219ad834ba22ecbac66185d913408756034d85bf8420ced99c9976bbb5d8a08f71331a484441cc44746e1bf7ce02fd9c56fd5769552d4198d2115fd8186ec0d0bf1abacd303996cee3a5ef1ecbbde3b01e42df66936d4df7082f50cd79bfc10f0187e1585ec3b7322628efc6a880f399deaceccbb0fe334d6f288794d9dcf28fb981eae0d6c52032861219f52b7b049754bfea264ed4485ba4866e301ec0e9bbb93834b8aa5a0732685464451225b413f9b2d90dcf52eb46aab41fd970544ea3a14a8d3c916a801e9ebb597ca53b2d7c09128187a0db7da347ad880fa2d78195210175b5b1c6a54a38c8b3fe87ac88a63da5e18c71d47115b7a50d6787aac3517ee7dc4fe4bb08ea1cfd2f66d23e461c6d58307a5802e8d604282f902b9d465c13aefc8745cdf7212cd51d47da8b224283351ab9a71bdce0905854548279caeabd86c13f23c25279e48d3,
+CIPHERTEXT2 = 88477630eb97da1f85d6f4a474f68f37353724be9fb43db68abaa4e0579096f5da5b3e270d7fdf4dde3c16bd11ad9376af39c470ada06c897ecfb3451437d27c4901642790802f72cf886afa617033cf1ed612bfef1ec1b31df1bda08cd518353db6fc1e7cb8e5956292ca7d7b2c8f9799a8d44741794757cfb2d0bd78213507bfb5af2f919e7c1691bbbc298711c72a49d04370e43c805d8112f8d1ebe2d1f3374c50534bd0520f2bde8a69dd98148615f6b0e409dd3af013d856e007fbb2705c856e325cda3ca4119d55680e43095e24d0d1df84ca54e581c549f0754c6de5f4ed54be9c2d4c8bb041ebadf3c6b012b7733faacc9acb72dbe4ec53e8e17c732579d6d04d13213488f0b6c3fd98b76f166cec5dc347206babb4340c7c1ea6ec54047a91dbe20ab66ffbe1628ff5d9e637385fbe90945a58ef388dc9b2d88e783c4ce82d6d89c7507603713991016a5605197469ee441070b7b52d87eddc9a1abda91e96fa00b1e192e8f3f33696a9bd934b879723fb521880a082a04dc15e15bdc403785ad9d1acbc1168a4220f2a6e928ad680bc781c7440dfe0b35bcfb7d8512489bf586529747a54e5eee0c9dd539ca6d37bd9d61cea57479a8196661aba59e3fbf490ac4a1f5ac3f508a744b37e122933f195bdbb8be3647374982d6d0436c2d53361990c938c5d8cfdec95e2a4898b33e6fc86f83597d5802e663b33e4,
+CIPHERTEXT = 0cb972f3de67e571e17073361e00d99dbfe215ec749fa8a6e7065037339f68aa5c579afb0fa09a1f3ccd9844d5fcb2ae5b2aa4a8aa5543af9bfec6a4f6ebfe530227562de8a730455ea2370e5023a1163ffc85abe06c32b5661ded3dec49068485f4b050c7312dc4285227e3e6cd99c01b2dd308fa1b75a46738641043265c1d210197aae61c0517d8021c6f72121f75fdf4f252c71bf1e6c58ae5eaad52af5645923d2a6e9cab6a0f45bc3d37a6dfa04e80c3261549834a4bb7fe64b9c59761ee645541ab1eaeb6794446b5e7ab11254bc308661ce412f71114a2a7d6d02535f580e8a498bad40b79307c104d83cee9efce9358a5caadc02ffb77c43377222ffb47e72cb02bd00cef86767e5f8026dcb834ec0df86ad60a0501fa57ede3d6b1a3481fc22bc9d697eb4fc58da9c06e2744bff324944fce20b353037773b865315783891c6e581f0e71169fdc3653fe5e3663b7c4dc89ab6c74cacf78518a8e498332f5406e61d9d69d69fdf9b5b1afcf0b4c7dd9dcf791f03d4c6586296305d6602dfe7b4b113cf0292141553d33a7c58877e4aeecd5964f95de2e4c09245936840b1f44193a52462b0bc47d8a8424de635cb5436bc675ff164e571d12e31906bbb5e41a223722356030df759e87e16f10e4aa16d8c09c1db0a13ecf63e370645184a68a82294a24035b9233d1c814bde1d199ede97fc32565a9e45fab2447ac,
+RESULT = 0,
+
+TEST = 92,
+N = 91741edd49adadcd25b1325fff75ce75bf4a0a1afd82ae8ec3c1f3cca6b29dad966d3d12ef19a6644cd6b2ebade222eba1c168d5feb08dd6e38f33c65791d0f3c8a61de1cbffa61ef1c5efec82999761ddb1a9fd2ecd63e76413b1fe51b3aef2777e589837940c8dd6fd23c11186972382278bb0862f275f8659beda8c8f3093ca208661096587d371fb60a6a43b677352615ce65a44ebd1611419f5806236a0b4d766314299fe3c37278a8115e34e9a18d45013695f45efaf8fa57bf1ba6e9632c7584857d9ff552a184b1327baa6961e37c21741fe020d72c44700ed9ea69ee9cd31be613d9fa38ddacd2351abeb59bd3419f342837a1a4f64562010de5207,
+CIPHERTEXT1 = 09d078ce6cfc299f9d644d64e2732920e5a30c1fb0dd1c8181ddb9119f75bd03d23d44e2a8436aa1adadce2210869a8f0e5a92be1d1b6aa7737135965edf0c03ba4f4ab152da646ffb68ab666fd23532386333a5a8073ea5d75f64a0419e057d26984dd3ef1410503b727f65bae7bf5db58652b3a7254cad9014b5ce3c35a471a7fcd3f557386e11c96a7eba973302f7fde0c6499d0b39a55e60eefff28116a8bf2296cd43b5065b01b52a90a258b729eed76f1d744fe2e6bf0fc4b23ae512e1304556c10ab24c10dbdb2ab154d377701a539105f490a7ac7bba53d0b3dfe87e66c1e04bf6a765ed60853792f7f8fc28f336540bcb88152ffcc59d693ca2d8232e54dbd22c40bfb8c375444b141640891a4ba11ca85998f27584dc07892edf9562a1d828ebfe57fd3238b71f06ee6c446cafc80f5b45ca4d0ebc721562cf349559ee8bde909bb0fd7f818061d58f8b9d804e06a3dd2ce9a2178ec28dd13387a215aa8439e2cf065812d0bee00de4cfe24a3df829f2a7e9d1f5a48b1935e4894dd98f58fc5eed6140f7d8c3a086c1a9c7a2481340dd6bc477726076aeeca7e7957908cb3434ae09d793aad95067848eee9aeca1088d646c2219ad9b633f29fe3a47fbb7da31e0c799921d93d6db9aba26e1119e15835f2f1dba0f5d8eaea7611faa00819b47e90b891ccc917b40133fd102cf4ce067cc46a3269bfbc74efc6df3,
+CIPHERTEXT2 = 0d10cbe35cf4b0a2d9bb917a414e73b62c307ef28a95e09db7db387c647ac5b9f93111e27f74c95c2bbf2876703e46b3d57bcaa5f08bf0ef34776126595ec7eb94ed75c2706c893361b477273dfc74e688f826694346c03d05f1777137a9e8afcaaf99bb6159ea16a8a852ecd0d80e9002520798698f2fad00c2f9aeef4b8f6748f2dff5c40ad5950db82434e1bdd1fd29537ffe99ebbae64526357f4d1bc6b5c3f0652f33caebb9e614bbeef8f5c49917d089180ca3de2e0b8b8ef4fdbb7a7ca26d64c2512ee205d67fe305fe0a252edb14a6805d1ca6b6490e278662c89f15524572120bd7c412d57977fb60b4e84fa36e85e21e34f15b3d781b031a32be27531bf2b21da66ca287639ba86f88f2db1c9925402a85715da3f351374289ada7705969a8aa9bb4f6767e51185c6e87d6d67d5e4598a3c491ba5314bc8f21b1b19588d90516f353044753bbf1ecfe4a58408780bab7d175e4fd56cab083bf2f005cf1f5c4ae9ea7754f8746419faf86444015f9c08233da9768a67556e64c4c52356c1833263948783736407daa1b1dc475f0d119089f9142b1c448d576b2910e9b897263c6f4f7243cfca9ad5a4a7bbd058748310e031764a1926faf20562e9e2682413552767e91cb9272a2ae59ea397a5016ac74d281f1d1bf5cfc8444105e3476332f33836129c671f475b5dc7d93c1f563b899ba6ab48bb844f9861d2abc,
+CIPHERTEXT = 179b95ffdceb8642f555c9eefe300f737a8bbd7523cdbe41e8ca785029f21d7fe6fafb48c1c60aad498b183ff2d096739f79b7beacc8245e4bab0dfd07d6f9069eaa1f42c2bd8872970b4bbb8808658e994254f05000ef3c442999acefd4eae01e28405b61a512855d2f29ed1d28794ca8c07bb894d02396ed39a8b779b6abd9a00c969734d29264e80d2a5c61fd62061eb6e99fe3acc607748077693ca41fa0a4360cd63365c9aea60fa9c712a5e458985bd4ebef8c897e2db4cb0258fff37e2d8804e858668778a945ead736ff61266c4c9691121668f678565fc366a88c4971234378eda295c566042c0a13a50f04cdfe47068f4dec0b1ae6c3847719f944c094acd9703fc53b537d6f10e35f6685f7044c399dd48d23f977d4dcd0c3829aaa3c296905ce29b44cdc331fa8963ec6e2eee24bd3abaa32cf941aca1d2bba04e71e126e95655db13b9e2ce8eb23ed624b01fa46be02a67f87a075c89c1e612d814dd6363faff58c7d2ec508b9f661f93345a4414201f0f5548fad5426eeba8d33efaba6c7deaaab7a5f28cd6a974f6daa011b3109a1334207f0c3d441a7e502040e627aa87d83f9a303ac758f60cc81298b24bbcbcd10506bb7921fa8da3537be70f7b21142da533a8000553cd9e1c62f7b7ececa690973fa411c9f09cfd060f594b841e767b9c037873cd792bf1ace6d81d825133c46bf9e48b548fe567aa5,
+RESULT = 0,
+
+TEST = 93,
+N = d7eba7918573b2605fefaaaa64559c7d4ecb9d67ed7257f4fe6c39d36590f283e41b9d0a91426eedab2ae7e18e94017ea80302d7c9f15d230bbd32b7d8ac2b5862fba5d3ef902b7d1359ff79e2d05047db6853b4ae205da10f6ca44f1a49b96a2360f689d18ddd8d55ad6a9192d4366d87660af4370f22edcd972a3027e36e11269918471cdaa751bf8bd8c20fabbdf6fb54eef68831b62a456f9f2569a320788dff7eec86e94c57c267b84dca747f9cc290c0cabfdb68c4b2b6bed2c3c0a625105fb54b478af97a5a2050bcf38af892adf2db5b1eb06673e626567f9af79af605c6a3c2faa137d4030cd1782b8d8197d3c6773a3ce223a490b3b8501878f1df,
+CIPHERTEXT1 = 2ba0a0a80246d4fa4efeb376eda9d17ea99c9ae6f3ae5f78e3f6785d0c38e25f77a6aa56326bef67a3afdb6fb95c531a9dcf6182804f6d2f25475212d0e2bd649be3402dc7fed795e314f677de9cdf156ec9c743adce4644f721b87edcdeb174d58e19dede50bc4e6d83055ef5927c6fac294ae753f7dada693baa66e28f8b8d9204399ec351b1d4617b7a45f9d011e3c4f3d771f6f9bab7075a0f0877a41e955a9b67d6f73907488b619cda869090bf16f06942c53b60230dc1c39338893b6e582c43df9a975a642038583d0823fa98ee9ce6be924ebdba23eb0a393d4e50b2a3809766970286fdbc841d70aef38cf85d423e8165a64f4404bc56a81c021c60496613a73b335b0bd2bb5705a80c32d9dc4db072c7f2aad9806e5c0bbed8c2ef0ff995bf0a6c8f87febbd47417210220a827ccccd526658cf4fca35e2931f18814aabbf4ec810188bfd24a614d7101129806a49a02e5aef085d332fd7119ee982422d3082cbf6894266b00d53e9524873c52c08751c3d14dfade151fe7bad674899057b9bd2fa6f4aab2132bf342927f169f05a4bf8a920e272d008b47c38f3c6297af3baed92d41ebd7808c3ec240c3509936c3f98d02a648d53529650699579ed0423959f3d7af2245196c877f9caaf7ffd3392f8b6132ee4be0bddbb4fedd6d291d6de3959fdc363d8dbefd6e5d2225b98ac700eebf5ef78d6a3275a5245b,
+CIPHERTEXT2 = 032811bc3275a392f08837dd59f0342fdb254c1ac371c18fa15576f6762a571655c4a9df8f8a43133878f717eb3bf3a34287197837558f0528d6ac305c2bd7db17b93575a6a22ef36eb325154ef9a789ff7f0c0fb6ce0657f82337e12c070c8990e2102e9d93e0bf453a1b588b2af876ed06bce8c255b3487ed5be708d75f0589a00a6c4f667fb9a8b7b888433d2756559442f7ee2e5a6d8aad0238ec7d4f9bd5ce3ca474f190ec028c69c203bdfa6a4c8168da1e0eabd2aacaa80bfe0abcac36615d8eb71bb3f54f9536a713e24dd714b8ec40e0c3b540f05cb0d83b86a8f027c7f4f87ac9b16fc56e1b0610a0decddec4a2685957da87ad9002eedc8759847c7cc9a754421cf231cccb0c7821328f06a8dd2fefb5e6c77f6d3991937c9d4b058047782102f31ac3263fe420bed59c836d85356a93a4e1c7abeaa959aa4a7caa28ee72d577563ece3580d84cb052376abb1dd761d13a40bc6ccd89f83508402751cdfd92b46fcc0faaadce916e52648de1c81c5684f49cef153a1b28c562751575c608c80482589bc8f5a5e95e7cd0ee026b0bf12dfbff6c337c6f8672fcc7b79edd3fb98e6eb7f9499f6a7ea8d1365feffdea9a2936f433b6b62846ccea2aa10fbb72e01306b59bd5171b66c82e68906913e67187c488d944950c5fd48c4609505e5020db4e928d0b7f35aede8f7501263d8c95b73ca3f9da34ff07caa9f82,
+CIPHERTEXT = 82c8892fd065607babf74aba135789a3ab21710b9a6beb35d1fb5bda7661a171de09ddf8813138282c466277a76ef9bf4608692d4dc743810d79576069110ea8d590cb1e2712c455f7ff19e6c12527108c7089b50130410196f5ec68219aea4f305530d2cb2bae0007d8422fd9a738b61eb32af9fb803c97791429747ac876f91dce4828a77050060a0ec62ab5830c40662e73410522481b8b8a61bcc42a7a19ce29c5c51def751fe893f40d915414482dd2c3095c4f532feac54888499befa70bf97219564ecdea3da464eb3eb53e978e0c4bcf84bf7cb736ce98884919c223acfd397f77b3e46429e69270982f08375cb7fd2dd2d0aadd9e9fefade76aa6cbf16c1e748336e0da8fdc5609bdee185214f3bfea2eeba88db72895f6ebef8034b0e443046da72df0ba58efc18ef8fd0a8596a61af0689c6f514fdab2ae38f6e55be3b1b7200ea22ff0cb2af2c7b579e56ccdcb92230dbf6eee2d326d7aec98f07884e05586b6813156ceb2c90e48b2631679bccff610b6525b7cdbedc0fc0ffbfbabf9ad162668b32c10b026f6aa5d5e776208552e2ca67c32dfd23dfbaee0478f91ed5393efce6b6da01a4be6290fe91bc9eaf582c9bf438058e13b38ae2b4d3e28e282c6e719f9826dd6ac09b714c2a7120bf1c8c34bc023e390fb3470d05fc2e6a3681ad872efd484e868bfd0787427381c714dc1a501a83da4381874f6ed,
+RESULT = 0,
+
+TEST = 94,
+N = ad6daccad4d9f6df2e8ddd7902baec6d573c46a6b3b87e03f4a3fd8562737976ceb19ee45751a9c28c9e1d56642efb2c00e81de7b50d84b15ec53b04dc61cc242715a9f809833596ac9898becbb6af881cf26917a538b8394def679b6756a631c123298841d5fc4fb72cf2df9e7802012bdca1595480bf85917ed0b8d57a67d62ec958fde4cdaf3c5f6afc55c6a5e00df40ebdd568409afa52e39c4d28027eb54a033cef19f71db4eddbc1c759fff435190c61980277148a4024d982ed40c1594e524f9d6a103823a32151565407ebe71e74518ee784e1ac73de12e790f850d21ea4a8348b079ba3e5b0ec5fee72b98059e9c0ccbf24fd14876b8b5291c543ad,
+CIPHERTEXT1 = 062be38045f12aadcdee1579d37c3341ba3dda65cf664b2e0ea7af3c69cedeee0918499d41bda101296d5ffc56eb75610ddf8a516612879cf7bf44dc4033598f7922494777b2f1d30cebdd30f4f282a1b479e185f7985ac0be0a9fbbd6d255e34656f9b5e3fe7d840e9376c2d0edee9d65ac28153642319f596ea4274726ced23aa42cad9d5a1e25df5a52ea1ae7f4119bb6a63babcdac17fb666b5e5874629411a4b699f8d606b10b7e8ae4b0054fdd3554912c83f0baeacb1a1a146307837fad3c4dd605c83b1d91e5129a87041904b904c3cbdd3de0f79a6947331a91ff576b21c79967caa4a061d0afcdaa6659850b0e57959332d79d5e13bfe797d2e35ddb0e3a7a20c85d6c6d1e9b012c3d559c0122ee54e3a5956795df98b0547fb4d0f9d54b1888d94ce0eaf918f6fdfef139643a745da07d6eecf31ba074fe95d96b27b19af5f08481106f64b004aeb34f4595cbc412bdd92bd37b23c5c7c42104e315358fb4e328e2e34322b8900cc8ea8ea041c82d9b3befd76006c560bca2eeae2dd5d340b1818f46b3be45a5182eea64fe4251b28ba206e468a67a8090c71f3c941a0db29da8e2aa86463bb439fa7564e5e0693a0f43b8fc1c982d868e9c63ef13fbfccba46c1b269679dc4d5cf85ff5fa0f0d2ae481e45c7d13148092d9e721bb78158b1e89fd85030aaed720cdfbb3af35c10504683b68714c58d2f6d59376,
+CIPHERTEXT2 = 534a027a6d497b54050dc5b3874ed84e8ccc3f51d11f8bf5c7565a3b6043db424d9334b2193e12cd0b6c3d729ded6ed2261903c25589b5e92e959c7dd61f749cc13b4102f2b7dda0a6d1b13ddd6b604e9299eaee1e277a4fb1255f2d1c8b8cb2ddac704fd5b84c5323684a789a15f78aefa203465e8c522299ae09ab7388b0b3639046fd56c1e1557ff055acc7d29015f9aefa9435470fb65c28d682156d39ff018fe5a02ceb1937556e984de43fb632c5ac514192e8d9ed0e7eaec3b84439bb4c6674154ec78092f06f1b1301f5ea9bcf2aa1a94345de3cb9390768bb238b36a31f840d541293ee0fb217d30dbf750fd15f00f80471e2ec15a08fbfc154970391e200ae376b5da5b8a26688b937f2c8619579c955287dfa90903f65a2099d31f2aed293399bc3240ad827de514265acca2d353e691834ede04fa3ab509632f5fd00fa31e453bc2cbfa9a7aff4ec2c1a0f8fe1eff3e7edf96c150a026ccdf4748a88378e63353688f973c1ce8f98f7548a57c65df4aa246b21ac98179c25511a70ed7dfd22cb16fe2157d52f83452dd65124382bcf69b3f465170f4a1dc496cc52a9016825db304eac132d4cb4b7be2dd923fd06127a8910b0caf40ecd2daa96b1358c0335689e78cfcaeeb8978a113940e8370729d00a31321a72f2f407ceab2e3e940137c761ddc457a135cd4e5ab298e29ae9b47917a1a29537ffe795a100,
+CIPHERTEXT = 6d30e36a419b600760be5984b6917bd90743737acb0b949735f610d3a739e2c2e5ad60ff4ace9b1b3eda1f25eff15233383dd4cbf46eecdcadd57a811272dd443b1b0e54cb339f1a84ac49a8904d200e50191e817b2b6d263a979a45a5a43729f95bba319e0422d4b5396da5a416b4f0a4fd7b6c6f15027dfbccb2cf49c16532964cc49df4f768b7061f633465b0397b659c21655f32d81eca7dfdd42ecf5d1394a815f07876890eddb6b229576e01d24678b16627222a180ac296110b40237d81b584a45f1861d728e5ee3b60bcb1ebea660ac288220cb819aea9474a2d1163468de8bb28a5422fdbc33511867e8d4c7713935ee754c67dc46b691ec2b8f10f22e0a4bc978d6c82207e6972c1a8a3daf0d6d461334a0f0ba15d551e1bb89a063fc317fd333f9b1d12b91b3191f686caf0244fa99aed4b6bd2e60c728d3f274d9a52b9bab7f7a3901654041fbdda5b1376569666d98066b90e3e864eb238472265bf05edfde57437caf71856ee35a90e683b856158abecda9f1f7aec7b93ee3c935120bb366cf0a4f52d0ac161ccd3340a695086682058f4da6e6e2ec76f14caf5da862d8426849d6fcf0fc3229270baca7611c2fbcb8665a47913997989e74256c6be83ceaf3e2a2c4f2c8566d2eebdba0d43ca52f72f0d4a5c1318a650737430ace0ecdc20217f18da53be99b15323bc5ba33f7c438bb48b4856682828a7d8,
+RESULT = 0,
+
+TEST = 95,
+N = e572c957bc95827e7c9cd5a1474ca4aebf4fbc50f579cd0f53d0711a3954fcbeacdd099286697961d19b6f0a34676d2a9956a19b289f7329553d8be9e21b869316fc82a9e3bd5bd6e67e52396b6606ab8bb10e88e80cd3f6fb8a2621e8b15b2e86a2585684729d2811b6f4048077d7092e658bfef2a95aebc7597bcee71a501ef7e52648c6f61b8aba166c15be12ee151d12a4dc1962102b2c03e9551a592d9ccd540219eaed3d5260826e749962032f2a3430ada142dc43738e7844886af4efca2b85c4cdcca64cf6cded492ca83f40dff5166332cd48a48e392ee1ae8851ee6aaa049e952e28f0a0d02db62ee8145790962623065f79dafaba880177106f0d,
+CIPHERTEXT1 = c1207047c1747cc7e1fbf2f12fa092d0210b99b1c45bc2e01f26819cf4eb2a22029c05308ee075cbcde283a21584299e8f51f64a79915a50fb8c6493af0db0bc37b4a471fb5076015ac71cefd859bae8201c485b5b16b6006facf92ea056619ec506065e2f9290a5ac078892c3d7b629a1a5ed0ebc73d87f564b86eda981dc6510e55b007924a4afb800268f8befac30dda3f75b8ba92f2300d6c66ac61785a93d4652308d9c720e0f001656763f54d358380dbf955eb019f1f6cb834f413d3ca269e71a1af055909343e62abfea5f08338b78b18f36d2a9494343eb2f10785e79d9b5a7a85b7d5aa9b77e26f8eb6fb0f769ba8b4e499f21102f94a2c6dca43339fa16c6417cfcc67b47e26ce8d0122af4339345b0ce9aed27c55ad0f000e468001e395454f7cbefdd036e756fc1bf5d6b7c578b9c798a2a1e26878a9572a64696bc5ad6fe93c08a95682fdd89956b40686929b18dac1d943f7deb8a334a9b29b13a4391c5dd8ee9da4d7c3ca6543f6820f3b1e645f1eb3caff25cdcb65f96d266cd9fc7ef95e45d1e5e49bd06149337d781cc88fc6c5b64abf023e64ed779e7873d8f46fd759835a972c2360368beeb1cb14e7defc0f2ca57e5eade4e837a151bd9926e53550a32129521ff908c7cb1ef6eeb95f03343fbe58f627d5caf44c82bc6dc86d1f1cb0d667e648d9c1f6e01e71183a43956b2195a3147ccdf57dba3,
+CIPHERTEXT2 = a486c92ff0660929164e85989f181dc2fe697ebe7e59f168043c3ccf68aafc4fa024fd8498399d6e71f994b52f4d519bed4c0e15b2250189bcbb76becd2780e899e2da558872798c4eb0b346f7f8e3af071f90a071e92f562f8baa5906d00e88020955c2d72cc0e77ce553bc986e8755ee924e6cd7aba1823d28e436c558f7261aadf6d70291fe1d00766a775d13c21b34bac2d8302c46890108db32ebc4090269713bf8503f2c31e094f36efee2240bfab4d9e9a81c3b67b3643b613362d3765d7e7bdfd1a7e16835a1d90f9796ecdc5169f2d04f7fca4391c8070d27513a14ae4bf230c3d212e2e7f32fd1d80e824bada4097b02abf73ba2f7851e6449d38b414b6dded87d8059247588e674cac4b8c55068da2cad99f5dc86a64e97df973d453ff75022e4f8fcbf1a381773e011183c70c284eaeedc94abe4c93b43618520ef29bdc67c61c9a07b8fb5f9d094819cf1ed31cc14264d9a0c3244674bffc4e8b39eb6e8556e287e9e299a7c1fe51b946db9a09352b165f71ab33329b1af372d36765d4af13a0b73c22169d545c394895f2b1306444f52ca1f5583d757b5bd2ffa507f6a1d35ff7ad888419d273ca55674518daea9d7b9a09d8ebb2c4e8d86fb5188e72035f2f7a3e1fbc6c6aaf595d195683f697dcc1da2f16885278f57509ef0a1685c3c287a28eab4a0e7b66f50f0767555093abcc03cb804f0b08a59cd56,
+CIPHERTEXT = 92100639b4d91cb7fe49bfd12355ec2fb814e0173bbd97c88691402c50d6bd28479141c2fe81ec86b0ef9dfd0a9f44bd874bff5494cef6af0b8d944b60f25cc2e828840c01d67ed7a79937f4ef603072d012ba0f36c750760bdd51dc5d507e214b37a572fc06c3e4afc2ca298fde584206d57a2eb4148faef398f7be00ecfdfe8e9cea64a627e3e4365643dd3223745998adb450bc2dd683c232dee83aaf70b46ffd5e9b723a7126910a439a2de01ee87dbace790236add536d12857bd68a9a56e4d68cf76a8e48f418627116a71a9d4545ade5f6c13c7a97647af2b09930a73e016c1627917f47194cf983e27513689876899c65068d3d8f9fc5f7b5445e654a760d880b5cf64a05b6cd285bf855dad8707da21aa7fa5ae935dc3c21d1ed6520ed96973d2404518ef980d7090085c1d9ec2ad16630883eb7f560336be1b45cae375882d7dcccff214295d499c5d139b473113c9381acde962f71c8e7b7f73d06e87d8068e3fadeba71cc6968632b0ec5a0355ead038c0e5c3826ed450596a31aaca416bea0d97ade5c1fb125ad21a275ca1c142ac6fc2a66dc8b3bd80d2f605c239599a6a61661ff68c52efe99a80a2d1be5c5ca2f0c8c7599e6845dfe5b701dcf52644d90446dc7d8eb6787bee4db559b5da6aabe6dc14ec1f0b81492cbe0d1348ae1f6d7a87a3ac42ea6174b6299ef3715275d189a87d9d07b14a46614c2d,
+RESULT = 0,
+
+TEST = 96,
+N = e6f7a9b7bb73b8ac576f0ac8f765f94e065d30fe2ccad2610fe2a75ee550c0f93e0c2aa27452ce2a2ec7555bc2637796457dc88efea7a22899e906500874d459355c911f317cb12087bade0352c1d97143fd52c6b681a7c8099b6fa021d90bdafaf099445e3749916b256ac6a69bc42c62f48c32efd591ea61a65affda7dc7d37b317b6f8f04062b1f36de16a9b2a0b9f4295a4ac50f74bff08c7382ef110d85d00ffdb24fbaf2f99b1e53b09fe15e7b1d2a9021c235a6cc700e044b936c6ae3c94683a881f0e2d2698bf7cc1147d88f5a99871c01512adfc71f7fb93a4685a55aba61b413b8236db15e81fe8973330e4a53804eaf6c081954a9696a0ff62713,
+CIPHERTEXT1 = 7852b7ca747a62a2354175f8a94c8ab635f93be3ab056d3c9984beda852d00bc7a7a0463be1e51c34e5ab166b11ce1edd7af17519d42eef8cfcfb40e63a4fc9eecd198b26886247af89466944c10f689629d52bf9948abf2d45a597b31edba5a4bd67ca59a51e2dc64717a633e1ba72aee3e99838aa863ee8e33b4251672be18a2de16b9a523afab255eb0ae7073f70c50cbbae9c710a3345a6be19b0a55a2adb991cfb0f9216f1a472a52ce227fce9aae0f826f7816b7fce73523a3a3dcb9a9b91d1326aa0a8e0751de9a2821dde92b2c8b254d7397f1c4d508b27a33a70de4764fe06877644139f34867710f15b62a11d9591d1d354af539a5881179350657bee6e50b5da8ee4b2b347efe1773b8e0a8ae7e64c9df2c0deefd147f34801a49611ba9b72b5160500f16651ff17bff2ffcc1f7763a606e69484c56f5ab96eb0d5eccc02df28ed54016bc915ec6a87f451c4e04db0017955365a80d9bad8dee7611a851499bab08df28d8efa8d07854570d232708c6c7dd54a11740fa344bbb5317102415f9668bc13f1919db8bb48b323d096058abbd8654459ec48fc33d0d319e2ca838f34e043983023f5b5620fc7f59e9c407dd990de88c5ce216b717f12b4d192b4bd980e7232a998c9af2577780d620539e9b1d8e643de3a5c83fc2839f402544c77f284e5964a36e427be8f3c052d65d9f2c308570b97250eb96e9487b,
+CIPHERTEXT2 = 19f351d044ac8dffefb0941c79fe5db8dab3a3bc3b99f302580cfde9a89e73d051c62079b52d114fa0fbdac4fea21595aa8eeb305c2c515deade919d76ac69970eec84ec3a4436d708c986fe8c48044f1008bfec2d1d695bf796df152e51bee2112e0f7a12f32580ed16d8b18c4a09147b30037ff42bb4945070777f5e0463c1839678860c3934a15b3bb16e6a544c9a956cca39dd49660ee790d0b84aa4abe913ba10523a140f0ae9c0a926305e5f7230aa917307b9f3d509aa6fc9d54b549fb818b1373a1caab6efe9860bf3bf29891fd50aa14f7ac5a8778a8b5d26b9df3495eb260e099c727ad07967d4d0fbf9daa48f2af5fc13a33182f13c22ad83048b90bcb9bc79aeaec7688b02b7c5606f0ae83987065f0b20903cb5db8540629f1a209cdf991f275a20dffcae52790e78d67b2a66869778f7faa91fc821439ba8d739b5e14b5070857e8d42d13feb969831886a72fd0d23213d57a38785b86979922ea4d2385c1c93969db17ff0e7aa77af265bf8e3b76df5cf0d6f1087f73aa122c3d107f82afcddfaae9d53207bb183ccb5770dd9a82d72fea50451d187d119c30684bee739ce6c1aefe9acbef05622dba4dcf12612b3c143be3a9024752fb5c5c5a8646cec4b21cc1ca56d32f165612be94a70aafa4ab0bf9ffca0431d51f098034f21a817e5356d74da6856de7dbb895a10cbf9bf12d468884fec566a54f97d,
+CIPHERTEXT = 6b759c13172069d949631a78bd2d787621273d55cc8a841c970ee9752c042af3823caa3ba667d1dbf81af40ad25b2d44501fe0782d24f57b59ce444efce44bab63dab97d1c57cf5f8dd921b74af44a4720a826d3ded8abe7c784266ac193ed079f2b99e6983fee22f9033d5a3aab24ee218d781d1ca24f0e1095ede8c60abf1ce6c53855bae009d0085bc2135ac96c3188a8e276a499c701fb9823259278a1c2042e62a78c544ecec7b853e9474f45d10d7d89d6abc322ef9698eec0a410644c1bc2b74b7c112fb459dfb0e47add839eade1614cbe5bc3c6a72de74dcf849fd2824858e7cb6e80a4c79787de073c46fd28b8f9d27048bc5b0e53677b2134b143b198b454ca7e697111f05c386ebcf344f1361e4c215d33536890a5fa970ba496a8b7814cfc17b66a86bd7efe9ae17becb42f0af1363ec0fbc7268c9cae5b73fb38d7a9abdfa7a94f388241d12b804cde0cc8489237329fc2505b3d4f69a21b91f47fca02f2507bbeda07c195f8de74cfc7fd0c5a51cd56948563c027047efb522ae9bc3343180021c697e045cce37d345715f1c528023d84d5a4664576f56c063c8e33aff3f291457b1b3fa43d55d1c5a8e0651eab7159fe4f5a0b1ef24b3dec416ec9f6b1f775eac132b5c36df6febf714c8084b4c8ffe57a8a80f9f2283d445ad5cf40b123dcff6064778cb76b0525b8a4c7789d18a4b788fe173b2ba1922f,
+RESULT = 0,
+
+TEST = 97,
+N = a1c6976067149a356f226528cb45015d86aa1e24727e0eea0512e7c0eba850a53592c8034a495c99c861bbde3b079b18c56f6d03d2e3c8386aa52b0c2d33f04aaae7672a2fd7e604b6db2f7321c93ed38476f3d7fbde24dccac6e57ce1644500829e8bb9230f3cdc065ea7f39cf2044f580c327f4dbad7185c0f78723b957a6b93024eafaa3c37714a038a32100090780c7f855d8fbace351fb829e28b433fb86756716270b11d9be547967bf4d17c53996d25f3dc8083b5641b05a026c997ef1935e68480bdab6b0d5c83791486ba234b8fb008b8ab4ae57409ad627754e6a8667a1d293fa38c7fd9273c4c6d7f8ed26a469c0fc976103a18b20c961aa74577,
+CIPHERTEXT1 = 1c7fceb9e508e0e2024731bdf3b0cba836f27cbabbe937af5189205093e859cbaba7bb9d0bb326d12c848845d43d520b87204c456887fd72be3b23b9981a6025e43a9ce0869ecf6f147fb1d0d2cbe625b3b380726abb0f3c6561da74a2dfeacfeb93a0ba4e57e674522fa2134680686dac8f02c298a90b16fa67a0a8ec54d64171032cd3ba9f50289b74e25ff13c8c3f5fc6a580bf4267b71e5f8ea87fa0a09d4157290234a5448711bc953542692903bbcebfd2a3031648a5256fa3756b910cde92143742d0daded93b18e4a69c597ff13ff21a99302a1d38f77deb97dd198e06ea52482ad0fc6f7c4c84f09dd516a4090196c9479c560b1325bdad06d9d4e5b8a3176ca02b6679b7b6ce45a64ef355fc1203939ad136ae64a1ca5252006146ba7cdd85f35aab09e0ffee7d7494a759e92adeaacdaeefcb798efbf86fa104698db67c256c461deb31a315d1cf2d1a6442e7136c03a0b204ce76699229de2c4cdc4bb9a63fb5bcfe554e59290ffe53a15dfd1935d5d5ffc4bb88d569eb033db1035957fea13c6c8505a47f68bcad9ebf1f3e2f7c98f8edbab384c65dd64455688fe96cab609f600f7f9d8a4be826c512b62623ff137bc8199b7ae1a72a9982fc447cb1dd0218fef8a1e3cbacb51fa176ad5973d27f05e3ca4814c45b2eb992a8ca17d2c339210c1bd71bc056a1f26e1bbb91829579f189b53bd6e122aa2fd4f5,
+CIPHERTEXT2 = 656c536a57060ff28ff199910a442a2339c8b0c89a84df951097a2818ca81a7d00a1844f1c9ff5289a9a3fbe77e4bac51d0073f043274a02061a8bf73d382178ce7b8c79c1b5aa9bb90013866bad0c823728277915b0fc465d2a4a8b2a4f7e97a53a96741a35b7239a1e1d8a8266a2f321085371ece50f92343c95a42faa7065257f84e539064d1b3488d242989f848f5ad9b76ecf9b6fef2b81678dd11c652b95b7c4fccb0a13eda8b41078396e06300f00c4730fdab0ce9929697bbc1d7f09a62c90668f2b6bce826665a79018a40a26d71a0c94715118514b90ec6d250bebafdc15add6c6777bac0335afcdaeb4fc66b91efe100e17d1e29c7be696eac8936725d1030e554c87dbc75f0aaa0a4466f5bbc4eaf529470bfede2b8cfb85d29c2ccda30bc952c89cb39acd6d76494d0848a4ef29b34b62f69a0ce888ad7d43ff342104afc6f8a02a35d26d6e0f153527410b9a5d9fb0ea87a25c310b3a71502ce280302d8cba5b3d905f1efd7c7663c0eb9c62d1e2599a6ce753e8aa9067e5d5d1a93da7ffde267a167f81dc82f53afdb4fbd9c456d9fe121641daf388b6d20345a0f29a9125ba8178848c45191a7d2b2c514e96931dfc1583a4264d3793d753db3284f0dd94878916dc9879efca5e82743cc0acc233f779da36670235bd70a6081ba5534b3512a9f1c4d9391b88f9c9167c9584fccff8813b3bc96cfe797516,
+CIPHERTEXT = 62d86ba817a677ac06c2aa2928efd60289144c05c2264619c45e91eb9ef0a9181915b784cc469f8ad85a6d175be052031eae97de51ca352282541eec20a2d7a78ece57b7179ff8f2b426a998339fd0beb9818347273b5230a17631ee891124c3812efb71f2eddf331422fc8d4f2c035adb79913d7c27fdefce24221dd96dad49362ae4ac32444e6f200369dd6cdcc39cf196af0552648ae952f4e8c27018880305e50e66116d3db5c8065886ef069945bdbc047e08affe983091683c44c45eda0212ab7644abf18a771aafc56b22be765303df8e005be7ddbf11cc32b3535bdc9cd418b4ef25fe9bc873959ae74f8e2b7c9d5a1e3bbd4c8e3af48a549e17f7b0f8fd90fa73bfd6290710db45a2f0a2019dfffcf6f3d8b4256d7b7854414d880bc9e9d375e823a18e9798499f989a0ab9f15f0eaa21d8b565fe2ac1cde307a09b6fac30861f4193480f0ead6a84e245c01d6c6e6f6002d6449fe6d96bacd95c482a798ccaf3e6be0f9413c8331b60a6f2a3bf59a291c5ba4d0693a40078062946fbdfcdf26d1cde9dfc51914b8bfc85b46d0a30e350961b76cb9ae84514fb7a9fb69aac22dc616afa2e987bdbd07ea04e4c4f2e590fa78ce48669e9a5f1d666833a904eeb158ab6cabb2f47edaeb8391f6ead2f6f6ef30654b7d81e016a2e32e2fbf99f014d8cba23797050a1ff781c2a58b01a29d031af3bad60b96539674c48,
+RESULT = 0,
+
+TEST = 98,
+N = b68e779cff7df8b40d4a2b5be2c672a9699f2df28c5a84c2b8473cad22a7d9913b3b5220e2a2ad0a4b6781bb7bb04dbd7b15b557494e8033f475be37d1e9ae09eca505870b9edeac0686b5e293f9faff6666d80477942bd0f45f2d5b77c40c3e99d455275164437bd46ddd4a8bc36eeab30590d5a53d57bd4f048d4cc665d2bbf70a334532df94dc44b1694800f2fae3237e22839722bbdff7cda132ae17e52ee21ead171369c5b5ce3ae2415baab95ba77f81e9f6cabf74863a6adf9d36ac2cfb15cecdfcfb777881bd08c4b599b7097470f4c821e9f3bb9ddd9923697a7e0ca7b602261e017ae320b1fca8f8ae03575912113ca9fa865b945caf5774e5a597,
+CIPHERTEXT1 = 6bbfe0583973e61fe8c612eb2647415492683a4b839de24fee4ce59beab216846c5be0835b071633cc3c0d615c718d98181bfa4a0e6ca4538d5777eff52de5410f1047941d61fa4ad7f347048d7141472ed3b446aca99b7ad969043ad57f90d4637d3144ee4de430712798436b1dc33266237bed827c3bbce44d6ba910091fa1712d13bf94228369a52b8476253d7f7e1c819b127bd5ac4a12853ed8fce74c3eea2b3ed79f6c9c728bbaba6190c8c0fb73a82a2680a12a0832d41a618b25b9e3d90cf52cc12e8ac04582c0813ca62dc0acd24af3a71349e912b00e1aa324d275b39beaf8bfeb74cc1e8e7160480a2958f00fd5657d2e7bd47152a3cc400794a7b44ca13cefc263eb0a8253377b0b2d55b9954e7f76f1eb6b867dfc06100391cee7e738f86a836aa413fd84d4955141f1fb27710560c18c79ba447472999463e4704cd902221e5cb08d5ecfa5541a97a6b1219adcda4439f55514e035ce95d1c91142a0eeeef8964cddb43672486d0c8891f55d48927e5f5e836a38d20e49428c8490c2665f5fab4e47e59f5ca399521cf40ca64a11ebfb8ce520b3c3212c7aa34435848d16c673b994022f4888e0b7b73185af3b6b3b50c1ad02211ffb5c5945031d3128e36181280f009aa13caba012923a2dbc7e43ce7a3e44d68ca41d27bbe667f5a588dcffb513b6252b8ca34c6ff13978a69a584e8a0226f2f2552a8adf,
+CIPHERTEXT2 = 629ac34781c9bee94ca23e2fc56a8bdcc5dafdd090997ea5c60c38a40b2711cc8a7126121588792e58c5055ab0d01626c713c1218985407ff761b92941eeabbde8e0b4a11bda26a82f0da359b7598907ed6821d3c0455d35128311952d005208b569cb4c3cae6cd8e170ef472a92e90b73851e2f520191db150b9153b0bb01cd16abf4ec1060472e4c4a55ca9a5aa143038db5bb0c79b4a664549e807919576aea24b7f01f5dd9f7d603f05f8122ce30746c6ce2f686734968e87acff285047a1bebd292a9ee7f32095dd4b89786ea4edcef2034ab71bb9df5a461ed40cf4613d15795773962ec26123032824fe8c046b180a31a12c2329175df7fac78f0ba3ffd7ff41561822a07eb69cbe853104b854f74489dbf0d0c59624aaf4f6166d0b1c870a7841ca0eefc61689dfb41ef900f598a49a2157575493b9c05198a648b1b69810250edf7aed3f4f66c589c42e3140f33085cbf9b9c7f722625c4f36a541a763a7316a8a40c1b09c7a532de5d8b97b8acb1bc543bcca6fe4c042f6af1f332775630c8def273516c0b70d70ef9109a5fa798a40b0f7ceb25e182f680b6703ce4980ad1e6a53e4a6ebe700b12900a30403add836e18b15c6007d8412600587757447f6d62595bf0020c54c2ffad27642cb59f97b87fa8ab1259326ba85f182bb7fb0d8fbf758aa19c93b0ebf63d0785e51874a86b219dfbb8435c89dd0c09f2,
+CIPHERTEXT = 474bb0d595d2a56fd237eab264292057af6ebf267705a4dd8eb12a00658ecd274516b60545ddf4154c876121fbf3461c1ec0c5b174ea01d6d96bd619756c1d75b9ba8cb44908520584436f2a786aa99f0262b424e9891417d15c8e62eac3e25a1704f080851a75adf2af04ab6229468cde9a595b53235a168d5b8263e777f62d8e6bfa203f446c640f1fdb6de9f365c65379a8a7dc77e5c32f27aaaee3ddaf4b76d11e8e4b7953aa3d47468d760169dab6aeb19e64702db90d42985f21ea24349b5e09f1ad0a4fa6b6213377ee84eb16fd1b779c766340565a4b64f9a917061735d513e1d780f48d45f5508d601d91b7cdfd742cf98dd970a3ed5c4d9304c8549466ac58e8d7ad50fe35a09dcd2d7af71d7e798b2525a567ccb16c7ba023cdcc29abcde1c72d3c7f79484eeff7a485757a101b6d64e57dd48de7ac49c2aacfe1cbe32a57abcf9cb951e032a43265ecc0fcb76c97ed39a1675c3890cf6d74e6ba2e6151743c784093a4956399a54e3e31a00dbd8e37c79ce9d9eb7bbf1f3ff3ee2eb348574c1285ba46f74aaa495a59e69771fd8c799b8a62507c0fa11c480c7486981ea083d161f36945e5c0d9949890abf39f888d32d655cae35a1cf786d5b3e66f5ca9d3e1f4f8f2c4e2708831f921a9e673f91d45db4d42aa3a50fa406515fa23abe4d3ce0f0b5066ceefa51353e8de81c18582d1f803772e020de0e4fa77,
+RESULT = 0,
+
+TEST = 99,
+N = a4a1a72f6b86673ccf45b3d05deee0cb6e447080b517941281f82a783481cef5823289eb4de7c55a831b5dcf79d0ef812d2270f475f72c1ff3708ef8055d15dd122ebcf4d2ba7d42ed69fc68bd820240a78855b0738e6c5f54314d9e546cf1c0db21f7e13b5f1157757778d557a5df089a606e769316667da6f9a64d1ae7362ba4e6a1192ebab8b06d5e25940737137d1b1f9123d3c75edd088afcbe7d1cebf435d3483726f632e848a0ed6d064bd1c29a6d3a41d5ff03c1a5b16ad46c3c9eaad23e329f1eb4b209b27c1391e1db01cbc5e05dcfdffd3b6b51d371f03e33562f385e5991e67292fc634166c0a8e67eb4dcc693d23a2ac9a0a7e7f5496d7fcff7,
+CIPHERTEXT1 = 5ef2e8f3294327c8af8370033d978e9cc670c16b0c4856db6551a3fcfe30195f8bb2c50d2b25000f46523ef0a6c9462c57736b85ebd27ffc89c210e21667d7637bd9befbc0e7976bd76eabe278b93821283ed8228ff13ede72d9486e4b7647b3c1a55f4b45214397e96f79ffcd60a95c9c3ad24450a87a9f8e783e4fc5bc2751ac38185534d6e921f32d19d85dae48411cea9b59cc6df0d835d9bbd03c3f357c460a2b328f81fa011811e14eaa33107c6d35dd7a7acf0a605c9c1a6a5d97822e2ee2944f7e3c9aed663d5f5ca1af5222272b7abe70c42f91c0f0e72ac2fae9d41453fb9387ecf31205802de53fe29bb471b184d5b457804f5d9e025239676825ed0af9059790ee3884ee6b9d6596c7442a77676be1150087527c9c7424e2841876c5e1ed7093202a32e18c4393f19550ba4ad171e6adf44e05b872a70aa69c7bd3e5faf7502d34997ccc2b0aacd3aaf06cea906da2755dcb8d276b97e7cc5d77ffde512927bee37b3176ba9d9749aaa9e6c35cf8991a3f83bcc5a17c571eb4a2a8e0a433e528324badfe84b851ce561a0170281ab72cddabba5cc0045af259fa7f31b878bc1813694e1ade1f7e99a227d85e74a43269caa05584830d47b500bb94357ac813f221b2f2956c2a205f78e609042e1d8e8442c5eb836ca46ca86efcd842025dda848089ccab0eee5e267f89601815b0fc9e709ea73d5999ed3f4c3c,
+CIPHERTEXT2 = 6512d5e0617ad1a7c5c446b1cef24a05aa3de7a82709277024bb126283212c5be7efe4ede31c955adf783d82733b74eb370604595ab758015c0161d796d4c24bb5d1b05ba38d786645354e66a77959e6767f0c91c7753bb99827931d329fa46829d9eecff59b7d67e74fc5ce0cdb68620646858c3daef4d519beb04239ae9e6867160e6e3f51b9c3d5a38e7ac33bee614fb59752ea308220878683c5c569580309ee4fa01944115f5c2244a9832816d78e65b2bf815c4b0216bad76a2c38df6290c45e5811142638f0c87068df9aa8e2241fdca2cdad36af3a00d8a09a29e304f27baed25b3c753485876660483cd6cd254e07b69d4250c7d89406fea7fdcfc3919ad417943e574a4532403555e17a129fa67e46a2e70408e67f20ad653f0fee11d46425a5daa3aaf094869240f01de076a25036c150ad39eaba6b19261c97a9abe51f2aef72f3c801ca6ea53139df1a0fd14895c86f1d1af395752d57c6924f2f154667a6fdf788f0d4dc643e746edb3a6328e4013f3c4f67d6b493e0a6b9942663833c6d075c4f7bfe88f60daf63ddc62c9d08c7546b15882fc927a6a174a44de447f26acc46a4add033eebc21776622ee296fddff81fada61d7be76e59d601757a83acc3c2afdf8be15d435dca002057fc7be77d23c8e9ac8c1604bcfe2a4f1c859ebc302cfb2ee86875c53b9bb19899d09f006192af9307f0a95f1b5427b,
+CIPHERTEXT = 0f45eb362b29b81afbf7012cfd85de0ef5017b55b71720e969aeb5e08bbe72171f938600aead0bfbcc19e51875f9f4108f49121f92da89690a730540f2400285091cfc6b4c1a40e840006181c11738671e7b5ed15f300a53ff4e1ad6d9557d99ef74353a6509d22964a491dff465df86f3605806f2cf5aa054eab02d2e04582940580d6ee6f0b314e99d3d39d67c8a050c1dbab400b6adedc27b8951c3c682f553b575fc69bc6ee87b3396cacdea5a4362277e02ae973fa0807d74233191af6dfb2c7fdb2f7de2dfc1da202c2dd910b90044b6e0a274407e984b9d49faf6a0b80c94b36f42a3979e358bbe0c7a7fddbd86fc1bee29e5e568ec3c44497c06fc7859b0e2b6273f68312cc51880779a9650dae05c55d71f2a52b1625b1ab2b268c2a483b7b8bdd3587282ec7534fbfe4480485f7d6b5f0a9780c74eaacef18fc40ff46542610c26163d1cfadd0f8288515c331084e81e70bd4d8ef9c072fd8eae7c2ed54eac5e73125849eedf2b0ef585bc58bbf9c2a73cd6d2f3e5b3bddc776ab3cbce76224b203ae652d90a9a891d56c7639156507f60c248f376e74057376fc8346f82885a48c38d758cdf66898bfd0e719f0e7d1348c32fa0f6a4579efb465dba957ba4ebf4813bf42eb92cfe35ce7ca0430bbe324ee9b50929bf1907b474261c7c15c520ea47f3647d5ee665c3251ed90082d219e244de2f0a5bbf7926a1a9,
+RESULT = 0,
+
diff --git a/testVectors/paillier/decrypt.txt b/testVectors/paillier/decrypt.txt
new file mode 100644
index 0000000..59edce6
--- /dev/null
+++ b/testVectors/paillier/decrypt.txt
@@ -0,0 +1,99 @@
+TEST = 0,
+P = 94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703db,
+Q = 9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a3,
+LP = 94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703da,
+LQ = 9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a2,
+MP = 2cafae64af81e43b4b99dce785807768732c57d4d71392017e3572a05c34ef1ae5c50f008537a2ba3e9e87db5c812944c60bce440faa05bdd4ed90083ea6741f54f32e9b2534dc0f48dc8bd00e9aad6dbd919b7913af95b5f0d1b47bc9f600c20b7afb86bb501f1032551e08696e8eebe8cf20e0c847a34a13321aa24903fc6a,
+MQ = 6c39e504fa0718822922aa7d2c115c458afdbdfa8343077cbb2ce9b0ef62d55a791c47d7888d797d9b485c926295bb8d7c735229e45bba4c5e90ddb6d9f7f3d8bf71fb90191b58088b672a0f29b8a310dcc94e4d79fa316f6014fc4fa5f43cf63966cdf2e3006b114781a4935a9e1fd485fb8460fb2d3f93c52e74bb0367e876,
+CIPHERTEXT = 17cc5e81709f423f7d8495bd1067e4ca508775400e082f151381f4fe382f7d70b8fe1a33d1b59252c7813bf04c0cf3cd3e8ae66739319bdb152eac1b85fb8ce7e764c7376cebec6d973e0585818c319e0ad23abe9ca45c003bd1affda99ddd09b5af1469d4a526fa00eb9165e16fc9b6dd34f3f7997f39c000ff47424962513e72877cb12260c10eb540dced8b2e604dcadabcea1a150f4813036aab0dabb1658d11bd43faa125c5f1a7635b83c7c5ff110734344292cfba049e15fc4c54128fbeb5b7b0392d5456d578af190da2c5231541992c7b98c33871796b6e7f9fdb6138d352e6338fdf34d661145f8e0a89bd04e43a64eddb6c7ea66113ebd13588d5b1fce74861526e5b520e48c45c4de3356985dae717772cd91d84fe8c0642906736145b9a840b5d9e7c2895e32a8dc6d159784daf1066aef5d137a2547737bfd0cbbc54a4416fd164114997f1b13c2a30de7522ca2c4824886c6985dc0b3811ba69b8f749411d66957dd2a0d5afcd89f309d2e1936302af1209cbea66f70e30b1d6906728e49f39dc66fc88f9bf35987522d91adeb61f478f4f72c058425528aa6e2867390acad6d3bb3ea102d3ec044d7f157f9349f02260fb197ed69dc167ca6882007c951e0d8e78820cbe7242ad8ff4a8ba69511db0f6ce607263ecacf60c15befa323e753e85c8e1890b5b288555612139868222d481418f372556eaa9f7,
+PLAINTEXT = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002,
+
+TEST = 1,
+P = dbc059a235e35d0710502a363d7b10c2ec04745c8851157ea0694e740b31efa100545f10a2b525775e9b67b40d344fecf12744f9b76ba604eadc76a5cf1b6fd13613119399d20bc2025b4259d066315f9f6a0e550a7eed7e60d6a3236b7d4f9cdd63464f9861f0bf13ce9ac0926f32c4637b18d59bee02299842d9a4267913a3,
+Q = eba3e193a4175d37f9589615e5330d68f89106a953f229d84f4e02db6324459d7591e744e2f1a1060cb9feca709e3470c5d29aac0d434251b477bfbe9e1378d94eef37d173d82d918c9e0730f87e94e36570f9db9992a0052721f99706a658b1f4318f20931947f9bab12111bb05723c25e98d454b35c07aac219997e6334c21,
+LP = dbc059a235e35d0710502a363d7b10c2ec04745c8851157ea0694e740b31efa100545f10a2b525775e9b67b40d344fecf12744f9b76ba604eadc76a5cf1b6fd13613119399d20bc2025b4259d066315f9f6a0e550a7eed7e60d6a3236b7d4f9cdd63464f9861f0bf13ce9ac0926f32c4637b18d59bee02299842d9a4267913a2,
+LQ = eba3e193a4175d37f9589615e5330d68f89106a953f229d84f4e02db6324459d7591e744e2f1a1060cb9feca709e3470c5d29aac0d434251b477bfbe9e1378d94eef37d173d82d918c9e0730f87e94e36570f9db9992a0052721f99706a658b1f4318f20931947f9bab12111bb05723c25e98d454b35c07aac219997e6334c20,
+MP = 8d79eb0cb63071ed8fefb2f5bde666ae7c37c65c74f97700562d5d5c58a89410624176ad07bf5846e175fdcffe3e6119d8ab6df162e9408040192030063aebd4c0dff702f79559e9a7d1c0b061390e9107db421fbae9bfead0024c4cb396748263d20ecd8d3714b8f595f3055b177c9c88e201ecb8937a79be34427e3b73284c,
+MQ = 53ef47de9708bfb718a50d6e2aadeffeef1cb70c0c0b3086ad96d52b11fb75f69f09175344549d122fe6f6ecac5bf32209288416927a0d0401e612004f21c2900b84f3fba9a18b4a6cd5aab831e734ee8962396fb092b7060d5fdd7e44ec96951e520ad56b0400c92223f773369fb293a012be3981b1549dc9768b87e7f8a052,
+CIPHERTEXT = 0dace56469a19e75142011bc634a4e4e3185e9931ee3342181e7ed6eef3dd919e313755255012deddd4965c1ae54626c26f4a9330a7818bb187e077782cfddce9aeb781c812ded1d86f9185822d663e5fc8edd2c67b3a3ce3f8299904c94728965505cc35b84c61ea31599d84505fe38ab006f59c4a7ac6affd8efdc8513b8236d17e4e8e46da60c4d02e1d8ffcd4bb7205e54a6bb54c0e824a2aa423d2e69552acd951a3bafb1cc9b7b7107214af460184968d5519fd6fac97e382590955d6a23eeff302011bcaed4f8eceb4104914c03d64b325f5c7361d03f0262285eedd500a8c355660e9d71d167c161ba84fb9cc58d61ae36333e060949c2b9a3fd8205b5749ee5a94f339b8c0a1d0bf2fd8e57ed29877c2478bb692602bdb0544af1b52ef526fa91833ae45acd53c1bf0808025ef22ae4dc42927eefc6e2a04deb7559f69601fadad1a7d6d0733868ffbc2e25de19fc43674d21fa1f412098f196d359cae873caf32a60bc7a97212f41d9ceb58b40f5e5899928da04dbfc2579953f13cf1f82dd6e4eed6f05b26a347d3b421887cf52c682e06d5c0b04610273eaa1b893333e9ee6a77714056b6473def4925fcd146bd45a8c99b83e50a6f2d609caab8dbd2f119e45114a88f52e5780283df2bfd6bf5a8f352d6182d9ad8b62d6bb0fcef12c160412f8b3e63eec5a76bf9789ed92ae7ceb1fec1e6c95ee75dab09459,
+PLAINTEXT = 8542a3b5f98c6dc07f9801b47d044d8c3de482cc1087491cd28c36f07b7e0edd110b8ebfdae2a0a488b315e8d4cebd8d6aa7fb09886bea8a8cdbcd6884b2b305f586012d888b9f91dcd7cf7cfa0dc95805c161a953a80cfe6e27e45bebe7f5139c05a95a53dc7a4b2ffcbd53ad7fce80a66e8686743c91f05bad4b234b877c12c330862ca1d2fc7ea3022c72ec055fd23b3eefac33f93e612be0bdd7d9c37144a146ef9d1532d2ab71b74670cafc8f1fc626f0cda99dee9198a7ed5cd546c44401db0ad631d64a06d11a1a60c46330c7f02294edf90b23fb1daa9ff7857a4971041754a30746e94bf78d1d3e481514c2254a7db4b4dc01528e00dcb75670500a,
+
+TEST = 2,
+P = cd74cb88f41ad918a1e930394ce831769b367ef686dd4dd671edc6f7a30007025d09f744cf65a7eea8c4dd134b4b6c21e32eb26232dd76459c2e39833ca8f528bc151b99691a009236470b1606474bb762f789dda92f9df6fe75a7e8cc3629ce81f780342541e27791364ed1da855c8a1f441c93fd8f1c9844ec220af388dc5b,
+Q = ecc907fc0b663b751e5d7fb68b6f96d28c0f72c16b79afba9f07f783da50b7a5c7ff8712329cef71bcc3aec355031472be6618d80636a6dee32d9df32f256db6dc0c1f6b2ff0508d32d6d7da7ee376916db0faaf41d62847188a625b10fa82222dc7bc5573f43e7a0e347ed7ec427e6aa9706591676a673e3b118efc0fe661a1,
+LP = cd74cb88f41ad918a1e930394ce831769b367ef686dd4dd671edc6f7a30007025d09f744cf65a7eea8c4dd134b4b6c21e32eb26232dd76459c2e39833ca8f528bc151b99691a009236470b1606474bb762f789dda92f9df6fe75a7e8cc3629ce81f780342541e27791364ed1da855c8a1f441c93fd8f1c9844ec220af388dc5a,
+LQ = ecc907fc0b663b751e5d7fb68b6f96d28c0f72c16b79afba9f07f783da50b7a5c7ff8712329cef71bcc3aec355031472be6618d80636a6dee32d9df32f256db6dc0c1f6b2ff0508d32d6d7da7ee376916db0faaf41d62847188a625b10fa82222dc7bc5573f43e7a0e347ed7ec427e6aa9706591676a673e3b118efc0fe661a0,
+MP = 6a2d2cd9d6d3819ed76d2748ee4bf257a3a3c31adbfa51d131f917e9557df034359fbcfc4705d0895b004b8938cad7d58d45e889acf8d1ff1e62bd2bf491d5d14bda5949c501d4036b23d24ff26510a15c4ab9cded33715bb32a31bc8b082ee211470ced26dc761a3a19e4d4f118beed2d23a771c84fee78f8f3ab7c7d6a5eec,
+MQ = 726b209959280633754c1a06de17e41aacae36198c47c82d448f9b3e23d7a9a942500b1914ea23eb2c549cee765d705838ded0c921fbccb7dca2c9664a30370344977420a7a44e3c0e95e5ca60e4e5e03a978b688edd5ab077fb6c34412d445ad1a09e0769af053ea9270a7e5e77e57814b221b50d936bd828e44d093a74d6ca,
+CIPHERTEXT = 06d7df17a4737df1ddd52884a0d5c3bf9b8011cafcf54536782a0a639cf4b5cdd7d9d5a5ee46c42928c132af3a4198cf91ca6cbeb66d04ca765717194a9054ff85d8f575ceea2e4753fc9228dcb8a571d7e404b1e50c163094c9621177affdf9e1a1698876ffd45966008fdcbfb34be847886e59a22007625c794dd6a629b9baa82f6d1cb8129780e021693d47a336c0e0a43b482728ce59afc690ca03dd96c30f5ae12cb39995b27a118ef87c6ced23fa8c1508ee10488f590f76b4eac0e60fbf9db2eeb44278b72894f9693904bad4f7a7f8aa53a6119a9eb471cd0dcb6a80bad4ff29e8ba51a9427fc10ae3539324a9eeee6fb0bc5b7e8b5f04727d91e3995b27759e31bf6e42e2a24fc6579f8fb3d8ba87f36154cc7a8b8ca4ae6cbe3229898cf0b3d2d624354d1c278452c0051ef2facd094c62cee8c8e95f87c2dccf80d24c3fce3b1443c91c6ca99b7cb52424cc6920bca4cbcb7abfd939f57afea9eed214fd035f91fd740b44a910d3e56bb1af97d06c02bcc3d534a9f623da4bc0dc530a6b0053c4ebb40202936d07fd61d58da9e68161b661cf84e5fff20d3eac262c1e739b7cc7f524dda7a821831fc803b00e346d28194c1b62b195c9d6a5c6a084e35ab411f7aedaa2739106e2ac62cd203dcb32f44e958bdabe8d83357078c64e191bce39e1543f904c15c5dd333185aa106164741a283753759ceebfa0a59a,
+PLAINTEXT = 8768977d462182a677539a470c616fa390bc8c813e938a2bb28fcea80bacdf1a5b23bf5f5c1206c4b9cdd775b89557683fe907b3d82fc126ce312b225b5c705f20c937bd5cd23f49f866b283e3f102e6641cb4ed5006b15c61b0c853f9cb56468b82c13ca47e41efcf873eb9be18d9b3ad5d047cb6ff7007e466ab940aced670c3a4948999c7108fcd661f1dade08a7525f6932e0562083451576826895fc6a6d155daa56f6f18ae2de21f6ee016bf707329210b0cbcbf88c349913566346ada1d174f7201b39648cfcc5fab8f4b6b8318728f373478f73afff249fa0d1ec1819a9cb17311ddbb632f5bf1a644533786f405cddb2ed950529cb9f5e041ff813f,
+
+TEST = 3,
+P = d9fe70a20c3f643d74dcef958af98f9640f8aa1f50c8486710bed67d112b4fb4e2615904104090b1f4b73073af55a28e881ed50edfca2b5b4c337eb5457154b9b32cab7847e2dab090767f16d52174c1e6d1b6114e194a7381c212d484127caf3e2990695d182d2ec1f4f9a8308737b7ba39ca799bec2959fabbbcab18e50c33,
+Q = f4563a9aac6c650de4043be5d9c70d720561364808776029c527bf7ec150fb0b3dd21d1d41b3eebddd2354a8e8b84c3de2a6af0581d4dbd0ec31727d2f1bd1c8dbd713ef622b66f45649078a9a00abf26543ff6c447f200379edc603b18af8b0d615643acdf15b673f620091dbc66477f2660b2b8a04f60fced9bc179ea58c2b,
+LP = d9fe70a20c3f643d74dcef958af98f9640f8aa1f50c8486710bed67d112b4fb4e2615904104090b1f4b73073af55a28e881ed50edfca2b5b4c337eb5457154b9b32cab7847e2dab090767f16d52174c1e6d1b6114e194a7381c212d484127caf3e2990695d182d2ec1f4f9a8308737b7ba39ca799bec2959fabbbcab18e50c32,
+LQ = f4563a9aac6c650de4043be5d9c70d720561364808776029c527bf7ec150fb0b3dd21d1d41b3eebddd2354a8e8b84c3de2a6af0581d4dbd0ec31727d2f1bd1c8dbd713ef622b66f45649078a9a00abf26543ff6c447f200379edc603b18af8b0d615643acdf15b673f620091dbc66477f2660b2b8a04f60fced9bc179ea58c2a,
+MP = 6ae569337cd913039b166611d49367834811e4e626cbb49304f781d0c3598f0b720c96447b67f49390732f42d5fe0cfdc89d3fdcff3063c9208d77e3b915eac6198003130ddb5abf2c8698361a79f947a752131236ed547a008cfbfb8f26fc4cecb13c9285f42ff1190da28ac833fd8f9ba42023a43de427dc0abfd3d9c714f5,
+MQ = 7c85e9e770ecb442e5b1545a3654a53731b9cc5acbac43175c946c480b5c36ed057d752665dca6c8d60d1fa4122030ba64a7100e939f55a6984b265826eb97e46d05f1c95972213c368c07da34763fd0a18f228ca821967210d4c8e23798808f44dfe38a686adc9f0b6a1cf829b6d53b21135c684087a563eeed17270e23b9f3,
+CIPHERTEXT = 61e92676264ffd39cb24d7907cf05d615539e9df23c51939247ade5fdb1f934d6e8c3ee027bb008fe8aa4417fae7d2e1ed5c3f0c173590035ce2b148f62495524302703a2d6f99befd5443918a78f0e8a35758c75fc0c18a00c3b33965b5fd854c63edd1a01122110fec38ad42a704acacbba0e8b76ab46700458d39c10c8a48ca0e3858231270b6bd7c2f1d57502cb271e27fb964e1fc92a1c94bf054401a943e21256105f3ce236af3f49704a052ffb48b35377affe4cda1dfaf211fc41fc91565ee80d7313995905ac0384e2d5dd85390ffe3059575f623bd16ca87a66977c81ce715036e6d9c40a760151a581007f9385a8329c0030f919a95ec1414c89b05c153302c3eb861c97b41c32a592f9b58294b7366db73c4edcb7140dda16e47b471337ec0014898ea82e4e27c7e6560d1d8437a7ee2c0d058c0339a517b100f04e31434a503fc6de867b932fd8377c273cbe4353a6d4d3e3b54e4e4a05656771ffcbcbc903c956eda31cfaf79114fd0b4dbd7656a4308fbda4d65aa8aea9811c4a1474b55aab7582adec4b05a88d396905674d457f18b606b18919ee7d0b5898eb6868b8dc8e535b7e32edd54d1cce7a694c77713e6cc9ce0f1392153324183a3e41cad95615f67636d2e0738d7118ccbb1fdea2e98420e36e0a551cf3142e30196faa674ec20221b041ee6887e2262b3f06427cf623360c67c30f1d4f01abc,
+PLAINTEXT = 0dfba78f9acaf13ebcdd3bcc1c1be67dc7d9124b1311628b16a04cdf418b16f721515193e80b43a8d73664754417e64b6f1fc95abd287349744887e32218e846d7fdb529f7a5a832153b290aaf558559cd793839b2c4592b97757870ec8a653f2702e9ef9c48624a08c1bb8988f58b4cb06eb80dcd79078060bd402f77cd8b4306183c27811e698bf1f289a0930b78031bb41f5414d4b75761b301154858a65222660c45b86358f11977ed995e424d9a96faf9e174b8eb9ab9d09c3d187e16f16e8b9498692b72a6db9b1c66ea3b1aed5d9b6456ef0940ec053eef88637bdb7c60e7215acc49f87e8445927d56205ff0da3bc1a8bd3cd85a21179606596d96d2,
+
+TEST = 4,
+P = c051bd966bea3ef4336c62a4c55d773d5f382be64b0fbbc444fee805866e999a5f0753b89f1170debda10766c58d8da7da834f73134d046a6a64964dd065c562b6f13edd02bbdba9eebc4ceb3d30230b3f9aec0af6a82c04ede2e90b62d373226436b1dd624cfd29896ad0431304a660b33623383d755ecf38811d7fb61fd14b,
+Q = dce2fcbbdb85cf60990556a10655f720ef6f4cc724d73ac1b79b51202427c7530e62712f533331744bf77a9728f299e5449a61aba48bab42b0620079c8e878244dc0c0d38beef9e10184a252a88159cb0bfb6d5d960cd778afb8b87974caae55058be70167c0e4fdaa40d3afc6fd1a57b5bc1cab292134d150262079c14dafcf,
+LP = c051bd966bea3ef4336c62a4c55d773d5f382be64b0fbbc444fee805866e999a5f0753b89f1170debda10766c58d8da7da834f73134d046a6a64964dd065c562b6f13edd02bbdba9eebc4ceb3d30230b3f9aec0af6a82c04ede2e90b62d373226436b1dd624cfd29896ad0431304a660b33623383d755ecf38811d7fb61fd14a,
+LQ = dce2fcbbdb85cf60990556a10655f720ef6f4cc724d73ac1b79b51202427c7530e62712f533331744bf77a9728f299e5449a61aba48bab42b0620079c8e878244dc0c0d38beef9e10184a252a88159cb0bfb6d5d960cd778afb8b87974caae55058be70167c0e4fdaa40d3afc6fd1a57b5bc1cab292134d150262079c14dafce,
+MP = 9ea0890cd311924e85c0ec5d8976c5475f6c893f02b424af26c700d485e175715a4fafedce7400026b35bfec17540a83754b0df19eef42c578dfa73b668a58e27130be318c39a08feed84052a41cfd0e88ca56d57964618c744ecb39216881961c7945ecbd77d632c3e57d6cb16f57697499d81fb0df469f35e3c3a76e5bc5d8,
+MQ = 26b267a8b8277f968d483b8d6e1bf48a9b682ab815d6b7fb17616bcb52a40432c82087203fd418550f574cdd913dd5298253d9fdbc79701080bad94c058dbad7044973b0d3df9965f1b8a669087590a9952e7ac7ffdfa29f8b1e29970791943b2041cb245f903d559e2a87233adcb86a2e5d0d4ff0096abaef4fb8fa3c227b74,
+CIPHERTEXT = 5112ba81a6bf954f0d7720657ce11c3f8bfda967678eb006984f508de9baae96a5b80c2c85ff3bcb970c749f8be8b9b813402bf70f8b14296f5365beb387e0a14fc21dc51283f26806a67eba96f2e4c21752ec35165b534a396718582fea281fd9b2fbfb0ab4c45267091fcae60221c8985e9c0d4569a040279e4e24d2f0340de11870b7b35106b4fca91aaec50bec0b6853522fabe9cd3df8d42ff67058e918b92d4d940526a3d1e377de46a82dbe914b5bf908e640b7ad39415ced351548c18811a40c978733c964fee565c5745296278f067b2dce547bb063b03621ac219f69cb306fe0ae49b37814d714f255d8121eb8ce95774a48095b8a8eecd6f57c419d89195081a8e181473cf211b2bb4eec51328509dd0fbc4a26e0a12b2ae04f7a869b372a32b03f6333ff030abe98b7b00b0e73b41340db6e45353b87a9b18fcf081c448853c1655cd3f9cc8c4ce4dc84661f477f7a569a13add1dca7bef5661dff2307702b4e72091e485ba76aee3d1d7e6f60fbbc5a5956c072f9106ca0119dd54b2ab98de9cbd5b6ce5b6e6326aa24746cc813fc366701d490e506b45c47eb57a9cce4f5fdf83ea801a2510722dfd9d29ae2bdb57809995509d9464838131c13c8340374b0cf9a5fcdd360d18ee85d0ffc47ed945cef9e17e3aabd9d8adb997659607a314be7d4b632b19bf8ce896f49d5f8404baf01d5038e82eed84e4ca0,
+PLAINTEXT = 5e7a75bcfb058695f3c48e91e3bb54264127a2c34e5f627f0586d476d3559f5d10211c5ca05bb5895dd351816a15298b1946a72d73054ebcb8a141c6c5ff6a5ab4d5dc79949d402d85614924dcafbd3d26ea0f11ce9e702119e9b86f5b32de14a4ca6c9406332db2fc7b36428e93903c7629f82006a71e4b0aee290174945be136f833481be72536e41fa853677936ffc2e9027ccac8a0b5bbc61d85b126814a2e2ce6697ed1a17b2a97f15bc6894b355b6451da15ddf808a07e3f8614fb080f14e0188cb71dcd5747a1a4561e55aec3f0cc27c9642f092a6e3487b591be2492a3d7292a1994defc03a6fec4d5727e9cd9ee8d152d06078bfe60198cc0acaae1,
+
+TEST = 5,
+P = c8d5698fd627827166477ae090aa330573e012ec2de8f742d138965bac6d1eee5c40df8e773cac655d64ca26f213be6cee66f551ce050d3a0d2168b1c5e673100a4509a8c126708c64109cdf8f81c9be14059f19be2731857deccf403433cbf4c842d5a3ab41e7d74c69d4b62ca2d6eab84881846b2881a636e352698cad7541,
+Q = f8f03308c4b2b699d595f764b09fc769a7eb53c9a0511fbf7494add40296b41b33ce6ea7ff26ed384fb1d3c975bf06619a38183ecb62eb3a6282878ee5935e8eba3b212f87a4bd7e4c2e317b6cdfdc86e3fa6c50c63c8dee41581d2fff7d217e4ac615b73951920e208500e36b13ba6870abe74906450c5bdaa372a70c84a059,
+LP = c8d5698fd627827166477ae090aa330573e012ec2de8f742d138965bac6d1eee5c40df8e773cac655d64ca26f213be6cee66f551ce050d3a0d2168b1c5e673100a4509a8c126708c64109cdf8f81c9be14059f19be2731857deccf403433cbf4c842d5a3ab41e7d74c69d4b62ca2d6eab84881846b2881a636e352698cad7540,
+LQ = f8f03308c4b2b699d595f764b09fc769a7eb53c9a0511fbf7494add40296b41b33ce6ea7ff26ed384fb1d3c975bf06619a38183ecb62eb3a6282878ee5935e8eba3b212f87a4bd7e4c2e317b6cdfdc86e3fa6c50c63c8dee41581d2fff7d217e4ac615b73951920e208500e36b13ba6870abe74906450c5bdaa372a70c84a058,
+MP = bd207b61d23b0b191cafe31ffb959548263672d73a302a15eaedcffad56871aac0974500bde0da63e4f11646026a25bc7b82234045477970d53f24081ef43b55a9e942f06e9b57f8c0534a634bf201b42be594fa71e91f35d5098b1ce1cc378ea2114e111c2dd6966bd1f1e4b5ad7863aa1dbcd449454ea22b683a7bb8c982d7,
+MQ = 0e82c4ff8325d1fc73418a7de484133e2b7f4a38afdac30c1cab6d856b984b326aa231c8a9f8d44469ef8844053db1c2954eb1deda0f7361bdd9e9f95c8826d4c15188a13fb47c39ed31171b581d30576e7fa79b200e30d627a2a581a2c471ac5e054cbf56fc6ceaa5d473c81abf4cafb693559308cea68070f9d4f94142b399,
+CIPHERTEXT = 055cd5e5dbcf3d5f6ef7966be7ee7488f99bb90771461d8d1b131c0f588aa102e405de0e895cec658dea551564463655a89f0bf5861c73283089ede838d4ab5b567398db047f807d9a45df98910003ff7d217b201c71bc43901e82bd81d18898cb3768d1adfa4118e248a9e763933b8aabe90ef3cfa46db1738d834f3507973bc5a681ba03f08cbcb467691681b883b76608220f4e94cf44477822bcae95414d9889d410417965e7b9ec96765167e64fb6c841e8698b95e3d881592603f47d2a79f9e4a64fe246f5cdb326be9f76f53d619bc8f4f82b58043d477c9d801d3f4de778fa310fbfb0ee67616d3a6bd1fc644e85aeb70cac478943e0be54ab9638f2d3e3c129428e3c88877150d2795b7ed87e784ab3b320f88d236efe23f8a3f9ab5c6a03eee5113c916c7f6c613da6f17f25013c32921552bdf280343f387cd04ca22586927a92aedf584ccabea8f736c941c759851557960b17759c69eba2ef32dab96251641c007408bfbbc10d72ee71e2541b366cb90ebaa54b3a6ae9d3a8ad8e6ce61794cb833a7f5c5d4f28ce91b549a55c180ca624afb76f320d202ed9a3e8a59ec05a7e08654df0ef891d739429c2da3bd82bea7a39ee7439a1773160072971cc2d9a015653fa1506c2fb0826336fc1f5fd8fa9cf48e0a14348f719c927291a7800cb715a31381b91c0f45cbd093f65c5761d9a7ca02ea9909001db9be8,
+PLAINTEXT = 5eba530eb480d08fb22bac9933e4f91e716d0d6ac5eb1c1d1be0d08ca18ab5c94d7225922b03fb7fc3dea99402d534cce90579181e7f7eae49f0eb8e27593765528290edcd74c9e73dd53be3df55a699f0186e8317d870d35541993b51e780b94c82b08683aa327d158d1d18e5bb27c640a4d519d338412964c191d088839df9b525bb4cb49319d650e83222a42de6a7aad36701ca5fc403df482558123bbc13e8ccee7cd3811903531b02b37348f25aaa37a293956d30fb43881f10078ee5b37c895c962ba7caad47a63582bd9d5613d739b03bb5a9ce137496e0329d52d6dfd13ba7539baf75a53cb338a4792d35ca75917ce738ba282e949f7a2d398ac530,
+
+TEST = 6,
+P = ce42d55acc53fce36ab47df4d42d34ac4ef91e5c74a3c90e92af95a6d1961b5e799c682bcae20adb9711fad0583c4aa67ea84c64610a24cab0ceaf392c0ec083fbac6e0861366d844f23fb6a697a330c3a94e8eb20049a8c94b24febe8fc7414aa7365eece7725feee3e2d9bdd605a19d2525c29cdf6450ae155dad5db8bc4e3,
+Q = ed78157b11078fabd375a8abd75ccbc59bfaaf3d4818610c57929f921e70bb96d06d1d61f9f0a0ac76120b004e13025f88437fef6246e6596fe94b9953667a640c23e533ae50d48cd7d66e8ba6c37d54ee45b175eb6232e53360584a54e49c59ad8303f337cc03e91b7ba6a3e49dc5e25bc93465e5565018890f683488a3757d,
+LP = ce42d55acc53fce36ab47df4d42d34ac4ef91e5c74a3c90e92af95a6d1961b5e799c682bcae20adb9711fad0583c4aa67ea84c64610a24cab0ceaf392c0ec083fbac6e0861366d844f23fb6a697a330c3a94e8eb20049a8c94b24febe8fc7414aa7365eece7725feee3e2d9bdd605a19d2525c29cdf6450ae155dad5db8bc4e2,
+LQ = ed78157b11078fabd375a8abd75ccbc59bfaaf3d4818610c57929f921e70bb96d06d1d61f9f0a0ac76120b004e13025f88437fef6246e6596fe94b9953667a640c23e533ae50d48cd7d66e8ba6c37d54ee45b175eb6232e53360584a54e49c59ad8303f337cc03e91b7ba6a3e49dc5e25bc93465e5565018890f683488a3757c,
+MP = 9c0b4930b29294ff1ee7d7a1e94bdc65b6fb4abb31ae9a50de907c5957e85126cf29d44ac7870503976c2982488ca52e6fbe7b223fb3d3b8942de869245ef3dbc4d43b7c78424f0e4f3e5752d16f3d4fe2b5ab3486b78953e716549b48c9841e1c4db5145118ae4b37578ed0f6e6985a3593a88f173fe5aa0f5d9f6d7b89e4bc,
+MQ = 39d0a2d89932d5ae5219fec771e9fe57bbb39b5da3fa5cf3905c8273848f23588ff8654436e151ca79246e1d6947b9f78c40433c96ec4c2b9e8a0e0afef05d0530ab6e11e53efc2e9df25cede5afbcafb86305bb47b52745fc4cb93492f74f9232a111a2165b20d51d0f8401b80c6dd52ad4cb202a9c1c729345fa5f97cec9ee,
+CIPHERTEXT = 1855cf278ec7804938a865e4e27cd7c841a6a2226e2eb108fd3dd8330664a7638b8bdd0a5c64841b73b288f3d6cd3973a542c603075bfd5ce6d22f5486ac26799ea6b274ab6a2eeb4b184d2e27758c67afa2b03ae4f7baa8f1bd07a23fb6653795c12269f4b2a6dcfffba3de527f21309623040981053a03269299b04e000fa31f646c2ecb3d6f3dc353dec1022d1cc347206e91b44d7dd5403dc061efd8d4ccd6d1fe21653cb9f35168ebe45f91a5cd6b26a9c80df6bd283e2887ef51bb5dbd548bf4b346645c11106e97e34273847f61500d2de6fb3c93827d17086fc4574ce1afb6240c1f350c96995d89b2ce9c29af85a217f6d8c672a9a05b5370c423a4f8a314c0f51d3597e75fceb906c64548902d638c194c2967dbf4fac8b5258e32113e2ecd605f492800d71401a15b0c106fe9eecee9183bd50b319f28cebd992d731e16041385752ada05e3e1ea2166f5532dbdeba7721c8c155edec1cd8341ff4aa0a87f96f3b5c216cde4963ebf705b9bc443ea90bcdc897b8b993c1d55678c19317e309fafbf80cb863fc64e6643c87a77dc020d0c070035675acfe2a2328e3eda4ee8a7120fa68910a6cf372878ba95a1daeef1b1e6945ebe92e62d473618a36f0617f679f003c052678fd68b96a73314f48996ea56261774bf16e6795125e08e0a2dcbdd511d5058a1fd3be233bb81230aed7eb4cafee93dadc0f0c90cff,
+PLAINTEXT = 20333a5762ef00bc1fe4fbb84f0347a6c2655ed52c15e63b8ee6a6eb3d65469c22b3fc648edd623152650f961c0ba9d100184d30fdde8d9d35f9a1f7a62787750afbd375373f255f29e1245eaf1ef36a6f02d07bc96abd0d5902bbed13457a6571f3c97e283830e20e20fc0ab8b0e01af05309f9ea26c932a43b6d49722ab5a889c885480b96acd4c57e4f7f9c7e3c4a11bc6bd660a5bfd4a62a9185372757acb2c950713fbd2ba318b0eb932655682e31b5231e468361ff6e28af6a6b8d14d1601c23e50f7e90f8eb3601e216ea19f241d945b5ab7c7f78d7c7e543c943221c33a7a572f7611df0951071be9ea50465aae55de5579f9f84a675df88bab47aaf,
+
+TEST = 7,
+P = d1fb4aa2c4fb2f8e873a69e2e4eac41735b3214eea65ac0c342c0edd7696a92bd51e2dba73fc7dba2fbefc681883b28d505b5d8770f534b689a4028687f1d5833276a2c13770474994adb14d24e935a1bd8a39cd33ed48f8a927e6dd8b97644434cee621815629df1c9ac21b5f3aff29c9a7ed10c3622f2586c5c052579eee6d,
+Q = dabf5a9a32fb8b63093729d6d9f7be6bec81a37e6108edabb015b5e5a3b20cc9fdab851810f5b7b0cf820139e057f89c4427ee8128b37306dc1f95cb9401e6a58223cc3ab3fa0360994560dca22027cfa341ece04f708442bb37efe18cbe5844333c4c8dd8ac64e3bd46f16aa06d4f45c4b488ccd4f1ff785ec738b64edfd7cd,
+LP = d1fb4aa2c4fb2f8e873a69e2e4eac41735b3214eea65ac0c342c0edd7696a92bd51e2dba73fc7dba2fbefc681883b28d505b5d8770f534b689a4028687f1d5833276a2c13770474994adb14d24e935a1bd8a39cd33ed48f8a927e6dd8b97644434cee621815629df1c9ac21b5f3aff29c9a7ed10c3622f2586c5c052579eee6c,
+LQ = dabf5a9a32fb8b63093729d6d9f7be6bec81a37e6108edabb015b5e5a3b20cc9fdab851810f5b7b0cf820139e057f89c4427ee8128b37306dc1f95cb9401e6a58223cc3ab3fa0360994560dca22027cfa341ece04f708442bb37efe18cbe5844333c4c8dd8ac64e3bd46f16aa06d4f45c4b488ccd4f1ff785ec738b64edfd7cc,
+MP = 8b998bc664312483259ba3f7273a0a78df2a9850cbe7fb0bd57d8a075cf73d55ab78e143f5a2ed870a910bcef338dac3df240ddc8ef4757f9b4893c904e87f8e78ee386c855bb90edb9165ccc8110dcfd3179259c53dcd0481c2de49ec046c2d90a7135dc6000cb8f5fd83c6e18efab5cb8a88b15feafcc91bb252445385ef23,
+MQ = 4951e98ebcb07d92f6c0d2a63efe7fd675e2d13757d9c629f4435584ef3ed08ea351aa28f724c2687c8abd897680a9744e101031dc799893e784dfa544a68faf45cb0396851a3ca4b4e677c1d41065411907f5f01ffd3bbf2dee15c51fe1e9db30aa481956023ed23569090205cf1508bb2fb9be0afd9f215567f3ef7de888a5,
+CIPHERTEXT = 2fdd535ae3652e402aa5c0ec7a5f5a63c6fcf83884bcb82372fc7cee61ff339561e6f1f63a2e02361d9751ceeb9215412c7fcba5b04296add0e31c852a1a2d27cb958b96d3249be318129a284b8973299e8e4037a38f5c889d998b2e92cd84e34fd3eceef11a8b71f4205a24c9d29ba62158e4e7cb31cf6ff77dbb6875fea45d2e364cc58358ad9726b0ffc276d940c21d3ed5622fb438244eae30eb0029945435f33603c3ec0a55da8b3194770e8a7b47eead1876750efedf0d789ef45149a7e82465f4ab57c6cdbc801f5eb4152ab7be2fc4daa3dbe7648cd35faf4494e40eb035b79ee40d4cbb4d2f6038b5b7f221827ab22b1828ede995b3b0f8bb5c80d59906117a4625c92b921e27a4ab6ee41a27c00ac1d43da9eaddb205e9f1c3fbf63ae1ac7094fd3509dfc22c46171fa1894b0f0283854c00ae2f79819702cfe959f98d9920b550b0992792f03f164f99b5fb106cccea3066abee77d8bfa69a5bd9b9ec088f9bbdde88fa62501d376ace2421cad20402bc259da6984ab374c408626f7e802ebeba9115d59e0754bcefc04ac54ff712e30253a0f6128d38dbc8ea25d488fd0f234ca85b8fe8bd75e3239cf5d9cbf2bb23e73ce715c0b271e47b75c65d866696b0bb3f2a91cb4d75155b52959754c33bf883282daa641eb7ce996e5960c07781e4b4447d6f66608b685803e79dbce3e4b6b4b9184748f947e8fb3977,
+PLAINTEXT = 996addbd35bb71ee1e10ccf0ad428ca5d39ccefbdcc766ec3544b5907f9bbfcfa78f362f4a4392aff0e14e77e3195c5b086894be572644f5f3fd381f6630ea888dac80db481cf14e8ea3d6a57dec3731483b78421ef14a58613320c6d1e0be21f24a3d909240f7c8ce4d698456b5a5bf96dca8e5d29d12ff17653e0185ead5501a201dc73449a5d842681369ec16859fd4f604968b5aadce8c89579554505a27f09b157bba52f95fb0208ed2ddeb2f2a73882645e70ea03c97a7a4f0042091f1fdd7cfeea94d9ad4f11c1fa4d54407202f5313d624dd8c863e2a81dcab73d493f3a94056c89c8f0263225a4c77f2fbe7e0a8cd4aca9606e012956ad156bb01b5,
+
+TEST = 8,
+P = ba3b3e2eccbacb55cc420295c5604cd424adc8d508b3989d5fe4e360170257eb2210ab826dfa4fbf89f5315edf98bc8575591e5224775d65895ea24697ebb3931b06444f010d2167c73786b6620424357c067fa59646c20202f609c8a46a39329c1243ff59a2d36dd43e6647b8f8bf66f3bbc6ecd12d7fbbb0808e09dad6d0e7,
+Q = fd19b32b97fcd6d0163646836b70f5b15571ae93e7db495d5fcc2e922b1f8586ef03d3b70e959ff2afdf511d68deb6313a05c5086ff8d0a7e3a7b291f8f7727b334b9f13cb16f2ea43219841e681d696c743144314fdc332136d9214a7d87126d0476f56cbec412f791744afcf67c90e25e2027f67b1ba85f45cc614a93f3a09,
+LP = ba3b3e2eccbacb55cc420295c5604cd424adc8d508b3989d5fe4e360170257eb2210ab826dfa4fbf89f5315edf98bc8575591e5224775d65895ea24697ebb3931b06444f010d2167c73786b6620424357c067fa59646c20202f609c8a46a39329c1243ff59a2d36dd43e6647b8f8bf66f3bbc6ecd12d7fbbb0808e09dad6d0e6,
+LQ = fd19b32b97fcd6d0163646836b70f5b15571ae93e7db495d5fcc2e922b1f8586ef03d3b70e959ff2afdf511d68deb6313a05c5086ff8d0a7e3a7b291f8f7727b334b9f13cb16f2ea43219841e681d696c743144314fdc332136d9214a7d87126d0476f56cbec412f791744afcf67c90e25e2027f67b1ba85f45cc614a93f3a08,
+MP = b68f9e543e0fe17fdf79ed87f994eda360d423557453eef1a473645f5c054265e5d07c884bdb37e027c03a4974b8682f2404639c5eb80e64d309b752cee5aa6dcd9b34eb26e9b3992689d6d9e5221b2f09c826c5c1ce152ff3a7440f1844d6c75e2efa2f964a5dc460a7c587c15dfd750b9720ad6d9761866b68b00206810ae4,
+MQ = 04fd0275a67a3b7004dea77c8ec1b7b560c88131f19199caeb26125cb36b78242bb68fd51bf5a4c8df5af82e57ea82b13345ff5800c93e2cc544f9d5c935966fd08d08cb4385492a2c0d1a08c082d7ba9ef6c06743477a821d5c3f58abf1addfc0aadfd5ba95bf3184dc51bbc3b1350783ccbc9935e4e343354e303e7b0585d6,
+CIPHERTEXT = 82c4e4e09ee2fc709065b89227f7e4c07be8638852e87f167bd12c5b730d12d872d4e836e9b3dedcb3bd1bd301a2d04270ed4f63cd233bf4942842fa94f1242049baae2835b2fa9ff7b342b39a0e5434111d53d6d33d5caec551d51d15298d7e49acefd32d37cf16c8e21fe331242b52356fd1dbef4ff6cebeacbb5085c73c15968e7c425f038659d20550aa12d7b9e3a0ffb6926cb1ccf0e6ead9c8dbdfe186cd2a0bb82a66ac03604a81bf55c24e6a8ee70f9021483abb26b597d7bc7be3d7d35791362648f77ce3892c3a4e9e577f6bf4294fab85eb5249758f432db560ab1cfd0d54f161ed354517c166d825e24ff436bbe2f7c7f7df524c0b56c2d78c975c240715c514673d7c7a4c55272b374d4f92957a4b4691315409afacb1edceecbc8a392091b066014fa30d4b002f7d62e250ded885e04d0adeb27081f76818619dc28deb8dee8f8b12c669eeb2956221cf2a6cf002074ef7ed6e54fd553d7c0d7c3dc581223b591579977e29c10cc1b8d4e10d11800769479880a77c98d05f5c40cb08e227ee032fd913c7edc95824a4871d870e1d2f83b1a188d1bdcaeda9178a8ab7705174cdede7a8ab2875c4cbd7b8d09816a56261bfe0c1858488f46a6df10f3e746771eb132aab917919130f2fc6491099cc8f21ec215c43bb1cf27a72f8f5f3b8c0c68607454f7093e9ea8a8d3bf2ec3f8ec41643dfe6d71b03b232f9,
+PLAINTEXT = 5c89be46ad8d96212974405eb535b111ce16bccf4ac0e304ed1391b38919eeeb181ee1271990d49c83fc64c4003dd28d0e372b2817a63c386858366c98edccf7878856baafa4cf9442477aa6803f5b8b28fdaacf303393d6935b89e7ba208251018204d5f19e2e90ec33bfb53e153c3de63560e861b9d2b91602ca83d48c059ef1ec905abc77269035a99ec737bdf0ac2f37afe9e92b96b28cb61d83812965afab92192d95f838ac032db2471612f6641b6964a96467c9e78c92cfca2cb74824c515388fde6561345a0233a2736580eb4fb9a0a2274f74721a89a6dda01e64331c16d007283f5d69275d79949a510b338b76478a3663a4f12edeb513bc63383e,
+
+TEST = 9,
+P = d641dea553504d3fe4e0d3c09fe85ba7f6abae764e806b4cbb16066d8d02e2d120dd6f577380a0bca633925988b5ef9f0275f166aee80aa9faeca7042c4b844b63943d2e7338dca0795cba35d1ca4c9e87120d9ed67224c0012111c572eae504c002069eeb5117a603fa4ec6429a166bedfcfc128aef34e01e6236db4366958f,
+Q = e281cd0213be9faa9ec6024ce0f5a17c1a56f436301f50e52fd7e74ed78127572bc0dba97c580627e4d4160cdd7ceeb9c4dc73a9e360aea24375892aa9c59869aff915f1ee51a7c4736ff4204d7a18187253c443c08c88e60a1acfc1a65554e4fae8622d79af287d2513502f04e5e5a59ebd7559690f1428686e3e1ac7d0253f,
+LP = d641dea553504d3fe4e0d3c09fe85ba7f6abae764e806b4cbb16066d8d02e2d120dd6f577380a0bca633925988b5ef9f0275f166aee80aa9faeca7042c4b844b63943d2e7338dca0795cba35d1ca4c9e87120d9ed67224c0012111c572eae504c002069eeb5117a603fa4ec6429a166bedfcfc128aef34e01e6236db4366958e,
+LQ = e281cd0213be9faa9ec6024ce0f5a17c1a56f436301f50e52fd7e74ed78127572bc0dba97c580627e4d4160cdd7ceeb9c4dc73a9e360aea24375892aa9c59869aff915f1ee51a7c4736ff4204d7a18187253c443c08c88e60a1acfc1a65554e4fae8622d79af287d2513502f04e5e5a59ebd7559690f1428686e3e1ac7d0253e,
+MP = 457dbda066617c8fc8608a46f0fd203962e2e4ec04d53ecf39a0aa696e5a6ea272fe7d5830ef7ca77dae26282d0cb51a95651d50e37d8418af59057ccfaeee310d7e25257622cbaf12ccf5e8d42be8abfdb9f67a88e98d2d3581bb283917d6764ed12e091acc929a5a60eefcad0d0db61cd161038d046df59109e57b65dc107e,
+MQ = 990af7a7772ec876efd2320677034c33c87f9288ebaea483332517a2725dc1cecb89c19739b83dd46e948fa617285f798aeeb7518330cdf331caaded45de73383c3ee64f6f6221802bd6776d51c3b8d472c3c93063097656de260486938abf66936946926e971a9a172e48de6517461a191a78607c9d696fc61e92ef5fbe7df2,
+CIPHERTEXT = 77a66f1fc19da5558c10d5b0090f6218e8c9412719715dcb13da7338a4fca30beb39f16a43fb79954eece430c0d08c67083ed6793b54b5a2c2eb5df8d103d268026264a725eec1204338442dad95863a5a2da1de9d588f6e7e7de871d2ea8057d7bed8a4e90a5a987639ded89ca6ddc4820589a6561abcafa3d2b8136d7dcd7df695eaf50b28b826256b05c960cf62117c3d28c1dd4d09eb51510e6aa8292cc0f0aa398c16bf843097df30533d7ae9444dec39a73fe1771b3b19cfe2bc29b7eeb2e3d3a5cc905790924cc527786f9ee9733438ffe6a672df6d3b64f599108f5ba7f5ffb9326d14e406812cffde1d843891f909996d067a27765d42985d7c8bdaa5f29d4d1b32a1150dcdc718929e87dd3d9b138793ce88632af8b183527575f47d3fb96e5a1c8639d135f37aa2eef1668fa0bab0ef81522c56e8c3eb078396ecd7fb50069749be734a5ec32aa835c957c3d5cc076ccdc6bc35038b8843baa5d0ea299df8da997b74a29abf12cc42f6ed0466cd675ccdd765c76194faf517cebf664438e75e8fe65612e0f7ea65a338fedd771432ebee946894c7d9780bcee75c3530bbf09355b6e25bbf6d6ecdd40ebc9178079546437abd5431d52e6ff94bd38432f7b1a038e1e8ac476f6b127a3dd6a48badd451d5efc70b0f4f8d8c6fb79a580181f55b91e746a2f55206545d32063994db54106abfc0afc3d78925c7e00f,
+PLAINTEXT = 268e5891f8675e5ab519b3f6a5243446e94d3d0d9e7f398478e3e206fd2cd5582524ed8c560ca32090af5ef0b94a0e9f8de923b47e59fb7263c431e225fa45724b6a11f2f36ee463b4c2198659d2082679f836144d5ab1570eade85dcb9586bf0845fc1506787bb5d1d42551ee02f23e6d9bf3f317a4123aaa3f856bdf07af7a183244777e81237e095387de3a7d98e6e988be6c0c6d464a77f62ddcfa829bbd267377e4500b078d40d664aa24a2e4563c76268c3975de483be3687e27a18694c63d5d09687c9be614b81587573cf6f789534fd478435738494ebfb8ee4ec6d1410d1d129d2e04aaccf30d0969376aa66a0455de3cf3e7c56c179ca78c1dfc7e,
diff --git a/testVectors/paillier/encrypt.txt b/testVectors/paillier/encrypt.txt
new file mode 100644
index 0000000..a929e31
--- /dev/null
+++ b/testVectors/paillier/encrypt.txt
@@ -0,0 +1,87 @@
+TEST = 0,
+N = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a71,
+G = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a72,
+R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d789a7e48f97b19a6345ef330020d2b463370479e34e501b976a55fea49811ea883e978ae101b677f5bf85059a26da7a5659be2067d4c1a23da3f6180f6772611227152344df20b3fbaab21c5e44f6ecf58caeddf3cbd61c5421d60c1f5a830271d57834e258f9d31a279b691350134714dbc6ed40eddbc6a9b37df729ac919b91a6b6964106b0a901b5b6cc8e2d8cfe2e54bac731ab5db46f19933a3b5a20c794fa716c69323dabca2fe161560ac3daef333fb7d4fce5abbfb24993bdaf049745b4f18e96c00dddd2c667bb7ec54f005b3ea12f7a6cfc43405a91b61b8d63585b29cd0f5cb97e497405e9dee3d8e04e736ca918ddebd1c5b89f462281e3702,
+PLAINTEXT = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002,
+CIPHERTEXT = 17cc5e81709f423f7d8495bd1067e4ca508775400e082f151381f4fe382f7d70b8fe1a33d1b59252c7813bf04c0cf3cd3e8ae66739319bdb152eac1b85fb8ce7e764c7376cebec6d973e0585818c319e0ad23abe9ca45c003bd1affda99ddd09b5af1469d4a526fa00eb9165e16fc9b6dd34f3f7997f39c000ff47424962513e72877cb12260c10eb540dced8b2e604dcadabcea1a150f4813036aab0dabb1658d11bd43faa125c5f1a7635b83c7c5ff110734344292cfba049e15fc4c54128fbeb5b7b0392d5456d578af190da2c5231541992c7b98c33871796b6e7f9fdb6138d352e6338fdf34d661145f8e0a89bd04e43a64eddb6c7ea66113ebd13588d5b1fce74861526e5b520e48c45c4de3356985dae717772cd91d84fe8c0642906736145b9a840b5d9e7c2895e32a8dc6d159784daf1066aef5d137a2547737bfd0cbbc54a4416fd164114997f1b13c2a30de7522ca2c4824886c6985dc0b3811ba69b8f749411d66957dd2a0d5afcd89f309d2e1936302af1209cbea66f70e30b1d6906728e49f39dc66fc88f9bf35987522d91adeb61f478f4f72c058425528aa6e2867390acad6d3bb3ea102d3ec044d7f157f9349f02260fb197ed69dc167ca6882007c951e0d8e78820cbe7242ad8ff4a8ba69511db0f6ce607263ecacf60c15befa323e753e85c8e1890b5b288555612139868222d481418f372556eaa9f7,
+RESULT = 0,
+
+TEST = 1,
+N = c00c772067caf42abcc2a403c269b198c8052169bc7464505809d30c66cad8f97fc2e6872e4762a0e7e62fd421dc9d0f5e949409528d4bc173378fcc7a4f7e44bd7a950fea1e29c01b0b19a51b8528adaa42d5b1cb57c07e0bbdfc7ffe080c69f7649d428dcb29a72e6be50d002f0ffc07fecf440857f38a2d962475869655b9357ab0fc7f8338758bfcb9ccdbe69dbe8a61d62908e4ee6b692a23c650e83a4959619bf965c64eabec783741c5231d5c7a07da5e92a5f4daa372a7011b1b167356e7d5d52b253b5e392ab602aa7376561eab3098f5d0175f6b7bda3718c593caab71fc023c74505bcc1ad92ca5dbb767ba2f737a7ed949e3cd04ba8c3c9022e1,
+G = c00c772067caf42abcc2a403c269b198c8052169bc7464505809d30c66cad8f97fc2e6872e4762a0e7e62fd421dc9d0f5e949409528d4bc173378fcc7a4f7e44bd7a950fea1e29c01b0b19a51b8528adaa42d5b1cb57c07e0bbdfc7ffe080c69f7649d428dcb29a72e6be50d002f0ffc07fecf440857f38a2d962475869655b9357ab0fc7f8338758bfcb9ccdbe69dbe8a61d62908e4ee6b692a23c650e83a4959619bf965c64eabec783741c5231d5c7a07da5e92a5f4daa372a7011b1b167356e7d5d52b253b5e392ab602aa7376561eab3098f5d0175f6b7bda3718c593caab71fc023c74505bcc1ad92ca5dbb767ba2f737a7ed949e3cd04ba8c3c9022e2,
+R = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b500d1306edcf7fbe21d2f38b04970634ef97e87200a74f4c8f7bdac61befee1bcd398d75849403f09b02417341b51dbd0afc8167d9502b16a9a5648fa2873d40d10f40d62846cc522ff7ae12e0c3b667d7495d0e77b0e7fb4336ac3aa8427039aa2bd8a31b47ffaf276cb94fb97edf20609a812ea8e68fa0215c6f9c8d972b1770e454efb0d033dbce96dff65200898a1b82a416fa588acf6560fcdb2c9fbf5f9bdbe0c91f3401c6aa3db2979814342438e451402687867e2e0aa28a476528d9ab400c20358f7196b43aec8f2d5ead6025667e834021f9b1099427f7e5dcc174a388f8b417d763160cff4ea84c58c8bf50c5236d17833864c03f677bd399c7f,
+PLAINTEXT = 703bb2fb3713fb95d6d4a880765fe0ef57ed6c4bd17ceea07d4e8fd4aa2f16214dcca373a93a61775b76940a67da60e77a22351c9af8b71e63a519d66e561ec8501eef4c8fd7adcd9e12e0f6ed99ae970b617b679012734de1033843d18171faa6db85bac46d166893add7dd20918685da713a3dc27d9dc94942ca313147a4dbb56af0ce8d415c249ae7a233effc60600fa685ee266a315b3505429d18448b5260b4e59cf374644a6ff5629ceac5f7137ebdba05989737e0aa6fb4b5bc604147a5cc23c43e5e0c1e1424567dd34ffe704e3e61c7b3a81f26ad1609896f8ad593414f08fb640bd5b19ce35b1f63d87ec4d7c9253c21d462d62eb346da6a2c51b6,
+CIPHERTEXT = 6d267ecd8ae31833eaa38d73636cf032fbd9cf4d97ecf3db12d09224d773c3e4690f98f608c175fbf810956086eb7235b893203aa693bdaaf855e4b63c34025006fe4d032d3ba9dfa0b374b6c6713f0343c887d2f5ed5f632016ed70282600440dc1d496c63a5956d140745082fe2dc6c83d77fc037d36fecde1ce68c8e88bcdfc32729277ab8b88119cfec2ba4362e96dcc7c2af5c11986dd32aab61759fc9a736858ee471317c7e94d70917e948ee0012b52394f4584f5e26160c88259b42f0f01cad5675143fde2e81b46f0d302b7c32591b543d747eec5c192483e0d35211ada8abbf191ce7ec5aa5eacb420d52a8c8a01c542900e7891adb366068245b26e406b2495e3b5bd5ff6c3758703b7ca3c9957e9b226cfaf76ba39e884d440e2287b59d59d771da187762d3b5513ce4afdeb446abc59e96239a55b19c92bcb5c52bb5a81e2026718d3f5e9263f1c145538003e9123624b5a985982fbfd55cd642c5df2a968df3b776aab1c7935af5ef2ab901abd2272ba9f7078857aa0cdd7f0de12cfa6c9ed32c8df5216aa17d433143e636faa3996cb5b0da5a8e043cf04e556aba211e0d82aae942be6d86ce523289dbbd3ed47af68910ae1cbf7c45acc1c17a2c13db0ca7f7fa1c863dceef3e80e98dbe43ab37f67ec1781d5ec63ec27226c87416d5c417b8eeaef217e62bb8f5fdf2a1b0c7565520ad32fe0bef145d664,
+RESULT = 0,
+
+TEST = 2,
+N = b88f2b8924501463af224d3df70407db8b405ecd074e0144bd87ca4fc02b02b6e1778831d1819fe095a804a802d6ece44b5793ea5b65c1a9a00d36d643fa47584c8626fc3f75bbaf120e319da8c6357c9c0608cebbf5281e36a57069069da6874f01e0dcf276e01a49c04e96cff4de890dbb306d017fb774e0842b0b611a2908b5513ecf502a6deacfbed4d0dcd406b3a225bc1a3f54439b963f4d7dae3d7af4e4234a489bb9c5a4bf1331293793805de0c8364663d79b84c3f7b3235ef241a727f65a9f57f74652b90e924651178a4d47cf21db59859fa10a681ddf4c3aad8faa49edef1d379a1f659786b08b15e16200930ec97111e0280a1d32fa9352d0cf,
+G = b88f2b8924501463af224d3df70407db8b405ecd074e0144bd87ca4fc02b02b6e1778831d1819fe095a804a802d6ece44b5793ea5b65c1a9a00d36d643fa47584c8626fc3f75bbaf120e319da8c6357c9c0608cebbf5281e36a57069069da6874f01e0dcf276e01a49c04e96cff4de890dbb306d017fb774e0842b0b611a2908b5513ecf502a6deacfbed4d0dcd406b3a225bc1a3f54439b963f4d7dae3d7af4e4234a489bb9c5a4bf1331293793805de0c8364663d79b84c3f7b3235ef241a727f65a9f57f74652b90e924651178a4d47cf21db59859fa10a681ddf4c3aad8faa49edef1d379a1f659786b08b15e16200930ec97111e0280a1d32fa9352d0d0,
+R = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008457e1892274e4f5a445fa44ed45d789e60c113baeda9178ecc22f2a1b69c7d1301121eb61e505ccef5f8878d4be3c7f1a6d3aca983a30675a1fcc32749df55fe4e807199b42408035c04088a70512fefc630209a427c174ceb9b96f76e859d05ba8545fff0d416b1f65d5860c57169450dc34749116e9c97300cc7753d83777e93f973f19ce7fb8eb35ea46a656b5f7ee0d59cf19ef18ea6c2ad7563e036f7af4ebcdd48c4eb1ec65ff0c61a28466aed67b94447574a09699fd11ff1f544685e154e3669c117261acdecebcda820adcf404f00b419a8257a121f72e1b934d0f40fb6af7c42f84886b0ccca12c4326a5471bd548b1f4c278f8fd31b5fd68d5d,
+PLAINTEXT = 1e4591f66d27fa2b4b231a895f1767de67ab3784dc221b6a7fa919b235b56b496d4d0e2f2b07f7d19031c6978eb117545517d3566f14dc8fb94129f1b66c594bef4ddda3f942cfa5fd4d4e33b5f3d2451ad50dd3055e7545fbb4750856777de60dfbf0f2dd790695676ea1db0bb91bfd02dd82b04ef860f9d35ae045699c2f6f6249d413536d5d85689f5bc566083944de48e13e3ea70de5088e71eeb7d610faa20584f71e2b84fbacec93a59775aab4449534f3bf552c82207d0c3f8a6b4c02ff3c1e53e23a2565a8e01c286c15ad36a071ea02b4d6c288634612d7aa1e6ababe78a6c2bfb59e81fed6597cb2c2bb8bf5a5f7767f82664de42bbc1d471cb61e,
+CIPHERTEXT = 46298b203d6014f97dfef8ba606c4fa264ca27177729b23117db2ee9900aa63d80f69bff90ed31dee7dd430575ad9487dab9954ed21c18134908b7a5c2e74602aeffe1e507aa7cc09fbb470dd41c69e911e1387313368f752d4ffa52b1333bed47e6777da5c0722bd44f58c65ba489e73b87c326e332a33761a9e2f4849e934188e074d5836815e5e2bfb5a8a410394e6bd141508faf6cf2e4b9f32572f7c3c11ca4bc749d1d2e85bf701ecceda41b885fe86e2cb405314bf0af36c8495a3ad0c976e6777e937b4dfe92e0abb0c813cd4211a9e4fa3fc73593fb9a9cc81b38f1ebb0941ab6886dbc5dd7b47a9132098f9390eea93df4dd08d4cff5c03344dd9e241ddff0f116501070d2f8c24b0ed388643e66ef8b8a25104471f9aab840a121122da0af772e5b044a54149f1e492eaebe4f01e6dafc4be740daae2951de46ad7ecff71fcfe504cfbda7b187dcb2bb6ad12b6a4248dfe8c9d4e59b60c08695dfae9593f450b33b8242f84b92ec3d35c66aab8260005a6194cf6f2f8b125a15aa17ae38dd3832bc6c04bc834558104b0c3da2ef7a92817a3ecdc2542e14569189f28d001bd9073217efabec433622b3dc00f7c582d6a2d240224d2c684f3e7f3455d3bb7c9641fdccecb05fbc37813f7422cf30305c3b262550c841d5ea22494dea60b10553c4cb3143c31714de54c53b0c576ca4082daaf84a82e1bdc7a912e1,
+RESULT = 0,
+
+TEST = 3,
+N = b393cadc6c0911cf5183b8f372d6131807ba3594ebe307afb90de7151dbb82b50eefe54bcba9c7fe0e3c756474331d14d48d613ebe0b876686ffd8fb1ccddfd137cefdf23c6bd34fe94acab43a4c56e7c72205b6c1f0ba4c0841967841d0f539178fd908d6418aefce048c430243ca73b5d3f418a3f3df1f6060215aa55a0a084103c312dedf5d802a03b107f3eba961a5ef42909154779980af161c101311118b75a3886b83c1faa0b5dbbc16434c1f53d31a8828c6c7cc0e4943414fb0d7572d3dd984980f6402530f66d846c5c79f4940c14b3be5a4b14203763b0b12068be3614fee0d1323d198981bb793bb988527aede5d31ac70cd209e59411f89501d,
+G = b393cadc6c0911cf5183b8f372d6131807ba3594ebe307afb90de7151dbb82b50eefe54bcba9c7fe0e3c756474331d14d48d613ebe0b876686ffd8fb1ccddfd137cefdf23c6bd34fe94acab43a4c56e7c72205b6c1f0ba4c0841967841d0f539178fd908d6418aefce048c430243ca73b5d3f418a3f3df1f6060215aa55a0a084103c312dedf5d802a03b107f3eba961a5ef42909154779980af161c101311118b75a3886b83c1faa0b5dbbc16434c1f53d31a8828c6c7cc0e4943414fb0d7572d3dd984980f6402530f66d846c5c79f4940c14b3be5a4b14203763b0b12068be3614fee0d1323d198981bb793bb988527aede5d31ac70cd209e59411f89501e,
+R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f101d68fa27f270fee23d3f91b4924967d67315fbb7884276c8fd22e93ba20942d330efe51760e712f0b106aed2da66d7bddd3023a3eeb41438789d8ef1bc1a835d8e3eaf25637e655de2d27dde76ed6316a54f33609c23b279986e19945db2b3335596d72be6f7a495cf21f3db428afe55612fb5e559394be46771fb5ba01680e7c57d25f4fd988baf686ef4816c65c95d048a2d49d2a3ad63101a703646ff14f241515b43599efac3a2fc747c22367e5386e9ba752d6cffd3b33387ce92f0458465d5aaf21d0d0ee29643a8ede821ba0ef5f663099e0120ea38e3775447bb3147d0ade2c4a756267e23c4f2a9d546c0610bf59237b220fef899c627fd4c08,
+PLAINTEXT = 17f1ded0f3ae2a32043aa43fba74c2f411f29256893a5ed7b35fd53b6883bd0dedd187d6fc1a0c4938874566169ba056adcb39839be44541ca3919c8fc18d6d556fb66f01ec24478fdbf05154b06516428f13fd35aeaff34aa4daa38b7e3df9936b5eaee54ca606a18f208cd0bfdd1d67f4427e00f993985797633081a32dec42cbaa202cf5452aa02872bd24b459e8a0e621837df94cd276d243c7f05ebbe1c977d70d00de110350f764d62d838a20e1b8c091c33dbc2af28dd4a565c7e412fb9da01446f97ef2255b4f0b7900824678057771ef2c8f6b898e837981a6e8cad53d2f46d023a1f87920d3193b7be44ed80a3b9a60c460e3246dbcb6cb6f97b46,
+CIPHERTEXT = 179dd45c96b791abe3f4df3758d36598d1f4979c47f0934d7b9af92a7e1389581b099a07770903c501ff312c27ab21de99c36c3454f3024274537ab25a8940562e1e19a1320a9a44e9bd64ca2e0fdd8147c8ad2d9934054a4d57be0be160669f6a114ba5703bd25c2e34763b51b26acd9ce73bd733021347e29f63788de7adb29c24bd1343622759dc6cf275eb9022ce5997f03ae7a6d9eea411b2eb63bf4f683ebbf677cb46f1f1115f457f3dd300b6a2cf28af7c6d0cd36b385e86533e4b316e7fe089dfa74e51ef8e32e5dbc59908be6cf6f169f93494b79af4c198e1b39c70fde35c1713285d06d20c5e6fae52692e1413e4a35c03763071b4522578576414be94e85f4dca12b8ab3c3650b3485551999328992493bdb77df5bf1b16d7fb76c09027df453bb8c0e0c0226b76779b8f785f89efed716abc67bacf5a9dd732343f279708ec90a8fe521674cccb01aef3a0f6ed0e240018350dd4fae7653223d71237df42c74b36c231d1da0fb28e4608f9f45329e4b57f3a8510f52b11cc5a8dcbc7db06e2b3c678cea8bd7aeed2501b361a20d3a5307a305048a2818c3f06e2b281c026d84ebc017b6893eb2aea2e6f20dc3358aeb0997e321f7bc6c5aa72fe7f025c59bd22a390dc8fd3fd2ff76b67a529906a5664d2034d8316ffce95fd08b21d266be7cc5cef93881b20e989064821cc0b795e354b213d91cac329b8c9,
+RESULT = 0,
+
+TEST = 4,
+N = c4ef4291a72a5ac2eca50745f2b000fb78b99dcc38637dca985cc29ed078b892399134f213850ea2ade373c9ca0b85f507cc3b5e2ecbabd54209f94328823de58708d69cebef56da0f3b9e8652d3e6bc541b9f243064e532a568d258c3d4562b98a94d20f4a5cf954d7279e41bf14197b67b64e63918714094141ac927e1a88582615c33a8921194bd99513ddbd4711f2febbe19d0bc77a7b85da3be7595de28e36d67ca7656429fe09f3db6ff91af075bb0df46cf9efbfb7e3631dabf1a633c517c178fe582cda63d94e57afee4365ba9f37d0b80dadc6b42a3736962e52d879a19c19bfaca558d18e616e5712fae2dafee6fbecb2c905545bdc11696d05699,
+G = c4ef4291a72a5ac2eca50745f2b000fb78b99dcc38637dca985cc29ed078b892399134f213850ea2ade373c9ca0b85f507cc3b5e2ecbabd54209f94328823de58708d69cebef56da0f3b9e8652d3e6bc541b9f243064e532a568d258c3d4562b98a94d20f4a5cf954d7279e41bf14197b67b64e63918714094141ac927e1a88582615c33a8921194bd99513ddbd4711f2febbe19d0bc77a7b85da3be7595de28e36d67ca7656429fe09f3db6ff91af075bb0df46cf9efbfb7e3631dabf1a633c517c178fe582cda63d94e57afee4365ba9f37d0b80dadc6b42a3736962e52d879a19c19bfaca558d18e616e5712fae2dafee6fbecb2c905545bdc11696d0569a,
+R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005662218ee3842056003265bab7cc814e1b726ee99dd3b9ec5c40aa839893bf35fec4f23477e08ae0bce9bb74fc5c06790949d48de3455ae3bb64ecbe9e8af23c284daa9d9324cb6d85c3ae575a02a96ba6b1267f9fd92a372bd252c6ba9c605a0d1411a8f0e0c2c8f41f8890157bf9f6f7a5489c25fb00a7d281da25da2af7c32a95312d34406a07a19701c368ab4eeb7f85cbaafffe992ce726663e217fce03aed09872d8613bddbf20a45c76a61727876862b0dbb731ea39bc19d39e7a5d2b4b03fad5e563744707f06c57b91691db92bee3a89d1a36bf3618b0fa5ec2e169a12e4ba11b39848b4bce6f87c3435d9a7a7c7a989cc333c8556625f09de4c4d0,
+PLAINTEXT = 0dd0bb78553bbd96f6abcdeb1597c9c5c96cd9013b580ab890dbc13be6938f589c62bf8be1f5e3184e2fc1c5a6a6a52993d13ae830b6b974cb54cb7606e7972e2481fc5c6cb33f1464cac9f8a6686f5938fa88a6fd514ecf3c63b26056f3d0bd80fb7b44eadfde5471001084767050e6cfbc0f4e5ef3c626c433a687a2749210aa8e6376f92c7c8de68c74a965c1b9c5d2e66dd83ad4d1a8b6378eb6f296734717577acfe41376f78f7b1b559969aeb277bb22762f0f7fd62cd3ce5c7b5003037eb2b3026f24d8cf5b96bc8b4bf9b680aed0d9ca9ae0a82001b75de8fe763e7c97b794c5110c157b0be02ed39349cdf87e6849da51c46aca93f2e37216e4e8a7,
+CIPHERTEXT = 74ad2e38cb3d19b3f2865863bef7dba997728039292029b0f73810b8125a46d6830f19b1fe784e53e4e64a3fa9175086676952f72299043032c421663485a5918c1d3adbaba58da3c27a5b872704e8a5f3c8e715b9904cb5bb29a6ad2f586633e2011f25bfa17dddc595087982deb4ce425dfa6512db0f1ca20cf0f71a3474cd0f85075484fdcc07b74fc6ddee33c37fed72de3b02896d230293a4411bef3524ac1b94a93479222816c7da214df9a5230f8c6acb8751e920dcd438a542c5567bc9e71f33713b4382ac57847e4cdb10c3e441a3ef8917db3d42fe84c53eea637078209f7392251c55958ff1a6c538334e3ccfa2573bb9e4e57f648a81f765404e282c3327002c6386f9ab5ae5db57e770721df812436d414ce8f022a29fae8ed135309346df3f407cff9b55499ae5d0ce72431ad68a0c4b899cb7da44ae2184416bc26eef0d220bc2345bf49bff4d4be960167db05b798badee84e6beba5f41a643d858b7922b1d3137174f7a05f7fed14f61e0b567b196115420a089a76886a42a255b10dd08ef121452cced45670adadc8d7b85227800d79e84f9532ccccd40ceeabc461c780067e296e78f7426cc3e558e3a8d65ce38486e961dc34bb342c88beb16440f9fd5c29d40d4a0006114df0a86e427543590a983ac2c1d96188e3e897eeb47458ba60575c6e31ec10d6ca2e0339eb3c553fc69d3eb3f2efba9b5ab,
+RESULT = 0,
+
+TEST = 5,
+N = af16ac873ae2d5c326ea813a65e11e1de536ad77a2a233484f30add683ad0eab5492f77231c59685e837ee82cd275edfba3cfaba2cb71541813723608eaab5fae091dca6c3b7b7dcd3374662dc15bd38b30465dcccadf654d628d932953c2ea2a8591012d0cfc6a0c6a3e4ed0c873b0a1a5d2c7d01ea80d7e3b15177a0f23309cbfa3f3ba95d6ac192e22b69a1ce1640cb0e3b504018742578c23f500024ff7c611ec75db05af47a6481ca90061292ab1db3cccbfdafb21fbec45a3ae35205fc8586c610cb9963862886c6fa63acd95ab3d712b24484bbad6b11e2596814bbf3c7783004fd002566ce145d739525737a2a7ba815de7b0f43fa0caffd1723e443,
+G = af16ac873ae2d5c326ea813a65e11e1de536ad77a2a233484f30add683ad0eab5492f77231c59685e837ee82cd275edfba3cfaba2cb71541813723608eaab5fae091dca6c3b7b7dcd3374662dc15bd38b30465dcccadf654d628d932953c2ea2a8591012d0cfc6a0c6a3e4ed0c873b0a1a5d2c7d01ea80d7e3b15177a0f23309cbfa3f3ba95d6ac192e22b69a1ce1640cb0e3b504018742578c23f500024ff7c611ec75db05af47a6481ca90061292ab1db3cccbfdafb21fbec45a3ae35205fc8586c610cb9963862886c6fa63acd95ab3d712b24484bbad6b11e2596814bbf3c7783004fd002566ce145d739525737a2a7ba815de7b0f43fa0caffd1723e444,
+R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bd59f9cefccea9ba99416bc302660705069758b2d9b9d86fc3fe79154dd672251dff3ce8c33da32c550af5ade677fea67d0f41babdba66da6d0a860079b93c1928d53bdeee7d24ae06a2be75f96863d98bdf8012388504bf3a58778d4287d89bee710be545231d8b3922f39c75e7b5eb49f78bb49d685994b6c251dc7b7355c4771e9917b963a6b67154b0d52b129c9a41798036c6357a063dc84cd7aade0ea7fcbab9be3feea730561444e2729a997f29f7cf1e82adb21c77d1d9f78af17118cdd812eb2c20d59698c5836216634f142a26721613ebb645e26d81ff4b56a41b1650c8ce9bf78bf696a3622a9e99e3ffeca235445dfb06e5d5edf557294e663,
+PLAINTEXT = 14ca9f2915b9ef4ef05837931ec6db5d949f9d0c4cbd58bfe184156f05663303d0307fdbb3c5a3ac1cf0cff15d630bd5b224289768f695805c94dd059517b8c2897f07aa96ae4828579665c0fa585b7567a15e2cd3f3dd5963b2681f1b6183649958c27f62e48d9a4e93e5c7af5d3341e0784eacae4c9426c07d5838fdbe687cbb2a568954a6c05e103e16bd940e7f9921859ea2dfedfddd2387ea10e1b86b01190ed69df80d24e2e297e2653648c6873a3dede6f7f742bd959509ab2c0611d3dede615c49668cc7987a29a7d5ccf36c8e9739e4de3ed4db48c0ad37d33b580a7ed86085a5ec8776bbb0c217d3210763584f7d5d2cb1e20601e49c3c98f5f5d2,
+CIPHERTEXT = 57ea33919d1c89883e1bc7c7f91e3c31ecbace3021bb5c19c2bd9689b98a077a14e4c930b63d7a67a9d60e1e628321f70d265eeed777b341ab595bfbc90c1d0caf2bfa659f04a9d82dd4e6bbf3aee91fc39753b493321a4b5812cbc5daefa4fe156a3ac362d40af8f3310b72e52e222f95bab34aff443664e4971667dd503eb6c610c589d0d484048f943900a748ee89e4fe06a5c879b76afcd977c9887c59862db7a850d6efe8b258762f0376cc9f8b5b6e870a309a7c1d5470754e2e854fa2786b2ba21bf4391e1b9b976fd574f1a1582177cee7febd6361b678de5d3454b6ef37473a1fbdaf993de233f28537b7866373739b381bccf2d3ca718d4a72f167a1dd58aae50641336b2fd816df9636c542ae4e6e8b4796b4a1ea1019b7d7898346c3438a8a83daf1d9023ec17170b30989a4c459287743dcc609813ef87d29d04d0acea8f332119dcc50b94efd61bae89028b4c8c96ecd81beab56fad523c7c5deb8cdfb3581d7fd100633365b5d2edd4d75f06b5419b33962fdd743b11ee449085d7cb12ab6a9ab43fb01b5382ef6c463d20626cc0d3a006ee1db13aa77b9b952bb01d7d13ef10e5bf2994647a69b4f06643bbbf9d4ac5085ae7fcc5cfe3c66c970a5f280bdcefbd9a759d364b7681cd2fcff0b84335f5ad4a06a24ebdb1cb26abfa1248458f8c72501826e574800627ee3e999db563beb847a89507fb5ee50,
+RESULT = 0,
+
+TEST = 6,
+N = b8cf06d4fbea3d487a92eee3659b4c95e0956c2bbd5ecc0211eb164cbbcb10e69522f95ddf64ede505482f42a47759234bc6e7a164f7156e48f1d9126c4cef37d43cf3e3a71ed05a676a55ada136606da2194d4d1a141a16bb29212aed27aeccb63d00d8367436a66fa52034bd3ac498aa0fea56c9ae53f44a45779a3148203a61c89273cd2b3b15129bac14cf6559c49df8ef83dc4c85f1074a0768385884ab58a8b1313b278beb036112ba56e1a0a709dcfdc7510a3efca2d47f55daa4d50db0c37eefefcf5b9f5b73a48ec42911d0e314560a681945564fab924d10c6b0c0ee1a50beb42d38978da09c2f2e4d317500ec91e324b884e8449bc189964df78f,
+G = b8cf06d4fbea3d487a92eee3659b4c95e0956c2bbd5ecc0211eb164cbbcb10e69522f95ddf64ede505482f42a47759234bc6e7a164f7156e48f1d9126c4cef37d43cf3e3a71ed05a676a55ada136606da2194d4d1a141a16bb29212aed27aeccb63d00d8367436a66fa52034bd3ac498aa0fea56c9ae53f44a45779a3148203a61c89273cd2b3b15129bac14cf6559c49df8ef83dc4c85f1074a0768385884ab58a8b1313b278beb036112ba56e1a0a709dcfdc7510a3efca2d47f55daa4d50db0c37eefefcf5b9f5b73a48ec42911d0e314560a681945564fab924d10c6b0c0ee1a50beb42d38978da09c2f2e4d317500ec91e324b884e8449bc189964df790,
+R = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9cf6e1919b58840a4072ce635a2dbc2e46a3b765f46ca7620d72bf137ce2b831ac91c4e73c06708bfbc105f60a50937c279292e05a307544a2e9eaa83cf847c8366b3279d12c928910e121978f0c93d7a670e18b65f3cd6936f58f44287419a989c377daa7df92721c82c0f4e92e311c73a29c93cef65200f67d9b9eff962085737a3ff96fa20508e560240e54c6d77a7905c3b3cd13b10e60f4bd00fc21cc75fa72bf0c7175c198bb2250dab3e6a497128c31f99b42243b7b4ed4c862b6b6e8b9bc7f8f9ac1103f4e0e303f44b860d084db4a93eec85c186d5ed0b29f39153b6a827f607c5271d4ad1378c10e3034097a515d2613e7fb9d7cdef6a5939687a,
+PLAINTEXT = 6d4afb41b659124e5fd9e1c78a1aff756f63d29c068c82e3dc712ad16e1afa2b3e68fea890b231a2581a75110a39cc27907291949cba31a6c8c3c8adb02c02ae74a0b867ad99ccc8fa8b5f5c03e95ab375b756e5250da3746dd74fc18c110be3b9463f13b3195cf68314f122296c2c6feff221b720355cf91f7875c875d847f5c63f23550e2bed4de31daea0eb7c16507dc91349bb7749531aeee21f7d254f2fbb559cf30cf948e244343d2b726aa3fb48e63130e35e9f887e1d00420e7a4f1ec2f6a4c729b37d7ef88629edf2a14d60c58ff80860add2510e8618a106034718209f7e2148c5877d44ffc3e50c85edf411efd2ae17b480c183fbfc6291f91292,
+CIPHERTEXT = 020795fc41a1267d5ce0e1b60032ad764ac6719b8be8498e1d88f2986fe9c77d86136222790dbc671a1dab50f41f2676ac4e593474b25f4050d717c35dbde5bd39e8d465db751a4ac935b494a5fec2859e9cc67b6a5e79ad14e3458ff5595d74e1c10d7b1cb54bf95467815de852fb1fddd4df812964bdc22be405a28709052b703e52e0665e5f640525b48b44bba90271d83f53511b2f125cb48f985f31c82063443cc89ab35da7fbb00de5a6a119c83a6f3304e83c878a63c46fa802296a8e0aa6b117d115b5edd49bff18bac6106bb811f4df739b68f71c84e93a8930df98409e29ea44c59e62ce2fc5e2e68e149b5fab1f416926eba9235746782eb5a63effe6a4f35ac1df10e22f04d8a9a87176e563fd673d736b72024d0165709d1d933e409df505d7da5654eae25c17f4c880d707e733d434927a88378ef43d54c4b891a62e4375610c69831b840d170bba9dbeb31f94f7b4d7d27a518d9054981922b8efe11d2246a51ae09e6000d14d6cde2ab15a1dbeb200752bd6313fb13bcf948aa77f3b8791c2279c314e9cbca82613307e62a5515dad3ad35f2af933b8434116cdc32c746fb2607f7a31d18454e8423a8fd24ebc4128d60f23bd9196201ef100f1e27d82fad6291f0ebbcd208d8503ca177d1930ce2f13688e9806389ed695237985a89bb6e6f4a509e302e3e3ba59377eaf9dd085e169f07054e964861724,
+RESULT = 0,
+
+TEST = 7,
+N = d62fa41104581916f595817c831a63131aae85f542016402ee1ffd4e73ee681273eb79d2187aa4b5ccb488fca0340f60ec857599e3a24d44ca68e6901a674ac97a1775c98e51c4d5058f616f18a0846127a5f9a8f672b1d79b9edf0e70209b78e03048e35741452523e81c0b45cd78616cb24732f583c40ab32b9b425667c4dd02822a9ae2c0f0aa3240d3f148c7227d3d007684855504c4495d656afbdbae63d98fa69635ab86930bf1e4ea70a85c69966755803916db3b2f048a718828c5d4fa1175dfd711f3fd5fa70791e730859f6555f5a69a2d3a8e25ca02c67ef375cfeef05c83cff8ecf1894de60420ae99dd10e962f403e0fe5b0ca51947059b17f1,
+G = d62fa41104581916f595817c831a63131aae85f542016402ee1ffd4e73ee681273eb79d2187aa4b5ccb488fca0340f60ec857599e3a24d44ca68e6901a674ac97a1775c98e51c4d5058f616f18a0846127a5f9a8f672b1d79b9edf0e70209b78e03048e35741452523e81c0b45cd78616cb24732f583c40ab32b9b425667c4dd02822a9ae2c0f0aa3240d3f148c7227d3d007684855504c4495d656afbdbae63d98fa69635ab86930bf1e4ea70a85c69966755803916db3b2f048a718828c5d4fa1175dfd711f3fd5fa70791e730859f6555f5a69a2d3a8e25ca02c67ef375cfeef05c83cff8ecf1894de60420ae99dd10e962f403e0fe5b0ca51947059b17f2,
+R = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad4359f2122b712e8dfc0ae350a7357aa82cee22b0a323aa805d87416a7bba1fd1f663fe2d34f79f3d9ae46b7a57f4c2aa214c75bf5687dbac1d117586620b0beef494d407e03239bf54e00de3b37688f2ce9ef9bbe776405638eaffc295e6deffaeaeea7f7031ef349c3a94778d18f343822921638ec6ee0121573306d5984846374eca1736a9a727120dbbbb1a8cea907afa7390de9fbfa6492ab923f3e1e651f57cf58c708f8f61811516dd441f899454999da6ca8cfd402289dbd91b119fb913de2610af1c9c2368402402e4ca25f9ee2960c05076ac2f2e8751e1a6e2ad4432cc0703307e594df35f32db7156d8c65fd45b61c1db3ca9b88ddec53ba0d8,
+PLAINTEXT = d1b3b07d68a2f0947745f4a28f0487c7c86bccbde160c16c65f82a055c85fa67cbbac2e5934d02c0ff68f3d7fc52557ea5cf5436d1b36460739ed46dd89bfad4e5026af49491a3c5b84dfd560ea707517efa870c3e5e137637bd74f3c52e26af3270bfa2e9cf6c5d7d4b05b4317d99fd41ebd58133f03e6a9862f5275915398c7ba2f828a3829480e75e7dff8c811190a6831a0ff6b4899fb5b4f2a82d01dc8ba8f24c7d6c2321919b48b745706170c0ff37390b15eb3fad7b840102c7f85de99f91e2ded75ece345ea2a30eb37083f6276726dc55a4c8ffe4c5f295b260d721fe2d99343844dac27e7504b4ee9c9cf34e469f36da5a5c9152a8811ea26fed86,
+CIPHERTEXT = 1b8d12e3719703562135922063291fca86608a661dc21ed76fd4a439d6d30a13ca3f87ccc81c9f2a190e49d327bc7e485c7c6ed7dfcbecc4cff143778523a92ce903c1e314cca07603ec049d1c9fd1ba70cb00635354ff70ab9d0ca906a23edd7bf8965b5a44c169014aaa12955a10df9c383763f3140d5264eb0a2615a996b1016901b1c8a2e649f6b9ac1ab96b2378c6d46dec175e78c167f914c6cebd93f23efac8be11fb56f2aa598bff4111f0d05b7594b0ae7c5b7896b6b3f44019fa0fb292cee68ed90a87faa8279192e2f968746c58b7c9c16ccbd0efe41a07cf3f363fcec1e39a2b22378381c7659bb38d271583fd43777ef6d95bf1cceeee8a46f5e7255fd867a81f7c31636a3c6faf190b438f8edebdc0c30667724ab82af208541f80a871241118180ef745ccc4d8ac8875f7ed44180a3863a46d48862dad91f9c696a52e0734aae2424dd106b6adafaad5c0e1b8f79bd587db9efc375c5ea353050e40a660442592b0e4d107bb790373657dfdd5daeed17eac2405fb7d26316dd3e6b2ccc8d5f199beff346c05a49069c8a3b9128fb74053fd6417f295aadf6863d20a4ef25d58794628c5defd0f22900bdfd22a51dcaaa98b405875547de0a5426e35c82fec038c17896c36cc7cd97feca80414726d972428ecf62f11a18c5795217a4f02945006cc9b13e03e077c38f2fb053b90b40c9e006785f8096e0c6a,
+RESULT = 0,
+
+TEST = 8,
+N = fd7238b8971db7adff22fbe2e5e225be870f9c08130aeed7a5fd25dd824caf1bc60fcfc67fbd1987aa82eb2e9661ef1c935b8381b9188dd982c5fee402818ea1cf9d79273431ab226759d31009999bd015ef206951a88f0d1a451d54d8ae03bfd27926ee18a2e81857f1f9e125f0c3cd68384906f8ce828dde33732d3bb344df2be8afacaafee3a9cdff2f10c4763ab4a3642adbabbb5ebbac82ced1f045548ed616dd91fa7e312c4a3963a7753615db190e7e6452364b5f558b765c1161abe7a506ab07722b13797a68a5c8acbe2fb3a3d4b09bf83d3dd933d3500ed596fc51c12ffbb42a8d86edf4204d23a01b264939dcf9e138d76a499b1edb3f7de0bdd5,
+G = fd7238b8971db7adff22fbe2e5e225be870f9c08130aeed7a5fd25dd824caf1bc60fcfc67fbd1987aa82eb2e9661ef1c935b8381b9188dd982c5fee402818ea1cf9d79273431ab226759d31009999bd015ef206951a88f0d1a451d54d8ae03bfd27926ee18a2e81857f1f9e125f0c3cd68384906f8ce828dde33732d3bb344df2be8afacaafee3a9cdff2f10c4763ab4a3642adbabbb5ebbac82ced1f045548ed616dd91fa7e312c4a3963a7753615db190e7e6452364b5f558b765c1161abe7a506ab07722b13797a68a5c8acbe2fb3a3d4b09bf83d3dd933d3500ed596fc51c12ffbb42a8d86edf4204d23a01b264939dcf9e138d76a499b1edb3f7de0bdd6,
+R = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017c5a990f4cfa2bfd11d136d572603ddf4828d6b2541b609fe30cc8c7fe8febb8e815bd7d7fe6e02b59437584e7498e266602fd6ce090666fadf70504af9874d894de3a6415ffb151fd467f8029ea35dd59a92d8187b73a751cfdbf67fcc108c3f7515189d60b01359618038d4c1b46518cd10296c6b7e81e39b53150758c6f9902f938633e3d8d18da21c0280f9949fefe70e9b670512ba01f6fdce841a4213aaddbc3f3a78bc3ccfc20e7ad32f43f3582d4e87835ed9aad10e70217de0ebfec7c875ebb2dcc529ae55ae07363f951486f4bf07025d5c4769c0098a18985a97c0f6a18c3d30dea487ddd180d22c5b46977fd074d89384bf62172a9afed44d04,
+PLAINTEXT = 65c4fa90056c2b217d8d62826522cd50e57d75c400daeb3c2fda217abfa97a4f17dcb3bf191c8642967335082bd1f99ac23663a8f117f4353b7dba1b2d92f6b2f722b7e3c5958835d165c8b9e9dbfddae221b97ca1e68149ef181cfd0458d9bde71cab2d2eccea62a5eb93e1290fbbb1864fb3a4fab577a31c1551323233ca2fb02fd2bb9622a4d27889882275c4d986669d52d6f013e0ff37d5fe6ee468b90d5a404acc302d3185204706b47e59450202b3cf55a1cd570cd7f48d9b84110a06c009088f6e3a12a81b02688102d5271fc0ee4bc56bb98924d545d92a9d14883f4e032625fedb2fe281d9a2e6119585ec53157fc5b46313d46bb4d66c247a63c4,
+CIPHERTEXT = 2abc3baaa287dfc635e06570c4f65dae84329ccfb0009c4598a66fc2d6a9ad5a9c22b14c63eee88149781258116dbc73637664393eb7c83e690597ffc7650043ebcc268140d0b3ecfd24ed1edfa04f7ddf7f873432f479d7ba4709edfd6117b369c922c98a758e44abffdca4c71882ab76c6a64276667b4cda9671bb6ac50e142c89e34d919dbbe7268b45ba0aa272744737ca42d5b4bffde795c42d7815f6b34c190191653cfc05b1c8e5f947aec10c12a74e4c5a1544e2d4c3e3cac83ccf9163beb791d63ad8067ecbad2983fedf850e2cb6f9ea77ce5451b786bb88f0bc49a93bc05cb429d5d034fcfdb329181b53a9d1d364bfe19796b93d0844d72d955aea9706afe0e34b2955e432355b2cdc9f321cd3ce4656beb70ba1b6622a44ab198e6470412a051342cc64f6fbd0145af8a8b445de1f8555ee80b26153e293c9210ffe5ce3928c5cf9e030219f6800ae1acc87a89870de27dbb811d649d4aa3c17dda828c49c2cf07ed1ed7abe4676cada0a76942ecdb3deade48c240cae472e67afd9512d637370700cbeb98c42c222c50e5fcce0d0e3b8f0809f4fb1458031bbc95f9792b7c53d7320bcbd971541de94274a504a802ff7f0d910d0e6613f49aa0b5a678badc0494d7e7e6703a22ff2a655b0e3d70ae69adfd6676b1d7111d5d0d2d1dac5cde25ea8a75cb1ff9393977514b98e170a59a5e40a3a3afae3eb718e,
+RESULT = 0,
+
+TEST = 9,
+N = 9911017a8231f6fbb7cccb71fc1f124057d11b1c7910160b312474866f1d2edc48f8de835bccd57e1d60ee9c056a8cad768c453a989f63dfa9a612cde1f1f578b5fd0056b410ccb93efac2ca8a14161cb18c2f31ffcd50edb618eb439c59be80aa7867d5ae6ca728f6a12e062854ab82edfb93521c5e07b68ce88d154412aa43b09194bcf9fda79fbb52ad9792fe7fe1b9145cc0c0627791eaccded11a39e5e9a05b9eefa5bea58172aad2d3392827b440f3ec45b46a0cacf9f50bd56fd73b3d825950981e600ab7f35d23157602254552db2c44cf0a0de17dd9db35e06ec1018b19b24621e12abb0373da223af9a0956703dda1d61f8013f13bae0e5f7ffb75,
+G = 9911017a8231f6fbb7cccb71fc1f124057d11b1c7910160b312474866f1d2edc48f8de835bccd57e1d60ee9c056a8cad768c453a989f63dfa9a612cde1f1f578b5fd0056b410ccb93efac2ca8a14161cb18c2f31ffcd50edb618eb439c59be80aa7867d5ae6ca728f6a12e062854ab82edfb93521c5e07b68ce88d154412aa43b09194bcf9fda79fbb52ad9792fe7fe1b9145cc0c0627791eaccded11a39e5e9a05b9eefa5bea58172aad2d3392827b440f3ec45b46a0cacf9f50bd56fd73b3d825950981e600ab7f35d23157602254552db2c44cf0a0de17dd9db35e06ec1018b19b24621e12abb0373da223af9a0956703dda1d61f8013f13bae0e5f7ffb76,
+R = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000696630d932260f0215012ba7871b5517699c65026075d91b62549b932b07ff5c23525a157fd84a5826e36e95829fe88ff6640fa2e9c366de0a23c1c6f4f28d65ad6e671c98a3d9911dcca26c0e941a127829fb8a8bdb624f037315015434637fa836b6ac1d2fcb9d374f6a108d61ed96d8f31f7ea1c90fa433d760b0680900f3b5189fb3f4424ebcfc7f9c9c9b8b22faadb3c4f3a795fbd985b72aa7dfeb950d322e9a685a944d5334403d7598fc26b8382eaffac6aa71075fa0aaabc4decf5183599e5613677109d24f1d8a63f70cd64a8d34764b45519fb5e6a60dcdc12ba441ba4eaf6defbce843048c736872cbc0d75e6bc1c74f22ce387b050f1063455e,
+PLAINTEXT = 0d9cf84ee9483ef2786fed58ebe1aae60458bce18cd2b8369e8bd1d1fc91e62d9a09c29b556c474f681a828943304d93cf5d9587a0630585632b52496897239b0e77cf038731bb0ecd055f8566137fe70e2f361d1b5d3df28f1fba86a70eec092f39d8afe00f4cceabf43d2474d76d6225f24298f111f21340403a182597c0380ef8045679a5f6dca3414f74296546be747e9d21349f79a5dbfb66122dc8eaa354cde4b7286cc0c48e2ab7823dff59832d70e6e2e6bb5873a13d20a05cc7f1e5fbc02a2ff88dc2044678e718abcf39b421e70bc250d2380dd8752e53a36f8c6a6d98326d442b00523cf4bf78afafaeaa55af07296d0a0400cd19e0853b530ad6,
+CIPHERTEXT = 52606f6f210cbd51d1bf547b2d130de478d044693c22a625aa0b77793c99d462f15d4919b88469c07198121b19b5bf5d614fb7f1fe9500c70c5eb4da56fb9078764419ed51edd724941524ac3b5a48822062004bf78f31f38930d81f6ba4d1e01a31343a66c5bc793580d777c053a28f76f166a54a92c9bf4639cc79352e7ebfabb4f0467c599ca159b1b0515be09d96053602501cff37a132b1c20647ef98442ff8873b9ae9068a5be30dd2eab27657b1880e9e20e53184cfd04fd4eaed301e8f59080b66d7cd2571d826a9e41c5cf5f1797d328545e8947189fcb6801d2a59e53b2e2338e7db266865751f7d60ba108ca8a1ae96b8d31caeef976afd0ebf55bd30b2498bf87411af466e765b881a7f22d7d02405c3d26b3ded0dc2ee79f0fa187ac9dcb38fca2faaff13f38d2443b585c21bfa1d7ee641076bcbfd099980ef598695777df817f6e3fc9be08420684fa05323bff68a4541d12a3773975b1aa325d38ab9dc67918ae76c30c8f9d5606b1c2201b908a09cda304c1d6d0656dd59e46d5c6511578add41a02aae99c44430e0b721566d12ef7e493259a561a358b87336116292c3edb8beecbcbe46a26558973dfe2fd52843039248934bef6a783f88c2f011818f50a8db109cde2cd79b3b32c68ac58fcff29b8603678faf8cc03d6704ee9ca3e5fb9713192b7d95d07aed33aa4731b7ff829eb1c1290c6285e330,
+RESULT = 0,
+
+TEST = 10,
+N = b4d5d0495ac9a9dd6ce49c649737d3835c62f45c4bcd88a7eaee40cbe5a5713f8d686fdcc890f1b10dcc2e8643f53cf18bc8484d7acbe2127fc5375829d40d11049b9a2263aa314da73159684fda52f5b7905c02ffbb5df9f99aacbc41f558455f43c4aaf54245da213bf584278ee1c47c7f1a65283f28187ecf67913d3fb76e07c0fe2a0af9411abcb609fd7ccfd6d10aac7dc42d223c58600090553b56d4b60c45be5609cefa2792cb7eb3c1661299c9a142ac5b4650112b7e411f3cad81532bc8130803ef28f4c55f2c0fae68052ed1abae7be7b70e727d9732dc503d5404662a9988b14c509047571f6d1c9d97b6819eed4287cb212ecc959c4b09d8c5a5,
+G = b4d5d0495ac9a9dd6ce49c649737d3835c62f45c4bcd88a7eaee40cbe5a5713f8d686fdcc890f1b10dcc2e8643f53cf18bc8484d7acbe2127fc5375829d40d11049b9a2263aa314da73159684fda52f5b7905c02ffbb5df9f99aacbc41f558455f43c4aaf54245da213bf584278ee1c47c7f1a65283f28187ecf67913d3fb76e07c0fe2a0af9411abcb609fd7ccfd6d10aac7dc42d223c58600090553b56d4b60c45be5609cefa2792cb7eb3c1661299c9a142ac5b4650112b7e411f3cad81532bc8130803ef28f4c55f2c0fae68052ed1abae7be7b70e727d9732dc503d5404662a9988b14c509047571f6d1c9d97b6819eed4287cb212ecc959c4b09d8c5a6,
+R = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a527d4b5581b0f5ac17b92054c7529111228fc93c3353440900d501378697f9a5d3f297cda14fcb9b2c5488e156dcfa3866304091e513c3e3cb5b2ebad5aecf3f27ea8636ba8c35e5e2e34906865f584d2a76c91fb6edb6fb80d821918943023f8cad6ed3fffb153b9b20ebaecf1a00f505afcfa3ac8896c04310ff8feb70e01b0abfb533806906e9de33fb9df1ab3581844b1953660c8bce6d29be0b334f446c9975e61f4c7fb1ba0cd75c555f9decd61a102a4464842e1d7430402efea936e7da12a6b102300ae0cc16a731ad25b7b225f502fe1cb93afb40384ff671d56011fd8ae5c3f3c2dcc70d80a55591479532db5d75bdfb0ddddfbf692e96affeec1,
+PLAINTEXT = b353df2d862f1db5380826e1028e06094be0c568dff963bed3324d2f9cec5aafcb5f057959e0843ac1f72008da23b3511f5ef672370726e70d95981579eb7a9c8391e14536623dee6016dfb2870f1cf46cf14239d76296f6c9a59605ff84b8026471089d8b17232b78413dcb0a4116c6009348bbabe4ba205d350845f0c1f21787a48bf4b28ee88294c16d6c2f8c2917e4d24e2105a7014459a48d4a12d4122a3b02d36d9dbc45e109d0fb85b860609e89f116805ab23df378c07ab5e917da82280f71c6661a8c8d04b249a1a47c9f6e889862ce05fba7b6a58e5573f2b13fa563abddf6cb29cf500df07e03321f6f288c6722827fa6622f3dc93817e1c96883,
+CIPHERTEXT = 590b514b409c544ae8aeb5d04fd4d6dcaaf905e133755f777f0fc8796d8248834a7d1c6ab387e821cd21a48b4dcd16401b4cd9b2d811d794f459b6d36fa8104bfb2ab2a14bc4e30d33cb14f729aedb2cc9d2ba74784a5e08fedd788e877dd466b31b8319d12a502213b92357afdf4d7ed3badf596cf7d8b1f706c7432c85dd53ddf6273139fa43262b06875f3e5b33ea3eb5d21d45bf1aa49beaabea70fd8bc0e8d90d9d6c9d0e8d018fa360ff6440d5fa3eb551d889f71a74c4bac8fc91e49a07304d01aad1cda69a4ff9806ec9e8853e2f00f109e77e78e687b52bee587fd09eeaebf4249e582d8f9c186b2b6d603832e13ddd17d193133ce943a1e478e694b16818870dd99661d240882df48976d3043e5f5a7bbb3f5b61a8080f33c5bab3eb5de4008d530ff24fa298e55b7f4c016639573556af3c7f311a1a06e920154c0fba47b163104e27686ca20f6fcbdd9815e0b4ba8dd97b14129b49840b066225d32ba1a2f0991f0b6f8504509f2e49db0b3dc521cb5addf4b2c40781f90e0dacc935d507e36ffd8ab278b1e4ab2da8fe12c62d2ea6d684a7e7c29efce7d065702aca5a7ece97134d7803178a6ca198780226b667dd5a6fbf45065028a459f808b5a2c10d4e1dadb2ecf6bffb4cb187d38b6acaeb5ddec90b9f3297407ddd5737b5d11d79cb817ef496ed36d219cab59e1331e04e6f722d6ca9f4aa2cc012b075,
+RESULT = 0,
diff --git a/testVectors/paillier/keygen.txt b/testVectors/paillier/keygen.txt
new file mode 100644
index 0000000..2c5d110
--- /dev/null
+++ b/testVectors/paillier/keygen.txt
@@ -0,0 +1,100 @@
+TEST = 0,
+SEED = 78d0fb6705ce77dee47d03eb5b9c5d30,
+P = 94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703db,
+Q = 9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a3,
+N = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a71,
+G = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a72,
+LP = 94f689d07ba20cf7c7ca7ccbed22ae6b40c426db74eaee4ce0ced2b6f52a5e136663f5f1ef379cdbb0c4fdd6e4074d6cff21082d4803d43d89e42fd8dfa82b135aa31a8844ffea25f255f956cbc1b9d8631d01baf1010d028a190b94ce40f3b72897e8196df19edf1ff62e6556f2701d52cef1442e3301db7608ecbdcca703da,
+LQ = 9a9ad73f246df853e129c589925fdad9df05606a61081e62e72be4fb33f6e5ec492cc734f28bfb71fbe2ba9a11e4c02e2c0d103a5cbb0a9d6402c07de63b1b995dd72ac8f29825d66923a088b421fb4d52b0b855d2f5dde2be9b0ca0cee6f7a94e5566735fe6cff1fcad3199602f88528d19aa8d0263adff8f5053c38254a2a2,
+MP = 2cafae64af81e43b4b99dce785807768732c57d4d71392017e3572a05c34ef1ae5c50f008537a2ba3e9e87db5c812944c60bce440faa05bdd4ed90083ea6741f54f32e9b2534dc0f48dc8bd00e9aad6dbd919b7913af95b5f0d1b47bc9f600c20b7afb86bb501f1032551e08696e8eebe8cf20e0c847a34a13321aa24903fc6a,
+MQ = 6c39e504fa0718822922aa7d2c115c458afdbdfa8343077cbb2ce9b0ef62d55a791c47d7888d797d9b485c926295bb8d7c735229e45bba4c5e90ddb6d9f7f3d8bf71fb90191b58088b672a0f29b8a310dcc94e4d79fa316f6014fc4fa5f43cf63966cdf2e3006b114781a4935a9e1fd485fb8460fb2d3f93c52e74bb0367e876,
+
+TEST = 1,
+P = c1d51ee0914da56fece8362fb77c947de2c07e99c90b2c24292c6d3ac369b7526a9b17943cba6d173976e146193393c04696388dffe0234502b1fff747a2f2c81aa4f15ea0c51b5ff59d833f397a6b58626a9c29ec7605a3fc51d5a5df29d96bc839e07ee8189e64e22aa358564fd68d4b3ef4a6594f71b4710bc0d24ebbdc05,
+Q = f8b501d376800cdfe542f6e228b7fb885f92c20e66a20d71972d263b3168e39ae9574fa36b9b936fd6213746530b6d4b9be945ba681fd34386d2a775f7c6609d7428dfab21f202793bd025b78ac70ff1d9230ae36d75b31395a209f54ffca736e1d410255d40a173e5038132a800928e01c998aff4f8b10858a670df569688c1,
+N = bc4f82fa530a785ded3975db1b2bb02c09937b25725522198cb7b54bb4490b97acd8577a50350f75a399418f791b5a61268a934624fa4c59a1f6d9910a256c6d837b7d75a21a5ac7994ecc070007bb844ab7c6f2e9e1d7915303e2112b07b3bff9417e8efb2e2e9cba98f4bf3fd7aecefa635959e4ecc87ab86255e877ab62e05eb25f69f1430b20bea4ef5e5f071982929764b4e613a934b99c8167c7f0b59fe47507ccdcf8ed8302d6428af4fd66b528a19195cebb354b027b54b7fe15d5e4272ba38ab93c3c8bca5a16aa668b1b5013d470e61bfc457bc2be66d7909852922251bd6caa82379581aedae2fef751c3c12a4d44f9dfb500431e2eb8c17187c5,
+G = bc4f82fa530a785ded3975db1b2bb02c09937b25725522198cb7b54bb4490b97acd8577a50350f75a399418f791b5a61268a934624fa4c59a1f6d9910a256c6d837b7d75a21a5ac7994ecc070007bb844ab7c6f2e9e1d7915303e2112b07b3bff9417e8efb2e2e9cba98f4bf3fd7aecefa635959e4ecc87ab86255e877ab62e05eb25f69f1430b20bea4ef5e5f071982929764b4e613a934b99c8167c7f0b59fe47507ccdcf8ed8302d6428af4fd66b528a19195cebb354b027b54b7fe15d5e4272ba38ab93c3c8bca5a16aa668b1b5013d470e61bfc457bc2be66d7909852922251bd6caa82379581aedae2fef751c3c12a4d44f9dfb500431e2eb8c17187c6,
+LP = c1d51ee0914da56fece8362fb77c947de2c07e99c90b2c24292c6d3ac369b7526a9b17943cba6d173976e146193393c04696388dffe0234502b1fff747a2f2c81aa4f15ea0c51b5ff59d833f397a6b58626a9c29ec7605a3fc51d5a5df29d96bc839e07ee8189e64e22aa358564fd68d4b3ef4a6594f71b4710bc0d24ebbdc04,
+LQ = f8b501d376800cdfe542f6e228b7fb885f92c20e66a20d71972d263b3168e39ae9574fa36b9b936fd6213746530b6d4b9be945ba681fd34386d2a775f7c6609d7428dfab21f202793bd025b78ac70ff1d9230ae36d75b31395a209f54ffca736e1d410255d40a173e5038132a800928e01c998aff4f8b10858a670df569688c0,
+MP = 40a38e14648b60e08eb17ba3702f91092ee3458e7f22bb6af8aae2f8e86c113a990540635f911ef0848a53ffafc3f18af8029d9bc57687a92393f21d60d09e5e6fb18e3ff08051ededcbba4af96dbda481371f814cfa5d49332e39f71527e050625dd6164a8609d5645e4963eb82acda4b15c19762ade74e1bc8600e9d2cd2a8,
+MQ = a5c4ca4aaae1333b7d55f581e347f5ae4e1a73a0bceadc29e86f0d20d77f24246fd397b88743a2d2bea997c1668c331edf0979c594212eb4ca13a2fe216d587e150bb9b74862c7224f23127795966999c50a3cc9865138391344b39e041162164e758cbd3aaaba48dcce81a9e2be30457ee190c7668c3c16904f77a22df0216c,
+
+TEST = 2,
+P = b65fc0b6aae562ce7c125e80c745a30225c6e347a0366c004290bbd75ef1905e98eaaec80a8ad13ced31573739933eb3f9b10da8b7d4eb00672ac89b5d698d8c23f581f5ee953edf5e36fa7e90487e3659cb8d51607d07fca7f3d4e3d119298d35df5b6adde49ed0621326bbbece28059960810c6c4583a2c78254eb70caaa1d,
+Q = d343076b640ec97c0367954505db0f77d08d118a2a25462841fbe543bf80142ccc218b38c8053702fee7824634f25519cb2b23797d7df95986e7713d91c96050200c2a577682fc46795a0309770ef59df5417c3d5a952b86541297b5aa24b7f59ce80123810b067b2dde60cf79cb97db276f8d7c3b452cd0bdce30bdfe2d387b,
+N = 9680ac2f1e3c458c2bbe3051c24c260dc21631e62637dd3efcdb9f0cd5f23085b62768d7b14a5939c699cb7ef905aa8088e3f222dcc1e5bdc0cd0e819ae403254f0507055dfe62ca9b1e4a92f8a2e7ba2b08a88011088f729e6935cef2301cb89c12a80a572409095292599d68ad5ad093ab7b3e7273983d71e13fb643655a44de02a7f295770a29974f1fe3358230d9357ae81dbe5c4482c4c362a8b8fd63c7c07dadef12d3b30627aee4d0e44531d5b426ae062e5ef106c987ec3ecb8bcf5c65fc7ac33bfb7bfaf2bbafd690c7bc6978097865773f780c1f2ad0616a3ecbed001f6015f022da61b4e22d2c5d2f2dd9f8de2331c559aa3977593d9d33af13ef,
+G = 9680ac2f1e3c458c2bbe3051c24c260dc21631e62637dd3efcdb9f0cd5f23085b62768d7b14a5939c699cb7ef905aa8088e3f222dcc1e5bdc0cd0e819ae403254f0507055dfe62ca9b1e4a92f8a2e7ba2b08a88011088f729e6935cef2301cb89c12a80a572409095292599d68ad5ad093ab7b3e7273983d71e13fb643655a44de02a7f295770a29974f1fe3358230d9357ae81dbe5c4482c4c362a8b8fd63c7c07dadef12d3b30627aee4d0e44531d5b426ae062e5ef106c987ec3ecb8bcf5c65fc7ac33bfb7bfaf2bbafd690c7bc6978097865773f780c1f2ad0616a3ecbed001f6015f022da61b4e22d2c5d2f2dd9f8de2331c559aa3977593d9d33af13f0,
+LP = b65fc0b6aae562ce7c125e80c745a30225c6e347a0366c004290bbd75ef1905e98eaaec80a8ad13ced31573739933eb3f9b10da8b7d4eb00672ac89b5d698d8c23f581f5ee953edf5e36fa7e90487e3659cb8d51607d07fca7f3d4e3d119298d35df5b6adde49ed0621326bbbece28059960810c6c4583a2c78254eb70caaa1c,
+LQ = d343076b640ec97c0367954505db0f77d08d118a2a25462841fbe543bf80142ccc218b38c8053702fee7824634f25519cb2b23797d7df95986e7713d91c96050200c2a577682fc46795a0309770ef59df5417c3d5a952b86541297b5aa24b7f59ce80123810b067b2dde60cf79cb97db276f8d7c3b452cd0bdce30bdfe2d387a,
+MP = 2b906e611bade30b8b119420cdd047effac93880c34e0dab80c294cd3a1e630f6839084bac458e08af9e22fbe35acef9959ccb0529f43644adb9e5c0a35acf19604c8017c9b567ba1fb3f266674de7c7067fffadaadd4973afb03a47bc6726cdfdab0a47272a87fcaf22660120b17b355def2e3710fb089a61b300ec7e2d37c2,
+MQ = a0cc11664ac719e282ad4875e67999017ccc0561f53779a82616017fde9ca7718f6fa5ddbea3a5308080f264cdacba84c968355b97be36478a9e21217309f932d1fdc31fce25a8d330b618ee3b3e1a3f0c1b05bc280e82cf1fb5242b3f53b9aeb5ad384002d2f3183be9e2d054d10629834eae66777a752aa1125a2e6ccfd318,
+
+TEST = 3,
+P = f4f00d27527a3e1f81f6e811a1d1989b57a7fda6d52aa9714ae7fb6048058824d9e93d8ffb9143ccd5fb2ba493f5d0d812ab73465d50736631535b155d1dfb5fbdbada662e0f8723d09174ddcbfd6c4d464564f86a2e5e9f6a5914eba3fdd743418cfddd2ebfd9414c6c38482d56ad7621702c2a1f8e0787059f30c9262cd6bf,
+Q = f8456e93d02fa4d515d923928d320777b65ca03f46d654bb87c051bae134c4d39f86946d2c9a2aeb3b1918e208cd40e907ecf39a0f7ca525cfd9a045b628abc0294a6d1805a07a477e3b0a1ad89aefd8b20b3abc997e9c9a34695125fa7d80aa5ed5caeb40adea869fee63e9bc9a220b899a9ad1fe197886ef7f7d1c7a37e61b,
+N = ed8afb3e362eba9e2d937a5eb4cabe0a2aa534501cae80a4711015640a08bcbbb8ebbe5bac93bce790ddbcbc1336a4da85f32e0a5513fbc1d58cb0e5d1f9c918548b4caa67cb7cc2f3e377c3be56c133cbe798f9f3a8c8c8341b3d4eaf8699841100feee5b5b3a235c058eadfb73b43ad51fac2debcc7061dfb2cc867187d9c020c5d9dbc755eef31859856e49e10bbe8ecae34a44395fb9289b8b3dd5744e6d36ff8365361e17a3562c4408864f1ea5bf93707a1ada4d02af32bfc517ea44d1ed4f470dde1b867cbfc466c3c49262cebabc67fd2bb4b7c0c29fd14da2921fe8e9024ae1b3da91bc636e9fa81237d5b2e771637db6e07716e08b2f6078b34025,
+G = ed8afb3e362eba9e2d937a5eb4cabe0a2aa534501cae80a4711015640a08bcbbb8ebbe5bac93bce790ddbcbc1336a4da85f32e0a5513fbc1d58cb0e5d1f9c918548b4caa67cb7cc2f3e377c3be56c133cbe798f9f3a8c8c8341b3d4eaf8699841100feee5b5b3a235c058eadfb73b43ad51fac2debcc7061dfb2cc867187d9c020c5d9dbc755eef31859856e49e10bbe8ecae34a44395fb9289b8b3dd5744e6d36ff8365361e17a3562c4408864f1ea5bf93707a1ada4d02af32bfc517ea44d1ed4f470dde1b867cbfc466c3c49262cebabc67fd2bb4b7c0c29fd14da2921fe8e9024ae1b3da91bc636e9fa81237d5b2e771637db6e07716e08b2f6078b34026,
+LP = f4f00d27527a3e1f81f6e811a1d1989b57a7fda6d52aa9714ae7fb6048058824d9e93d8ffb9143ccd5fb2ba493f5d0d812ab73465d50736631535b155d1dfb5fbdbada662e0f8723d09174ddcbfd6c4d464564f86a2e5e9f6a5914eba3fdd743418cfddd2ebfd9414c6c38482d56ad7621702c2a1f8e0787059f30c9262cd6be,
+LQ = f8456e93d02fa4d515d923928d320777b65ca03f46d654bb87c051bae134c4d39f86946d2c9a2aeb3b1918e208cd40e907ecf39a0f7ca525cfd9a045b628abc0294a6d1805a07a477e3b0a1ad89aefd8b20b3abc997e9c9a34695125fa7d80aa5ed5caeb40adea869fee63e9bc9a220b899a9ad1fe197886ef7f7d1c7a37e61a,
+MP = e50dfd7d2be8641e1ba37d6c9852450562ea6bff71f48e6cc8fcdd2d70f4b9e60d976dfe2839f09b938efda862dd7a73db946e741f879a4cabb387697ac8f16543c18263f13a9f4992654bf45dd92efb22e453915b7f2bf74a628fb504f0801a8e1b7e6b214b5a7745891531106d9cefefbefa3ae1cbe85a1de9cee3f135dffb,
+MQ = 1019661d3ce215018f51cd100b5baf0d0504ba3ed7171b357e94e3faefcd5d59a641ed3a8d2ddce6922fb226cffd62efa0fc2ffddc12224dd6c28a49d9e865354acc755c15272cacb9454f55e24b971fb2e7233860f8cd26d598d18368b11814209f5765c9750588d80ce6f6cf7c9d2af462e1500cb579b34e590942358abf15,
+
+TEST = 4,
+P = d37a1a35d6148beae16872573ee763fc6fe4d80866043ab4b8dbf797284dcbb734cc047e47bdab80589c7308e04e2f79f3e3a1b81078017166daf29dfa2ba1671e1f6bd9a554ca798e1b2a5ba9a3fdb7a0df84ca9d9031cb1d33b69ab6260b2b37580ab9f770ec38e842c08aa1600e05fc1045ebc2e5a9788e644d34cf2ec621,
+Q = ea4c5ae628ba5f043d9fa23b6d7d8d369d0a70c08d40c8174e7d6d2117190098aa99381b6e87caaa9f3f60351f731c58fde55b7a8509a7155f44d3da86e73c40a411d4a89817c7c2effc484fb9161a417c6d3720e50662c15e51c21caa2d77d0fb9622f07f7d58ab52dc42c434833f520132163a9a9c6fecbe663ebc2ba2d589,
+N = c18caf4c0c39d8ed1085c6f7b92db21293c5bbbde8b29d8dd8fc586ed30cf50c4e4393bfcf657aae15f15f2d333c8a074ded7c5acc1fb13c4e2fc6c393df7dcdd096e9d6ca414ebcca71821ef24fde0d5b787b3d37abd968977ae37800fbff3dee132a2744c9b81d19a4ca5eaf405e2bb8853e5dffa2b70c7566b8bb19fd505e494e91be4c55b8a92141d51928e2338b927ff095cd715e09dee6150312f0213084d0e0d3f75490ac1ca18d2d0ea79f3e3b7575eb6dd7c86127ef64678ed22b0a64c8db9f87a7b73f91a0d3d366fc948aef0e8c70dbf0287de0305f8a53082566272c6d3648dd208a2391e7f4391a2749630e81188f6baa7f4b9db6c1b6c37ca9,
+G = c18caf4c0c39d8ed1085c6f7b92db21293c5bbbde8b29d8dd8fc586ed30cf50c4e4393bfcf657aae15f15f2d333c8a074ded7c5acc1fb13c4e2fc6c393df7dcdd096e9d6ca414ebcca71821ef24fde0d5b787b3d37abd968977ae37800fbff3dee132a2744c9b81d19a4ca5eaf405e2bb8853e5dffa2b70c7566b8bb19fd505e494e91be4c55b8a92141d51928e2338b927ff095cd715e09dee6150312f0213084d0e0d3f75490ac1ca18d2d0ea79f3e3b7575eb6dd7c86127ef64678ed22b0a64c8db9f87a7b73f91a0d3d366fc948aef0e8c70dbf0287de0305f8a53082566272c6d3648dd208a2391e7f4391a2749630e81188f6baa7f4b9db6c1b6c37caa,
+LP = d37a1a35d6148beae16872573ee763fc6fe4d80866043ab4b8dbf797284dcbb734cc047e47bdab80589c7308e04e2f79f3e3a1b81078017166daf29dfa2ba1671e1f6bd9a554ca798e1b2a5ba9a3fdb7a0df84ca9d9031cb1d33b69ab6260b2b37580ab9f770ec38e842c08aa1600e05fc1045ebc2e5a9788e644d34cf2ec620,
+LQ = ea4c5ae628ba5f043d9fa23b6d7d8d369d0a70c08d40c8174e7d6d2117190098aa99381b6e87caaa9f3f60351f731c58fde55b7a8509a7155f44d3da86e73c40a411d4a89817c7c2effc484fb9161a417c6d3720e50662c15e51c21caa2d77d0fb9622f07f7d58ab52dc42c434833f520132163a9a9c6fecbe663ebc2ba2d588,
+MP = 985a5234c69da446dc18c3aeb3f2092e0dacc753828be502c296486f83eea4cc887c50cb59ba6a3319d16cf8a2cdbd7313b500507a114bd6b23cf5a39d55e12bfbd9ba8f07b2f468c0d7629c7c42bd16c6d0a6c2266e84651b662168e4f5e7798b74513e8c8498de74eb48a59f60ef8d28d42dec8dde82de6a0d80ac8b675408,
+MQ = 4181246405e13c5d8d37f50dee203bc686f4e3b34eff2fd2cf9af8963be99805e504b0e073cb48d23ba4f6cdb012d177073c8f432dbd78a1bb752e7808e10665c48103d96c79085a85400e9003a1f00bf671c21dac9c24476ae358da0bb2824a7ae6502ce69eb2daa8527bd7de4e2d1ee228330b294e296b57609c26ed809060,
+
+TEST = 5,
+P = b9e05d51d08c92bb129eaa9379b02586e9cf4d46b0e57218d455dd8a2d1823d6896261cc35c4cec0222e6f7774a614c839014f0aa6b2b7e9f746e1beb85b78ce5fd235f32231646f64c5a23216228fbede356987ecdb9f038542badb2a7c4f1e67ed0f2daebe32619fdcdbcac37c5bf94f9f6cad04c72ac1375682d30137f8a7,
+Q = dd9ae03057e2eeb2333e3629346bf89585b56f115791c6096242b0993418347c400205af7a9ca541cb67d8a97811502b6016b102e8fbf580350c1f98f6e1bb0891a8530044a3ce48c71c978b41b61895372a0396f1f1bca83af669040c799be0dc626ee56a4bfb5f2bcc539975742f90a2a11a1583da7e47ed2bd6aedab092f5,
+N = a0e7244f2fc9ea27086d1310337247828c6e5e7e7c131762b174f98b5e048f164b40c0b2eb26fb7c605bf7f30449f0ad3103c9a138819cbb09053b20a1ad69c6ca94202627d13e97b14d3197013799e711488eda16e1a9fa4e99750dc2a7979d293315c43e569ede467b5a5e8443b60cc96bf7c8730361f1d0ee0020eec2fa39376e22dac764bfc21a751cb1464f63300418b682fb06c57a698575c25d7b28527e70bee7e67c853b48a9c05c3ba22036cfdd42d4f6ce59f3018751b2e8b57947381eb971620dd7cd91923d851a6f70458242bb66a31fa64ac583eb83d586cac9114999275854f940034858f815299e251eeeb4996ccd4fb4e975a65d3f3035d3,
+G = a0e7244f2fc9ea27086d1310337247828c6e5e7e7c131762b174f98b5e048f164b40c0b2eb26fb7c605bf7f30449f0ad3103c9a138819cbb09053b20a1ad69c6ca94202627d13e97b14d3197013799e711488eda16e1a9fa4e99750dc2a7979d293315c43e569ede467b5a5e8443b60cc96bf7c8730361f1d0ee0020eec2fa39376e22dac764bfc21a751cb1464f63300418b682fb06c57a698575c25d7b28527e70bee7e67c853b48a9c05c3ba22036cfdd42d4f6ce59f3018751b2e8b57947381eb971620dd7cd91923d851a6f70458242bb66a31fa64ac583eb83d586cac9114999275854f940034858f815299e251eeeb4996ccd4fb4e975a65d3f3035d4,
+LP = b9e05d51d08c92bb129eaa9379b02586e9cf4d46b0e57218d455dd8a2d1823d6896261cc35c4cec0222e6f7774a614c839014f0aa6b2b7e9f746e1beb85b78ce5fd235f32231646f64c5a23216228fbede356987ecdb9f038542badb2a7c4f1e67ed0f2daebe32619fdcdbcac37c5bf94f9f6cad04c72ac1375682d30137f8a6,
+LQ = dd9ae03057e2eeb2333e3629346bf89585b56f115791c6096242b0993418347c400205af7a9ca541cb67d8a97811502b6016b102e8fbf580350c1f98f6e1bb0891a8530044a3ce48c71c978b41b61895372a0396f1f1bca83af669040c799be0dc626ee56a4bfb5f2bcc539975742f90a2a11a1583da7e47ed2bd6aedab092f4,
+MP = 67830c27c130e9d2db909b1dbd1280aeda6ab4299a2319c2a686bc6f574738a6aa9fc06dce56831ad7d26f15ef68c14bfdb44378d2854c966eb240c7c40b59f3a6214750a1a5c1feff11a700a2afcfb8b991626422fd320844ffa335b56034d2d2e6cdadd5795145875bf2cb0b4623db4c18efed9daff32d22780b2ee7705f12,
+MQ = 623244924332d01f4642e4b53ae7bf06c6c857b98de3650ca1b239c63104fae9402841362d2e5e4e0ea538dbf4b089f9599db6575a64ee1ffa4a8fe3f663395c8faf229c83be857e3638bcf3db3b0ee7383c5667c7ed51fcbecacde634da55eaae7448ed179df2d068aac9a44a1d73f019be407ff143605c16f05fcd8610f8a8,
+
+TEST = 6,
+P = ba9bf9a2544b1a4813a5b0d9738f766cd5f5e488d8398bed67397339d3ba75bec86a86b2fd31656322495896987f2b76fa4310cc9d656921e30c9a715a2cc18fac8a5336e83a93c78ef08ed9698bad09535f3501ccc6e21df9ac52e1a464ddf53f54a42274b739b2a590da41a52ed5653ba86e8ca93e8a752fd9446d96e663c3,
+Q = d9570b3cc6b70959dfe260a4cf5f43ce9f92c935646ebc4308fb3f0ac233d6ea33e0f87b44857f7e08194a6432dbe4411011796ce1c634103cea99d1487b48edc8c195c3f78e5a02c6f2a1d9c4d52d1428e0630b9c582cbb91451b133d40cb6cff5efd1e9e5cecb4cab2c7845fb38fbdf162116b4b1be32736005c13f5d6f419,
+N = 9e6da9cd70c0d9dc02511af70a78bc007efc0f23ca0b71363fa63f6f32a87861e32a6dc77c52274d54b7d1e0f6dd2800b7cc0a08ac659ee529d5fd28f3fa0836142f565a174f255ebe3085390ab05a10d69c562f426988321ca49cae0462c6762a5450bfab2cccd5b773a2a0af38956b4ef4b69de64e83271e00eebfcc0a92cf284bcc7467223f8b2f1c4442fc0454103017d86da7ffe2d591287e123ffed57ca636d0f68f401d589d7b6d188def367c757bc98aa674442a50102d30d6526266e21856b5f5a3fb475e57f28da91616b18bc6b525351a5590d186dabc39c9e301f2faa51ba3de97a3cf688bc4d9d327f58cfa12b1b5805045f76a401157979a0b,
+G = 9e6da9cd70c0d9dc02511af70a78bc007efc0f23ca0b71363fa63f6f32a87861e32a6dc77c52274d54b7d1e0f6dd2800b7cc0a08ac659ee529d5fd28f3fa0836142f565a174f255ebe3085390ab05a10d69c562f426988321ca49cae0462c6762a5450bfab2cccd5b773a2a0af38956b4ef4b69de64e83271e00eebfcc0a92cf284bcc7467223f8b2f1c4442fc0454103017d86da7ffe2d591287e123ffed57ca636d0f68f401d589d7b6d188def367c757bc98aa674442a50102d30d6526266e21856b5f5a3fb475e57f28da91616b18bc6b525351a5590d186dabc39c9e301f2faa51ba3de97a3cf688bc4d9d327f58cfa12b1b5805045f76a401157979a0c,
+LP = ba9bf9a2544b1a4813a5b0d9738f766cd5f5e488d8398bed67397339d3ba75bec86a86b2fd31656322495896987f2b76fa4310cc9d656921e30c9a715a2cc18fac8a5336e83a93c78ef08ed9698bad09535f3501ccc6e21df9ac52e1a464ddf53f54a42274b739b2a590da41a52ed5653ba86e8ca93e8a752fd9446d96e663c2,
+LQ = d9570b3cc6b70959dfe260a4cf5f43ce9f92c935646ebc4308fb3f0ac233d6ea33e0f87b44857f7e08194a6432dbe4411011796ce1c634103cea99d1487b48edc8c195c3f78e5a02c6f2a1d9c4d52d1428e0630b9c582cbb91451b133d40cb6cff5efd1e9e5cecb4cab2c7845fb38fbdf162116b4b1be32736005c13f5d6f418,
+MP = 2752b8ff2caca37139cd316ca1d42dee857189317d38b9f878140215ed386bc3bc2d1838f8a7ede45f91ea09cb7ccda4a2c452736d32089e78ad45a2f3e9ce06c582c1c868d54d57b17a835152275da66971bbf293918e42a631e2275fb8e9cc89a046cdb3c9febf2130216ae279139231ba696916784142800fc10910cd14c4,
+MQ = ab8a89a061f8bbe7978cb388391031defec32d9071835ba2c89fb35d7c2107ccba974666a560a1b0d65dbafbe2bcaace6b56a66b49c50211b5c2e80b054e7fdc75dd7824aa33f996ef308b1745e64b1b36c6105e9531cc64759f690d88d0dde018165c66bdc0988e10844300a5b1accd370c4b29aa3e8b55c87a68b516004122,
+
+TEST = 7,
+P = e5b13dfa7be9063582e559939d5374e51730d2b9ea0c12673768d32d39f1036c2e5b22bc81cf1be059bf1e692f14d2a15f6f98ec1233e739c89b0374088676bb2c31d82db59fef9104cb8430ce642c4a7aa69e4b09aeb23651be06391a53701fafe90f8a612b99adbfac969a632bc41ea3f445fe7a0d81e0040fa98d1a37e1dd,
+Q = e5e8e51be75d55383e2f03f993ff9e6a44f3cb77d0c3b01766c8dcf0184b865a5862f09ed7793c087516ac6c46ede84dda0c0f78105b35280f5b989ce43692bdb832873b78d7eeb6e675c1a8a3fcb60b2bdb5c6b50270c09cc47fc9357842970e9c599d5dfa9f6e80dc504ebc320e7df6ff96639d9e453eaf2e5608fab734609,
+N = ce4882a1d19104c4dcaa6d054252e2764ca4927f5c5bb8dad71b1e196a2acdc9634e7f49f875f5dcef2364102e95a55e543b6df12321ad2841129aaf134277f57734061dfd3f07528026a48d422d242006c2e99da462902f9ec6bdf6ef1f374503f5265f97293b277cb73c7ba606657877db752241122f365ed0a2834ef73e0e4f84f93f1586333f95899112d0c09729b9975c155b0dc499e4f5355bfb1d064995a49c7a2cf09ea9be52062a99c4de8dad5098afe9cd658a35b91fd45e4f5bc4a9d2b6ddedbec26278eece5181b4618a456b9ad5adfb9243c92257558e7f226587723151af84dd045bdb1d7ff555ac952f9eadfebbce1d6f666ab08d49005ec5,
+G = ce4882a1d19104c4dcaa6d054252e2764ca4927f5c5bb8dad71b1e196a2acdc9634e7f49f875f5dcef2364102e95a55e543b6df12321ad2841129aaf134277f57734061dfd3f07528026a48d422d242006c2e99da462902f9ec6bdf6ef1f374503f5265f97293b277cb73c7ba606657877db752241122f365ed0a2834ef73e0e4f84f93f1586333f95899112d0c09729b9975c155b0dc499e4f5355bfb1d064995a49c7a2cf09ea9be52062a99c4de8dad5098afe9cd658a35b91fd45e4f5bc4a9d2b6ddedbec26278eece5181b4618a456b9ad5adfb9243c92257558e7f226587723151af84dd045bdb1d7ff555ac952f9eadfebbce1d6f666ab08d49005ec6,
+LP = e5b13dfa7be9063582e559939d5374e51730d2b9ea0c12673768d32d39f1036c2e5b22bc81cf1be059bf1e692f14d2a15f6f98ec1233e739c89b0374088676bb2c31d82db59fef9104cb8430ce642c4a7aa69e4b09aeb23651be06391a53701fafe90f8a612b99adbfac969a632bc41ea3f445fe7a0d81e0040fa98d1a37e1dc,
+LQ = e5e8e51be75d55383e2f03f993ff9e6a44f3cb77d0c3b01766c8dcf0184b865a5862f09ed7793c087516ac6c46ede84dda0c0f78105b35280f5b989ce43692bdb832873b78d7eeb6e675c1a8a3fcb60b2bdb5c6b50270c09cc47fc9357842970e9c599d5dfa9f6e80dc504ebc320e7df6ff96639d9e453eaf2e5608fab734608,
+MP = d12672916ea35eb87d865920e92ed7bd05bc191a026fa734028f492a38d28601316a0afbd2e050f51376d87539d9dfcf9a382ee2ac00721665db17ff78956fbf4a0403c9769eba20af166c9992da39bcfc5c432d6969fd88748ecc5569adfe61025f64c0b500e47f58ffdd2adc1bd9ffa64ed456507f4905778907932b026a2b,
+MQ = 148fc5945f43a9f859c1feded585179c0903086cfc8471c492ef1ef59591d5df2cef345c089335ead4a6cfa901af16e7bcf4590924b446c832d4be35f1bbd2086dbc3b7388d3d02d3f870abaaaf602ccf3c7e533823117508659b06bf9ec22c8972577242a1a210092362b33466372e4d83d8c126ccd72439a3befe78d90f0b5,
+
+TEST = 8,
+P = c3f5d0401ee0c425c9eac5c79ee66ab7728b5165fc7a62a3137f704d1e3d163196a10ec9bd39ccb5cf92e4f47a1eb39b195cc2413986a0e0ab8060284df437b1bea6262f61c87c3a42d94bbd50b406ad7226e6dbf9de1571f5ea8a0351d07b9dcac64313c828267f549db880918c341185ead32ab123c41bb45256930887c251,
+Q = ddb940c75ae1e4ee6c369c220b2a1695785dfd6c76dac7f59a3c002c78cb5cbee33d81d4cf0b04d29653a097797d7bfb10f42858df7694773aa039fc8b7d3dba57eecfa2838546f5d88808ace963554f189aa08891d355b38c6ed8049b2aacaf2581b4fa24bbc43a7273a3f5635306864d602c55c6928d28d8cf8c1f3efc6a89,
+N = a9b90300e6b498d2926ce4184ee1416f477484878abaf77e21d7776b3fe0637e81a0d4f41f380ba8ed7d5afa7cf7603637f584374f70ab682110d8ab7b747d0ee6a98ea23f0eb22b8a13ff36d1c625760d1fd2211735c4cdfb9908f125bf42ebd2dee391dfda025827780a28d8f768522230d45f79f9afd984dc4524c0db7cb4bf58c6aa3247891a972aeefbf77b2cab1b18713f2b6a19ef307f28dc549545a3df57c0524e7d46702f7ae6f620eeedea2985c3b31f7cd3ed980000836e32e3db44ec449df7552e96e54232bc4d33e60e4b190916caede21fd68e8f55fbcbfdf7b137e258223d48444aeb895d2ed73b291501b6c5dd1f2d5d2aea50b9acd88759,
+G = a9b90300e6b498d2926ce4184ee1416f477484878abaf77e21d7776b3fe0637e81a0d4f41f380ba8ed7d5afa7cf7603637f584374f70ab682110d8ab7b747d0ee6a98ea23f0eb22b8a13ff36d1c625760d1fd2211735c4cdfb9908f125bf42ebd2dee391dfda025827780a28d8f768522230d45f79f9afd984dc4524c0db7cb4bf58c6aa3247891a972aeefbf77b2cab1b18713f2b6a19ef307f28dc549545a3df57c0524e7d46702f7ae6f620eeedea2985c3b31f7cd3ed980000836e32e3db44ec449df7552e96e54232bc4d33e60e4b190916caede21fd68e8f55fbcbfdf7b137e258223d48444aeb895d2ed73b291501b6c5dd1f2d5d2aea50b9acd8875a,
+LP = c3f5d0401ee0c425c9eac5c79ee66ab7728b5165fc7a62a3137f704d1e3d163196a10ec9bd39ccb5cf92e4f47a1eb39b195cc2413986a0e0ab8060284df437b1bea6262f61c87c3a42d94bbd50b406ad7226e6dbf9de1571f5ea8a0351d07b9dcac64313c828267f549db880918c341185ead32ab123c41bb45256930887c250,
+LQ = ddb940c75ae1e4ee6c369c220b2a1695785dfd6c76dac7f59a3c002c78cb5cbee33d81d4cf0b04d29653a097797d7bfb10f42858df7694773aa039fc8b7d3dba57eecfa2838546f5d88808ace963554f189aa08891d355b38c6ed8049b2aacaf2581b4fa24bbc43a7273a3f5635306864d602c55c6928d28d8cf8c1f3efc6a88,
+MP = 28e3ecb0fe256d3d61d4238713293a4f8be8628636e80268fae41904dd0658212e6d3a87dd031089aca01e32bd167c544db969f482fc276d8589492ff91a4bbde0f65724672d09d26073f8a8e35290057df936899472da5804ae031939523f4616c364300c5098613cef0c97ad45e227a9bcbcf0644a835083da227b5703f6a5,
+MQ = af7514c936ac80ce186b4d660b8a1632d1875d36f8ebfc322a666f5d098153e90b5c3b7a5a28aa93c32e8be80de6ee057cd57d5194ec51bbf96762de3d7d27aa1b60254c8314d0f6633ec4c1158930632667af133976e9f2deecee752823ccb4a16a8c5f06782f7b2cf4a1769df7dfac16052492359d07ffab3f0db8c49d909b,
+
+TEST = 9,
+P = bec4370eb56d63302250b75a05572962f75bfb586687be11cb38c7f762282b7db0d79ad33457df79cf1268bb62142a1f7a8cbdc2fbedd9c1d9204cdf6db4b43aed85fab8b3cd8a731369fbab33b77bb096c4cb188f06edc248bca706ca6321215ebc2e2be7e0fc42fbd2359376199e54991f57604c3c0d25c5ded218b669c4e1,
+Q = e4f1865ddd9109fcef77977462cd80cd4db16a521819087db9cfae743091e6743a1e3296de9a3d1a8b98ebd75aa4df8a322fffb02a52f5ec0f564de3000f815aac77ad19055493330225c8061980469b611e1f1f37113337a2e01387fe56bf302f7716d19861e3ba97875b03e7d053a8e06e859b28d20f841b0aa1fd0f1e3057,
+N = aa9abbe195a363bcad04a1a576142a5070900408bb22c19f1cf21265fe2f7ad64e00a301e5b09a589b7310b1f5e805901c8b4b581d58aaca603c9e2efd5f4ddae371eeda7e23c3d7e7aa92c5f657531138ecd32fc97a7262936b04e2463edd3cdb530edf15be2622b33a4931b3b11eddf84ff29d78f17184c3e13056c878840153baaf618dea2d1090ff2b9a1f058b0b6f2cad3c1dd0dd35806d26d277949e1719bc7181bc1a781e4a08ea1ff596823264d062a0ef28c66379e8681706e5c161a300312497b22715e5f3b35f8029f1d7ecd760a90df4279feee951fc86012b4f83387e8628ca8bb5c9ac2e2707fdece28eba38a65514f36a4ed6aee5143a1877,
+G = aa9abbe195a363bcad04a1a576142a5070900408bb22c19f1cf21265fe2f7ad64e00a301e5b09a589b7310b1f5e805901c8b4b581d58aaca603c9e2efd5f4ddae371eeda7e23c3d7e7aa92c5f657531138ecd32fc97a7262936b04e2463edd3cdb530edf15be2622b33a4931b3b11eddf84ff29d78f17184c3e13056c878840153baaf618dea2d1090ff2b9a1f058b0b6f2cad3c1dd0dd35806d26d277949e1719bc7181bc1a781e4a08ea1ff596823264d062a0ef28c66379e8681706e5c161a300312497b22715e5f3b35f8029f1d7ecd760a90df4279feee951fc86012b4f83387e8628ca8bb5c9ac2e2707fdece28eba38a65514f36a4ed6aee5143a1878,
+LP = bec4370eb56d63302250b75a05572962f75bfb586687be11cb38c7f762282b7db0d79ad33457df79cf1268bb62142a1f7a8cbdc2fbedd9c1d9204cdf6db4b43aed85fab8b3cd8a731369fbab33b77bb096c4cb188f06edc248bca706ca6321215ebc2e2be7e0fc42fbd2359376199e54991f57604c3c0d25c5ded218b669c4e0,
+LQ = e4f1865ddd9109fcef77977462cd80cd4db16a521819087db9cfae743091e6743a1e3296de9a3d1a8b98ebd75aa4df8a322fffb02a52f5ec0f564de3000f815aac77ad19055493330225c8061980469b611e1f1f37113337a2e01387fe56bf302f7716d19861e3ba97875b03e7d053a8e06e859b28d20f841b0aa1fd0f1e3056,
+MP = 64a656ba6b1aa76ee7f0cd2c44c907c0c55bae11c5cf24218f07480af783eb26ffa75b43fb606db69f0e3dfa918d8091419c8a8567c67d7d1607219640ccabf1334a358a87bd298c26f03ce501efebda0c192ea3c66e95f33fefb1c448fd8a5356f677c541f9d3e6db699846cd64f84017d6c45f938a35f7773962fa18529177,
+MQ = 6c26b7aad34619b3db5094c82c9e89c55fd36462923cdfeace83118b50ae21126d22f9effe11efa1348e7c958cffac2fcb8d4b38fbd0822e852d87b96eeb9bfc6eeff33a6676911717ed8a8f866eaee96871972ee50ffb099957423c56ed4e3a008a19944861097bf820ac55f08bbef47193def6ecafbde882c14ffe9220f4a5,
diff --git a/testVectors/paillier/mult.txt b/testVectors/paillier/mult.txt
new file mode 100644
index 0000000..1994884
--- /dev/null
+++ b/testVectors/paillier/mult.txt
@@ -0,0 +1,76 @@
+TEST = 0,
+N = 59f668761d66864604a05a647ce112452830f0426d02e4141781c7431eb1845c2ed32ea93150fb3b8c17553629edc84fab77080e4200b815f338aaa58fa030a4b562f43d5f24a25d3dcb419ae75e281e37c8a1f0d2f47d733e040fcec7f45e293ef656c91d0045b6b97c64f72977c01ea85214e5847b425ea410a66b59cc2ef6d6fdf6509afe8d48eeb1335f58aaabf42799fe636a2f7653842cea779d0d1dc455c8d99b862ef5e96ae83626baf9d11aeecbf9cca683cb833ceeb09bd7e1bf7e63cf76d1d48d036cbcb05c185f08c72228ecd5ccffd9192443f007a3016249584504f7c0d483fb934365a58fbcf0df13a20d5864797245fe709abfee78a40a71,
+CIPHERTEXT1 = 17cc5e81709f423f7d8495bd1067e4ca508775400e082f151381f4fe382f7d70b8fe1a33d1b59252c7813bf04c0cf3cd3e8ae66739319bdb152eac1b85fb8ce7e764c7376cebec6d973e0585818c319e0ad23abe9ca45c003bd1affda99ddd09b5af1469d4a526fa00eb9165e16fc9b6dd34f3f7997f39c000ff47424962513e72877cb12260c10eb540dced8b2e604dcadabcea1a150f4813036aab0dabb1658d11bd43faa125c5f1a7635b83c7c5ff110734344292cfba049e15fc4c54128fbeb5b7b0392d5456d578af190da2c5231541992c7b98c33871796b6e7f9fdb6138d352e6338fdf34d661145f8e0a89bd04e43a64eddb6c7ea66113ebd13588d5b1fce74861526e5b520e48c45c4de3356985dae717772cd91d84fe8c0642906736145b9a840b5d9e7c2895e32a8dc6d159784daf1066aef5d137a2547737bfd0cbbc54a4416fd164114997f1b13c2a30de7522ca2c4824886c6985dc0b3811ba69b8f749411d66957dd2a0d5afcd89f309d2e1936302af1209cbea66f70e30b1d6906728e49f39dc66fc88f9bf35987522d91adeb61f478f4f72c058425528aa6e2867390acad6d3bb3ea102d3ec044d7f157f9349f02260fb197ed69dc167ca6882007c951e0d8e78820cbe7242ad8ff4a8ba69511db0f6ce607263ecacf60c15befa323e753e85c8e1890b5b288555612139868222d481418f372556eaa9f7,
+PLAINTEXT2 = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004,
+CIPHERTEXT = 15483cd1a0fb4d95b2152dbb93af471c23db521b2d54c8228dd30cfd86751ba482e6b5c6fbee0ab87d4c675da477ab459a40659dfc5d8f5c69cae7c0591ead23440efc6a28f5e36353242a4e4fbb1a60408c5b61a3af3b01d42bfcfab13948471129e10ea67422e90f44425ad50bce3e2af8c6bde5de5c2ced59de03eb833f05f893554bef5d29d2d0f8eefd2f5cae13632d7afca5e785266b13d2f28710cdf5087876f5b2267e8043a84f5339a5dbf6c11e5df00a3b5a53669c87e722ca2bf088656a45947a1f40548636cf602eceefea70c0d4faa019390900527b39f7289aad8ef624929fd7c49135d9ee9603f06c07a248014c689c3091ae2cca7f935ab9da410d93caee9c5db22d71de1338d66c53cc1bfc74899db868130a7508b031b9ec8d49bf90ebd4743890fc4a6c1dbdc5aae52e7f19af974e5282f11d5e05334f7ce4c8829f9069147add54bc374a4319f0b0a678e16689ece6b88ec8edbb369b82a11b86350c7a361ec41d611d1a5a6b2f44815b65591982e483faed7beedc2fa5f074c38fe233aec84adca21a49f3546cf3511969bc82de0bf21b37b53f284c53601eddeb663f581579ee616f91f5bf355d19e3a7c1d662bae7725c5fc13f2216bc55a67d8a578f25b4fd776b28efcb37994469885352cadda852d55ce0f8ccaace98625e96e1a422a0bf53dc4f34bb27fc731116dae834b63909e1a3229a15,
+RESULT = 0,
+
+TEST = 1,
+N = a56e0304be77345d5a184df74aaac9fae7c486562490aab7966c5dbe0cf2466b6c08cef30b106ca9abddea8168953f924b4820aec872e7fd0d8ec78bbb820bd932aee0e4cc975caad9ecbd85a0d10a1d5d6d51ae68914a47871371b6c2e0e74d09d29c5c5083c6889c4f9864f520c6a7a38d57e14c78c515697c96fca8f44892e1f8f8a535da12a203131b18e748fea0665a4097ae3e5c3c3d78a7af4888a9a96e1637385d2ad8ea35c6a82ee9dd6632fccdc78d8ed6e9cebc0d067b4baa728578de4c686e6d6c99d57bf80b8b95007679bf27be8ae19346d518614e19a505a946d85438cae38c3ce6af38d5832e72d47e21f02c53e88ae7193b3a446b887673,
+CIPHERTEXT1 = 60418076e345153ce90181fef520adaf7e25655d333cbf1c99ab17cb58e292c8439ed6bcd556a28f73e96e3d127dc0ec917e9f107f01b0da6f68b4b1fe50ce50488bb7989e1a0adad5f79004d5604aa6c73d2e70b2ab134966072f3614c5223ae596cc62d1136732e52c01a3c3063865741e8b15851a58014e9d84f2166afc58eed806a8be1a38c933396d8bdf1cb53d64ad504e8f4708e901d633bde00617fb8d1f3926e667bfa77665a64496202671fa5c9cb4b13e30c064ac9f48646370fc74779772d1cfd003acb3b323492ec94611d35aba9d9ee5ead2ac748052c917c8e41e2273ad1163c6f0fa4310e6e129bf823005b2730e353a16e445e7d6087e4b85297edf738db8a55f896aaf30ba26f62bbda96ded5d6d3887bd0b64bfeaf9ca6f30f05b0af03e49c67a6ff199c7c2218588a8ad8b7ab7f817dee9e145f683d0f39d80d0e765d89a03b3680b1ea49334e3821300ac2375bc0000bd364108e437fac16af3d0b518b1dd865125ff0e6747460ec41cf6fcda63afa425d1232b073e6e8b6e55a33d01203f99a5a62ceb45479cd3a6fd348c4b0dbca91e52d79e29fe77c3fb7c4ac60dc71f401d41ba8b47b5b1d9b3ed23b0aa0f9cd8bfcf4b2c9726168d83713bbe0f673d94eae8fc4e7fe07f93f49f1ae62b08dac3659c415d23a1939c04ba376730afb3e6c611162ea4adc655c30d8e49cad4c0052a3c3ce0c04b,
+PLAINTEXT2 = 1b431a98cc259da52f80f99fd7da9f5583cdfaebb47f61e0d1cb27c935325dfb2c326c9da74a24ff2901dcc0c4be5c362b38b0248e15de5db3ddb3816fc4681f1e2a49c69515df2fd3e7e65820daecb34775e3147773ab42ea8b94d8463ee767e2cb444be6a12f4d172467541b569350440aa669093b4e454289cce6a9686661e887e845f3ee45e0d2853e36c33c803fd6df0b5b21c444d902c36ed53a39820f7ca8c87a6ad1ac4dd0d443c9064303bdd7419ce7e8229fee8130c1156ca5c515f3382c390afc9d7ce2731df9d9542c96a482e5c11dc81d3333df9d0c2e85366cc146a4ab35d2b324acbd101f03fb9bedfb0047b51b3326ba2542e7cb1d106561,
+CIPHERTEXT = 648d017f7d5182f6d1af597f735d8f78d24edde6089317bc21f8f7f44b1b299b4fda6de4996100c131754c3eab13b8114885529c1164e87091d80d1bb3f15980db95bf49c7ca71df72d21273ba403aeaef9ed635d97757a53c1e42dd71a9b027acf4df6aaf2e0e8a43f776ba7915b43536de9708c9618418666e0c61f6a62468d19b287408a3e753e027acfb6d69bc0d3f16a3f0fec3c7e3406ac5f602c42c82be5165352bb90ddebab3cb8ce2efbeeabd0fc1a7b68458412ba43d050f4d5da073f042e72b4aa92469e7696890fe0bf267ba24974645dc5b1b1c411fbac66a096d5803715e0ea875e1b5fa8175560894785ac60871925ec79eb633d4ba097c652cba8ec9f79b4ed158b71dee6e867b5aceec5f04aea85640916b3d3e73bc4e0054238a575d14866e62fe37380d374eecffa2c835e5c31e4046d43b5611119b5a9fc836b694a2f72acc732850a52798c26df892607acb7b8158f72701490945ae5e0515d77cd5368ca2b536cd4bc8e7b432a77e91e071a42e76a3c28a700621e6a4aeb2435068b9a24413b3acb8a26c61df0a4b939e215158e1fc4a8451f60d109b0d6a4c2c90c22674d11857f544429d06253de409f48af22b32f362c00d01b30f47a85b492bd334fd457409d8e53130197d06cb4212ccec1e6acff937bbf892641e32f141b729afa7eaf7f162743c8d3475c74a041540b05fde4329ebc36b03,
+RESULT = 0,
+
+TEST = 2,
+N = db593c7b18e356cd6963f9aafd5fc38f0e34c03af2d31feb867b8cd59ccef5bd7502cae4c35a02c468c0ea50f18d6bafed60333b423b64c718d6b424aebca30212e9d70f0ed56c8cafd4cd9de53b6b92acff4b0e90f06929e6cc075f1a1e424b49802f972fb07793f3a2c44dc78b9ade4e5e64b642b401a39d33bf11dd3a2c4fdd23b7ef39969dae308f955d325163cd487c5103e169a6c581fc4232badfb4037a9bd2e68fa8bd5e849734eba3697a73cb019d4f6e055cb63def38adc7ae0c53c07ffd78582868318904b410f22cacbcaca3f841630db4763e8d57053da411d5899ef517f488aea719bbbde0b7c3ac55598d15b91d5d524bf7ef4b8aa1e06e2b,
+CIPHERTEXT1 = 4f45f894cab6c20b691f7f69736d3b59ecdd57e1d538be3b5465b5a1464179b960bbda9acc2be0b40eace6b9f08eddaba27a47e7abec4a2b15fbd0680550fb3727df77e36f118e8d1af84011997ec4339e0913fbccbb2f5590c855f120a8ea715a7c895503375c7c7493a8ee6314cd26044a7368dbf16db49ff7f968207cef88e853d6464f081a2ebae3afcb9419e5b23491661cadb052a5477b2a0681e54f8ec0d31e795aafc1c5d39359c486b89d47c21761c9924e4c58991e0cc08228c187650e09b4be615eecf8eeda912881e292137ca7a75e9c625622fcab29dfee6d4f5011de791c4ccb381eebe19c008ef887d63e3055506d88ac2aa7b10818ae53bdefe36bee37991c14bc2cafbce70f38630de0218d495a5fc1d5ee9a3c9c4aa204de7fa18c84dee8139710bcf478b4dd46c4ec55fa4e4904af1200c352fcd9bc9b3be37c7ab9f4383487aeaf513f3303885fdb09b8fa2f9acb470b4fb3f557632d3e03a6a252a91027dce131e4806c676abb5d064fbfa982d8378580ec29ca7d3efbd1decae031313922d5f81772f07c08dabbf0838ab9e0e453309a015b7ab888d13f12f69d645fcb43f63db2d34db618c349cca16e4a8d7ce1c1127b62373d3678c2c304e9edf07a1a9a4bc723a72b6f73ad0e0b44f7426c6f6da9fd7ed73c97ed056de0a8a88362f7ef3632f98f8a6266b3d1062947f8eb6b7524d10f0ba27a,
+PLAINTEXT2 = c0fd9ab717616584d6c29716d206b031b3a094946b9ee258f90d65f11a037dd64386bdab5994d9045ee286d0039ef9edcc1fc9be786736570e659259766f51fc57d1b70edd3d8a495d991f5d33c8810071d094dd30a2ead13bbb54dde9d1151f06010f5a3262751e41282effcbed94496c09f74bdb28cb91e973e0ec02e4bf6822b2f770e6c18ab61fb3c758f82eb3fda1fdbb100208ef39f17a4b34b539288dba9f290e6eb7e87b5cab7046cc18651f52f552a7aacaf8143301d82f1645d43b45a74a22ef057bd229deadc388775054e067c341cba20202d31026d324ea57a4537b7f550ef13df3dcccdd9c8f49ceaed1b244c001dda020bc057be177cfa123,
+CIPHERTEXT = 290a108011bdd83afba923410378a2495954dd5234baea5cc587caea8b6678a475c84084df4604b931189782f3e34c525f270021d2adb72f5feb19169c976fa9d0e8f7dc6f122ed03d72094baafc8575f08251877b043cdb83d2dcb61678372f9577790c2a051c82c33b79c7b49b68085c3a0917b7c3ed2763ebf10d84ee2c9e748b2d36c454927e15ae89e431d115703eb6fda4c4c55fd5166c530dc70deeb08b0d3905db96f79049ddfc9157e46f14d334a7aaba01bbe8d27b2ef34d57d6d846bc31303e665fb967a256c1e443e3b9992f5dde2e2fc55e987ff30bb46b06f2dfabe1f8304207c8ae67273f236d9779b57e36b0169eb7fbc7e643d16345ed69eb791d3317355e128fc707705fe24b5163681d9efc76e14b091f6132f7453ade98200e2bef98b233e80373c506fc29b3b67dff29e5f9892011de2daba3db83cddd8c8c248aea19c2758c7dc9ea8bb18f16e281db17356f2f68638821d6ad4e34b258a693de2cb3e8c0f3714f5e8f168b0cb7bfd810aafce125025be6e31bae8a49ffd8e04aaf6d31d71885bb6af2e369b9bf45f651bec63f23eb928c57a1d29aafd83020e50cad75461793e2be1be7407042ee166f12582c65f655137aab326322effcb98e722b1101d7af3c95dde2d276bbfe29a20258db4064819760259a8644053bec1944ff84ae2176e765071d39a0b666a632638687add99302b35654a6,
+RESULT = 0,
+
+TEST = 3,
+N = c15a78de6a69c256bd5d07993992eb5d48f91c006caa8cf5ddf617a503a2d9af1269dc17b7ffa5234fa33f531680c140ac4e03dfeab0e44f5fd9746f5052b12a53958fd519fe19c465ab7e6abef42518f54de0019d4caade808e8c676bccd8688f7e781af2914fd725a3ecc2ae6742d469a77e0c26b609c2ad81b52a6d269bf8d28a9cba945bbe4e0164fb79e5ff14820dba141cad7febf231d5ca3f450f3e3300b6e8a4d0024e48e8e114052e2335d3c2d01d2b8eb15689e99063193a31e7b5a3a81757b8b35be1ab805f9c5ce91af4715ef1c6a2626c76340fa8b4da327c2cde491273cf5a9e587e5f8b2c672cb7fb31e296ffeedb96529ad610c450369299,
+CIPHERTEXT1 = 29b45cfa9f86dba1d81b99665b2f9abeecccd6ebb8d9e1aa54b3ae5e3704aabc3f73988f33fecd09806afa4abc831bb5183adb0319b00045806c6bc2dec237119ac4d60dbbb0460472ce74141df8d4995d2d2876058696e65230a36336f376f25c3eb317589ef0e0e392b4d87be6b462a235fd8c0f1b48536f852da8329b442a5d2db894f382b60e5a91644e7dfc2b3318b1f300e2e6acff9719809d0e4db32af15d9406396cffecca182128500f6d74f3393c57455ec4a3f047f71f67c83fa5fe3be9ff21cdf1ac096c902c50a46b231a9078d2687b4686c956b55958ce37571d3a291061e5df6ddd7bf207b0ec1e7097e304d12e9ee6b6576a702ae6f217b386c23bcc0ffcb7a713863c254a293beb479779fa6edc728cb5a86dc2b5fc1bbc17dc8b4970d1dddaaef4e6ea1d82df2c18a153a90a31d2f4f090e9159e9098ab5d1330f06e63552f4249236c54daf9ffee7a266c364b31204e97310c0c7c6b17326974310a796d149ce0ef8cca1ff82e1276f9652d5549ef974ee99f93cd76bace58b47635c2335bd82f493f208e5d184cc835e4fd25523a6d8f2c1ae3a5c7543a0b2ac6a585d83aa3954ff2265b5c7bb8cfb60ec4605aa7f8a9c9d745a060130bdc348f85806ad63d82403133fb12b5fa24549112327351527815db3d82dc356a2b962cbb6f320b1c8c53c779369ee778e927ae064efaa0637aa66e92f87759,
+PLAINTEXT2 = 44d7627c33acbcabaacb4d4d08ace3ffd8c86550ce43ac63956255815198b7faff6cda414873bb7a160425f47c8f03787d74a4776bbbe2b0d6bad86bdeb5dc71535757bc6cd401d4a5636b44dd658fc0b35aeb1806c5fa02122b9f8a48f3688774215a137a447430ba6a5f29cd3d08b18f6b8985db0c03effc6b4797551e46ca41a78abc9aade94b334314b1364f5e65945be20fe099e346298d37377e41560dcb433a8f38e0fd32d60cc2b50c51f9dfad1bfdd08be99b5c152788d2b6bfaa159ec1ebe109b7cabaa4c9d3b214a328f2f0996ce7863ccf19f40a69646fbd2fc0adb194b4a85cf291a66ef5de405dc9de17e52202fcdb77d34f8da5a993770d4d,
+CIPHERTEXT = 600070a45b3f1582c1c88d84d5623347684cb57a0ca63526890ee194cfa2b6a4878d4bed149a30068907e3652471f5c55bdba0098fdb12ba19eadad6f19778f4d1c5ef8590dd4c265193bf96bcb0cf33e3e492a5029977e6b6ae479259fdbc6a12a8106b92de697552d15a19aea67905d5674130796f073bf21d526ffa2d92610a075416a2721c64e218e5ee8f47a499e334ce2320cb4e84449fff7a0ef6433abf4537165113345a6dafbdc3f322863264cf7287f1a9ccf4330206ff5e0f96cdacae4a23b51f86b5fa63ed51afee8930751c7eb375dbeeaf5b3d09fc17a00473648c720a6b054b2605c5505041166a494408736de4ddf3969d5a2a25b5fec495404cf183aafd70659f1d407329d80108260146d17df8001ae5182830fb236e2c38746d3ac4921f453d0fd930b028c76b04a09d51ce945eaa927791a0748573d48cefb6c5cb60bbe84b21646fe5b699470afb61e1acde55777c8490b67b00891e3aa03a832480cda53b55c6dd3ddb734e5e93ae5f62990d7e907ad232648244087abfb361b6ce41a386171f47d3e01b2147dc48c85e38e431533e77a51f1f5016d84f1e6df1a385791ce465aebbafc7558814f51274f2daa665fa17c96886ede1e9c4e7af9e57e6906bda0955042a2ca9154357ea6cc4e4416d7404c2398f21645ba6f09943461d9427ec9e0d955df7202c70a5e317df0527b491ee7a3a0d4395,
+RESULT = 0,
+
+TEST = 4,
+N = b793f59719c35a71d9835e8b60b60007c19c24adb932eb4104061f36af46d97234734226b8a3db5e8d0bdae37e0cd687e4df3b03474b0d4624ec131d3f2e445007cc665b83937eb9ddadc9ceb4237269282c8d60f87b5e701e5b31b1bd884d89a340f78b657324991e7f56874a200f8202e97ac3db70f551e2e62de0e55891cb7c2e54b2b293d06623d803bcd0b2484b3dd0cf7fa1d31064dfc177a73ff5e6a592b239af38ea0ebd715d4d56325af3773d21b93a3c36c044cdb22797ea5d9c6b03d8ac9ead97afb0dcdfd17cdba1b32ed0832418e0252d45d4264bab7a994fd6041258f36677628e5845732ab587157caa8055da938547ec915ce7673c69dd2f,
+CIPHERTEXT1 = 2bdce71c8d0ae0a837fc599d80624ec66d62a7b0eb8cbe58008e54d8a73e34ce1ed0ae527304b581539428f6ecb15c5b1eb33a010b10aa30eb2d2edd35a5f90eed37e4fb0357fcdd8e76cff78c49fb2e5450e505e1884558d635701325488eecefa9c751c959190b5ab15ba533f00700a835da70d535d8f87e44acefc489da934c2405ef56db052bcc5fa50ec497e48c5c4a3199a39508dbcf0325d101ac59466ab0b21e472a1debab0cb0ee6d69317cb7f38ef5a3625f5f02b8748c73f2574985467e0878ca3c8aab45e66d0a98419775fa82e03f1b373fa9b72a312216432a6b71689bcc8b25cb9055cf138c0bb919925909d231c8c0af22cc8f8dc0cda55af35e20def796468824c7dc619aab25d53bce6a380a04f50ad879ff789f33cee40b2c5db4ec3673c7576c033dfe0f9995c3330b449d52f80828061671ab13b3dc0820ebccb32d6899568d7c3a1b8c7dd0a7a03140027c54fc7661ba901d55c758654754cfa48a274720ef4e29ad54dc5b2ee1524aa2bc2957a298d9a76ef32beac139c616c6d79d958d25e5c1bc37fdd7ae9a578cc69c60597b84b57fb220040a55b9fd13d535e3c1125866e6909eccdddfff3f9675ebd9317050756837f2ddb6e672726dfe77aea23d2525cf18896d401181720ee608312e5f33906d4b075b53073d0c594f9be498d994ad74a32b51de38ed2fde8766bcfa5c28b0519ce81f9f,
+PLAINTEXT2 = 9940945e458df69baf879f413cd10a55af853d1e34ef3893c3ec181e77b1edf9f7464c637a87b5f3014ea6f06f39053651e5158fd57f4dfbec7af4c045e24a33b34f962ebe76249026aa40a897aadb11b6f426eb1c698e61ac5a88a22c3ea05f38a733a77977950ae50045e361d2cf5b3c801038612c0bc04431a4f73a26483b3c4f74cc0633beb78efc44d1877b03055c477c99285e3ee40cf9d973d1a00b22a3a16c83f3c5b34f320b712fa08948f72643b2765f2de5e948b03faa526bcd600d2e715747b35ded43fd49401bb6a10706484deaf3cd57530afca86bfa34287c9c046b3bacfeef1088316e1e34e99ffceaaf31b153e2f92b755c5b1e0907e6fe,
+CIPHERTEXT = 1dde7684b7e4daf59416336ef7e0808fa804f5a391ebdbcd984fddad9dce53b96103cd6f16d39bf54a3488e6329a00800f471c4e95b9a15319baec67536d44f3cc4f67c19165f9ac4ee2d65d179d5dcce46ebc493b754a2c143b9bf61a10a08e69bac05914f0fa433fab61991c3e9028790f5af1f35bd466b78bd72f07eedc157673205cddf4cbd3f95f5a11f00a3375a4d8b59012ec486099a88ee75b6d759b379edb6c73b40c0aaca0fc439e1f34e4ce12226489c18c3b5bf44a902159888abee2700fb1b42ccc353cc76e641109ddb4a35614f325dfb83b3615efb0170531deff2c2d4b9357efa362aaa2cbd86832ad44b8a6b9a7d5825818427b0136c5267bc1ade6316b8980e8909347d646259ffb37b3c478af4e923383498a8d1e9a99ad6264d948767a805be60e226da6618b13df4bd74b167491f8dac0b5110605f08fdc062c322cf7cef7aad8b1e0680d8e87b2763467cb2ff925200e2892bda38d5720cbde4035a2508c776679e8b8272b3ce3fe6fa86ca88e8c1bcff9a23a2b22ca3a409ac1afebeb9408553208e8e6645cbe2eda71217cdbb9fdac62550d342766024ddeba128d1334df77f95975ec30445fb0f8c9c19a6f2f76bfc255d20b4b172bfc9e9742d56610c18bee54f679560da8296bac2c32f33b2e9606efbf371a55caeae59ea6ab99856810fc7adcbbbea1ec9db05cc13fd8a7d4f847684c6099,
+RESULT = 0,
+
+TEST = 5,
+N = 9c8bb6dd82a2425706acde98c9cd40ad0e193e4672195d35c10c404e1f10731df6df60883029b808ab5b4e037458c6557dd813626313a3b663791bbc86d693d8a66b43fa20ed348ec244ca89848d49995b4432a4e208e86a10315df2fdd5a87df95647b967fa2497c184cd48b5f4bab70829137f23384ab1ebd8b0f2ee2d0d44680c7f6d01d6ecb41f5109d5a0b2bebe2adaee724aeea3193a762fd0ecc1d4e7e9fa4c37814426df3c5e4f07672db387aaa6881f1ec80838b2491f5be2c4d319cd79f949e5367bbe4903a3003dd784f981671cbacb47429b806a80b25172c65eaca0dec6ec89dd72bc33f447e17fb651de3d11990fb87b93136f67de87ce880f,
+CIPHERTEXT1 = 3dfaf3386c2acd577d2a5dd7901bee4576d1ead9279e14ad73698ea9d65fb9bba75d74e354b557a73f6afee2a227a7a44a16bd84cba16d9e6d81c98339a1971bc92bffef33f5f072b0773b1a5323bbfdca3a5ec3486239c44378b6e45adf3a93b76d06184530e067d202a4e8714884acf3f45593f70dc0db5feb593fa12e6a9cb2d0b31064c9565d7b9fe5245341d204f587dc783f264697d442be0434fb68160cbe584e89bd895ee9a8cda4f11910769674926cc38f98d6de4b97288a08f0cd0ec96996c9c49c70cbb0b5cc259152042c2627c6197e111f0884ce8238b9cb0323535e3eb256b5b93da0cbd59d29fd28d838609cc5c9c6daeef1cb3e2a8105d698877515e5daf2a55f5136c29f55df29a39912ae59866fd91f0a12a390fa4ce260f53848c49f53a9e43b3ed8bb785e91281e43cbcda7399de8e0179a17477ce41e05c8e0b9fbd9f087edb07ab0ffc7829a34485b9ec2dc5261cba02262402bb45e854292427af2d71eab3acf74927497eaea685315248fb101ffd1af655e3adda59068f171f7fd76b1da70138ee2a1b5153477b5676728901a584394cdd7a6dce8deea0ae6b081798af9bf9c62f8ac14fb8c5b2b9286b6f32a4ba056f17891ce71014fed5d759266003658216349790ec4420c994dfe8087bb31c8aa3e8fa88dc98e3d09cbae36364bd6ce9e28e1938286fdbfe7d15b27ebe23f0f92fc07896d,
+PLAINTEXT2 = 0f321a06d6c980bad7238d1faaca37d4f50fc6b737f55b571950ac4257345d3520441c07e99c5a6f64e608e423efe20c4c1e2e270d42051685587442edaf3f4294831bf81bbfc7ce80e2ae1b82de79741c7ceb45e55fde43395fd8321c3f68b73eb9a14148bde61701ce1218155b9c01d1563282df06c3d81c992827ca02839adfa7bacf2359d3a695ea16c5911f3690e0237c0f227fb475a733ea0404ed9123a8c530dd86fff21a4afc2c40f3ddd8638be541d9beefd50eed0de3e9ee1eb488248c59aea48c41380bd54f1fbb31e06a244944d04807fad5ab0c0634f93eedb6545370dd1d7a8a2a53e8f922265b9e7d83def70b748e69ce06db6532681d3710,
+CIPHERTEXT = 0d0e69eaa3dfc617c654a99641abff4d80f2c1a1711c3156fe5e8cc718f8c26bafea55306847059cc1e6af903435e02e9f863bc7bb739465f1bb87514af9bffd939c2058c23b98e3dd7cec69dd587b90813373eff7e667066db3593bc187af4f12f033a415d55e0e4e59f9f1ae99f876b2fe65383ea6219efc5f9e3dcaf5d11f63cf451716c2241f60e30ca6067d6f11b839b53f4e1c31180215f5909464027ec7201a2ba9fd9d8ec4235f764e921804e3b9098139ef1d375669206b8880ccb97e80ecf40a62ea396c527012c8fcc7fa58dd90523e88e968761c51c6237e3b4902f28dd41ebb0eef34f47dd64031cc695861475cddb1962eba809b4454b8e3e592a4850e03e80e54bb096446509e760ca2f5d1042d48d05f83e1660ee23c2769e6fb0cef04b17cc82181927be883fea39d7f749ae611b1beb17b6a6ddaaf38ac56d6dc37d7ed39bdff637cbdde5fa383d60dbedd995c1d55ae589ab4db2dd5a714cc81e414c6ce6fe09f46c19c36c3a975bff6cb378e933c85e5f54c43a9ec32bba168f9f132bb4e21e2a160cbe5fc827ce09f525a649ee08f0d75320c0d96b8a2e1f0e1a0826ae41193ea7a72547e7c00082db584cf39b07881a3b1bd71e90319a8c0f00383188d392a672bb8c57f553c6bd7e53a94a07c5bcc6ff6e5c9793cd3803f714769ad2c8d980e2e753cd90d555749a58ec433094eea958d9ba71810,
+RESULT = 0,
+
+TEST = 6,
+N = b32360f90c17280184da93e6b7c1bec7230633697eda2cecf2f39c4276d1e51357d931587c16645155bccf4b638e14c4365ff7d9d6edcf8da708e37501f6cd6efc2e53ce1811a5372f3eba331042ecbc849460434aff24abbfd77658d3c2b494365da44dc1fc1afca023605615cbda8dd92c230e032698150fba73476dd4059c70a32cef8201c53cc84620333bf8ff183c0934680dcd025cbe32edc982ce979c8d33be1bd96f9431f15113a847dbfa8572337968018e5a0ad82da4bea88aaf5fca1d367ca3675174019fdd34a76dc2f2826b162cbfa7c9d1edab1e9bd0eb80d774f51680301be7f68c7323a8db629efb85c07efa95cac52f55c43b651d694cb1,
+CIPHERTEXT1 = 2060edd874c0a50fc04fdb9ab5b8539ba273b26357cab6f26a6885e9b8db2b9c4f1b32b5e3d99c770ad42b1907827a3a3864430e0e453894334389928ab8b25b8f255ad8df4f47d5173a0c632dab06413c22758cab720b7d7823faaa070c145cbd54adb4925758cb17ab13f491323d2e404bbab5cf70184c090a182ce440b179d2616e74b253a0bf20161b4d55e686d740e133fe4a6366c0511623f95682aa02a248e95bdb647856c2a2f39c9577354de897b4ce1e7d6b229b56910d6ebaf992a404278483ff967167039c46528e59ea5bcdb9559f5fd900cd4141325242fed131c80c015ef6617dd6514d22be7f89d4c243c1194055b2892f2add4a9c3c9b0ad3463d491f07a4fdf43f2709406f575d6c808aab7b3ba4c9ed50463d40c2db8a256c82cf59392abebdf156e479528c3795bcc090bb3e1518dd92a8a082d801225adeaae001317bf5d58bd62e6cd96ea1ac1c7b3a22ad13e992e22aef59b2d36d582192e82e6876f6c3416a859921cd2326a87a96c6a95e99d829f1dbe77575f39d3c5cb4776d0f785a345a5d7b913c76acfd693cff87184b168665e88a1e74ae92877755913cc5e1619ed30e34aa7ee4b31a1ffc4c09cec9c61bf3162d9f8e9f7d570a53fe7322586a74080ae78b50db48b5ebabb2827013b90644f47af7c7ef351fb6715e7285ed007f50b7da6815571cc9374cd62378792e53194266779037,
+PLAINTEXT2 = 39398b8f833293062d89ca2b07b3c9e56aa211ab482c18787e0d1e1293cd3c291daf88300d007d2cd5c4e44b8463eb2deead67f460b2c59cb6685ce4e7ad5059aa8730eeb9c02a7895e2dc8526fc9c90b485a89161a09dc398e5449f3a0a1c166c43f2af4907035bf742dd31e79b14c57308b92a0ce20fe78b74ab33257a4362e69fa42ff62c1f8b09b541f7f2ebe7eb70888cd6062007f950a8c53bb2c665a5dd606c323fd520d1aa5211c21e0ef3c73a46eac7f956352b9c38b5b9e66c0abecce8027fdabfd796c40b49e687f396a0fafd857c11382d6db954ba948d982fee1c447fc890b7465c56990df38eea3aa09e707b23f578abfaf36987b016206174,
+CIPHERTEXT = 7c0b5c213ad53ec4576aa562bf0114341faa30abd0cfbf2a1886db346a1c2fde076da0f8afd3440545f95a6e5b2fb8c91add12c802529628ef8a7fdfc590a21ed8b0ae98044e633330fa69994b6fdf174f804b90dbae7de0b1574b7b83b184ae82f590b5591a34aee7d8082c00a8af8936d7996b82b20b6b18248719428a22be65adfd2fdd34375ffef366edddcd0e95ada2ff542c46c3f938cd87161d261b38726366e0bee2f175a39e236074beec8fc4581aff247d1905327c93035e84cca556a363f963d92c9387bc738a24111fcf18e2e826273633c7ee6bdc3662d7e85ec23fe2610be81c6187f94d71e5fcaf3ea64310a8c8b45200269ccb4e282df578da368bff7c149b68d809729869e5e86ee9c0ae7f962b908fc70a97d8ec27200d0ec06e67d9a700a88afebeae0994e7a022b26e441f2d08d931442a8a7fb70c9cf3bf299f528be43803b9245abd6537d573d3a0e594761aadfe45f33fd59985cf09dd60af3c74f208cc7e3b0db4810fb5c00f65b3cd932f35645fb5b26d9a890b5180e3b56d913746818290e7c49ceafb56d5ca1d14b65a59e2aa32f5353e8f9aed97fd2c7c78a140ae49d3ade14ef6cfc62dac5e4c4a8778db15056fbb0c320ecf406017bcc6c6efd8321bbb967113dff02acca3b179d788ce279edc164e086c4eb64dad87d240129f8eb9419bbf64383c97e8e9388bb8f9fad35ad3cda6e001,
+RESULT = 0,
+
+TEST = 7,
+N = 9dae3aa64eaa275cb63b13b28bdb802b5f8a29e057d8b4324c0332826560ce1ec05a42e4a4990d511fb40716267c85566473853c73beaa84922834da4e464a2b13d80750d36abe6985e17e6c46c7da4de149a70c9107bd080246771c06f7d7cccea396b7238e003f21e26b288976a9861ee0b86ba9896db969c68286f4a302678332ff2594cb5f063103e1ecb75bb21f88af5c6293b79a09318b042362cd13d26f51cf691eb35343514a0f498bdedff79ec376a6d25a4cdd75ea1263971831205d2d6cb961920441861109eb16c7759ac1123f23bc3fc01f00640cb400fcf580c8eee94dd625dbc000a65d2873b96cd9c5d864f20e18df3b002f016b49ec43db,
+CIPHERTEXT1 = 3ea7c51115b7f2d45eda6afdc9330ce46a06262c93b465b49fada6b8002269e96ec71effa34a5c6679898a3bb5e8deb38ac4f154be7e49d25a04c159d2f32429130e4bd9c84f40188d5235982da973f5f8482c469792b8d49d6c46dc75dbd932f16a0a21210b900f10324c00df675e1568a68395839b766d610b1dd350d885ca89a0746fee5a45c05948fd476ec8a32e4587dcc7b593026853ade378b804c5e509fb93fcd91ab041b07894c039fee808e2be8b17e12c437ed78689e832b278876b40779df49c1cb514e488503f8e6ed6a77c2fab1a02d8fe05e31392f6c30ad3aef0c96087b6e3976fea4bfe66b632fa3a843d01a17d3a4b982e5aa0c8680e68ed33105fd1fb66e29b738806b9cf4dfeb2b45e6e9a5a663d9e4ac03e226d78d8ff5df2417a58a66faedc4db2ccbe1085a805c310612fb4a2cf677715a41acb30d9c5745bde2258805a5cd1262cbcad4944e91d923037c248aed64f347d0b22ef59c3a56d2a9d2111df258a2cc9a06f73fa9a2018f4c98069486ed26f1e6dec0b1f3e19f44e4be784743331d8ff8a1e481a14ab16c72b3965221f528f8f94d611f478df86c925db14b2a445acc8ff91fae68fd161c42cc3df1b0234b1823795c726bc0f1b9da4001bae1c13c4a2382c5dc0cf660ba9447ba6dcc764b2a78b3844c12c66e798fe1d5c69834a62abf013e16b9f2da7e1b753d1bd8d5197aee20b41,
+PLAINTEXT2 = 4d7473bc6c8f51b78f79574e50c28309a6c4ce0b7df89476daf15c512df729330af3caa3baf9bf557e4c186795d3fe03fd98312293d67b6e948dd961f32fa130df4050cbd7ab03e72f6d784dc99081bc2de0fd00d1ebda1ca070b8b9334419b6538805fbda3f3e691442c7d4409125963d8ad8e507849459d4793623e289678c646e5af6a06a9a518886316297b615cb9bbc9d5791f8f65fe7fe9c07b8ad70ce44209768508ad8ce0d5e2c8cc237067cb973aa449cfda7d4cf7b8c16710e0afface2d0116b01a2dec3747caeebd7c1e49a8ae2f4998728463304f48cd7243a24e4b877eb3873fed51bb9604ef980889f507deac775edc6787578871085dd2944,
+CIPHERTEXT = 4a4210c5e20024a7ed5305a14e796ae296ca8698c166b18b1c4537db918c552d59a0f016949bd909e15236d12ffafeab62ac1832f6126cee2b69015286c5dd779e05e52e3883987f0336a5684cb8bcd8373e680a19aabd1eb72d32fb44067c82f1ec1df6568d3a7dc93873dc0ef57f1c6c9736e372371e7ecca25c7b3189e19c34cfda8edc4e60a92b200e090b32e6d8f2e0e75f8e1777357c09bf4c557aa975da98d34e013bc8c403bde99b760eb885337c13742bf074cedcf337f0757985239162cc6042345c5621b0ef8104d04cec5bd35cda1a24617ac95695147a6a8616f14693bcd23cefd47dbfcef808a89227322b2b2c2ed124953c78a2775821a6d3d1231afd4481dc4464d37b2e02ceec6de743146ccb3d10594ca1130537a857ae38b165ccd4c292683e794ecaaa109858df85072ad0758dc88f3268473fa303311aff02103b8f836f2a76d2f02cd2d976bcf1da0e5754bd97d691ca8246931d7ec7661b25424aff5bd1c560d1a1a9ed0c3c5bf240fc711b5c72cc4f127cacfce92fbb7988d9e8042c6df949cda1561a22fecc99c7f675900428f2d1bfc621a033404bea4ad2c147eed0fc2632c221a3223b3161428cd40717e823d9b3059955d0437e4327c32f02dfe13bcc2ab6911a78b96f08bb59e6d1048618052a82d5ce913d108d661f43496ea6839bc50c251bddaafd340f93f15d64675eaf5cf3d0baa4,
+RESULT = 0,
+
+TEST = 8,
+N = cf8ee885d9eb61adf7f53db6ccd3d9028dfe28ea32bb133659fe451f3a7c7635edb032b84064e0276f9c9fc05a5d87c4b7916367270c58d005b4c0452b90f1eec33bff918c0752d59411043aae197aa4fe9f3212c09943ca7b70e8b86edaa71e77f42262de4ee3bb52a7f9a9eb9a3def19bd2fb42727dca42a8efa6ee7612e1976aaf50aff27e588fae5b55e9a9fe18796501b7f022ec4798370cfa602dabfd25cfa96e5c074bcadb4a581305a2fe9eae80bbea6286a24da549a4d1e7f7e5ae92e66d36fe5ea1b6478436219215116cdcefdb00b680fb97344c8158000fa5670af6d81b1e9f9c54f0cc6fe07e87626971677d37f06aefb2547a68e18e9eb6e4f,
+CIPHERTEXT1 = 36d3ae2a7582fe3f1516c673c77d07f740cdee8f06a4763ff27eacafda417dc0ba68fb17785ba3cbf5bd59c46fbd787299af61b2999533a76055afcca3ede42fd0ec3a3c341c85837a0c90505abac9539ecb074ba63bf7ea826dc2eaaa0d43803d4342d7476618aed96e90aac479423bb074e2081e37e39db9ab9f1c87238e2a27639154f71adb5fe8307572e771e4ecbd55b67689e394e9cf23d21f7949e01b34d981a8a8658b07017fc747f5e40808a4f436a021908e2b535f46970cb7d52d981eebbda13216ade8677febec68915cbde339adc7b470deb87ba3e19bff7e9c262ae5991e8e55d0ebc30e2664182e665db477e35960151f9daa0832e62012a3a1afb22489c73f4affa5957d45fcce9fa2e4ff8e6f4782edd9d51297a1d5b9ffffd6252bf963fb37171a7c9d4c60313b138781b7c048fdf40de06ca796ddecc7b29dd5257eacfa2a64b7acbe01282eae38462a076c55343bfe79e3062672445f705d168dad3811910e61e6eb7953cc465a748329e9ea21ad220591c7a6da4424c5ffc221264088159534b0f0a86ff4ce1b9ea9e097d8e7e071edf99619681df8579d55f1a3f7b3f21120be87ae2db98977eb0594ba221e133fe2c718b47f67f4c08495d445f38b29bb9dd21ada59e94754d2d2d0e7c8856b6b9c5dfa7a630056a433b69ddc196f03f0a4fb6d8fb48b34d39854e2fcd384753b967d37c0c4a0e0,
+PLAINTEXT2 = 62364df8be0b6ffa5791ac403986b4c90c095d56c770733fa97af831de38e824630b7eab49786a64b2e8b385aca6a48f7e14181770a2140a7acee9ffc5d7d9e7d3b2afe069957f07c20080c263bb995e97382b4f08390f00933653aa2af431a7a28c0013299dbec4eea1bcfa6adabe56cc50accd5078d2f19dc53b68ed68ea0e0d3f4619a483223356468e4d5a7e1b0673104c5ab1c7cdbe901e6d0c484c6da963b8a5a1fc21f2dcf0e85af09c275ebcb17e50c352ed4c4ffb75b563ede848ac862e40a1146275d79ba5b16aeadbc5e1427fd86ead106eae6a23d6e9b92af341fac482f29fd7673875190d9f682a873631ba193d3245ca5aa74ccdc41f07c4d0,
+CIPHERTEXT = 7e914cebd933d7f444047c8d51094e494ba4786fef133971fb30522e7c2c22868d46168d79ab13cdf22c274931845988ff6be372dfd816484b78d7fc0e9c6d0054391f256bba4118075691125711939ade042cfc3fe110e6b357af76edc01e9312f607f228bca95bdb8940e5f2dfea7b8322948c49ea73dc0068378dda0bb8e2f0cd349d4448038b8ccb5f0e4f759e8728bce53c0ce0cf06004dc06dd3802cf8f859b10cc09065ae3cb1afcbce580d66c99b3cc11aeb1f86889493e1cac9e522139988edb3f8080b0442165032b3e07c877e2e5e49c7836103ce41bcb1eff80102308b49aeb593b1b254d5b370e17e6d46dd82ef0a8975ea0256695b4ad68cf1cf7278a32aa3cfe7a3138afe25f15ec8130527a65b2410f33390f5a68306297f7d97900486ae18af32bc06fbc307a95aa2a5d05a0282cc123bff65ad84d3f01c8ae6b44b6f9811b2ca37ff6303f11ebb1a4859a93ff90bb6f5613693de272a0bd808e0807f730abf429ce121b523afea3631d0e63d4b57bd0fdc0a68771a6ceca1c42becdc3fd006fb71967a247cca2e376c2084944e5796075b8754e67e1775052f1c9abf40121af1307ce21481d5f0a1cb0ad6ffccd4cb496ee326b83704cf34c53a5166134b421460b6bae9090a55adfc1ee343ddba58c67b0f16623316bee0cf1bf350735e10d130347fc4d7040e54153e4d0f18ee1837f2009d0236a9cb,
+RESULT = 0,
+
+TEST = 9,
+N = cc1b1fc96740798699f2c1c7bbde9b78c500a7bd9e39e3db193e043f787cf6bd76364eb068e487734a7a54146bfb2e87022130da9448baf114be968de66c39706ad0a76c2541b611bf8e4a311e11628515fc916785b13ecf18680ad9e4b6a8397d517134c42d907d07c45390bb55f8ac8e10069eea2e456e97fa8b33613b93aea3282791672ecb6da70b98091704f38778b6c4cb3eee373f677e9d83c87ac9b4874cb48a25a5478fbacfea5c98b215a1ed0776dbccc4285a4397f83edd37e265f850858d489186c8e12df33d45e586f7a8412f039722348676d849f435d640ec1bd0905f853638b611f5a3a84010cd80252c7cb065b44b9edd5cf11f995cd0fb,
+CIPHERTEXT1 = 1172ea6f2a3c595ce084116ff6981e22619292618e6434c9442287bf2abf80bb9222318beb5d98f8f8a76d9e0e3757ed74a98483703fd717078edae37bac80b3c649d344959fec5c6aa1a3e3140d0757d536dcfac575c2c38263539853cb74edce547598be3304911a16742901fedbd1cdd0222ed0167e2d437e8f0ce62dd1c9629f3dd91b01cff95f8e113227a481694ecbf4c1ecd3551bafa6e2b672056d1d017c8e93cf405e0fb37da22c404c894797579c50fc222666b612cb959be2ff056ca7866d4bef05bb0db3330825ce62f3d05db7763d381cbb36726f8743984176e7a146af89134d4f7a45b4c1b52611796ad821bc10d1088279be6a7e694a79e804ac3c1d62fc45b1315bcaed53928b3e1d128a5a20e32ec148ece702c07b7ce633a81cb4e175e78afb1cbf7bf292e344dda7321f3425df0d12a46850b19632a3b032a549a2fccd6d300ed933c99f126a4174fadce5fcc9d3d63013ba2d3657d76ed942a20818715b2fb719e0357bc66090bbebb6e398854d209c1a52c16e929cefd071b41c5e8623e4c11b05a138067432636b725884bbdf7a9121284e57f6051693292c45d5ef4c55d40da601bff6ecdc25271eb1647020d0f24ebd6e538d87b1cbfcb2604b7dc977a59c8e018310392a3aa9a8646860f643662316b823bf26f4b6ea69c97ec7edab61c453d4c89afa9fc240948949c6ceb8439d7c02867513,
+PLAINTEXT2 = 2852f08478d6be72b02c4aee138ad9e2c66c9d21edca457386884d4f486f2d81cba7d0e0d0f71cdf54685ad6220d3dd31cd4735a93907d8984eff9a0cb0283c2924727659f0a403c59e46834b203f55a94923b61d5f650a5c2d92888b9a3e02007884104fc37fb72c099366cea954cf224c72469f8f15d323b9259df0d3daf0b68edd1bf8e4c87935e084693399c1d813ad1c5514ad4d04ebbe4407a1d01c39bc5946f9e98e7106af1072f889dbd54a6ab9c69aa45030560baeb6382a852e3e8e6df515e495973031bfcf92348cada78d66a0095fa51d01ae7e39e27b74c14451252e8d7d1e9a972a27ff06790c133dd9224d2341dbff0b1e3e751d50b382b2a,
+CIPHERTEXT = 7610a3ebf9a8ce614d76b277c40d22b84750e8728780aa3548bfdd695411f2d8ea8a39a685ced95fb766f9c0caa26f1dc0fcdc6f9539e3ff6d0c9951a8c548e1575b05fe3295102e4f352cc16c500bcb717f37a323e8e39ee4655b65d36049b862a84e19e52677c6a32be0e030b820e124ef1265d067b8b1bc50af81ce757b1783009f0fdabb08063708729c41adae0ba98e61352b4f97b6b18d3a1ec578c0258ec2f94ce70084771cb890b5991d21d185ef0978958cb65e63a006708ccab9e260667131519e3a6d5a39afcfa6d1ac307e57546a9a2eb857bc41bd8bae4ea424c232db8423cd14c01886f32b74c7ddbf44a01582b3a9b48f2f1812fefa7df1f5a57850bbfbe974dd18fddd3e4aa889e388857c2e0d92a1dd877db4a47b681d4fc7a300ac543eca5917cba9625d618e302c3121a1cc0b4dcbf3b5dfaa3034d079c5d345f1921d356c5e952a2b5d7daa677c148638bb46ff2afb8bff32c4b5c47afbcd89ed844aaa27c3b95bb320f0ca69fe6913b0b042eefc15fe70f1c7c1d62fa4de7058bb721ab2290a689683981872cd00ec3765342e8cc6f694a7ab4faeb9eaa9b02279d2d46fab3d6ec4611f051405e57be1d74c9950f2b668bb9cd0a23758ed996e1670e42365eecf31226126a5ee0add9b29cefd41ca4ff72924a09a130da52cd794917cfd5e59b8140cbb3c1bc4af28cb80c5637cbd5939d130dfb355,
+RESULT = 0,
+
+TEST = 10,
+N = a2ba1a3cf8882f916d8753461447b11b45e9a4134af5c9ba548eed7e78e1365466d81221b968e79beea2ce0330a0affd3785f1ffac1edeafb926bc00a7d32c7565dc4bbbb18d3f4d5be1597de9769714683207fb7b1dd3801a529f5c34685619c37bfa55014d576ee45f0d212d2edc044a8809bbe22bb2b38109dc6660ad04a7ff73d16ca308d12c8c1329bd7a40de347d28846523b438abe04dbcec5ac53d59548ec5321efddf6e81ae0312e2c99f247540a8984ba2364dd16e447945946bec995549ed20e7f8285b5cda63123ae40896c63e5b1e94e61bc48d04624ff7b02979c79e319137172d3fc319b9f8c479dfa8029bebb3f50529323f2f8b004d2b1b,
+CIPHERTEXT1 = 5d370626589a64d8ac52d936e88619f75392d29ea5b044d48b0b15bcfec0c32618ea225b437bf334d538ab0733a66b4b2e4378d1ee7c45e11a0cf4108c763a25c5bec796389c5b113eac7451cfdcc5b1eb4c84aae9631196bef4bc3116573605ec9e45ff7e8e5584a456526385058d23a72ff4bf2a6e272ad1377e30b8bda8a8df14cea3ae25cfd0d3e1fa84207b59d03a79eecf50373b83b3dae08ac431f430eb64115b79c658c514950bc61bef859c3c4d92d16a0034771835dc3452018b7ace1d0b3d2050aac6dc35f69c75e37ff4c28cccf3add5dcbc7569fffd6471839bf5d610ebf0de7bafa28487a403122d4657853c7c6b00f20d4dd715e858ee170a2983602a617b46fbd66e2c2a40b4479a0721643692fe9a92572232ea618a598bf4c380adc1c875e28bfa8ebb84d7743e22b61c8090405c35fd47eb8b9e9cc1838b6f85803d3485c2288c773c136a5f0c65275e234956ab117e34e921faeab2e67797aa3158ecf3ba46f04130671560dbc8d25287968d4000771216f744e1e6207b6a51bd32f29cbc6a6d022fb8456c31ac8b77a778b53f8474c4052950d79da28355b4468a81ec488a0e4d621e5abed51f039ba98d548e3707851bf3d3ad66e178602d82a16f75686342af19c53c3a30e45326e6f1f508bece9bcfbd0e2bc925ddc786bb14e26bcd72f3b44a9738c2a15a963b32403469dcea20f68fa1dbb06c,
+PLAINTEXT2 = 1c8e09c0a4ed94aa3a25093a5459dca0e98bc98c7c0c414b2563fdc2b0b1f37acbb3b00c30f40bd036619b2a823f43e66f0fb6a0a20f1a5718cb8f0272ba4509c5e184fb7c424a386b9afe95f77ff8797af6e34cee12f5c118cdc476c8ac9da6f178cfaf03a50cebf6f603a57a5cc0f1fd7bc750644f1d73536438d4f594861590466c5e9bcfab7904a3a9edc5447e7782dda381806fc22afc5d2473c71a350ededcdec8d22a9ccd92a574156640dd3d6d9511e33b28627564a79d10187c744d4ddbc3bfc1ca47aff392848cc515d110c0445090a02d6edcd26162d4c5f3e332b0376cb44b39c657b3b1801b46b52a055606c08539bfb7901dde7db29b722ab4,
+CIPHERTEXT = 245b517b8102750966b170ef3fa58ab6a1cff19ba79fae15372b283e0702c3a6c8742453bb2e831cd148661da704d5f2ce7c5079a0cf349632aaccc225b3a3f9076edceac6075083b306c2fb089871093e60c108c9c3e48672aaf586fed6962413b1b34283dda28192aa5bc742e00722c48235837233b0e60ce7237828d65a8ced9325bae65ed1e7d770d800ec043cd62e03391ff01e476b9e065d945e9da0e091540038a8d13614f47ba5a01a5e0203957183d4c66142f9bc105e149a1a3521c657af4d5f460ff5496dc41c5fb84bcb07182943a0febdcc0f374d2e4ad59fa666906d979311e48ba3afd248f18b86461737b7a6e67e98f31838ee77c8683b6fa54ed3aace0fc3bd65b65758ad14c5b43625664bcf083ebb880dbd79cfe8011dfc73880d26754d400348d19c20fa8c561caae74b14ac9b8409fc5d85ba3f6aaf8ca78a2cbfe6600d83ed67f2288c381957cabcead9e2659c7d935f710cba4e93757639c8ac653b1a7adf9fc300f91bbe1a0d009b9fdc289df75cdb5d40bf1cf16b923826e090728c2c93b1fa93a1ec41060dfe9b68cbf33ac8d112d799ceb039a5e6cc431cea1955ca2abf89681c04176e33f935a0fd96d2cf10f95a8e82639fc1a7ddcfdf420799e47582720ac97ee9fc38e2e5a1c61bad89bbbe1d9bb2c833e5d3d2aeaa09bb65bde25e7604af9d775bde403b2b356e0adba85679668b7193,
+RESULT = 0,
diff --git a/wrappers/python/TimeMPIN_ZZZ.py.in b/wrappers/python/TimeMPIN_ZZZ.py.in
deleted file mode 100755
index 7faf631..0000000
--- a/wrappers/python/TimeMPIN_ZZZ.py.in
+++ /dev/null
@@ -1,370 +0,0 @@
-#!/usr/bin/env python
-
-"""
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-"""
-
-import json
-import sys
-import timeit
-import warnings
-import mpin_ZZZ
-
-warnings.filterwarnings("ignore")
-
-
-def time_func(stmt, n=10, setup='from __main__ import *'):
-    t = timeit.Timer(stmt, setup)
-    total_time = t.timeit(n)
-    iter_time = total_time / n
-    iter_per_sec = n / total_time
-    print "func:%s nIter:%s total_time:%s iter_time:%s iter_per_sec: %s" % (
-        stmt, n, total_time, iter_time, iter_per_sec)
-
-
-nIter = 100
-
-if __name__ == "__main__":
-    # Print hex values
-    DEBUG = False
-
-    ONE_PASS = False
-    TIME_PERMITS = True
-    MPIN_FULL = True
-    PIN_ERROR = True
-
-    if TIME_PERMITS:
-        date = mpin_ZZZ.today()
-    else:
-        date = 0
-
-    # Seed
-    seedHex = "b75e7857fa17498c333d3c8d42e10f8c3cb8a66f7a84d85f86cd5acb537fa211"
-    seed = seedHex.decode("hex")
-
-    # random number generator
-    rng = mpin_ZZZ.create_csprng(seed)
-
-    # Identity
-    mpin_id = "alice@milagro.com"
-
-    # Hash mpin_id
-    hash_mpin_id = mpin_ZZZ.hash_id(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id)
-    if DEBUG:
-        print "mpin_id: %s" % mpin_id.encode("hex")
-        print "hash_mpin_id: %s" % hash_mpin_id.encode("hex")
-
-    mpin_id = mpin_id
-
-    # Generate master secret for MILAGRO and Customer
-    time_func('rtn, ms1 = mpin_ZZZ.random_generate(rng)', nIter)
-    rtn, ms1 = mpin_ZZZ.random_generate(rng)
-    if rtn != 0:
-        print "random_generate(rng) Error %s", rtn
-    rtn, ms2 = mpin_ZZZ.random_generate(rng)
-    if rtn != 0:
-        print "random_generate(rng) Error %s", rtn
-    if DEBUG:
-        print "ms1: %s" % ms1.encode("hex")
-        print "ms2: %s" % ms2.encode("hex")
-
-    # Generate server secret shares
-    time_func('rtn, ss1 = mpin_ZZZ.get_server_secret(ms1)', nIter)
-    rtn, ss1 = mpin_ZZZ.get_server_secret(ms1)
-    if rtn != 0:
-        print "get_server_secret(ms1) Error %s" % rtn
-    rtn, ss2 = mpin_ZZZ.get_server_secret(ms2)
-    if rtn != 0:
-        print "get_server_secret(ms2) Error %s" % rtn
-    if DEBUG:
-        print "ss1: %s" % ss1.encode("hex")
-        print "ss2: %s" % ss2.encode("hex")
-
-    # Combine server secret shares
-    time_func('rtn, server_secret = mpin_ZZZ.recombine_G2(ss1, ss2)', nIter)
-    rtn, server_secret = mpin_ZZZ.recombine_G2(ss1, ss2)
-    if rtn != 0:
-        print "recombine_G2(ss1, ss2) Error %s" % rtn
-    if DEBUG:
-        print "server_secret: %s" % mpin_ZZZ.server_secret.encode("hex")
-
-    # Generate client secret shares
-    time_func('rtn, cs1 = mpin_ZZZ.get_client_secret(ms1, hash_mpin_id)', nIter)
-    rtn, cs1 = mpin_ZZZ.get_client_secret(ms1, hash_mpin_id)
-    if rtn != 0:
-        print "get_client_secret(ms1, hash_mpin_id) Error %s" % rtn
-    rtn, cs2 = mpin_ZZZ.get_client_secret(ms2, hash_mpin_id)
-    if rtn != 0:
-        print "get_client_secret(ms2, hash_mpin_id) Error %s" % rtn
-    if DEBUG:
-        print "cs1: %s" % cs1.encode("hex")
-        print "cs2: %s" % cs2.encode("hex")
-
-    # Combine client secret shares
-    time_func('rtn, client_secret = mpin_ZZZ.recombine_G1(cs1, cs2)', nIter)
-    rtn, client_secret = mpin_ZZZ.recombine_G1(cs1, cs2)
-    if rtn != 0:
-        print "recombine_G1(cs1, cs2) Error %s" % rtn
-    print "Client Secret: %s" % client_secret.encode("hex")
-
-    # Generate Time Permit shares
-    if DEBUG:
-        print "Date %s" % date
-    time_func(
-        'rtn, tp1 = mpin_ZZZ.get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id)',
-        nIter)
-    rtn, tp1 = mpin_ZZZ.get_client_permit(
-        mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id)
-    if rtn != 0:
-        print "get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms1, hash_mpin_id) Error %s" % rtn
-    rtn, tp2 = mpin_ZZZ.get_client_permit(
-        mpin_ZZZ.HASH_TYPE_ZZZ, date, ms2, hash_mpin_id)
-    if rtn != 0:
-        print "get_client_permit(mpin_ZZZ.HASH_TYPE_ZZZ, date, ms2, hash_mpin_id) Error %s" % rtn
-    if DEBUG:
-        print "tp1: %s" % tp1.encode("hex")
-        print "tp2: %s" % tp2.encode("hex")
-
-    # Combine Time Permit shares
-    rtn, time_permit = mpin_ZZZ.recombine_G1(tp1, tp2)
-    if rtn != 0:
-        print "recombine_G1(tp1, tp2) Error %s" % rtn
-    if DEBUG:
-        print "time_permit: %s" % time_permit.encode("hex")
-
-    # Client extracts PIN from secret to create Token
-    PIN = 1234
-    time_func(
-        'rtn, token = mpin_ZZZ.extract_pin(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, client_secret)',
-        nIter)
-    rtn, token = mpin_ZZZ.extract_pin(
-        mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, client_secret)
-    if rtn != 0:
-        print "extract_pin(mpin_ZZZ.HASH_TYPE_ZZZ, mpin_id, PIN, token) Error %s" % rtn
-    print "Token: %s" % token.encode("hex")
-
-    if ONE_PASS:
-        print "M-Pin One Pass"
-        PIN = 1234
-        time_func('epoch_time = mpin_ZZZ.get_time()', nIter)
-        epoch_time = mpin_ZZZ.get_time()
-        if DEBUG:
-            print "epoch_time %s" % epoch_time
-
-        # Client precomputation
-        if MPIN_FULL:
-            time_func(
-                'rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)',
-                nIter)
-            rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)
-
-        # Client MPIN
-        time_func(
-            'rtn, x, u, ut, v, y = mpin_ZZZ.client(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit, None, epoch_time)',
-            nIter)
-        rtn, x, u, ut, v, y = mpin_ZZZ.client(
-            mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit, None, epoch_time)
-        if rtn != 0:
-            print "MPIN_CLIENT ERROR %s" % rtn
-
-        # Client sends Z=r.ID to Server
-        if MPIN_FULL:
-            time_func(
-                'rtn, r, Z = mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)',
-                nIter)
-            rtn, r, Z = mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)
-
-        # Server MPIN
-        time_func(
-            'rtn, HID, HTID, E, F, y2 = mpin_ZZZ.server(mpin_ZZZ.HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id, None, epoch_time, None)',
-            nIter)
-        rtn, HID, HTID, E, F, y2 = mpin_ZZZ.server(
-            mpin_ZZZ.HASH_TYPE_ZZZ, date, server_secret, u, ut, v, mpin_id, None, epoch_time, None)
-        if DEBUG:
-            print "y2 ", y2.encode("hex")
-        if rtn != 0:
-            print "ERROR: %s is not authenticated" % mpin_id
-            if PIN_ERROR:
-                time_func('err = mpin_ZZZ.kangaroo(E, F)', nIter)
-                err = mpin_ZZZ.kangaroo(E, F)
-                print "Client PIN error %d " % err
-            raise SystemExit(0)
-        else:
-            print "SUCCESS: %s is authenticated" % mpin_id
-
-        if date:
-            prHID = HTID
-        else:
-            prHID = HID
-            ut = None
-
-        # Server sends T=w.ID to client
-        if MPIN_FULL:
-            time_func(
-                'rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)',
-                nIter)
-            rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)
-            if rtn != 0:
-                print "ERROR: Generating T %s" % rtn
-
-        if MPIN_FULL:
-            time_func(
-                'HM = mpin_ZZZ.hash_all(mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)',
-                nIter)
-            HM = mpin_ZZZ.hash_all(
-                mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
-
-            time_func(
-                'rtn, client_aes_key = mpin_ZZZ.client_key(mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)',
-                nIter)
-            rtn, client_aes_key = mpin_ZZZ.client_key(
-                mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
-            if rtn != 0:
-                print "ERROR: Generating client_aes_key %s" % rtn
-            print "Client AES Key: %s" % client_aes_key.encode("hex")
-
-            rtn, server_aes_key = mpin_ZZZ.server_key(
-                mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
-            if rtn != 0:
-                print "ERROR: Generating server_aes_key %s" % rtn
-            print "Server AES Key: %s" % server_aes_key.encode("hex")
-
-    else:
-        print "M-Pin Three Pass"
-        PIN = 1234
-        if MPIN_FULL:
-            time_func(
-                'rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)',
-                nIter)
-            rtn, pc1, pc2 = mpin_ZZZ.precompute(token, hash_mpin_id)
-            if rtn != 0:
-                print "precompute(token, hash_mpin_id) ERROR %s" % rtn
-
-        # Client first pass
-        time_func(
-            'rtn, x, u, ut, sec = mpin_ZZZ.client_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit)',
-            nIter)
-        rtn, x, u, ut, sec = mpin_ZZZ.client_1(
-            mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id, rng, None, PIN, token, time_permit)
-        if rtn != 0:
-            print "client_1  ERROR %s" % rtn
-        if DEBUG:
-            print "x: %s" % x.encode("hex")
-
-        # Server calculates H(ID) and H(T|H(ID)) (if time permits enabled),
-        # and maps them to points on the curve HID and HTID resp.
-        time_func(
-            'HID, HTID = mpin_ZZZ.server_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id)',
-            nIter)
-        HID, HTID = mpin_ZZZ.server_1(mpin_ZZZ.HASH_TYPE_ZZZ, date, mpin_id)
-
-        # Server generates Random number y and sends it to Client
-        time_func('rtn, y = mpin_ZZZ.random_generate(rng)', nIter)
-        rtn, y = mpin_ZZZ.random_generate(rng)
-        if rtn != 0:
-            print "random_generate(rng) Error %s" % rtn
-
-        # Client second pass
-        time_func('rtn, v = mpin_ZZZ.client_2(x, y, sec)', nIter)
-        rtn, v = mpin_ZZZ.client_2(x, y, sec)
-        if rtn != 0:
-            print "client_2(x, y, sec) Error %s" % rtn
-
-        # Server second pass
-        time_func(
-            'rtn, E, F = mpin_ZZZ.server_2(date, HID, HTID, y, server_secret, u, ut, v, None)',
-            nIter)
-        rtn, E, F = mpin_ZZZ.server_2(
-            date, HID, HTID, y, server_secret, u, ut, v, None)
-        if rtn != 0:
-            print "ERROR: %s is not authenticated" % mpin_id
-            if PIN_ERROR:
-                time_func('err = mpin_ZZZ.kangaroo(E, F)', nIter)
-                err = mpin_ZZZ.kangaroo(E, F)
-                print "Client PIN error %d " % err
-            raise SystemExit(0)
-        else:
-            print "SUCCESS: %s is authenticated" % mpin_id
-
-        # Client sends Z=r.ID to Server
-        if MPIN_FULL:
-            rtn, r, Z = mpin_ZZZ.get_G1_multiple(rng, 1, None, hash_mpin_id)
-            if rtn != 0:
-                print "ERROR: Generating Z %s" % rtn
-
-        if date:
-            prHID = HTID
-        else:
-            prHID = HID
-            ut = None
-
-        # Server sends T=w.ID to client
-        if MPIN_FULL:
-            time_func(
-                'rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)',
-                nIter)
-            rtn, w, T = mpin_ZZZ.get_G1_multiple(rng, 0, None, prHID)
-            if rtn != 0:
-                print "ERROR: Generating T %s" % rtn
-
-            time_func(
-                'HM = mpin_ZZZ.hash_all(mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)',
-                nIter)
-            HM = mpin_ZZZ.hash_all(
-                mpin_ZZZ.HASH_TYPE_ZZZ, hash_mpin_id, u, ut, v, y, Z, T)
-
-            time_func(
-                'rtn, client_aes_key = mpin_ZZZ.client_key(mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)',
-                nIter)
-            rtn, client_aes_key = mpin_ZZZ.client_key(
-                mpin_ZZZ.HASH_TYPE_ZZZ, pc1, pc2, PIN, r, x, HM, T)
-            if rtn != 0:
-                print "ERROR: Generating client_aes_key %s" % rtn
-            print "Client AES Key: %s" % client_aes_key.encode("hex")
-
-            time_func(
-                'rtn, server_aes_key = mpin_ZZZ.server_key(mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)',
-                nIter)
-            rtn, server_aes_key = mpin_ZZZ.server_key(
-                mpin_ZZZ.HASH_TYPE_ZZZ, Z, server_secret, w, HM, HID, u, ut)
-            if rtn != 0:
-                print "ERROR: Generating server_aes_key %s" % rtn
-            print "Server AES Key: %s" % server_aes_key.encode("hex")
-
-    if MPIN_FULL:
-        plaintext = "A test message"
-        print "message to encrypt: ", plaintext
-        header_hex = "1554a69ecbf04e507eb6985a234613246206c85f8af73e61ab6e2382a26f457d"
-        header = header_hex.decode("hex")
-        iv_hex = "2b213af6b0edf6972bf996fb"
-        iv = iv_hex.decode("hex")
-        time_func(
-            'ciphertext, tag = mpin_ZZZ.aes_gcm_encrypt(client_aes_key, iv, header, plaintext)',
-            nIter)
-        ciphertext, tag = mpin_ZZZ.aes_gcm_encrypt(
-            client_aes_key, iv, header, plaintext)
-        print "ciphertext ", ciphertext.encode("hex")
-        print "tag1 ", tag.encode("hex")
-
-        time_func(
-            'plaintext2, tag2 = mpin_ZZZ.aes_gcm_decrypt(server_aes_key, iv, header, ciphertext)',
-            nIter)
-        plaintext2, tag2 = mpin_ZZZ.aes_gcm_decrypt(
-            server_aes_key, iv, header, ciphertext)
-        print "decrypted message: ", plaintext2
-        print "tag2 ", tag2.encode("hex")